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

Reply via email to