# Linux Kernel Module Cheat

##### 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.

Bibliography: https://stackoverflow.com/questions/20055754/arm-start-wakeup-bringup-the-other-cpu-cores-aps-and-pass-execution-start-addre/53473447#53473447