]> git.itanic.dy.fi Git - linux-stable/commitdiff
KVM: selftests: Move Hyper-V VP assist page enablement out of evmcs.h
authorVitaly Kuznetsov <vkuznets@redhat.com>
Tue, 1 Nov 2022 14:54:18 +0000 (15:54 +0100)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 21 Nov 2022 11:40:05 +0000 (06:40 -0500)
Hyper-V VP assist page is not eVMCS specific, it is also used for
enlightened nSVM. Move the code to vendor neutral place.

Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
Reviewed-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-41-vkuznets@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
tools/testing/selftests/kvm/Makefile
tools/testing/selftests/kvm/include/x86_64/evmcs.h
tools/testing/selftests/kvm/include/x86_64/hyperv.h
tools/testing/selftests/kvm/lib/x86_64/hyperv.c [new file with mode: 0644]
tools/testing/selftests/kvm/x86_64/evmcs_test.c

index 058b15213c5dd8bd4db91247e776746622b05b22..246d52e9df60db32796ce15827b77078dec95aa7 100644 (file)
@@ -53,6 +53,7 @@ LIBKVM_STRING += lib/string_override.c
 
 LIBKVM_x86_64 += lib/x86_64/apic.c
 LIBKVM_x86_64 += lib/x86_64/handlers.S
+LIBKVM_x86_64 += lib/x86_64/hyperv.c
 LIBKVM_x86_64 += lib/x86_64/memstress.c
 LIBKVM_x86_64 += lib/x86_64/processor.c
 LIBKVM_x86_64 += lib/x86_64/svm.c
index efdc62704f276b11f5092049f373fbae4b38fc4d..2530b5aeb4bae6d032ea1ae8d34c841639a292a6 100644 (file)
@@ -10,6 +10,7 @@
 #define SELFTEST_KVM_EVMCS_H
 
 #include <stdint.h>
+#include "hyperv.h"
 #include "vmx.h"
 
 #define u16 uint16_t
 
 extern bool enable_evmcs;
 
-struct hv_nested_enlightenments_control {
-       struct {
-               __u32 directhypercall:1;
-               __u32 reserved:31;
-       } features;
-       struct {
-               __u32 reserved;
-       } hypercallControls;
-} __packed;
-
-/* Define virtual processor assist page structure. */
-struct hv_vp_assist_page {
-       __u32 apic_assist;
-       __u32 reserved1;
-       __u64 vtl_control[3];
-       struct hv_nested_enlightenments_control nested_control;
-       __u8 enlighten_vmentry;
-       __u8 reserved2[7];
-       __u64 current_nested_vmcs;
-} __packed;
-
 struct hv_enlightened_vmcs {
        u32 revision_id;
        u32 abort;
@@ -257,29 +237,13 @@ struct hv_enlightened_vmcs {
 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_ENLIGHTENMENTSCONTROL    BIT(15)
 #define HV_VMX_ENLIGHTENED_CLEAN_FIELD_ALL                      0xFFFF
 
-#define HV_X64_MSR_VP_ASSIST_PAGE              0x40000073
-#define HV_X64_MSR_VP_ASSIST_PAGE_ENABLE       0x00000001
-#define HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_SHIFT        12
-#define HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_MASK \
-               (~((1ull << HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_SHIFT) - 1))
-
 extern struct hv_enlightened_vmcs *current_evmcs;
-extern struct hv_vp_assist_page *current_vp_assist;
 
 int vcpu_enable_evmcs(struct kvm_vcpu *vcpu);
 
-static inline int enable_vp_assist(uint64_t vp_assist_pa, void *vp_assist)
+static inline void evmcs_enable(void)
 {
-       u64 val = (vp_assist_pa & HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_MASK) |
-               HV_X64_MSR_VP_ASSIST_PAGE_ENABLE;
-
-       wrmsr(HV_X64_MSR_VP_ASSIST_PAGE, val);
-
-       current_vp_assist = vp_assist;
-
        enable_evmcs = true;
-
-       return 0;
 }
 
 static inline int evmcs_vmptrld(uint64_t vmcs_pa, void *vmcs)
index ae945f7408352775efcafcd62b14ff600202b7e3..ba38fa347cba3278cc2e6ebe944b2f251ec77ed1 100644 (file)
@@ -237,4 +237,35 @@ static inline void hyperv_write_xmm_input(void *data, int n_sse_regs)
 /* Proper HV_X64_MSR_GUEST_OS_ID value */
 #define HYPERV_LINUX_OS_ID ((u64)0x8100 << 48)
 
+#define HV_X64_MSR_VP_ASSIST_PAGE              0x40000073
+#define HV_X64_MSR_VP_ASSIST_PAGE_ENABLE       0x00000001
+#define HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_SHIFT        12
+#define HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_MASK \
+               (~((1ull << HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_SHIFT) - 1))
+
+struct hv_nested_enlightenments_control {
+       struct {
+               __u32 directhypercall:1;
+               __u32 reserved:31;
+       } features;
+       struct {
+               __u32 reserved;
+       } hypercallControls;
+} __packed;
+
+/* Define virtual processor assist page structure. */
+struct hv_vp_assist_page {
+       __u32 apic_assist;
+       __u32 reserved1;
+       __u64 vtl_control[3];
+       struct hv_nested_enlightenments_control nested_control;
+       __u8 enlighten_vmentry;
+       __u8 reserved2[7];
+       __u64 current_nested_vmcs;
+} __packed;
+
+extern struct hv_vp_assist_page *current_vp_assist;
+
+int enable_vp_assist(uint64_t vp_assist_pa, void *vp_assist);
+
 #endif /* !SELFTEST_KVM_HYPERV_H */
diff --git a/tools/testing/selftests/kvm/lib/x86_64/hyperv.c b/tools/testing/selftests/kvm/lib/x86_64/hyperv.c
new file mode 100644 (file)
index 0000000..32dc0af
--- /dev/null
@@ -0,0 +1,21 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * Hyper-V specific functions.
+ *
+ * Copyright (C) 2021, Red Hat Inc.
+ */
+#include <stdint.h>
+#include "processor.h"
+#include "hyperv.h"
+
+int enable_vp_assist(uint64_t vp_assist_pa, void *vp_assist)
+{
+       uint64_t val = (vp_assist_pa & HV_X64_MSR_VP_ASSIST_PAGE_ADDRESS_MASK) |
+               HV_X64_MSR_VP_ASSIST_PAGE_ENABLE;
+
+       wrmsr(HV_X64_MSR_VP_ASSIST_PAGE, val);
+
+       current_vp_assist = vp_assist;
+
+       return 0;
+}
index 99bc202243d23c280cb7628b16ca0c65d6d9eba3..9007fb04343bc0c7e6c9b8355e3ef804d07c127f 100644 (file)
@@ -79,6 +79,7 @@ void guest_code(struct vmx_pages *vmx_pages)
        GUEST_SYNC(2);
 
        enable_vp_assist(vmx_pages->vp_assist_gpa, vmx_pages->vp_assist);
+       evmcs_enable();
 
        GUEST_ASSERT(vmx_pages->vmcs_gpa);
        GUEST_ASSERT(prepare_for_vmx_operation(vmx_pages));