summaryrefslogtreecommitdiff
path: root/src/mem
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem')
-rw-r--r--src/mem/bus.cc14
-rw-r--r--src/mem/bus.hh3
2 files changed, 16 insertions, 1 deletions
diff --git a/src/mem/bus.cc b/src/mem/bus.cc
index daca6f985..1646cbd57 100644
--- a/src/mem/bus.cc
+++ b/src/mem/bus.cc
@@ -200,6 +200,18 @@ Bus::atomicSnoop(Packet *pkt)
}
}
+void
+Bus::functionalSnoop(Packet *pkt)
+{
+ std::vector<int> ports = findSnoopPorts(pkt->getAddr(), pkt->getSrc());
+
+ while (!ports.empty())
+ {
+ interfaces[ports.back()]->sendFunctional(pkt);
+ ports.pop_back();
+ }
+}
+
bool
Bus::timingSnoop(Packet *pkt)
{
@@ -236,7 +248,7 @@ Bus::recvFunctional(Packet *pkt)
DPRINTF(Bus, "recvFunctional: packet src %d dest %d addr 0x%x cmd %s\n",
pkt->getSrc(), pkt->getDest(), pkt->getAddr(), pkt->cmdString());
assert(pkt->getDest() == Packet::Broadcast);
- atomicSnoop(pkt);
+ functionalSnoop(pkt);
findPort(pkt->getAddr(), pkt->getSrc())->sendFunctional(pkt);
}
diff --git a/src/mem/bus.hh b/src/mem/bus.hh
index 3d7f4ad65..ff4ec9c8c 100644
--- a/src/mem/bus.hh
+++ b/src/mem/bus.hh
@@ -102,6 +102,9 @@ class Bus : public MemObject
/** Snoop all relevant ports atomicly. */
void atomicSnoop(Packet *pkt);
+ /** Snoop all relevant ports functionally. */
+ void functionalSnoop(Packet *pkt);
+
/** Call snoop on caches, be sure to set SNOOP_COMMIT bit if you want
* the snoop to happen
* @return True if succeds.