Fix bugs around uni-coherence invalidates being propogated properly.
authorRon Dreslinski <rdreslin@umich.edu>
Tue, 14 Nov 2006 22:15:05 +0000 (17:15 -0500)
committerRon Dreslinski <rdreslin@umich.edu>
Tue, 14 Nov 2006 22:15:05 +0000 (17:15 -0500)
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

src/mem/bus.cc
src/mem/packet.hh

index 92722fd97e7d40fea687ec4e89f75361f219df8e..6b5b63f504a4377a7994ec91240d7c677c4959da 100644 (file)
@@ -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
index 2bc51bf12e15fef417a52aaa95be8e4a185dff47..19251941f414408b046577a4764dd1f0beb7a25d 100644 (file)
@@ -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