selftests: kvm: Move kvm_get_supported_hv_cpuid() to common code
authorVitaly Kuznetsov <vkuznets@redhat.com>
Tue, 26 Jan 2021 13:48:02 +0000 (14:48 +0100)
committerPaolo Bonzini <pbonzini@redhat.com>
Tue, 9 Feb 2021 13:17:09 +0000 (08:17 -0500)
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>
tools/testing/selftests/kvm/include/x86_64/processor.h
tools/testing/selftests/kvm/lib/x86_64/processor.c
tools/testing/selftests/kvm/x86_64/hyperv_cpuid.c

index 582dfb2..42292d6 100644 (file)
@@ -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 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
  */
index 5a15264..18483df 100644 (file)
@@ -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));
        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;
+}
index 88a595b..7e2d2d1 100644 (file)
@@ -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);
 }
 
-
-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[])
 {
        struct kvm_vm *vm;
@@ -167,7 +143,7 @@ int main(int argc, char *argv[])
        /* Test vCPU ioctl version */
        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);
        free(hv_cpuid_entries);
 
@@ -177,7 +153,7 @@ int main(int argc, char *argv[])
                goto do_sys;
        }
        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);
        free(hv_cpuid_entries);
 
@@ -190,9 +166,8 @@ do_sys:
 
        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());
-       free(hv_cpuid_entries);
 
 out:
        kvm_vm_free(vm);