0a7476
From b4bc2a799e6e305dc0595a29aae68a39a5983dee Mon Sep 17 00:00:00 2001
0a7476
Message-Id: <b4bc2a799e6e305dc0595a29aae68a39a5983dee@dist-git>
bba56f
From: Jiri Denemark <jdenemar@redhat.com>
bba56f
Date: Mon, 4 Mar 2019 16:36:33 +0100
bba56f
Subject: [PATCH] cpu_x86: Store CPU signature in an array
bba56f
MIME-Version: 1.0
bba56f
Content-Type: text/plain; charset=UTF-8
bba56f
Content-Transfer-Encoding: 8bit
bba56f
bba56f
In preparation for storing several CPU signatures in a single CPU model,
bba56f
we need to turn virCPUx86Model's signature into an array of signatures.
bba56f
bba56f
The parser still hardcodes the number of signatures to 1, but the
bba56f
following patch will drop this limit.
bba56f
bba56f
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
bba56f
Reviewed-by: Ján Tomko <jtomko@redhat.com>
bba56f
(cherry picked from commit b07b8b7750c6a505d4b00bd272e79ea0305cb610)
bba56f
bba56f
https://bugzilla.redhat.com/show_bug.cgi?id=1558558
bba56f
https://bugzilla.redhat.com/show_bug.cgi?id=1687515
bba56f
bba56f
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
bba56f
Reviewed-by: Ján Tomko <jtomko@redhat.com>
bba56f
---
bba56f
 src/cpu/cpu_x86.c | 50 ++++++++++++++++++++++++++++++++++++++---------
bba56f
 1 file changed, 41 insertions(+), 9 deletions(-)
bba56f
bba56f
diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
bba56f
index e54a3986a1..543533148f 100644
bba56f
--- a/src/cpu/cpu_x86.c
bba56f
+++ b/src/cpu/cpu_x86.c
bba56f
@@ -136,7 +136,8 @@ typedef virCPUx86Model *virCPUx86ModelPtr;
bba56f
 struct _virCPUx86Model {
bba56f
     char *name;
bba56f
     virCPUx86VendorPtr vendor;
bba56f
-    uint32_t signature;
bba56f
+    size_t nsignatures;
bba56f
+    uint32_t *signatures;
bba56f
     virCPUx86Data data;
bba56f
 };
bba56f
 
bba56f
@@ -1008,6 +1009,7 @@ x86ModelFree(virCPUx86ModelPtr model)
bba56f
         return;
bba56f
 
bba56f
     VIR_FREE(model->name);
bba56f
+    VIR_FREE(model->signatures);
bba56f
     virCPUx86DataClear(&model->data);
bba56f
     VIR_FREE(model);
bba56f
 }
bba56f
@@ -1017,7 +1019,14 @@ static int
bba56f
 x86ModelCopySignatures(virCPUx86ModelPtr dst,
bba56f
                        virCPUx86ModelPtr src)
bba56f
 {
bba56f
-    dst->signature = src->signature;
bba56f
+    size_t i;
bba56f
+
bba56f
+    if (VIR_ALLOC_N(dst->signatures, src->nsignatures) < 0)
bba56f
+        return -1;
bba56f
+
bba56f
+    dst->nsignatures = src->nsignatures;
bba56f
+    for (i = 0; i < src->nsignatures; i++)
bba56f
+        dst->signatures[i] = src->signatures[i];
bba56f
 
bba56f
     return 0;
bba56f
 }
bba56f
@@ -1198,12 +1207,18 @@ static int
bba56f
 x86ModelParseSignature(virCPUx86ModelPtr model,
bba56f
                        xmlXPathContextPtr ctxt)
