diff options
author | Ali Saidi <Ali.Saidi@ARM.com> | 2011-02-23 15:10:49 -0600 |
---|---|---|
committer | Ali Saidi <Ali.Saidi@ARM.com> | 2011-02-23 15:10:49 -0600 |
commit | ae3d45685512b75f878eb9d7917680fc3971988e (patch) | |
tree | da8a195456de67473cb0a950600b3bcf4fb3d0ee /src/arch/arm/table_walker.cc | |
parent | f05f35df99e2b9be3353d7585142b91139965e22 (diff) | |
download | gem5-ae3d45685512b75f878eb9d7917680fc3971988e.tar.xz |
ARM: Fix bug that let two table walks occur in parallel.
Diffstat (limited to 'src/arch/arm/table_walker.cc')
-rw-r--r-- | src/arch/arm/table_walker.cc | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/src/arch/arm/table_walker.cc b/src/arch/arm/table_walker.cc index e6dd728dd..e2207e26b 100644 --- a/src/arch/arm/table_walker.cc +++ b/src/arch/arm/table_walker.cc @@ -141,12 +141,12 @@ TableWalker::walk(RequestPtr _req, ThreadContext *_tc, uint8_t _cid, TLB::Mode _ if (!currState->timing) return processWalk(); - if (pending) { + if (pending || pendingQueue.size()) { pendingQueue.push_back(currState); currState = NULL; } else { pending = true; - processWalk(); + return processWalk(); } return NoFault; @@ -194,10 +194,8 @@ TableWalker::processWalk() f = tlb->walkTrickBoxCheck(l1desc_addr, currState->vaddr, sizeof(uint32_t), currState->isFetch, currState->isWrite, 0, true); if (f) { + DPRINTF(TLB, "Trickbox check caused fault on %#x\n", currState->vaddr); if (currState->timing) { - currState->transState->finish(f, currState->req, - currState->tc, currState->mode); - pending = false; nextWalk(currState->tc); currState = NULL; |