diff options
Diffstat (limited to 'src/mem/cache')
-rw-r--r-- | src/mem/cache/cache_impl.hh | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/mem/cache/cache_impl.hh b/src/mem/cache/cache_impl.hh index 76fb697c2..b482d6314 100644 --- a/src/mem/cache/cache_impl.hh +++ b/src/mem/cache/cache_impl.hh @@ -1475,10 +1475,23 @@ Cache<TagStore>::recvTimingSnoopReq(PacketPtr pkt) // Snoops shouldn't happen when bypassing caches assert(!system->bypassCaches()); + // check if the packet is for an address range covered by this + // cache, partly to not waste time looking for it, but also to + // ensure that we only forward the snoop upwards if it is within + // our address ranges + bool in_range = false; + for (AddrRangeList::const_iterator r = addrRanges.begin(); + r != addrRanges.end(); ++r) { + if (r->contains(pkt->getAddr())) { + in_range = true; + break; + } + } + // Note that some deferred snoops don't have requests, since the // original access may have already completed if ((pkt->req && pkt->req->isUncacheable()) || - pkt->cmd == MemCmd::Writeback) { + pkt->cmd == MemCmd::Writeback || !in_range) { //Can't get a hit on an uncacheable address //Revisit this for multi level coherence return; |