pseudoinst: get rid of mainEventQueue references.
authorSteve Reinhardt <steve.reinhardt@amd.com>
Sat, 8 Jan 2011 05:50:29 +0000 (21:50 -0800)
committerSteve Reinhardt <steve.reinhardt@amd.com>
Sat, 8 Jan 2011 05:50:29 +0000 (21:50 -0800)
Avoid direct references to mainEventQueue in pseudo-insts
by indirecting through associated CPU object.
Made exitSimLoop() more flexible to enable some of these.

src/sim/pseudo_inst.cc
src/sim/sim_events.cc
src/sim/sim_exit.hh

index 683397116f591f7a4ee4d9314cff4a9fb63fcdba..49298c6a9e53f8ca0a75d9b555ebfc7371e1de55 100644 (file)
@@ -88,17 +88,19 @@ quiesce(ThreadContext *tc)
 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 @@ quiesceNs(ThreadContext *tc, uint64_t ns)
 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 @@ void
 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 @@ m5checkpoint(ThreadContext *tc, Tick delay, Tick period)
     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
index 490dc93fa1614b9a2df84fd1efefd8e8fcb33731..8c706382d5f263a7eb207ae31b23fec17044a055 100644 (file)
@@ -78,10 +78,10 @@ SimLoopExitEvent::description() const
 }
 
 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()
index 11750293228ef20d2855cdb134636ceb72ae2b19..589f6993e28e061dc9a613c7d47172d2f36b959e 100644 (file)
@@ -35,6 +35,7 @@
 #include <string>
 
 #include "base/types.hh"
+#include "sim/core.hh"
 
 // forward declaration
 class Callback;
@@ -49,6 +50,7 @@ void registerExitCallback(Callback *);
 /// 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__