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 static inline void nested_svm_hv_update_vm_vp_ids(struct kvm_vcpu *vcpu) 15 { 16 struct vcpu_svm *svm = to_svm(vcpu); 17 struct hv_vmcb_enlightenments *hve = &svm->nested.ctl.hv_enlightenments; 18 struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(vcpu); 19 20 if (!hv_vcpu) 21 return; 22 23 hv_vcpu->nested.pa_page_gpa = hve->partition_assist_page; 24 hv_vcpu->nested.vm_id = hve->hv_vm_id; 25 hv_vcpu->nested.vp_id = hve->hv_vp_id; 26 } 27 28 static inline bool nested_svm_l2_tlb_flush_enabled(struct kvm_vcpu *vcpu) 29 { 30 struct vcpu_svm *svm = to_svm(vcpu); 31 struct hv_vmcb_enlightenments *hve = &svm->nested.ctl.hv_enlightenments; 32 struct kvm_vcpu_hv *hv_vcpu = to_hv_vcpu(vcpu); 33 34 if (!hv_vcpu) 35 return false; 36 37 if (!hve->hv_enlightenments_control.nested_flush_hypercall) 38 return false; 39 40 return hv_vcpu->vp_assist_page.nested_control.features.directhypercall; 41 } 42 43 void svm_hv_inject_synthetic_vmexit_post_tlb_flush(struct kvm_vcpu *vcpu); 44 45 #endif /* __ARCH_X86_KVM_SVM_HYPERV_H__ */ 46