Switch out fixes for CPUs.
authorKevin Lim <ktlim@umich.edu>
Fri, 7 Jul 2006 19:38:15 +0000 (15:38 -0400)
committerKevin Lim <ktlim@umich.edu>
Fri, 7 Jul 2006 19:38:15 +0000 (15:38 -0400)
src/cpu/o3/cpu.cc:
    Fix up keeping proper state when switched out and drained.
src/cpu/simple/timing.cc:
src/cpu/simple/timing.hh:
    Keep track of the event we use to schedule fetch initially and upon resume.  We may have to cancel the event if the CPU is switched out.

--HG--
extra : convert_revision : 60a2a1bd2cdc67bd53ca4a67aa77166c826a4c8c

src/cpu/o3/cpu.cc
src/cpu/simple/timing.cc
src/cpu/simple/timing.hh

index f345fe82dce3c5714ec67e1afd98dc89e531afae..ceba74ef3ce8668940629360953eeaf79a00b986 100644 (file)
@@ -400,7 +400,8 @@ FullO3CPU<Impl>::tick()
     }
 
     if (!tickEvent.scheduled()) {
-        if (_status == SwitchedOut) {
+        if (_status == SwitchedOut ||
+            getState() == SimObject::DrainedTiming) {
             // increment stat
             lastRunningCycle = curTick;
         } else if (!activityRec.active()) {
@@ -793,6 +794,7 @@ FullO3CPU<Impl>::resume()
     if (!tickEvent.scheduled())
         tickEvent.schedule(curTick);
     _status = Running;
+    changeState(SimObject::Timing);
 }
 
 template <class Impl>
index 6774d79a9739eaad2477c6e38cefe2ecc14c2fc5..eb5895949621839ca1e55f8517146fd80676c8c8 100644 (file)
@@ -89,6 +89,7 @@ TimingSimpleCPU::TimingSimpleCPU(Params *p)
     _status = Idle;
     ifetch_pkt = dcache_pkt = NULL;
     drainEvent = NULL;
+    fetchEvent = NULL;
     state = SimObject::Timing;
 }
 
@@ -130,9 +131,15 @@ void
 TimingSimpleCPU::resume()
 {
     if (_status != SwitchedOut && _status != Idle) {
-        Event *e =
-            new EventWrapper<TimingSimpleCPU, &TimingSimpleCPU::fetch>(this, true);
-        e->schedule(curTick);
+        // Delete the old event if it existed.
+        if (fetchEvent) {
+            assert(!fetchEvent->scheduled());
+            delete fetchEvent;
+        }
+
+        fetchEvent =
+            new EventWrapper<TimingSimpleCPU, &TimingSimpleCPU::fetch>(this, false);
+        fetchEvent->schedule(curTick);
     }
 }
 
@@ -147,6 +154,11 @@ TimingSimpleCPU::switchOut()
 {
     assert(status() == Running || status() == Idle);
     _status = SwitchedOut;
+
+    // If we've been scheduled to resume but are then told to switch out,
+    // we'll need to cancel it.
+    if (fetchEvent && fetchEvent->scheduled())
+        fetchEvent->deschedule();
 }
 
 
@@ -178,9 +190,9 @@ TimingSimpleCPU::activateContext(int thread_num, int delay)
     notIdleFraction++;
     _status = Running;
     // kick things off by initiating the fetch of the next instruction
-    Event *e =
-        new EventWrapper<TimingSimpleCPU, &TimingSimpleCPU::fetch>(this, true);
-    e->schedule(curTick + cycles(delay));
+    fetchEvent =
+        new EventWrapper<TimingSimpleCPU, &TimingSimpleCPU::fetch>(this, false);
+    fetchEvent->schedule(curTick + cycles(delay));
 }
 
 
index c360e553e46a85ec7ae22e7f9d56f4b0a55be6a5..f9bc0f352cd04af4423da74fa35e03aa672abb5b 100644 (file)
@@ -66,6 +66,8 @@ class TimingSimpleCPU : public BaseSimpleCPU
 
     Event *drainEvent;
 
+    Event *fetchEvent;
+
   private:
 
     class CpuPort : public Port