aboutsummaryrefslogtreecommitdiff
path: root/hw/s390x/ipl.c
diff options
context:
space:
mode:
authorAlexander Graf <agraf@suse.de>2013-04-22 16:47:32 +0200
committerAlexander Graf <agraf@suse.de>2013-04-26 20:18:23 +0200
commit3325995640e0a598c4c350a1a02357b422e90973 (patch)
tree5011996b8158b929ee51e70beaff58a39faaac5b /hw/s390x/ipl.c
parent74ad2d22c1f6e2b24412f6b2adea7d6f9a719047 (diff)
S390: IPL: Support ELF firmware
Our firmware blob is always a raw file that we load at a fixed address today. Support loading an ELF blob instead that we can map high up in memory. This way we don't have to be so conscious about size constraints. Signed-off-by: Alexander Graf <agraf@suse.de>
Diffstat (limited to 'hw/s390x/ipl.c')
-rw-r--r--hw/s390x/ipl.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/hw/s390x/ipl.c b/hw/s390x/ipl.c
index c43dfcdf61..d1f7acd5fb 100644
--- a/hw/s390x/ipl.c
+++ b/hw/s390x/ipl.c
@@ -82,17 +82,21 @@ static int s390_ipl_init(SysBusDevice *dev)
}
bios_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
- bios_size = load_image_targphys(bios_filename, ZIPL_IMAGE_START, 4096);
- ipl->start_addr = ZIPL_IMAGE_START;
+ bios_size = load_elf(bios_filename, NULL, NULL, &ipl->start_addr, NULL,
+ NULL, 1, ELF_MACHINE, 0);
+ if (bios_size == -1UL) {
+ bios_size = load_image_targphys(bios_filename, ZIPL_IMAGE_START,
+ 4096);
+ ipl->start_addr = ZIPL_IMAGE_START;
+ if (bios_size > 4096) {
+ hw_error("stage1 bootloader is > 4k\n");
+ }
+ }
g_free(bios_filename);
if ((long)bios_size < 0) {
hw_error("could not load bootloader '%s'\n", bios_name);
}
-
- if (bios_size > 4096) {
- hw_error("stage1 bootloader is > 4k\n");
- }
return 0;
} else {
kernel_size = load_elf(ipl->kernel, NULL, NULL, NULL, NULL,