• Jordan Niethe's avatar
    powerpc/64: Set up a kernel stack for secondaries before cpu_restore() · 3c0b976b
    Jordan Niethe authored
    Currently in generic_secondary_smp_init(), cur_cpu_spec->cpu_restore()
    is called before a stack has been set up in r1. This was previously fine
    as the cpu_restore() functions were implemented in assembly and did not
    use a stack. However commit 5a61ef74 ("powerpc/64s: Support new
    device tree binding for discovering CPU features") used
    __restore_cpu_cpufeatures() as the cpu_restore() function for a
    device-tree features based cputable entry. This is a C function and
    hence uses a stack in r1.
    
    generic_secondary_smp_init() is entered on the secondary cpus via the
    primary cpu using the OPAL call opal_start_cpu(). In OPAL, each hardware
    thread has its own stack. The OPAL call is ran in the primary's hardware
    thread. During the call, a job is scheduled on a secondary cpu that will
    start executing at the address of generic_secondary_smp_init().  Hence
    the value that will be left in r1 when the secondary cpu enters the
    kernel is part of that secondary cpu's individual OPAL stack. This means
    that __restore_cpu_cpufeatures() will write to that OPAL stack. This is
    not horribly bad as each hardware thread has its own stack and the call
    that enters the kernel from OPAL never returns, but it is still wrong
    and should be corrected.
    
    Create the temp kernel stack before calling cpu_restore().
    
    As noted by mpe, for a kexec boot, the secondary CPUs are released from
    the spin loop at address 0x60 by smp_release_cpus() and then jump to
    generic_secondary_smp_init(). The call to smp_release_cpus() is in
    setup_arch(), and it comes before the call to emergency_stack_init().
    emergency_stack_init() allocates an emergency stack in the PACA for each
    CPU.  This address in the PACA is what is used to set up the temp kernel
    stack in generic_secondary_smp_init(). Move releasing the secondary CPUs
    to after the PACAs have been allocated an emergency stack, otherwise the
    PACA stack pointer will contain garbage and hence the temp kernel stack
    created from it will be broken.
    
    Fixes: 5a61ef74 ("powerpc/64s: Support new device tree binding for discovering CPU features")
    Signed-off-by: default avatarJordan Niethe <jniethe5@gmail.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/20201014072837.24539-1-jniethe5@gmail.com
    3c0b976b
head_64.S 25 KB