linux/arch/powerpc/kernel
Sam Bobroff 0aab374709 powerpc/powernv: Restore non-volatile CRs after nap
Patches 7cba160ad "powernv/cpuidle: Redesign idle states management"
and 77b54e9f2 "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: 7cba160ad7 ("powernv/cpuidle: Redesign idle states management")
Fixes: 77b54e9f21 ("powernv/powerpc: Add winkle support for offline cpus")
[mpe: Massage change log a bit more]
Signed-off-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
2015-05-01 16:55:11 +10:00
..
vdso32 powerpc: 32 bit getcpu VDSO function uses 64 bit instructions 2014-11-27 09:42:12 +11:00
vdso64
.gitignore
align.c
asm-offsets.c KVM: PPC: Book3S HV: Use msgsnd for signalling threads on POWER8 2015-04-21 15:21:34 +02:00
audit.c
btext.c
cacheinfo.c powerpc: Fix missing L2 cache size in /sys/devices/system/cpu 2015-04-11 20:49:28 +10:00
cacheinfo.h
compat_audit.c
cpu_setup_6xx.S
cpu_setup_44x.S
cpu_setup_fsl_booke.S
cpu_setup_pa6t.S
cpu_setup_power.S powerpc/book3s: Fix flush_tlb cpu_spec hook to take a generic argument. 2015-03-17 07:52:48 +11:00
cpu_setup_ppc970.S
cputable.c powerpc updates for 4.1 2015-04-16 13:53:32 -05:00
crash_dump.c
crash.c
dbell.c powerpc/powernv: Fixes for hypervisor doorbell handling 2015-03-20 14:51:53 +11:00
dma-iommu.c powerpc/iommu: Rename iommu_[un]map_sg functions 2014-11-18 11:30:01 +01:00
dma-swiotlb.c powerpc: fsl_pci, swiotlb: Move controller ops from ppc_md to controller_ops 2015-04-11 20:49:17 +10:00
dma.c
eeh_cache.c powerpc/eeh: Remove device_node dependency 2015-03-24 13:15:53 +11:00
eeh_dev.c powerpc/eeh: Create eeh_dev from pci_dn instead of device_node 2015-03-24 13:15:51 +11:00
eeh_driver.c powerpc/eeh: Remove device_node dependency 2015-03-24 13:15:53 +11:00
eeh_event.c
eeh_pe.c powerpc/eeh: Fix PE#0 check in eeh_add_to_parent_pe() 2015-03-31 13:10:39 +11:00
eeh_sysfs.c powerpc/eeh: Fix PE state format 2014-11-27 09:32:58 +11:00
eeh.c powerpc/eeh: Delay probing EEH device during hotplug 2015-05-01 13:52:32 +10:00
entry_32.S powerpc: Remove old compile time disabled syscall tracing code 2015-02-02 14:51:32 +11:00
entry_64.S Revert "powerpc/tm: Abort syscalls in active transactions" 2015-04-30 15:24:58 +10:00
epapr_hcalls.S
epapr_paravirt.c
exceptions-64e.S
exceptions-64s.S powerpc/book3s: Fix the MCE code to use CONFIG_KVM_BOOK3S_64_HANDLER 2015-03-23 17:10:47 +11:00
fadump.c
firmware.c
fpu.S
fsl_booke_entry_mapping.S
ftrace.c powerpc updates for 3.19 2014-12-11 17:48:14 -08:00
head_8xx.S powerpc/8xx: Remove duplicated code in set_context() 2015-01-29 21:59:02 -06:00
head_32.S
head_40x.S
head_44x.S
head_64.S
head_booke.h
head_fsl_booke.S
hw_breakpoint.c
ibmebus.c
idle_6xx.S
idle_book3e.S
idle_e500.S
idle_power4.S
idle_power7.S powerpc/powernv: Restore non-volatile CRs after nap 2015-05-01 16:55:11 +10:00
idle.c
io-workarounds.c powerpc/mm/thp: Make page table walk safe against thp split/collapse 2015-04-17 11:23:39 +10:00
io.c
iomap.c
iommu.c powerpc/iommu: Remove IOMMU device references via bus notifier 2015-03-04 13:19:33 +11:00
irq.c
isa-bridge.c
jump_label.c
kgdb.c
kprobes.c
kvm_emul.S
kvm.c
l2cr_6xx.S
legacy_serial.c
machine_kexec_32.c
machine_kexec_64.c kexec: add IND_FLAGS macro 2015-02-17 14:34:51 -08:00
machine_kexec.c
Makefile powerpc: kill PPC_OF 2015-03-17 20:04:32 +11:00
mce_power.c powerpc/book3s: Fix flush_tlb cpu_spec hook to take a generic argument. 2015-03-17 07:52:48 +11:00
mce.c
misc_32.S
misc_64.S
misc.S
module_32.c
module_64.c
module.c
msi.c
nvram_64.c powerpc/rtas: Make timestamp related code y2038-safe 2015-03-23 14:06:11 +11:00
of_platform.c powerpc/eeh: Do probe on pci_dn 2015-03-24 13:15:52 +11:00
paca.c powerpc/kernel: Avoid memory corruption at early stage 2015-01-23 14:02:52 +11:00
pci_32.c powerpc: Remove more traces of bootmem 2014-11-19 21:41:51 +11:00
pci_64.c powerpc updates for 3.19 2014-12-11 17:48:14 -08:00
pci_dn.c powerpc/powernv: Shift VF resource with an offset 2015-03-31 13:02:38 +11:00
pci_of_scan.c powerpc: Remove shims for pci_controller_ops operations 2015-04-11 20:49:18 +10:00
pci-common.c Merge branch 'next-sriov' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc into next 2015-04-14 09:29:23 +10:00
pci-hotplug.c powerpc: Remove shims for pci_controller_ops operations 2015-04-11 20:49:18 +10:00
pmc.c
ppc32.h
ppc_ksyms_32.c
ppc_ksyms.c
ppc_save_regs.S
proc_powerpc.c
process.c powerpc/kernel: Rename copy_thread() 'arg' argument to 'kthread_arg' 2015-03-20 12:41:15 +11:00
prom_init_check.sh
prom_init.c powerpc: Reword the "returning from prom_init" message 2015-04-10 20:02:48 +10:00
prom_parse.c
prom.c Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial 2015-04-14 09:50:27 -07:00
ptrace32.c
ptrace.c
reloc_32.S
reloc_64.S
rtas_flash.c
rtas_pci.c powerpc: move find_and_init_phbs() to pSeries specific code 2015-04-11 20:49:09 +10:00
rtas-proc.c
rtas-rtc.c
rtas.c powerpc: Replace mem_init_done with slab_is_available() 2015-04-10 20:02:48 +10:00
rtasd.c
setup_32.c
setup_64.c powerpc updates for 4.1 2015-04-16 13:53:32 -05:00
setup-common.c
signal_32.c all arches, signal: move restart_block to struct task_struct 2015-02-12 18:54:12 -08:00
signal_64.c all arches, signal: move restart_block to struct task_struct 2015-02-12 18:54:12 -08:00
signal.c
signal.h
smp-tbsync.c
smp.c powerpc/smp: Wait until secondaries are active & online 2015-03-04 13:19:33 +11:00
stacktrace.c
suspend.c
swsusp_32.S
swsusp_64.c
swsusp_asm64.S
swsusp_booke.S
swsusp.c
sys_ppc32.c
syscalls.c powerpc: Add a proper syscall for switching endianness 2015-03-28 22:03:40 +11:00
sysfs.c
systbl_chk.c powerpc: Add a proper syscall for switching endianness 2015-03-28 22:03:40 +11:00
systbl_chk.sh
systbl.S powerpc: Add a proper syscall for switching endianness 2015-03-28 22:03:40 +11:00
tau_6xx.c
time.c KVM: PPC: Book3S HV: Accumulate timing information for real-mode code 2015-04-21 15:21:31 +02:00
tm.S powerpc: Change vrX register defines to vX to match gcc and glibc 2015-03-16 18:32:11 +11:00
traps.c powerpc: Remove some unused functions 2015-01-28 15:00:24 +11:00
udbg_16550.c powerpc: Fix bad NULL pointer check in udbg_uart_getc_poll() 2014-11-12 13:47:20 +11:00
udbg.c powerpc: Remove the celleb support 2015-04-07 17:15:13 +10:00
uprobes.c
vdso.c
vecemu.c
vector.S powerpc: Change vrX register defines to vX to match gcc and glibc 2015-03-16 18:32:11 +11:00
vio.c
vmlinux.lds.S