Ruby Memory Vector: Allow more than 4GB of memory
[gem5.git] / src / mem / port.cc
index 4b7b040cbdd647668de1d6830340a69038b36a64..3827994fb93bba839b5d4be7145204af2ed6e9d6 100644 (file)
@@ -50,8 +50,8 @@
 #include "mem/mem_object.hh"
 #include "mem/port.hh"
 
-Port::Port(const std::string &_name, MemObject& _owner)
-    : portName(_name), peer(NULL), owner(_owner)
+Port::Port(const std::string &_name, MemObject& _owner, PortID _id)
+    : portName(_name), id(_id), owner(_owner)
 {
 }
 
@@ -62,8 +62,8 @@ Port::~Port()
 /**
  * Master port
  */
-MasterPort::MasterPort(const std::string& name, MemObject* owner)
-    : Port(name, *owner), _slavePort(NULL)
+MasterPort::MasterPort(const std::string& name, MemObject* owner, PortID _id)
+    : Port(name, *owner, _id), _slavePort(NULL)
 {
 }
 
@@ -81,12 +81,17 @@ MasterPort::getSlavePort() const
     return *_slavePort;
 }
 
+void
+MasterPort::unBind()
+{
+    _slavePort = NULL;
+}
+
 void
 MasterPort::bind(SlavePort& slave_port)
 {
     // master port keeps track of the slave port
     _slavePort = &slave_port;
-    peer = &slave_port;
 
     // slave port also keeps track of master port
     _slavePort->bind(*this);
@@ -104,18 +109,46 @@ MasterPort::peerBlockSize() const
     return _slavePort->deviceBlockSize();
 }
 
+AddrRangeList
+MasterPort::getAddrRanges() const
+{
+    return _slavePort->getAddrRanges();
+}
+
 Tick
 MasterPort::sendAtomic(PacketPtr pkt)
 {
+    assert(pkt->isRequest());
     return _slavePort->recvAtomic(pkt);
 }
 
 void
 MasterPort::sendFunctional(PacketPtr pkt)
 {
+    assert(pkt->isRequest());
     return _slavePort->recvFunctional(pkt);
 }
 
+bool
+MasterPort::sendTimingReq(PacketPtr pkt)
+{
+    assert(pkt->isRequest());
+    return _slavePort->recvTimingReq(pkt);
+}
+
+bool
+MasterPort::sendTimingSnoopResp(PacketPtr pkt)
+{
+    assert(pkt->isResponse());
+    return _slavePort->recvTimingSnoopResp(pkt);
+}
+
+void
+MasterPort::sendRetry()
+{
+    _slavePort->recvRetry();
+}
+
 void
 MasterPort::printAddr(Addr a)
 {
@@ -130,8 +163,8 @@ MasterPort::printAddr(Addr a)
 /**
  * Slave port
  */
-SlavePort::SlavePort(const std::string& name, MemObject* owner)
-    : Port(name, *owner), _masterPort(NULL)
+SlavePort::SlavePort(const std::string& name, MemObject* owner, PortID id)
+    : Port(name, *owner, id), _masterPort(NULL)
 {
 }
 
@@ -139,11 +172,16 @@ SlavePort::~SlavePort()
 {
 }
 
+void
+SlavePort::unBind()
+{
+    _masterPort = NULL;
+}
+
 void
 SlavePort::bind(MasterPort& master_port)
 {
     _masterPort = &master_port;
-    peer = &master_port;
 }
 
 MasterPort&
@@ -171,11 +209,33 @@ SlavePort::isConnected() const
 Tick
 SlavePort::sendAtomicSnoop(PacketPtr pkt)
 {
+    assert(pkt->isRequest());
     return _masterPort->recvAtomicSnoop(pkt);
 }
 
 void
 SlavePort::sendFunctionalSnoop(PacketPtr pkt)
 {
+    assert(pkt->isRequest());
     return _masterPort->recvFunctionalSnoop(pkt);
 }
+
+bool
+SlavePort::sendTimingResp(PacketPtr pkt)
+{
+    assert(pkt->isResponse());
+    return _masterPort->recvTimingResp(pkt);
+}
+
+void
+SlavePort::sendTimingSnoopReq(PacketPtr pkt)
+{
+    assert(pkt->isRequest());
+    _masterPort->recvTimingSnoopReq(pkt);
+}
+
+void
+SlavePort::sendRetry()
+{
+    _masterPort->recvRetry();
+}