xref: /openbmc/linux/arch/x86/kvm/vmx/vmx_onhyperv.c (revision 0db00e5d86dc793aab9722ad3728d99166eb7d96)
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