From: "Gautham R. Shenoy" <e...@linux.vnet.ibm.com> pnv_wakeup_tb_loss function currently expects the cr4 to be "eq" if the CPU is waking up from a complete hypervisor state loss. Hence, it currently restores the SPR contents only if cr4 is "eq".
However, after the commit bcef83a00dc4 ("powerpc/powernv: Add platform support for stop instruction"), on ISA_V300 CPUs, the function pnv_restore_hyp_resource sets cr4 to contain the result of the comparison between state the CPU has woken up and the first deepest stop state before calling pnv_wakeup_tb_loss. Thus if the CPU woke up from a state that is deeper than the first deepest stop state, cr4 have "gt" set and hence, pnv_wakeup_tb_loss will fail to restore the SPRs on waking up from such a state. Fix the code in pnv_wakeup_tb_loss to restore the SPR states when cr4 is "eq" or "gt". Fixes: Commit bcef83a00dc4 ("powerpc/powernv: Add platform support for stop instruction") Cc: Vaidyanathan Srinivasan <sva...@linux.vnet.ibm.com> Cc: Michael Neuling <michael.neul...@au1.ibm.com> Cc: Michael Ellerman <m...@ellerman.id.au> Cc: Shreyas B. Prabhu <shreya...@gmail.com> Signed-off-by: Gautham R. Shenoy <e...@linux.vnet.ibm.com> --- arch/powerpc/kernel/idle_book3s.S | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/arch/powerpc/kernel/idle_book3s.S b/arch/powerpc/kernel/idle_book3s.S index 2265c63..bd739fe 100644 --- a/arch/powerpc/kernel/idle_book3s.S +++ b/arch/powerpc/kernel/idle_book3s.S @@ -411,7 +411,7 @@ END_FTR_SECTION_IFSET(CPU_FTR_ARCH_300) * * r13 - PACA * cr3 - gt if waking up with partial/complete hypervisor state loss - * cr4 - eq if waking up from complete hypervisor state loss. + * cr4 - gt or eq if waking up from complete hypervisor state loss. */ _GLOBAL(pnv_wakeup_tb_loss) ld r1,PACAR1(r13) @@ -453,7 +453,7 @@ lwarx_loop2: * At this stage * cr2 - eq if first thread to wakeup in core * cr3- gt if waking up with partial/complete hypervisor state loss - * cr4 - eq if waking up from complete hypervisor state loss. + * cr4 - gt or eq if waking up from complete hypervisor state loss. */ ori r15,r15,PNV_CORE_IDLE_LOCK_BIT @@ -481,7 +481,7 @@ first_thread_in_subcore: * If waking up from sleep, subcore state is not lost. Hence * skip subcore state restore */ - bne cr4,subcore_state_restored + blt cr4,subcore_state_restored /* Restore per-subcore state */ ld r4,_SDR1(r1) @@ -526,7 +526,7 @@ timebase_resync: * If waking up from sleep, per core state is not lost, skip to * clear_lock. */ - bne cr4,clear_lock + blt cr4,clear_lock /* * First thread in the core to wake up and its waking up with @@ -557,7 +557,7 @@ common_exit: * If waking up from sleep, hypervisor state is not lost. Hence * skip hypervisor state restore. */ - bne cr4,hypervisor_state_restored + blt cr4,hypervisor_state_restored /* Waking up from winkle */ -- 1.9.4