• Nicholas Piggin's avatar
    powerpc/64: Move paca allocation to early_setup() · dc222fa7
    Nicholas Piggin authored
    The early paca and boot cpuid dance is complicated and currently does
    not quite work as expected for boot cpuid != 0 cases.
    
    early_init_devtree() currently allocates the paca_ptrs and boot cpuid
    paca, but until that returns and early_setup() calls setup_paca(), this
    thread is currently still executing with smp_processor_id() == 0.
    
    One problem this causes is the paca_ptrs[smp_processor_id()] pointer is
    poisoned, so valid_emergency_stack() (any backtrace) and any similar
    users will crash.
    
    Another is that the hardware id which is set here will not be returned
    by get_hard_smp_processor_id(smp_processor_id()), but it would work
    correctly for boot_cpuid == 0, which could lead to difficult to
    reproduce or find bugs. The hard id does not seem to be used by the rest
    of early_init_devtree(), it just looks like all this code might have
    been put here to allocate somewhere to store boot CPU hardware id while
    scanning the devtree.
    
    Rearrange things so the hwid is put in a global variable like
    boot_cpuid, and do all the paca allocation and boot paca setup in the
    64-bit early_setup() after we have everything ready to go.
    
    The paca_ptrs[0] re-poisoning code in early_setup does not seem to have
    ever worked, because paca_ptrs[0] was never not-poisoned when boot_cpuid
    is not 0.
    Signed-off-by: default avatarNicholas Piggin <npiggin@gmail.com>
    [mpe: Fix build error on 32-bit]
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20221216115930.2667772-4-npiggin@gmail.com
    dc222fa7
setup-common.c 24.6 KB