Patchwork ARM: enable XScale/iWMMXT in linux-user mode

login
register
mail settings
Submitter Peter Maydell
Date Nov. 19, 2010, 3:36 p.m.
Message ID <1290181007-12545-1-git-send-email-peter.maydell@linaro.org>
Download mbox | patch
Permalink /patch/72261/
State New
Headers show

Comments

Peter Maydell - Nov. 19, 2010, 3:36 p.m.
In linux-user mode, the XScale/iWMMXT coprocessors must be enabled
at reset so that we can run code that uses these instructions.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 target-arm/helper.c |    6 ++++++
 1 files changed, 6 insertions(+), 0 deletions(-)
Peter Maydell - Nov. 19, 2010, 3:39 p.m.
On 19 November 2010 15:36, Peter Maydell <peter.maydell@linaro.org> wrote:
> In linux-user mode, the XScale/iWMMXT coprocessors must be enabled
> at reset so that we can run code that uses these instructions.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

This patch fixes the same issue as this patch submitted by Lars Munch
back in May: http://patchwork.ozlabs.org/patch/51970/
but I preferred to put the enabling of the XScale coprocessors
in the same part of the code as the existing enabling of the
VFP for linux-user mode.

-- PMM

Patch

diff --git a/target-arm/helper.c b/target-arm/helper.c
index 996d40d..94aef39 100644
--- a/target-arm/helper.c
+++ b/target-arm/helper.c
@@ -203,7 +203,13 @@  void cpu_reset(CPUARMState *env)
         cpu_reset_model_id(env, id);
 #if defined (CONFIG_USER_ONLY)
     env->uncached_cpsr = ARM_CPU_MODE_USR;
+    /* For user mode we must enable access to coprocessors */
     env->vfp.xregs[ARM_VFP_FPEXC] = 1 << 30;
+    if (arm_feature(env, ARM_FEATURE_IWMMXT)) {
+        env->cp15.c15_cpar = 3;
+    } else if (arm_feature(env, ARM_FEATURE_XSCALE)) {
+        env->cp15.c15_cpar = 1;
+    }
 #else
     /* SVC mode with interrupts disabled.  */
     env->uncached_cpsr = ARM_CPU_MODE_SVC | CPSR_A | CPSR_F | CPSR_I;