summaryrefslogtreecommitdiff
path: root/arch/alpha/faults.cc
diff options
context:
space:
mode:
Diffstat (limited to 'arch/alpha/faults.cc')
-rw-r--r--arch/alpha/faults.cc24
1 files changed, 19 insertions, 5 deletions
diff --git a/arch/alpha/faults.cc b/arch/alpha/faults.cc
index bde7b3db1..7cdcc9bab 100644
--- a/arch/alpha/faults.cc
+++ b/arch/alpha/faults.cc
@@ -107,14 +107,11 @@ void AlphaFault::invoke(ExecContext * xc)
assert(!xc->misspeculating());
xc->kernelStats->fault(this);
- if (isA<ArithmeticFault>())
- panic("Arithmetic traps are unimplemented!");
-
// exception restart address
- if (!isA<InterruptFault>() || !xc->inPalMode())
+ if (setRestartAddress() || !xc->inPalMode())
xc->setMiscReg(AlphaISA::IPR_EXC_ADDR, xc->regs.pc);
- if (isA<PalFault>() || isA<ArithmeticFault>()) {
+ if (skipFaultingInstruction()) {
// traps... skip faulting instruction.
xc->setMiscReg(AlphaISA::IPR_EXC_ADDR,
xc->readMiscReg(AlphaISA::IPR_EXC_ADDR) + 4);
@@ -127,6 +124,23 @@ void AlphaFault::invoke(ExecContext * xc)
xc->regs.npc = xc->regs.pc + sizeof(MachInst);
}
+void ArithmeticFault::invoke(ExecContext * xc)
+{
+ DPRINTF(Fault, "Fault %s at PC: %#x\n", name(), xc->regs.pc);
+ xc->cpu->recordEvent(csprintf("Fault %s", name()));
+
+ assert(!xc->misspeculating());
+ xc->kernelStats->fault(this);
+
+ panic("Arithmetic traps are unimplemented!");
+}
+
+
+/*void ArithmeticFault::invoke(ExecContext * xc)
+{
+ panic("Arithmetic traps are unimplemented!");
+}*/
+
#endif
} // namespace AlphaISA