summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorStefan Weil <weil@mail.berlios.de>2011-04-14 19:19:00 +0200
committerBlue Swirl <blauwirbel@gmail.com>2011-04-15 18:16:34 +0000
commit1a00282a739d5cb7247ac3634ddd3e76537ef5eb (patch)
tree822916c04752ee55eb099c4981b648bbe50d8b6f
parentcb842c90a485d9dbf05fa51e1500b3c1a1931256 (diff)
downloadfocaccia-qemu-1a00282a739d5cb7247ac3634ddd3e76537ef5eb.tar.gz
focaccia-qemu-1a00282a739d5cb7247ac3634ddd3e76537ef5eb.zip
sparc: Fix assertion caused by empty memory slot with 0 byte
If the memory size given on the command line is equal to the
maximum size of memory defined by the hardware, there is no
"empty slot" after physical memory.

The following command

		qemu-system-sparc -m 256

raised an assertion:
exec.c:2614: cpu_register_physical_memory_offset: Assertion `size' failed

This can be fixed either at the caller side (don't call empty_slot_init)
or in empty_slot_init (do nothing) when size == 0. The second solution
was choosen here because it is more robust.

Signed-off-by: Stefan Weil <weil@mail.berlios.de>
-rw-r--r--hw/empty_slot.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/hw/empty_slot.c b/hw/empty_slot.c
index 664b8d9c4d..da8adc4d03 100644
--- a/hw/empty_slot.c
+++ b/hw/empty_slot.c
@@ -53,18 +53,21 @@ static CPUWriteMemoryFunc * const empty_slot_write[3] = {
 
 void empty_slot_init(target_phys_addr_t addr, uint64_t slot_size)
 {
-    DeviceState *dev;
-    SysBusDevice *s;
-    EmptySlot *e;
+    if (slot_size > 0) {
+        /* Only empty slots larger than 0 byte need handling. */
+        DeviceState *dev;
+        SysBusDevice *s;
+        EmptySlot *e;
 
-    dev = qdev_create(NULL, "empty_slot");
-    s = sysbus_from_qdev(dev);
-    e = FROM_SYSBUS(EmptySlot, s);
-    e->size = slot_size;
+        dev = qdev_create(NULL, "empty_slot");
+        s = sysbus_from_qdev(dev);
+        e = FROM_SYSBUS(EmptySlot, s);
+        e->size = slot_size;
 
-    qdev_init_nofail(dev);
+        qdev_init_nofail(dev);
 
-    sysbus_mmio_map(s, 0, addr);
+        sysbus_mmio_map(s, 0, addr);
+    }
 }
 
 static int empty_slot_init1(SysBusDevice *dev)