Emulated MIPS boards bail out with a simple "could not load kernel" when
a kernel could not be load, without specifying the underlying reason.
Fix that by calling load_elf_strerror.
At the same time use error_report to report the error instead of
fprintf.
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
---
hw/mips/mips_fulong2e.c | 15 +++++++++------
hw/mips/mips_malta.c | 14 ++++++++------
hw/mips/mips_mipssim.c | 5 +++--
hw/mips/mips_r4k.c | 6 ++++--
4 files changed, 24 insertions(+), 16 deletions(-)
diff --git a/hw/mips/mips_fulong2e.c b/hw/mips/mips_fulong2e.c
index 3f3cb32651..3532399a13 100644
--- a/hw/mips/mips_fulong2e.c
+++ b/hw/mips/mips_fulong2e.c
@@ -110,16 +110,19 @@ static int64_t load_kernel (CPUMIPSState *env)
{
int64_t kernel_entry, kernel_low, kernel_high;
int index = 0;
- long initrd_size;
+ long kernel_size, initrd_size;
ram_addr_t initrd_offset;
uint32_t *prom_buf;
long prom_size;
- if (load_elf(loaderparams.kernel_filename, cpu_mips_kseg0_to_phys, NULL,
- (uint64_t *)&kernel_entry, (uint64_t *)&kernel_low,
- (uint64_t *)&kernel_high, 0, EM_MIPS, 1, 0) < 0) {
- fprintf(stderr, "qemu: could not load kernel '%s'\n",
- loaderparams.kernel_filename);
+ kernel_size = load_elf(loaderparams.kernel_filename, cpu_mips_kseg0_to_phys,
+ NULL, (uint64_t *)&kernel_entry,
+ (uint64_t *)&kernel_low, (uint64_t *)&kernel_high,
+ 0, EM_MIPS, 1, 0);
+ if (kernel_size < 0) {
+ error_report("qemu: could not load kernel '%s': %s",
+ loaderparams.kernel_filename,
+ load_elf_strerror(kernel_size));
exit(1);
}
diff --git a/hw/mips/mips_malta.c b/hw/mips/mips_malta.c
index 3487d16f61..8ecd544baa 100644
--- a/hw/mips/mips_malta.c
+++ b/hw/mips/mips_malta.c
@@ -794,7 +794,7 @@ static void GCC_FMT_ATTR(3, 4) prom_set(uint32_t* prom_buf, int index,
static int64_t load_kernel (void)
{
int64_t kernel_entry, kernel_high;
- long initrd_size;
+ long kernel_size, initrd_size;
ram_addr_t initrd_offset;
int big_endian;
uint32_t *prom_buf;
@@ -808,11 +808,13 @@ static int64_t load_kernel (void)
big_endian = 0;
#endif
- if (load_elf(loaderparams.kernel_filename, cpu_mips_kseg0_to_phys, NULL,
- (uint64_t *)&kernel_entry, NULL, (uint64_t *)&kernel_high,
- big_endian, EM_MIPS, 1, 0) < 0) {
- fprintf(stderr, "qemu: could not load kernel '%s'\n",
- loaderparams.kernel_filename);
+ kernel_size = load_elf(loaderparams.kernel_filename, cpu_mips_kseg0_to_phys,
+ NULL, (uint64_t *)&kernel_entry, NULL,
+ (uint64_t *)&kernel_high, big_endian, EM_MIPS, 1, 0);
+ if (kernel_size < 0) {
+ error_report("qemu: could not load kernel '%s': %s",
+ loaderparams.kernel_filename,
+ load_elf_strerror(kernel_size));
exit(1);
}
diff --git a/hw/mips/mips_mipssim.c b/hw/mips/mips_mipssim.c
index 6990b1b0dd..07fc4c2300 100644
--- a/hw/mips/mips_mipssim.c
+++ b/hw/mips/mips_mipssim.c
@@ -78,8 +78,9 @@ static int64_t load_kernel(void)
if ((entry & ~0x7fffffffULL) == 0x80000000)
entry = (int32_t)entry;
} else {
- fprintf(stderr, "qemu: could not load kernel '%s'\n",
- loaderparams.kernel_filename);
+ error_report("qemu: could not load kernel '%s': %s",
+ loaderparams.kernel_filename,
+ load_elf_strerror(kernel_size));
exit(1);
}
diff --git a/hw/mips/mips_r4k.c b/hw/mips/mips_r4k.c
index 690874be2b..2f5ced7409 100644
--- a/hw/mips/mips_r4k.c
+++ b/hw/mips/mips_r4k.c
@@ -31,6 +31,7 @@
#include "sysemu/block-backend.h"
#include "exec/address-spaces.h"
#include "sysemu/qtest.h"
+#include "qemu/error-report.h"
#define MAX_IDE_BUS 2
@@ -96,8 +97,9 @@ static int64_t load_kernel(void)
if ((entry & ~0x7fffffffULL) == 0x80000000)
entry = (int32_t)entry;
} else {
- fprintf(stderr, "qemu: could not load kernel '%s'\n",
- loaderparams.kernel_filename);
+ error_report("qemu: could not load kernel '%s': %s",
+ loaderparams.kernel_filename,
+ load_elf_strerror(kernel_size));
exit(1);
}
--
2.11.0
On 07/26/2017 08:56 PM, Aurelien Jarno wrote:
> Emulated MIPS boards bail out with a simple "could not load kernel" when
> a kernel could not be load, without specifying the underlying reason.
> Fix that by calling load_elf_strerror.
>
> At the same time use error_report to report the error instead of
> fprintf.
>
> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
Thank you Aurelien :)
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
> hw/mips/mips_fulong2e.c | 15 +++++++++------
> hw/mips/mips_malta.c | 14 ++++++++------
> hw/mips/mips_mipssim.c | 5 +++--
> hw/mips/mips_r4k.c | 6 ++++--
> 4 files changed, 24 insertions(+), 16 deletions(-)
>
> diff --git a/hw/mips/mips_fulong2e.c b/hw/mips/mips_fulong2e.c
> index 3f3cb32651..3532399a13 100644
> --- a/hw/mips/mips_fulong2e.c
> +++ b/hw/mips/mips_fulong2e.c
> @@ -110,16 +110,19 @@ static int64_t load_kernel (CPUMIPSState *env)
> {
> int64_t kernel_entry, kernel_low, kernel_high;
> int index = 0;
> - long initrd_size;
> + long kernel_size, initrd_size;
> ram_addr_t initrd_offset;
> uint32_t *prom_buf;
> long prom_size;
>
> - if (load_elf(loaderparams.kernel_filename, cpu_mips_kseg0_to_phys, NULL,
> - (uint64_t *)&kernel_entry, (uint64_t *)&kernel_low,
> - (uint64_t *)&kernel_high, 0, EM_MIPS, 1, 0) < 0) {
> - fprintf(stderr, "qemu: could not load kernel '%s'\n",
> - loaderparams.kernel_filename);
> + kernel_size = load_elf(loaderparams.kernel_filename, cpu_mips_kseg0_to_phys,
> + NULL, (uint64_t *)&kernel_entry,
> + (uint64_t *)&kernel_low, (uint64_t *)&kernel_high,
> + 0, EM_MIPS, 1, 0);
> + if (kernel_size < 0) {
> + error_report("qemu: could not load kernel '%s': %s",
> + loaderparams.kernel_filename,
> + load_elf_strerror(kernel_size));
> exit(1);
> }
>
> diff --git a/hw/mips/mips_malta.c b/hw/mips/mips_malta.c
> index 3487d16f61..8ecd544baa 100644
> --- a/hw/mips/mips_malta.c
> +++ b/hw/mips/mips_malta.c
> @@ -794,7 +794,7 @@ static void GCC_FMT_ATTR(3, 4) prom_set(uint32_t* prom_buf, int index,
> static int64_t load_kernel (void)
> {
> int64_t kernel_entry, kernel_high;
> - long initrd_size;
> + long kernel_size, initrd_size;
> ram_addr_t initrd_offset;
> int big_endian;
> uint32_t *prom_buf;
> @@ -808,11 +808,13 @@ static int64_t load_kernel (void)
> big_endian = 0;
> #endif
>
> - if (load_elf(loaderparams.kernel_filename, cpu_mips_kseg0_to_phys, NULL,
> - (uint64_t *)&kernel_entry, NULL, (uint64_t *)&kernel_high,
> - big_endian, EM_MIPS, 1, 0) < 0) {
> - fprintf(stderr, "qemu: could not load kernel '%s'\n",
> - loaderparams.kernel_filename);
> + kernel_size = load_elf(loaderparams.kernel_filename, cpu_mips_kseg0_to_phys,
> + NULL, (uint64_t *)&kernel_entry, NULL,
> + (uint64_t *)&kernel_high, big_endian, EM_MIPS, 1, 0);
> + if (kernel_size < 0) {
> + error_report("qemu: could not load kernel '%s': %s",
> + loaderparams.kernel_filename,
> + load_elf_strerror(kernel_size));
> exit(1);
> }
>
> diff --git a/hw/mips/mips_mipssim.c b/hw/mips/mips_mipssim.c
> index 6990b1b0dd..07fc4c2300 100644
> --- a/hw/mips/mips_mipssim.c
> +++ b/hw/mips/mips_mipssim.c
> @@ -78,8 +78,9 @@ static int64_t load_kernel(void)
> if ((entry & ~0x7fffffffULL) == 0x80000000)
> entry = (int32_t)entry;
> } else {
> - fprintf(stderr, "qemu: could not load kernel '%s'\n",
> - loaderparams.kernel_filename);
> + error_report("qemu: could not load kernel '%s': %s",
> + loaderparams.kernel_filename,
> + load_elf_strerror(kernel_size));
> exit(1);
> }
>
> diff --git a/hw/mips/mips_r4k.c b/hw/mips/mips_r4k.c
> index 690874be2b..2f5ced7409 100644
> --- a/hw/mips/mips_r4k.c
> +++ b/hw/mips/mips_r4k.c
> @@ -31,6 +31,7 @@
> #include "sysemu/block-backend.h"
> #include "exec/address-spaces.h"
> #include "sysemu/qtest.h"
> +#include "qemu/error-report.h"
>
> #define MAX_IDE_BUS 2
>
> @@ -96,8 +97,9 @@ static int64_t load_kernel(void)
> if ((entry & ~0x7fffffffULL) == 0x80000000)
> entry = (int32_t)entry;
> } else {
> - fprintf(stderr, "qemu: could not load kernel '%s'\n",
> - loaderparams.kernel_filename);
> + error_report("qemu: could not load kernel '%s': %s",
> + loaderparams.kernel_filename,
> + load_elf_strerror(kernel_size));
> exit(1);
> }
>
>
© 2016 - 2026 Red Hat, Inc.