|
@@ -1300,6 +1300,12 @@ static inline bool cpu_has_vmx_tsc_scaling(void)
|
|
|
SECONDARY_EXEC_TSC_SCALING;
|
|
|
}
|
|
|
|
|
|
+static inline bool cpu_has_vmx_vmfunc(void)
|
|
|
+{
|
|
|
+ return vmcs_config.cpu_based_2nd_exec_ctrl &
|
|
|
+ SECONDARY_EXEC_ENABLE_VMFUNC;
|
|
|
+}
|
|
|
+
|
|
|
static inline bool report_flexpriority(void)
|
|
|
{
|
|
|
return flexpriority_enabled;
|
|
@@ -3628,7 +3634,8 @@ static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf)
|
|
|
SECONDARY_EXEC_SHADOW_VMCS |
|
|
|
SECONDARY_EXEC_XSAVES |
|
|
|
SECONDARY_EXEC_ENABLE_PML |
|
|
|
- SECONDARY_EXEC_TSC_SCALING;
|
|
|
+ SECONDARY_EXEC_TSC_SCALING |
|
|
|
+ SECONDARY_EXEC_ENABLE_VMFUNC;
|
|
|
if (adjust_vmx_controls(min2, opt2,
|
|
|
MSR_IA32_VMX_PROCBASED_CTLS2,
|
|
|
&_cpu_based_2nd_exec_control) < 0)
|
|
@@ -5345,6 +5352,9 @@ static int vmx_vcpu_setup(struct vcpu_vmx *vmx)
|
|
|
vmcs_writel(HOST_GS_BASE, 0); /* 22.2.4 */
|
|
|
#endif
|
|
|
|
|
|
+ if (cpu_has_vmx_vmfunc())
|
|
|
+ vmcs_write64(VM_FUNCTION_CONTROL, 0);
|
|
|
+
|
|
|
vmcs_write32(VM_EXIT_MSR_STORE_COUNT, 0);
|
|
|
vmcs_write32(VM_EXIT_MSR_LOAD_COUNT, 0);
|
|
|
vmcs_write64(VM_EXIT_MSR_LOAD_ADDR, __pa(vmx->msr_autoload.host));
|
|
@@ -7835,6 +7845,12 @@ static int handle_preemption_timer(struct kvm_vcpu *vcpu)
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+static int handle_vmfunc(struct kvm_vcpu *vcpu)
|
|
|
+{
|
|
|
+ kvm_queue_exception(vcpu, UD_VECTOR);
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* The exit handlers return 1 if the exit was handled fully and guest execution
|
|
|
* may resume. Otherwise they set the kvm_run parameter to indicate what needs
|
|
@@ -7885,6 +7901,7 @@ static int (*const kvm_vmx_exit_handlers[])(struct kvm_vcpu *vcpu) = {
|
|
|
[EXIT_REASON_XSAVES] = handle_xsaves,
|
|
|
[EXIT_REASON_XRSTORS] = handle_xrstors,
|
|
|
[EXIT_REASON_PML_FULL] = handle_pml_full,
|
|
|
+ [EXIT_REASON_VMFUNC] = handle_vmfunc,
|
|
|
[EXIT_REASON_PREEMPTION_TIMER] = handle_preemption_timer,
|
|
|
};
|
|
|
|
|
@@ -8221,6 +8238,9 @@ static bool nested_vmx_exit_reflected(struct kvm_vcpu *vcpu, u32 exit_reason)
|
|
|
case EXIT_REASON_PML_FULL:
|
|
|
/* We emulate PML support to L1. */
|
|
|
return false;
|
|
|
+ case EXIT_REASON_VMFUNC:
|
|
|
+ /* VM functions are emulated through L2->L0 vmexits. */
|
|
|
+ return false;
|
|
|
default:
|
|
|
return true;
|
|
|
}
|