Re: [PATCH] powernv: Restore SPRs correctly upon wake up from hypervisor state loss
Hi Gautham, Thanks for fixing this. On Wed, Sep 7, 2016 at 1:16 AM, Gautham R. Shenoywrote: > From: "Gautham R. Shenoy" > > 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 > Cc: Michael Neuling > Cc: Michael Ellerman > Cc: Shreyas B. Prabhu > Signed-off-by: Gautham R. Shenoy > --- Reviewed-by: Shreyas B. Prabhu Thanks, Shreyas
Re: [PATCH] powernv: Restore SPRs correctly upon wake up from hypervisor state loss
Hi Gautham, Thanks for fixing this. On Wed, Sep 7, 2016 at 1:16 AM, Gautham R. Shenoy wrote: > From: "Gautham R. Shenoy" > > 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 > Cc: Michael Neuling > Cc: Michael Ellerman > Cc: Shreyas B. Prabhu > Signed-off-by: Gautham R. Shenoy > --- Reviewed-by: Shreyas B. Prabhu Thanks, Shreyas
[PATCH] powernv: Restore SPRs correctly upon wake up from hypervisor state loss
From: "Gautham R. Shenoy"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 Cc: Michael Neuling Cc: Michael Ellerman Cc: Shreyas B. Prabhu Signed-off-by: Gautham R. Shenoy --- 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
[PATCH] powernv: Restore SPRs correctly upon wake up from hypervisor state loss
From: "Gautham R. Shenoy" 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 Cc: Michael Neuling Cc: Michael Ellerman Cc: Shreyas B. Prabhu Signed-off-by: Gautham R. Shenoy --- 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