1 /* SPDX-License-Identifier: GPL-2.0-only */ 2 /* 3 * Common Hyper-V on KVM and KVM on Hyper-V definitions (SVM). 4 */ 5 6 #ifndef __ARCH_X86_KVM_SVM_HYPERV_H__ 7 #define __ARCH_X86_KVM_SVM_HYPERV_H__ 8 9 #include <asm/mshyperv.h> 10 11 #include "../hyperv.h" 12 #include "svm.h" 13 14 #ifdef CONFIG_KVM_HYPERV 15 static inline void nested_svm_hv_update_vm_vp_ids(struct kvm_vcpu *vcpu) 16 { 17 struct vcpu_svm *svm = to_svm(vcpu); 18 struct hv_vmcb_enlightenments *hve = &svm->nested.ctl.hv_enlightenments; 19 struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(vcpu); 20 21 if (!hv_vcpu) 22 return; 23 24 hv_vcpu->nested.pa_page_gpa = hve->partition_assist_page; 25 hv_vcpu->nested.vm_id = hve->hv_vm_id; 26 hv_vcpu->nested.vp_id = hve->hv_vp_id; 27 } 28 29 static inline bool nested_svm_l2_tlb_flush_enabled(struct kvm_vcpu *vcpu) 30 { 31 struct vcpu_svm *svm = to_svm(vcpu); 32 struct hv_vmcb_enlightenments *hve = &svm->nested.ctl.hv_enlightenments; 33 struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(vcpu); 34 35 if (!hv_vcpu) 36 return false; 37 38 if (!hve->hv_enlightenments_control.nested_flush_hypercall) 39 return false; 40 41 return hv_vcpu->vp_assist_page.nested_control.features.directhypercall; 42 } 43 44 void svm_hv_inject_synthetic_vmexit_post_tlb_flush(struct kvm_vcpu *vcpu); 45 #else /* CONFIG_KVM_HYPERV */ 46 static inline void nested_svm_hv_update_vm_vp_ids(struct kvm_vcpu *vcpu) {} 47 static inline bool nested_svm_l2_tlb_flush_enabled(struct kvm_vcpu *vcpu) 48 { 49 return false; 50 } 51 static inline void svm_hv_inject_synthetic_vmexit_post_tlb_flush(struct kvm_vcpu *vcpu) {} 52 #endif /* CONFIG_KVM_HYPERV */ 53 54 #endif /* __ARCH_X86_KVM_SVM_HYPERV_H__ */ 55