diff options
author | Hans de Goede <hdegoede@redhat.com> | 2010-10-15 16:30:58 +0200 |
---|---|---|
committer | Hans de Goede <hdegoede@redhat.com> | 2010-10-15 20:24:30 +0200 |
commit | bb9c1716d3de7655dd350b4fc71d77ef3db263e5 (patch) | |
tree | 464aadf6906a14bb1cbe59407f7555b63cadd08d | |
parent | 9bc132a575b824f34136aeacc24444dba66615a4 (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.c | 10 |
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; |