Sampling fixes related to the quiesce event.
authorKevin Lim <ktlim@umich.edu>
Tue, 16 May 2006 17:51:18 +0000 (13:51 -0400)
committerKevin Lim <ktlim@umich.edu>
Tue, 16 May 2006 17:51:18 +0000 (13:51 -0400)
cpu/cpu_exec_context.cc:
cpu/cpu_exec_context.hh:
    Sampling fixes.  The CPU models may switch during a quiesce period, so it needs to be sure to wake up the right XC.
cpu/exec_context.hh:
    Return the EndQuiesceEvent specifically.
sim/pseudo_inst.cc:
    Return the EndQuiesceEvent specifically for sampling.

--HG--
extra : convert_revision : f9aa1fc8d4db8058f05319cb6a3d4605ce93b4c8

cpu/cpu_exec_context.cc
cpu/cpu_exec_context.hh
cpu/exec_context.hh
sim/pseudo_inst.cc

index e15ba7e6664c974c98a8b1b820a51d23c3e5200b..3d047856a513de7dfcfc6f1a9b7012469fb86e88 100644 (file)
@@ -159,6 +159,16 @@ CPUExecContext::takeOverFrom(ExecContext *oldContext)
     func_exe_inst = oldContext->readFuncExeInst();
 #endif
 
+    EndQuiesceEvent *quiesce = oldContext->getQuiesceEvent();
+    if (quiesce) {
+        // Point the quiesce event's XC at this XC so that it wakes up
+        // the proper CPU.
+        quiesce->xc = proxy;
+    }
+    if (quiesceEvent) {
+        quiesceEvent->xc = proxy;
+    }
+
     storeCondFailures = 0;
 
     oldContext->setStatus(ExecContext::Unallocated);
index 40153ff08558108cf48a4f7a35d6094eb11a77fe..cac0069256e26a40b8e0c59b05e43db381377522 100644 (file)
@@ -135,9 +135,9 @@ class CPUExecContext
     Addr profilePC;
     void dumpFuncProfile();
 
-    Event *quiesceEvent;
+    EndQuiesceEvent *quiesceEvent;
 
-    Event *getQuiesceEvent() { return quiesceEvent; }
+    EndQuiesceEvent *getQuiesceEvent() { return quiesceEvent; }
 
     Tick readLastActivate() { return lastActivate; }
 
index 039b045274ef5bb555d63a4a71dcea754ab90607..7bd7d5682485bb42611764b482f878d4a9d50434 100644 (file)
@@ -42,6 +42,7 @@
 class AlphaDTB;
 class AlphaITB;
 class BaseCPU;
+class EndQuiesceEvent;
 class Event;
 class FunctionalMemory;
 class PhysicalMemory;
@@ -130,7 +131,7 @@ class ExecContext
     virtual void unserialize(Checkpoint *cp, const std::string &section) = 0;
 
 #if FULL_SYSTEM
-    virtual Event *getQuiesceEvent() = 0;
+    virtual EndQuiesceEvent *getQuiesceEvent() = 0;
 
     // Not necessarily the best location for these...
     // Having an extra function just to read these is obnoxious
@@ -277,7 +278,7 @@ class ProxyExecContext : public ExecContext
     { actualXC->unserialize(cp, section); }
 
 #if FULL_SYSTEM
-    Event *getQuiesceEvent() { return actualXC->getQuiesceEvent(); }
+    EndQuiesceEvent *getQuiesceEvent() { return actualXC->getQuiesceEvent(); }
 
     Tick readLastActivate() { return actualXC->readLastActivate(); }
     Tick readLastSuspend() { return actualXC->readLastSuspend(); }
index e475006e75711abe1c40f71fdf170e15f08c3115..4d9541b58a9bdeeee84cbe586312f0dc9b63db16 100644 (file)
@@ -38,6 +38,7 @@
 #include "cpu/base.hh"
 #include "cpu/sampler/sampler.hh"
 #include "cpu/exec_context.hh"
+#include "cpu/quiesce_event.hh"
 #include "kern/kernel_stats.hh"
 #include "sim/param.hh"
 #include "sim/serialize.hh"
@@ -83,7 +84,7 @@ namespace AlphaPseudo
         if (!doQuiesce || ns == 0)
             return;
 
-        Event *quiesceEvent = xc->getQuiesceEvent();
+        EndQuiesceEvent *quiesceEvent = xc->getQuiesceEvent();
 
         if (quiesceEvent->scheduled())
             quiesceEvent->reschedule(curTick + Clock::Int::ns * ns);
@@ -100,7 +101,7 @@ namespace AlphaPseudo
         if (!doQuiesce || cycles == 0)
             return;
 
-        Event *quiesceEvent = xc->getQuiesceEvent();
+        EndQuiesceEvent *quiesceEvent = xc->getQuiesceEvent();
 
         if (quiesceEvent->scheduled())
             quiesceEvent->reschedule(curTick +