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