summaryrefslogtreecommitdiff
path: root/src/arch/arm/table_walker.cc
diff options
context:
space:
mode:
authorAli Saidi <Ali.Saidi@ARM.com>2011-04-04 11:42:27 -0500
committerAli Saidi <Ali.Saidi@ARM.com>2011-04-04 11:42:27 -0500
commit55920a5ca73ded58762f1b7ae25c8cfe8c9e407d (patch)
treeb0bd2754e8b06b0080d0b9d22dbf4c721b209622 /src/arch/arm/table_walker.cc
parent5962fecc1d2eaf956f0aab10eee1e0666a461706 (diff)
downloadgem5-55920a5ca73ded58762f1b7ae25c8cfe8c9e407d.tar.xz
ARM: Fix table walk going on while ASID changes error
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");
}