From: Vitaly Kuznetsov <vkuznets@redhat.com>
To: kvm@vger.kernel.org
Cc: linux-hyperv@vger.kernel.org, Jon Doron <arilou@gmail.com>
Subject: [PATCH v9 7/6] KVM: selftests: update hyperv_cpuid with SynDBG tests
Date: Mon, 23 Mar 2020 10:51:16 +0100 [thread overview]
Message-ID: <20200323095116.415586-1-vkuznets@redhat.com> (raw)
In-Reply-To: <20200320172839.1144395-1-arilou@gmail.com>
Test all four combinations with eVMCS and SynDBG capabilities,
check that we get the right number of entries and that
0x40000000.EAX always returns the correct max leaf.
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
---
.../selftests/kvm/x86_64/hyperv_cpuid.c | 138 ++++++++++++------
1 file changed, 96 insertions(+), 42 deletions(-)
diff --git a/tools/testing/selftests/kvm/x86_64/hyperv_cpuid.c b/tools/testing/selftests/kvm/x86_64/hyperv_cpuid.c
index 83323f3d7ca0..4a2ef7e1b1f9 100644
--- a/tools/testing/selftests/kvm/x86_64/hyperv_cpuid.c
+++ b/tools/testing/selftests/kvm/x86_64/hyperv_cpuid.c
@@ -26,18 +26,18 @@ static void guest_code(void)
{
}
-static int smt_possible(void)
+static bool smt_possible(void)
{
char buf[16];
FILE *f;
- bool res = 1;
+ bool res = true;
f = fopen("/sys/devices/system/cpu/smt/control", "r");
if (f) {
if (fread(buf, sizeof(*buf), sizeof(buf), f) > 0) {
if (!strncmp(buf, "forceoff", 8) ||
!strncmp(buf, "notsupported", 12))
- res = 0;
+ res = false;
}
fclose(f);
}
@@ -45,30 +45,48 @@ static int smt_possible(void)
return res;
}
+void vcpu_enable_syndbg(struct kvm_vm *vm, int vcpu_id)
+{
+ struct kvm_enable_cap enable_syndbg_cap = {
+ .cap = KVM_CAP_HYPERV_SYNDBG,
+ };
+
+ vcpu_ioctl(vm, vcpu_id, KVM_ENABLE_CAP, &enable_syndbg_cap);
+}
+
static void test_hv_cpuid(struct kvm_cpuid2 *hv_cpuid_entries,
- int evmcs_enabled)
+ bool evmcs_enabled, bool syndbg_enabled)
{
int i;
+ int nent = 6;
+ u32 test_val;
+
+ if (evmcs_enabled)
+ nent += 1; /* 0x4000000A */
- if (!evmcs_enabled)
- TEST_ASSERT(hv_cpuid_entries->nent == 6,
- "KVM_GET_SUPPORTED_HV_CPUID should return 6 entries"
- " when Enlightened VMCS is disabled (returned %d)",
- hv_cpuid_entries->nent);
- else
- TEST_ASSERT(hv_cpuid_entries->nent == 7,
- "KVM_GET_SUPPORTED_HV_CPUID should return 7 entries"
- " when Enlightened VMCS is enabled (returned %d)",
- hv_cpuid_entries->nent);
+ if (syndbg_enabled)
+ nent += 3; /* 0x40000080 - 0x40000082 */
+
+ TEST_ASSERT(hv_cpuid_entries->nent == nent,
+ "KVM_GET_SUPPORTED_HV_CPUID should return %d entries"
+ " with evmcs=%d syndbg=%d (returned %d)",
+ nent, evmcs_enabled, syndbg_enabled,
+ hv_cpuid_entries->nent);
for (i = 0; i < hv_cpuid_entries->nent; i++) {
struct kvm_cpuid_entry2 *entry = &hv_cpuid_entries->entries[i];
TEST_ASSERT((entry->function >= 0x40000000) &&
- (entry->function <= 0x4000000A),
+ (entry->function <= 0x40000082),
"function %x is our of supported range",
entry->function);
+ TEST_ASSERT(evmcs_enabled || (entry->function != 0x4000000A),
+ "0x4000000A leaf should not be reported");
+
+ TEST_ASSERT(syndbg_enabled || (entry->function <= 0x4000000A),
+ "SYNDBG leaves should not be reported");
+
TEST_ASSERT(entry->index == 0,
".index field should be zero");
@@ -78,12 +96,27 @@ static void test_hv_cpuid(struct kvm_cpuid2 *hv_cpuid_entries,
TEST_ASSERT(!entry->padding[0] && !entry->padding[1] &&
!entry->padding[2], "padding should be zero");
- if (entry->function == 0x40000004) {
- int nononarchcs = !!(entry->eax & (1UL << 18));
-
- TEST_ASSERT(nononarchcs == !smt_possible(),
+ switch (entry->function) {
+ case 0x40000000:
+ test_val = 0x40000005;
+ if (evmcs_enabled)
+ test_val = 0x4000000A;
+ if (syndbg_enabled)
+ test_val = 0x40000082;
+
+ TEST_ASSERT(entry->eax == test_val,
+ "Wrong max leaf report in 0x40000000.EAX: %x"
+ " (evmcs=%d syndbg=%d)",
+ entry->eax, evmcs_enabled, syndbg_enabled
+ );
+ break;
+ case 0x40000004:
+ test_val = entry->eax & (1UL << 18);
+
+ TEST_ASSERT(!!test_val == !smt_possible(),
"NoNonArchitecturalCoreSharing bit"
" doesn't reflect SMT setting");
+ break;
}
/*
@@ -133,8 +166,9 @@ struct kvm_cpuid2 *kvm_get_supported_hv_cpuid(struct kvm_vm *vm)
int main(int argc, char *argv[])
{
struct kvm_vm *vm;
- int rv;
+ int rv, stage;
struct kvm_cpuid2 *hv_cpuid_entries;
+ bool evmcs_enabled, syndbg_enabled;
/* Tell stdout not to buffer its content */
setbuf(stdout, NULL);
@@ -150,31 +184,51 @@ int main(int argc, char *argv[])
test_hv_cpuid_e2big(vm);
- hv_cpuid_entries = kvm_get_supported_hv_cpuid(vm);
- if (!hv_cpuid_entries)
- return 1;
-
- test_hv_cpuid(hv_cpuid_entries, 0);
+ kvm_vm_free(vm);
- free(hv_cpuid_entries);
+ for (stage = 0; stage < 5; stage++) {
+ evmcs_enabled = false;
+ syndbg_enabled = false;
+
+ vm = vm_create_default(VCPU_ID, 0, guest_code);
+ switch (stage) {
+ case 0:
+ test_hv_cpuid_e2big(vm);
+ continue;
+ case 1:
+ break;
+ case 2:
+ if (!kvm_check_cap(KVM_CAP_HYPERV_ENLIGHTENED_VMCS)) {
+ print_skip("Enlightened VMCS is unsupported");
+ continue;
+ }
+ vcpu_enable_evmcs(vm, VCPU_ID);
+ evmcs_enabled = true;
+ break;
+ case 3:
+ if (!kvm_check_cap(KVM_CAP_HYPERV_SYNDBG)) {
+ print_skip("Synthetic debugger is unsupported");
+ continue;
+ }
+ vcpu_enable_syndbg(vm, VCPU_ID);
+ syndbg_enabled = true;
+ break;
+ case 4:
+ if (!kvm_check_cap(KVM_CAP_HYPERV_ENLIGHTENED_VMCS) ||
+ !kvm_check_cap(KVM_CAP_HYPERV_SYNDBG))
+ continue;
+ vcpu_enable_evmcs(vm, VCPU_ID);
+ vcpu_enable_syndbg(vm, VCPU_ID);
+ evmcs_enabled = true;
+ syndbg_enabled = true;
+ break;
+ }
- if (!kvm_check_cap(KVM_CAP_HYPERV_ENLIGHTENED_VMCS)) {
- print_skip("Enlightened VMCS is unsupported");
- goto vm_free;
+ hv_cpuid_entries = kvm_get_supported_hv_cpuid(vm);
+ test_hv_cpuid(hv_cpuid_entries, evmcs_enabled, syndbg_enabled);
+ free(hv_cpuid_entries);
+ kvm_vm_free(vm);
}
- vcpu_enable_evmcs(vm, VCPU_ID);
-
- hv_cpuid_entries = kvm_get_supported_hv_cpuid(vm);
- if (!hv_cpuid_entries)
- return 1;
-
- test_hv_cpuid(hv_cpuid_entries, 1);
-
- free(hv_cpuid_entries);
-
-vm_free:
- kvm_vm_free(vm);
-
return 0;
}
--
2.25.1
prev parent reply other threads:[~2020-03-23 9:51 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-20 17:28 [PATCH v9 0/6] x86/kvm/hyper-v: add support for synthetic debugger Jon Doron
2020-03-20 17:28 ` [PATCH v9 1/6] x86/kvm/hyper-v: Explicitly align hcall param for kvm_hyperv_exit Jon Doron
2020-03-23 9:53 ` Vitaly Kuznetsov
2020-03-20 17:28 ` [PATCH v9 2/6] x86/kvm/hyper-v: Simplify addition for custom cpuid leafs Jon Doron
2020-03-23 10:16 ` Vitaly Kuznetsov
2020-03-20 17:28 ` [PATCH v9 3/6] x86/hyper-v: Add synthetic debugger definitions Jon Doron
2020-03-23 10:17 ` Vitaly Kuznetsov
2020-03-20 17:28 ` [PATCH v9 4/6] x86/kvm/hyper-v: Add support for synthetic debugger capability Jon Doron
2020-03-23 10:36 ` Vitaly Kuznetsov
2020-03-20 17:28 ` [PATCH v9 5/6] x86/kvm/hyper-v: enable hypercalls without hypercall page with syndbg Jon Doron
2020-03-20 17:28 ` [PATCH v9 6/6] x86/kvm/hyper-v: Add support for synthetic debugger via hypercalls Jon Doron
2020-03-23 9:51 ` Vitaly Kuznetsov [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200323095116.415586-1-vkuznets@redhat.com \
--to=vkuznets@redhat.com \
--cc=arilou@gmail.com \
--cc=kvm@vger.kernel.org \
--cc=linux-hyperv@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).