summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2010-10-15 16:30:58 +0200
committerHans de Goede <hdegoede@redhat.com>2010-10-15 20:24:30 +0200
commitbb9c1716d3de7655dd350b4fc71d77ef3db263e5 (patch)
tree464aadf6906a14bb1cbe59407f7555b63cadd08d
parent9bc132a575b824f34136aeacc24444dba66615a4 (diff)
Fix the driver crashing qemu on 32 bits
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.
-rw-r--r--src/qxl_driver.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/src/qxl_driver.c b/src/qxl_driver.c
index 1f6ae57..e69e126 100644
--- a/src/qxl_driver.c
+++ b/src/qxl_driver.c
@@ -362,7 +362,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;
@@ -370,7 +370,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;
@@ -384,15 +384,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;