From nobody Mon Feb 9 05:43:20 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1554713001437310.43031399711185; Mon, 8 Apr 2019 01:43:21 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 970F2E3DF1; Mon, 8 Apr 2019 08:43:19 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 6BA355D731; Mon, 8 Apr 2019 08:43:19 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 27FA5181B9FB; Mon, 8 Apr 2019 08:43:19 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x388gwjv009143 for ; Mon, 8 Apr 2019 04:42:58 -0400 Received: by smtp.corp.redhat.com (Postfix) id 16A025D719; Mon, 8 Apr 2019 08:42:58 +0000 (UTC) Received: from virval.usersys.redhat.com (unknown [10.43.2.188]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 91F735D71B for ; Mon, 8 Apr 2019 08:42:55 +0000 (UTC) Received: by virval.usersys.redhat.com (Postfix, from userid 500) id AA1EC10363C; Mon, 8 Apr 2019 10:42:50 +0200 (CEST) From: Jiri Denemark To: libvir-list@redhat.com Date: Mon, 8 Apr 2019 10:42:10 +0200 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH 06/36] cpu_x86: Introduce virCPUx86DataItem container struct X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 08 Apr 2019 08:43:20 +0000 (UTC) Content-Type: text/plain; charset="utf-8" The following patches introduce CPU features read from MSR in addition to those queried via CPUID instruction. Let's introduce a container struct which will be able to describe either feature type. Signed-off-by: Jiri Denemark Reviewed-by: J=C3=A1n Tomko --- src/cpu/cpu_x86.c | 312 ++++++++++++++++++--------------- src/cpu/cpu_x86.h | 2 +- src/cpu/cpu_x86_data.h | 9 +- src/libxl/libxl_capabilities.c | 8 +- src/qemu/qemu_monitor_json.c | 6 +- 5 files changed, 183 insertions(+), 154 deletions(-) diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c index 3a8e3dd37f..c7937d55fd 100644 --- a/src/cpu/cpu_x86.c +++ b/src/cpu/cpu_x86.c @@ -45,7 +45,7 @@ typedef struct _virCPUx86Vendor virCPUx86Vendor; typedef virCPUx86Vendor *virCPUx86VendorPtr; struct _virCPUx86Vendor { char *name; - virCPUx86CPUID cpuid; + virCPUx86DataItem cpuid; }; =20 typedef struct _virCPUx86Feature virCPUx86Feature; @@ -57,17 +57,19 @@ struct _virCPUx86Feature { }; =20 =20 +#define CPUID(...) { .cpuid =3D {__VA_ARGS__} } + #define KVM_FEATURE_DEF(Name, Eax_in, Eax) \ - static virCPUx86CPUID Name ## _cpuid[] =3D { \ - { .eax_in =3D Eax_in, .eax =3D Eax }, \ + static virCPUx86DataItem Name ## _data[] =3D { \ + CPUID(.eax_in =3D Eax_in, .eax =3D Eax), \ } =20 #define KVM_FEATURE(Name) \ { \ .name =3D (char *) Name, \ .data =3D { \ - .len =3D ARRAY_CARDINALITY(Name ## _cpuid), \ - .data =3D Name ## _cpuid \ + .len =3D ARRAY_CARDINALITY(Name ## _data), \ + .items =3D Name ## _data, \ } \ } =20 @@ -288,17 +290,17 @@ x86FeatureFindInternal(const char *name) static int virCPUx86CPUIDSorter(const void *a, const void *b) { - virCPUx86CPUID *da =3D (virCPUx86CPUID *) a; - virCPUx86CPUID *db =3D (virCPUx86CPUID *) b; + virCPUx86DataItemPtr da =3D (virCPUx86DataItemPtr) a; + virCPUx86DataItemPtr db =3D (virCPUx86DataItemPtr) b; =20 - if (da->eax_in > db->eax_in) + if (da->cpuid.eax_in > db->cpuid.eax_in) return 1; - else if (da->eax_in < db->eax_in) + else if (da->cpuid.eax_in < db->cpuid.eax_in) return -1; =20 - if (da->ecx_in > db->ecx_in) + if (da->cpuid.ecx_in > db->cpuid.ecx_in) return 1; - else if (da->ecx_in < db->ecx_in) + else if (da->cpuid.ecx_in < db->cpuid.ecx_in) return -1; =20 return 0; @@ -306,7 +308,7 @@ virCPUx86CPUIDSorter(const void *a, const void *b) =20 =20 /* skips all zero CPUID leaves */ -static virCPUx86CPUID * +static virCPUx86DataItemPtr x86DataCpuidNext(virCPUx86DataIteratorPtr iterator) { const virCPUx86Data *data =3D iterator->data; @@ -315,24 +317,26 @@ x86DataCpuidNext(virCPUx86DataIteratorPtr iterator) return NULL; =20 while (++iterator->pos < data->len) { - if (!x86cpuidMatch(data->data + iterator->pos, &cpuidNull)) - return data->data + iterator->pos; + virCPUx86DataItemPtr item =3D data->items + iterator->pos; + + if (!x86cpuidMatch(&item->cpuid, &cpuidNull)) + return item; } =20 return NULL; } =20 =20 -static virCPUx86CPUID * +static virCPUx86DataItemPtr x86DataCpuid(const virCPUx86Data *data, - const virCPUx86CPUID *cpuid) + const virCPUx86DataItem *cpuid) { size_t i; =20 for (i =3D 0; i < data->len; i++) { - if (data->data[i].eax_in =3D=3D cpuid->eax_in && - data->data[i].ecx_in =3D=3D cpuid->ecx_in) - return data->data + i; + if (data->items[i].cpuid.eax_in =3D=3D cpuid->cpuid.eax_in && + data->items[i].cpuid.ecx_in =3D=3D cpuid->cpuid.ecx_in) + return data->items + i; } =20 return NULL; @@ -344,7 +348,7 @@ virCPUx86DataClear(virCPUx86Data *data) if (!data) return; =20 - VIR_FREE(data->data); + VIR_FREE(data->items); } =20 =20 @@ -364,12 +368,12 @@ x86DataCopy(virCPUx86Data *dst, const virCPUx86Data *= src) { size_t i; =20 - if (VIR_ALLOC_N(dst->data, src->len) < 0) + if (VIR_ALLOC_N(dst->items, src->len) < 0) return -1; =20 dst->len =3D src->len; for (i =3D 0; i < src->len; i++) - dst->data[i] =3D src->data[i]; + dst->items[i] =3D src->items[i]; =20 return 0; } @@ -377,19 +381,19 @@ x86DataCopy(virCPUx86Data *dst, const virCPUx86Data *= src) =20 static int virCPUx86DataAddCPUIDInt(virCPUx86Data *data, - const virCPUx86CPUID *cpuid) + const virCPUx86DataItem *cpuid) { - virCPUx86CPUID *existing; + virCPUx86DataItemPtr existing; =20 if ((existing =3D x86DataCpuid(data, cpuid))) { - x86cpuidSetBits(existing, cpuid); + x86cpuidSetBits(&existing->cpuid, &cpuid->cpuid); } else { - if (VIR_APPEND_ELEMENT_COPY(data->data, data->len, - *((virCPUx86CPUID *)cpuid)) < 0) + if (VIR_APPEND_ELEMENT_COPY(data->items, data->len, + *((virCPUx86DataItemPtr)cpuid)) < 0) return -1; =20 - qsort(data->data, data->len, - sizeof(virCPUx86CPUID), virCPUx86CPUIDSorter); + qsort(data->items, data->len, + sizeof(virCPUx86DataItem), virCPUx86CPUIDSorter); } =20 return 0; @@ -401,14 +405,14 @@ x86DataAdd(virCPUx86Data *data1, const virCPUx86Data *data2) { virCPUx86DataIterator iter =3D virCPUx86DataIteratorInit(data2); - virCPUx86CPUID *cpuid1; - virCPUx86CPUID *cpuid2; + virCPUx86DataItemPtr cpuid1; + virCPUx86DataItemPtr cpuid2; =20 while ((cpuid2 =3D x86DataCpuidNext(&iter))) { cpuid1 =3D x86DataCpuid(data1, cpuid2); =20 if (cpuid1) { - x86cpuidSetBits(cpuid1, cpuid2); + x86cpuidSetBits(&cpuid1->cpuid, &cpuid2->cpuid); } else { if (virCPUx86DataAddCPUIDInt(data1, cpuid2) < 0) return -1; @@ -424,12 +428,12 @@ x86DataSubtract(virCPUx86Data *data1, const virCPUx86Data *data2) { virCPUx86DataIterator iter =3D virCPUx86DataIteratorInit(data1); - virCPUx86CPUID *cpuid1; - virCPUx86CPUID *cpuid2; + virCPUx86DataItemPtr cpuid1; + virCPUx86DataItemPtr cpuid2; =20 while ((cpuid1 =3D x86DataCpuidNext(&iter))) { - cpuid2 =3D x86DataCpuid(data2, cpuid1); - x86cpuidClearBits(cpuid1, cpuid2); + if ((cpuid2 =3D x86DataCpuid(data2, cpuid1))) + x86cpuidClearBits(&cpuid1->cpuid, &cpuid2->cpuid); } } =20 @@ -439,15 +443,15 @@ x86DataIntersect(virCPUx86Data *data1, const virCPUx86Data *data2) { virCPUx86DataIterator iter =3D virCPUx86DataIteratorInit(data1); - virCPUx86CPUID *cpuid1; - virCPUx86CPUID *cpuid2; + virCPUx86DataItemPtr cpuid1; + virCPUx86DataItemPtr cpuid2; =20 while ((cpuid1 =3D x86DataCpuidNext(&iter))) { cpuid2 =3D x86DataCpuid(data2, cpuid1); if (cpuid2) - x86cpuidAndBits(cpuid1, cpuid2); + x86cpuidAndBits(&cpuid1->cpuid, &cpuid2->cpuid); else - x86cpuidClearBits(cpuid1, cpuid1); + x86cpuidClearBits(&cpuid1->cpuid, &cpuid1->cpuid); } } =20 @@ -466,12 +470,12 @@ x86DataIsSubset(const virCPUx86Data *data, const virCPUx86Data *subset) { virCPUx86DataIterator iter =3D virCPUx86DataIteratorInit((virCPUx86Dat= a *)subset); - const virCPUx86CPUID *cpuid; - const virCPUx86CPUID *cpuidSubset; + const virCPUx86DataItem *cpuid; + const virCPUx86DataItem *cpuidSubset; =20 while ((cpuidSubset =3D x86DataCpuidNext(&iter))) { if (!(cpuid =3D x86DataCpuid(data, cpuidSubset)) || - !x86cpuidMatchMasked(cpuid, cpuidSubset)) + !x86cpuidMatchMasked(&cpuid->cpuid, &cpuidSubset->cpuid)) return false; } =20 @@ -506,14 +510,14 @@ static virCPUx86VendorPtr x86DataToVendor(const virCPUx86Data *data, virCPUx86MapPtr map) { - virCPUx86CPUID *cpuid; + virCPUx86DataItemPtr cpuid; size_t i; =20 for (i =3D 0; i < map->nvendors; i++) { virCPUx86VendorPtr vendor =3D map->vendors[i]; if ((cpuid =3D x86DataCpuid(data, &vendor->cpuid)) && - x86cpuidMatchMasked(cpuid, &vendor->cpuid)) { - x86cpuidClearBits(cpuid, &vendor->cpuid); + x86cpuidMatchMasked(&cpuid->cpuid, &vendor->cpuid.cpuid)) { + x86cpuidClearBits(&cpuid->cpuid, &vendor->cpuid.cpuid); return vendor; } } @@ -524,8 +528,10 @@ x86DataToVendor(const virCPUx86Data *data, =20 static int virCPUx86VendorToCPUID(const char *vendor, - virCPUx86CPUID *cpuid) + virCPUx86DataItemPtr data) { + virCPUx86CPUIDPtr cpuid =3D &data->cpuid; + if (strlen(vendor) !=3D VENDOR_STRING_LENGTH) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Invalid CPU vendor string '%s'"), vendor); @@ -598,14 +604,16 @@ x86DataToSignatureFull(const virCPUx86Data *data, unsigned int *model, unsigned int *stepping) { - virCPUx86CPUID leaf1 =3D { .eax_in =3D 0x1 }; - virCPUx86CPUID *cpuid; + virCPUx86DataItem leaf1 =3D CPUID(.eax_in =3D 0x1); + virCPUx86DataItemPtr item; + virCPUx86CPUIDPtr cpuid; =20 *family =3D *model =3D *stepping =3D 0; =20 - if (!(cpuid =3D x86DataCpuid(data, &leaf1))) + if (!(item =3D x86DataCpuid(data, &leaf1))) return; =20 + cpuid =3D &item->cpuid; *family =3D ((cpuid->eax >> 20) & 0xff) + ((cpuid->eax >> 8) & 0xf); *model =3D ((cpuid->eax >> 12) & 0xf0) + ((cpuid->eax >> 4) & 0xf); *stepping =3D cpuid->eax & 0xf; @@ -618,13 +626,13 @@ x86DataToSignatureFull(const virCPUx86Data *data, static uint32_t x86DataToSignature(const virCPUx86Data *data) { - virCPUx86CPUID leaf1 =3D { .eax_in =3D 0x1 }; - virCPUx86CPUID *cpuid; + virCPUx86DataItem leaf1 =3D CPUID(.eax_in =3D 0x1); + virCPUx86DataItemPtr cpuid; =20 if (!(cpuid =3D x86DataCpuid(data, &leaf1))) return 0; =20 - return cpuid->eax & SIGNATURE_MASK; + return cpuid->cpuid.eax & SIGNATURE_MASK; } =20 =20 @@ -632,7 +640,7 @@ static int x86DataAddSignature(virCPUx86Data *data, uint32_t signature) { - virCPUx86CPUID cpuid =3D { .eax_in =3D 0x1, .eax =3D signature }; + virCPUx86DataItem cpuid =3D CPUID(.eax_in =3D 0x1, .eax =3D signature); =20 return virCPUx86DataAddCPUIDInt(data, &cpuid); } @@ -857,13 +865,14 @@ x86FeatureNames(virCPUx86MapPtr map, =20 static int x86ParseCPUID(xmlXPathContextPtr ctxt, - virCPUx86CPUID *cpuid) + virCPUx86DataItemPtr item) { + virCPUx86CPUIDPtr cpuid; unsigned long eax_in, ecx_in; unsigned long eax, ebx, ecx, edx; int ret_eax_in, ret_ecx_in, ret_eax, ret_ebx, ret_ecx, ret_edx; =20 - memset(cpuid, 0, sizeof(*cpuid)); + memset(item, 0, sizeof(*item)); =20 eax_in =3D ecx_in =3D 0; eax =3D ebx =3D ecx =3D edx =3D 0; @@ -878,6 +887,7 @@ x86ParseCPUID(xmlXPathContextPtr ctxt, ret_eax =3D=3D -2 || ret_ebx =3D=3D -2 || ret_ecx =3D=3D -2 || ret= _edx =3D=3D -2) return -1; =20 + cpuid =3D &item->cpuid; cpuid->eax_in =3D eax_in; cpuid->ecx_in =3D ecx_in; cpuid->eax =3D eax; @@ -896,7 +906,7 @@ x86FeatureParse(xmlXPathContextPtr ctxt, virCPUx86MapPtr map =3D data; xmlNodePtr *nodes =3D NULL; virCPUx86FeaturePtr feature; - virCPUx86CPUID cpuid; + virCPUx86DataItem cpuid; size_t i; int n; char *str =3D NULL; @@ -1139,16 +1149,16 @@ x86ModelCompare(virCPUx86ModelPtr model1, virCPUx86CompareResult result =3D EQUAL; virCPUx86DataIterator iter1 =3D virCPUx86DataIteratorInit(&model1->dat= a); virCPUx86DataIterator iter2 =3D virCPUx86DataIteratorInit(&model2->dat= a); - virCPUx86CPUID *cpuid1; - virCPUx86CPUID *cpuid2; + virCPUx86DataItemPtr cpuid1; + virCPUx86DataItemPtr cpuid2; =20 while ((cpuid1 =3D x86DataCpuidNext(&iter1))) { virCPUx86CompareResult match =3D SUPERSET; =20 if ((cpuid2 =3D x86DataCpuid(&model2->data, cpuid1))) { - if (x86cpuidMatch(cpuid1, cpuid2)) + if (x86cpuidMatch(&cpuid1->cpuid, &cpuid2->cpuid)) continue; - else if (!x86cpuidMatchMasked(cpuid1, cpuid2)) + else if (!x86cpuidMatchMasked(&cpuid1->cpuid, &cpuid2->cpuid)) match =3D SUBSET; } =20 @@ -1162,9 +1172,9 @@ x86ModelCompare(virCPUx86ModelPtr model1, virCPUx86CompareResult match =3D SUBSET; =20 if ((cpuid1 =3D x86DataCpuid(&model1->data, cpuid2))) { - if (x86cpuidMatch(cpuid2, cpuid1)) + if (x86cpuidMatch(&cpuid2->cpuid, &cpuid1->cpuid)) continue; - else if (!x86cpuidMatchMasked(cpuid2, cpuid1)) + else if (!x86cpuidMatchMasked(&cpuid2->cpuid, &cpuid1->cpuid)) match =3D SUPERSET; } =20 @@ -1448,11 +1458,12 @@ static char * virCPUx86DataFormat(const virCPUData *data) { virCPUx86DataIterator iter =3D virCPUx86DataIteratorInit(&data->data.x= 86); - virCPUx86CPUID *cpuid; + virCPUx86DataItemPtr item; virBuffer buf =3D VIR_BUFFER_INITIALIZER; =20 virBufferAddLit(&buf, "\n"); - while ((cpuid =3D x86DataCpuidNext(&iter))) { + while ((item =3D x86DataCpuidNext(&iter))) { + virCPUx86CPUIDPtr cpuid =3D &item->cpuid; virBufferAsprintf(&buf, " data; model->data.len =3D 0; - model->data.data =3D NULL; + model->data.items =3D NULL; x86ModelFree(model); =20 return 0; @@ -2214,17 +2225,18 @@ cpuidCall(virCPUx86CPUID *cpuid) */ static int cpuidSetLeaf4(virCPUDataPtr data, - virCPUx86CPUID *subLeaf0) + virCPUx86DataItemPtr subLeaf0) { - virCPUx86CPUID cpuid =3D *subLeaf0; + virCPUx86DataItem item =3D *subLeaf0; + virCPUx86CPUIDPtr cpuid =3D &item.cpuid; =20 if (virCPUx86DataAddCPUID(data, subLeaf0) < 0) return -1; =20 - while (cpuid.eax & 0x1f) { - cpuid.ecx_in++; - cpuidCall(&cpuid); - if (virCPUx86DataAddCPUID(data, &cpuid) < 0) + while (cpuid->eax & 0x1f) { + cpuid->ecx_in++; + cpuidCall(cpuid); + if (virCPUx86DataAddCPUID(data, &item) < 0) return -1; } return 0; @@ -2237,18 +2249,19 @@ cpuidSetLeaf4(virCPUDataPtr data, */ static int cpuidSetLeaf7(virCPUDataPtr data, - virCPUx86CPUID *subLeaf0) + virCPUx86DataItemPtr subLeaf0) { - virCPUx86CPUID cpuid =3D { .eax_in =3D 0x7 }; + virCPUx86DataItem item =3D CPUID(.eax_in =3D 0x7); + virCPUx86CPUIDPtr cpuid =3D &item.cpuid; uint32_t sub; =20 if (virCPUx86DataAddCPUID(data, subLeaf0) < 0) return -1; =20 - for (sub =3D 1; sub <=3D subLeaf0->eax; sub++) { - cpuid.ecx_in =3D sub; - cpuidCall(&cpuid); - if (virCPUx86DataAddCPUID(data, &cpuid) < 0) + for (sub =3D 1; sub <=3D subLeaf0->cpuid.eax; sub++) { + cpuid->ecx_in =3D sub; + cpuidCall(cpuid); + if (virCPUx86DataAddCPUID(data, &item) < 0) return -1; } return 0; @@ -2264,15 +2277,16 @@ cpuidSetLeaf7(virCPUDataPtr data, */ static int cpuidSetLeafB(virCPUDataPtr data, - virCPUx86CPUID *subLeaf0) + virCPUx86DataItemPtr subLeaf0) { - virCPUx86CPUID cpuid =3D *subLeaf0; + virCPUx86DataItem item =3D *subLeaf0; + virCPUx86CPUIDPtr cpuid =3D &item.cpuid; =20 - while (cpuid.ecx & 0xff00) { - if (virCPUx86DataAddCPUID(data, &cpuid) < 0) + while (cpuid->ecx & 0xff00) { + if (virCPUx86DataAddCPUID(data, &item) < 0) return -1; - cpuid.ecx_in++; - cpuidCall(&cpuid); + cpuid->ecx_in++; + cpuidCall(cpuid); } return 0; } @@ -2288,9 +2302,10 @@ cpuidSetLeafB(virCPUDataPtr data, */ static int cpuidSetLeafD(virCPUDataPtr data, - virCPUx86CPUID *subLeaf0) + virCPUx86DataItemPtr subLeaf0) { - virCPUx86CPUID cpuid =3D { .eax_in =3D 0xd }; + virCPUx86DataItem item =3D CPUID(.eax_in =3D 0xd); + virCPUx86CPUIDPtr cpuid =3D &item.cpuid; virCPUx86CPUID sub0; virCPUx86CPUID sub1; uint32_t sub; @@ -2298,13 +2313,13 @@ cpuidSetLeafD(virCPUDataPtr data, if (virCPUx86DataAddCPUID(data, subLeaf0) < 0) return -1; =20 - cpuid.ecx_in =3D 1; - cpuidCall(&cpuid); - if (virCPUx86DataAddCPUID(data, &cpuid) < 0) + cpuid->ecx_in =3D 1; + cpuidCall(cpuid); + if (virCPUx86DataAddCPUID(data, &item) < 0) return -1; =20 - sub0 =3D *subLeaf0; - sub1 =3D cpuid; + sub0 =3D subLeaf0->cpuid; + sub1 =3D *cpuid; for (sub =3D 2; sub < 64; sub++) { if (sub < 32 && !(sub0.eax & (1 << sub)) && @@ -2315,9 +2330,9 @@ cpuidSetLeafD(virCPUDataPtr data, !(sub1.edx & (1 << (sub - 32)))) continue; =20 - cpuid.ecx_in =3D sub; - cpuidCall(&cpuid); - if (virCPUx86DataAddCPUID(data, &cpuid) < 0) + cpuid->ecx_in =3D sub; + cpuidCall(cpuid); + if (virCPUx86DataAddCPUID(data, &item) < 0) return -1; } return 0; @@ -2335,10 +2350,11 @@ cpuidSetLeafD(virCPUDataPtr data, */ static int cpuidSetLeafResID(virCPUDataPtr data, - virCPUx86CPUID *subLeaf0, + virCPUx86DataItemPtr subLeaf0, uint32_t res) { - virCPUx86CPUID cpuid =3D { .eax_in =3D subLeaf0->eax_in }; + virCPUx86DataItem item =3D CPUID(.eax_in =3D subLeaf0->cpuid.eax_in); + virCPUx86CPUIDPtr cpuid =3D &item.cpuid; uint32_t sub; =20 if (virCPUx86DataAddCPUID(data, subLeaf0) < 0) @@ -2347,9 +2363,9 @@ cpuidSetLeafResID(virCPUDataPtr data, for (sub =3D 1; sub < 32; sub++) { if (!(res & (1 << sub))) continue; - cpuid.ecx_in =3D sub; - cpuidCall(&cpuid); - if (virCPUx86DataAddCPUID(data, &cpuid) < 0) + cpuid->ecx_in =3D sub; + cpuidCall(cpuid); + if (virCPUx86DataAddCPUID(data, &item) < 0) return -1; } return 0; @@ -2363,31 +2379,32 @@ cpuidSetLeafResID(virCPUDataPtr data, */ static int cpuidSetLeaf12(virCPUDataPtr data, - virCPUx86CPUID *subLeaf0) + virCPUx86DataItemPtr subLeaf0) { - virCPUx86CPUID cpuid =3D { .eax_in =3D 0x7 }; - virCPUx86CPUID *cpuid7; + virCPUx86DataItem item =3D CPUID(.eax_in =3D 0x7); + virCPUx86CPUIDPtr cpuid =3D &item.cpuid; + virCPUx86DataItemPtr cpuid7; =20 - if (!(cpuid7 =3D x86DataCpuid(&data->data.x86, &cpuid)) || - !(cpuid7->ebx & (1 << 2))) + if (!(cpuid7 =3D x86DataCpuid(&data->data.x86, &item)) || + !(cpuid7->cpuid.ebx & (1 << 2))) return 0; =20 if (virCPUx86DataAddCPUID(data, subLeaf0) < 0) return -1; =20 - cpuid.eax_in =3D 0x12; - cpuid.ecx_in =3D 1; - cpuidCall(&cpuid); - if (virCPUx86DataAddCPUID(data, &cpuid) < 0) + cpuid->eax_in =3D 0x12; + cpuid->ecx_in =3D 1; + cpuidCall(cpuid); + if (virCPUx86DataAddCPUID(data, &item) < 0) return -1; =20 - cpuid.ecx_in =3D 2; - cpuidCall(&cpuid); - while (cpuid.eax & 0xf) { - if (virCPUx86DataAddCPUID(data, &cpuid) < 0) + cpuid->ecx_in =3D 2; + cpuidCall(cpuid); + while (cpuid->eax & 0xf) { + if (virCPUx86DataAddCPUID(data, &item) < 0) return -1; - cpuid.ecx_in++; - cpuidCall(&cpuid); + cpuid->ecx_in++; + cpuidCall(cpuid); } return 0; } @@ -2399,18 +2416,19 @@ cpuidSetLeaf12(virCPUDataPtr data, */ static int cpuidSetLeaf14(virCPUDataPtr data, - virCPUx86CPUID *subLeaf0) + virCPUx86DataItemPtr subLeaf0) { - virCPUx86CPUID cpuid =3D { .eax_in =3D 0x14 }; + virCPUx86DataItem item =3D CPUID(.eax_in =3D 0x14); + virCPUx86CPUIDPtr cpuid =3D &item.cpuid; uint32_t sub; =20 if (virCPUx86DataAddCPUID(data, subLeaf0) < 0) return -1; =20 - for (sub =3D 1; sub <=3D subLeaf0->eax; sub++) { - cpuid.ecx_in =3D sub; - cpuidCall(&cpuid); - if (virCPUx86DataAddCPUID(data, &cpuid) < 0) + for (sub =3D 1; sub <=3D subLeaf0->cpuid.eax; sub++) { + cpuid->ecx_in =3D sub; + cpuidCall(cpuid); + if (virCPUx86DataAddCPUID(data, &item) < 0) return -1; } return 0; @@ -2424,21 +2442,22 @@ cpuidSetLeaf14(virCPUDataPtr data, */ static int cpuidSetLeaf17(virCPUDataPtr data, - virCPUx86CPUID *subLeaf0) + virCPUx86DataItemPtr subLeaf0) { - virCPUx86CPUID cpuid =3D { .eax_in =3D 0x17 }; + virCPUx86DataItem item =3D CPUID(.eax_in =3D 0x17); + virCPUx86CPUIDPtr cpuid =3D &item.cpuid; uint32_t sub; =20 - if (subLeaf0->eax < 3) + if (subLeaf0->cpuid.eax < 3) return 0; =20 if (virCPUx86DataAddCPUID(data, subLeaf0) < 0) return -1; =20 - for (sub =3D 1; sub <=3D subLeaf0->eax; sub++) { - cpuid.ecx_in =3D sub; - cpuidCall(&cpuid); - if (virCPUx86DataAddCPUID(data, &cpuid) < 0) + for (sub =3D 1; sub <=3D subLeaf0->cpuid.eax; sub++) { + cpuid->ecx_in =3D sub; + cpuidCall(cpuid); + if (virCPUx86DataAddCPUID(data, &item) < 0) return -1; } return 0; @@ -2451,39 +2470,40 @@ cpuidSet(uint32_t base, virCPUDataPtr data) int rc; uint32_t max; uint32_t leaf; - virCPUx86CPUID cpuid =3D { .eax_in =3D base }; + virCPUx86DataItem item =3D CPUID(.eax_in =3D base); + virCPUx86CPUIDPtr cpuid =3D &item.cpuid; =20 - cpuidCall(&cpuid); - max =3D cpuid.eax; + cpuidCall(cpuid); + max =3D cpuid->eax; =20 for (leaf =3D base; leaf <=3D max; leaf++) { - cpuid.eax_in =3D leaf; - cpuid.ecx_in =3D 0; - cpuidCall(&cpuid); + cpuid->eax_in =3D leaf; + cpuid->ecx_in =3D 0; + cpuidCall(cpuid); =20 /* Handle CPUID leaves that depend on previously queried bits or * which provide additional sub leaves for ecx_in > 0 */ if (leaf =3D=3D 0x4) - rc =3D cpuidSetLeaf4(data, &cpuid); + rc =3D cpuidSetLeaf4(data, &item); else if (leaf =3D=3D 0x7) - rc =3D cpuidSetLeaf7(data, &cpuid); + rc =3D cpuidSetLeaf7(data, &item); else if (leaf =3D=3D 0xb) - rc =3D cpuidSetLeafB(data, &cpuid); + rc =3D cpuidSetLeafB(data, &item); else if (leaf =3D=3D 0xd) - rc =3D cpuidSetLeafD(data, &cpuid); + rc =3D cpuidSetLeafD(data, &item); else if (leaf =3D=3D 0xf) - rc =3D cpuidSetLeafResID(data, &cpuid, cpuid.edx); + rc =3D cpuidSetLeafResID(data, &item, cpuid->edx); else if (leaf =3D=3D 0x10) - rc =3D cpuidSetLeafResID(data, &cpuid, cpuid.ebx); + rc =3D cpuidSetLeafResID(data, &item, cpuid->ebx); else if (leaf =3D=3D 0x12) - rc =3D cpuidSetLeaf12(data, &cpuid); + rc =3D cpuidSetLeaf12(data, &item); else if (leaf =3D=3D 0x14) - rc =3D cpuidSetLeaf14(data, &cpuid); + rc =3D cpuidSetLeaf14(data, &item); else if (leaf =3D=3D 0x17) - rc =3D cpuidSetLeaf17(data, &cpuid); + rc =3D cpuidSetLeaf17(data, &item); else - rc =3D virCPUx86DataAddCPUID(data, &cpuid); + rc =3D virCPUx86DataAddCPUID(data, &item); =20 if (rc < 0) return -1; @@ -3059,7 +3079,7 @@ virCPUx86ValidateFeatures(virCPUDefPtr cpu) =20 int virCPUx86DataAddCPUID(virCPUDataPtr cpuData, - const virCPUx86CPUID *cpuid) + const virCPUx86DataItem *cpuid) { return virCPUx86DataAddCPUIDInt(&cpuData->data.x86, cpuid); } @@ -3093,7 +3113,7 @@ int virCPUx86DataSetVendor(virCPUDataPtr cpuData, const char *vendor) { - virCPUx86CPUID cpuid =3D { 0 }; + virCPUx86DataItem cpuid =3D CPUID(0); =20 if (virCPUx86VendorToCPUID(vendor, &cpuid) < 0) return -1; diff --git a/src/cpu/cpu_x86.h b/src/cpu/cpu_x86.h index 78714c0d67..166d4703aa 100644 --- a/src/cpu/cpu_x86.h +++ b/src/cpu/cpu_x86.h @@ -27,7 +27,7 @@ extern struct cpuArchDriver cpuDriverX86; =20 int virCPUx86DataAddCPUID(virCPUDataPtr cpuData, - const virCPUx86CPUID *cpuid); + const virCPUx86DataItem *cpuid); =20 int virCPUx86DataSetSignature(virCPUDataPtr cpuData, unsigned int family, diff --git a/src/cpu/cpu_x86_data.h b/src/cpu/cpu_x86_data.h index f3cc3952ed..0e63dd9245 100644 --- a/src/cpu/cpu_x86_data.h +++ b/src/cpu/cpu_x86_data.h @@ -23,6 +23,7 @@ =20 =20 typedef struct _virCPUx86CPUID virCPUx86CPUID; +typedef virCPUx86CPUID *virCPUx86CPUIDPtr; struct _virCPUx86CPUID { uint32_t eax_in; uint32_t ecx_in; @@ -68,10 +69,16 @@ struct _virCPUx86CPUID { =20 # define VIR_CPU_X86_DATA_INIT { 0 } =20 +typedef struct _virCPUx86DataItem virCPUx86DataItem; +typedef virCPUx86DataItem *virCPUx86DataItemPtr; +struct _virCPUx86DataItem { + virCPUx86CPUID cpuid; +}; + typedef struct _virCPUx86Data virCPUx86Data; struct _virCPUx86Data { size_t len; - virCPUx86CPUID *data; + virCPUx86DataItem *items; }; =20 #endif /* LIBVIRT_CPU_X86_DATA_H */ diff --git a/src/libxl/libxl_capabilities.c b/src/libxl/libxl_capabilities.c index 19f90ba181..c19d05326d 100644 --- a/src/libxl/libxl_capabilities.c +++ b/src/libxl/libxl_capabilities.c @@ -66,13 +66,15 @@ struct guest_arch { static int libxlCapsAddCPUID(virCPUDataPtr data, virCPUx86CPUID *cpuid, ssize_t ncaps) { + virCPUx86DataItem item =3D { 0 }; size_t i; =20 for (i =3D 0; i < ncaps; i++) { - virCPUx86CPUID *c =3D &cpuid[i]; + item.cpuid =3D cpuid[i]; =20 - if (virCPUx86DataAddCPUID(data, c) < 0) { - VIR_DEBUG("Failed to add CPUID(%x,%x)", c->eax_in, c->ecx_in); + if (virCPUx86DataAddCPUID(data, &item) < 0) { + VIR_DEBUG("Failed to add CPUID(%x,%x)", + cpuid[i].eax_in, cpuid[i].ecx_in); return -1; } } diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 8e6c3ccd63..bee1b33f2a 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -7186,7 +7186,7 @@ static virCPUDataPtr qemuMonitorJSONParseCPUx86Features(virJSONValuePtr data) { virCPUDataPtr cpudata =3D NULL; - virCPUx86CPUID cpuid; + virCPUx86DataItem item =3D { 0 }; size_t i; =20 if (!(cpudata =3D virCPUDataNew(VIR_ARCH_X86_64))) @@ -7194,8 +7194,8 @@ qemuMonitorJSONParseCPUx86Features(virJSONValuePtr da= ta) =20 for (i =3D 0; i < virJSONValueArraySize(data); i++) { if (qemuMonitorJSONParseCPUx86FeatureWord(virJSONValueArrayGet(dat= a, i), - &cpuid) < 0 || - virCPUx86DataAddCPUID(cpudata, &cpuid) < 0) + &item.cpuid) < 0 || + virCPUx86DataAddCPUID(cpudata, &item) < 0) goto error; } =20 --=20 2.21.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list