cpu: Fix timing CPU drain check
authorAndreas Hansson <andreas.hansson@arm.com>
Mon, 19 Aug 2013 07:52:30 +0000 (03:52 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Mon, 19 Aug 2013 07:52:30 +0000 (03:52 -0400)
This patch modifies the SimpleTimingCPU drain check to also consider
the fetch event. Previously, there was an assumption that there is
never a fetch event scheduled if the CPU is not executing
microcode. However, when a context is activated, a fetch even is
scheduled, and microPC() is zero.

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

index 87a5245b2b98837fb250b29257814f3fff5318bd..075d05d810bc2bcdb8a53bba1cf586137faa39c3 100644 (file)
@@ -109,7 +109,6 @@ TimingSimpleCPU::drain(DrainManager *drain_manager)
 
     if (_status == Idle ||
         (_status == BaseSimpleCPU::Running && isDrained())) {
-        assert(!fetchEvent.scheduled());
         DPRINTF(Drain, "No need to drain.\n");
         return 0;
     } else {
index cab2057ea5665f82e036e4671832344d4579fd85..52807ba086b3cbdb08c99c33ad292ec781606d1a 100644 (file)
@@ -320,11 +320,14 @@ class TimingSimpleCPU : public BaseSimpleCPU
      *     of a gem5 microcode sequence.
      *
      * <li>Stay at PC is true.
+     *
+     * <li>A fetch event is scheduled. Normally this would never be the
+           case with microPC() == 0, but right after a context is
+           activated it can happen.
      * </ul>
      */
     bool isDrained() {
-        return microPC() == 0 &&
-            !stayAtPC;
+        return microPC() == 0 && !stayAtPC && !fetchEvent.scheduled();
     }
 
     /**