aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel/head_64.S
diff options
context:
space:
mode:
authorAnton Blanchard <anton@samba.org>2014-03-11 11:54:06 +1100
committerAnton Blanchard <anton@samba.org>2014-04-23 10:05:26 +1000
commit2751b628c97e66e61f482935ca59148751972941 (patch)
tree86ef576395f448da30512daea224c1f1bf258807 /arch/powerpc/kernel/head_64.S
parentpowerpc/tracing: TRACE_WITH_FRAME_BUFFER creates invalid stack frames (diff)
downloadlinux-dev-2751b628c97e66e61f482935ca59148751972941.tar.xz
linux-dev-2751b628c97e66e61f482935ca59148751972941.zip
powerpc: Fix SMP issues with ppc64le ABIv2
There is no need to put a function descriptor in __secondary_hold_spinloop. Use ppc_function_entry to get the instruction address and put it in __secondary_hold_spinloop instead. Also fix an issue where we assumed cur_cpu_spec held a function descriptor. Signed-off-by: Anton Blanchard <anton@samba.org>
Diffstat (limited to '')
-rw-r--r--arch/powerpc/kernel/head_64.S18
1 files changed, 8 insertions, 10 deletions
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S
index 97329a19c76b..a95145d7f61b 100644
--- a/arch/powerpc/kernel/head_64.S
+++ b/arch/powerpc/kernel/head_64.S
@@ -76,10 +76,9 @@ END_FTR_SECTION(0, 1)
/* Catch branch to 0 in real mode */
trap
- /* Secondary processors spin on this value until it becomes nonzero.
- * When it does it contains the real address of the descriptor
- * of the function that the cpu should jump to to continue
- * initialization.
+ /* Secondary processors spin on this value until it becomes non-zero.
+ * When non-zero, it contains the real address of the function the cpu
+ * should jump to.
*/
.balign 8
.globl __secondary_hold_spinloop
@@ -148,9 +147,6 @@ __secondary_hold:
#ifdef CONFIG_PPC_BOOK3E
tovirt(r12,r12)
#endif
-#if !defined(_CALL_ELF) || _CALL_ELF != 2
- ld r12,0(r12) /* deref function descriptor */
-#endif
mtctr r12
mr r3,r24
/*
@@ -266,10 +262,12 @@ generic_secondary_common_init:
/* See if we need to call a cpu state restore handler */
LOAD_REG_ADDR(r23, cur_cpu_spec)
ld r23,0(r23)
- ld r23,CPU_SPEC_RESTORE(r23)
- cmpdi 0,r23,0
+ ld r12,CPU_SPEC_RESTORE(r23)
+ cmpdi 0,r12,0
beq 3f
- ld r12,0(r23)
+#if !defined(_CALL_ELF) || _CALL_ELF != 2
+ ld r12,0(r12)
+#endif
mtctr r12
bctrl