mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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
					
				
					 5 changed files with 5 additions and 5 deletions
				
			
		| 
						 | 
					@ -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 a new issue