• Sam Bobroff's avatar
    powerpc/powernv: Restore non-volatile CRs after nap · 0aab3747
    Sam Bobroff authored
    Patches 7cba160a "powernv/cpuidle: Redesign idle states management"
    and 77b54e9f "powernv/powerpc: Add winkle support for offline cpus"
    use non-volatile condition registers (cr2, cr3 and cr4) early in the system
    reset interrupt handler (system_reset_pSeries()) before it has been determined
    if state loss has occurred. If state loss has not occurred, control returns via
    the power7_wakeup_noloss() path which does not restore those condition
    registers, leaving them corrupted.
    
    Fix this by restoring the condition registers in the power7_wakeup_noloss()
    case.
    
    This is apparent when running a KVM guest on hardware that does not
    support winkle or sleep and the guest makes use of secondary threads. In
    practice this means Power7 machines, though some early unreleased Power8
    machines may also be susceptible.
    
    The secondary CPUs are taken off line before the guest is started and
    they call pnv_smp_cpu_kill_self(). This checks support for sleep
    states (in this case there is no support) and power7_nap() is called.
    
    When the CPU is woken, power7_nap() returns and because the CPU is
    still off line, the main while loop executes again. The sleep states
    support test is executed again, but because the tested values cannot
    have changed, the compiler has optimized the test away and instead we
    rely on the result of the first test, which has been left in cr3
    and/or cr4. With the result overwritten, the wrong branch is taken and
    power7_winkle() is called on a CPU that does not support it, leading
    to it stalling.
    
    Fixes: 7cba160a ("powernv/cpuidle: Redesign idle states management")
    Fixes: 77b54e9f ("powernv/powerpc: Add winkle support for offline cpus")
    [mpe: Massage change log a bit more]
    Signed-off-by: default avatarSam Bobroff <sam.bobroff@au1.ibm.com>
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    0aab3747
idle_power7.S 11.6 KB