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 12enum nested_evmptrld_status { 13 EVMPTRLD_DISABLED, 14 EVMPTRLD_SUCCEEDED, 15 EVMPTRLD_VMFAIL, 16 EVMPTRLD_ERROR, 17}; 18 19#ifdef CONFIG_KVM_HYPERV 20static inline bool evmptr_is_valid(u64 evmptr) 21{ 22 return evmptr != EVMPTR_INVALID && evmptr != EVMPTR_MAP_PENDING; 23} 24 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 30static inline bool evmptr_is_set(u64 evmptr) 31{ 32 return evmptr != EVMPTR_INVALID; 33} 34 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 40static inline struct hv_enlightened_vmcs *nested_vmx_evmcs(struct vcpu_vmx *vmx) 41{ 42 return vmx->nested.hv_evmcs; 43} 44 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 55u64 nested_get_evmptr(struct kvm_vcpu *vcpu); 56uint16_t nested_get_evmcs_version(struct kvm_vcpu *vcpu); 57int nested_enable_evmcs(struct kvm_vcpu *vcpu, 58 uint16_t *vmcs_version); 59void nested_evmcs_filter_control_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata); 60int nested_evmcs_check_controls(struct vmcs12 *vmcs12); 61bool nested_evmcs_l2_tlb_flush_enabled(struct kvm_vcpu *vcpu); 62void vmx_hv_inject_synthetic_vmexit_post_tlb_flush(struct kvm_vcpu *vcpu); 63#else 64static inline bool evmptr_is_valid(u64 evmptr) 65{ 66 return false; 67} 68 69static inline bool nested_vmx_is_evmptr12_valid(struct vcpu_vmx *vmx) 70{ 71 return false; 72} 73 74static inline bool evmptr_is_set(u64 evmptr) 75{ 76 return false; 77} 78 79static inline bool nested_vmx_is_evmptr12_set(struct vcpu_vmx *vmx) 80{ 81 return false; 82} 83 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