Make an initialization pass for the thread context and set the [phys,virt]Port correctly
authorRon Dreslinski <rdreslin@umich.edu>
Sat, 18 Nov 2006 02:55:28 +0000 (21:55 -0500)
committerRon Dreslinski <rdreslin@umich.edu>
Sat, 18 Nov 2006 02:55:28 +0000 (21:55 -0500)
src/cpu/simple/atomic.cc:
src/cpu/simple/timing.cc:
    Call the thread context initialization

--HG--
extra : convert_revision : d7dc2a8b893dc670077b7f6150d4b710a1778620

src/cpu/simple/atomic.cc
src/cpu/simple/timing.cc
src/cpu/simple_thread.cc
src/cpu/simple_thread.hh
src/cpu/thread_context.hh
src/cpu/thread_state.hh

index 133b5500b446d0d52db19b5e0e8d0dda00041248..cd335e36da16208eae81eab4221ac707e674df93 100644 (file)
@@ -77,6 +77,9 @@ AtomicSimpleCPU::init()
     for (int i = 0; i < threadContexts.size(); ++i) {
         ThreadContext *tc = threadContexts[i];
 
+        // initialize the mem pointers
+        tc->init();
+
         // initialize CPU, including PC
         TheISA::initCPU(tc, tc->readCpuId());
     }
index 3648f7613281f8b75b9973bc5b4c521d70221de7..aa23a00e8a287a065dd7ad0f2709de6f39ee3e70 100644 (file)
@@ -59,6 +59,9 @@ TimingSimpleCPU::init()
     for (int i = 0; i < threadContexts.size(); ++i) {
         ThreadContext *tc = threadContexts[i];
 
+        // initialize the mem pointers
+        tc->init();
+
         // initialize CPU, including PC
         TheISA::initCPU(tc, tc->readCpuId());
     }
index 1edcbf35256ca740971f603e9f894c200f0e1ce6..e07d6e7c1e42cb8b1ae1e20644a267d855b25995 100644 (file)
@@ -91,18 +91,6 @@ SimpleThread::SimpleThread(BaseCPU *_cpu, int _thread_num, System *_sys,
     } else {
         kernelStats = NULL;
     }
-    Port *mem_port;
-    physPort = new FunctionalPort(csprintf("%s-%d-funcport",
-                                           cpu->name(), tid));
-    mem_port = system->physmem->getPort("functional");
-    mem_port->setPeer(physPort);
-    physPort->setPeer(mem_port);
-
-    virtPort = new VirtualPort(csprintf("%s-%d-vport",
-                                        cpu->name(), tid));
-    mem_port = system->physmem->getPort("functional");
-    mem_port->setPeer(virtPort);
-    virtPort->setPeer(mem_port);
 }
 #else
 SimpleThread::SimpleThread(BaseCPU *_cpu, int _thread_num,
@@ -116,6 +104,25 @@ SimpleThread::SimpleThread(BaseCPU *_cpu, int _thread_num,
 
 #endif
 
+#if FULL_SYSTEM
+void
+SimpleThread::init()
+{
+    Port *mem_port;
+    physPort = new FunctionalPort(csprintf("%s-%d-funcport",
+                                           cpu->name(), tid));
+    mem_port = getMemFuncPort();
+    mem_port->setPeer(physPort);
+    physPort->setPeer(mem_port);
+
+    virtPort = new VirtualPort(csprintf("%s-%d-vport",
+                                        cpu->name(), tid));
+    mem_port = getMemFuncPort();
+    mem_port->setPeer(virtPort);
+    virtPort->setPeer(mem_port);
+}
+#endif
+
 SimpleThread::SimpleThread()
 #if FULL_SYSTEM
     : ThreadState(NULL, -1, -1)
index e8757c8c20b67e56de3f5f7953c83b7459f884cf..b9ce4e0ce7adad88de0d3c9605a61da7e22de5ee 100644 (file)
@@ -118,6 +118,8 @@ class SimpleThread : public ThreadState
     SimpleThread(BaseCPU *_cpu, int _thread_num, System *_system,
                  TheISA::ITB *_itb, TheISA::DTB *_dtb,
                  bool use_kernel_stats = true);
+
+    void init();
 #else
     SimpleThread(BaseCPU *_cpu, int _thread_num, Process *_process, int _asid);
 #endif
index 1e6a907f85f131dfb20e2393cda5ab8b028fc999..baeb7a8bed24874753ef2e9c8aba7d44c7157c7b 100644 (file)
@@ -133,6 +133,8 @@ class ThreadContext
     virtual VirtualPort *getVirtPort(ThreadContext *tc = NULL) = 0;
 
     virtual void delVirtPort(VirtualPort *vp) = 0;
+
+    virtual void init() = 0;
 #else
     virtual TranslatingPort *getMemPort() = 0;
 
@@ -305,6 +307,8 @@ class ProxyThreadContext : public ThreadContext
     VirtualPort *getVirtPort(ThreadContext *tc = NULL) { return actualTC->getVirtPort(tc); }
 
     void delVirtPort(VirtualPort *vp) { return actualTC->delVirtPort(vp); }
+
+    void init() {actualTC->init(); }
 #else
     TranslatingPort *getMemPort() { return actualTC->getMemPort(); }
 
index 0a0af8b7183fc00531ec5faf850011c32fd24a3a..183ddcd2bcdaba25ec2166c335a662734f017b76 100644 (file)
@@ -141,12 +141,11 @@ struct ThreadState {
     /** Sets the status of this thread. */
     void setStatus(Status new_status) { _status = new_status; }
 
-  protected:
+  public:
     /** 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. */