Commit e03b7b51 authored by Vitaly Kuznetsov's avatar Vitaly Kuznetsov Committed by Paolo Bonzini

KVM: selftests: Convert hyperv_features test to using KVM_X86_CPU_FEATURE()

hyperv_features test needs to set certain CPUID bits in Hyper-V feature
leaves but instead of open coding this, common KVM_X86_CPU_FEATURE()
infrastructure can be used.
Signed-off-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
Reviewed-by: default avatarSean Christopherson <seanjc@google.com>
Message-Id: <20221013095849.705943-6-vkuznets@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 8b0a62fd
...@@ -85,61 +85,108 @@ ...@@ -85,61 +85,108 @@
#define HV_X64_MSR_SYNDBG_OPTIONS 0x400000FF #define HV_X64_MSR_SYNDBG_OPTIONS 0x400000FF
/* HYPERV_CPUID_FEATURES.EAX */ /* HYPERV_CPUID_FEATURES.EAX */
#define HV_MSR_VP_RUNTIME_AVAILABLE BIT(0) #define HV_MSR_VP_RUNTIME_AVAILABLE \
#define HV_MSR_TIME_REF_COUNT_AVAILABLE BIT(1) KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EAX, 0)
#define HV_MSR_SYNIC_AVAILABLE BIT(2) #define HV_MSR_TIME_REF_COUNT_AVAILABLE \
#define HV_MSR_SYNTIMER_AVAILABLE BIT(3) KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EAX, 1)
#define HV_MSR_APIC_ACCESS_AVAILABLE BIT(4) #define HV_MSR_SYNIC_AVAILABLE \
#define HV_MSR_HYPERCALL_AVAILABLE BIT(5) KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EAX, 2)
#define HV_MSR_VP_INDEX_AVAILABLE BIT(6) #define HV_MSR_SYNTIMER_AVAILABLE \
#define HV_MSR_RESET_AVAILABLE BIT(7) KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EAX, 3)
#define HV_MSR_STAT_PAGES_AVAILABLE BIT(8) #define HV_MSR_APIC_ACCESS_AVAILABLE \
#define HV_MSR_REFERENCE_TSC_AVAILABLE BIT(9) KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EAX, 4)
#define HV_MSR_GUEST_IDLE_AVAILABLE BIT(10) #define HV_MSR_HYPERCALL_AVAILABLE \
#define HV_ACCESS_FREQUENCY_MSRS BIT(11) KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EAX, 5)
#define HV_ACCESS_REENLIGHTENMENT BIT(13) #define HV_MSR_VP_INDEX_AVAILABLE \
#define HV_ACCESS_TSC_INVARIANT BIT(15) KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EAX, 6)
#define HV_MSR_RESET_AVAILABLE \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EAX, 7)
#define HV_MSR_STAT_PAGES_AVAILABLE \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EAX, 8)
#define HV_MSR_REFERENCE_TSC_AVAILABLE \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EAX, 9)
#define HV_MSR_GUEST_IDLE_AVAILABLE \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EAX, 10)
#define HV_ACCESS_FREQUENCY_MSRS \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EAX, 11)
#define HV_ACCESS_REENLIGHTENMENT \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EAX, 13)
#define HV_ACCESS_TSC_INVARIANT \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EAX, 15)
/* HYPERV_CPUID_FEATURES.EBX */ /* HYPERV_CPUID_FEATURES.EBX */
#define HV_CREATE_PARTITIONS BIT(0) #define HV_CREATE_PARTITIONS \
#define HV_ACCESS_PARTITION_ID BIT(1) KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EBX, 0)
#define HV_ACCESS_MEMORY_POOL BIT(2) #define HV_ACCESS_PARTITION_ID \
#define HV_ADJUST_MESSAGE_BUFFERS BIT(3) KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EBX, 1)
#define HV_POST_MESSAGES BIT(4) #define HV_ACCESS_MEMORY_POOL \
#define HV_SIGNAL_EVENTS BIT(5) KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EBX, 2)
#define HV_CREATE_PORT BIT(6) #define HV_ADJUST_MESSAGE_BUFFERS \
#define HV_CONNECT_PORT BIT(7) KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EBX, 3)
#define HV_ACCESS_STATS BIT(8) #define HV_POST_MESSAGES \
#define HV_DEBUGGING BIT(11) KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EBX, 4)
#define HV_CPU_MANAGEMENT BIT(12) #define HV_SIGNAL_EVENTS \
#define HV_ISOLATION BIT(22) KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EBX, 5)
#define HV_CREATE_PORT \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EBX, 6)
#define HV_CONNECT_PORT \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EBX, 7)
#define HV_ACCESS_STATS \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EBX, 8)
#define HV_DEBUGGING \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EBX, 11)
#define HV_CPU_MANAGEMENT \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EBX, 12)
#define HV_ISOLATION \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EBX, 22)
/* HYPERV_CPUID_FEATURES.EDX */ /* HYPERV_CPUID_FEATURES.EDX */
#define HV_X64_MWAIT_AVAILABLE BIT(0) #define HV_X64_MWAIT_AVAILABLE \
#define HV_X64_GUEST_DEBUGGING_AVAILABLE BIT(1) KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EDX, 0)
#define HV_X64_PERF_MONITOR_AVAILABLE BIT(2) #define HV_X64_GUEST_DEBUGGING_AVAILABLE \
#define HV_X64_CPU_DYNAMIC_PARTITIONING_AVAILABLE BIT(3) KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EDX, 1)
#define HV_X64_HYPERCALL_XMM_INPUT_AVAILABLE BIT(4) #define HV_X64_PERF_MONITOR_AVAILABLE \
#define HV_X64_GUEST_IDLE_STATE_AVAILABLE BIT(5) KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EDX, 2)
#define HV_FEATURE_FREQUENCY_MSRS_AVAILABLE BIT(8) #define HV_X64_CPU_DYNAMIC_PARTITIONING_AVAILABLE \
#define HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE BIT(10) KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EDX, 3)
#define HV_FEATURE_DEBUG_MSRS_AVAILABLE BIT(11) #define HV_X64_HYPERCALL_XMM_INPUT_AVAILABLE \
#define HV_STIMER_DIRECT_MODE_AVAILABLE BIT(19) KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EDX, 4)
#define HV_X64_GUEST_IDLE_STATE_AVAILABLE \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EDX, 5)
#define HV_FEATURE_FREQUENCY_MSRS_AVAILABLE \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EDX, 8)
#define HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EDX, 10)
#define HV_FEATURE_DEBUG_MSRS_AVAILABLE \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EDX, 11)
#define HV_STIMER_DIRECT_MODE_AVAILABLE \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_FEATURES, 0, EDX, 19)
/* HYPERV_CPUID_ENLIGHTMENT_INFO.EAX */ /* HYPERV_CPUID_ENLIGHTMENT_INFO.EAX */
#define HV_X64_AS_SWITCH_RECOMMENDED BIT(0) #define HV_X64_AS_SWITCH_RECOMMENDED \
#define HV_X64_LOCAL_TLB_FLUSH_RECOMMENDED BIT(1) KVM_X86_CPU_FEATURE(HYPERV_CPUID_ENLIGHTMENT_INFO, 0, EAX, 0)
#define HV_X64_REMOTE_TLB_FLUSH_RECOMMENDED BIT(2) #define HV_X64_LOCAL_TLB_FLUSH_RECOMMENDED \
#define HV_X64_APIC_ACCESS_RECOMMENDED BIT(3) KVM_X86_CPU_FEATURE(HYPERV_CPUID_ENLIGHTMENT_INFO, 0, EAX, 1)
#define HV_X64_SYSTEM_RESET_RECOMMENDED BIT(4) #define HV_X64_REMOTE_TLB_FLUSH_RECOMMENDED \
#define HV_X64_RELAXED_TIMING_RECOMMENDED BIT(5) KVM_X86_CPU_FEATURE(HYPERV_CPUID_ENLIGHTMENT_INFO, 0, EAX, 2)
#define HV_DEPRECATING_AEOI_RECOMMENDED BIT(9) #define HV_X64_APIC_ACCESS_RECOMMENDED \
#define HV_X64_CLUSTER_IPI_RECOMMENDED BIT(10) KVM_X86_CPU_FEATURE(HYPERV_CPUID_ENLIGHTMENT_INFO, 0, EAX, 3)
#define HV_X64_EX_PROCESSOR_MASKS_RECOMMENDED BIT(11) #define HV_X64_SYSTEM_RESET_RECOMMENDED \
#define HV_X64_ENLIGHTENED_VMCS_RECOMMENDED BIT(14) KVM_X86_CPU_FEATURE(HYPERV_CPUID_ENLIGHTMENT_INFO, 0, EAX, 4)
#define HV_X64_RELAXED_TIMING_RECOMMENDED \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_ENLIGHTMENT_INFO, 0, EAX, 5)
#define HV_DEPRECATING_AEOI_RECOMMENDED \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_ENLIGHTMENT_INFO, 0, EAX, 9)
#define HV_X64_CLUSTER_IPI_RECOMMENDED \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_ENLIGHTMENT_INFO, 0, EAX, 10)
#define HV_X64_EX_PROCESSOR_MASKS_RECOMMENDED \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_ENLIGHTMENT_INFO, 0, EAX, 11)
#define HV_X64_ENLIGHTENED_VMCS_RECOMMENDED \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_ENLIGHTMENT_INFO, 0, EAX, 14)
/* HYPERV_CPUID_SYNDBG_PLATFORM_CAPABILITIES.EAX */ /* HYPERV_CPUID_SYNDBG_PLATFORM_CAPABILITIES.EAX */
#define HV_X64_SYNDBG_CAP_ALLOW_KERNEL_DEBUGGING BIT(1) #define HV_X64_SYNDBG_CAP_ALLOW_KERNEL_DEBUGGING \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_SYNDBG_PLATFORM_CAPABILITIES, 0, EAX, 1)
/* Hypercalls */ /* Hypercalls */
#define HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE 0x0002 #define HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE 0x0002
......
...@@ -13,6 +13,14 @@ ...@@ -13,6 +13,14 @@
#include "processor.h" #include "processor.h"
#include "hyperv.h" #include "hyperv.h"
/*
* HYPERV_CPUID_ENLIGHTMENT_INFO.EBX is not a 'feature' CPUID leaf
* but to activate the feature it is sufficient to set it to a non-zero
* value. Use BIT(0) for that.
*/
#define HV_PV_SPINLOCKS_TEST \
KVM_X86_CPU_FEATURE(HYPERV_CPUID_ENLIGHTMENT_INFO, 0, EBX, 0)
struct msr_data { struct msr_data {
uint32_t idx; uint32_t idx;
bool fault_expected; bool fault_expected;
...@@ -89,7 +97,6 @@ static void vcpu_reset_hv_cpuid(struct kvm_vcpu *vcpu) ...@@ -89,7 +97,6 @@ static void vcpu_reset_hv_cpuid(struct kvm_vcpu *vcpu)
static void guest_test_msrs_access(void) static void guest_test_msrs_access(void)
{ {
struct kvm_cpuid2 *prev_cpuid = NULL; struct kvm_cpuid2 *prev_cpuid = NULL;
struct kvm_cpuid_entry2 *feat, *dbg;
struct kvm_vcpu *vcpu; struct kvm_vcpu *vcpu;
struct kvm_run *run; struct kvm_run *run;
struct kvm_vm *vm; struct kvm_vm *vm;
...@@ -116,9 +123,6 @@ static void guest_test_msrs_access(void) ...@@ -116,9 +123,6 @@ static void guest_test_msrs_access(void)
vcpu_init_cpuid(vcpu, prev_cpuid); vcpu_init_cpuid(vcpu, prev_cpuid);
} }
feat = vcpu_get_cpuid_entry(vcpu, HYPERV_CPUID_FEATURES);
dbg = vcpu_get_cpuid_entry(vcpu, HYPERV_CPUID_SYNDBG_PLATFORM_CAPABILITIES);
vm_init_descriptor_tables(vm); vm_init_descriptor_tables(vm);
vcpu_init_descriptor_tables(vcpu); vcpu_init_descriptor_tables(vcpu);
...@@ -143,7 +147,7 @@ static void guest_test_msrs_access(void) ...@@ -143,7 +147,7 @@ static void guest_test_msrs_access(void)
msr->fault_expected = true; msr->fault_expected = true;
break; break;
case 2: case 2:
feat->eax |= HV_MSR_HYPERCALL_AVAILABLE; vcpu_set_cpuid_feature(vcpu, HV_MSR_HYPERCALL_AVAILABLE);
/* /*
* HV_X64_MSR_GUEST_OS_ID has to be written first to make * HV_X64_MSR_GUEST_OS_ID has to be written first to make
* HV_X64_MSR_HYPERCALL available. * HV_X64_MSR_HYPERCALL available.
...@@ -170,7 +174,7 @@ static void guest_test_msrs_access(void) ...@@ -170,7 +174,7 @@ static void guest_test_msrs_access(void)
msr->fault_expected = true; msr->fault_expected = true;
break; break;
case 6: case 6:
feat->eax |= HV_MSR_VP_RUNTIME_AVAILABLE; vcpu_set_cpuid_feature(vcpu, HV_MSR_VP_RUNTIME_AVAILABLE);
msr->idx = HV_X64_MSR_VP_RUNTIME; msr->idx = HV_X64_MSR_VP_RUNTIME;
msr->write = false; msr->write = false;
msr->fault_expected = false; msr->fault_expected = false;
...@@ -189,7 +193,7 @@ static void guest_test_msrs_access(void) ...@@ -189,7 +193,7 @@ static void guest_test_msrs_access(void)
msr->fault_expected = true; msr->fault_expected = true;
break; break;
case 9: case 9:
feat->eax |= HV_MSR_TIME_REF_COUNT_AVAILABLE; vcpu_set_cpuid_feature(vcpu, HV_MSR_TIME_REF_COUNT_AVAILABLE);
msr->idx = HV_X64_MSR_TIME_REF_COUNT; msr->idx = HV_X64_MSR_TIME_REF_COUNT;
msr->write = false; msr->write = false;
msr->fault_expected = false; msr->fault_expected = false;
...@@ -208,7 +212,7 @@ static void guest_test_msrs_access(void) ...@@ -208,7 +212,7 @@ static void guest_test_msrs_access(void)
msr->fault_expected = true; msr->fault_expected = true;
break; break;
case 12: case 12:
feat->eax |= HV_MSR_VP_INDEX_AVAILABLE; vcpu_set_cpuid_feature(vcpu, HV_MSR_VP_INDEX_AVAILABLE);
msr->idx = HV_X64_MSR_VP_INDEX; msr->idx = HV_X64_MSR_VP_INDEX;
msr->write = false; msr->write = false;
msr->fault_expected = false; msr->fault_expected = false;
...@@ -227,7 +231,7 @@ static void guest_test_msrs_access(void) ...@@ -227,7 +231,7 @@ static void guest_test_msrs_access(void)
msr->fault_expected = true; msr->fault_expected = true;
break; break;
case 15: case 15:
feat->eax |= HV_MSR_RESET_AVAILABLE; vcpu_set_cpuid_feature(vcpu, HV_MSR_RESET_AVAILABLE);
msr->idx = HV_X64_MSR_RESET; msr->idx = HV_X64_MSR_RESET;
msr->write = false; msr->write = false;
msr->fault_expected = false; msr->fault_expected = false;
...@@ -245,7 +249,7 @@ static void guest_test_msrs_access(void) ...@@ -245,7 +249,7 @@ static void guest_test_msrs_access(void)
msr->fault_expected = true; msr->fault_expected = true;
break; break;
case 18: case 18:
feat->eax |= HV_MSR_REFERENCE_TSC_AVAILABLE; vcpu_set_cpuid_feature(vcpu, HV_MSR_REFERENCE_TSC_AVAILABLE);
msr->idx = HV_X64_MSR_REFERENCE_TSC; msr->idx = HV_X64_MSR_REFERENCE_TSC;
msr->write = false; msr->write = false;
msr->fault_expected = false; msr->fault_expected = false;
...@@ -272,7 +276,7 @@ static void guest_test_msrs_access(void) ...@@ -272,7 +276,7 @@ static void guest_test_msrs_access(void)
msr->fault_expected = true; msr->fault_expected = true;
break; break;
case 22: case 22:
feat->eax |= HV_MSR_SYNIC_AVAILABLE; vcpu_set_cpuid_feature(vcpu, HV_MSR_SYNIC_AVAILABLE);
msr->idx = HV_X64_MSR_EOM; msr->idx = HV_X64_MSR_EOM;
msr->write = false; msr->write = false;
msr->fault_expected = false; msr->fault_expected = false;
...@@ -290,7 +294,7 @@ static void guest_test_msrs_access(void) ...@@ -290,7 +294,7 @@ static void guest_test_msrs_access(void)
msr->fault_expected = true; msr->fault_expected = true;
break; break;
case 25: case 25:
feat->eax |= HV_MSR_SYNTIMER_AVAILABLE; vcpu_set_cpuid_feature(vcpu, HV_MSR_SYNTIMER_AVAILABLE);
msr->idx = HV_X64_MSR_STIMER0_CONFIG; msr->idx = HV_X64_MSR_STIMER0_CONFIG;
msr->write = false; msr->write = false;
msr->fault_expected = false; msr->fault_expected = false;
...@@ -309,7 +313,7 @@ static void guest_test_msrs_access(void) ...@@ -309,7 +313,7 @@ static void guest_test_msrs_access(void)
msr->fault_expected = true; msr->fault_expected = true;
break; break;
case 28: case 28:
feat->edx |= HV_STIMER_DIRECT_MODE_AVAILABLE; vcpu_set_cpuid_feature(vcpu, HV_STIMER_DIRECT_MODE_AVAILABLE);
msr->idx = HV_X64_MSR_STIMER0_CONFIG; msr->idx = HV_X64_MSR_STIMER0_CONFIG;
msr->write = true; msr->write = true;
msr->write_val = 1 << 12; msr->write_val = 1 << 12;
...@@ -322,7 +326,7 @@ static void guest_test_msrs_access(void) ...@@ -322,7 +326,7 @@ static void guest_test_msrs_access(void)
msr->fault_expected = true; msr->fault_expected = true;
break; break;
case 30: case 30:
feat->eax |= HV_MSR_APIC_ACCESS_AVAILABLE; vcpu_set_cpuid_feature(vcpu, HV_MSR_APIC_ACCESS_AVAILABLE);
msr->idx = HV_X64_MSR_EOI; msr->idx = HV_X64_MSR_EOI;
msr->write = true; msr->write = true;
msr->write_val = 1; msr->write_val = 1;
...@@ -335,7 +339,7 @@ static void guest_test_msrs_access(void) ...@@ -335,7 +339,7 @@ static void guest_test_msrs_access(void)
msr->fault_expected = true; msr->fault_expected = true;
break; break;
case 32: case 32:
feat->eax |= HV_ACCESS_FREQUENCY_MSRS; vcpu_set_cpuid_feature(vcpu, HV_ACCESS_FREQUENCY_MSRS);
msr->idx = HV_X64_MSR_TSC_FREQUENCY; msr->idx = HV_X64_MSR_TSC_FREQUENCY;
msr->write = false; msr->write = false;
msr->fault_expected = false; msr->fault_expected = false;
...@@ -354,7 +358,7 @@ static void guest_test_msrs_access(void) ...@@ -354,7 +358,7 @@ static void guest_test_msrs_access(void)
msr->fault_expected = true; msr->fault_expected = true;
break; break;
case 35: case 35:
feat->eax |= HV_ACCESS_REENLIGHTENMENT; vcpu_set_cpuid_feature(vcpu, HV_ACCESS_REENLIGHTENMENT);
msr->idx = HV_X64_MSR_REENLIGHTENMENT_CONTROL; msr->idx = HV_X64_MSR_REENLIGHTENMENT_CONTROL;
msr->write = false; msr->write = false;
msr->fault_expected = false; msr->fault_expected = false;
...@@ -379,7 +383,7 @@ static void guest_test_msrs_access(void) ...@@ -379,7 +383,7 @@ static void guest_test_msrs_access(void)
msr->fault_expected = true; msr->fault_expected = true;
break; break;
case 39: case 39:
feat->edx |= HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE; vcpu_set_cpuid_feature(vcpu, HV_FEATURE_GUEST_CRASH_MSR_AVAILABLE);
msr->idx = HV_X64_MSR_CRASH_P0; msr->idx = HV_X64_MSR_CRASH_P0;
msr->write = false; msr->write = false;
msr->fault_expected = false; msr->fault_expected = false;
...@@ -397,8 +401,8 @@ static void guest_test_msrs_access(void) ...@@ -397,8 +401,8 @@ static void guest_test_msrs_access(void)
msr->fault_expected = true; msr->fault_expected = true;
break; break;
case 42: case 42:
feat->edx |= HV_FEATURE_DEBUG_MSRS_AVAILABLE; vcpu_set_cpuid_feature(vcpu, HV_FEATURE_DEBUG_MSRS_AVAILABLE);
dbg->eax |= HV_X64_SYNDBG_CAP_ALLOW_KERNEL_DEBUGGING; vcpu_set_cpuid_feature(vcpu, HV_X64_SYNDBG_CAP_ALLOW_KERNEL_DEBUGGING);
msr->idx = HV_X64_MSR_SYNDBG_STATUS; msr->idx = HV_X64_MSR_SYNDBG_STATUS;
msr->write = false; msr->write = false;
msr->fault_expected = false; msr->fault_expected = false;
...@@ -445,7 +449,6 @@ static void guest_test_msrs_access(void) ...@@ -445,7 +449,6 @@ static void guest_test_msrs_access(void)
static void guest_test_hcalls_access(void) static void guest_test_hcalls_access(void)
{ {
struct kvm_cpuid_entry2 *feat, *recomm, *dbg;
struct kvm_cpuid2 *prev_cpuid = NULL; struct kvm_cpuid2 *prev_cpuid = NULL;
struct kvm_vcpu *vcpu; struct kvm_vcpu *vcpu;
struct kvm_run *run; struct kvm_run *run;
...@@ -480,15 +483,11 @@ static void guest_test_hcalls_access(void) ...@@ -480,15 +483,11 @@ static void guest_test_hcalls_access(void)
vcpu_init_cpuid(vcpu, prev_cpuid); vcpu_init_cpuid(vcpu, prev_cpuid);
} }
feat = vcpu_get_cpuid_entry(vcpu, HYPERV_CPUID_FEATURES);
recomm = vcpu_get_cpuid_entry(vcpu, HYPERV_CPUID_ENLIGHTMENT_INFO);
dbg = vcpu_get_cpuid_entry(vcpu, HYPERV_CPUID_SYNDBG_PLATFORM_CAPABILITIES);
run = vcpu->run; run = vcpu->run;
switch (stage) { switch (stage) {
case 0: case 0:
feat->eax |= HV_MSR_HYPERCALL_AVAILABLE; vcpu_set_cpuid_feature(vcpu, HV_MSR_HYPERCALL_AVAILABLE);
hcall->control = 0xbeef; hcall->control = 0xbeef;
hcall->expect = HV_STATUS_INVALID_HYPERCALL_CODE; hcall->expect = HV_STATUS_INVALID_HYPERCALL_CODE;
break; break;
...@@ -498,7 +497,7 @@ static void guest_test_hcalls_access(void) ...@@ -498,7 +497,7 @@ static void guest_test_hcalls_access(void)
hcall->expect = HV_STATUS_ACCESS_DENIED; hcall->expect = HV_STATUS_ACCESS_DENIED;
break; break;
case 2: case 2:
feat->ebx |= HV_POST_MESSAGES; vcpu_set_cpuid_feature(vcpu, HV_POST_MESSAGES);
hcall->control = HVCALL_POST_MESSAGE; hcall->control = HVCALL_POST_MESSAGE;
hcall->expect = HV_STATUS_INVALID_HYPERCALL_INPUT; hcall->expect = HV_STATUS_INVALID_HYPERCALL_INPUT;
break; break;
...@@ -508,7 +507,7 @@ static void guest_test_hcalls_access(void) ...@@ -508,7 +507,7 @@ static void guest_test_hcalls_access(void)
hcall->expect = HV_STATUS_ACCESS_DENIED; hcall->expect = HV_STATUS_ACCESS_DENIED;
break; break;
case 4: case 4:
feat->ebx |= HV_SIGNAL_EVENTS; vcpu_set_cpuid_feature(vcpu, HV_SIGNAL_EVENTS);
hcall->control = HVCALL_SIGNAL_EVENT; hcall->control = HVCALL_SIGNAL_EVENT;
hcall->expect = HV_STATUS_INVALID_HYPERCALL_INPUT; hcall->expect = HV_STATUS_INVALID_HYPERCALL_INPUT;
break; break;
...@@ -518,12 +517,12 @@ static void guest_test_hcalls_access(void) ...@@ -518,12 +517,12 @@ static void guest_test_hcalls_access(void)
hcall->expect = HV_STATUS_INVALID_HYPERCALL_CODE; hcall->expect = HV_STATUS_INVALID_HYPERCALL_CODE;
break; break;
case 6: case 6:
dbg->eax |= HV_X64_SYNDBG_CAP_ALLOW_KERNEL_DEBUGGING; vcpu_set_cpuid_feature(vcpu, HV_X64_SYNDBG_CAP_ALLOW_KERNEL_DEBUGGING);
hcall->control = HVCALL_RESET_DEBUG_SESSION; hcall->control = HVCALL_RESET_DEBUG_SESSION;
hcall->expect = HV_STATUS_ACCESS_DENIED; hcall->expect = HV_STATUS_ACCESS_DENIED;
break; break;
case 7: case 7:
feat->ebx |= HV_DEBUGGING; vcpu_set_cpuid_feature(vcpu, HV_DEBUGGING);
hcall->control = HVCALL_RESET_DEBUG_SESSION; hcall->control = HVCALL_RESET_DEBUG_SESSION;
hcall->expect = HV_STATUS_OPERATION_DENIED; hcall->expect = HV_STATUS_OPERATION_DENIED;
break; break;
...@@ -533,7 +532,7 @@ static void guest_test_hcalls_access(void) ...@@ -533,7 +532,7 @@ static void guest_test_hcalls_access(void)
hcall->expect = HV_STATUS_ACCESS_DENIED; hcall->expect = HV_STATUS_ACCESS_DENIED;
break; break;
case 9: case 9:
recomm->eax |= HV_X64_REMOTE_TLB_FLUSH_RECOMMENDED; vcpu_set_cpuid_feature(vcpu, HV_X64_REMOTE_TLB_FLUSH_RECOMMENDED);
hcall->control = HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE; hcall->control = HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE;
hcall->expect = HV_STATUS_SUCCESS; hcall->expect = HV_STATUS_SUCCESS;
break; break;
...@@ -542,7 +541,7 @@ static void guest_test_hcalls_access(void) ...@@ -542,7 +541,7 @@ static void guest_test_hcalls_access(void)
hcall->expect = HV_STATUS_ACCESS_DENIED; hcall->expect = HV_STATUS_ACCESS_DENIED;
break; break;
case 11: case 11:
recomm->eax |= HV_X64_EX_PROCESSOR_MASKS_RECOMMENDED; vcpu_set_cpuid_feature(vcpu, HV_X64_EX_PROCESSOR_MASKS_RECOMMENDED);
hcall->control = HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE_EX; hcall->control = HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE_EX;
hcall->expect = HV_STATUS_SUCCESS; hcall->expect = HV_STATUS_SUCCESS;
break; break;
...@@ -552,7 +551,7 @@ static void guest_test_hcalls_access(void) ...@@ -552,7 +551,7 @@ static void guest_test_hcalls_access(void)
hcall->expect = HV_STATUS_ACCESS_DENIED; hcall->expect = HV_STATUS_ACCESS_DENIED;
break; break;
case 13: case 13:
recomm->eax |= HV_X64_CLUSTER_IPI_RECOMMENDED; vcpu_set_cpuid_feature(vcpu, HV_X64_CLUSTER_IPI_RECOMMENDED);
hcall->control = HVCALL_SEND_IPI; hcall->control = HVCALL_SEND_IPI;
hcall->expect = HV_STATUS_INVALID_HYPERCALL_INPUT; hcall->expect = HV_STATUS_INVALID_HYPERCALL_INPUT;
break; break;
...@@ -567,7 +566,7 @@ static void guest_test_hcalls_access(void) ...@@ -567,7 +566,7 @@ static void guest_test_hcalls_access(void)
hcall->expect = HV_STATUS_ACCESS_DENIED; hcall->expect = HV_STATUS_ACCESS_DENIED;
break; break;
case 16: case 16:
recomm->ebx = 0xfff; vcpu_set_cpuid_feature(vcpu, HV_PV_SPINLOCKS_TEST);
hcall->control = HVCALL_NOTIFY_LONG_SPIN_WAIT; hcall->control = HVCALL_NOTIFY_LONG_SPIN_WAIT;
hcall->expect = HV_STATUS_SUCCESS; hcall->expect = HV_STATUS_SUCCESS;
break; break;
...@@ -577,7 +576,7 @@ static void guest_test_hcalls_access(void) ...@@ -577,7 +576,7 @@ static void guest_test_hcalls_access(void)
hcall->ud_expected = true; hcall->ud_expected = true;
break; break;
case 18: case 18:
feat->edx |= HV_X64_HYPERCALL_XMM_INPUT_AVAILABLE; vcpu_set_cpuid_feature(vcpu, HV_X64_HYPERCALL_XMM_INPUT_AVAILABLE);
hcall->control = HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE | HV_HYPERCALL_FAST_BIT; hcall->control = HVCALL_FLUSH_VIRTUAL_ADDRESS_SPACE | HV_HYPERCALL_FAST_BIT;
hcall->ud_expected = false; hcall->ud_expected = false;
hcall->expect = HV_STATUS_SUCCESS; hcall->expect = HV_STATUS_SUCCESS;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment