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::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(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 @@ -103,6 +106,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) { 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;