summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael LeBeane <michael.lebeane@amd.com>2016-09-13 23:17:42 -0400
committerMichael LeBeane <michael.lebeane@amd.com>2016-09-13 23:17:42 -0400
commit458d4a3c7bff9365e9d732c56f105b5b7bd37739 (patch)
tree91c48b32127fc2ded18dfc6edf3b4077d3b021e4
parent2068af5768fdd15acaf7a8bad766f7005f86e0c2 (diff)
downloadgem5-458d4a3c7bff9365e9d732c56f105b5b7bd37739.tar.xz
sim: Refactor quiesce and remove FS asserts
The quiesce family of magic ops can be simplified by the inclusion of quiesceTick() and quiesce() functions on ThreadContext. This patch also gets rid of the FS guards, since suspending a CPU is also a valid operation for SE mode.
-rw-r--r--src/cpu/o3/cpu.cc7
-rw-r--r--src/cpu/simple_thread.cc1
-rw-r--r--src/cpu/thread_context.cc36
-rw-r--r--src/cpu/thread_context.hh12
-rw-r--r--src/sim/pseudo_inst.cc79
5 files changed, 56 insertions, 79 deletions
diff --git a/src/cpu/o3/cpu.cc b/src/cpu/o3/cpu.cc
index 73174e4a9..9bda09bf8 100644
--- a/src/cpu/o3/cpu.cc
+++ b/src/cpu/o3/cpu.cc
@@ -380,10 +380,9 @@ FullO3CPU<Impl>::FullO3CPU(DerivO3CPUParams *params)
assert(o3_tc->cpu);
o3_tc->thread = this->thread[tid];
- if (FullSystem) {
- // Setup quiesce event.
- this->thread[tid]->quiesceEvent = new EndQuiesceEvent(tc);
- }
+ // Setup quiesce event.
+ this->thread[tid]->quiesceEvent = new EndQuiesceEvent(tc);
+
// Give the thread the TC.
this->thread[tid]->tc = tc;
diff --git a/src/cpu/simple_thread.cc b/src/cpu/simple_thread.cc
index 33c5b47ea..0e17c07b5 100644
--- a/src/cpu/simple_thread.cc
+++ b/src/cpu/simple_thread.cc
@@ -69,6 +69,7 @@ SimpleThread::SimpleThread(BaseCPU *_cpu, int _thread_num, System *_sys,
{
clearArchRegs();
tc = new ProxyThreadContext<SimpleThread>(this);
+ quiesceEvent = new EndQuiesceEvent(tc);
}
SimpleThread::SimpleThread(BaseCPU *_cpu, int _thread_num, System *_sys,
diff --git a/src/cpu/thread_context.cc b/src/cpu/thread_context.cc
index 01ea51f26..691465996 100644
--- a/src/cpu/thread_context.cc
+++ b/src/cpu/thread_context.cc
@@ -41,6 +41,7 @@
* Authors: Kevin Lim
*/
+#include "arch/kernel_stats.hh"
#include "base/misc.hh"
#include "base/trace.hh"
#include "config/the_isa.hh"
@@ -48,6 +49,8 @@
#include "cpu/quiesce_event.hh"
#include "cpu/thread_context.hh"
#include "debug/Context.hh"
+#include "debug/Quiesce.hh"
+#include "params/BaseCPU.hh"
#include "sim/full_system.hh"
void
@@ -104,6 +107,39 @@ ThreadContext::compare(ThreadContext *one, ThreadContext *two)
}
void
+ThreadContext::quiesce()
+{
+ if (!getCpuPtr()->params()->do_quiesce)
+ return;
+
+ DPRINTF(Quiesce, "%s: quiesce()\n", getCpuPtr()->name());
+
+ suspend();
+ if (getKernelStats())
+ getKernelStats()->quiesce();
+}
+
+
+void
+ThreadContext::quiesceTick(Tick resume)
+{
+ BaseCPU *cpu = getCpuPtr();
+
+ if (!cpu->params()->do_quiesce)
+ return;
+
+ EndQuiesceEvent *quiesceEvent = getQuiesceEvent();
+
+ cpu->reschedule(quiesceEvent, resume, true);
+
+ DPRINTF(Quiesce, "%s: quiesceTick until %lu\n", cpu->name(), resume);
+
+ suspend();
+ if (getKernelStats())
+ getKernelStats()->quiesce();
+}
+
+void
serialize(ThreadContext &tc, CheckpointOut &cp)
{
using namespace TheISA;
diff --git a/src/cpu/thread_context.hh b/src/cpu/thread_context.hh
index 2544b19c6..f966c0aa1 100644
--- a/src/cpu/thread_context.hh
+++ b/src/cpu/thread_context.hh
@@ -174,6 +174,12 @@ class ThreadContext
/// Set the status to Halted.
virtual void halt() = 0;
+ /// Quiesce thread context
+ void quiesce();
+
+ /// Quiesce, suspend, and schedule activate at resume
+ void quiesceTick(Tick resume);
+
virtual void dumpFuncProfile() = 0;
virtual void takeOverFrom(ThreadContext *old_context) = 0;
@@ -367,6 +373,12 @@ class ProxyThreadContext : public ThreadContext
/// Set the status to Halted.
void halt() { actualTC->halt(); }
+ /// Quiesce thread context
+ void quiesce() { actualTC->quiesce(); }
+
+ /// Quiesce, suspend, and schedule activate at resume
+ void quiesceTick(Tick resume) { actualTC->quiesceTick(resume); }
+
void dumpFuncProfile() { actualTC->dumpFuncProfile(); }
void takeOverFrom(ThreadContext *oldContext)
diff --git a/src/sim/pseudo_inst.cc b/src/sim/pseudo_inst.cc
index 8f20c5ff9..4f9bbff6e 100644
--- a/src/sim/pseudo_inst.cc
+++ b/src/sim/pseudo_inst.cc
@@ -234,105 +234,34 @@ void
quiesce(ThreadContext *tc)
{
DPRINTF(PseudoInst, "PseudoInst::quiesce()\n");
- if (!FullSystem)
- panicFsOnlyPseudoInst("quiesce");
-
- if (!tc->getCpuPtr()->params()->do_quiesce)
- return;
-
- DPRINTF(Quiesce, "%s: quiesce()\n", tc->getCpuPtr()->name());
-
- tc->suspend();
- if (tc->getKernelStats())
- tc->getKernelStats()->quiesce();
+ tc->quiesce();
}
void
quiesceSkip(ThreadContext *tc)
{
DPRINTF(PseudoInst, "PseudoInst::quiesceSkip()\n");
- if (!FullSystem)
- panicFsOnlyPseudoInst("quiesceSkip");
-
- BaseCPU *cpu = tc->getCpuPtr();
-
- if (!cpu->params()->do_quiesce)
- return;
-
- EndQuiesceEvent *quiesceEvent = tc->getQuiesceEvent();
-
- Tick resume = cpu->nextCycle() + 1;
-
- cpu->reschedule(quiesceEvent, resume, true);
-
- DPRINTF(Quiesce, "%s: quiesceSkip() until %d\n",
- cpu->name(), resume);
-
- tc->suspend();
- if (tc->getKernelStats())
- tc->getKernelStats()->quiesce();
+ tc->quiesceTick(tc->getCpuPtr()->nextCycle() + 1);
}
void
quiesceNs(ThreadContext *tc, uint64_t ns)
{
DPRINTF(PseudoInst, "PseudoInst::quiesceNs(%i)\n", ns);
- if (!FullSystem)
- panicFsOnlyPseudoInst("quiesceNs");
-
- BaseCPU *cpu = tc->getCpuPtr();
-
- if (!cpu->params()->do_quiesce)
- return;
-
- EndQuiesceEvent *quiesceEvent = tc->getQuiesceEvent();
-
- Tick resume = curTick() + SimClock::Int::ns * ns;
-
- cpu->reschedule(quiesceEvent, resume, true);
-
- DPRINTF(Quiesce, "%s: quiesceNs(%d) until %d\n",
- cpu->name(), ns, resume);
-
- tc->suspend();
- if (tc->getKernelStats())
- tc->getKernelStats()->quiesce();
+ tc->quiesceTick(curTick() + SimClock::Int::ns * ns);
}
void
quiesceCycles(ThreadContext *tc, uint64_t cycles)
{
DPRINTF(PseudoInst, "PseudoInst::quiesceCycles(%i)\n", cycles);
- if (!FullSystem)
- panicFsOnlyPseudoInst("quiesceCycles");
-
- BaseCPU *cpu = tc->getCpuPtr();
-
- if (!cpu->params()->do_quiesce)
- return;
-
- EndQuiesceEvent *quiesceEvent = tc->getQuiesceEvent();
-
- Tick resume = cpu->clockEdge(Cycles(cycles));
-
- cpu->reschedule(quiesceEvent, resume, true);
-
- DPRINTF(Quiesce, "%s: quiesceCycles(%d) until %d\n",
- cpu->name(), cycles, resume);
-
- tc->suspend();
- if (tc->getKernelStats())
- tc->getKernelStats()->quiesce();
+ tc->quiesceTick(tc->getCpuPtr()->clockEdge(Cycles(cycles)));
}
uint64_t
quiesceTime(ThreadContext *tc)
{
DPRINTF(PseudoInst, "PseudoInst::quiesceTime()\n");
- if (!FullSystem) {
- panicFsOnlyPseudoInst("quiesceTime");
- return 0;
- }
return (tc->readLastActivate() - tc->readLastSuspend()) /
SimClock::Int::ns;