Pass error_fatal to load_image_targphys() calls in ppc machine initialization
to capture detailed error information when loading firmware, kernel,
and initrd images.
Passing error_fatal automatically reports detailed error messages and
exits immediately on failure. Eliminating redundant exit(1) calls, as
error_fatal handles termination
The behavior remains functionally identical, but error messages now
come directly from the loader function with more context about the
failure cause.
Signed-off-by: Vishal Chourasia <vishalc@linux.ibm.com>
---
hw/ppc/amigaone.c | 13 ++-----------
hw/ppc/e500.c | 19 +++----------------
hw/ppc/mac_newworld.c | 16 +++-------------
hw/ppc/mac_oldworld.c | 16 +++-------------
hw/ppc/pegasos2.c | 9 ++-------
hw/ppc/pnv.c | 28 +++++-----------------------
hw/ppc/ppc440_bamboo.c | 8 +-------
hw/ppc/prep.c | 17 ++++-------------
hw/ppc/sam460ex.c | 7 +------
hw/ppc/spapr.c | 13 ++-----------
hw/ppc/virtex_ml507.c | 10 ++--------
11 files changed, 28 insertions(+), 128 deletions(-)
diff --git a/hw/ppc/amigaone.c b/hw/ppc/amigaone.c
index 192474e0ae..74a1fa3b63 100644
--- a/hw/ppc/amigaone.c
+++ b/hw/ppc/amigaone.c
@@ -324,11 +324,7 @@ static void amigaone_init(MachineState *machine)
error_report("Could not find firmware '%s'", machine->firmware);
exit(1);
}
- sz = load_image_targphys(filename, PROM_ADDR, PROM_SIZE, NULL);
- if (sz <= 0 || sz > PROM_SIZE) {
- error_report("Could not load firmware '%s'", filename);
- exit(1);
- }
+ sz = load_image_targphys(filename, PROM_ADDR, PROM_SIZE, &error_fatal);
}
/* Articia S */
@@ -413,12 +409,7 @@ static void amigaone_init(MachineState *machine)
loadaddr = ROUND_UP(loadaddr + 4 * MiB, 4 * KiB);
loadaddr = MAX(loadaddr, INITRD_MIN_ADDR);
sz = load_image_targphys(machine->initrd_filename, loadaddr,
- bi->bd_info - loadaddr, NULL);
- if (sz <= 0) {
- error_report("Could not load initrd '%s'",
- machine->initrd_filename);
- exit(1);
- }
+ bi->bd_info - loadaddr, &error_fatal);
bi->initrd_start = loadaddr;
bi->initrd_end = loadaddr + sz;
}
diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c
index 418e1bb2fb..8842f7f6b8 100644
--- a/hw/ppc/e500.c
+++ b/hw/ppc/e500.c
@@ -1226,14 +1226,8 @@ void ppce500_init(MachineState *machine)
if (machine->kernel_filename && !kernel_as_payload) {
kernel_base = cur_base;
kernel_size = load_image_targphys(machine->kernel_filename,
- cur_base,
- machine->ram_size - cur_base, NULL);
- if (kernel_size < 0) {
- error_report("could not load kernel '%s'",
- machine->kernel_filename);
- exit(1);
- }
-
+ cur_base, machine->ram_size - cur_base,
+ &error_fatal);
cur_base += kernel_size;
}
@@ -1242,14 +1236,7 @@ void ppce500_init(MachineState *machine)
initrd_base = (cur_base + INITRD_LOAD_PAD) & ~INITRD_PAD_MASK;
initrd_size = load_image_targphys(machine->initrd_filename, initrd_base,
machine->ram_size - initrd_base,
- NULL);
-
- if (initrd_size < 0) {
- error_report("could not load initial ram disk '%s'",
- machine->initrd_filename);
- exit(1);
- }
-
+ &error_fatal);
cur_base = initrd_base + initrd_size;
}
diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
index 004efc6b97..951de4bae4 100644
--- a/hw/ppc/mac_newworld.c
+++ b/hw/ppc/mac_newworld.c
@@ -189,7 +189,7 @@ static void ppc_core99_init(MachineState *machine)
if (bios_size <= 0) {
/* or load binary ROM image */
bios_size = load_image_targphys(filename, PROM_BASE, PROM_SIZE,
- NULL);
+ &error_fatal);
}
g_free(filename);
}
@@ -212,12 +212,7 @@ static void ppc_core99_init(MachineState *machine)
kernel_size = load_image_targphys(machine->kernel_filename,
kernel_base,
machine->ram_size - kernel_base,
- NULL);
- }
- if (kernel_size < 0) {
- error_report("could not load kernel '%s'",
- machine->kernel_filename);
- exit(1);
+ &error_fatal);
}
/* load initrd */
if (machine->initrd_filename) {
@@ -225,12 +220,7 @@ static void ppc_core99_init(MachineState *machine)
initrd_size = load_image_targphys(machine->initrd_filename,
initrd_base,
machine->ram_size - initrd_base,
- NULL);
- if (initrd_size < 0) {
- error_report("could not load initial ram disk '%s'",
- machine->initrd_filename);
- exit(1);
- }
+ &error_fatal);
cmdline_base = TARGET_PAGE_ALIGN(initrd_base + initrd_size);
} else {
cmdline_base = TARGET_PAGE_ALIGN(kernel_base + kernel_size + KERNEL_GAP);
diff --git a/hw/ppc/mac_oldworld.c b/hw/ppc/mac_oldworld.c
index c7e44d49b0..cd2bb46442 100644
--- a/hw/ppc/mac_oldworld.c
+++ b/hw/ppc/mac_oldworld.c
@@ -144,7 +144,7 @@ static void ppc_heathrow_init(MachineState *machine)
if (bios_size <= 0) {
/* or if could not load ELF try loading a binary ROM image */
bios_size = load_image_targphys(filename, PROM_BASE, PROM_SIZE,
- NULL);
+ &error_fatal);
bios_addr = PROM_BASE;
}
g_free(filename);
@@ -168,12 +168,7 @@ static void ppc_heathrow_init(MachineState *machine)
kernel_size = load_image_targphys(machine->kernel_filename,
kernel_base,
machine->ram_size - kernel_base,
- NULL);
- }
- if (kernel_size < 0) {
- error_report("could not load kernel '%s'",
- machine->kernel_filename);
- exit(1);
+ &error_fatal);
}
/* load initrd */
if (machine->initrd_filename) {
@@ -182,12 +177,7 @@ static void ppc_heathrow_init(MachineState *machine)
initrd_size = load_image_targphys(machine->initrd_filename,
initrd_base,
machine->ram_size - initrd_base,
- NULL);
- if (initrd_size < 0) {
- error_report("could not load initial ram disk '%s'",
- machine->initrd_filename);
- exit(1);
- }
+ &error_fatal);
cmdline_base = TARGET_PAGE_ALIGN(initrd_base + initrd_size);
} else {
cmdline_base = TARGET_PAGE_ALIGN(kernel_base + kernel_size + KERNEL_GAP);
diff --git a/hw/ppc/pegasos2.c b/hw/ppc/pegasos2.c
index a9e706644c..3c02c53c3a 100644
--- a/hw/ppc/pegasos2.c
+++ b/hw/ppc/pegasos2.c
@@ -198,7 +198,7 @@ static void pegasos_init(MachineState *machine)
ELFDATA2MSB, PPC_ELF_MACHINE, 0, 0);
if (sz <= 0) {
sz = load_image_targphys(filename, pm->vof ? 0 : prom_addr, PROM_SIZE,
- NULL);
+ &error_fatal);
}
if (sz <= 0 || sz > PROM_SIZE) {
error_report("Could not load firmware '%s'", filename);
@@ -302,12 +302,7 @@ static void pegasos_init(MachineState *machine)
pm->initrd_addr = ROUND_UP(pm->initrd_addr, 4);
pm->initrd_addr = MAX(pm->initrd_addr, INITRD_MIN_ADDR);
sz = load_image_targphys(machine->initrd_filename, pm->initrd_addr,
- machine->ram_size - pm->initrd_addr, NULL);
- if (sz <= 0) {
- error_report("Could not load initrd '%s'",
- machine->initrd_filename);
- exit(1);
- }
+ machine->ram_size - pm->initrd_addr, &error_fatal);
pm->initrd_size = sz;
}
diff --git a/hw/ppc/pnv.c b/hw/ppc/pnv.c
index 1c0dadda87..895132da91 100644
--- a/hw/ppc/pnv.c
+++ b/hw/ppc/pnv.c
@@ -1009,7 +1009,6 @@ static void pnv_init(MachineState *machine)
PnvMachineClass *pmc = PNV_MACHINE_GET_CLASS(machine);
int max_smt_threads = pmc->max_smt_threads;
char *fw_filename;
- long fw_size;
uint64_t chip_ram_start = 0;
int i;
char *chip_typename;
@@ -1068,26 +1067,14 @@ static void pnv_init(MachineState *machine)
exit(1);
}
- fw_size = load_image_targphys(fw_filename, pnv->fw_load_addr, FW_MAX_SIZE,
- NULL);
- if (fw_size < 0) {
- error_report("Could not load OPAL firmware '%s'", fw_filename);
- exit(1);
- }
+ load_image_targphys(fw_filename, pnv->fw_load_addr, FW_MAX_SIZE,
+ &error_fatal);
g_free(fw_filename);
/* load kernel */
if (machine->kernel_filename) {
- long kernel_size;
-
- kernel_size = load_image_targphys(machine->kernel_filename,
- KERNEL_LOAD_ADDR, KERNEL_MAX_SIZE,
- NULL);
- if (kernel_size < 0) {
- error_report("Could not load kernel '%s'",
- machine->kernel_filename);
- exit(1);
- }
+ load_image_targphys(machine->kernel_filename,
+ KERNEL_LOAD_ADDR, KERNEL_MAX_SIZE, &error_fatal);
}
/* load initrd */
@@ -1095,12 +1082,7 @@ static void pnv_init(MachineState *machine)
pnv->initrd_base = INITRD_LOAD_ADDR;
pnv->initrd_size = load_image_targphys(machine->initrd_filename,
pnv->initrd_base,
- INITRD_MAX_SIZE, NULL);
- if (pnv->initrd_size < 0) {
- error_report("Could not load initial ram disk '%s'",
- machine->initrd_filename);
- exit(1);
- }
+ INITRD_MAX_SIZE, &error_fatal);
}
/* load dtb if passed */
diff --git a/hw/ppc/ppc440_bamboo.c b/hw/ppc/ppc440_bamboo.c
index 7c66912c10..7e739a2114 100644
--- a/hw/ppc/ppc440_bamboo.c
+++ b/hw/ppc/ppc440_bamboo.c
@@ -243,13 +243,7 @@ static void bamboo_init(MachineState *machine)
if (initrd_filename) {
initrd_size = load_image_targphys(initrd_filename, RAMDISK_ADDR,
machine->ram_size - RAMDISK_ADDR,
- NULL);
-
- if (initrd_size < 0) {
- error_report("could not load ram disk '%s' at %x",
- initrd_filename, RAMDISK_ADDR);
- exit(1);
- }
+ &error_fatal);
}
/* If we're loading a kernel directly, we must load the device tree too. */
diff --git a/hw/ppc/prep.c b/hw/ppc/prep.c
index 0759e95cb6..c2fe16e985 100644
--- a/hw/ppc/prep.c
+++ b/hw/ppc/prep.c
@@ -280,7 +280,8 @@ static void ibm_40p_init(MachineState *machine)
bios_size = load_elf(filename, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
ELFDATA2MSB, PPC_ELF_MACHINE, 0, 0);
if (bios_size < 0) {
- bios_size = load_image_targphys(filename, BIOS_ADDR, BIOS_SIZE, NULL);
+ bios_size = load_image_targphys(filename, BIOS_ADDR, BIOS_SIZE,
+ &error_fatal);
}
if (bios_size < 0 || bios_size > BIOS_SIZE) {
error_report("Could not load bios image '%s'", filename);
@@ -380,12 +381,7 @@ static void ibm_40p_init(MachineState *machine)
kernel_size = load_image_targphys(machine->kernel_filename,
kernel_base,
machine->ram_size - kernel_base,
- NULL);
- if (kernel_size < 0) {
- error_report("could not load kernel '%s'",
- machine->kernel_filename);
- exit(1);
- }
+ &error_fatal);
fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_ADDR, kernel_base);
fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_SIZE, kernel_size);
/* load initrd */
@@ -394,12 +390,7 @@ static void ibm_40p_init(MachineState *machine)
initrd_size = load_image_targphys(machine->initrd_filename,
initrd_base,
machine->ram_size - initrd_base,
- NULL);
- if (initrd_size < 0) {
- error_report("could not load initial ram disk '%s'",
- machine->initrd_filename);
- exit(1);
- }
+ &error_fatal);
fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, initrd_base);
fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, initrd_size);
}
diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c
index 68d3eacbff..258d43f8d2 100644
--- a/hw/ppc/sam460ex.c
+++ b/hw/ppc/sam460ex.c
@@ -495,12 +495,7 @@ static void sam460ex_init(MachineState *machine)
initrd_size = load_image_targphys(machine->initrd_filename,
RAMDISK_ADDR,
machine->ram_size - RAMDISK_ADDR,
- NULL);
- if (initrd_size < 0) {
- error_report("could not load ram disk '%s' at %x",
- machine->initrd_filename, RAMDISK_ADDR);
- exit(1);
- }
+ &error_fatal);
}
/* If we're loading a kernel directly, we must load the device tree too. */
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index cdf2fdeadc..99b843ba2f 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -2854,11 +2854,7 @@ static void spapr_machine_init(MachineState *machine)
error_report("Could not find LPAR firmware '%s'", bios_name);
exit(1);
}
- fw_size = load_image_targphys(filename, 0, FW_MAX_SIZE, NULL);
- if (fw_size <= 0) {
- error_report("Could not load LPAR firmware '%s'", filename);
- exit(1);
- }
+ fw_size = load_image_targphys(filename, 0, FW_MAX_SIZE, &error_fatal);
/*
* if Secure VM (PEF) support is configured, then initialize it
@@ -3117,12 +3113,7 @@ static void spapr_machine_init(MachineState *machine)
spapr->initrd_size = load_image_targphys(initrd_filename,
spapr->initrd_base,
load_limit - spapr->initrd_base,
- NULL);
- if (spapr->initrd_size < 0) {
- error_report("could not load initial ram disk '%s'",
- initrd_filename);
- exit(1);
- }
+ &error_fatal);
}
}
diff --git a/hw/ppc/virtex_ml507.c b/hw/ppc/virtex_ml507.c
index 00d9ab7509..43a6d505a8 100644
--- a/hw/ppc/virtex_ml507.c
+++ b/hw/ppc/virtex_ml507.c
@@ -253,7 +253,7 @@ static void virtex_init(MachineState *machine)
/* If we failed loading ELF's try a raw image. */
kernel_size = load_image_targphys(kernel_filename,
boot_offset,
- machine->ram_size, NULL);
+ machine->ram_size, &error_fatal);
boot_info.bootstrap_pc = boot_offset;
high = boot_info.bootstrap_pc + kernel_size + 8192;
}
@@ -265,13 +265,7 @@ static void virtex_init(MachineState *machine)
initrd_base = high = ROUND_UP(high, 4);
initrd_size = load_image_targphys(machine->initrd_filename,
high, machine->ram_size - high,
- NULL);
-
- if (initrd_size < 0) {
- error_report("couldn't load ram disk '%s'",
- machine->initrd_filename);
- exit(1);
- }
+ &error_fatal);
high = ROUND_UP(high + initrd_size, 4);
}
--
2.51.0
On 25/10/24 10:57AM, Vishal Chourasia wrote:
> Pass error_fatal to load_image_targphys() calls in ppc machine initialization
> to capture detailed error information when loading firmware, kernel,
> and initrd images.
>
> Passing error_fatal automatically reports detailed error messages and
> exits immediately on failure. Eliminating redundant exit(1) calls, as
> error_fatal handles termination
>
> The behavior remains functionally identical, but error messages now
> come directly from the loader function with more context about the
> failure cause.
>
> Signed-off-by: Vishal Chourasia <vishalc@linux.ibm.com>
Thanks, the errors are much clearer now:
$ ./build/qemu-system-ppc64 -M powernv -kernel ./vmlinux
qemu-system-ppc64: <...>/vmlinux exceeds maximum image size (128 MiB)
$ ./build/qemu-system-ppc64 -M powernv -kernel ./vmlinux
qemu-system-ppc64: Could not open '<...>/vmlinux': Permission denied
$ ./build/qemu-system-ppc64 -M powernv -kernel ./vmlinux
qemu-system-ppc64: Could not open '<...>/vmlinux': No such file or directory
Have few observations below, but the patch looks good to me.
Reviewed-by: Aditya Gupta <adityag@linux.ibm.com>
>
> > <...snip...>
> diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
> index 004efc6b97..951de4bae4 100644
> --- a/hw/ppc/mac_newworld.c
> +++ b/hw/ppc/mac_newworld.c
> @@ -189,7 +189,7 @@ static void ppc_core99_init(MachineState *machine)
> if (bios_size <= 0) {
> /* or load binary ROM image */
> bios_size = load_image_targphys(filename, PROM_BASE, PROM_SIZE,
> - NULL);
> + &error_fatal);
Nit: This and few similar diffs below change the behaviour.
Previously qemu wouldn't have exited here, but now it will.
This looks okay to me, as considering the code, it must successfully
load these images.
Thanks,
- Aditya G
© 2016 - 2025 Red Hat, Inc.