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.
This commit is contained in:
parent
997cbe1c09
commit
ea79850f90
2 changed files with 11 additions and 16 deletions
|
@ -38,18 +38,15 @@
|
||||||
#include "sim/faults.hh"
|
#include "sim/faults.hh"
|
||||||
#include "sim/process.hh"
|
#include "sim/process.hh"
|
||||||
|
|
||||||
#if !FULL_SYSTEM
|
|
||||||
void FaultBase::invoke(ThreadContext * tc, StaticInstPtr inst)
|
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)
|
void UnimpFault::invoke(ThreadContext * tc, StaticInstPtr inst)
|
||||||
{
|
{
|
||||||
|
@ -61,13 +58,15 @@ void ReExec::invoke(ThreadContext *tc, StaticInstPtr inst)
|
||||||
tc->pcState(tc->pcState());
|
tc->pcState(tc->pcState());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if !FULL_SYSTEM
|
|
||||||
void GenericPageTableFault::invoke(ThreadContext *tc, StaticInstPtr inst)
|
void GenericPageTableFault::invoke(ThreadContext *tc, StaticInstPtr inst)
|
||||||
{
|
{
|
||||||
|
bool handled = false;
|
||||||
|
#if !FULL_SYSTEM
|
||||||
Process *p = tc->getProcessPtr();
|
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);
|
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);
|
panic("Alignment fault when accessing virtual address %#x\n", vaddr);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
|
@ -82,8 +82,6 @@ class ReExec : public FaultBase
|
||||||
StaticInstPtr inst = StaticInst::nullStaticInstPtr);
|
StaticInstPtr inst = StaticInst::nullStaticInstPtr);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#if !FULL_SYSTEM
|
|
||||||
class GenericPageTableFault : public FaultBase
|
class GenericPageTableFault : public FaultBase
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
@ -105,6 +103,5 @@ class GenericAlignmentFault : public FaultBase
|
||||||
void invoke(ThreadContext * tc,
|
void invoke(ThreadContext * tc,
|
||||||
StaticInstPtr inst = StaticInst::nullStaticInstPtr);
|
StaticInstPtr inst = StaticInst::nullStaticInstPtr);
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif // __FAULTS_HH__
|
#endif // __FAULTS_HH__
|
||||||
|
|
Loading…
Reference in a new issue