arch-arm: Read APSR in User Mode
authorGiacomo Travaglini <giacomo.travaglini@arm.com>
Mon, 30 Apr 2018 16:13:54 +0000 (17:13 +0100)
committerGiacomo Travaglini <giacomo.travaglini@arm.com>
Thu, 14 Jun 2018 13:45:07 +0000 (13:45 +0000)
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 <giacomo.travaglini@arm.com>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Reviewed-on: https://gem5-review.googlesource.com/10602
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>

src/arch/arm/isa/insts/misc.isa
src/arch/arm/miscregs.hh

index f1c6acff38f2c01c54d76284d9d5346689543397..ef579bf5a82976897faa9c10f56cda4a2e01eb86 100644 (file)
@@ -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",
index b00e5ff6688eaf89575eac1821551605056056a8..f9386b41263c6a62270e94b218046f747739cf4f 100644 (file)
@@ -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;