diff -r a4503b22708a -r 62467854ead1 src/sim/pseudo_inst.cc --- a/src/sim/pseudo_inst.cc Tue Jan 04 14:41:50 2011 -0800 +++ b/src/sim/pseudo_inst.cc Tue Jan 04 14:41:59 2011 -0800 @@ -88,17 +88,19 @@ void quiesceNs(ThreadContext *tc, uint64_t ns) { - if (!tc->getCpuPtr()->params()->do_quiesce || ns == 0) + BaseCPU *cpu = tc->getCpuPtr(); + + if (!cpu->params()->do_quiesce || ns == 0) return; EndQuiesceEvent *quiesceEvent = tc->getQuiesceEvent(); Tick resume = curTick + SimClock::Int::ns * ns; - mainEventQueue.reschedule(quiesceEvent, resume, true); + cpu->reschedule(quiesceEvent, resume, true); DPRINTF(Quiesce, "%s: quiesceNs(%d) until %d\n", - tc->getCpuPtr()->name(), ns, resume); + cpu->name(), ns, resume); tc->suspend(); if (tc->getKernelStats()) @@ -108,17 +110,19 @@ void quiesceCycles(ThreadContext *tc, uint64_t cycles) { - if (!tc->getCpuPtr()->params()->do_quiesce || cycles == 0) + BaseCPU *cpu = tc->getCpuPtr(); + + if (!cpu->params()->do_quiesce || cycles == 0) return; EndQuiesceEvent *quiesceEvent = tc->getQuiesceEvent(); - Tick resume = curTick + tc->getCpuPtr()->ticks(cycles); + Tick resume = curTick + cpu->ticks(cycles); - mainEventQueue.reschedule(quiesceEvent, resume, true); + cpu->reschedule(quiesceEvent, resume, true); DPRINTF(Quiesce, "%s: quiesceCycles(%d) until %d\n", - tc->getCpuPtr()->name(), cycles, resume); + cpu->name(), cycles, resume); tc->suspend(); if (tc->getKernelStats()) @@ -153,8 +157,7 @@ m5exit(ThreadContext *tc, Tick delay) { Tick when = curTick + delay * SimClock::Int::ns; - Event *event = new SimLoopExitEvent("m5_exit instruction encountered", 0); - mainEventQueue.schedule(event, when); + exitSimLoop("m5_exit instruction encountered", 0, when); } #if FULL_SYSTEM @@ -271,8 +274,7 @@ Tick when = curTick + delay * SimClock::Int::ns; Tick repeat = period * SimClock::Int::ns; - Event *event = new SimLoopExitEvent("checkpoint", 0, repeat); - mainEventQueue.schedule(event, when); + exitSimLoop("checkpoint", 0, when, repeat); } #if FULL_SYSTEM diff -r a4503b22708a -r 62467854ead1 src/sim/sim_events.cc --- a/src/sim/sim_events.cc Tue Jan 04 14:41:50 2011 -0800 +++ b/src/sim/sim_events.cc Tue Jan 04 14:41:59 2011 -0800 @@ -78,10 +78,10 @@ } void -exitSimLoop(const std::string &message, int exit_code) +exitSimLoop(const std::string &message, int exit_code, Tick when, Tick repeat) { - Event *event = new SimLoopExitEvent(message, exit_code); - mainEventQueue.schedule(event, curTick); + Event *event = new SimLoopExitEvent(message, exit_code, repeat); + mainEventQueue.schedule(event, when); } CountedDrainEvent::CountedDrainEvent() diff -r a4503b22708a -r 62467854ead1 src/sim/sim_exit.hh --- a/src/sim/sim_exit.hh Tue Jan 04 14:41:50 2011 -0800 +++ b/src/sim/sim_exit.hh Tue Jan 04 14:41:59 2011 -0800 @@ -35,6 +35,7 @@ #include #include "base/types.hh" +#include "sim/core.hh" // forward declaration class Callback; @@ -49,6 +50,7 @@ /// Python) at the end of the current cycle (curTick). The message /// and exit_code parameters are saved in the SimLoopExitEvent to /// indicate why the exit occurred. -void exitSimLoop(const std::string &message, int exit_code = 0); +void exitSimLoop(const std::string &message, int exit_code = 0, + Tick when = curTick, Tick repeat = 0); #endif // __SIM_EXIT_HH__