[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [Qemu-arm] [PATCH 3/3] hw/arm/armv7m: Honour CPU's addr
From: |
Philippe Mathieu-Daudé |
Subject: |
Re: [Qemu-devel] [Qemu-arm] [PATCH 3/3] hw/arm/armv7m: Honour CPU's address space for image loads |
Date: |
Thu, 15 Feb 2018 15:07:20 -0300 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 |
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 <address@hidden>
Reviewed-by: Philippe Mathieu-Daudé <address@hidden>
> ---
> 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) {
>