bba56f
 {
bba56f
+    /* Remove inherited signatures. */
bba56f
+    VIR_FREE(model->signatures);
bba56f
 
bba56f
     if (virXPathBoolean("boolean(./signature)", ctxt)) {
bba56f
         unsigned int sigFamily = 0;
bba56f
         unsigned int sigModel = 0;
bba56f
         int rc;
bba56f
 
bba56f
+        model->nsignatures = 1;
bba56f
+        if (VIR_ALLOC_N(model->signatures, 1) < 0)
bba56f
+            return -1;
bba56f
+
bba56f
         rc = virXPathUInt("string(./signature/@family)", ctxt, &sigFamily);
bba56f
         if (rc < 0 || sigFamily == 0) {
bba56f
             virReportError(VIR_ERR_INTERNAL_ERROR,
bba56f
@@ -1220,7 +1235,7 @@ x86ModelParseSignature(virCPUx86ModelPtr model,
bba56f
             return -1;
bba56f
         }
bba56f
 
bba56f
-        model->signature = x86MakeSignature(sigFamily, sigModel, 0);
bba56f
+        model->signatures[0] = x86MakeSignature(sigFamily, sigModel, 0);
bba56f
     }
bba56f
 
bba56f
     return 0;
bba56f
@@ -1665,7 +1680,8 @@ x86Compute(virCPUDefPtr host,
bba56f
                                      &host_model->vendor->cpuid) < 0)
bba56f
             goto error;
bba56f
 
bba56f
-        if (x86DataAddSignature(&guest_model->data, host_model->signature) < 0)
bba56f
+        if (host_model->signatures &&
bba56f
+            x86DataAddSignature(&guest_model->data, *host_model->signatures) < 0)
bba56f
             goto error;
bba56f
 
bba56f
         if (cpu->type == VIR_CPU_TYPE_GUEST
bba56f
@@ -1771,6 +1787,21 @@ virCPUx86Compare(virCPUDefPtr host,
bba56f
 }
bba56f
 
bba56f
 
bba56f
+static bool
bba56f
+x86ModelHasSignature(virCPUx86ModelPtr model,
bba56f
+                     uint32_t signature)
bba56f
+{
bba56f
+    size_t i;
bba56f
+
bba56f
+    for (i = 0; i < model->nsignatures; i++) {
bba56f
+        if (model->signatures[i] == signature)
bba56f
+            return true;
bba56f
+    }
bba56f
+
bba56f
+    return false;
bba56f
+}
bba56f
+
bba56f
+
bba56f
 /*
bba56f
  * Checks whether a candidate model is a better fit for the CPU data than the
bba56f
  * current model.
bba56f
@@ -1812,8 +1843,8 @@ x86DecodeUseCandidate(virCPUx86ModelPtr current,
bba56f
      * consider candidates with matching family/model.
bba56f
      */
bba56f
     if (signature &&
bba56f
-        current->signature == signature &&
bba56f
-        candidate->signature != signature) {
bba56f
+        x86ModelHasSignature(current, signature) &&
bba56f
+        !x86ModelHasSignature(candidate, signature)) {
bba56f
         VIR_DEBUG("%s differs in signature from matching %s",
bba56f
                   cpuCandidate->model, cpuCurrent->model);
bba56f
         return 0;
bba56f
@@ -1829,8 +1860,8 @@ x86DecodeUseCandidate(virCPUx86ModelPtr current,
bba56f
      * result in longer list of features.
bba56f
      */
bba56f
     if (signature &&
bba56f
-        candidate->signature == signature &&
bba56f
-        current->signature != signature) {
bba56f
+        x86ModelHasSignature(candidate, signature) &&
bba56f
+        !x86ModelHasSignature(current, signature)) {
bba56f
         VIR_DEBUG("%s provides matching signature", cpuCandidate->model);
bba56f
         return 1;
bba56f
     }
bba56f
@@ -2898,7 +2929,8 @@ virCPUx86Translate(virCPUDefPtr cpu,
bba56f
         virCPUx86DataAddCPUIDInt(&model->data, &model->vendor->cpuid) < 0)
bba56f
         goto cleanup;
bba56f
 
bba56f
-    if (x86DataAddSignature(&model->data, model->signature) < 0)
bba56f
+    if (model->signatures &&
bba56f
+        x86DataAddSignature(&model->data, model->signatures[0]) < 0)
bba56f
         goto cleanup;
bba56f
 
bba56f
     if (!(translated = virCPUDefCopyWithoutModel(cpu)))
bba56f
-- 
bba56f
2.21.0
bba56f