A possible implementation of a multiplexed bus.
[gem5.git] / src / cpu / simple_thread.cc
index 6255b335797ebb95ca560177bf2acdeb14928d35..4fc47c982115651287ec15575835ef00b9769569 100644 (file)
@@ -125,7 +125,7 @@ SimpleThread::SimpleThread(BaseCPU *_cpu, int _thread_num,
 
 #endif
 
-SimpleThread::SimpleThread(ThreadContext *oldContext)
+SimpleThread::SimpleThread()
 #if FULL_SYSTEM
     : ThreadState(-1, -1)
 #else
@@ -134,19 +134,6 @@ SimpleThread::SimpleThread(ThreadContext *oldContext)
 {
     tc = new ProxyThreadContext<SimpleThread>(this);
     regs.clear();
-
-    copyState(oldContext);
-
-#if FULL_SYSTEM
-    EndQuiesceEvent *quiesce = oldContext->getQuiesceEvent();
-    if (quiesce) {
-        quiesceEvent = quiesce;
-    }
-    Kernel::Statistics *stats = oldContext->getKernelStats();
-    if (stats) {
-        kernelStats = stats;
-    }
-#endif
 }
 
 SimpleThread::~SimpleThread()
@@ -175,6 +162,11 @@ SimpleThread::takeOverFrom(ThreadContext *oldContext)
     if (quiesceEvent) {
         quiesceEvent->tc = tc;
     }
+
+    Kernel::Statistics *stats = oldContext->getKernelStats();
+    if (stats) {
+        kernelStats = stats;
+    }
 #endif
 
     storeCondFailures = 0;
@@ -182,6 +174,23 @@ SimpleThread::takeOverFrom(ThreadContext *oldContext)
     oldContext->setStatus(ThreadContext::Unallocated);
 }
 
+void
+SimpleThread::copyTC(ThreadContext *context)
+{
+    copyState(context);
+
+#if FULL_SYSTEM
+    EndQuiesceEvent *quiesce = context->getQuiesceEvent();
+    if (quiesce) {
+        quiesceEvent = quiesce;
+    }
+    Kernel::Statistics *stats = context->getKernelStats();
+    if (stats) {
+        kernelStats = stats;
+    }
+#endif
+}
+
 void
 SimpleThread::copyState(ThreadContext *oldContext)
 {
@@ -192,6 +201,7 @@ SimpleThread::copyState(ThreadContext *oldContext)
 #if !FULL_SYSTEM
     funcExeInst = oldContext->readFuncExeInst();
 #endif
+    inst = oldContext->getInst();
 }
 
 void