summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndreas Sandberg <andreas.sandberg@arm.com>2015-07-30 10:15:50 +0100
committerAndreas Sandberg <andreas.sandberg@arm.com>2015-07-30 10:15:50 +0100
commitff8195235e647fbe5e303a1da391544fc436ca47 (patch)
tree60f6e35f145b56e48abbe139ab3aca4bd7b6cb1d /src
parent473a0dcc63135a32cc5f736c14a3142a34b4352e (diff)
downloadgem5-ff8195235e647fbe5e303a1da391544fc436ca47.tar.xz
cpu: Only activate thread 0 in Minor if the CPU is active
Minor currently activates thread 0 in startup() to work around an issue where activateContext() is called from LiveProcess before the process entry point is known. When activateContext() is called, Minor creates a branch instruction to the process's entry point. The first time it is called, the branch points to an undefined location (0). The call in startup() updates the branch to point to the actual entry point. When instantiating a switched out Minor CPU, it still tries to activate thread 0. This is clearly incorrect since a switched out CPU can't have any active threads. This changeset adds a check to ensure that the thread is active before reactivating it.
Diffstat (limited to 'src')
-rw-r--r--src/cpu/minor/cpu.cc9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/cpu/minor/cpu.cc b/src/cpu/minor/cpu.cc
index aefd5599d..b49c1ecda 100644
--- a/src/cpu/minor/cpu.cc
+++ b/src/cpu/minor/cpu.cc
@@ -189,8 +189,13 @@ MinorCPU::startup()
for (auto i = threads.begin(); i != threads.end(); i ++)
(*i)->startup();
- /* CPU state setup, activate initial context */
- activateContext(0);
+ /* Workaround cases in SE mode where a thread is activated with an
+ * incorrect PC that is updated after the call to activate. This
+ * causes problems for Minor since it instantiates a virtual
+ * branch instruction when activateContext() is called which ends
+ * up pointing to an illegal address. */
+ if (threads[0]->status() == ThreadContext::Active)
+ activateContext(0);
}
DrainState