mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	KVM: VMX: check nested state and CR4.VMXE against SMM
VMX cannot be enabled under SMM, check it when CR4 is set and when nested virtualization state is restored. This should fix some WARNs reported by syzkaller, mostly around alloc_shadow_vmcs. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
		
							parent
							
								
									822f312d47
								
							
						
					
					
						commit
						5bea5123cb
					
				
					 1 changed files with 11 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -5398,9 +5398,10 @@ static int vmx_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
 | 
			
		|||
		 * To use VMXON (and later other VMX instructions), a guest
 | 
			
		||||
		 * must first be able to turn on cr4.VMXE (see handle_vmon()).
 | 
			
		||||
		 * So basically the check on whether to allow nested VMX
 | 
			
		||||
		 * is here.
 | 
			
		||||
		 * is here.  We operate under the default treatment of SMM,
 | 
			
		||||
		 * so VMX cannot be enabled under SMM.
 | 
			
		||||
		 */
 | 
			
		||||
		if (!nested_vmx_allowed(vcpu))
 | 
			
		||||
		if (!nested_vmx_allowed(vcpu) || is_smm(vcpu))
 | 
			
		||||
			return 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -13977,6 +13978,14 @@ static int vmx_set_nested_state(struct kvm_vcpu *vcpu,
 | 
			
		|||
	    ~(KVM_STATE_NESTED_SMM_GUEST_MODE | KVM_STATE_NESTED_SMM_VMXON))
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * SMM temporarily disables VMX, so we cannot be in guest mode,
 | 
			
		||||
	 * nor can VMLAUNCH/VMRESUME be pending.  Outside SMM, SMM flags
 | 
			
		||||
	 * must be zero.
 | 
			
		||||
	 */
 | 
			
		||||
	if (is_smm(vcpu) ? kvm_state->flags : kvm_state->vmx.smm.flags)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	if ((kvm_state->vmx.smm.flags & KVM_STATE_NESTED_SMM_GUEST_MODE) &&
 | 
			
		||||
	    !(kvm_state->vmx.smm.flags & KVM_STATE_NESTED_SMM_VMXON))
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue