summaryrefslogtreecommitdiff
path: root/src/cpu/inorder/cpu.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/cpu/inorder/cpu.cc')
-rw-r--r--src/cpu/inorder/cpu.cc62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/cpu/inorder/cpu.cc b/src/cpu/inorder/cpu.cc
index 5a02f94d9..eecbd033e 100644
--- a/src/cpu/inorder/cpu.cc
+++ b/src/cpu/inorder/cpu.cc
@@ -64,6 +64,7 @@
#include "cpu/simple_thread.hh"
#include "cpu/thread_context.hh"
#include "debug/Activity.hh"
+#include "debug/Drain.hh"
#include "debug/InOrderCPU.hh"
#include "debug/InOrderCachePort.hh"
#include "debug/Interrupt.hh"
@@ -1490,6 +1491,67 @@ InOrderCPU::updateContextSwitchStats()
instsPerSwitch = 0;
}
+
+void
+InOrderCPU::drainResume()
+{
+ setDrainState(Drainable::Running);
+ if (switchedOut())
+ return;
+
+ DPRINTF(Drain, "Resuming...\n");
+ verifyMemoryMode();
+
+ assert(!tickEvent.scheduled());
+
+ // Activate threads and also signal the resource pool to activate
+ // the thread on all resources.
+ _status = Idle;
+ for (ThreadID i = 0; i < thread.size(); i++) {
+ if (thread[i]->status() == ThreadContext::Active) {
+ DPRINTF(Drain, "Activating thread: %i\n", i);
+ activateThread(i);
+ resPool->activateThread(i);
+ _status = Running;
+ }
+ }
+}
+
+void
+InOrderCPU::switchOut()
+{
+ DPRINTF(InOrderCPU, "Switching out\n");
+ BaseCPU::switchOut();
+
+ activityRec.reset();
+
+ _status = SwitchedOut;
+}
+
+void
+InOrderCPU::takeOverFrom(BaseCPU *oldCPU)
+{
+ BaseCPU::takeOverFrom(oldCPU);
+
+ // Call takeOverFrom() on each pipeline stage
+ for (int stNum=0; stNum < NumStages; stNum++) {
+ pipelineStage[stNum]->takeOverFrom();
+ }
+
+ assert(!tickEvent.scheduled());
+
+ // Copy over the current instruction sequence numbers if we are
+ // taking over from another InOrderCPU.
+ InOrderCPU *oldIOCPU = dynamic_cast<InOrderCPU*>(oldCPU);
+ if (oldIOCPU) {
+ for (ThreadID tid = 0; tid < numThreads; tid++)
+ globalSeqNum[tid] = oldIOCPU->globalSeqNum[tid];
+ }
+
+ lastRunningCycle = curCycle();
+ _status = Idle;
+}
+
void
InOrderCPU::instDone(DynInstPtr inst, ThreadID tid)