qemu-arm
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-arm] [PATCH 3/3] hw/arm/armv7m: Honour CPU's address space for


From: Philippe Mathieu-Daudé
Subject: Re: [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) {
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]