sim,cpu: Move the call to initCPU into System.
authorGabe Black <gabeblack@google.com>
Wed, 29 Jan 2020 11:22:05 +0000 (03:22 -0800)
committerGabe Black <gabeblack@google.com>
Sat, 1 Feb 2020 12:31:14 +0000 (12:31 +0000)
The call to initCPU was moved into initState in the base CPU class
since it should only really be called when starting a simulation
fresh. Otherwise checkpointed state will be loaded over the state of
the CPU anyway, so there's no reason to set up anything else.

Unfortunately that made it possible for the System level initialization
and the CPU initialization to happen out of order, effectively letting
initCPU clobber the state the System might have set up to prepare for
executing a kernel for instance.

To work around that issue, the call was moved to init which would
necessarily happen before initState, restoring the original ordering.

This change moves the change *back* into initState, but of the System
class instead of the CPU class. This makes it possible to guarantee
that OS initialization happens after initCPU since that's also done
by System subclasses, and they control when they call initCPU of the
base class.

This also slightly simmplifies when initCPU is called since we
shouldn't need to check whether a context is switched out or not. If
it's registered with the System object, then it should be in a
currently swapped in CPU.

This also puts the initCPU and startupCPU calls right next to each
other. A future change will take advantage of that and merge the
calls together.

Also, because there are already ISA specific subclasses of System
which already have specialized versions of initState, we should be
able to move the code in initCPU and startupCPU directly into those
subclasses. That will give those subclasses more flexibilty if, for
instance, they want all CPUs to start running in the BIOS like they
would on a real system, or if they want only the BSP to be active
as if the BIOS had already paused the APs before passing control to
a bootloader or OS.

This will also remove another two TheISA:: style functions, reducing
the number of global dependencies on a single ISA.

Change-Id: Ic56924660a5b575a07844a198f69a0e7fa212b52
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/24903
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/arch/null/utility.hh
src/cpu/base.cc
src/sim/system.cc

index cf65ef5cd6bc04e259b309b5c0c1be24a1d9c409..d92e55221e7b60b7037b1265fab21192a7561dba 100644 (file)
@@ -48,6 +48,7 @@ namespace NullISA {
 inline uint64_t getArgument(ThreadContext *tc, int &number, uint16_t size,
                             bool fp) { return 0; }
 
+inline void initCPU(ThreadContext *tc, int cpuId) {}
 inline void startupCPU(ThreadContext *tc, int cpuId) {}
 
 }
index 80726ac2b1e24881605c33bfddf12a1fd67be1e3..ac0c7ac5b75f30c5a3cd78fcdaf703cd76a87801 100644 (file)
@@ -318,12 +318,6 @@ BaseCPU::init()
 
         verifyMemoryMode();
     }
-
-    //These calls eventually need to be moved to initState
-    if (FullSystem && !params()->switched_out) {
-        for (auto *tc: threadContexts)
-            TheISA::initCPU(tc, tc->contextId());
-    }
 }
 
 void
index 739b42278c7c73fbf9fde5db9dba90626f79f257..e59c4047798919dc793e197e8cc220e5c242545d 100644 (file)
@@ -349,8 +349,10 @@ void
 System::initState()
 {
     if (FullSystem) {
-        for (int i = 0; i < threadContexts.size(); i++)
-            TheISA::startupCPU(threadContexts[i], i);
+        for (auto *tc: threadContexts) {
+            TheISA::initCPU(tc, tc->contextId());
+            TheISA::startupCPU(tc, tc->contextId());
+        }
         // Moved from the constructor to here since it relies on the
         // address map being resolved in the interconnect
         /**