diff options
-rw-r--r-- | src/arch/x86/pagetable_walker.cc | 6 | ||||
-rw-r--r-- | src/arch/x86/pagetable_walker.hh | 8 |
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) { } }; |