diff options
author | Alexander Graf <agraf@suse.de> | 2013-04-22 16:47:32 +0200 |
---|---|---|
committer | Alexander Graf <agraf@suse.de> | 2013-04-26 20:18:23 +0200 |
commit | 3325995640e0a598c4c350a1a02357b422e90973 (patch) | |
tree | 5011996b8158b929ee51e70beaff58a39faaac5b /hw/s390x/ipl.c | |
parent | 74ad2d22c1f6e2b24412f6b2adea7d6f9a719047 (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.c | 16 |
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, |