summaryrefslogtreecommitdiff
path: root/src/arch/arm/table_walker.cc
diff options
context:
space:
mode:
authorAli Saidi <Ali.Saidi@ARM.com>2011-02-23 15:10:49 -0600
committerAli Saidi <Ali.Saidi@ARM.com>2011-02-23 15:10:49 -0600
commitae3d45685512b75f878eb9d7917680fc3971988e (patch)
treeda8a195456de67473cb0a950600b3bcf4fb3d0ee /src/arch/arm/table_walker.cc
parentf05f35df99e2b9be3353d7585142b91139965e22 (diff)
downloadgem5-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.cc8
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;