aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMahesh Salgaonkar <mahesh@linux.vnet.ibm.com>2016-08-05 09:43:12 -0400
committerMichael Ellerman <mpe@ellerman.id.au>2016-08-09 00:50:19 -0400
commite325d76f8bd2d222a1f577aba00dfb43cece4cbc (patch)
tree836a040e5903fd87956f89a1368fc16e7af2c5ca
parent4d9021957b5218310e28767f25551ca8f5eac797 (diff)
powerpc/powernv: Load correct TOC pointer while waking up from winkle.
The function pnv_restore_hyp_resource() loads the TOC into r2 from the invalid PACA pointer before fixing r13 value. This do not affect POWER ISA 3.0 but it does have an impact on POWER ISA 2.07 or less leading CPU to get stuck forever. login: [ 471.830433] Processor 120 is stuck. This can be easily reproducible using following steps: - Turn off SMT $ ppc64_cpu --smt=off - offline/online any online cpu (Thread 0 of any core which is online) $ echo 0 > /sys/devices/system/cpu/cpu<num>/online $ echo 1 > /sys/devices/system/cpu/cpu<num>/online For POWER ISA 2.07 or less, the last bit of HSPRG0 is set indicating that thread is waking up from winkle. Hence, the last bit of HSPRG0(r13) needs to be clear before accessing it as PACA to avoid loading invalid values from invalid PACA pointer. Fix this by loading TOC after r13 register is corrected. Fixes: bcef83a00dc4 ("powerpc/powernv: Add platform support for stop instruction") Signed-off-by: Mahesh Salgaonkar <mahesh@linux.vnet.ibm.com> Acked-by: Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
-rw-r--r--arch/powerpc/kernel/idle_book3s.S5
1 files changed, 4 insertions, 1 deletions
diff --git a/arch/powerpc/kernel/idle_book3s.S b/arch/powerpc/kernel/idle_book3s.S
index ba79d15f4ddd..07a330ed7022 100644
--- a/arch/powerpc/kernel/idle_book3s.S
+++ b/arch/powerpc/kernel/idle_book3s.S
@@ -363,8 +363,8 @@ _GLOBAL(power9_idle_stop)
363 * cr3 - set to gt if waking up with partial/complete hypervisor state loss 363 * cr3 - set to gt if waking up with partial/complete hypervisor state loss
364 */ 364 */
365_GLOBAL(pnv_restore_hyp_resource) 365_GLOBAL(pnv_restore_hyp_resource)
366 ld r2,PACATOC(r13);
367BEGIN_FTR_SECTION 366BEGIN_FTR_SECTION
367 ld r2,PACATOC(r13);
368 /* 368 /*
369 * POWER ISA 3. Use PSSCR to determine if we 369 * POWER ISA 3. Use PSSCR to determine if we
370 * are waking up from deep idle state 370 * are waking up from deep idle state
@@ -395,6 +395,9 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300)
395 */ 395 */
396 clrldi r5,r13,63 396 clrldi r5,r13,63
397 clrrdi r13,r13,1 397 clrrdi r13,r13,1
398
399 /* Now that we are sure r13 is corrected, load TOC */
400 ld r2,PACATOC(r13);
398 cmpwi cr4,r5,1 401 cmpwi cr4,r5,1
399 mtspr SPRN_HSPRG0,r13 402 mtspr SPRN_HSPRG0,r13
400 403