From: Grant Likely <grant.lik...@linaro.org> Right now to run firmware inside the QEMU VExpress model requires padding out the firmware image to the size of the virtual flash and passing it in via the -pflash argument. If the firmware image is passed without padding, then QEMU will fail. Also, when passed as a -pflash argument, QEMU treats the file as persistent storage and will modify the file.
The -bios flag provides the semantics that we want for providing a firmware image. This patch maps the contents of the -bios file into the address space at the boot flash location. Tested with the vexpress-a15 model and the Tianocore port. Signed-off-by: Grant Likely <grant.lik...@linaro.org> Tested-by: Roy Franz <roy.fr...@linaro.org> [PMM: folded long line, removed stray \n from error message, use correct variable for printing image name, exit(1) rather than 0] Signed-off-by: Peter Maydell <peter.mayd...@linaro.org> --- Grant submitted v1 of this a few months back; it was pretty nearly correct, so I've just tidied up the loose ends so we can get it into QEMU 2.1. Tested by booting the UEFI blob from https://wiki.linaro.org/LEG/Engineering/Kernel/UEFI/VersatileExpress/QEMU hw/arm/vexpress.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/hw/arm/vexpress.c b/hw/arm/vexpress.c index 33ff422..0f8f175 100644 --- a/hw/arm/vexpress.c +++ b/hw/arm/vexpress.c @@ -28,6 +28,7 @@ #include "net/net.h" #include "sysemu/sysemu.h" #include "hw/boards.h" +#include "hw/loader.h" #include "exec/address-spaces.h" #include "sysemu/blockdev.h" #include "hw/block/flash.h" @@ -528,6 +529,18 @@ static void vexpress_common_init(VEDBoardInfo *daughterboard, daughterboard->init(daughterboard, machine->ram_size, machine->cpu_model, pic); + /* + * If a bios file was provided, attempt to map it into memory + */ + if (bios_name) { + const char *fn = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name); + if (!fn || load_image_targphys(fn, map[VE_NORFLASH0], + VEXPRESS_FLASH_SIZE) < 0) { + error_report("Could not load rom image '%s'", bios_name); + exit(1); + } + } + /* Motherboard peripherals: the wiring is the same but the * addresses vary between the legacy and A-Series memory maps. */ -- 1.9.2