On Wed, Jun 08, 2016 at 10:22:26 +0200, Jiri Denemark wrote: > So far we only test CPUID -> CPU def conversion on artificial CPUID data > computed from another CPU def. This patch adds the infrastructure to > test this conversion on real data gathered from a host CPU and two > helper scripts for adding new test data: > > - cpu-gather.sh runs cpuid tool and qemu-system-x86_64 to get CPUID data > from the host CPU; this is what users can be asked to run if they run > into an issue with host CPU detection in libvirt > > - cpu-parse.sh takes the data generated by cpu-gather.sh and creates > data files for CPU detection tests > > The CPUID data queried from QEMU will eventually switch to the format > used by query-host-cpu QMP command once QEMU implements it. Until then > we just spawn QEMU with -cpu host and query the guest CPU in QOM. They > should both provide the same CPUID results, but query-host-cpu does not > require any guest CPU to be created by QEMU. > > Signed-off-by: Jiri Denemark <jdenemar@xxxxxxxxxx> > --- > tests/Makefile.am | 4 ++ > tests/cputest.c | 156 +++++++++++++++++++++++++++++++++++++++- > tests/cputestdata/cpu-gather.sh | 35 +++++++++ > tests/cputestdata/cpu-parse.sh | 57 +++++++++++++++ > 4 files changed, 249 insertions(+), 3 deletions(-) > create mode 100755 tests/cputestdata/cpu-gather.sh > create mode 100755 tests/cputestdata/cpu-parse.sh [...] > diff --git a/tests/cputest.c b/tests/cputest.c > index 431b587..2b243bb 100644 > --- a/tests/cputest.c > +++ b/tests/cputest.c [...] > @@ -458,12 +474,114 @@ cpuTestHasFeature(const void *arg) > } > > > +static int > +cpuTestCPUID(const void *arg) > +{ > + const struct data *data = arg; > + int ret = -1; > + virCPUDataPtr hostData = NULL; > + char *hostFile = NULL; hostFile is not freed > + char *host; 'host' is uninitialized and not freed > + virCPUDefPtr cpu = NULL; > + char *result = NULL; > + > + if (virAsprintf(&hostFile, "%s/cputestdata/%s-cpuid-%s.xml", > + abs_srcdir, data->arch, data->host) < 0 || > + virtTestLoadFile(hostFile, &host) < 0 || > + !(hostData = cpuDataParse(host))) > + goto cleanup; This one monster if condition is ugly. > + > + if (VIR_ALLOC(cpu) < 0) > + goto cleanup; > + > + cpu->arch = hostData->arch; > + if (data->api == API_GUEST_CPUID) { > + cpu->type = VIR_CPU_TYPE_GUEST; > + cpu->match = VIR_CPU_MATCH_EXACT; > + cpu->fallback = VIR_CPU_FALLBACK_FORBID; > + } else { > + cpu->type = VIR_CPU_TYPE_HOST; > + } > + > + if (cpuDecode(cpu, hostData, NULL, 0, NULL) < 0) > + goto cleanup; > + > + if (virAsprintf(&result, "cpuid-%s-%s", > + data->host, > + data->api == API_HOST_CPUID ? "host" : "guest") < 0) > + goto cleanup; > + > + ret = cpuTestCompareXML(data->arch, cpu, result, false); > + > + cleanup: > + cpuDataFree(hostData); > + virCPUDefFree(cpu); > + VIR_FREE(result); > + return ret; > +} ACK -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list