mirror of
https://git.proxmox.com/git/qemu
synced 2025-08-07 09:40:44 +00:00
pseries: Fix loading of little endian kernels
Try loading the kernel as little endian if it fails big endian. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Reviewed-by: Anton Blanchard <anton@samba.org> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
09b04845a7
commit
16457e7f4a
@ -273,6 +273,7 @@ static void *spapr_create_fdt_skel(const char *cpu_model,
|
|||||||
hwaddr initrd_base,
|
hwaddr initrd_base,
|
||||||
hwaddr initrd_size,
|
hwaddr initrd_size,
|
||||||
hwaddr kernel_size,
|
hwaddr kernel_size,
|
||||||
|
bool little_endian,
|
||||||
const char *boot_device,
|
const char *boot_device,
|
||||||
const char *kernel_cmdline,
|
const char *kernel_cmdline,
|
||||||
uint32_t epow_irq)
|
uint32_t epow_irq)
|
||||||
@ -326,6 +327,9 @@ static void *spapr_create_fdt_skel(const char *cpu_model,
|
|||||||
cpu_to_be64(kernel_size) };
|
cpu_to_be64(kernel_size) };
|
||||||
|
|
||||||
_FDT((fdt_property(fdt, "qemu,boot-kernel", &kprop, sizeof(kprop))));
|
_FDT((fdt_property(fdt, "qemu,boot-kernel", &kprop, sizeof(kprop))));
|
||||||
|
if (little_endian) {
|
||||||
|
_FDT((fdt_property(fdt, "qemu,boot-kernel-le", NULL, 0)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (boot_device) {
|
if (boot_device) {
|
||||||
_FDT((fdt_property_string(fdt, "qemu,boot-device", boot_device)));
|
_FDT((fdt_property_string(fdt, "qemu,boot-device", boot_device)));
|
||||||
@ -1102,6 +1106,7 @@ static void ppc_spapr_init(QEMUMachineInitArgs *args)
|
|||||||
uint32_t initrd_base = 0;
|
uint32_t initrd_base = 0;
|
||||||
long kernel_size = 0, initrd_size = 0;
|
long kernel_size = 0, initrd_size = 0;
|
||||||
long load_limit, rtas_limit, fw_size;
|
long load_limit, rtas_limit, fw_size;
|
||||||
|
bool kernel_le = false;
|
||||||
char *filename;
|
char *filename;
|
||||||
|
|
||||||
msi_supported = true;
|
msi_supported = true;
|
||||||
@ -1281,6 +1286,12 @@ static void ppc_spapr_init(QEMUMachineInitArgs *args)
|
|||||||
|
|
||||||
kernel_size = load_elf(kernel_filename, translate_kernel_address, NULL,
|
kernel_size = load_elf(kernel_filename, translate_kernel_address, NULL,
|
||||||
NULL, &lowaddr, NULL, 1, ELF_MACHINE, 0);
|
NULL, &lowaddr, NULL, 1, ELF_MACHINE, 0);
|
||||||
|
if (kernel_size < 0) {
|
||||||
|
kernel_size = load_elf(kernel_filename,
|
||||||
|
translate_kernel_address, NULL,
|
||||||
|
NULL, &lowaddr, NULL, 0, ELF_MACHINE, 0);
|
||||||
|
kernel_le = kernel_size > 0;
|
||||||
|
}
|
||||||
if (kernel_size < 0) {
|
if (kernel_size < 0) {
|
||||||
kernel_size = load_image_targphys(kernel_filename,
|
kernel_size = load_image_targphys(kernel_filename,
|
||||||
KERNEL_LOAD_ADDR,
|
KERNEL_LOAD_ADDR,
|
||||||
@ -1331,7 +1342,7 @@ static void ppc_spapr_init(QEMUMachineInitArgs *args)
|
|||||||
/* Prepare the device tree */
|
/* Prepare the device tree */
|
||||||
spapr->fdt_skel = spapr_create_fdt_skel(cpu_model,
|
spapr->fdt_skel = spapr_create_fdt_skel(cpu_model,
|
||||||
initrd_base, initrd_size,
|
initrd_base, initrd_size,
|
||||||
kernel_size,
|
kernel_size, kernel_le,
|
||||||
boot_device, kernel_cmdline,
|
boot_device, kernel_cmdline,
|
||||||
spapr->epow_irq);
|
spapr->epow_irq);
|
||||||
assert(spapr->fdt_skel != NULL);
|
assert(spapr->fdt_skel != NULL);
|
||||||
|
Loading…
Reference in New Issue
Block a user