Pablo Greco 40546a
From 5196a4b5fad475a8489faa9b5542536a941bd9da Mon Sep 17 00:00:00 2001
Pablo Greco 40546a
Message-Id: <5196a4b5fad475a8489faa9b5542536a941bd9da@dist-git>
Pablo Greco 40546a
From: Jiri Denemark <jdenemar@redhat.com>
Pablo Greco 40546a
Date: Fri, 21 Jun 2019 09:25:01 +0200
Pablo Greco 40546a
Subject: [PATCH] cpu_x86: Allow multiple signatures for a CPU model
Pablo Greco 40546a
MIME-Version: 1.0
Pablo Greco 40546a
Content-Type: text/plain; charset=UTF-8
Pablo Greco 40546a
Content-Transfer-Encoding: 8bit
Pablo Greco 40546a
Pablo Greco 40546a
CPU signatures in the cpu_map serve as a hint for CPUID to CPU model
Pablo Greco 40546a
matching algorithm. If the CPU signatures matches any CPU model in the
Pablo Greco 40546a
cpu_map, this model will be the preferred one.
Pablo Greco 40546a
Pablo Greco 40546a
This works out well and solved several mismatches, but in real world
Pablo Greco 40546a
CPUs which should match a single CPU model may be produced with several
Pablo Greco 40546a
different signatures. For example, low voltage Broadwell CPUs for
Pablo Greco 40546a
laptops and Broadwell CPUs for servers differ in CPU model numbers while
Pablo Greco 40546a
we should detect them all as Broadwell CPU model.
Pablo Greco 40546a
Pablo Greco 40546a
This patch adds support for storing several signatures for a single CPU
Pablo Greco 40546a
model to make this hint useful for more CPUs. Later commits will provide
Pablo Greco 40546a
additional signatures for existing CPU models, which will correct some
Pablo Greco 40546a
results in our CPU test suite.
Pablo Greco 40546a
Pablo Greco 40546a
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Pablo Greco 40546a
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Pablo Greco 40546a
(cherry picked from commit dfeb3e598438a891a05487c34e6723d1d3ed9256)
Pablo Greco 40546a
Pablo Greco 40546a
https://bugzilla.redhat.com/show_bug.cgi?id=1686895
Pablo Greco 40546a
Pablo Greco 40546a
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
Pablo Greco 40546a
Message-Id: <393649e6301769c297f2d09bcb88d6200882eb9d.1561068591.git.jdenemar@redhat.com>
Pablo Greco 40546a
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Pablo Greco 40546a
---
Pablo Greco 40546a
 src/cpu/cpu_x86.c | 31 +++++++++++++++++++++----------
Pablo Greco 40546a
 1 file changed, 21 insertions(+), 10 deletions(-)
