KVM: x86: Tweak name of MONITOR/MWAIT #UD quirk to make it #UD specific
Add a "UD" clause to KVM_X86_QUIRK_MWAIT_NEVER_FAULTS to make it clear
that the quirk only controls the #UD behavior of MONITOR/MWAIT. KVM
doesn't currently enforce fault checks when MONITOR/MWAIT are supported,
but that could change in the future. SVM also has a virtualization hole
in that it checks all faults before intercepts, and so "never faults" is
already a lie when running on SVM.
Fixes: bfbcc81bb8
("KVM: x86: Add a quirk for KVM's "MONITOR/MWAIT are NOPs!" behavior")
Signed-off-by: Sean Christopherson <seanjc@google.com>
Link: https://lore.kernel.org/r/20220711225753.1073989-4-seanjc@google.com
This commit is contained in:
parent
14fd95bf14
commit
43bb9e000e
|
@ -7523,7 +7523,7 @@ The valid bits in cap.args[0] are:
|
||||||
incorrect hypercall instruction will
|
incorrect hypercall instruction will
|
||||||
generate a #UD within the guest.
|
generate a #UD within the guest.
|
||||||
|
|
||||||
KVM_X86_QUIRK_MWAIT_NEVER_FAULTS By default, KVM emulates MONITOR/MWAIT (if
|
KVM_X86_QUIRK_MWAIT_NEVER_UD_FAULTS By default, KVM emulates MONITOR/MWAIT (if
|
||||||
they are intercepted) as NOPs regardless of
|
they are intercepted) as NOPs regardless of
|
||||||
whether or not MONITOR/MWAIT are supported
|
whether or not MONITOR/MWAIT are supported
|
||||||
according to guest CPUID. When this quirk
|
according to guest CPUID. When this quirk
|
||||||
|
|
|
@ -2096,6 +2096,6 @@ int memslot_rmap_alloc(struct kvm_memory_slot *slot, unsigned long npages);
|
||||||
KVM_X86_QUIRK_OUT_7E_INC_RIP | \
|
KVM_X86_QUIRK_OUT_7E_INC_RIP | \
|
||||||
KVM_X86_QUIRK_MISC_ENABLE_NO_MWAIT | \
|
KVM_X86_QUIRK_MISC_ENABLE_NO_MWAIT | \
|
||||||
KVM_X86_QUIRK_FIX_HYPERCALL_INSN | \
|
KVM_X86_QUIRK_FIX_HYPERCALL_INSN | \
|
||||||
KVM_X86_QUIRK_MWAIT_NEVER_FAULTS)
|
KVM_X86_QUIRK_MWAIT_NEVER_UD_FAULTS)
|
||||||
|
|
||||||
#endif /* _ASM_X86_KVM_HOST_H */
|
#endif /* _ASM_X86_KVM_HOST_H */
|
||||||
|
|
|
@ -439,7 +439,7 @@ struct kvm_sync_regs {
|
||||||
#define KVM_X86_QUIRK_OUT_7E_INC_RIP (1 << 3)
|
#define KVM_X86_QUIRK_OUT_7E_INC_RIP (1 << 3)
|
||||||
#define KVM_X86_QUIRK_MISC_ENABLE_NO_MWAIT (1 << 4)
|
#define KVM_X86_QUIRK_MISC_ENABLE_NO_MWAIT (1 << 4)
|
||||||
#define KVM_X86_QUIRK_FIX_HYPERCALL_INSN (1 << 5)
|
#define KVM_X86_QUIRK_FIX_HYPERCALL_INSN (1 << 5)
|
||||||
#define KVM_X86_QUIRK_MWAIT_NEVER_FAULTS (1 << 6)
|
#define KVM_X86_QUIRK_MWAIT_NEVER_UD_FAULTS (1 << 6)
|
||||||
|
|
||||||
#define KVM_STATE_NESTED_FORMAT_VMX 0
|
#define KVM_STATE_NESTED_FORMAT_VMX 0
|
||||||
#define KVM_STATE_NESTED_FORMAT_SVM 1
|
#define KVM_STATE_NESTED_FORMAT_SVM 1
|
||||||
|
|
|
@ -2046,7 +2046,7 @@ EXPORT_SYMBOL_GPL(kvm_handle_invalid_op);
|
||||||
|
|
||||||
static int kvm_emulate_monitor_mwait(struct kvm_vcpu *vcpu, const char *insn)
|
static int kvm_emulate_monitor_mwait(struct kvm_vcpu *vcpu, const char *insn)
|
||||||
{
|
{
|
||||||
if (!kvm_check_has_quirk(vcpu->kvm, KVM_X86_QUIRK_MWAIT_NEVER_FAULTS) &&
|
if (!kvm_check_has_quirk(vcpu->kvm, KVM_X86_QUIRK_MWAIT_NEVER_UD_FAULTS) &&
|
||||||
!guest_cpuid_has(vcpu, X86_FEATURE_MWAIT))
|
!guest_cpuid_has(vcpu, X86_FEATURE_MWAIT))
|
||||||
return kvm_handle_invalid_op(vcpu);
|
return kvm_handle_invalid_op(vcpu);
|
||||||
|
|
||||||
|
|
|
@ -113,7 +113,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
disabled_quirks = 0;
|
disabled_quirks = 0;
|
||||||
if (testcase & MWAIT_QUIRK_DISABLED)
|
if (testcase & MWAIT_QUIRK_DISABLED)
|
||||||
disabled_quirks |= KVM_X86_QUIRK_MWAIT_NEVER_FAULTS;
|
disabled_quirks |= KVM_X86_QUIRK_MWAIT_NEVER_UD_FAULTS;
|
||||||
if (testcase & MISC_ENABLES_QUIRK_DISABLED)
|
if (testcase & MISC_ENABLES_QUIRK_DISABLED)
|
||||||
disabled_quirks |= KVM_X86_QUIRK_MISC_ENABLE_NO_MWAIT;
|
disabled_quirks |= KVM_X86_QUIRK_MISC_ENABLE_NO_MWAIT;
|
||||||
vm_enable_cap(vm, KVM_CAP_DISABLE_QUIRKS2, disabled_quirks);
|
vm_enable_cap(vm, KVM_CAP_DISABLE_QUIRKS2, disabled_quirks);
|
||||||
|
|
Loading…
Reference in New Issue