summaryrefslogtreecommitdiff
path: root/src/mem/coherent_bus.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/coherent_bus.hh')
-rw-r--r--src/mem/coherent_bus.hh51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/mem/coherent_bus.hh b/src/mem/coherent_bus.hh
index d8ddd507c..49f7ae698 100644
--- a/src/mem/coherent_bus.hh
+++ b/src/mem/coherent_bus.hh
@@ -219,6 +219,57 @@ class CoherentBus : public BaseBus
};
+ /**
+ * Internal class to bridge between an incoming snoop response
+ * from a slave port and forwarding it through an outgoing slave
+ * port. It is effectively a dangling master port.
+ */
+ class SnoopRespPort : public MasterPort
+ {
+
+ private:
+
+ /** The port which we mirror internally. */
+ SlavePort& slavePort;
+
+ /** The bus to which this port belongs. */
+ CoherentBus &bus;
+
+ public:
+
+ /**
+ * Create a snoop response port that mirrors a given slave port.
+ */
+ SnoopRespPort(SlavePort& slave_port, CoherentBus& _bus) :
+ MasterPort(slave_port.name() + ".snoopRespPort", &_bus),
+ slavePort(slave_port), bus(_bus) { }
+
+ /**
+ * Override the sending of retries and pass them on through
+ * the mirrored slave port.
+ */
+ void sendRetry() {
+ slavePort.sendRetry();
+ }
+
+ /**
+ * Provided as necessary.
+ */
+ void recvRetry() { panic("SnoopRespPort should never see retry\n"); }
+
+ /**
+ * Provided as necessary.
+ */
+ bool recvTimingResp(PacketPtr pkt)
+ {
+ panic("SnoopRespPort should never see timing response\n");
+ return false;
+ }
+
+ };
+
+ std::vector<SnoopRespPort*> snoopRespPorts;
+
std::vector<SlavePort*> snoopPorts;
/**