From d9332c23b40879beba958e0068fafeb9c82476f9 Mon Sep 17 00:00:00 2001 From: Jiri Denemark Date: Fri, 2 Jul 2010 17:51:40 +0200 Subject: [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 file changed, 26 insertions(+) diff --git a/src/cpu/cpu_x86.c b/src/cpu/cpu_x86.c index 30a2db68fd..0266ce94a9 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;