Predecoder: Clear out predecoder state on an ITLB fault.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 3 Oct 2007 05:21:38 +0000 (22:21 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 3 Oct 2007 05:21:38 +0000 (22:21 -0700)
--HG--
extra : convert_revision : 68f8ff778dbd28ade5070edf5a7d662e7bf0045a

src/arch/alpha/predecoder.hh
src/arch/mips/predecoder.hh
src/arch/sparc/predecoder.hh
src/arch/x86/predecoder.cc
src/arch/x86/predecoder.hh
src/cpu/simple/base.cc

index 4887de8568bbc3501ee5aa47a286994f7025dfda..7a6bb3c026158e8c0cd92766a22734f28af1c825 100644 (file)
@@ -65,6 +65,9 @@ namespace AlphaISA
         {
         }
 
+        void reset()
+        {}
+
         //Use this to give data to the predecoder. This should be used
         //when there is control flow.
         void moreBytes(Addr pc, Addr fetchPC, MachInst inst)
index e310dded4b62c58e1751f3699cce0e435bfd630b..17da15f3f965aee0f380d38453f8a5f896903ee9 100644 (file)
@@ -64,6 +64,9 @@ namespace MipsISA
         {
         }
 
+        void reset()
+        {}
+
         //Use this to give data to the predecoder. This should be used
         //when there is control flow.
         void moreBytes(Addr pc, Addr fetchPC, MachInst inst)
index d990c32560c32042a07fca23e523468cd657784c..13ce5c1b6b5bc46842e30c210c0410e8c6f6b8b5 100644 (file)
@@ -65,6 +65,9 @@ namespace SparcISA
         {
         }
 
+        void reset()
+        {}
+
         //Use this to give data to the predecoder. This should be used
         //when there is control flow.
         void moreBytes(Addr pc, Addr fetchPC, MachInst inst)
index 7f8bc7abc9da28bde9d38a4f6da7ef762722a6f6..62899e65a8eb4a240de7bc2c76b7653ceb3913fa 100644 (file)
@@ -62,7 +62,7 @@
 
 namespace X86ISA
 {
-    void Predecoder::reset()
+    void Predecoder::doReset()
     {
         origPC = basePC + offset;
         DPRINTF(Predecoder, "Setting origPC to %#x\n", origPC);
@@ -96,7 +96,7 @@ namespace X86ISA
             switch(state)
             {
               case ResetState:
-                reset();
+                doReset();
                 state = PrefixState;
               case PrefixState:
                 state = doPrefixState(nextByte);
index 450ebd79bccabb0927fec7218b989deea6cfb076..6e41e8134fa4e0b703dcc44a6477fce30c1ada46 100644 (file)
@@ -134,7 +134,7 @@ namespace X86ISA
                 outOfBytes = true;
         }
 
-        void reset();
+        void doReset();
 
         //State machine state
       protected:
@@ -182,6 +182,11 @@ namespace X86ISA
             emi.mode.submode = SixtyFourBitMode;
         }
 
+        void reset()
+        {
+            state = ResetState;
+        }
+
         ThreadContext * getTC()
         {
             return tc;
index 9fc1d1dd9320288761b7b28a0c0573b76267f17c..f3b34880e3c355f8914e855ca8ced8c88a879efa 100644 (file)
@@ -463,6 +463,7 @@ BaseSimpleCPU::advancePC(Fault fault)
     fetchOffset = 0;
     if (fault != NoFault) {
         curMacroStaticInst = StaticInst::nullStaticInstPtr;
+        predecoder.reset();
         fault->invoke(tc);
         thread->setMicroPC(0);
         thread->setNextMicroPC(1);