Commit 6a289139 authored by Sean Christopherson's avatar Sean Christopherson Committed by Paolo Bonzini

KVM: VMX: Use the kernel's version of VMXOFF

Drop kvm_cpu_vmxoff() in favor of the kernel's cpu_vmxoff().  Modify the
latter to return -EIO on fault so that KVM can invoke
kvm_spurious_fault() when appropriate.  In addition to the obvious code
reuse, dropping kvm_cpu_vmxoff() also eliminates VMX's last usage of the
__ex()/__kvm_handle_fault_on_reboot() macros, thus helping pave the way
toward dropping them entirely.
Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
Message-Id: <20201231002702.22237077-7-seanjc@google.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 5ef940bd
...@@ -41,13 +41,18 @@ static inline int cpu_has_vmx(void) ...@@ -41,13 +41,18 @@ static inline int cpu_has_vmx(void)
* faults are guaranteed to be due to the !post-VMXON check unless the CPU is * faults are guaranteed to be due to the !post-VMXON check unless the CPU is
* magically in RM, VM86, compat mode, or at CPL>0. * magically in RM, VM86, compat mode, or at CPL>0.
*/ */
static inline void cpu_vmxoff(void) static inline int cpu_vmxoff(void)
{ {
asm_volatile_goto("1: vmxoff\n\t" asm_volatile_goto("1: vmxoff\n\t"
_ASM_EXTABLE(1b, %l[fault]) _ASM_EXTABLE(1b, %l[fault])
::: "cc", "memory" : fault); ::: "cc", "memory" : fault);
cr4_clear_bits(X86_CR4_VMXE);
return 0;
fault: fault:
cr4_clear_bits(X86_CR4_VMXE); cr4_clear_bits(X86_CR4_VMXE);
return -EIO;
} }
static inline int cpu_vmx_enabled(void) static inline int cpu_vmx_enabled(void)
......
...@@ -2369,21 +2369,12 @@ static void vmclear_local_loaded_vmcss(void) ...@@ -2369,21 +2369,12 @@ static void vmclear_local_loaded_vmcss(void)
__loaded_vmcs_clear(v); __loaded_vmcs_clear(v);
} }
/* Just like cpu_vmxoff(), but with the __kvm_handle_fault_on_reboot()
* tricks.
*/
static void kvm_cpu_vmxoff(void)
{
asm volatile (__ex("vmxoff"));
cr4_clear_bits(X86_CR4_VMXE);
}
static void hardware_disable(void) static void hardware_disable(void)
{ {
vmclear_local_loaded_vmcss(); vmclear_local_loaded_vmcss();
kvm_cpu_vmxoff();
if (cpu_vmxoff())
kvm_spurious_fault();
intel_pt_handle_vmx(0); intel_pt_handle_vmx(0);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment