Message ID | ef4d9dc2e9241f8bd29b727e8fa32c4768718c9a.1592315226.git.balaton@eik.bme.hu |
---|---|
State | New |
Headers | show |
Series | Mac Old World ROM experiment | expand |
On 16/06/2020 14:47, BALATON Zoltan wrote: > Fall back to load binary ROM image if loading ELF fails. This also > moves PROM_BASE and PROM_SIZE defines to board as these are matching > the ROM size and address on this board. Probably worth a quick mention here that you are removing BIOS_SIZE and PROM_ADDR from the common Mac code. > Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu> > --- > Notes: > Unlike mac_oldworld where the openbios-ppc image loads at end of ROM > region here we only check size and assume ELF image is loaded from > PROM_BASE, Checking the load addr here is tricky because this board is > also be compiled both 64 and 32 bit and load_elf seems to always > return 64 bit value so handling that could become a mess. If this is a > problem then it's a preexisting one so should be fixed in a separate > patch. This one just allows loading ROM binary too otherwise > preserving previous behaviour. > > hw/ppc/mac.h | 2 -- > hw/ppc/mac_newworld.c | 22 ++++++++++++++-------- > 2 files changed, 14 insertions(+), 10 deletions(-) > > diff --git a/hw/ppc/mac.h b/hw/ppc/mac.h > index 6af87d1fa0..a0d9e47031 100644 > --- a/hw/ppc/mac.h > +++ b/hw/ppc/mac.h > @@ -38,10 +38,8 @@ > /* SMP is not enabled, for now */ > #define MAX_CPUS 1 > > -#define BIOS_SIZE (1 * MiB) > #define NVRAM_SIZE 0x2000 > #define PROM_FILENAME "openbios-ppc" > -#define PROM_ADDR 0xfff00000 > > #define KERNEL_LOAD_ADDR 0x01000000 > #define KERNEL_GAP 0x00100000 > diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c > index 5f3a028e6a..eec62d1e90 100644 > --- a/hw/ppc/mac_newworld.c > +++ b/hw/ppc/mac_newworld.c > @@ -82,6 +82,8 @@ > > #define NDRV_VGA_FILENAME "qemu_vga.ndrv" > > +#define PROM_BASE 0xfff00000 > +#define PROM_SIZE (1 * MiB) > > static void fw_cfg_boot_set(void *opaque, const char *boot_device, > Error **errp) > @@ -100,7 +102,7 @@ static void ppc_core99_reset(void *opaque) > > cpu_reset(CPU(cpu)); > /* 970 CPUs want to get their initial IP as part of their boot protocol */ > - cpu->env.nip = PROM_ADDR + 0x100; > + cpu->env.nip = PROM_BASE + 0x100; > } > > /* PowerPC Mac99 hardware initialisation */ > @@ -153,25 +155,29 @@ static void ppc_core99_init(MachineState *machine) > /* allocate RAM */ > memory_region_add_subregion(get_system_memory(), 0, machine->ram); > > - /* allocate and load BIOS */ > - memory_region_init_rom(bios, NULL, "ppc_core99.bios", BIOS_SIZE, > + /* allocate and load firmware ROM */ > + memory_region_init_rom(bios, NULL, "ppc_core99.bios", PROM_SIZE, > &error_fatal); > + memory_region_add_subregion(get_system_memory(), PROM_BASE, bios); > > - if (bios_name == NULL) > + if (!bios_name) { > bios_name = PROM_FILENAME; > + } > filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); > - memory_region_add_subregion(get_system_memory(), PROM_ADDR, bios); > - > - /* Load OpenBIOS (ELF) */ > if (filename) { > + /* Load OpenBIOS (ELF) */ > bios_size = load_elf(filename, NULL, NULL, NULL, NULL, > NULL, NULL, NULL, 1, PPC_ELF_MACHINE, 0, 0); > > + if (bios_size <= 0) { > + /* or load binary ROM image */ > + bios_size = load_image_targphys(filename, PROM_BASE, PROM_SIZE); > + } > g_free(filename); > } else { > bios_size = -1; > } > - if (bios_size < 0 || bios_size > BIOS_SIZE) { > + if (bios_size < 0 || bios_size > PROM_SIZE) { > error_report("could not load PowerPC bios '%s'", bios_name); > exit(1); > } Same as with the previous patch: presumably if you fix the issue with load_elf() then this should work fine as it does with SPARC. ATB, Mark.
diff --git a/hw/ppc/mac.h b/hw/ppc/mac.h index 6af87d1fa0..a0d9e47031 100644 --- a/hw/ppc/mac.h +++ b/hw/ppc/mac.h @@ -38,10 +38,8 @@ /* SMP is not enabled, for now */ #define MAX_CPUS 1 -#define BIOS_SIZE (1 * MiB) #define NVRAM_SIZE 0x2000 #define PROM_FILENAME "openbios-ppc" -#define PROM_ADDR 0xfff00000 #define KERNEL_LOAD_ADDR 0x01000000 #define KERNEL_GAP 0x00100000 diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c index 5f3a028e6a..eec62d1e90 100644 --- a/hw/ppc/mac_newworld.c +++ b/hw/ppc/mac_newworld.c @@ -82,6 +82,8 @@ #define NDRV_VGA_FILENAME "qemu_vga.ndrv" +#define PROM_BASE 0xfff00000 +#define PROM_SIZE (1 * MiB) static void fw_cfg_boot_set(void *opaque, const char *boot_device, Error **errp) @@ -100,7 +102,7 @@ static void ppc_core99_reset(void *opaque) cpu_reset(CPU(cpu)); /* 970 CPUs want to get their initial IP as part of their boot protocol */ - cpu->env.nip = PROM_ADDR + 0x100; + cpu->env.nip = PROM_BASE + 0x100; } /* PowerPC Mac99 hardware initialisation */ @@ -153,25 +155,29 @@ static void ppc_core99_init(MachineState *machine) /* allocate RAM */ memory_region_add_subregion(get_system_memory(), 0, machine->ram); - /* allocate and load BIOS */ - memory_region_init_rom(bios, NULL, "ppc_core99.bios", BIOS_SIZE, + /* allocate and load firmware ROM */ + memory_region_init_rom(bios, NULL, "ppc_core99.bios", PROM_SIZE, &error_fatal); + memory_region_add_subregion(get_system_memory(), PROM_BASE, bios); - if (bios_name == NULL) + if (!bios_name) { bios_name = PROM_FILENAME; + } filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); - memory_region_add_subregion(get_system_memory(), PROM_ADDR, bios); - - /* Load OpenBIOS (ELF) */ if (filename) { + /* Load OpenBIOS (ELF) */ bios_size = load_elf(filename, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, PPC_ELF_MACHINE, 0, 0); + if (bios_size <= 0) { + /* or load binary ROM image */ + bios_size = load_image_targphys(filename, PROM_BASE, PROM_SIZE); + } g_free(filename); } else { bios_size = -1; } - if (bios_size < 0 || bios_size > BIOS_SIZE) { + if (bios_size < 0 || bios_size > PROM_SIZE) { error_report("could not load PowerPC bios '%s'", bios_name); exit(1); }
Fall back to load binary ROM image if loading ELF fails. This also moves PROM_BASE and PROM_SIZE defines to board as these are matching the ROM size and address on this board. Signed-off-by: BALATON Zoltan <balaton@eik.bme.hu> --- Notes: Unlike mac_oldworld where the openbios-ppc image loads at end of ROM region here we only check size and assume ELF image is loaded from PROM_BASE, Checking the load addr here is tricky because this board is also be compiled both 64 and 32 bit and load_elf seems to always return 64 bit value so handling that could become a mess. If this is a problem then it's a preexisting one so should be fixed in a separate patch. This one just allows loading ROM binary too otherwise preserving previous behaviour. hw/ppc/mac.h | 2 -- hw/ppc/mac_newworld.c | 22 ++++++++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-)