cpu: Only activate thread 0 in Minor if the CPU is active
authorAndreas Sandberg <andreas.sandberg@arm.com>
Thu, 30 Jul 2015 09:15:50 +0000 (10:15 +0100)
committerAndreas Sandberg <andreas.sandberg@arm.com>
Thu, 30 Jul 2015 09:15:50 +0000 (10:15 +0100)
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.

src/cpu/minor/cpu.cc

index aefd5599d557c74178678f304431b881eae146f2..b49c1ecdac65b02b2fe03406e7e3931be33c1d15 100644 (file)
@@ -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