moved ev5_trap fully into the fault class.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 1 Mar 2006 05:09:08 +0000 (00:09 -0500)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 1 Mar 2006 05:09:08 +0000 (00:09 -0500)
--HG--
extra : convert_revision : 182cdec9a4e05f55edff0c6a114844b9ad2ca8db

arch/alpha/ev5.cc
arch/alpha/faults.cc
arch/alpha/faults.hh
cpu/o3/alpha_cpu_impl.hh

index 2bb005eb4dc5ba4c80c646985b3172040cbf94d2..ac0e7e67eb8efcce3e1d272716ad06878ef14b5b 100644 (file)
@@ -163,38 +163,6 @@ AlphaISA::zeroRegisters(CPU *cpu)
     cpu->xc->setFloatRegDouble(ZeroReg, 0.0);
 }
 
-void
-ExecContext::ev5_temp_trap(Fault fault)
-{
-    DPRINTF(Fault, "Fault %s at PC: %#x\n", fault->name(), regs.pc);
-    cpu->recordEvent(csprintf("Fault %s", fault->name()));
-
-    assert(!misspeculating());
-    kernelStats->fault(fault);
-
-    if (fault->isA<ArithmeticFault>())
-        panic("Arithmetic traps are unimplemented!");
-
-    // exception restart address
-    if (!fault->isA<InterruptFault>() || !inPalMode())
-        setMiscReg(AlphaISA::IPR_EXC_ADDR, regs.pc);
-
-    if (fault->isA<PalFault>() || fault->isA<ArithmeticFault>() /* ||
-        fault == InterruptFault && !inPalMode() */) {
-        // traps...  skip faulting instruction.
-        setMiscReg(AlphaISA::IPR_EXC_ADDR,
-                   readMiscReg(AlphaISA::IPR_EXC_ADDR) + 4);
-    }
-
-    if (!inPalMode())
-        AlphaISA::swap_palshadow(&regs, true);
-
-    regs.pc = readMiscReg(AlphaISA::IPR_PAL_BASE) +
-        (dynamic_cast<AlphaFault *>(fault.get()))->vect();
-    regs.npc = regs.pc + sizeof(MachInst);
-}
-
-
 void
 AlphaISA::intr_post(RegFile *regs, Fault fault, Addr pc)
 {
index 78613761d127f2522640359c49565e9e150f5fd7..8c7dc31948661c8d7b46adaab57a04cf245ee449 100644 (file)
@@ -28,6 +28,9 @@
 
 #include "arch/alpha/faults.hh"
 #include "cpu/exec_context.hh"
+#include "cpu/base.hh"
+#include "base/trace.hh"
+#include "kern/kernel_stats.hh"
 
 namespace AlphaISA
 {
@@ -98,17 +101,30 @@ FaultStat IntegerOverflowFault::_stat;
 
 void AlphaFault::ev5_trap(ExecContext * xc)
 {
-    xc->ev5_temp_trap(this);
-}
+    DPRINTF(Fault, "Fault %s at PC: %#x\n", name(), xc->regs.pc);
+    xc->cpu->recordEvent(csprintf("Fault %s", name()));
 
-void AlphaMachineCheckFault::ev5_trap(ExecContext * xc)
-{
-    xc->ev5_temp_trap(this);
-}
+    assert(!xc->misspeculating());
+    xc->kernelStats->fault(this);
 
-void AlphaAlignmentFault::ev5_trap(ExecContext * xc)
-{
-    xc->ev5_temp_trap(this);
+    if (isA<ArithmeticFault>())
+        panic("Arithmetic traps are unimplemented!");
+
+    // exception restart address
+    if (!isA<InterruptFault>() || !xc->inPalMode())
+        xc->setMiscReg(AlphaISA::IPR_EXC_ADDR, xc->regs.pc);
+
+    if (isA<PalFault>() || isA<ArithmeticFault>()) {
+        // traps...  skip faulting instruction.
+        xc->setMiscReg(AlphaISA::IPR_EXC_ADDR,
+                   xc->readMiscReg(AlphaISA::IPR_EXC_ADDR) + 4);
+    }
+
+    if (!xc->inPalMode())
+        AlphaISA::swap_palshadow(&(xc->regs), true);
+
+    xc->regs.pc = xc->readMiscReg(AlphaISA::IPR_PAL_BASE) + vect();
+    xc->regs.npc = xc->regs.pc + sizeof(MachInst);
 }
 
 #endif
index 156faa8fbe706d3f78564e09dd12272a0ccb5e1e..829edd490d1cc0c4eba80ac25a3f1e459000ca30 100644 (file)
@@ -55,9 +55,6 @@ class AlphaMachineCheckFault :
     static FaultVect _vect;
     static FaultStat _stat;
   public:
-#if FULL_SYSTEM
-    void ev5_trap(ExecContext * xc);
-#endif
     FaultVect vect() {return _vect;}
     FaultStat & stat() {return _stat;}
 };
@@ -70,9 +67,6 @@ class AlphaAlignmentFault :
     static FaultVect _vect;
     static FaultStat _stat;
   public:
-#if FULL_SYSTEM
-    void ev5_trap(ExecContext * xc);
-#endif
     FaultVect vect() {return _vect;}
     FaultStat & stat() {return _stat;}
 };
index daa61bb1cda48d21776244f87103cfc0cc57792a..a1c659b51f783d413b8c116f4f8913bb328633b7 100644 (file)
@@ -302,7 +302,7 @@ template <class Impl>
 void
 AlphaFullCPU<Impl>::trap(Fault fault)
 {
-    // Keep in mind that a trap may be initiated by fetch if there's a TLB
+/*    // Keep in mind that a trap may be initiated by fetch if there's a TLB
     // miss
     uint64_t PC = this->commit.readCommitPC();
 
@@ -318,8 +318,9 @@ AlphaFullCPU<Impl>::trap(Fault fault)
     if (!fault->isA<InterruptFault>() || !inPalMode(PC))
         this->regFile.miscRegs.setReg(AlphaISA::IPR_EXC_ADDR, PC);
 
-    if (fault->isA<PalFault>() || fault->isA<ArithmeticFault>() /* ||
-        fault == InterruptFault && !PC_PAL(regs.pc) */) {
+    if (fault->isA<PalFault>() || fault->isA<ArithmeticFault>())
+    //    || fault == InterruptFault && !PC_PAL(regs.pc)
+        {
         // traps...  skip faulting instruction
         AlphaISA::MiscReg ipr_exc_addr =
             this->regFile.miscRegs.readReg(AlphaISA::IPR_EXC_ADDR);
@@ -332,7 +333,7 @@ AlphaFullCPU<Impl>::trap(Fault fault)
 
     this->regFile.setPC(this->regFile.miscRegs.readReg(AlphaISA::IPR_PAL_BASE) +
                          (dynamic_cast<AlphaFault *>(fault.get()))->vect());
-    this->regFile.setNextPC(PC + sizeof(MachInst));
+    this->regFile.setNextPC(PC + sizeof(MachInst));*/
 }
 
 template <class Impl>