From 458d4a3c7bff9365e9d732c56f105b5b7bd37739 Mon Sep 17 00:00:00 2001 From: Michael LeBeane Date: Tue, 13 Sep 2016 23:17:42 -0400 Subject: 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. --- src/sim/pseudo_inst.cc | 79 +++----------------------------------------------- 1 file changed, 4 insertions(+), 75 deletions(-) (limited to 'src/sim') 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; -- cgit v1.2.3