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