From nobody Sun Feb 8 17:46:37 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 216.205.24.74 as permitted sender) client-ip=216.205.24.74; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-74.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.74 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1585316751; cv=none; d=zohomail.com; s=zohoarc; b=cKmC0e4NImeJUWmDed7THSnDaolZ7DX+XgykHtAwyDxV97RQHnnm73Udw7UYX/XwsOHp2/wvtm5AmOzoHRvhnbyEu25gboaScQJ7tn4v25I+AhiEmzDgnbmTw8i4hHMgeO/BFB6pMO/kj3/If8+Pj5a3oL41p23GV4nxNOMrkEM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1585316751; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=RA92ZkSVBuJwJGTG5QxVSPH741WW12nph1CfXn9AGB8=; b=IsSaUauQVvz5KhNSfWrp7ONlvi+u1ejntSfBmjJOCwdw4/VohZ/b4Y4nwhVoocjTjsnqNAGthy3dF8r0v3FchmYnMeSpxuqEAGpOm9bER+BSyzcdmyyXhWSDm0gd/ep/eTNjmNCC9EA/mKj7Hv2PRaMxDFvboOypKtuXnrXXh0M= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 216.205.24.74 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from us-smtp-delivery-74.mimecast.com (us-smtp-delivery-74.mimecast.com [216.205.24.74]) by mx.zohomail.com with SMTPS id 1585316751304528.5308260658555; Fri, 27 Mar 2020 06:45:51 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-267-8k-5Tq_VO-2HOSXBD9KW3w-1; Fri, 27 Mar 2020 09:45:48 -0400 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 3E0A3107ACCA; Fri, 27 Mar 2020 13:45:42 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0E7D7CDBEA; Fri, 27 Mar 2020 13:45:42 +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 B822C944CE; Fri, 27 Mar 2020 13:45:41 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 02RDiPwe006445 for ; Fri, 27 Mar 2020 09:44:25 -0400 Received: by smtp.corp.redhat.com (Postfix) id 0C9455DA84; Fri, 27 Mar 2020 13:44:25 +0000 (UTC) Received: from rein.int.mamuti.net (unknown [10.40.192.72]) by smtp.corp.redhat.com (Postfix) with ESMTPS id AA3075DA7D for ; Fri, 27 Mar 2020 13:44:24 +0000 (UTC) Received: by rein.int.mamuti.net (Postfix, from userid 500) id 2DC9B18F8BF; Fri, 27 Mar 2020 14:44:11 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1585316750; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=RA92ZkSVBuJwJGTG5QxVSPH741WW12nph1CfXn9AGB8=; b=Vch7N45DBrpP/SLT264j7NdDZZHDFdtbKDGD3JAz85Ep2jY0VD4WtQ86Tt4yFanDuW5MMU VXPe+eXjQnnEn0ZQB99RwAEJSuVLVxPdoxnNiqMIrXq8o/MkWq5Y3wfhRojAbTIOsOWlvY yiuwSGydEgYEtbgER3THryTXXjRyxdc= X-MC-Unique: 8k-5Tq_VO-2HOSXBD9KW3w-1 From: Jiri Denemark To: libvir-list@redhat.com Subject: [libvirt PATCH 34/39] cpu_x86: Replace 32b signatures in virCPUx86Model with a struct Date: Fri, 27 Mar 2020 14:44:03 +0100 Message-Id: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: libvir-list@redhat.com 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: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) Content-Type: text/plain; charset="utf-8" The CPU models in our cpu_map define their signatures using separate family and model numbers. Let's store the signatures in the same way in our runtime representation of the cpu_map. Signed-off-by: Jiri Denemark Reviewed-by: J=C3=A1n Tomko --- src/cpu/cpu_x86.c | 149 +++++++++++++++++++++++++++++----------------- 1 file changed, 95 insertions(+), 54 deletions(-) diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c index 29c6e2b6be..ed6c1b43d3 100644 --- a/src/cpu/cpu_x86.c +++ b/src/cpu/cpu_x86.c @@ -121,6 +121,19 @@ static virCPUx86Feature x86_kvm_features[] =3D KVM_FEATURE(VIR_CPU_x86_HV_STIMER_DIRECT), }; =20 +typedef struct _virCPUx86Signature virCPUx86Signature; +struct _virCPUx86Signature { + unsigned int family; + unsigned int model; +}; + +typedef struct _virCPUx86Signatures virCPUx86Signatures; +typedef virCPUx86Signatures *virCPUx86SignaturesPtr; +struct _virCPUx86Signatures { + size_t count; + virCPUx86Signature *items; +}; + typedef struct _virCPUx86Model virCPUx86Model; typedef virCPUx86Model *virCPUx86ModelPtr; struct _virCPUx86Model { @@ -128,8 +141,7 @@ struct _virCPUx86Model { bool decodeHost; bool decodeGuest; virCPUx86VendorPtr vendor; - size_t nsignatures; - uint32_t *signatures; + virCPUx86SignaturesPtr signatures; virCPUx86Data data; }; =20 @@ -717,6 +729,13 @@ x86MakeSignature(unsigned int family, } =20 =20 +static uint32_t +virCPUx86SignatureToCPUID(virCPUx86Signature *sig) +{ + return x86MakeSignature(sig->family, sig->model, 0); +} + + static void virCPUx86SignatureFromCPUID(uint32_t sig, unsigned int *family, @@ -1099,41 +1118,65 @@ x86FeatureParse(xmlXPathContextPtr ctxt, } =20 =20 +static virCPUx86SignaturesPtr +virCPUx86SignaturesNew(size_t count) +{ + virCPUx86SignaturesPtr sigs; + + sigs =3D g_new0(virCPUx86Signatures, 1); + sigs->items =3D g_new0(virCPUx86Signature, count); + sigs->count =3D count; + + return sigs; +} + + static void -virCPUx86SignaturesFree(uint32_t *signatures) +virCPUx86SignaturesFree(virCPUx86SignaturesPtr sigs) { - g_free(signatures); + if (!sigs) + return; + + g_free(sigs->items); + g_free(sigs); } =20 =20 -static int -virCPUx86SignaturesCopy(virCPUx86ModelPtr dst, - virCPUx86ModelPtr src) +static virCPUx86SignaturesPtr +virCPUx86SignaturesCopy(virCPUx86SignaturesPtr src) { + virCPUx86SignaturesPtr dst; size_t i; =20 - if (src->nsignatures =3D=3D 0) - return 0; + if (!src || src->count =3D=3D 0) + return NULL; =20 - if (VIR_ALLOC_N(dst->signatures, src->nsignatures) < 0) - return -1; + dst =3D virCPUx86SignaturesNew(src->count); =20 - dst->nsignatures =3D src->nsignatures; - for (i =3D 0; i < src->nsignatures; i++) - dst->signatures[i] =3D src->signatures[i]; + for (i =3D 0; i < src->count; i++) + dst->items[i] =3D src->items[i]; =20 - return 0; + return dst; } =20 =20 static bool -virCPUx86SignaturesMatch(virCPUx86ModelPtr model, +virCPUx86SignaturesMatch(virCPUx86SignaturesPtr sigs, uint32_t signature) { size_t i; + unsigned int family; + unsigned int model; + unsigned int stepping; =20 - for (i =3D 0; i < model->nsignatures; i++) { - if (model->signatures[i] =3D=3D signature) + if (!sigs) + return false; + + virCPUx86SignatureFromCPUID(signature, &family, &model, &stepping); + + for (i =3D 0; i < sigs->count; i++) { + if (sigs->items[i].family =3D=3D family && + sigs->items[i].model =3D=3D model) return true; } =20 @@ -1142,17 +1185,21 @@ virCPUx86SignaturesMatch(virCPUx86ModelPtr model, =20 =20 static char * -virCPUx86SignaturesFormat(virCPUx86ModelPtr model) +virCPUx86SignaturesFormat(virCPUx86SignaturesPtr sigs) { virBuffer buf =3D VIR_BUFFER_INITIALIZER; size_t i; =20 - for (i =3D 0; i < model->nsignatures; i++) { - virBufferAsprintf(&buf, "%06lx,", - (unsigned long)model->signatures[i]); + if (!sigs) + return virBufferContentAndReset(&buf); + + for (i =3D 0; i < sigs->count; i++) { + virBufferAsprintf(&buf, "(%u,%u,0), ", + sigs->items[i].family, + sigs->items[i].model); } =20 - virBufferTrim(&buf, ","); + virBufferTrim(&buf, ", "); =20 return virBufferContentAndReset(&buf); } @@ -1179,16 +1226,11 @@ x86ModelCopy(virCPUx86ModelPtr model) =20 copy =3D g_new0(virCPUx86Model, 1); copy->name =3D g_strdup(model->name); - - if (virCPUx86SignaturesCopy(copy, model) < 0) { - x86ModelFree(copy); - return NULL; - } + copy->signatures =3D virCPUx86SignaturesCopy(model->signatures); x86DataCopy(©->data, &model->data); - copy->vendor =3D model->vendor; =20 - return copy; + return g_steal_pointer(©); } =20 =20 @@ -1408,9 +1450,7 @@ x86ModelParseAncestor(virCPUx86ModelPtr model, } =20 model->vendor =3D ancestor->vendor; - if (virCPUx86SignaturesCopy(model, ancestor) < 0) - return -1; - + model->signatures =3D virCPUx86SignaturesCopy(ancestor->signatures); x86DataCopy(&model->data, &ancestor->data); =20 return 0; @@ -1432,34 +1472,29 @@ x86ModelParseSignatures(virCPUx86ModelPtr model, /* Remove inherited signatures. */ virCPUx86SignaturesFree(model->signatures); =20 - model->nsignatures =3D n; - if (VIR_ALLOC_N(model->signatures, n) < 0) - return -1; + model->signatures =3D virCPUx86SignaturesNew(n); =20 for (i =3D 0; i < n; i++) { - unsigned int sigFamily =3D 0; - unsigned int sigModel =3D 0; + virCPUx86Signature *sig =3D &model->signatures->items[i]; int rc; =20 ctxt->node =3D nodes[i]; =20 - rc =3D virXPathUInt("string(@family)", ctxt, &sigFamily); - if (rc < 0 || sigFamily =3D=3D 0) { + rc =3D virXPathUInt("string(@family)", ctxt, &sig->family); + if (rc < 0 || sig->family =3D=3D 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Invalid CPU signature family in model %s"), model->name); return -1; } =20 - rc =3D virXPathUInt("string(@model)", ctxt, &sigModel); + rc =3D virXPathUInt("string(@model)", ctxt, &sig->model); if (rc < 0) { virReportError(VIR_ERR_INTERNAL_ERROR, _("Invalid CPU signature model in model %s"), model->name); return -1; } - - model->signatures[i] =3D x86MakeSignature(sigFamily, sigModel, 0); } =20 ctxt->node =3D root; @@ -1866,9 +1901,12 @@ x86Compute(virCPUDefPtr host, &host_model->vendor->data) < 0) return VIR_CPU_COMPARE_ERROR; =20 - if (host_model->signatures && - x86DataAddSignature(&guest_model->data, *host_model->signature= s) < 0) - return VIR_CPU_COMPARE_ERROR; + if (host_model->signatures && host_model->signatures->count > 0) { + virCPUx86Signature *sig =3D &host_model->signatures->items[0]; + if (x86DataAddSignature(&guest_model->data, + virCPUx86SignatureToCPUID(sig)) < 0) + return VIR_CPU_COMPARE_ERROR; + } =20 if (cpu->type =3D=3D VIR_CPU_TYPE_GUEST && cpu->match =3D=3D VIR_CPU_MATCH_EXACT) @@ -1979,8 +2017,8 @@ x86DecodeUseCandidate(virCPUx86ModelPtr current, * consider candidates with matching family/model. */ if (signature && - virCPUx86SignaturesMatch(current, signature) && - !virCPUx86SignaturesMatch(candidate, signature)) { + virCPUx86SignaturesMatch(current->signatures, signature) && + !virCPUx86SignaturesMatch(candidate->signatures, signature)) { VIR_DEBUG("%s differs in signature from matching %s", cpuCandidate->model, cpuCurrent->model); return 0; @@ -1996,8 +2034,8 @@ x86DecodeUseCandidate(virCPUx86ModelPtr current, * result in longer list of features. */ if (signature && - virCPUx86SignaturesMatch(candidate, signature) && - !virCPUx86SignaturesMatch(current, signature)) { + virCPUx86SignaturesMatch(candidate->signatures, signature) && + !virCPUx86SignaturesMatch(current->signatures, signature)) { VIR_DEBUG("%s provides matching signature", cpuCandidate->model); return 1; } @@ -2154,7 +2192,7 @@ x86Decode(virCPUDefPtr cpu, if (vendor) cpu->vendor =3D g_strdup(vendor->name); =20 - sigs =3D virCPUx86SignaturesFormat(model); + sigs =3D virCPUx86SignaturesFormat(model->signatures); =20 VIR_DEBUG("Using CPU model %s (signatures %s) for CPU with signature %= 06lx", model->name, NULLSTR(sigs), (unsigned long)signature); @@ -3050,9 +3088,12 @@ virCPUx86Translate(virCPUDefPtr cpu, virCPUx86DataAddItem(&model->data, &model->vendor->data) < 0) return -1; =20 - if (model->signatures && - x86DataAddSignature(&model->data, model->signatures[0]) < 0) - return -1; + if (model->signatures && model->signatures->count > 0) { + virCPUx86Signature *sig =3D &model->signatures->items[0]; + if (x86DataAddSignature(&model->data, + virCPUx86SignatureToCPUID(sig)) < 0) + return -1; + } =20 if (!(translated =3D virCPUDefCopyWithoutModel(cpu))) return -1; --=20 2.26.0