summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Sandberg <andreas.sandberg@arm.com>2015-07-31 17:04:59 +0100
committerAndreas Sandberg <andreas.sandberg@arm.com>2015-07-31 17:04:59 +0100
commitf73b05431a55e25d831c4bc8847f99f39a8d6b7d (patch)
tree4bd49a3accd6077e41ec87107cddcbed16ffe38c
parentc50e4290015e9be52206e021fabb4c44a3d9afe1 (diff)
downloadgem5-f73b05431a55e25d831c4bc8847f99f39a8d6b7d.tar.xz
cpu: Fix Minor drain issues when switched out
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.
-rw-r--r--src/cpu/minor/cpu.cc5
1 files changed, 5 insertions, 0 deletions
diff --git a/src/cpu/minor/cpu.cc b/src/cpu/minor/cpu.cc
index b49c1ecda..51a3f3ae8 100644
--- a/src/cpu/minor/cpu.cc
+++ b/src/cpu/minor/cpu.cc
@@ -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.