x86/hyperv: Move VMCB enlightenment definitions to hyperv-tlfs.h
authorSean Christopherson <seanjc@google.com>
Tue, 1 Nov 2022 14:53:39 +0000 (15:53 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 20 Apr 2023 10:35:12 +0000 (12:35 +0200)
[ Upstream commit 089fe572a2e0a89e36a455d299d801770293d08f ]

Move Hyper-V's VMCB enlightenment definitions to the TLFS header; the
definitions come directly from the TLFS[*], not from KVM.

No functional change intended.

[*] https://learn.microsoft.com/en-us/virtualization/hyper-v-on-windows/tlfs/datatypes/hv_svm_enlightened_vmcb_fields

[vitaly: rename VMCB_HV_ -> HV_VMCB_ to match the rest of
hyperv-tlfs.h, keep svm/hyperv.h]

Signed-off-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <20221101145426.251680-2-vkuznets@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Stable-dep-of: e5c972c1fada ("KVM: SVM: Flush Hyper-V TLB when required")
Signed-off-by: Sasha Levin <sashal@kernel.org>
arch/x86/include/asm/hyperv-tlfs.h
arch/x86/kvm/svm/hyperv.h
arch/x86/kvm/svm/nested.c
arch/x86/kvm/svm/svm_onhyperv.c
arch/x86/kvm/svm/svm_onhyperv.h
tools/testing/selftests/kvm/x86_64/hyperv_svm_test.c

index 3089ec3..245a806 100644 (file)
@@ -598,6 +598,28 @@ struct hv_enlightened_vmcs {
 
 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL                     0xFFFF
 
+/*
+ * Hyper-V uses the software reserved 32 bytes in VMCB control area to expose
+ * SVM enlightenments to guests.
+ */
+struct hv_enlightenments {
+       struct __packed hv_enlightenments_control {
+               u32 nested_flush_hypercall:1;
+               u32 msr_bitmap:1;
+               u32 enlightened_npt_tlb: 1;
+               u32 reserved:29;
+       } __packed hv_enlightenments_control;
+       u32 hv_vp_id;
+       u64 hv_vm_id;
+       u64 partition_assist_page;
+       u64 reserved;
+} __packed;
+
+/*
+ * Hyper-V uses the software reserved clean bit in VMCB.
+ */
+#define HV_VMCB_NESTED_ENLIGHTENMENTS          31
+
 struct hv_partition_assist_pg {
        u32 tlb_lock_count;
 };
index 7d6d979..c59544c 100644 (file)
 
 #include "../hyperv.h"
 
-/*
- * Hyper-V uses the software reserved 32 bytes in VMCB
- * control area to expose SVM enlightenments to guests.
- */
-struct hv_enlightenments {
-       struct __packed hv_enlightenments_control {
-               u32 nested_flush_hypercall:1;
-               u32 msr_bitmap:1;
-               u32 enlightened_npt_tlb: 1;
-               u32 reserved:29;
-       } __packed hv_enlightenments_control;
-       u32 hv_vp_id;
-       u64 hv_vm_id;
-       u64 partition_assist_page;
-       u64 reserved;
-} __packed;
-
-/*
- * Hyper-V uses the software reserved clean bit in VMCB
- */
-#define VMCB_HV_NESTED_ENLIGHTENMENTS VMCB_SW
-
 #endif /* __ARCH_X86_KVM_SVM_HYPERV_H__ */
index 995bc0f..0be104e 100644 (file)
@@ -194,7 +194,7 @@ static bool nested_svm_vmrun_msrpm(struct vcpu_svm *svm)
        if (!svm->nested.force_msr_bitmap_recalc &&
            kvm_hv_hypercall_enabled(&svm->vcpu) &&
            hve->hv_enlightenments_control.msr_bitmap &&
-           (svm->nested.ctl.clean & BIT(VMCB_HV_NESTED_ENLIGHTENMENTS)))
+           (svm->nested.ctl.clean & BIT(HV_VMCB_NESTED_ENLIGHTENMENTS)))
                goto set_msrpm_base_pa;
 
        if (!(vmcb12_is_intercept(&svm->nested.ctl, INTERCEPT_MSR_PROT)))
index 8cdc62c..ed5e793 100644 (file)
@@ -32,7 +32,7 @@ int svm_hv_enable_direct_tlbflush(struct kvm_vcpu *vcpu)
        hve->hv_vm_id = (unsigned long)vcpu->kvm;
        if (!hve->hv_enlightenments_control.nested_flush_hypercall) {
                hve->hv_enlightenments_control.nested_flush_hypercall = 1;
-               vmcb_mark_dirty(to_svm(vcpu)->vmcb, VMCB_HV_NESTED_ENLIGHTENMENTS);
+               vmcb_mark_dirty(to_svm(vcpu)->vmcb, HV_VMCB_NESTED_ENLIGHTENMENTS);
        }
 
        return 0;
index 4387173..35d6981 100644 (file)
@@ -64,7 +64,7 @@ static inline void svm_hv_vmcb_dirty_nested_enlightenments(
                (struct hv_enlightenments *)vmcb->control.reserved_sw;
 
        if (hve->hv_enlightenments_control.msr_bitmap)
-               vmcb_mark_dirty(vmcb, VMCB_HV_NESTED_ENLIGHTENMENTS);
+               vmcb_mark_dirty(vmcb, HV_VMCB_NESTED_ENLIGHTENMENTS);
 }
 
 static inline void svm_hv_update_vp_id(struct vmcb *vmcb,
@@ -76,7 +76,7 @@ static inline void svm_hv_update_vp_id(struct vmcb *vmcb,
 
        if (hve->hv_vp_id != vp_index) {
                hve->hv_vp_id = vp_index;
-               vmcb_mark_dirty(vmcb, VMCB_HV_NESTED_ENLIGHTENMENTS);
+               vmcb_mark_dirty(vmcb, HV_VMCB_NESTED_ENLIGHTENMENTS);
        }
 }
 #else
index a380ad7..5060fcf 100644 (file)
@@ -39,7 +39,7 @@ struct hv_enlightenments {
 /*
  * Hyper-V uses the software reserved clean bit in VMCB
  */
-#define VMCB_HV_NESTED_ENLIGHTENMENTS (1U << 31)
+#define HV_VMCB_NESTED_ENLIGHTENMENTS (1U << 31)
 
 void l2_guest_code(void)
 {
@@ -98,14 +98,14 @@ static void __attribute__((__flatten__)) guest_code(struct svm_test_data *svm)
        /* Intercept RDMSR 0xc0000101 without telling KVM about it */
        set_bit(2 * (MSR_GS_BASE & 0x1fff), svm->msr + 0x800);
        /* Make sure HV_VMX_ENLIGHTENED_CLEAN_FIELD_MSR_BITMAP is set */
-       vmcb->control.clean |= VMCB_HV_NESTED_ENLIGHTENMENTS;
+       vmcb->control.clean |= HV_VMCB_NESTED_ENLIGHTENMENTS;
        run_guest(vmcb, svm->vmcb_gpa);
        /* Make sure we don't see SVM_EXIT_MSR here so eMSR bitmap works */
        GUEST_ASSERT(vmcb->control.exit_code == SVM_EXIT_VMMCALL);
        vmcb->save.rip += 3; /* vmcall */
 
        /* Now tell KVM we've changed MSR-Bitmap */
-       vmcb->control.clean &= ~VMCB_HV_NESTED_ENLIGHTENMENTS;
+       vmcb->control.clean &= ~HV_VMCB_NESTED_ENLIGHTENMENTS;
        run_guest(vmcb, svm->vmcb_gpa);
        GUEST_ASSERT(vmcb->control.exit_code == SVM_EXIT_MSR);
        vmcb->save.rip += 2; /* rdmsr */