More proper handling of the ports.
authorKevin Lim <ktlim@umich.edu>
Thu, 2 Nov 2006 19:58:31 +0000 (14:58 -0500)
committerKevin Lim <ktlim@umich.edu>
Thu, 2 Nov 2006 19:58:31 +0000 (14:58 -0500)
src/cpu/simple_thread.cc:
    Fix up port handling to share code.
src/cpu/thread_state.cc:
    Separate code off into a function.
src/cpu/thread_state.hh:
    Make a separate function that will get the CPU's memory's functional port.

--HG--
extra : convert_revision : 96a9bb3c5e4b9ba5511678c0fd17f0017c8cd312

src/cpu/simple_thread.cc
src/cpu/thread_state.cc
src/cpu/thread_state.hh

index 28d8bdf62b789cabde38e6392016cd0ecaee7a1e..f5fa68529c1abd0b3e9d3cf3e73495208840c54f 100644 (file)
@@ -129,6 +129,10 @@ SimpleThread::SimpleThread()
 
 SimpleThread::~SimpleThread()
 {
+#if FULL_SYSTEM
+    delete physPort;
+    delete virtPort;
+#endif
     delete tc;
 }
 
@@ -304,11 +308,9 @@ SimpleThread::getVirtPort(ThreadContext *src_tc)
     if (!src_tc)
         return virtPort;
 
-    VirtualPort *vp;
-    Port *mem_port;
+    VirtualPort *vp = new VirtualPort("tc-vport", src_tc);
+    Port *mem_port = getMemFuncPort();
 
-    vp = new VirtualPort("tc-vport", src_tc);
-    mem_port = system->physmem->getPort("functional");
     mem_port->setPeer(vp);
     vp->setPeer(mem_port);
     return vp;
index f81b781479214f15cf382c603b826bdd815d1c60..a6fff5fc3d5fc8cf3f4b5851fcecec76d7bc704d 100644 (file)
@@ -59,6 +59,16 @@ ThreadState::ThreadState(BaseCPU *cpu, int _cpuId, int _tid, Process *_process,
     numLoad = 0;
 }
 
+ThreadState::~ThreadState()
+{
+#if !FULL_SYSTEM
+    if (port) {
+        delete port->getPeer();
+        delete port;
+    }
+#endif
+}
+
 void
 ThreadState::serialize(std::ostream &os)
 {
@@ -124,11 +134,24 @@ ThreadState::getMemPort()
         return port;
 
     /* Use this port to for syscall emulation writes to memory. */
-    Port *dcache_port, *func_mem_port;
     port = new TranslatingPort(csprintf("%s-%d-funcport",
                                         baseCpu->name(), tid),
                                process->pTable, false);
 
+    Port *func_port = getMemFuncPort();
+
+    func_port->setPeer(port);
+    port->setPeer(func_port);
+
+    return port;
+}
+#endif
+
+Port *
+ThreadState::getMemFuncPort()
+{
+    Port *dcache_port, *func_mem_port;
+
     dcache_port = baseCpu->getPort("dcache_port");
     assert(dcache_port != NULL);
 
@@ -138,9 +161,5 @@ ThreadState::getMemPort()
     func_mem_port = mem_object->getPort("functional");
     assert(func_mem_port != NULL);
 
-    func_mem_port->setPeer(port);
-    port->setPeer(func_mem_port);
-
-    return port;
+    return func_mem_port;
 }
-#endif
index 14673aabb8bf8852499c511d6aacbdd2c03d8639..862d671f2d35166924fa8e3f6bc3dcee3d68dcad 100644 (file)
@@ -51,6 +51,7 @@ namespace Kernel {
 
 class BaseCPU;
 class Checkpoint;
+class Port;
 class TranslatingPort;
 
 /**
@@ -69,6 +70,8 @@ struct ThreadState {
                 short _asid);
 #endif
 
+    ~ThreadState();
+
     void serialize(std::ostream &os);
 
     void unserialize(Checkpoint *cp, const std::string &section);
@@ -136,6 +139,12 @@ struct ThreadState {
     /** Sets the status of this thread. */
     void setStatus(Status new_status) { _status = new_status; }
 
+  protected:
+    /** Gets a functional port from the memory object that's connected
+     * to the CPU. */
+    Port *getMemFuncPort();
+
+  public:
     /** Number of instructions committed. */
     Counter numInst;
     /** Stat for number instructions committed. */