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 | |