port: Clean up default port setup and port switchover code.
authorNathan Binkert <nate@binkert.org>
Mon, 16 Jun 2008 04:34:32 +0000 (21:34 -0700)
committerNathan Binkert <nate@binkert.org>
Mon, 16 Jun 2008 04:34:32 +0000 (21:34 -0700)
src/cpu/base.cc
src/mem/bridge.cc
src/mem/port.cc
src/mem/port.hh

index 23195f720f382d8fb02f35c33732e2ac8f7a4591..6ce08299658e4c096acc2be1f5d9315bad14a74a 100644 (file)
@@ -351,22 +351,17 @@ BaseCPU::takeOverFrom(BaseCPU *oldCPU, Port *ic, Port *dc)
     // Connect new CPU to old CPU's memory only if new CPU isn't
     // connected to anything.  Also connect old CPU's memory to new
     // CPU.
-    Port *peer;
-    if (ic->getPeer() == NULL || ic->getPeer()->isDefaultPort()) {
-        peer = oldCPU->getPort("icache_port")->getPeer();
+    if (!ic->isConnected()) {
+        Port *peer = oldCPU->getPort("icache_port")->getPeer();
         ic->setPeer(peer);
-    } else {
-        peer = ic->getPeer();
+        peer->setPeer(ic);
     }
-    peer->setPeer(ic);
 
-    if (dc->getPeer() == NULL || dc->getPeer()->isDefaultPort()) {
-        peer = oldCPU->getPort("dcache_port")->getPeer();
+    if (!dc->isConnected()) {
+        Port *peer = oldCPU->getPort("dcache_port")->getPeer();
         dc->setPeer(peer);
-    } else {
-        peer = dc->getPeer();
+        peer->setPeer(dc);
     }
-    peer->setPeer(dc);
 }
 
 
index 3d396649182c37ec37438cd62489c8e7a7ce6ac2..c09cacc00c78e9247539253b5715951923ea36b7 100644 (file)
@@ -89,7 +89,7 @@ void
 Bridge::init()
 {
     // Make sure that both sides are connected to.
-    if (portA.getPeer() == NULL || portB.getPeer() == NULL)
+    if (!portA.isConnected() || !portB.isConnected())
         fatal("Both ports of bus bridge are not connected to a bus.\n");
 
     if (portA.peerBlockSize() != portB.peerBlockSize())
index ce3f6c74b5648b02e660c04da7ec63efa35bd23a..0e03194c9b2a439854355e13caed9c35b36c5687 100644 (file)
 #include "mem/mem_object.hh"
 #include "mem/port.hh"
 
-class defaultPeerPortClass: public Port
+class DefaultPeerPort : public Port
 {
   protected:
     void blowUp()
     {
-        fatal("Unconnected port!");
+        fatal("%s: Unconnected port!", peer->name());
     }
 
   public:
-    defaultPeerPortClass() : Port("default_port")
-    {}
+    DefaultPeerPort()
+        : Port("default_port")
+    { }
 
     bool recvTiming(PacketPtr)
     {
@@ -84,16 +85,22 @@ class defaultPeerPortClass: public Port
         blowUp();
     }
 
-    bool isDefaultPort() { return true; }
+    bool isDefaultPort() const { return true; }
+};
 
-} defaultPeerPort;
+DefaultPeerPort defaultPeerPort;
 
-Port::Port() : peer(&defaultPeerPort), owner(NULL)
+Port::Port()
+    : peer(&defaultPeerPort), owner(NULL)
 {
 }
 
-Port::Port(const std::string &_name, MemObject *_owner) :
-    portName(_name), peer(&defaultPeerPort), owner(_owner)
+Port::Port(const std::string &_name, MemObject *_owner)
+    : portName(_name), peer(&defaultPeerPort), owner(_owner)
+{
+}
+
+Port::~Port()
 {
 }
 
@@ -101,6 +108,7 @@ void
 Port::setPeer(Port *port)
 {
     DPRINTF(Config, "setting peer to %s\n", port->name());
+
     peer = port;
 }
 
index f66b566eabdb1c3b6af5f06746241e65b2da3df8..15fda21644aacf7ba7aaa5c0afa91784298c3660 100644 (file)
@@ -73,8 +73,7 @@ class MemObject;
  */
 class Port
 {
-  private:
-
+  protected:
     /** Descriptive name (for DPRINTF output) */
     mutable std::string portName;
 
@@ -103,7 +102,7 @@ class Port
     /** Return port name (for DPRINTF). */
     const std::string &name() const { return portName; }
 
-    virtual ~Port() {};
+    virtual ~Port();
 
     // mey be better to use subclasses & RTTI?
     /** Holds the ports status.  Currently just that a range recomputation needs
@@ -131,7 +130,9 @@ class Port
      * demise. */
     void removeConn();
 
-    virtual bool isDefaultPort() { return false; }
+    virtual bool isDefaultPort() const { return false; }
+
+    bool isConnected() { return peer && !peer->isDefaultPort(); }
 
   protected: