linux/arch/powerpc/kvm
Paul Mackerras 41490064ad KVM: PPC: Book3S HV: Save/restore TM state in H_CEDE
commit 93d17397e4 upstream.

It turns out that if the guest does a H_CEDE while the CPU is in
a transactional state, and the H_CEDE does a nap, and the nap
loses the architected state of the CPU (which is is allowed to do),
then we lose the checkpointed state of the virtual CPU.  In addition,
the transactional-memory state recorded in the MSR gets reset back
to non-transactional, and when we try to return to the guest, we take
a TM bad thing type of program interrupt because we are trying to
transition from non-transactional to transactional with a hrfid
instruction, which is not permitted.

The result of the program interrupt occurring at that point is that
the host CPU will hang in an infinite loop with interrupts disabled.
Thus this is a denial of service vulnerability in the host which can
be triggered by any guest (and depending on the guest kernel, it can
potentially triggered by unprivileged userspace in the guest).

This vulnerability has been assigned the ID CVE-2016-5412.

To fix this, we save the TM state before napping and restore it
on exit from the nap, when handling a H_CEDE in real mode.  The
case where H_CEDE exits to host virtual mode is already OK (as are
other hcalls which exit to host virtual mode) because the exit
path saves the TM state.

Signed-off-by: Paul Mackerras <paulus@ozlabs.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2016-08-20 18:09:17 +02:00
..
book3s.c KVM: PPC: Book3S: Take the kvm->srcu lock in kvmppc_h_logical_ci_load/store() 2015-09-21 09:05:15 +10:00
book3s.h kvm: Fix page ageing bugs 2014-09-24 14:07:58 +02:00
book3s_32_mmu.c arch: powerpc: kvm: book3s_32_mmu.c: Remove unused function 2014-12-17 13:12:25 +01:00
book3s_32_mmu_host.c KVM: PPC: Fix warnings from sparse 2015-08-22 11:16:16 +02:00
book3s_32_sr.S KVM: PPC: book3s_pr: Simplify transitions between virtual and real mode 2011-09-25 19:52:29 +03:00
book3s_64_mmu.c KVM: PPC: Disable NX for old magic page using guests 2014-05-30 14:26:24 +02:00
book3s_64_mmu_host.c KVM: PPC: Fix warnings from sparse 2015-08-22 11:16:16 +02:00
book3s_64_mmu_hv.c powerpc updates for 4.4 2015-11-05 23:38:43 -08:00
book3s_64_slb.S KVM: PPC: Book3S PR: Rework SLB switching code 2014-05-30 14:26:30 +02:00
book3s_64_vio.c ppc: kvm: use anon_inode_getfd() with O_CLOEXEC flag 2013-08-26 13:19:56 +03:00
book3s_64_vio_hv.c KVM: PPC: Book3S: Introduce hypervisor call H_GET_TCE 2014-03-26 23:34:27 +11:00
book3s_emulate.c KVM: PPC: Fix warnings from sparse 2015-08-22 11:16:16 +02:00
book3s_exports.c KVM: PPC: Make shared struct aka magic page guest endian 2014-05-30 14:26:21 +02:00
book3s_hv.c KVM: PPC: Book3S HV: Prohibit setting illegal transaction state in MSR 2015-12-10 11:34:27 +11:00
book3s_hv_builtin.c KVM: PPC: Book3S HV: Implement dynamic micro-threading on POWER8 2015-08-22 11:16:17 +02:00
book3s_hv_interrupts.S powerpc/kvm: Create proper names for the kvm_host_state PMU fields 2014-12-29 15:45:55 +11:00
book3s_hv_ras.c powerpc/book3s: Fix flush_tlb cpu_spec hook to take a generic argument. 2015-03-17 07:52:48 +11:00
book3s_hv_rm_mmu.c powerpc updates for 4.4 2015-11-05 23:38:43 -08:00
book3s_hv_rm_xics.c KVM: PPC: Book3S HV: Make use of unused threads when running guests 2015-08-22 11:16:17 +02:00
book3s_hv_rmhandlers.S KVM: PPC: Book3S HV: Save/restore TM state in H_CEDE 2016-08-20 18:09:17 +02:00
book3s_interrupts.S KVM: PPC: Book3S PR: Fix ABIv2 on LE 2014-07-28 15:22:15 +02:00
book3s_mmu_hpte.c kvm: powerpc: book3s: pr: move PR related tracepoints to a separate header 2013-10-17 15:36:22 +02:00
book3s_paired_singles.c KVM: PPC: Fix warnings from sparse 2015-08-22 11:16:16 +02:00
book3s_pr.c KVM: add "new" argument to kvm_arch_commit_memory_region 2015-05-28 10:42:58 +02:00
book3s_pr_papr.c kvmppc: Implement H_LOGICAL_CI_{LOAD,STORE} in KVM 2015-04-21 15:21:28 +02:00
book3s_rmhandlers.S KVM: PPC: Book3S PR: Fix ABIv2 on LE 2014-07-28 15:22:15 +02:00
book3s_rtas.c KVM: PPC: RTAS: Do byte swaps explicitly 2014-07-07 23:17:20 +02:00
book3s_segment.S KVM: PPC: Book3S: correct width in XER handling 2015-08-22 11:16:19 +02:00
book3s_xics.c KVM: PPC: Book3S: Fix typo in top comment about locking 2015-09-04 07:28:05 +10:00
book3s_xics.h KVM: PPC: Book3S HV: Add ICP real mode counters 2015-04-21 15:21:30 +02:00
booke.c KVM: add halt_attempted_poll to VCPU stats 2015-09-16 12:17:00 +02:00
booke.h KVM: PPC: Book3e: Add AltiVec support 2014-09-22 10:11:32 +02:00
booke_emulate.c KVM: PPC: BOOKE: Emulate debug registers and exception 2014-09-22 10:11:33 +02:00
booke_interrupts.S KVM: PPC: Remove 440 support 2014-07-28 15:23:15 +02:00
bookehv_interrupts.S powerpc/kvm: common sw breakpoint instr across ppc 2014-09-22 10:11:36 +02:00
e500.c KVM: PPC: e500: fix handling local_sid_lookup result 2015-10-15 15:58:16 +11:00
e500.h KVM: PPC: e500mc: Add support for single threaded vcpus on e6500 core 2014-09-22 10:11:35 +02:00
e500_emulate.c KVM: PPC: e500: Emulate TMCFG0 TMRN register 2015-10-15 15:58:16 +11:00
e500_mmu.c KVM: PPC: fix suspicious use of conditional operator 2015-08-22 11:16:16 +02:00
e500_mmu_host.c powerpc updates for 4.4 2015-11-05 23:38:43 -08:00
e500_mmu_host.h KVM: PPC: E500: Make clear_tlb_refs and clear_tlb1_bitmap static 2013-01-24 19:23:33 +01:00
e500mc.c powerpc: Replace __get_cpu_var uses 2014-11-03 12:12:32 +11:00
emulate.c KVM: PPC: Pass enum to kvmppc_get_last_inst 2014-09-22 10:11:36 +02:00
emulate_loadstore.c KVM: PPC: Pass enum to kvmppc_get_last_inst 2014-09-22 10:11:36 +02:00
fpu.S powerpc: Remove fpscr use from [kvm_]cvt_{fd,df} 2010-09-02 14:07:32 +10:00
irq.h KVM: PPC: Book3S: Add API for in-kernel XICS emulation 2013-05-02 15:28:36 +02:00
Kconfig KVM: PPC: Remove PPC970 from KVM_BOOK3S_64_HV text in Kconfig 2015-08-22 11:16:16 +02:00
Makefile Here are the PPC and ARM changes for KVM, which I separated because 2014-08-07 11:35:30 -07:00
mpic.c kvm/ppc/mpic: drop unused IRQ_testbit 2015-04-08 10:46:58 +02:00
powerpc.c KVM: PPC: Fix ONE_REG AltiVec support 2016-02-25 12:01:20 -08:00
timing.c KVM: PPC: Remove DCR handling 2014-07-28 19:29:15 +02:00
timing.h KVM: PPC: Remove DCR handling 2014-07-28 19:29:15 +02:00
trace.h kvm: powerpc: booke: Move booke related tracepoints to separate header 2013-10-17 15:37:16 +02:00
trace_book3s.h KVM: PPC: Book3S HV: Tracepoints for KVM HV guest interactions 2014-12-17 13:29:27 +01:00
trace_booke.h KVM: PPC: BookE: Improve irq inject tracepoint 2014-12-15 13:27:23 +01:00
trace_hv.h KVM: PPC: Book3S HV: Tracepoints for KVM HV guest interactions 2014-12-17 13:29:27 +01:00
trace_pr.h KVM: PPC: Book3S HV: Tracepoints for KVM HV guest interactions 2014-12-17 13:29:27 +01:00