diff options
author | Gabe Black <gblack@eecs.umich.edu> | 2011-09-27 00:16:33 -0700 |
---|---|---|
committer | Gabe Black <gblack@eecs.umich.edu> | 2011-09-27 00:16:33 -0700 |
commit | ea79850f903a6015833b339a53dbdb71adecd036 (patch) | |
tree | e8d82d3be1d855e450c0cacc77c6407d009f24c6 | |
parent | 997cbe1c09f6ffff6bee11bb374e3a32601d0f06 (diff) | |
download | gem5-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.cc | 24 | ||||
-rw-r--r-- | src/sim/faults.hh | 3 |
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__ |