|
@@ -10,6 +10,7 @@
|
|
|
|
|
|
#include "qemu/osdep.h"
|
|
#include "qemu/osdep.h"
|
|
#include "qemu/datadir.h"
|
|
#include "qemu/datadir.h"
|
|
|
|
+#include "exec/target_page.h"
|
|
#include "hw/irq.h"
|
|
#include "hw/irq.h"
|
|
#include "hw/loader.h"
|
|
#include "hw/loader.h"
|
|
#include "hw/nubus/nubus.h"
|
|
#include "hw/nubus/nubus.h"
|
|
@@ -30,7 +31,8 @@ static void nubus_device_realize(DeviceState *dev, Error **errp)
|
|
NubusDevice *nd = NUBUS_DEVICE(dev);
|
|
NubusDevice *nd = NUBUS_DEVICE(dev);
|
|
char *name, *path;
|
|
char *name, *path;
|
|
hwaddr slot_offset;
|
|
hwaddr slot_offset;
|
|
- int64_t size;
|
|
|
|
|
|
+ int64_t size, align_size;
|
|
|
|
+ uint8_t *rom_ptr;
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
/* Super */
|
|
/* Super */
|
|
@@ -76,16 +78,24 @@ static void nubus_device_realize(DeviceState *dev, Error **errp)
|
|
}
|
|
}
|
|
|
|
|
|
name = g_strdup_printf("nubus-slot-%x-declaration-rom", nd->slot);
|
|
name = g_strdup_printf("nubus-slot-%x-declaration-rom", nd->slot);
|
|
- memory_region_init_rom(&nd->decl_rom, OBJECT(dev), name, size,
|
|
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Ensure ROM memory region is aligned to target page size regardless
|
|
|
|
+ * of the size of the Declaration ROM image
|
|
|
|
+ */
|
|
|
|
+ align_size = ROUND_UP(size, qemu_target_page_size());
|
|
|
|
+ memory_region_init_rom(&nd->decl_rom, OBJECT(dev), name, align_size,
|
|
&error_abort);
|
|
&error_abort);
|
|
- ret = load_image_mr(path, &nd->decl_rom);
|
|
|
|
|
|
+ rom_ptr = memory_region_get_ram_ptr(&nd->decl_rom);
|
|
|
|
+ ret = load_image_size(path, rom_ptr + (uintptr_t)(align_size - size),
|
|
|
|
+ size);
|
|
g_free(path);
|
|
g_free(path);
|
|
g_free(name);
|
|
g_free(name);
|
|
if (ret < 0) {
|
|
if (ret < 0) {
|
|
error_setg(errp, "could not load romfile \"%s\"", nd->romfile);
|
|
error_setg(errp, "could not load romfile \"%s\"", nd->romfile);
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- memory_region_add_subregion(&nd->slot_mem, NUBUS_SLOT_SIZE - size,
|
|
|
|
|
|
+ memory_region_add_subregion(&nd->slot_mem, NUBUS_SLOT_SIZE - align_size,
|
|
&nd->decl_rom);
|
|
&nd->decl_rom);
|
|
}
|
|
}
|
|
}
|
|
}
|