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