fix shadow set bugs in MIPS code that caused out of bounds access...
authorKorey Sewell <ksewell@umich.edu>
Mon, 6 Oct 2008 06:07:04 +0000 (02:07 -0400)
committerKorey Sewell <ksewell@umich.edu>
Mon, 6 Oct 2008 06:07:04 +0000 (02:07 -0400)
panic rdpgpr/wrpgpr instructions until a better impl.
of MIPS shadow sets is available.

src/arch/mips/isa/decoder.isa
src/arch/mips/isa_traits.hh
src/arch/mips/regfile/int_regfile.cc
src/arch/mips/regfile/int_regfile.hh
src/arch/mips/regfile/misc_regfile.cc

index 0a12c4f6e8b7bd23d840192400119abbc9c2f166..8af504e55f1841d9eab37c6731009a5a6e51e3d4 100644 (file)
@@ -603,7 +603,8 @@ decode OPCODE_HI default Unknown::unknown() {
                     0xA: rdpgpr({{
                       if(Config_AR >= 1)
                         { // Rev 2 of the architecture
-                          Rd = xc->tcBase()->readIntReg(RT + NumIntRegs * SRSCtl_PSS);
+                          panic("Shadow Sets Not Fully Implemented.\n");
+                          //Rd = xc->tcBase()->readIntReg(RT + NumIntRegs * SRSCtl_PSS);
                         }
                       else
                         {
@@ -613,7 +614,8 @@ decode OPCODE_HI default Unknown::unknown() {
                     0xE: wrpgpr({{
                       if(Config_AR >= 1)
                         { // Rev 2 of the architecture
-                          xc->tcBase()->setIntReg(RD + NumIntRegs * SRSCtl_PSS,Rt);
+                          panic("Shadow Sets Not Fully Implemented.\n");
+                          //xc->tcBase()->setIntReg(RD + NumIntRegs * SRSCtl_PSS,Rt);
                           //                     warn("Writing %d to %d, PSS: %d, SRS: %x\n",Rt,RD + NumIntRegs * SRSCtl_PSS, SRSCtl_PSS,SRSCtl);
                         }
                       else
index d4d1de479dd80babf151c0356097b850ad5f824b..3450c273e03afd54fd7d00a372a032684665e1c3 100644 (file)
@@ -181,6 +181,8 @@ namespace MipsISA
     const int NumIntRegs = NumIntArchRegs*NumShadowRegSets + NumIntSpecialRegs;        //HI & LO Regs
     const int NumFloatRegs = NumFloatArchRegs + NumFloatSpecialRegs;//
 
+    const int TotalArchRegs = NumIntArchRegs * NumShadowRegSets;
+
     // Static instruction parameters
     const int MaxInstSrcRegs = 10;
     const int MaxInstDestRegs = 8;
index 4ffbcdfb87f3953da45491b5020eede5aaf45b85..88de4be94c3feb6274e484cd3ecefe8d3ca84492 100644 (file)
@@ -44,6 +44,12 @@ IntRegFile::clear()
     currShadowSet=0;
 }
 
+int
+IntRegFile::readShadowSet()
+{
+  return currShadowSet;
+}
+
 void
 IntRegFile::setShadowSet(int css)
 {
@@ -54,21 +60,17 @@ IntRegFile::setShadowSet(int css)
 IntReg
 IntRegFile::readReg(int intReg)
 {
-    if (intReg < NumIntRegs) {
+    if (intReg < NumIntArchRegs) {
         // Regular GPR Read
         DPRINTF(MipsPRA, "Reading Reg: %d, CurrShadowSet: %d\n", intReg,
-                currShadowSet);
+              currShadowSet);
 
-        if (intReg >= NumIntArchRegs * NumShadowRegSets) {
-            return regs[intReg + NumIntRegs * currShadowSet];
-        } else {
-            int index = intReg + NumIntArchRegs * currShadowSet;
-            index = index % NumIntArchRegs;
-            return regs[index];
-        }
+        return regs[intReg + NumIntArchRegs * currShadowSet];
     } else {
-        // Read from shadow GPR .. probably called by RDPGPR
-        return regs[intReg];
+        unsigned special_reg_num = intReg - NumIntArchRegs;
+
+        // Read A Special Reg
+        return regs[TotalArchRegs + special_reg_num];
     }
 }
 
@@ -76,13 +78,12 @@ Fault
 IntRegFile::setReg(int intReg, const IntReg &val)
 {
     if (intReg != ZeroReg) {
-        if (intReg < NumIntRegs) {
-            if (intReg >= NumIntArchRegs * NumShadowRegSets)
-                regs[intReg] = val;
-            else
-                regs[intReg + NumIntRegs * currShadowSet] = val;
+        if (intReg < NumIntArchRegs) {
+          regs[intReg + NumIntArchRegs * currShadowSet] = val;
         } else {
-            regs[intReg] = val;
+          unsigned special_reg_num = intReg - NumIntArchRegs;
+
+          regs[TotalArchRegs + special_reg_num] = val;
         }
     }
 
index 8ddd276e604d38b7a4ff7975b7f4d34bc0eab7ef..0f453a38269919a58129844718b4f0823dcc0e5b 100644 (file)
@@ -48,7 +48,7 @@ namespace MipsISA
     }
 
     enum MiscIntRegNums {
-       LO = NumIntArchRegs*NumShadowRegSets,
+       LO = NumIntArchRegs,
        HI,
        DSPACX0,
        DSPLo1,
@@ -72,6 +72,7 @@ namespace MipsISA
         int currShadowSet;
       public:
         void clear();
+        int readShadowSet();
         void setShadowSet(int css);
         IntReg readReg(int intReg);
         Fault setReg(int intReg, const IntReg &val);
index e81f940f5522a474fd59baceb0618f612296c555..06523a8c9e64306693a1a04ee26d45c2301e469e 100755 (executable)
@@ -40,7 +40,7 @@
 #include "cpu/base.hh"
 #include "cpu/exetrace.hh"
 
-#include "params/DerivO3CPU.hh"
+//#include "params/DerivO3CPU.hh"
 
 using namespace std;