summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGabe Black <gblack@eecs.umich.edu>2011-09-27 00:16:33 -0700
committerGabe Black <gblack@eecs.umich.edu>2011-09-27 00:16:33 -0700
commitea79850f903a6015833b339a53dbdb71adecd036 (patch)
treee8d82d3be1d855e450c0cacc77c6407d009f24c6
parent997cbe1c09f6ffff6bee11bb374e3a32601d0f06 (diff)
downloadgem5-ea79850f903a6015833b339a53dbdb71adecd036.tar.xz
Faults: Make the generic faults more consistent between SE and FS.
All of the classes will now be available in both modes, and only GenericPageTableFault will continue to check the mode for conditional compilation. It uses a process object to handle the fault in SE mode, and for now those aren't available in FS mode.
-rw-r--r--src/sim/faults.cc24
-rw-r--r--src/sim/faults.hh3
2 files changed, 11 insertions, 16 deletions
diff --git a/src/sim/faults.cc b/src/sim/faults.cc
index bd05df834..6403953db 100644
--- a/src/sim/faults.cc
+++ b/src/sim/faults.cc
@@ -38,18 +38,15 @@
#include "sim/faults.hh"
#include "sim/process.hh"
-#if !FULL_SYSTEM
void FaultBase::invoke(ThreadContext * tc, StaticInstPtr inst)
{
- panic("fault (%s) detected @ PC %s", name(), tc->pcState());
+ 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, StaticInstPtr inst)
-{
- DPRINTF(Fault, "Fault %s at PC: %s\n", name(), tc->pcState());
- assert(!tc->misspeculating());
-}
-#endif
void UnimpFault::invoke(ThreadContext * tc, StaticInstPtr inst)
{
@@ -61,13 +58,15 @@ void ReExec::invoke(ThreadContext *tc, StaticInstPtr inst)
tc->pcState(tc->pcState());
}
-
-#if !FULL_SYSTEM
void GenericPageTableFault::invoke(ThreadContext *tc, StaticInstPtr inst)
{
+ bool handled = false;
+#if !FULL_SYSTEM
Process *p = tc->getProcessPtr();
- if (!p->fixupStackFault(vaddr))
+ handled = p->fixupStackFault(vaddr);
+#endif
+ if (!handled)
panic("Page table fault when accessing virtual address %#x\n", vaddr);
}
@@ -76,4 +75,3 @@ void GenericAlignmentFault::invoke(ThreadContext *tc, StaticInstPtr inst)
{
panic("Alignment fault when accessing virtual address %#x\n", vaddr);
}
-#endif
diff --git a/src/sim/faults.hh b/src/sim/faults.hh
index 2d91b8d46..0b2d3be10 100644
--- a/src/sim/faults.hh
+++ b/src/sim/faults.hh
@@ -82,8 +82,6 @@ class ReExec : public FaultBase
StaticInstPtr inst = StaticInst::nullStaticInstPtr);
};
-
-#if !FULL_SYSTEM
class GenericPageTableFault : public FaultBase
{
private:
@@ -105,6 +103,5 @@ class GenericAlignmentFault : public FaultBase
void invoke(ThreadContext * tc,
StaticInstPtr inst = StaticInst::nullStaticInstPtr);
};
-#endif
#endif // __FAULTS_HH__