Allow the kernel's entry point information to be returned when loading a kernel.
Signed-off-by: Alistair Francis <alist...@alistair23.me> --- hw/arm/armv7m.c | 6 +++--- hw/arm/microbit.c | 2 +- hw/arm/mps2-tz.c | 3 ++- hw/arm/mps2.c | 2 +- hw/arm/msf2-som.c | 2 +- hw/arm/musca.c | 3 ++- hw/arm/netduino2.c | 2 +- hw/arm/stellaris.c | 3 ++- include/hw/arm/arm.h | 4 +++- 9 files changed, 16 insertions(+), 11 deletions(-) diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c index c4b2a9a1f5..a52328f188 100644 --- a/hw/arm/armv7m.c +++ b/hw/arm/armv7m.c @@ -286,10 +286,10 @@ static void armv7m_reset(void *opaque) cpu_reset(CPU(cpu)); } -void armv7m_load_kernel(ARMCPU *cpu, const char *kernel_filename, int mem_size) +void armv7m_load_kernel(ARMCPU *cpu, const char *kernel_filename, int mem_size, + uint64_t *entry) { int image_size; - uint64_t entry; uint64_t lowaddr; int big_endian; AddressSpace *as; @@ -311,7 +311,7 @@ void armv7m_load_kernel(ARMCPU *cpu, const char *kernel_filename, int mem_size) if (kernel_filename) { image_size = load_elf_as(kernel_filename, NULL, NULL, NULL, - &entry, &lowaddr, + entry, &lowaddr, NULL, big_endian, EM_ARM, 1, 0, as); if (image_size < 0) { image_size = load_image_targphys_as(kernel_filename, 0, diff --git a/hw/arm/microbit.c b/hw/arm/microbit.c index da67bf6d9d..03147750f1 100644 --- a/hw/arm/microbit.c +++ b/hw/arm/microbit.c @@ -58,7 +58,7 @@ static void microbit_init(MachineState *machine) mr, -1); armv7m_load_kernel(ARM_CPU(first_cpu), machine->kernel_filename, - NRF51_SOC(soc)->flash_size); + NRF51_SOC(soc)->flash_size, NULL); } static void microbit_machine_class_init(ObjectClass *oc, void *data) diff --git a/hw/arm/mps2-tz.c b/hw/arm/mps2-tz.c index f79f090a4a..f6dc7dce2a 100644 --- a/hw/arm/mps2-tz.c +++ b/hw/arm/mps2-tz.c @@ -613,7 +613,8 @@ static void mps2tz_common_init(MachineState *machine) create_unimplemented_device("FPGA NS PC", 0x48007000, 0x1000); - armv7m_load_kernel(ARM_CPU(first_cpu), machine->kernel_filename, 0x400000); + armv7m_load_kernel(ARM_CPU(first_cpu), machine->kernel_filename, 0x400000, + NULL); } static void mps2_tz_idau_check(IDAUInterface *ii, uint32_t address, diff --git a/hw/arm/mps2.c b/hw/arm/mps2.c index e3d698ba6c..55d2273a54 100644 --- a/hw/arm/mps2.c +++ b/hw/arm/mps2.c @@ -328,7 +328,7 @@ static void mps2_common_init(MachineState *machine) system_clock_scale = NANOSECONDS_PER_SECOND / SYSCLK_FRQ; armv7m_load_kernel(ARM_CPU(first_cpu), machine->kernel_filename, - 0x400000); + 0x400000, NULL); } static void mps2_class_init(ObjectClass *oc, void *data) diff --git a/hw/arm/msf2-som.c b/hw/arm/msf2-som.c index 2432b5e935..f81be74716 100644 --- a/hw/arm/msf2-som.c +++ b/hw/arm/msf2-som.c @@ -92,7 +92,7 @@ static void emcraft_sf2_s2s010_init(MachineState *machine) sysbus_connect_irq(SYS_BUS_DEVICE(&soc->spi[0]), 1, cs_line); armv7m_load_kernel(ARM_CPU(first_cpu), machine->kernel_filename, - soc->envm_size); + soc->envm_size, NULL); } static void emcraft_sf2_machine_init(MachineClass *mc) diff --git a/hw/arm/musca.c b/hw/arm/musca.c index 23aff43f4b..59460ba090 100644 --- a/hw/arm/musca.c +++ b/hw/arm/musca.c @@ -589,7 +589,8 @@ static void musca_init(MachineState *machine) "cfg_sec_resp", 0)); } - armv7m_load_kernel(ARM_CPU(first_cpu), machine->kernel_filename, 0x2000000); + armv7m_load_kernel(ARM_CPU(first_cpu), machine->kernel_filename, 0x2000000, + NULL); } static void musca_class_init(ObjectClass *oc, void *data) diff --git a/hw/arm/netduino2.c b/hw/arm/netduino2.c index f936017d4a..38a6d8fdd1 100644 --- a/hw/arm/netduino2.c +++ b/hw/arm/netduino2.c @@ -38,7 +38,7 @@ static void netduino2_init(MachineState *machine) object_property_set_bool(OBJECT(dev), true, "realized", &error_fatal); armv7m_load_kernel(ARM_CPU(first_cpu), machine->kernel_filename, - FLASH_SIZE); + FLASH_SIZE, NULL); } static void netduino2_machine_init(MachineClass *mc) diff --git a/hw/arm/stellaris.c b/hw/arm/stellaris.c index 05f86749f4..276b1acc46 100644 --- a/hw/arm/stellaris.c +++ b/hw/arm/stellaris.c @@ -1459,7 +1459,8 @@ static void stellaris_init(MachineState *ms, stellaris_board_info *board) create_unimplemented_device("hibernation", 0x400fc000, 0x1000); create_unimplemented_device("flash-control", 0x400fd000, 0x1000); - armv7m_load_kernel(ARM_CPU(first_cpu), ms->kernel_filename, flash_size); + armv7m_load_kernel(ARM_CPU(first_cpu), ms->kernel_filename, flash_size, + NULL); } /* FIXME: Figure out how to generate these from stellaris_boards. */ diff --git a/include/hw/arm/arm.h b/include/hw/arm/arm.h index ffed39252d..10f7e10d95 100644 --- a/include/hw/arm/arm.h +++ b/include/hw/arm/arm.h @@ -28,12 +28,14 @@ typedef enum { * @cpu: CPU * @kernel_filename: file to load * @mem_size: mem_size: maximum image size to load + * @entry: location of the kernel's entry point * * Load the guest image for an ARMv7M system. This must be called by * any ARMv7M board. (This is necessary to ensure that the CPU resets * correctly on system reset, as well as for kernel loading.) */ -void armv7m_load_kernel(ARMCPU *cpu, const char *kernel_filename, int mem_size); +void armv7m_load_kernel(ARMCPU *cpu, const char *kernel_filename, int mem_size, + uint64_t *entry); /* arm_boot.c */ struct arm_boot_info { -- 2.21.0