diff mbox series

[3/3] hw/arm/armv7m: Honour CPU's address space for image loads

Message ID 20180215175707.15491-4-peter.maydell@linaro.org
State Superseded
Headers show
Series Arm: honour CPU address space for image loads | expand

Commit Message

Peter Maydell Feb. 15, 2018, 5:57 p.m. UTC
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.maydell@linaro.org>

---
 hw/arm/armv7m.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

-- 
2.16.1

Comments

Philippe Mathieu-Daudé Feb. 15, 2018, 6:07 p.m. UTC | #1
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.maydell@linaro.org>


Reviewed-by: Philippe Mathieu-Daudé <f4bug@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) {

>
diff mbox series

Patch

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) {