Update atomic and functional paths for snoops as well
authorRon Dreslinski <rdreslin@umich.edu>
Tue, 14 Nov 2006 06:38:42 +0000 (01:38 -0500)
committerRon Dreslinski <rdreslin@umich.edu>
Tue, 14 Nov 2006 06:38:42 +0000 (01:38 -0500)
--HG--
extra : convert_revision : 566d73438efb87ca683e4dee23454d880db3dfc7

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

index a9f95fdc7e5462b5628b45d1656abd113d379a45..92722fd97e7d40fea687ec4e89f75361f219df8e 100644 (file)
@@ -331,17 +331,19 @@ Bus::findSnoopPorts(Addr addr, int id)
 }
 
 Tick
-Bus::atomicSnoop(PacketPtr pkt)
+Bus::atomicSnoop(PacketPtr pkt, Port *responder)
 {
     std::vector<int> ports = findSnoopPorts(pkt->getAddr(), pkt->getSrc());
     Tick response_time = 0;
 
     while (!ports.empty())
     {
-        Tick response = interfaces[ports.back()]->sendAtomic(pkt);
-        if (response) {
-            assert(!response_time);  //Multiple responders
-            response_time = response;
+        if (interfaces[ports.back()] != responder) {
+            Tick response = interfaces[ports.back()]->sendAtomic(pkt);
+            if (response) {
+                assert(!response_time);  //Multiple responders
+                response_time = response;
+            }
         }
         ports.pop_back();
     }
@@ -349,7 +351,7 @@ Bus::atomicSnoop(PacketPtr pkt)
 }
 
 void
-Bus::functionalSnoop(PacketPtr pkt)
+Bus::functionalSnoop(PacketPtr pkt, Port *responder)
 {
     std::vector<int> ports = findSnoopPorts(pkt->getAddr(), pkt->getSrc());
 
@@ -357,7 +359,8 @@ Bus::functionalSnoop(PacketPtr pkt)
     int id = pkt->getSrc();
     while (!ports.empty() && pkt->result != Packet::Success)
     {
-        interfaces[ports.back()]->sendFunctional(pkt);
+        if (interfaces[ports.back()] != responder)
+            interfaces[ports.back()]->sendFunctional(pkt);
         ports.pop_back();
         pkt->setSrc(id);
     }
@@ -394,12 +397,13 @@ Bus::recvAtomic(PacketPtr pkt)
     // some clock skew issues yet again...
     pkt->finishTime = curTick + clock;
 
-    Tick snoopTime = atomicSnoop(pkt);
+    Port *port = findPort(pkt->getAddr(), pkt->getSrc());
+    Tick snoopTime = atomicSnoop(pkt, port);
 
     if (snoopTime)
         return snoopTime;  //Snoop satisfies it
     else
-        return findPort(pkt->getAddr(), pkt->getSrc())->sendAtomic(pkt);
+        return port->sendAtomic(pkt);
 }
 
 /** Function called by the port when the bus is receiving a Functional
@@ -412,13 +416,12 @@ Bus::recvFunctional(PacketPtr pkt)
     assert(pkt->getDest() == Packet::Broadcast);
     pkt->flags |= SNOOP_COMMIT;
 
-    functionalSnoop(pkt);
+    Port* port = findPort(pkt->getAddr(), pkt->getSrc());
+    functionalSnoop(pkt, port ? port : interfaces[pkt->getSrc()]);
 
     // If the snooping found what we were looking for, we're done.
-    if (pkt->result != Packet::Success) {
-        Port* port = findPort(pkt->getAddr(), pkt->getSrc());
-        if (port)
-            port->sendFunctional(pkt);
+    if (pkt->result != Packet::Success && port) {
+        port->sendFunctional(pkt);
     }
 }
 
index 7169a8e6db3c01bdc8a1e1ddc9b8288c79c5e897..c472b61430a943bf0662ad298d29d6c229eade8d 100644 (file)
@@ -109,10 +109,10 @@ class Bus : public MemObject
     std::vector<int> findSnoopPorts(Addr addr, int id);
 
     /** Snoop all relevant ports atomicly. */
-    Tick atomicSnoop(PacketPtr pkt);
+    Tick atomicSnoop(PacketPtr pkt, Port* responder);
 
     /** Snoop all relevant ports functionally. */
-    void functionalSnoop(PacketPtr pkt);
+    void functionalSnoop(PacketPtr pkt, Port *responder);
 
     /** Call snoop on caches, be sure to set SNOOP_COMMIT bit if you want
      * the snoop to happen