summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mem/coherent_xbar.cc9
-rwxr-xr-xsrc/mem/snoop_filter.cc4
-rwxr-xr-xsrc/mem/snoop_filter.hh4
3 files changed, 9 insertions, 8 deletions
diff --git a/src/mem/coherent_xbar.cc b/src/mem/coherent_xbar.cc
index 22642e6f2..f33a33b0f 100644
--- a/src/mem/coherent_xbar.cc
+++ b/src/mem/coherent_xbar.cc
@@ -115,7 +115,6 @@ CoherentXBar::~CoherentXBar()
void
CoherentXBar::init()
{
- // the base class is responsible for determining the block size
BaseXBar::init();
// iterate over our slave ports and determine which of our
@@ -233,7 +232,9 @@ CoherentXBar::recvTimingReq(PacketPtr pkt, PortID slave_port_id)
// in certain cases the crossbar is responsible for responding
bool respond_directly = false;
-
+ // store the original address as an address mapper could possibly
+ // modify the address upon a sendTimingRequest
+ const Addr addr(pkt->getAddr());
if (sink_packet) {
DPRINTF(CoherentXBar, "Not forwarding %s to %#llx\n",
pkt->cmdString(), pkt->getAddr());
@@ -265,7 +266,7 @@ CoherentXBar::recvTimingReq(PacketPtr pkt, PortID slave_port_id)
if (snoopFilter && !system->bypassCaches()) {
// Let the snoop filter know about the success of the send operation
- snoopFilter->finishRequest(!success, pkt);
+ snoopFilter->finishRequest(!success, addr);
}
// check if we were successful in sending the packet onwards
@@ -660,7 +661,7 @@ CoherentXBar::recvAtomic(PacketPtr pkt, PortID slave_port_id)
// operation, and do it even before sending it onwards to
// avoid situations where atomic upward snoops sneak in
// between and change the filter state
- snoopFilter->finishRequest(false, pkt);
+ snoopFilter->finishRequest(false, pkt->getAddr());
snoop_result = forwardAtomic(pkt, slave_port_id, InvalidPortID,
sf_res.first);
diff --git a/src/mem/snoop_filter.cc b/src/mem/snoop_filter.cc
index 9e8f8afb8..636861c2b 100755
--- a/src/mem/snoop_filter.cc
+++ b/src/mem/snoop_filter.cc
@@ -146,12 +146,12 @@ SnoopFilter::lookupRequest(const Packet* cpkt, const SlavePort& slave_port)
}
void
-SnoopFilter::finishRequest(bool will_retry, const Packet* cpkt)
+SnoopFilter::finishRequest(bool will_retry, const Addr addr)
{
if (reqLookupResult != cachedLocations.end()) {
// since we rely on the caller, do a basic check to ensure
// that finishRequest is being called following lookupRequest
- assert(reqLookupResult->first == cpkt->getBlockAddr(linesize));
+ assert(reqLookupResult->first == (addr & ~(Addr(linesize - 1))));
if (will_retry) {
// Undo any changes made in lookupRequest to the snoop filter
// entry if the request will come again. retryItem holds
diff --git a/src/mem/snoop_filter.hh b/src/mem/snoop_filter.hh
index 2a8d1ce21..3851e5810 100755
--- a/src/mem/snoop_filter.hh
+++ b/src/mem/snoop_filter.hh
@@ -141,9 +141,9 @@ class SnoopFilter : public SimObject {
* reqLookupResult.
*
* @param will_retry This request will retry on this bus / snoop filter
- * @param cpkt Request packet, merely for sanity checking
+ * @param addr Packet address, merely for sanity checking
*/
- void finishRequest(bool will_retry, const Packet* cpkt);
+ void finishRequest(bool will_retry, const Addr addr);
/**
* Handle an incoming snoop from below (the master port). These