diff options
Diffstat (limited to 'arch/x86/kvm/vmx/nested.c')
| -rw-r--r-- | arch/x86/kvm/vmx/nested.c | 23 | 
1 files changed, 20 insertions, 3 deletions
| diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c index cbc9ea2de28f..e44f33c82332 100644 --- a/arch/x86/kvm/vmx/nested.c +++ b/arch/x86/kvm/vmx/nested.c @@ -5165,7 +5165,7 @@ static int handle_invept(struct kvm_vcpu *vcpu)  	 */  		break;  	default: -		BUG_ON(1); +		BUG();  		break;  	} @@ -5533,8 +5533,25 @@ static bool nested_vmx_exit_handled_vmcs_access(struct kvm_vcpu *vcpu,  	return 1 & (b >> (field & 7));  } +static bool nested_vmx_exit_handled_mtf(struct vmcs12 *vmcs12) +{ +	u32 entry_intr_info = vmcs12->vm_entry_intr_info_field; + +	if (nested_cpu_has_mtf(vmcs12)) +		return true; + +	/* +	 * An MTF VM-exit may be injected into the guest by setting the +	 * interruption-type to 7 (other event) and the vector field to 0. Such +	 * is the case regardless of the 'monitor trap flag' VM-execution +	 * control. +	 */ +	return entry_intr_info == (INTR_INFO_VALID_MASK +				   | INTR_TYPE_OTHER_EVENT); +} +  /* - * Return 1 if we should exit from L2 to L1 to handle an exit, or 0 if we + * Return true if we should exit from L2 to L1 to handle an exit, or false if we   * should handle it ourselves in L0 (and then continue L2). Only call this   * when in is_guest_mode (L2).   */ @@ -5633,7 +5650,7 @@ bool nested_vmx_exit_reflected(struct kvm_vcpu *vcpu, u32 exit_reason)  	case EXIT_REASON_MWAIT_INSTRUCTION:  		return nested_cpu_has(vmcs12, CPU_BASED_MWAIT_EXITING);  	case EXIT_REASON_MONITOR_TRAP_FLAG: -		return nested_cpu_has_mtf(vmcs12); +		return nested_vmx_exit_handled_mtf(vmcs12);  	case EXIT_REASON_MONITOR_INSTRUCTION:  		return nested_cpu_has(vmcs12, CPU_BASED_MONITOR_EXITING);  	case EXIT_REASON_PAUSE_INSTRUCTION: |