mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2025-01-08 06:44:35 +08:00
KVM: selftests: Move Hyper-V VP assist page enablement out of evmcs.h
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>
This commit is contained in:
parent
d7b14a868a
commit
e8f3d23c02
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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 */
|
||||
|
21
tools/testing/selftests/kvm/lib/x86_64/hyperv.c
Normal file
21
tools/testing/selftests/kvm/lib/x86_64/hyperv.c
Normal file
@ -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;
|
||||
}
|
@ -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));
|
||||
|
Loading…
Reference in New Issue
Block a user