[Spice-devel] [PATCH spice-win-qxl] spice: windows qxl drivers: support x64 build

Arnon Gilboa agilboa at redhat.com
Wed Feb 2 05:41:27 PST 2011


-fix types & casts for correctness in x64
-add #ifndef _WIN64 for all the SSE2/FPU/fast_memcpy stuff
-miniport/makefile: remove IFNDEF AMD64 to enable x64 build
-miniport/qxl.inf: add x64 support
---
 display/driver.c     |    2 +
 display/makefile     |    1 -
 display/quic.c       |    4 +-
 display/qxldd.h      |   22 ++++++++++----------
 display/res.c        |   54 +++++++++++++++++++++++++++++++------------------
 display/res.h        |    2 +
 display/surface.h    |    4 +-
 display/utils.h      |    2 +-
 include/qxl_driver.h |   22 ++++++++++----------
 include/stdint.h     |    4 ++-
 miniport/makefile    |   18 +---------------
 miniport/qxl.c       |    4 +-
 miniport/qxl.inf     |   35 +++++++++++++++++++++++++++----
 13 files changed, 101 insertions(+), 73 deletions(-)

diff --git a/display/driver.c b/display/driver.c
index 1d5576f..a92eb03 100644
--- a/display/driver.c
+++ b/display/driver.c
@@ -246,7 +246,9 @@ BOOL DrvEnableDriver(ULONG engine_version, ULONG enable_data_size, PDRVENABLEDAT
     mspace_set_abort_func(mspace_abort);
     mspace_set_print_func(mspace_print);
     ResInitGlobals();
+#ifndef _WIN64
     CheckAndSetSSE2();
+#endif
     InitGlobalRes();
     DEBUG_PRINT((NULL, 1, "%s: end\n", __FUNCTION__));
     return TRUE;
diff --git a/display/makefile b/display/makefile
index f719f40..53b9a3d 100644
--- a/display/makefile
+++ b/display/makefile
@@ -1,2 +1 @@
 !INCLUDE $(NTMAKEENV)\makefile.def
-
diff --git a/display/quic.c b/display/quic.c
index b2ee9c5..2c23d9a 100644
--- a/display/quic.c
+++ b/display/quic.c
@@ -1137,7 +1137,7 @@ static int encoder_reste(Encoder *encoder, uint32_t *io_ptr, uint32_t *io_ptr_en
     encoder_init_rle(&encoder->rgb_state);
 #endif
 
-    encoder->io_words_count = io_ptr_end - io_ptr;
+    encoder->io_words_count = (uint32_t)(io_ptr_end - io_ptr);
     encoder->io_now = io_ptr;
     encoder->io_end = io_ptr_end;
     encoder->rows_completed = 0;
@@ -1409,7 +1409,7 @@ int quic_encode(QuicContext *quic, QuicImageType type, int width, int height,
     }
 
     flush(encoder);
-    encoder->io_words_count -= (encoder->io_end - encoder->io_now);
+    encoder->io_words_count -= (uint32_t)(encoder->io_end - encoder->io_now);
 
     return encoder->io_words_count;
 }
diff --git a/display/qxldd.h b/display/qxldd.h
index 6fd84c4..0f90af1 100644
--- a/display/qxldd.h
+++ b/display/qxldd.h
@@ -261,14 +261,14 @@ typedef struct PDev {
     QXLCommandRing *cmd_ring;
     QXLCursorRing *cursor_ring;
     QXLReleaseRing *release_ring;
-    UINT32 notify_cmd_port;
-    UINT32 notify_cursor_port;
-    UINT32 notify_oom_port;
+    PUCHAR notify_cmd_port;
+    PUCHAR notify_cursor_port;
+    PUCHAR notify_oom_port;
     PEVENT display_event;
     PEVENT cursor_event;
     PEVENT sleep_event;
 
-    UINT32 log_port;
+    PUCHAR log_port;
     UINT8 *log_buf;
     UINT32 *log_level;
 
@@ -288,7 +288,7 @@ typedef struct PDev {
 
     UINT32 *dev_update_id;
 
-    UINT32 update_area_port;
+    PUCHAR update_area_port;
     QXLRect *update_area;
     UINT32 *update_surface;
 
@@ -302,12 +302,12 @@ typedef struct PDev {
     PQXLWaitForEvent WaitForEvent;
 #endif
 
-    UINT32 create_primary_port;
-    UINT32 destroy_primary_port;
-    UINT32 destroy_surface_wait_port;
-    UINT32 memslot_add_port;
-    UINT32 memslot_del_port;
-    UINT32 destroy_all_surfaces_port;
+    PUCHAR create_primary_port;
+    PUCHAR destroy_primary_port;
+    PUCHAR destroy_surface_wait_port;
+    PUCHAR memslot_add_port;
+    PUCHAR memslot_del_port;
+    PUCHAR destroy_all_surfaces_port;
 
     UINT8* primary_memory_start;
     UINT32 primary_memory_size;
diff --git a/display/res.c b/display/res.c
index 3b8a81e..ccbb110 100644
--- a/display/res.c
+++ b/display/res.c
@@ -19,7 +19,6 @@
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 */
 
-#include <ddrawi.h>
 #include <ddraw.h>
 #include <dxmini.h>
 #include "os_dep.h"
@@ -856,7 +855,7 @@ static void __GetPathCommon(PDev *pdev, PATHOBJ *path, QXLDataChunk **chunk_ptr,
                 NEW_DATA_CHUNK(page_counter, alloc_size);
             }
 
-            cp_size = MIN(end - now, pt_buf_size);
+            cp_size = (int)MIN(end - now, pt_buf_size);
             memcpy(now, pt_buf, cp_size);
             chunk->data_size += cp_size;
             *data_size += cp_size;
@@ -1040,6 +1039,8 @@ static BOOL SetClip(PDev *pdev, CLIPOBJ *clip, QXLDrawable *drawable)
     return TRUE;
 }
 
+#ifndef _WIN64
+
 static _inline void fast_memcpy_aligment(void *dest, const void *src, size_t len)
 {
     _asm
@@ -1242,6 +1243,8 @@ static _inline void fast_memcpy_unaligment(void *dest, const void *src, size_t l
     }
 }
 
+#endif
+
 #ifdef DBG
     #define PutBytesAlign __PutBytesAlign
 #define PutBytes(pdev, chunk, now, end, src, size, page_counter, alloc_size, use_sse)\
@@ -1266,17 +1269,17 @@ static void __PutBytesAlign(PDev *pdev, QXLDataChunk **chunk_ptr, UINT8 **now_pt
 
     DEBUG_PRINT((pdev, 12, "%s\n", __FUNCTION__));
     while (size) {
-        int cp_size = MIN(end - now, size);
+        int cp_size = (int)MIN(end - now, size);
         if (!cp_size) {
             size_t aligned_size;
             ASSERT(pdev, alloc_size > 0);
             ASSERT(pdev, BITS_BUF_MAX > alignment);
-            aligned_size = MIN(alloc_size + alignment - 1, BITS_BUF_MAX);
+            aligned_size = (int)MIN(alloc_size + alignment - 1, BITS_BUF_MAX);
             aligned_size -=  aligned_size % alignment;
             NEW_DATA_CHUNK(page_counter, aligned_size);
-            cp_size = MIN(end - now, size);
+            cp_size = (int)MIN(end - now, size);
         }
-
+#ifndef _WIN64
         if (use_sse) {
             offset = (size_t)now & SSE_MASK;
             if (offset) {
@@ -1305,6 +1308,9 @@ static void __PutBytesAlign(PDev *pdev, QXLDataChunk **chunk_ptr, UINT8 **now_pt
         } else {
             RtlCopyMemory(now, src, cp_size);
         }
+#else
+        RtlCopyMemory(now, src, cp_size);
+#endif
         src += cp_size;
         now += cp_size;
         chunk->data_size += cp_size;
@@ -1716,7 +1722,7 @@ static _inline Resource *GetQuicImage(PDev *pdev, SURFOBJ *surf, XLATEOBJ *color
     quic_data->chunk->prev_chunk = 0;
     quic_data->chunk->next_chunk = 0;
     quic_data->prev_chunks_io_words = 0;
-    quic_data->chunk_io_words = ((UINT8 *)image_res + alloc_size - quic_data->chunk->data) >> 2;
+    quic_data->chunk_io_words = (int)(((UINT8 *)image_res + alloc_size - quic_data->chunk->data) >> 2);
     quic_data->rows = height;
     quic_data->raw_row_size = line_size;
 
@@ -1776,6 +1782,8 @@ static void FreeBitmapImage(PDev *pdev, Resource *res) // todo: defer
     DEBUG_PRINT((pdev, 13, "%s: done\n", __FUNCTION__));
 }
 
+#ifndef _WIN64
+
 static _inline void RestoreFPU(PDev *pdev, UINT8 FPUSave[])
 {
     void *align_addr =  (void *)ALIGN((size_t)(FPUSave), SSE_ALIGN);
@@ -1806,6 +1814,8 @@ static _inline void SaveFPU(PDev *pdev, UINT8 FPUSave[])
     }
 }
 
+#endif
+
 static void FreeSurfaceImage(PDev *pdev, Resource *res)
 {
     DEBUG_PRINT((pdev, 12, "%s\n", __FUNCTION__));
@@ -1828,6 +1838,8 @@ static _inline Resource *GetBitmapImage(PDev *pdev, SURFOBJ *surf, XLATEOBJ *col
     UINT8 *src_end;
     UINT8 *dest;
     UINT8 *dest_end;
+    UINT8 FPUSave[16 * 4 + 15];
+    BOOL use_sse = FALSE;
 
     DEBUG_PRINT((pdev, 12, "%s\n", __FUNCTION__));
     ASSERT(pdev, width > 0 && height > 0);
@@ -1860,23 +1872,21 @@ static _inline Resource *GetBitmapImage(PDev *pdev, SURFOBJ *surf, XLATEOBJ *col
     dest_end = (UINT8 *)image_res + alloc_size;
     alloc_size = height * line_size;
 
+#ifndef _WIN64
     if (have_sse2 && alloc_size >= 1024) {
-        UINT8 FPUSave[16 * 4 + 15];
-
+        use_sse = TRUE;
         SaveFPU(pdev, FPUSave);
-
-	for (; src != src_end; src -= surf->lDelta, alloc_size -= line_size) {
-	  PutBytesAlign(pdev, &chunk, &dest, &dest_end, src, line_size,
-			&pdev->Res->num_bits_pages, alloc_size, line_size, TRUE);
-	}
-
+    }
+#endif
+    for (; src != src_end; src -= surf->lDelta, alloc_size -= line_size) {
+        PutBytesAlign(pdev, &chunk, &dest, &dest_end, src, line_size,
+                      &pdev->Res->num_bits_pages, alloc_size, line_size, use_sse);
+    }
+#ifndef _WIN64
+    if (use_sse) {
         RestoreFPU(pdev, FPUSave);
-    } else {
-        for (; src != src_end; src -= surf->lDelta, alloc_size -= line_size) {
-            PutBytesAlign(pdev, &chunk, &dest, &dest_end, src, line_size,
-                          &pdev->Res->num_bits_pages, alloc_size, line_size, FALSE);
-        }
     }
+#endif
 
     GetPallette(pdev, &internal->image.bitmap, color_trans);
     DEBUG_PRINT((pdev, 13, "%s: done\n", __FUNCTION__));
@@ -3310,6 +3320,8 @@ void ResDestroyGlobals()
     image_id_sem = NULL;
 }
 
+#ifndef _WIN64
+
 void CheckAndSetSSE2()
 {
     _asm
@@ -3325,6 +3337,8 @@ void CheckAndSetSSE2()
     }
 }
 
+#endif
+
 void ResetAllDevices()
 {
     UINT32 i;
diff --git a/display/res.h b/display/res.h
index 3417c02..ae4ad14 100644
--- a/display/res.h
+++ b/display/res.h
@@ -66,7 +66,9 @@ BOOL ResInit(PDev *pdev);
 void ResDestroy(PDev *pdev);
 void ResInitGlobals();
 void ResDestroyGlobals();
+#ifndef _WIN64
 void CheckAndSetSSE2();
+#endif
 void ResetAllDevices();
 
 #endif
diff --git a/display/surface.h b/display/surface.h
index 028f97e..d741690 100644
--- a/display/surface.h
+++ b/display/surface.h
@@ -11,7 +11,7 @@ static _inline UINT32 GetSurfaceIdFromInfo(SurfaceInfo *info)
   if (info == &pdev->surface0_info) {
     return 0;
   }
-  return info - pdev->Res->surfaces_info;
+  return (UINT32)(info - pdev->Res->surfaces_info);
 }
 
 static _inline SurfaceInfo *GetSurfaceInfo(PDev *pdev, UINT32 id)
@@ -62,7 +62,7 @@ static UINT32 GetFreeSurface(PDev *pdev)
     } else {
       pdev->Res->free_surfaces = surface->u.next_free;
 
-      id = surface - pdev->Res->surfaces_info;
+      id = (UINT32)(surface - pdev->Res->surfaces_info);
     }
 
     EngReleaseSemaphore(pdev->Res->surface_sem);
diff --git a/display/utils.h b/display/utils.h
index b0d075f..a8d0de6 100644
--- a/display/utils.h
+++ b/display/utils.h
@@ -27,7 +27,7 @@
 #define ALIGN(a, b) (((a) + ((b) - 1)) & ~((b) - 1))
 
 
-#define OFFSETOF(type, member) ((unsigned)&((type *)0)->member)
+#define OFFSETOF(type, member) ((UINT64)&((type *)0)->member)
 #define CONTAINEROF(ptr, type, member) \
     ((type *) ((UINT8 *)(ptr) - OFFSETOF(type, member)))
 
diff --git a/include/qxl_driver.h b/include/qxl_driver.h
index 728e2a2..b2e1c78 100644
--- a/include/qxl_driver.h
+++ b/include/qxl_driver.h
@@ -51,9 +51,9 @@ typedef struct QXLDriverInfo {
     QXLCommandRing *cmd_ring;
     QXLCursorRing *cursor_ring;
     QXLReleaseRing *release_ring;
-    UINT32 notify_cmd_port;
-    UINT32 notify_cursor_port;
-    UINT32 notify_oom_port;
+    PUCHAR notify_cmd_port;
+    PUCHAR notify_cursor_port;
+    PUCHAR notify_oom_port;
     PEVENT display_event;
     PEVENT cursor_event;
     PEVENT sleep_event;
@@ -68,13 +68,13 @@ typedef struct QXLDriverInfo {
     UINT32 *update_id;
     UINT32 *compression_level;
 
-    UINT32 update_area_port;
+    PUCHAR update_area_port;
     QXLRect *update_area;
     UINT32 *update_surface;
 
     UINT32 *mm_clock;
 
-    UINT32 log_port;
+    PUCHAR log_port;
     UINT8 *log_buf;
     UINT32 *log_level;
 #if (WINVER < 0x0501)
@@ -89,12 +89,12 @@ typedef struct QXLDriverInfo {
     UINT64 *ram_slot_end;
     MemSlot main_mem_slot;
 
-    UINT32 destroy_surface_wait_port;
-    UINT32 create_primary_port;
-    UINT32 destroy_primary_port;
-    UINT32 memslot_add_port;
-    UINT32 memslot_del_port;
-    UINT32 destroy_all_surfaces_port;
+    PUCHAR destroy_surface_wait_port;
+    PUCHAR create_primary_port;
+    PUCHAR destroy_primary_port;
+    PUCHAR memslot_add_port;
+    PUCHAR memslot_del_port;
+    PUCHAR destroy_all_surfaces_port;
 
     UINT32 dev_id;
 
diff --git a/include/stdint.h b/include/stdint.h
index 25920dc..f825d4b 100644
--- a/include/stdint.h
+++ b/include/stdint.h
@@ -136,11 +136,13 @@ typedef unsigned long long   uint_fast64_t;
 
 /* 7.18.1.4  Integer types capable of holding object pointers */
 
+#ifndef _WIN64
+
 typedef int intptr_t;
 
 typedef unsigned uintptr_t;
 
-
+#endif
 
 /* 7.18.1.5  Greatest-width integer types */
 
diff --git a/miniport/makefile b/miniport/makefile
index bc5d75a..53b9a3d 100644
--- a/miniport/makefile
+++ b/miniport/makefile
@@ -1,17 +1 @@
-#
-# DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source
-# file to this component.  This file merely indirects to the real make file
-# that is shared by all the components of Windows NT
-#
-
-!IF DEFINED(_NT_TARGET_VERSION)
-!    IFNDEF AMD64
-!        INCLUDE $(NTMAKEENV)\makefile.def
-!    ELSE
-!        message BUILDMSG: Warning : miniport is not supported on AMD64.
-!    ENDIF
-!ELSE
-!    INCLUDE $(NTMAKEENV)\makefile.def
-!ENDIF
-
-
+!INCLUDE $(NTMAKEENV)\makefile.def
diff --git a/miniport/qxl.c b/miniport/qxl.c
index e321ee4..855b08b 100644
--- a/miniport/qxl.c
+++ b/miniport/qxl.c
@@ -64,7 +64,7 @@ BOOLEAN Interrupt(PVOID  HwDeviceExtension);
 
 typedef struct QXLExtension {
     PVOID io_base;
-    ULONG io_port;
+    PUCHAR io_port;
 
     QXLRom *rom;
     ULONG rom_size;
@@ -152,7 +152,7 @@ VP_STATUS InitIO(QXLExtension *dev, PVIDEO_ACCESS_RANGE range)
     }
 
     dev->io_base = io_base;
-    dev->io_port = range->RangeStart.LowPart;
+    dev->io_port = (PUCHAR)range->RangeStart.LowPart;
 
     DEBUG_PRINT((0, "%s: OK, io 0x%x size %lu\n", __FUNCTION__,
                  (ULONG)range->RangeStart.LowPart, range->RangeLength));
diff --git a/miniport/qxl.inf b/miniport/qxl.inf
index 63afd2a..3739ac7 100644
--- a/miniport/qxl.inf
+++ b/miniport/qxl.inf
@@ -5,26 +5,45 @@
 Signature = "$CHICAGO$"
 DriverVer = 09/29/2010,1.4.1.0 
 Provider = %RHAT%
+CatalogFile = qxl.cat
 Class = Display
 ClassGUID = {4d36e968-e325-11ce-bfc1-08002be10318}
 
 [DestinationDirs]
 DefaultDestDir = 11	; system32
-qxl.Miniport = 12		; drivers
-qxl.Display = 11		; system32
+qxl.Miniport = 12	; drivers
+qxl.Display = 11	; system32
 
 [Manufacturer]
-%RHAT% = q.Mfg
+%RHAT% = q, NTx86, NTamd64, NTx86.6.0, NTamd64.6.0
 
-[q.Mfg]
+; WinXP x86 and up
+[q.NTx86]
 %RHAT% %QXL% = qxl, PCI\VEN_1b36&DEV_0100&SUBSYS_11001af4&REV_02
 
+; WinXP x64 and up
+[q.NTamd64]
+%RHAT% %QXL% = qxl, PCI\VEN_1b36&DEV_0100&SUBSYS_11001af4&REV_02
+
+; Vista x86 and up
+[q.NTx86.6.0]
+%RHAT% %QXL% = qxl_vista, PCI\VEN_1b36&DEV_0100&SUBSYS_11001af4&REV_02
+
+; Vista x64 and up
+[q.NTamd64.6.0]
+%RHAT% %QXL% = qxl_vista, PCI\VEN_1b36&DEV_0100&SUBSYS_11001af4&REV_02
+
+
 [ControlFlags]
 ExcludeFromSelect = *
 
 [qxl]
 CopyFiles = qxl.Miniport, qxl.Display
 
+[qxl_vista]
+FeatureScore = FC
+CopyFiles = qxl.Miniport, qxl.Display
+
 [qxl.Miniport]
 qxl.sys
 
@@ -41,6 +60,9 @@ qxldd.dll = 1
 [qxl.SoftwareSettings]
 AddReg = qxl_SoftwareDeviceSettings
 
+[qxl_vista.SoftwareSettings]
+AddReg = qxl_SoftwareDeviceSettings
+
 [qxl_SoftwareDeviceSettings]
 HKR,, InstalledDisplayDrivers,        %REG_MULTI_SZ%, qxldd
 HKR,, VgaCompatible,                  %REG_DWORD%,    0
@@ -50,7 +72,10 @@ HKR,, DefaultSettings.YResolution,    %REG_DWORD%,    600
 HKR,, Acceleration.Level,             %REG_DWORD%,    0
 
 [qxl.Services]
-AddService = qxl, 0x00000002, qxl_Service_Inst	; Assign the named service as the PnP function driver
+AddService = qxl, 0x00000002, qxl_Service_Inst ; Assign the named service as the PnP function driver
+
+[qxl_vista.Services]
+AddService = qxl, 0x00000002, qxl_Service_Inst ; Assign the named service as the PnP function driver
 
 [qxl_Service_Inst]
 ServiceType    = 1                  ; SERVICE_KERNEL_DRIVER
-- 
1.5.5.6



More information about the Spice-devel mailing list