changeset fe32a5238754 in /z/repo/gem5
details: http://repo.gem5.org/gem5?cmd=changeset;node=fe32a5238754
description:
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.
diffstat:
src/cpu/o3/cpu.cc | 7 +--
src/cpu/simple_thread.cc | 1 +
src/cpu/thread_context.cc | 36 +++++++++++++++++++++
src/cpu/thread_context.hh | 12 +++++++
src/sim/pseudo_inst.cc | 79 ++--------------------------------------------
5 files changed, 56 insertions(+), 79 deletions(-)
diffs (230 lines):
diff -r c89c72b0e5f5 -r fe32a5238754 src/cpu/o3/cpu.cc
--- a/src/cpu/o3/cpu.cc Tue Sep 13 23:16:06 2016 -0400
+++ b/src/cpu/o3/cpu.cc Tue Sep 13 23:17:42 2016 -0400
@@ -380,10 +380,9 @@
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 -r c89c72b0e5f5 -r fe32a5238754 src/cpu/simple_thread.cc
--- a/src/cpu/simple_thread.cc Tue Sep 13 23:16:06 2016 -0400
+++ b/src/cpu/simple_thread.cc Tue Sep 13 23:17:42 2016 -0400
@@ -69,6 +69,7 @@
{
clearArchRegs();
tc = new ProxyThreadContext<SimpleThread>(this);
+ quiesceEvent = new EndQuiesceEvent(tc);
}
SimpleThread::SimpleThread(BaseCPU *_cpu, int _thread_num, System *_sys,
diff -r c89c72b0e5f5 -r fe32a5238754 src/cpu/thread_context.cc
--- a/src/cpu/thread_context.cc Tue Sep 13 23:16:06 2016 -0400
+++ b/src/cpu/thread_context.cc Tue Sep 13 23:17:42 2016 -0400
@@ -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 @@
}
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 -r c89c72b0e5f5 -r fe32a5238754 src/cpu/thread_context.hh
--- a/src/cpu/thread_context.hh Tue Sep 13 23:16:06 2016 -0400
+++ b/src/cpu/thread_context.hh Tue Sep 13 23:17:42 2016 -0400
@@ -174,6 +174,12 @@
/// 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 @@
/// 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 -r c89c72b0e5f5 -r fe32a5238754 src/sim/pseudo_inst.cc
--- a/src/sim/pseudo_inst.cc Tue Sep 13 23:16:06 2016 -0400
+++ b/src/sim/pseudo_inst.cc Tue Sep 13 23:17:42 2016 -0400
@@ -234,105 +234,34 @@
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;
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev