| // SPDX-License-Identifier: GPL-2.0-only |
| |
| #include "capabilities.h" |
| #include "vmx_onhyperv.h" |
| |
| DEFINE_STATIC_KEY_FALSE(__kvm_is_using_evmcs); |
| |
| /* |
| * KVM on Hyper-V always uses the latest known eVMCSv1 revision, the assumption |
| * is: in case a feature has corresponding fields in eVMCS described and it was |
| * exposed in VMX feature MSRs, KVM is free to use it. Warn if KVM meets a |
| * feature which has no corresponding eVMCS field, this likely means that KVM |
| * needs to be updated. |
| */ |
| #define evmcs_check_vmcs_conf(field, ctrl) \ |
| do { \ |
| typeof(vmcs_conf->field) unsupported; \ |
| \ |
| unsupported = vmcs_conf->field & ~EVMCS1_SUPPORTED_ ## ctrl; \ |
| if (unsupported) { \ |
| pr_warn_once(#field " unsupported with eVMCS: 0x%llx\n",\ |
| (u64)unsupported); \ |
| vmcs_conf->field &= EVMCS1_SUPPORTED_ ## ctrl; \ |
| } \ |
| } \ |
| while (0) |
| |
| void evmcs_sanitize_exec_ctrls(struct vmcs_config *vmcs_conf) |
| { |
| evmcs_check_vmcs_conf(cpu_based_exec_ctrl, EXEC_CTRL); |
| evmcs_check_vmcs_conf(pin_based_exec_ctrl, PINCTRL); |
| evmcs_check_vmcs_conf(cpu_based_2nd_exec_ctrl, 2NDEXEC); |
| evmcs_check_vmcs_conf(cpu_based_3rd_exec_ctrl, 3RDEXEC); |
| evmcs_check_vmcs_conf(vmentry_ctrl, VMENTRY_CTRL); |
| evmcs_check_vmcs_conf(vmexit_ctrl, VMEXIT_CTRL); |
| } |