diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mem/port.cc | 20 | ||||
-rw-r--r-- | src/mem/port.hh | 20 |
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; |