lkml.org 
[lkml]   [2022]   [Sep]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v10 33/39] KVM: selftests: Move Hyper-V VP assist page enablement out of evmcs.h
    Date
    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>
    Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
    ---
    tools/testing/selftests/kvm/Makefile | 1 +
    .../selftests/kvm/include/x86_64/evmcs.h | 40 +------------------
    .../selftests/kvm/include/x86_64/hyperv.h | 31 ++++++++++++++
    .../testing/selftests/kvm/lib/x86_64/hyperv.c | 21 ++++++++++
    .../testing/selftests/kvm/x86_64/evmcs_test.c | 1 +
    5 files changed, 56 insertions(+), 38 deletions(-)
    create mode 100644 tools/testing/selftests/kvm/lib/x86_64/hyperv.c

    diff --git a/tools/testing/selftests/kvm/Makefile b/tools/testing/selftests/kvm/Makefile
    index 149543b7fcd1..36692fe34e10 100644
    --- a/tools/testing/selftests/kvm/Makefile
    +++ b/tools/testing/selftests/kvm/Makefile
    @@ -50,6 +50,7 @@ LIBKVM += lib/test_util.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/perf_test_util.c
    LIBKVM_x86_64 += lib/x86_64/processor.c
    LIBKVM_x86_64 += lib/x86_64/svm.c
    diff --git a/tools/testing/selftests/kvm/include/x86_64/evmcs.h b/tools/testing/selftests/kvm/include/x86_64/evmcs.h
    index efdc62704f27..2530b5aeb4ba 100644
    --- a/tools/testing/selftests/kvm/include/x86_64/evmcs.h
    +++ b/tools/testing/selftests/kvm/include/x86_64/evmcs.h
    @@ -10,6 +10,7 @@
    #define SELFTEST_KVM_EVMCS_H

    #include <stdint.h>
    +#include "hyperv.h"
    #include "vmx.h"

    #define u16 uint16_t
    @@ -20,27 +21,6 @@

    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)
    diff --git a/tools/testing/selftests/kvm/include/x86_64/hyperv.h b/tools/testing/selftests/kvm/include/x86_64/hyperv.h
    index 8a7d607e3a38..42213f5de17f 100644
    --- a/tools/testing/selftests/kvm/include/x86_64/hyperv.h
    +++ b/tools/testing/selftests/kvm/include/x86_64/hyperv.h
    @@ -234,4 +234,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
    index 000000000000..32dc0afd9e5b
    --- /dev/null
    +++ b/tools/testing/selftests/kvm/lib/x86_64/hyperv.c
    @@ -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;
    +}
    diff --git a/tools/testing/selftests/kvm/x86_64/evmcs_test.c b/tools/testing/selftests/kvm/x86_64/evmcs_test.c
    index 99bc202243d2..9007fb04343b 100644
    --- a/tools/testing/selftests/kvm/x86_64/evmcs_test.c
    +++ b/tools/testing/selftests/kvm/x86_64/evmcs_test.c
    @@ -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));
    --
    2.37.3
    \
     
     \ /
      Last update: 2022-09-21 17:30    [W:4.203 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site