CPU: Create a microcode ROM object in the CPU which is defined by the ISA.
[gem5.git] / src / arch / sparc / intregfile.cc
index 0cc0a886a1514425172b3ca046526cdbc670d96a..39a613a0d407481199b94a047fb72f21f0620d19 100644 (file)
 
 #include "arch/sparc/intregfile.hh"
 #include "base/trace.hh"
+#include "base/misc.hh"
 #include "sim/serialize.hh"
 
+#include <string.h>
+
 using namespace SparcISA;
 using namespace std;
 
@@ -40,7 +43,7 @@ class Checkpoint;
 
 string SparcISA::getIntRegName(RegIndex index)
 {
-    static std::string intRegName[NumIntRegs] =
+    static std::string intRegName[NumIntArchRegs] =
         {"g0", "g1", "g2", "g3", "g4", "g5", "g6", "g7",
          "o0", "o1", "o2", "o3", "o4", "o5", "o6", "o7",
          "l0", "l1", "l2", "l3", "l4", "l5", "l6", "l7",
@@ -60,9 +63,10 @@ void IntRegFile::clear()
 {
     int x;
     for (x = 0; x < MaxGL; x++)
-        memset(regGlobals[x], 0, sizeof(regGlobals[x]));
+        memset(regGlobals[x], 0, sizeof(IntReg) * RegsPerFrame);
     for(int x = 0; x < 2 * NWindows; x++)
-        bzero(regSegments[x], sizeof(regSegments[x]));
+        memset(regSegments[x], 0, sizeof(IntReg) * RegsPerFrame);
+    memset(regs, 0, sizeof(IntReg) * NumIntRegs);
 }
 
 IntRegFile::IntRegFile()
@@ -75,18 +79,44 @@ IntRegFile::IntRegFile()
 
 IntReg IntRegFile::readReg(int intReg)
 {
-    IntReg val =
-        regView[intReg >> FrameOffsetBits][intReg & FrameOffsetMask];
+    DPRINTF(Sparc, "Read register %d = 0x%x\n", intReg, regs[intReg]);
+    return regs[intReg];
+    /* XXX Currently not used. When used again regView/offset need to be
+     * serialized!
+    IntReg val;
+    if(intReg < NumIntArchRegs)
+        val = regView[intReg >> FrameOffsetBits][intReg & FrameOffsetMask];
+    else if((intReg -= NumIntArchRegs) < NumMicroIntRegs)
+        val = microRegs[intReg];
+    else
+        panic("Tried to read non-existant integer register %d, %d\n",
+                NumIntArchRegs + NumMicroIntRegs + intReg, intReg);
+
     DPRINTF(Sparc, "Read register %d = 0x%x\n", intReg, val);
     return val;
+    */
 }
 
-Fault IntRegFile::setReg(int intReg, const IntReg &val)
+void IntRegFile::setReg(int intReg, const IntReg &val)
 {
     if(intReg)
+    {
+        DPRINTF(Sparc, "Wrote register %d = 0x%x\n", intReg, val);
+        regs[intReg] = val;
+    }
+    return;
+    /* XXX Currently not used. When used again regView/offset need to be
+     * serialized!
+    if(intReg)
+    {
         DPRINTF(Sparc, "Wrote register %d = 0x%x\n", intReg, val);
-    regView[intReg >> FrameOffsetBits][intReg & FrameOffsetMask] = val;
-    return NoFault;
+        if(intReg < NumIntArchRegs)
+            regView[intReg >> FrameOffsetBits][intReg & FrameOffsetMask] = val;
+        else if((intReg -= NumIntArchRegs) < NumMicroIntRegs)
+            microRegs[intReg] = val;
+        else
+            panic("Tried to set non-existant integer register\n");
+    } */
 }
 
 //This doesn't effect the actual CWP register.
@@ -95,6 +125,8 @@ Fault IntRegFile::setReg(int intReg, const IntReg &val)
 void IntRegFile::setCWP(int cwp)
 {
     int index = ((NWindows - cwp) % NWindows) * 2;
+    if (index < 0)
+        panic("Index less than 0. cwp=%d nwin=%d\n", cwp, NWindows);
     offset[Outputs] = FrameOffset + (index * RegsPerFrame);
     offset[Locals] = FrameOffset + ((index+1) * RegsPerFrame);
     offset[Inputs] = FrameOffset +
@@ -108,14 +140,23 @@ void IntRegFile::setCWP(int cwp)
 
 void IntRegFile::setGlobals(int gl)
 {
-    DPRINTF(Sparc, "Now using %d globals", gl);
+    DPRINTF(Sparc, "Now using %d globals\n", gl);
 
     regView[Globals] = regGlobals[gl];
     offset[Globals] = RegGlobalOffset + gl * RegsPerFrame;
+
+    if (regView[Globals] == regView[Inputs] ||
+        regView[Globals] == regView[Locals] ||
+        regView[Globals] == regView[Outputs] )
+        panic("Two register arrays set to the same thing!\n");
 }
 
 void IntRegFile::serialize(std::ostream &os)
 {
+    SERIALIZE_ARRAY(regs, NumIntRegs);
+    SERIALIZE_ARRAY(microRegs, NumMicroIntRegs);
+
+    /* the below doesn't seem needed unless gabe makes regview work*/
     unsigned int x;
     for(x = 0; x < MaxGL; x++)
         SERIALIZE_ARRAY(regGlobals[x], RegsPerFrame);
@@ -125,6 +166,10 @@ void IntRegFile::serialize(std::ostream &os)
 
 void IntRegFile::unserialize(Checkpoint *cp, const std::string &section)
 {
+    UNSERIALIZE_ARRAY(regs, NumIntRegs);
+    UNSERIALIZE_ARRAY(microRegs, NumMicroIntRegs);
+
+    /* the below doesn't seem needed unless gabe makes regview work*/
     unsigned int x;
     for(x = 0; x < MaxGL; x++)
         UNSERIALIZE_ARRAY(regGlobals[x], RegsPerFrame);