diff options
author | Ali Saidi <Ali.Saidi@ARM.com> | 2011-04-04 11:42:27 -0500 |
---|---|---|
committer | Ali Saidi <Ali.Saidi@ARM.com> | 2011-04-04 11:42:27 -0500 |
commit | 55920a5ca73ded58762f1b7ae25c8cfe8c9e407d (patch) | |
tree | b0bd2754e8b06b0080d0b9d22dbf4c721b209622 /src/arch/arm/table_walker.cc | |
parent | 5962fecc1d2eaf956f0aab10eee1e0666a461706 (diff) | |
download | gem5-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.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"); } |