summaryrefslogtreecommitdiff
path: root/src/arch/arm/table_walker.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/arm/table_walker.cc')
-rw-r--r--src/arch/arm/table_walker.cc12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/arch/arm/table_walker.cc b/src/arch/arm/table_walker.cc
index e2207e26b..2d0e323f6 100644
--- a/src/arch/arm/table_walker.cc
+++ b/src/arch/arm/table_walker.cc
@@ -114,8 +114,16 @@ TableWalker::walk(RequestPtr _req, ThreadContext *_tc, uint8_t _cid, TLB::Mode _
currState = new WalkerState();
currState->tableWalker = this;
- }
- else if (_timing) {
+ } else if (_timing) {
+ // This is a translation that was completed and then faulted again
+ // because some underlying parameters that affect the translation
+ // changed out from under us (e.g. asid). It will either be a
+ // misprediction, in which case nothing will happen or we'll use
+ // this fault to re-execute the faulting instruction which should clean
+ // up everything.
+ if (currState->vaddr == _req->getVaddr()) {
+ return new ReExec;
+ }
panic("currState should always be empty in timing mode!\n");
}