[Spice-devel] [PATCH xf86-drv-qxl F14-branch 2/3] Fix the driver crashing qemu on 32 bits

Hans de Goede hdegoede at redhat.com
Fri Oct 15 07:36:38 PDT 2010


When casting a 32bit pointer to a uint64 the following happens:
ptr -> int32 -> int64 -> uint64, so if the address is above
0x80000000 which is quite normal for mapped io, the int32 -> int64
cast causes sign extension, not good!

Also fix the printing of the memslots the memslot phys addresses
are always 64 bit, so tell printf to always read 64 bits, otherwise
we end up printing the higher 32 bits of the address as size on 32
bits.
---
 src/qxl_driver.c |   10 +++++-----
 1 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/qxl_driver.c b/src/qxl_driver.c
index bd237dc..8d4a85b 100644
--- a/src/qxl_driver.c
+++ b/src/qxl_driver.c
@@ -342,7 +342,7 @@ qxl_reset (qxl_screen_t *qxl)
     slot = &qxl->mem_slots[qxl->main_mem_slot];
     slot->start_phys_addr = (unsigned long)qxl->ram_physical;
     slot->end_phys_addr = (unsigned long)slot->start_phys_addr + (unsigned long)qxl->rom->num_pages * getpagesize();
-    slot->start_virt_addr = (uint64_t)qxl->ram;
+    slot->start_virt_addr = (uint64_t)(uintptr_t)qxl->ram;
     slot->end_virt_addr = slot->start_virt_addr + (unsigned long)qxl->rom->num_pages * getpagesize();
     
     ram_header->mem_slot_start = slot->start_phys_addr;
@@ -350,7 +350,7 @@ qxl_reset (qxl_screen_t *qxl)
     
     outb (qxl->io_base + QXL_IO_MEMSLOT_ADD, qxl->main_mem_slot);
 
-    ErrorF ("Created main memslot from %lx to %lx\n", slot->start_phys_addr, slot->end_phys_addr);
+    ErrorF ("Created main memslot from %llx to %llx\n", slot->start_phys_addr, slot->end_phys_addr);
 
     slot->generation = qxl->rom->slot_generation;
     
@@ -364,15 +364,15 @@ qxl_reset (qxl_screen_t *qxl)
     slot = &qxl->mem_slots[qxl->vram_mem_slot];
     slot->start_phys_addr = (unsigned long)qxl->vram_physical;
     slot->end_phys_addr = (unsigned long)qxl->vram_physical + (unsigned long)qxl->vram_size;
-    slot->start_virt_addr = (uint64_t)qxl->vram;
-    slot->end_virt_addr = (uint64_t)qxl->vram + (uint64_t)qxl->vram_size;
+    slot->start_virt_addr = (uint64_t)(uintptr_t)qxl->vram;
+    slot->end_virt_addr = (uint64_t)(uintptr_t)qxl->vram + (uint64_t)qxl->vram_size;
 
     ram_header->mem_slot_start = slot->start_phys_addr;
     ram_header->mem_slot_end = slot->end_phys_addr;
 
     outb (qxl->io_base + QXL_IO_MEMSLOT_ADD, qxl->vram_mem_slot);
 
-    ErrorF ("Created vram memslot from %lx to %lx\n", slot->start_phys_addr, slot->end_phys_addr);
+    ErrorF ("Created vram memslot from %llx to %llx\n", slot->start_phys_addr, slot->end_phys_addr);
 
     slot->generation = qxl->rom->slot_generation;
     
-- 
1.7.3.1



More information about the Spice-devel mailing list