diff options
Diffstat (limited to 'src/arch/arm/table_walker.cc')
-rw-r--r-- | src/arch/arm/table_walker.cc | 12 |
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"); } |