• Nicholas Piggin's avatar
    powerpc/64: Fix task_cpu in early boot when booting non-zero cpuid · 9fa24404
    Nicholas Piggin authored
    powerpc/64 can boot on a non-zero SMP processor id. Initially, the boot
    CPU is said to be "assumed to be 0" until early_init_devtree() discovers
    the id from the device tree. That is not a good description because the
    assumption can be wrong and that has to be handled, the better
    description is that 0 is used as a placeholder, and things are fixed
    after the real id is discovered.
    
    smp_processor_id() is set to the boot cpuid, but task_cpu(current) is
    not, which causes the smp_processor_id() == task_cpu(current) invariant
    to be broken until init_idle() in sched_init().
    
    This is quite fragile and could lead to subtle bugs in future. One bug
    is that validate_sp_size uses task_cpu() to get the process stack, so
    any stack trace from the booting CPU between early_init_devtree()
    and sched_init() will have problems. Early on paca_ptrs[0] will be
    poisoned, so that can cause machine checks dereferencing that memory
    in real mode. Later, validating the current stack pointer against the
    idle task of a different secondary will probably cause no stack trace
    to be printed.
    
    Fix this by setting thread_info->cpu right after smp_processor_id() is
    set to the boot cpuid.
    Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
    [mpe: Fix SMP=n build as reported by sfr]
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20221216115930.2667772-3-npiggin@gmail.com
    9fa24404
setup_64.c 25 KB