diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mem/coherent_xbar.cc | 9 | ||||
-rwxr-xr-x | src/mem/snoop_filter.cc | 4 | ||||
-rwxr-xr-x | src/mem/snoop_filter.hh | 4 |
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 |