Automated merge with ssh://repo.gem5.org/gem5
[gem5.git] / src / sim / faults.cc
index fe62874d7fc8a85d0db7bf0b0ad3874ce60836c5..6403953dbc48d36d2e36ea46cace256d3a28c24c 100644 (file)
 
 #include "arch/isa_traits.hh"
 #include "base/misc.hh"
-#include "cpu/thread_context.hh"
 #include "cpu/base.hh"
+#include "cpu/thread_context.hh"
+#include "debug/Fault.hh"
+#include "mem/page_table.hh"
 #include "sim/faults.hh"
 #include "sim/process.hh"
-#include "mem/page_table.hh"
 
-#if !FULL_SYSTEM
-void FaultBase::invoke(ThreadContext * tc)
+void FaultBase::invoke(ThreadContext * tc, StaticInstPtr inst)
 {
-    fatal("fault (%s) detected @ PC %p", name(), tc->readPC());
+    if (FULL_SYSTEM) {
+        DPRINTF(Fault, "Fault %s at PC: %s\n", name(), tc->pcState());
+        assert(!tc->misspeculating());
+    } else {
+        panic("fault (%s) detected @ PC %s", name(), tc->pcState());
+    }
 }
-#else
-void FaultBase::invoke(ThreadContext * tc)
-{
-    DPRINTF(Fault, "Fault %s at PC: %#x\n", name(), tc->readPC());
-    tc->getCpuPtr()->recordEvent(csprintf("Fault %s", name()));
 
-    assert(!tc->misspeculating());
+void UnimpFault::invoke(ThreadContext * tc, StaticInstPtr inst)
+{
+    panic("Unimpfault: %s\n", panicStr.c_str());
 }
-#endif
 
-void UnimpFault::invoke(ThreadContext * tc)
+void ReExec::invoke(ThreadContext *tc, StaticInstPtr inst)
 {
-    panic("Unimpfault: %s\n", panicStr.c_str());
+    tc->pcState(tc->pcState());
 }
-#if !FULL_SYSTEM
-void PageTableFault::invoke(ThreadContext *tc)
+
+void GenericPageTableFault::invoke(ThreadContext *tc, StaticInstPtr inst)
 {
+    bool handled = false;
+#if !FULL_SYSTEM
     Process *p = tc->getProcessPtr();
 
-    if (!p->checkAndAllocNextPage(vaddr))
+    handled = p->fixupStackFault(vaddr);
+#endif
+    if (!handled)
         panic("Page table fault when accessing virtual address %#x\n", vaddr);
 
 }
-#endif
+
+void GenericAlignmentFault::invoke(ThreadContext *tc, StaticInstPtr inst)
+{
+    panic("Alignment fault when accessing virtual address %#x\n", vaddr);
+}