On 16/09/2021 14:06, Markus Armbruster wrote:
Philippe Mathieu-Daudé <f4...@amsat.org> writes:
On 9/16/21 12:05 PM, 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-ayl...@ilande.co.uk>
---
hw/nubus/nubus-device.c | 43 +++++++++++++++++++++++++++++++++++++++-
include/hw/nubus/nubus.h | 6 ++++++
2 files changed, 48 insertions(+), 1 deletion(-)
@@ -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 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_fatal);
Is this error expected to happen?
If yes, you should quite probably propagate it.
If no, &error_abort.
(goes and looks)
Ultimately this gets set from memory_region_init_rom_device_nomigrate() where err is
returned from qemu_ram_alloc() which is fairly fatal. So I guess this should be
&error_abort then?
Note that I copied that part of the logic from hw/pci/pci.c's pci_add_option_rom() so
it may also need to be adjusted there.
+ ret = load_image_mr(path, &nd->decl_rom);
load_image_mr() already calls get_image_size(), rom_add_file() and
qemu_find_file(). *But* it doesn't takes and Error handle, and report
error using fprintf()...
... except when they don't:
int load_image_mr(const char *filename, MemoryRegion *mr)
{
int size;
if (!memory_access_is_direct(mr, false)) {
/* Can only load an image into RAM or ROM */
---> return -1;
}
size = get_image_size(filename);
if (size < 0 || size > memory_region_size(mr)) {
return -1;
}
if (size > 0) {
if (rom_add_file_mr(filename, mr, -1) < 0) {
return -1;
}
}
return size;
}
Hot mess!
So unfortunately rom_add*() functions are
kinda outdated and you are doing the right thing to propagate detailled
errors.
I can't see errors being propagated, only a warn_report()...
Therefore:
Reviewed-by: Philippe Mathieu-Daudé <f4...@amsat.org>
+ g_free(path);
+ if (ret < 0) {
+ warn_report("nubus-device: could not load prom '%s'", nd->romfile);
... here.
Looking again at pci_add_option_rom() then perhaps this should be error_setg()
instead: if you are explicitly trying to load a ROM image, then you should at least
be able to get the filename correct.
+ }
+ memory_region_add_subregion(&nd->slot_mem, NUBUS_SLOT_SIZE - size,
+ &nd->decl_rom);
+ }
}
ATB,
Mark.