2 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
4 #include <linux/errno.h>
14 #define CC KVM_NESTED_VMENTER_CONSISTENCY_CHECK
18 struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(vcpu);
23 if (unlikely(!hv_vcpu->vp_assist_page.enlighten_vmentry))
26 return hv_vcpu->vp_assist_page.current_nested_vmcs;
41 (!vcpu ||
to_vmx(vcpu)->
nested.enlightened_vmcs_enabled))
96 struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(vcpu);
105 if (WARN_ON_ONCE(!hv_vcpu))
108 return hv_vcpu->cpuid_cache.nested_ebx & HV_X64_NESTED_EVMCS1_PERF_GLOBAL_CTRL;
113 u32 ctl_low = (u32)*pdata;
114 u32 ctl_high = (u32)(*pdata >> 32);
122 case MSR_IA32_VMX_EXIT_CTLS:
123 case MSR_IA32_VMX_TRUE_EXIT_CTLS:
126 supported_ctrls &= ~VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL;
127 ctl_high &= supported_ctrls;
129 case MSR_IA32_VMX_ENTRY_CTLS:
130 case MSR_IA32_VMX_TRUE_ENTRY_CTLS:
133 supported_ctrls &= ~VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL;
134 ctl_high &= supported_ctrls;
136 case MSR_IA32_VMX_PROCBASED_CTLS:
137 case MSR_IA32_VMX_TRUE_PROCBASED_CTLS:
140 case MSR_IA32_VMX_PROCBASED_CTLS2:
143 case MSR_IA32_VMX_TRUE_PINBASED_CTLS:
144 case MSR_IA32_VMX_PINBASED_CTLS:
147 case MSR_IA32_VMX_VMFUNC:
152 *pdata = ctl_low | ((u64)ctl_high << 32);
199 uint16_t *vmcs_version)
213 struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(vcpu);
215 struct hv_enlightened_vmcs *evmcs = vmx->
nested.hv_evmcs;
217 if (!hv_vcpu || !evmcs)
220 if (!evmcs->hv_enlightenments_control.nested_flush_hypercall)
223 return hv_vcpu->vp_assist_page.nested_control.features.directhypercall;
static __always_inline u32 kvm_cpu_cap_get(unsigned int x86_feature)
int kvm_hv_get_assist_page(struct kvm_vcpu *vcpu)
#define EVMCS1_SUPPORTED_2NDEXEC
#define EVMCS1_SUPPORTED_VMFUNC
#define EVMCS1_SUPPORTED_3RDEXEC
#define EVMCS1_SUPPORTED_EXEC_CTRL
#define EVMCS1_SUPPORTED_PINCTRL
#define EVMCS1_SUPPORTED_VMEXIT_CTRL
#define KVM_EVMCS_VERSION
#define EVMCS1_SUPPORTED_VMENTRY_CTRL
bool enlightened_vmcs_enabled
u32 cpu_based_vm_exec_control
u32 secondary_vm_exec_control
u32 pin_based_vm_exec_control
static u32 evmcs_get_supported_ctls(enum evmcs_ctrl_type ctrl_type)
static bool nested_evmcs_is_valid_controls(enum evmcs_ctrl_type ctrl_type, u32 val)
static bool evmcs_has_perf_global_ctrl(struct kvm_vcpu *vcpu)
bool nested_evmcs_l2_tlb_flush_enabled(struct kvm_vcpu *vcpu)
static const u32 evmcs_supported_ctrls[NR_EVMCS_CTRLS][NR_EVMCS_REVISIONS]
int nested_enable_evmcs(struct kvm_vcpu *vcpu, uint16_t *vmcs_version)
void vmx_hv_inject_synthetic_vmexit_post_tlb_flush(struct kvm_vcpu *vcpu)
void nested_evmcs_filter_control_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata)
u64 nested_get_evmptr(struct kvm_vcpu *vcpu)
int nested_evmcs_check_controls(struct vmcs12 *vmcs12)
uint16_t nested_get_evmcs_version(struct kvm_vcpu *vcpu)
void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 vm_exit_reason, u32 exit_intr_info, unsigned long exit_qualification)
static __always_inline struct vcpu_vmx * to_vmx(struct kvm_vcpu *vcpu)