cpu: Fix Minor drain issues when switched out
authorAndreas Sandberg <andreas.sandberg@arm.com>
Fri, 31 Jul 2015 16:04:59 +0000 (17:04 +0100)
committerAndreas Sandberg <andreas.sandberg@arm.com>
Fri, 31 Jul 2015 16:04:59 +0000 (17:04 +0100)
The Minor CPU currently doesn't drain properly when it is switched
out. This happens because Fetch 1 expects to be in the FetchHalted
state when it is drained. However, because the CPU is switched out, it
is stuck in the FetchWaitingForPC state. Fix this by ignoring drain
requests and returning DrainState::Drained from MinorCPU::drain() if
the CPU is switched out. This is always safe since a switched out CPU,
by definition, doesn't have any instructions in flight.

src/cpu/minor/cpu.cc

index b49c1ecdac65b02b2fe03406e7e3931be33c1d15..51a3f3ae87c21353088d3c17fd3229eaa781f216 100644 (file)
@@ -201,6 +201,11 @@ MinorCPU::startup()
 DrainState
 MinorCPU::drain()
 {
+    if (switchedOut()) {
+        DPRINTF(Drain, "Minor CPU switched out, draining not needed.\n");
+        return DrainState::Drained;
+    }
+
     DPRINTF(Drain, "MinorCPU drain\n");
 
     /* Need to suspend all threads and wait for Execute to idle.