diff options
author | Ron Dreslinski <rdreslin@umich.edu> | 2006-11-14 17:15:05 -0500 |
---|---|---|
committer | Ron Dreslinski <rdreslin@umich.edu> | 2006-11-14 17:15:05 -0500 |
commit | c32f3056f9e513f5efff5eec2210ba7c6dcbc67e (patch) | |
tree | e4de6df34dcc8c4c32f8e2429592ca8b3e039888 | |
parent | 8155e61a601a37fb210a7676ba500014a7b5d054 (diff) | |
download | gem5-c32f3056f9e513f5efff5eec2210ba7c6dcbc67e.tar.xz |
Fix bugs around uni-coherence invalidates being propogated properly.
src/mem/bus.cc:
Make it so that invalidates being sent from the responder up don't call the responder
but they should also not Panic.
src/mem/packet.hh:
If we don't have data in the packet, don't call deleteData:
Example: InvalidateRequests never have data.
--HG--
extra : convert_revision : 18766bc9f3bb4d852ac651d094254d347abd1634
-rw-r--r-- | src/mem/bus.cc | 42 | ||||
-rw-r--r-- | src/mem/packet.hh | 2 |
2 files changed, 26 insertions, 18 deletions
diff --git a/src/mem/bus.cc b/src/mem/bus.cc index 92722fd97..6b5b63f50 100644 --- a/src/mem/bus.cc +++ b/src/mem/bus.cc @@ -161,11 +161,11 @@ Bus::recvTiming(PacketPtr pkt) short dest = pkt->getDest(); if (dest == Packet::Broadcast) { port = findPort(pkt->getAddr(), pkt->getSrc()); - if (timingSnoop(pkt, port)) { + if (timingSnoop(pkt, port ? port : interfaces[pkt->getSrc()])) { bool success; pkt->flags |= SNOOP_COMMIT; - success = timingSnoop(pkt, port); + success = timingSnoop(pkt, port ? port : interfaces[pkt->getSrc()]); assert(success); if (pkt->flags & SATISFIED) { @@ -192,22 +192,28 @@ Bus::recvTiming(PacketPtr pkt) occupyBus(pkt); - if (port->sendTiming(pkt)) { - // Packet was successfully sent. Return true. - // Also take care of retries - if (inRetry) { - DPRINTF(Bus, "Remove retry from list %i\n", retryList.front()); - retryList.front()->onRetryList(false); - retryList.pop_front(); - inRetry = false; + if (port) { + if (port->sendTiming(pkt)) { + // Packet was successfully sent. Return true. + // Also take care of retries + if (inRetry) { + DPRINTF(Bus, "Remove retry from list %i\n", retryList.front()); + retryList.front()->onRetryList(false); + retryList.pop_front(); + inRetry = false; + } + return true; } + + // Packet not successfully sent. Leave or put it on the retry list. + DPRINTF(Bus, "Adding a retry to RETRY list %i\n", pktPort); + addToRetryList(pktPort); + return false; + } + else { + //Forwarding up from responder, just return true; return true; } - - // Packet not successfully sent. Leave or put it on the retry list. - DPRINTF(Bus, "Adding a retry to RETRY list %i\n", pktPort); - addToRetryList(pktPort); - return false; } void @@ -398,12 +404,14 @@ Bus::recvAtomic(PacketPtr pkt) pkt->finishTime = curTick + clock; Port *port = findPort(pkt->getAddr(), pkt->getSrc()); - Tick snoopTime = atomicSnoop(pkt, port); + Tick snoopTime = atomicSnoop(pkt, port ? port : interfaces[pkt->getSrc()]); if (snoopTime) return snoopTime; //Snoop satisfies it - else + else if (port) return port->sendAtomic(pkt); + else + return 0; } /** Function called by the port when the bus is receiving a Functional diff --git a/src/mem/packet.hh b/src/mem/packet.hh index 2bc51bf12..19251941f 100644 --- a/src/mem/packet.hh +++ b/src/mem/packet.hh @@ -301,7 +301,7 @@ class Packet /** Destructor. */ ~Packet() - { deleteData(); } + { if (staticData || dynamicData) deleteData(); } /** Reinitialize packet address and size from the associated * Request object, and reset other fields that may have been |