diff options
author | Steve Reinhardt <stever@eecs.umich.edu> | 2007-06-26 22:23:10 -0700 |
---|---|---|
committer | Steve Reinhardt <stever@eecs.umich.edu> | 2007-06-26 22:23:10 -0700 |
commit | 1b20df5607e86d3b384716792274fe01fa4f3f80 (patch) | |
tree | 5b9d672a7be75fb7426fc25216cfa40acf3a9e98 /src/mem/tport.cc | |
parent | 69ff6d9163c431272fc084b8e051996b44590a53 (diff) | |
download | gem5-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.cc | 13 |
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; } |