Message ID | 20210912074914.22048-12-mark.cave-ayland@ilande.co.uk |
---|---|
State | New |
Headers | show |
Series | nubus: bus, device, bridge, IRQ and address space improvements | expand |
On 9/12/21 9:49 AM, Mark Cave-Ayland wrote: > The declaration ROM is located at the top-most address of the standard slot > space. > > Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> > --- > hw/nubus/nubus-device.c | 43 +++++++++++++++++++++++++++++++++++++++- > include/hw/nubus/nubus.h | 5 +++++ > 2 files changed, 47 insertions(+), 1 deletion(-) > + /* Declaration ROM */ > + } else if (size > NUBUS_DECL_ROM_MAX_SIZE) { I'd check for >= and define as (64 * KiB). > + error_setg(errp, "romfile \"%s\" too large (maximum size 64K)", > + nd->romfile); > + g_free(path); > + return; > + } > diff --git a/include/hw/nubus/nubus.h b/include/hw/nubus/nubus.h > index 87a97516c7..42f4c9dbb8 100644 > --- a/include/hw/nubus/nubus.h > +++ b/include/hw/nubus/nubus.h > @@ -39,12 +39,17 @@ struct NubusBus { > uint32_t slot_available_mask; > }; > > +#define NUBUS_DECL_ROM_MAX_SIZE 0xffff
On 12/09/2021 18:39, Philippe Mathieu-Daudé wrote: > On 9/12/21 9:49 AM, Mark Cave-Ayland wrote: >> The declaration ROM is located at the top-most address of the standard slot >> space. >> >> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> >> --- >> hw/nubus/nubus-device.c | 43 +++++++++++++++++++++++++++++++++++++++- >> include/hw/nubus/nubus.h | 5 +++++ >> 2 files changed, 47 insertions(+), 1 deletion(-) > >> + /* Declaration ROM */ > >> + } else if (size > NUBUS_DECL_ROM_MAX_SIZE) { > > I'd check for >= and define as (64 * KiB). That's a good idea - I'll update this for the v2. >> + error_setg(errp, "romfile \"%s\" too large (maximum size 64K)", >> + nd->romfile); >> + g_free(path); >> + return; >> + } > >> diff --git a/include/hw/nubus/nubus.h b/include/hw/nubus/nubus.h >> index 87a97516c7..42f4c9dbb8 100644 >> --- a/include/hw/nubus/nubus.h >> +++ b/include/hw/nubus/nubus.h >> @@ -39,12 +39,17 @@ struct NubusBus { >> uint32_t slot_available_mask; >> }; >> >> +#define NUBUS_DECL_ROM_MAX_SIZE 0xffff ATB, Mark.
On 14/09/2021 21:23, Mark Cave-Ayland wrote: > On 12/09/2021 18:39, Philippe Mathieu-Daudé wrote: > >> On 9/12/21 9:49 AM, Mark Cave-Ayland wrote: >>> The declaration ROM is located at the top-most address of the standard slot >>> space. >>> >>> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> >>> --- >>> hw/nubus/nubus-device.c | 43 +++++++++++++++++++++++++++++++++++++++- >>> include/hw/nubus/nubus.h | 5 +++++ >>> 2 files changed, 47 insertions(+), 1 deletion(-) >> >>> + /* Declaration ROM */ >> >>> + } else if (size > NUBUS_DECL_ROM_MAX_SIZE) { >> >> I'd check for >= and define as (64 * KiB). > > That's a good idea - I'll update this for the v2. And in fact it looks like it is possible to embed multi-function MacOS drivers in the declaration ROM so I'll keep the > and increase the maximum size to 128K which should give plenty of breathing space for binary drivers. >>> + error_setg(errp, "romfile \"%s\" too large (maximum size 64K)", >>> + nd->romfile); >>> + g_free(path); >>> + return; >>> + } >> >>> diff --git a/include/hw/nubus/nubus.h b/include/hw/nubus/nubus.h >>> index 87a97516c7..42f4c9dbb8 100644 >>> --- a/include/hw/nubus/nubus.h >>> +++ b/include/hw/nubus/nubus.h >>> @@ -39,12 +39,17 @@ struct NubusBus { >>> uint32_t slot_available_mask; >>> }; >>> +#define NUBUS_DECL_ROM_MAX_SIZE 0xffff ATB, Mark.
diff --git a/hw/nubus/nubus-device.c b/hw/nubus/nubus-device.c index 9c1992ceb0..98a4c6bb33 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,46 @@ 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 64K)", + 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_fatal); + ret = load_image_mr(path, &nd->decl_rom); + g_free(path); + if (ret < 0) { + warn_report("nubus-device: could not load prom '%s'", nd->romfile); + } + 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..42f4c9dbb8 100644 --- a/include/hw/nubus/nubus.h +++ b/include/hw/nubus/nubus.h @@ -39,12 +39,17 @@ struct NubusBus { uint32_t slot_available_mask; }; +#define NUBUS_DECL_ROM_MAX_SIZE 0xffff + struct NubusDevice { DeviceState qdev; int32_t slot; MemoryRegion super_slot_mem; MemoryRegion slot_mem; + + char *romfile; + MemoryRegion decl_rom; }; #endif
The declaration ROM is located at the top-most address of the standard slot space. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> --- hw/nubus/nubus-device.c | 43 +++++++++++++++++++++++++++++++++++++++- include/hw/nubus/nubus.h | 5 +++++ 2 files changed, 47 insertions(+), 1 deletion(-)