• Suzuki K Poulose's avatar
    arm64: Handle early CPU boot failures · bb905274
    Suzuki K Poulose authored
    A secondary CPU could fail to come online due to insufficient
    capabilities and could simply die or loop in the kernel.
    e.g, a CPU with no support for the selected kernel PAGE_SIZE
    loops in kernel with MMU turned off.
    or a hotplugged CPU which doesn't have one of the advertised
    system capability will die during the activation.
    There is no way to synchronise the status of the failing CPU
    back to the master. This patch solves the issue by adding a
    field to the secondary_data which can be updated by the failing
    CPU. If the secondary CPU fails even before turning the MMU on,
    it updates the status in a special variable reserved in the head.txt
    section to make sure that the update can be cache invalidated safely
    without possible sharing of cache write back granule.
    Here are the possible states :
     -1. CPU_MMU_OFF - Initial value set by the master CPU, this value
    indicates that the CPU could not turn the MMU on, hence the status
    could not be reliably updated in the secondary_data. Instead, the
    CPU has updated the status @ __early_cpu_boot_status.
     0. CPU_BOOT_SUCCESS - CPU has booted successfully.
     1. CPU_KILL_ME - CPU has invoked cpu_ops->die, indicating the
    master CPU to synchronise by issuing a cpu_ops->cpu_kill.
     2. CPU_STUCK_IN_KERNEL - CPU couldn't invoke die(), instead is
    looping in the kernel. This information could be used by say,
    kexec to check if it is really safe to do a kexec reboot.
     3. CPU_PANIC_KERNEL - CPU detected some serious issues which
    requires kernel to crash immediately. The secondary CPU cannot
    call panic() until it has initialised the GIC. This flag can
    be used to instruct the master to do so.
    Cc: Mark Rutland <mark.rutland@arm.com>
    Acked-by: default avatarWill Deacon <will.deacon@arm.com>
    Signed-off-by: default avatarSuzuki K Poulose <suzuki.poulose@arm.com>
    [catalin.marinas@arm.com: conflict resolution]
    [catalin.marinas@arm.com: converted "status" from int to long]
    [catalin.marinas@arm.com: updated update_early_cpu_boot_status to use str_l]
    Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
head.S 21.4 KB