Commit 32f00fd9 authored by Vitaly Kuznetsov's avatar Vitaly Kuznetsov Committed by Paolo Bonzini

selftests: kvm: Move kvm_get_supported_hv_cpuid() to common code

kvm_get_supported_hv_cpuid() may come handy in all Hyper-V related tests.
Split it off hyperv_cpuid test, create system-wide and vcpu versions.
Signed-off-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
Message-Id: <20210126134816.1880136-2-vkuznets@redhat.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 4fc096a9
...@@ -406,6 +406,9 @@ bool set_cpuid(struct kvm_cpuid2 *cpuid, struct kvm_cpuid_entry2 *ent); ...@@ -406,6 +406,9 @@ bool set_cpuid(struct kvm_cpuid2 *cpuid, struct kvm_cpuid_entry2 *ent);
uint64_t kvm_hypercall(uint64_t nr, uint64_t a0, uint64_t a1, uint64_t a2, uint64_t kvm_hypercall(uint64_t nr, uint64_t a0, uint64_t a1, uint64_t a2,
uint64_t a3); uint64_t a3);
struct kvm_cpuid2 *kvm_get_supported_hv_cpuid(void);
struct kvm_cpuid2 *vcpu_get_supported_hv_cpuid(struct kvm_vm *vm, uint32_t vcpuid);
/* /*
* Basic CPU control in CR0 * Basic CPU control in CR0
*/ */
......
...@@ -1300,3 +1300,36 @@ uint64_t kvm_hypercall(uint64_t nr, uint64_t a0, uint64_t a1, uint64_t a2, ...@@ -1300,3 +1300,36 @@ uint64_t kvm_hypercall(uint64_t nr, uint64_t a0, uint64_t a1, uint64_t a2,
: "b"(a0), "c"(a1), "d"(a2), "S"(a3)); : "b"(a0), "c"(a1), "d"(a2), "S"(a3));
return r; return r;
} }
struct kvm_cpuid2 *kvm_get_supported_hv_cpuid(void)
{
static struct kvm_cpuid2 *cpuid;
int ret;
int kvm_fd;
if (cpuid)
return cpuid;
cpuid = allocate_kvm_cpuid2();
kvm_fd = open(KVM_DEV_PATH, O_RDONLY);
if (kvm_fd < 0)
exit(KSFT_SKIP);
ret = ioctl(kvm_fd, KVM_GET_SUPPORTED_HV_CPUID, cpuid);
TEST_ASSERT(ret == 0, "KVM_GET_SUPPORTED_HV_CPUID failed %d %d\n",
ret, errno);
close(kvm_fd);
return cpuid;
}
struct kvm_cpuid2 *vcpu_get_supported_hv_cpuid(struct kvm_vm *vm, uint32_t vcpuid)
{
static struct kvm_cpuid2 *cpuid;
cpuid = allocate_kvm_cpuid2();
vcpu_ioctl(vm, vcpuid, KVM_GET_SUPPORTED_HV_CPUID, cpuid);
return cpuid;
}
...@@ -125,30 +125,6 @@ void test_hv_cpuid_e2big(struct kvm_vm *vm, bool system) ...@@ -125,30 +125,6 @@ void test_hv_cpuid_e2big(struct kvm_vm *vm, bool system)
" it should have: %d %d", system ? "KVM" : "vCPU", ret, errno); " it should have: %d %d", system ? "KVM" : "vCPU", ret, errno);
} }
struct kvm_cpuid2 *kvm_get_supported_hv_cpuid(struct kvm_vm *vm, bool system)
{
int nent = 20; /* should be enough */
static struct kvm_cpuid2 *cpuid;
cpuid = malloc(sizeof(*cpuid) + nent * sizeof(struct kvm_cpuid_entry2));
if (!cpuid) {
perror("malloc");
abort();
}
cpuid->nent = nent;
if (!system)
vcpu_ioctl(vm, VCPU_ID, KVM_GET_SUPPORTED_HV_CPUID, cpuid);
else
kvm_ioctl(vm, KVM_GET_SUPPORTED_HV_CPUID, cpuid);
return cpuid;
}
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
struct kvm_vm *vm; struct kvm_vm *vm;
...@@ -167,7 +143,7 @@ int main(int argc, char *argv[]) ...@@ -167,7 +143,7 @@ int main(int argc, char *argv[])
/* Test vCPU ioctl version */ /* Test vCPU ioctl version */
test_hv_cpuid_e2big(vm, false); test_hv_cpuid_e2big(vm, false);
hv_cpuid_entries = kvm_get_supported_hv_cpuid(vm, false); hv_cpuid_entries = vcpu_get_supported_hv_cpuid(vm, VCPU_ID);
test_hv_cpuid(hv_cpuid_entries, false); test_hv_cpuid(hv_cpuid_entries, false);
free(hv_cpuid_entries); free(hv_cpuid_entries);
...@@ -177,7 +153,7 @@ int main(int argc, char *argv[]) ...@@ -177,7 +153,7 @@ int main(int argc, char *argv[])
goto do_sys; goto do_sys;
} }
vcpu_enable_evmcs(vm, VCPU_ID); vcpu_enable_evmcs(vm, VCPU_ID);
hv_cpuid_entries = kvm_get_supported_hv_cpuid(vm, false); hv_cpuid_entries = vcpu_get_supported_hv_cpuid(vm, VCPU_ID);
test_hv_cpuid(hv_cpuid_entries, true); test_hv_cpuid(hv_cpuid_entries, true);
free(hv_cpuid_entries); free(hv_cpuid_entries);
...@@ -190,9 +166,8 @@ int main(int argc, char *argv[]) ...@@ -190,9 +166,8 @@ int main(int argc, char *argv[])
test_hv_cpuid_e2big(vm, true); test_hv_cpuid_e2big(vm, true);
hv_cpuid_entries = kvm_get_supported_hv_cpuid(vm, true); hv_cpuid_entries = kvm_get_supported_hv_cpuid();
test_hv_cpuid(hv_cpuid_entries, nested_vmx_supported()); test_hv_cpuid(hv_cpuid_entries, nested_vmx_supported());
free(hv_cpuid_entries);
out: out:
kvm_vm_free(vm); kvm_vm_free(vm);
......
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