From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:37366) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UBTed-0008UW-AI for qemu-devel@nongnu.org; Fri, 01 Mar 2013 12:21:56 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UBTea-0001VK-OH for qemu-devel@nongnu.org; Fri, 01 Mar 2013 12:21:55 -0500 Received: from mel.act-europe.fr ([194.98.77.210]:57028) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UBTea-0001Ud-Et for qemu-devel@nongnu.org; Fri, 01 Mar 2013 12:21:52 -0500 From: Fabien Chouteau Date: Fri, 1 Mar 2013 18:21:47 +0100 Message-Id: <1362158507-19310-5-git-send-email-chouteau@adacore.com> In-Reply-To: <1362158507-19310-1-git-send-email-chouteau@adacore.com> References: <1362158507-19310-1-git-send-email-chouteau@adacore.com> Subject: [Qemu-devel] [PATCH 4/4] target-arm: always set endian bits in big-endian mode List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: peter.maydell@linaro.org, paul@codesourcery.com, afaerber@suse.de CPSR.E, SCTLR.EE and SCTLR.IE Signed-off-by: Fabien Chouteau --- target-arm/cpu.c | 11 +++++++++++ target-arm/helper.c | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/target-arm/cpu.c b/target-arm/cpu.c index 5dfcb74..354843e 100644 --- a/target-arm/cpu.c +++ b/target-arm/cpu.c @@ -112,6 +112,17 @@ static void arm_cpu_reset(CPUState *s) } env->vfp.xregs[ARM_VFP_FPEXC] = 0; #endif + +#ifdef TARGET_WORDS_BIGENDIAN + if (arm_feature(env, ARM_FEATURE_V6) || arm_feature(env, ARM_FEATURE_V7)) { + /* Set IE and EE bits for big-endian */ + env->cp15.c1_sys |= (1 << 31) | (1 << 25); + + /* Set E bit for big-endian */ + env->uncached_cpsr |= CPSR_E; + } +#endif + set_flush_to_zero(1, &env->vfp.standard_fp_status); set_flush_inputs_to_zero(1, &env->vfp.standard_fp_status); set_default_nan_mode(1, &env->vfp.standard_fp_status); diff --git a/target-arm/helper.c b/target-arm/helper.c index 75ee0dc..e539186 100644 --- a/target-arm/helper.c +++ b/target-arm/helper.c @@ -1017,6 +1017,15 @@ static const ARMCPRegInfo lpae_cp_reginfo[] = { static int sctlr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value) { env->cp15.c1_sys = value; + +#ifdef TARGET_WORDS_BIGENDIAN + if (arm_feature(env, ARM_FEATURE_V6) + || arm_feature(env, ARM_FEATURE_V7)) { + /* IE and EE bits stay set for big-endian */ + env->cp15.c1_sys |= (1 << 31) | (1 << 25); + } +#endif + /* ??? Lots of these bits are not implemented. */ /* This may enable/disable the MMU, so do a TLB flush. */ tlb_flush(env, 1); @@ -1509,6 +1518,15 @@ void cpsr_write(CPUARMState *env, uint32_t val, uint32_t mask) } mask &= ~CACHED_CPSR_BITS; env->uncached_cpsr = (env->uncached_cpsr & ~mask) | (val & mask); + +#ifdef TARGET_WORDS_BIGENDIAN + if (arm_feature(env, ARM_FEATURE_V6) + || arm_feature(env, ARM_FEATURE_V7)) { + /* E bit stays set for big-endian */ + env->uncached_cpsr |= CPSR_E; + } +#endif + } /* Sign/zero extend */ -- 1.7.9.5