1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef __KVM_X86_VMX_HYPERV_H 3 #define __KVM_X86_VMX_HYPERV_H 4 5 #include <linux/kvm_host.h> 6 #include "vmcs12.h" 7 #include "vmx.h" 8 9 #define EVMPTR_INVALID (-1ULL) 10 #define EVMPTR_MAP_PENDING (-2ULL) 11 12 enum nested_evmptrld_status { 13 EVMPTRLD_DISABLED, 14 EVMPTRLD_SUCCEEDED, 15 EVMPTRLD_VMFAIL, 16 EVMPTRLD_ERROR, 17 }; 18 19 #ifdef CONFIG_KVM_HYPERV evmptr_is_valid(u64 evmptr)20static inline bool evmptr_is_valid(u64 evmptr) 21 { 22 return evmptr != EVMPTR_INVALID && evmptr != EVMPTR_MAP_PENDING; 23 } 24 nested_vmx_is_evmptr12_valid(struct vcpu_vmx * vmx)25static inline bool nested_vmx_is_evmptr12_valid(struct vcpu_vmx *vmx) 26 { 27 return evmptr_is_valid(vmx->nested.hv_evmcs_vmptr); 28 } 29 evmptr_is_set(u64 evmptr)30static inline bool evmptr_is_set(u64 evmptr) 31 { 32 return evmptr != EVMPTR_INVALID; 33 } 34 nested_vmx_is_evmptr12_set(struct vcpu_vmx * vmx)35static inline bool nested_vmx_is_evmptr12_set(struct vcpu_vmx *vmx) 36 { 37 return evmptr_is_set(vmx->nested.hv_evmcs_vmptr); 38 } 39 nested_vmx_evmcs(struct vcpu_vmx * vmx)40static inline struct hv_enlightened_vmcs *nested_vmx_evmcs(struct vcpu_vmx *vmx) 41 { 42 return vmx->nested.hv_evmcs; 43 } 44 guest_cpuid_has_evmcs(struct kvm_vcpu * vcpu)45static inline bool guest_cpuid_has_evmcs(struct kvm_vcpu *vcpu) 46 { 47 /* 48 * eVMCS is exposed to the guest if Hyper-V is enabled in CPUID and 49 * eVMCS has been explicitly enabled by userspace. 50 */ 51 return vcpu->arch.hyperv_enabled && 52 to_vmx(vcpu)->nested.enlightened_vmcs_enabled; 53 } 54 55 u64 nested_get_evmptr(struct kvm_vcpu *vcpu); 56 uint16_t nested_get_evmcs_version(struct kvm_vcpu *vcpu); 57 int nested_enable_evmcs(struct kvm_vcpu *vcpu, 58 uint16_t *vmcs_version); 59 void nested_evmcs_filter_control_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata); 60 int nested_evmcs_check_controls(struct vmcs12 *vmcs12); 61 bool nested_evmcs_l2_tlb_flush_enabled(struct kvm_vcpu *vcpu); 62 void vmx_hv_inject_synthetic_vmexit_post_tlb_flush(struct kvm_vcpu *vcpu); 63 #else evmptr_is_valid(u64 evmptr)64static inline bool evmptr_is_valid(u64 evmptr) 65 { 66 return false; 67 } 68 nested_vmx_is_evmptr12_valid(struct vcpu_vmx * vmx)69static inline bool nested_vmx_is_evmptr12_valid(struct vcpu_vmx *vmx) 70 { 71 return false; 72 } 73 evmptr_is_set(u64 evmptr)74static inline bool evmptr_is_set(u64 evmptr) 75 { 76 return false; 77 } 78 nested_vmx_is_evmptr12_set(struct vcpu_vmx * vmx)79static inline bool nested_vmx_is_evmptr12_set(struct vcpu_vmx *vmx) 80 { 81 return false; 82 } 83 nested_vmx_evmcs(struct vcpu_vmx * vmx)84static inline struct hv_enlightened_vmcs *nested_vmx_evmcs(struct vcpu_vmx *vmx) 85 { 86 return NULL; 87 } 88 #endif 89 90 #endif /* __KVM_X86_VMX_HYPERV_H */ 91