Pablo Greco 40546a
Pablo Greco 40546a
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
Pablo Greco 40546a
index f8b8d8a96b..7bd8119c23 100644
Pablo Greco 40546a
--- a/src/cpu/cpu_x86.c
Pablo Greco 40546a
+++ b/src/cpu/cpu_x86.c
Pablo Greco 40546a
@@ -1204,22 +1204,32 @@ x86ModelParseAncestor(virCPUx86ModelPtr model,
Pablo Greco 40546a
 
Pablo Greco 40546a
 
Pablo Greco 40546a
 static int
Pablo Greco 40546a
-x86ModelParseSignature(virCPUx86ModelPtr model,
Pablo Greco 40546a
-                       xmlXPathContextPtr ctxt)
Pablo Greco 40546a
+x86ModelParseSignatures(virCPUx86ModelPtr model,
Pablo Greco 40546a
+                        xmlXPathContextPtr ctxt)
Pablo Greco 40546a
 {
Pablo Greco 40546a
+    VIR_AUTOFREE(xmlNodePtr *) nodes = NULL;
Pablo Greco 40546a
+    xmlNodePtr root = ctxt->node;
Pablo Greco 40546a
+    size_t i;
Pablo Greco 40546a
+    int n;
Pablo Greco 40546a
+
Pablo Greco 40546a
+    if ((n = virXPathNodeSet("./signature", ctxt, &nodes)) <= 0)
Pablo Greco 40546a
+        return n;
Pablo Greco 40546a
+
Pablo Greco 40546a
     /* Remove inherited signatures. */
Pablo Greco 40546a
     VIR_FREE(model->signatures);
Pablo Greco 40546a
 
Pablo Greco 40546a
-    if (virXPathBoolean("boolean(./signature)", ctxt)) {
Pablo Greco 40546a
+    model->nsignatures = n;
Pablo Greco 40546a
+    if (VIR_ALLOC_N(model->signatures, n) < 0)
Pablo Greco 40546a
+       return -1;
Pablo Greco 40546a
+
Pablo Greco 40546a
+    for (i = 0; i < n; i++) {
Pablo Greco 40546a
         unsigned int sigFamily = 0;
Pablo Greco 40546a
         unsigned int sigModel = 0;
Pablo Greco 40546a
         int rc;
Pablo Greco 40546a
 
Pablo Greco 40546a
-        model->nsignatures = 1;
Pablo Greco 40546a
-        if (VIR_ALLOC_N(model->signatures, 1) < 0)
Pablo Greco 40546a
-            return -1;
Pablo Greco 40546a
+        ctxt->node = nodes[i];
Pablo Greco 40546a
 
Pablo Greco 40546a
-        rc = virXPathUInt("string(./signature/@family)", ctxt, &sigFamily);
Pablo Greco 40546a
+        rc = virXPathUInt("string(@family)", ctxt, &sigFamily);
Pablo Greco 40546a
         if (rc < 0 || sigFamily == 0) {
Pablo Greco 40546a
             virReportError(VIR_ERR_INTERNAL_ERROR,
Pablo Greco 40546a
                            _("Invalid CPU signature family in model %s"),
Pablo Greco 40546a
@@ -1227,7 +1237,7 @@ x86ModelParseSignature(virCPUx86ModelPtr model,
Pablo Greco 40546a
             return -1;
Pablo Greco 40546a
         }
Pablo Greco 40546a
 
Pablo Greco 40546a
-        rc = virXPathUInt("string(./signature/@model)", ctxt, &sigModel);
Pablo Greco 40546a
+        rc = virXPathUInt("string(@model)", ctxt, &sigModel);
Pablo Greco 40546a
         if (rc < 0 || sigModel == 0) {
Pablo Greco 40546a
             virReportError(VIR_ERR_INTERNAL_ERROR,
Pablo Greco 40546a
                            _("Invalid CPU signature model in model %s"),
Pablo Greco 40546a
@@ -1235,9 +1245,10 @@ x86ModelParseSignature(virCPUx86ModelPtr model,
Pablo Greco 40546a
             return -1;
Pablo Greco 40546a
         }
Pablo Greco 40546a
 
Pablo Greco 40546a
-        model->signatures[0] = x86MakeSignature(sigFamily, sigModel, 0);
Pablo Greco 40546a
+        model->signatures[i] = x86MakeSignature(sigFamily, sigModel, 0);
Pablo Greco 40546a
     }
Pablo Greco 40546a
 
Pablo Greco 40546a
+    ctxt->node = root;
Pablo Greco 40546a
     return 0;
Pablo Greco 40546a
 }
Pablo Greco 40546a
 
Pablo Greco 40546a
@@ -1334,7 +1345,7 @@ x86ModelParse(xmlXPathContextPtr ctxt,
Pablo Greco 40546a
     if (x86ModelParseAncestor(model, ctxt, map) < 0)
Pablo Greco 40546a
         goto cleanup;
Pablo Greco 40546a
 
Pablo Greco 40546a
-    if (x86ModelParseSignature(model, ctxt) < 0)
Pablo Greco 40546a
+    if (x86ModelParseSignatures(model, ctxt) < 0)
Pablo Greco 40546a
         goto cleanup;
Pablo Greco 40546a
 
Pablo Greco 40546a
     if (x86ModelParseVendor(model, ctxt, map) < 0)
Pablo Greco 40546a
-- 
Pablo Greco 40546a
2.22.0
Pablo Greco 40546a