summaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/head_32.S
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt2011-02-10 08:45:24 +0100
committerBenjamin Herrenschmidt2011-04-01 06:37:09 +0200
commitfa3f82c8bb7acbe049ea71f258b3ae0a33d9d40b (patch)
tree9c5e71195c7948c139ea37d8d0e0287f062910f9 /arch/powerpc/kernel/head_32.S
parentpowerpc: Make decrementer interrupt robust against offlined CPUs (diff)
downloadkernel-qcow2-linux-fa3f82c8bb7acbe049ea71f258b3ae0a33d9d40b.tar.gz
kernel-qcow2-linux-fa3f82c8bb7acbe049ea71f258b3ae0a33d9d40b.tar.xz
kernel-qcow2-linux-fa3f82c8bb7acbe049ea71f258b3ae0a33d9d40b.zip
powerpc/smp: soft-replugged CPUs must go back to start_secondary
Various thing are torn down when a CPU is hot-unplugged. That CPU is expected to go back to start_secondary when re-plugged to re initialize everything, such as clock sources, maps, ... Some implementations just return from cpu_die() callback in the idle loop when the CPU is "re-plugged". This is not enough. We fix it using a little asm trampoline which resets the stack and calls back into start_secondary as if we were all fresh from boot. The trampoline already existed on ppc64, but we add it for ppc32 Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/kernel/head_32.S')
-rw-r--r--arch/powerpc/kernel/head_32.S9
1 files changed, 9 insertions, 0 deletions
diff --git a/arch/powerpc/kernel/head_32.S b/arch/powerpc/kernel/head_32.S
index 98c4b29a56f4..c5c24beb8387 100644
--- a/arch/powerpc/kernel/head_32.S
+++ b/arch/powerpc/kernel/head_32.S
@@ -890,6 +890,15 @@ __secondary_start:
mtspr SPRN_SRR1,r4
SYNC
RFI
+
+_GLOBAL(start_secondary_resume)
+ /* Reset stack */
+ rlwinm r1,r1,0,0,(31-THREAD_SHIFT) /* current_thread_info() */
+ addi r1,r1,THREAD_SIZE-STACK_FRAME_OVERHEAD
+ li r3,0
+ std r3,0(r1) /* Zero the stack frame pointer */
+ bl start_secondary
+ b .
#endif /* CONFIG_SMP */
#ifdef CONFIG_KVM_BOOK3S_HANDLER