summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
authorAndreas Hansson <andreas.hansson@arm.com>2015-01-22 05:00:54 -0500
committerAndreas Hansson <andreas.hansson@arm.com>2015-01-22 05:00:54 -0500
commitce12d4bc632a081dfc76cfda97d570e0381cd2b4 (patch)
tree9478ee3633a76be4405401651d25eb8ae1167858 /src/arch
parentf49830ce0ba79c54c65c9c4b25bc3c6184aaf2a9 (diff)
downloadgem5-ce12d4bc632a081dfc76cfda97d570e0381cd2b4.tar.xz
x86: Delay X86 table walk on receiving walker response
This patch fixes a minor issue in the X86 page table walker where it ended up sending new request packets to the crossbar before the response processing was finished (recvTimingResp is directly calling sendTimingReq). Under certain conditions this caused the crossbar to see illegal combinations of request/response overlap, in turn causing problems with a slightly modified crossbar implementation.
Diffstat (limited to 'src/arch')
-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)
{
}
};