summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/x86/pagetable_walker.cc6
-rw-r--r--src/arch/x86/pagetable_walker.hh8
2 files changed, 11 insertions, 3 deletions
diff --git a/src/arch/x86/pagetable_walker.cc b/src/arch/x86/pagetable_walker.cc
index cc2a5099d..81c4ccdb5 100644
--- a/src/arch/x86/pagetable_walker.cc
+++ b/src/arch/x86/pagetable_walker.cc
@@ -124,8 +124,10 @@ Walker::recvTimingResp(PacketPtr pkt)
delete senderWalk;
// Since we block requests when another is outstanding, we
// need to check if there is a waiting request to be serviced
- if (currStates.size())
- startWalkWrapper();
+ if (currStates.size() && !startWalkWrapperEvent.scheduled())
+ // delay sending any new requests until we are finished
+ // with the responses
+ schedule(startWalkWrapperEvent, clockEdge());
}
return true;
}
diff --git a/src/arch/x86/pagetable_walker.hh b/src/arch/x86/pagetable_walker.hh
index c6766689b..c8ec549fe 100644
--- a/src/arch/x86/pagetable_walker.hh
+++ b/src/arch/x86/pagetable_walker.hh
@@ -183,6 +183,11 @@ namespace X86ISA
// Wrapper for checking for squashes before starting a translation.
void startWalkWrapper();
+ /**
+ * Event used to call startWalkWrapper.
+ **/
+ EventWrapper<Walker, &Walker::startWalkWrapper> startWalkWrapperEvent;
+
// Functions for dealing with packets.
bool recvTimingResp(PacketPtr pkt);
void recvRetry();
@@ -207,7 +212,8 @@ namespace X86ISA
MemObject(params), port(name() + ".port", this),
funcState(this, NULL, NULL, true), tlb(NULL), sys(params->system),
masterId(sys->getMasterId(name())),
- numSquashable(params->num_squash_per_cycle)
+ numSquashable(params->num_squash_per_cycle),
+ startWalkWrapperEvent(this)
{
}
};