summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mem/port.cc20
-rw-r--r--src/mem/port.hh20
2 files changed, 39 insertions, 1 deletions
diff --git a/src/mem/port.cc b/src/mem/port.cc
index 001576fe3..933e98243 100644
--- a/src/mem/port.cc
+++ b/src/mem/port.cc
@@ -144,6 +144,13 @@ MasterPort::sendAtomic(PacketPtr pkt)
return _slavePort->recvAtomic(pkt);
}
+Tick
+MasterPort::sendAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr &backdoor)
+{
+ assert(pkt->isRequest());
+ return _slavePort->recvAtomicBackdoor(pkt, backdoor);
+}
+
void
MasterPort::sendFunctional(PacketPtr pkt)
{
@@ -195,7 +202,8 @@ MasterPort::printAddr(Addr a)
* Slave port
*/
SlavePort::SlavePort(const std::string& name, MemObject* _owner, PortID id)
- : BaseSlavePort(name, id), _masterPort(NULL), owner(*_owner)
+ : BaseSlavePort(name, id), _masterPort(NULL), defaultBackdoorWarned(false),
+ owner(*_owner)
{
}
@@ -220,6 +228,16 @@ SlavePort::slaveBind(MasterPort& master_port)
}
Tick
+SlavePort::recvAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr &backdoor)
+{
+ if (!defaultBackdoorWarned) {
+ warn("Port %s doesn't support requesting a back door.", name());
+ defaultBackdoorWarned = true;
+ }
+ return recvAtomic(pkt);
+}
+
+Tick
SlavePort::sendAtomicSnoop(PacketPtr pkt)
{
assert(pkt->isRequest());
diff --git a/src/mem/port.hh b/src/mem/port.hh
index 2154da007..72a02711c 100644
--- a/src/mem/port.hh
+++ b/src/mem/port.hh
@@ -51,6 +51,7 @@
#define __MEM_PORT_HH__
#include "base/addr_range.hh"
+#include "mem/backdoor.hh"
#include "mem/packet.hh"
#include "sim/port.hh"
@@ -153,6 +154,18 @@ class MasterPort : public BaseMasterPort
Tick sendAtomic(PacketPtr pkt);
/**
+ * Send an atomic request packet like above, but also request a backdoor
+ * to the data being accessed.
+ *
+ * @param pkt Packet to send.
+ * @param backdoor Can be set to a back door pointer by the target to let
+ * caller have direct access to the requested data.
+ *
+ * @return Estimated latency of access.
+ */
+ Tick sendAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr &backdoor);
+
+ /**
* Send a functional request packet, where the data is instantly
* updated everywhere in the memory system, without affecting the
* current state of any block or moving the block.
@@ -300,6 +313,7 @@ class SlavePort : public BaseSlavePort
private:
MasterPort* _masterPort;
+ bool defaultBackdoorWarned;
protected:
@@ -416,6 +430,12 @@ class SlavePort : public BaseSlavePort
virtual Tick recvAtomic(PacketPtr pkt) = 0;
/**
+ * Receive an atomic request packet from the master port, and optionally
+ * provide a backdoor to the data being accessed.
+ */
+ virtual Tick recvAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr &backdoor);
+
+ /**
* Receive a functional request packet from the master port.
*/
virtual void recvFunctional(PacketPtr pkt) = 0;