1 // SPDX-License-Identifier: GPL-2.0-only 2 3 #include "capabilities.h" 4 #include "vmx_onhyperv.h" 5 6 DEFINE_STATIC_KEY_FALSE(__kvm_is_using_evmcs); 7 8 /* 9 * KVM on Hyper-V always uses the latest known eVMCSv1 revision, the assumption 10 * is: in case a feature has corresponding fields in eVMCS described and it was 11 * exposed in VMX feature MSRs, KVM is free to use it. Warn if KVM meets a 12 * feature which has no corresponding eVMCS field, this likely means that KVM 13 * needs to be updated. 14 */ 15 #define evmcs_check_vmcs_conf(field, ctrl) \ 16 do { \ 17 typeof(vmcs_conf->field) unsupported; \ 18 \ 19 unsupported = vmcs_conf->field & ~EVMCS1_SUPPORTED_ ## ctrl; \ 20 if (unsupported) { \ 21 pr_warn_once(#field " unsupported with eVMCS: 0x%llx\n",\ 22 (u64)unsupported); \ 23 vmcs_conf->field &= EVMCS1_SUPPORTED_ ## ctrl; \ 24 } \ 25 } \ 26 while (0) 27 28 void evmcs_sanitize_exec_ctrls(struct vmcs_config *vmcs_conf) 29 { 30 evmcs_check_vmcs_conf(cpu_based_exec_ctrl, EXEC_CTRL); 31 evmcs_check_vmcs_conf(pin_based_exec_ctrl, PINCTRL); 32 evmcs_check_vmcs_conf(cpu_based_2nd_exec_ctrl, 2NDEXEC); 33 evmcs_check_vmcs_conf(cpu_based_3rd_exec_ctrl, 3RDEXEC); 34 evmcs_check_vmcs_conf(vmentry_ctrl, VMENTRY_CTRL); 35 evmcs_check_vmcs_conf(vmexit_ctrl, VMEXIT_CTRL); 36 } 37