Le 17/09/2021 à 09:50, Mark Cave-Ayland a écrit : > The declaration ROM is located at the top-most address of the standard slot > space. > > Signed-off-by: Mark Cave-Ayland <mark.cave-ayl...@ilande.co.uk> > --- > hw/nubus/nubus-device.c | 44 +++++++++++++++++++++++++++++++++++++++- > include/hw/nubus/nubus.h | 6 ++++++ > 2 files changed, 49 insertions(+), 1 deletion(-) > > diff --git a/hw/nubus/nubus-device.c b/hw/nubus/nubus-device.c > index 9c1992ceb0..3da0db4d54 100644 > --- a/hw/nubus/nubus-device.c > +++ b/hw/nubus/nubus-device.c > @@ -9,16 +9,21 @@ > */ > > #include "qemu/osdep.h" > +#include "qemu/datadir.h" > +#include "hw/loader.h" > #include "hw/nubus/nubus.h" > #include "qapi/error.h" > +#include "qemu/error-report.h" > > > static void nubus_device_realize(DeviceState *dev, Error **errp) > { > NubusBus *nubus = NUBUS_BUS(qdev_get_parent_bus(dev)); > NubusDevice *nd = NUBUS_DEVICE(dev); > - char *name; > + char *name, *path; > hwaddr slot_offset; > + int64_t size; > + int ret; > > /* Super */ > slot_offset = (nd->slot - 6) * NUBUS_SUPER_SLOT_SIZE; > @@ -38,10 +43,47 @@ static void nubus_device_realize(DeviceState *dev, Error > **errp) > memory_region_add_subregion(&nubus->slot_io, slot_offset, > &nd->slot_mem); > g_free(name); > + > + /* Declaration ROM */ > + if (nd->romfile != NULL) { > + path = qemu_find_file(QEMU_FILE_TYPE_BIOS, nd->romfile); > + if (path == NULL) { > + path = g_strdup(nd->romfile); > + } > + > + size = get_image_size(path); > + if (size < 0) { > + error_setg(errp, "failed to find romfile \"%s\"", nd->romfile); > + g_free(path); > + return; > + } else if (size == 0) { > + error_setg(errp, "romfile \"%s\" is empty", nd->romfile); > + g_free(path); > + return; > + } else if (size > NUBUS_DECL_ROM_MAX_SIZE) { > + error_setg(errp, "romfile \"%s\" too large (maximum size 128K)", > + nd->romfile); > + g_free(path); > + return; > + } > + > + name = g_strdup_printf("nubus-slot-%x-declaration-rom", nd->slot); > + memory_region_init_rom(&nd->decl_rom, OBJECT(dev), name, size, > + &error_abort); > + ret = load_image_mr(path, &nd->decl_rom); > + g_free(path); > + if (ret < 0) { > + error_setg(errp, "could not load romfile \"%s\"", nd->romfile); > + return; > + } > + memory_region_add_subregion(&nd->slot_mem, NUBUS_SLOT_SIZE - size, > + &nd->decl_rom); > + } > } > > static Property nubus_device_properties[] = { > DEFINE_PROP_INT32("slot", NubusDevice, slot, -1), > + DEFINE_PROP_STRING("romfile", NubusDevice, romfile), > DEFINE_PROP_END_OF_LIST() > }; > > diff --git a/include/hw/nubus/nubus.h b/include/hw/nubus/nubus.h > index 87a97516c7..0c9f50c32e 100644 > --- a/include/hw/nubus/nubus.h > +++ b/include/hw/nubus/nubus.h > @@ -12,6 +12,7 @@ > #include "hw/qdev-properties.h" > #include "exec/address-spaces.h" > #include "qom/object.h" > +#include "qemu/units.h" > > #define NUBUS_SUPER_SLOT_SIZE 0x10000000U > #define NUBUS_SUPER_SLOT_NB 0x9 > @@ -39,12 +40,17 @@ struct NubusBus { > uint32_t slot_available_mask; > }; > > +#define NUBUS_DECL_ROM_MAX_SIZE (128 * KiB) > + > struct NubusDevice { > DeviceState qdev; > > int32_t slot; > MemoryRegion super_slot_mem; > MemoryRegion slot_mem; > + > + char *romfile; > + MemoryRegion decl_rom; > }; > > #endif >
Reviewed-by: Laurent Vivier <laur...@vivier.eu>