From: Jiri Denemark Date: Fri, 2 Jul 2010 15:51:40 +0000 (+0200) Subject: cpuBaseline: Detect empty set of common features X-Git-Tag: v0.8.3~155 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d9332c23b40879beba958e0068fafeb9c82476f9;p=thirdparty%2Flibvirt.git 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. --- 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;