On 02/15/2018 02:57 PM, Peter Maydell wrote: > Instead of loading guest images to the system address space, use the > CPU's address space. This is important if we're trying to load the > file to memory or via an alias memory region that is provided by an > SoC object and thus not mapped into the system address space. > > Signed-off-by: Peter Maydell <peter.mayd...@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <f4...@amsat.org> > --- > hw/arm/armv7m.c | 17 ++++++++++++++--- > 1 file changed, 14 insertions(+), 3 deletions(-) > > diff --git a/hw/arm/armv7m.c b/hw/arm/armv7m.c > index 56770a7048..facc536b07 100644 > --- a/hw/arm/armv7m.c > +++ b/hw/arm/armv7m.c > @@ -270,6 +270,9 @@ void armv7m_load_kernel(ARMCPU *cpu, const char > *kernel_filename, int mem_size) > uint64_t entry; > uint64_t lowaddr; > int big_endian; > + AddressSpace *as; > + int asidx; > + CPUState *cs = CPU(cpu); > > #ifdef TARGET_WORDS_BIGENDIAN > big_endian = 1; > @@ -282,11 +285,19 @@ void armv7m_load_kernel(ARMCPU *cpu, const char > *kernel_filename, int mem_size) > exit(1); > } > > + if (arm_feature(&cpu->env, ARM_FEATURE_EL3)) { > + asidx = ARMASIdx_S; > + } else { > + asidx = ARMASIdx_NS; > + } > + as = cpu_get_address_space(cs, asidx); > + > if (kernel_filename) { > - image_size = load_elf(kernel_filename, NULL, NULL, &entry, &lowaddr, > - NULL, big_endian, EM_ARM, 1, 0); > + image_size = load_elf_as(kernel_filename, NULL, NULL, &entry, > &lowaddr, > + NULL, big_endian, EM_ARM, 1, 0, as); > if (image_size < 0) { > - image_size = load_image_targphys(kernel_filename, 0, mem_size); > + image_size = load_image_targphys_as(kernel_filename, 0, > + mem_size, as); > lowaddr = 0; > } > if (image_size < 0) { >