summaryrefslogtreecommitdiff
path: root/src/mem/tport.cc
diff options
context:
space:
mode:
authorSteve Reinhardt <stever@eecs.umich.edu>2007-06-26 22:23:10 -0700
committerSteve Reinhardt <stever@eecs.umich.edu>2007-06-26 22:23:10 -0700
commit1b20df5607e86d3b384716792274fe01fa4f3f80 (patch)
tree5b9d672a7be75fb7426fc25216cfa40acf3a9e98 /src/mem/tport.cc
parent69ff6d9163c431272fc084b8e051996b44590a53 (diff)
downloadgem5-1b20df5607e86d3b384716792274fe01fa4f3f80.tar.xz
Handle deferred snoops better.
--HG-- extra : convert_revision : 703da6128832eb0d5cfed7724e5105f4b3fe4f90
Diffstat (limited to 'src/mem/tport.cc')
-rw-r--r--src/mem/tport.cc13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/mem/tport.cc b/src/mem/tport.cc
index 0a2127490..6c8c12ce2 100644
--- a/src/mem/tport.cc
+++ b/src/mem/tport.cc
@@ -69,11 +69,21 @@ SimpleTimingPort::recvTiming(PacketPtr pkt)
// if we ever added it back.
assert(pkt->isRequest());
assert(pkt->result == Packet::Unknown);
+
+ if (pkt->memInhibitAsserted()) {
+ // snooper will supply based on copy of packet
+ // still target's responsibility to delete packet
+ delete pkt->req;
+ delete pkt;
+ return true;
+ }
+
bool needsResponse = pkt->needsResponse();
Tick latency = recvAtomic(pkt);
// turn packet around to go back to requester if response expected
if (needsResponse) {
- // recvAtomic() should already have turned packet into atomic response
+ // recvAtomic() should already have turned packet into
+ // atomic response
assert(pkt->isResponse());
pkt->convertAtomicToTimingResponse();
schedSendTiming(pkt, curTick + latency);
@@ -81,6 +91,7 @@ SimpleTimingPort::recvTiming(PacketPtr pkt)
delete pkt->req;
delete pkt;
}
+
return true;
}