From 831184d2949fbd790a2040738079ca03c8cfdefe Mon Sep 17 00:00:00 2001 From: Giacomo Travaglini Date: Mon, 30 Apr 2018 17:13:54 +0100 Subject: arch-arm: Read APSR in User Mode This patch substitutes reads to the CPSR in user mode (MRS CPSR) to reads to APSR (Application Program Status Register). This is the user level alias for the CPSR. The APSR is a subset of the CPSR. Change-Id: I18a70693aef6fd305a4c4cb3c6f81f331bc60a2d Signed-off-by: Giacomo Travaglini Reviewed-by: Andreas Sandberg Reviewed-on: https://gem5-review.googlesource.com/10602 Maintainer: Andreas Sandberg --- src/arch/arm/isa/insts/misc.isa | 2 +- src/arch/arm/miscregs.hh | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/arch/arm/isa/insts/misc.isa b/src/arch/arm/isa/insts/misc.isa index f1c6acff3..ef579bf5a 100644 --- a/src/arch/arm/isa/insts/misc.isa +++ b/src/arch/arm/isa/insts/misc.isa @@ -226,7 +226,7 @@ let {{ cpsr.c = CondCodesC; cpsr.v = CondCodesV; cpsr.ge = CondCodesGE; - Dest = cpsr & 0xF8FF03DF + Dest = cpsr & (cpsr.mode == MODE_USER ? ApsrMask : CpsrMask); ''' mrsCpsrIop = InstObjParams("mrs", "MrsCpsr", "MrsOp", diff --git a/src/arch/arm/miscregs.hh b/src/arch/arm/miscregs.hh index b00e5ff66..f9386b412 100644 --- a/src/arch/arm/miscregs.hh +++ b/src/arch/arm/miscregs.hh @@ -1423,6 +1423,17 @@ namespace ArmISA static const uint32_t CondCodesMask = 0xF00F0000; static const uint32_t CpsrMaskQ = 0x08000000; + // APSR (Application Program Status Register Mask). It is the user level + // alias for the CPSR. The APSR is a subset of the CPSR. Although + // bits[15:0] are UNKNOWN on reads, it is permitted that, on a read of + // APSR: + // Bit[9] returns the value of CPSR.E. + // Bits[8:6] return the value of CPSR.{A,I, F}, the mask bits. + static const uint32_t ApsrMask = CpsrMaskQ | CondCodesMask | 0x000001D0; + + // CPSR (Current Program Status Register Mask). + static const uint32_t CpsrMask = ApsrMask | 0x00F003DF; + BitUnion32(HDCR) Bitfield<11> tdra; Bitfield<10> tdosa; -- cgit v1.2.3