]> git.baikalelectronics.ru Git - kernel.git/commit
KVM: x86: Fix potential put_fpu() w/o load_fpu() on MPX platform
authorSean Christopherson <sean.j.christopherson@intel.com>
Mon, 9 Dec 2019 20:19:31 +0000 (12:19 -0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Wed, 8 Jan 2020 17:16:01 +0000 (18:16 +0100)
commitf121709353425ac87bb8b80c1e62f6834eae25ac
tree3742ad9bd320dd7a80c3d9f3dd0d3ce3b2e15ef5
parent3924114d8028a57a01e10a3753dd5e2a2ad816fd
KVM: x86: Fix potential put_fpu() w/o load_fpu() on MPX platform

Unlike most state managed by XSAVE, MPX is initialized to zero on INIT.
Because INITs are usually recognized in the context of a VCPU_RUN call,
kvm_vcpu_reset() puts the guest's FPU so that the FPU state is resident
in memory, zeros the MPX state, and reloads FPU state to hardware.  But,
in the unlikely event that an INIT is recognized during
kvm_arch_vcpu_ioctl_get_mpstate() via kvm_apic_accept_events(),
kvm_vcpu_reset() will call kvm_put_guest_fpu() without a preceding
kvm_load_guest_fpu() and corrupt the guest's FPU state (and possibly
userspace's FPU state as well).

Given that MPX is being removed from the kernel[*], fix the bug with the
simple-but-ugly approach of loading the guest's FPU during
KVM_GET_MP_STATE.

[*] See commit 89c57a7083d7e ("x86/mpx: Remove MPX APIs").

Fixes: c9cea7d279c19 ("x86,kvm: move qemu/guest FPU switching out to vcpu_run")
Cc: stable@vger.kernel.org
Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/x86.c