changeset 2a131d15ec34 in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=2a131d15ec34
description:
        ARM: Implement the shadow registers using register flattening.

diffstat:

1 file changed, 41 insertions(+), 2 deletions(-)
src/arch/arm/isa.hh |   43 +++++++++++++++++++++++++++++++++++++++++--

diffs (74 lines):

diff -r 07546255fb03 -r 2a131d15ec34 src/arch/arm/isa.hh
--- a/src/arch/arm/isa.hh       Sun Nov 08 00:07:35 2009 -0800
+++ b/src/arch/arm/isa.hh       Sun Nov 08 00:07:49 2009 -0800
@@ -44,14 +44,44 @@
     {
       protected:
         MiscReg miscRegs[NumMiscRegs];
+        const IntRegIndex *intRegMap;
+
+        void
+        updateRegMap(CPSR cpsr)
+        {
+            switch (cpsr.mode) {
+              case MODE_USER:
+              case MODE_SYSTEM:
+                intRegMap = IntRegUsrMap;
+                break;
+              case MODE_FIQ:
+                intRegMap = IntRegFiqMap;
+                break;
+              case MODE_IRQ:
+                intRegMap = IntRegIrqMap;
+                break;
+              case MODE_SVC:
+                intRegMap = IntRegSvcMap;
+                break;
+              case MODE_ABORT:
+                intRegMap = IntRegAbtMap;
+                break;
+              case MODE_UNDEFINED:
+                intRegMap = IntRegUndMap;
+                break;
+              default:
+                panic("Unrecognized mode setting in CPSR.\n");
+            }
+        }
 
       public:
         void clear()
         {
             memset(miscRegs, 0, sizeof(miscRegs));
             CPSR cpsr = 0;
-            cpsr.mode = MODE_USER;
+            cpsr.mode = MODE_SYSTEM;
             miscRegs[MISCREG_CPSR] = cpsr;
+            updateRegMap(cpsr);
             //XXX We need to initialize the rest of the state.
         }
 
@@ -79,6 +109,9 @@
         void
         setMiscReg(int misc_reg, const MiscReg &val, ThreadContext *tc)
         {
+            if (misc_reg == MISCREG_CPSR) {
+                updateRegMap(val);
+            }
             assert(misc_reg < NumMiscRegs);
             miscRegs[misc_reg] = val;
         }
@@ -86,7 +119,13 @@
         int
         flattenIntIndex(int reg)
         {
-            return reg;
+            assert(reg >= 0);
+            if (reg < NUM_ARCH_INTREGS) {
+                return intRegMap[reg];
+            } else {
+                assert(reg < NUM_INTREGS);
+                return reg;
+            }
         }
 
         int
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to