From 3325995640e0a598c4c350a1a02357b422e90973 Mon Sep 17 00:00:00 2001 From: Alexander Graf Date: Mon, 22 Apr 2013 16:47:32 +0200 Subject: 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 --- hw/s390x/ipl.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'hw/s390x/ipl.c') 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, -- cgit v1.2.3