mem-garnet: Fix garnet network interface stats
[gem5.git] / src / mem / external_slave.cc
index 2d7ba1a653e07ae2aabb66c8bbd0d6e0636b4b64..1559a3c61d21aa94ed15e5083adb68c97d9090ac 100644 (file)
@@ -33,8 +33,6 @@
  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Authors: Andrew Bardsley
  */
 
 #include "mem/external_slave.hh"
 #include <cctype>
 #include <iomanip>
 
+#include "base/trace.hh"
 #include "debug/ExternalPort.hh"
 
 /** Implement a `stub' port which just responds to requests by printing
  *  a message.  The stub port can be used to configure and test a system
  *  where the external port is used for a peripheral before connecting
  *  the external port */
-class StubSlavePort : public ExternalSlave::Port
+class StubSlavePort : public ExternalSlave::ExternalPort
 {
   public:
-    class ResponseEvent : public Event
-    {
-      public:
-        StubSlavePort &owner;
-
-        ResponseEvent(StubSlavePort &owner_) : owner(owner_) { }
-
-        void process();
-    };
+    void processResponseEvent();
 
-    ResponseEvent responseEvent;
+    EventFunctionWrapper responseEvent;
 
     /** Stub can handle a single request at a time.  This will be
      *  NULL when no packet is in flight */
@@ -73,8 +64,9 @@ class StubSlavePort : public ExternalSlave::Port
 
     StubSlavePort(const std::string &name_,
         ExternalSlave &owner_) :
-        ExternalSlave::Port(name_, owner_),
-        responseEvent(*this), responsePacket(NULL), mustRetry(false)
+        ExternalSlave::ExternalPort(name_, owner_),
+        responseEvent([this]{ processResponseEvent(); }, name()),
+        responsePacket(NULL), mustRetry(false)
     { }
 
     Tick recvAtomic(PacketPtr packet);
@@ -89,7 +81,7 @@ class StubSlavePortHandler : public
     ExternalSlave::Handler
 {
   public:
-    ExternalSlave::Port *getExternalPort(
+    ExternalSlave::ExternalPort *getExternalPort(
         const std::string &name_,
         ExternalSlave &owner,
         const std::string &port_data)
@@ -105,7 +97,7 @@ Tick
 StubSlavePort::recvAtomic(PacketPtr packet)
 {
     if (DTRACE(ExternalPort)) {
-        unsigned int M5_VAR_USED size = packet->getSize();
+        M5_VAR_USED unsigned int size = packet->getSize();
 
         DPRINTF(ExternalPort, "StubSlavePort: recvAtomic a: 0x%x size: %d"
             " data: ...\n", packet->getAddr(), size);
@@ -122,18 +114,18 @@ StubSlavePort::recvFunctional(PacketPtr packet)
 }
 
 void
-StubSlavePort::ResponseEvent::process()
+StubSlavePort::processResponseEvent()
 {
-    owner.responsePacket->makeResponse();
-    owner.responsePacket->headerDelay = 0;
-    owner.responsePacket->payloadDelay = 0;
+    responsePacket->makeResponse();
+    responsePacket->headerDelay = 0;
+    responsePacket->payloadDelay = 0;
 
-    if (owner.sendTimingResp(owner.responsePacket)) {
-        owner.responsePacket = NULL;
+    if (sendTimingResp(responsePacket)) {
+        responsePacket = NULL;
 
-        if (owner.mustRetry)
-            owner.sendRetryReq();
-        owner.mustRetry = false;
+        if (mustRetry)
+            sendRetryReq();
+        mustRetry = false;
     }
 }
 
@@ -181,27 +173,26 @@ std::map<std::string, ExternalSlave::Handler *>
     ExternalSlave::portHandlers;
 
 AddrRangeList
-ExternalSlave::Port::getAddrRanges() const
+ExternalSlave::ExternalPort::getAddrRanges() const
 {
     return owner.addrRanges;
 }
 
-ExternalSlave::ExternalSlave(ExternalSlaveParams *params) :
-    MemObject(params),
+ExternalSlave::ExternalSlave(const ExternalSlaveParams &params) :
+    SimObject(params),
     externalPort(NULL),
-    portName(params->name + ".port"),
-    portType(params->port_type),
-    portData(params->port_data),
-    addrRanges(params->addr_ranges.begin(), params->addr_ranges.end())
+    portName(params.name + ".port"),
+    portType(params.port_type),
+    portData(params.port_data),
+    addrRanges(params.addr_ranges.begin(), params.addr_ranges.end())
 {
     /* Register the stub handler if it hasn't already been registered */
     if (portHandlers.find("stub") == portHandlers.end())
         registerHandler("stub", new StubSlavePortHandler);
 }
 
-BaseSlavePort &
-ExternalSlave::getSlavePort(const std::string &if_name,
-    PortID idx)
+Port &
+ExternalSlave::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name == "port") {
         DPRINTF(ExternalPort, "Trying to bind external port: %s %s\n",
@@ -223,7 +214,7 @@ ExternalSlave::getSlavePort(const std::string &if_name,
         }
         return *externalPort;
     } else {
-        return MemObject::getSlavePort(if_name, idx);
+        return SimObject::getPort(if_name, idx);
     }
 }
 
@@ -240,9 +231,9 @@ ExternalSlave::init()
 }
 
 ExternalSlave *
-ExternalSlaveParams::create()
+ExternalSlaveParams::create() const
 {
-    return new ExternalSlave(this);
+    return new ExternalSlave(*this);
 }
 
 void