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: Vitaly Kuznetsov <vkuznets@redhat.com> Message-Id: <20210126134816.1880136-2-vkuznets@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
4fc096a99e
commit
32f00fd9ef
@ -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,
|
|||||||
: "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)
|
|||||||
" 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[])
|
|||||||
/* 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[])
|
|||||||
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 @@ do_sys:
|
|||||||
|
|
||||||
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user