[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [PATCH] cpuBaseline: Detect empty set of common features



In case the set of CPUs has no features in common, report incompatible
CPUs instead of returning the simplest CPU model with all features
disabled.
---
 src/cpu/cpu_x86.c |   26 ++++++++++++++++++++++++++
 1 files changed, 26 insertions(+), 0 deletions(-)

diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c
index 30a2db6..0266ce9 100644
--- a/src/cpu/cpu_x86.c
+++ b/src/cpu/cpu_x86.c
@@ -233,6 +233,26 @@ x86DataSubtract(union cpuData *data1,
 }
 
 
+static bool
+x86DataIsEmpty(union cpuData *data)
+{
+    struct cpuX86cpuid zero = { 0, 0, 0, 0, 0 };
+    unsigned int i;
+
+    for (i = 0; i < data->x86.basic_len; i++) {
+        if (!x86cpuidMatch(data->x86.basic + i, &zero))
+            return false;
+    }
+
+    for (i = 0; i < data->x86.extended_len; i++) {
+        if (!x86cpuidMatch(data->x86.extended + i, &zero))
+            return false;
+    }
+
+    return true;
+}
+
+
 static union cpuData *
 x86DataFromModel(const struct x86_model *model)
 {
@@ -1363,6 +1383,12 @@ x86Baseline(virCPUDefPtr *cpus,
     if (!(data = x86DataFromModel(base_model)))
         goto no_memory;
 
+    if (x86DataIsEmpty(data)) {
+        virCPUReportError(VIR_ERR_OPERATION_FAILED,
+                "%s", _("CPUs are incompatible"));
+        goto error;
+    }
+
     if (x86Decode(cpu, data, models, nmodels, NULL) < 0)
         goto error;
 
-- 
1.7.1.1


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]