33.10.3.3. ARM PSCI
In QEMU, CPU 1 starts in a halted state. This can be observed from GDB, where:
info threads
shows something like:
* 1 Thread 1 (CPU#0 [running]) lkmc_start 2 Thread 2 (CPU#1 [halted ]) lkmc_start
To wake up CPU 1 on QEMU, we must use the Power State Coordination Interface (PSCI) which is documented at: https://developer.arm.com/docs/den0022/latest/arm-power-state-coordination-interface-platform-design-document.
This interface uses HVC calls, and the calling convention is documented at "SMC CALLING CONVENTION" https://developer.arm.com/docs/den0028/latest.
If we boot the Linux kernel on QEMU and dump the auto-generated device tree, we observe that it contains the address of the PSCI CPU_ON call:
psci { method = "hvc"; compatible = "arm,psci-0.2", "arm,psci"; cpu_on = <0xc4000003>; migrate = <0xc4000005>; cpu_suspend = <0xc4000001>; cpu_off = <0x84000002>; };
The Linux kernel wakes up the secondary cores in this exact same way at: https://github.com/torvalds/linux/blob/v4.19/drivers/firmware/psci.c#L122 We first actually got it working here by grepping the kernel and step debugging that call :-)
In gem5, CPU 1 starts woken up from the start, so PSCI is not needed. TODO gem5 actually blows up if we try to do the HVC call, understand why.