if (!(cpus = virCPUDefListParse(xmlCPUs, ncpus, VIR_CPU_TYPE_HOST)))
goto cleanup;
- if (!(cpu = virCPUBaseline(VIR_ARCH_NONE, cpus, ncpus, NULL,
+ if (!(cpu = virCPUBaseline(VIR_ARCH_NONE, cpus, ncpus, NULL, NULL,
!!(flags & VIR_CONNECT_BASELINE_CPU_MIGRATABLE))))
goto cleanup;
* @cpus: list of host CPU definitions
* @ncpus: number of CPUs in @cpus
* @models: list of CPU models that can be considered for the baseline CPU
+ * @features: optional NULL terminated list of allowed features
* @migratable: requests non-migratable features to be removed from the result
*
* Computes the most feature-rich CPU which is compatible with all given
virCPUDefPtr *cpus,
unsigned int ncpus,
virDomainCapsCPUModelsPtr models,
+ const char **features,
bool migratable)
{
struct cpuArchDriver *driver;
size_t i;
- VIR_DEBUG("arch=%s, ncpus=%u, models=%p, migratable=%d",
- virArchToString(arch), ncpus, models, migratable);
+ VIR_DEBUG("arch=%s, ncpus=%u, models=%p, features=%p, migratable=%d",
+ virArchToString(arch), ncpus, models, features, migratable);
if (cpus) {
for (i = 0; i < ncpus; i++)
VIR_DEBUG("cpus[%zu]=%p", i, cpus[i]);
return NULL;
}
- return driver->baseline(cpus, ncpus, models, migratable);
+ return driver->baseline(cpus, ncpus, models, features, migratable);
}
(*virCPUArchBaseline)(virCPUDefPtr *cpus,
unsigned int ncpus,
virDomainCapsCPUModelsPtr models,
+ const char **features,
bool migratable);
typedef int
virCPUDefPtr *cpus,
unsigned int ncpus,
virDomainCapsCPUModelsPtr models,
+ const char **features,
bool migratable);
int
virCPUarmBaseline(virCPUDefPtr *cpus,
unsigned int ncpus ATTRIBUTE_UNUSED,
virDomainCapsCPUModelsPtr models ATTRIBUTE_UNUSED,
+ const char **features ATTRIBUTE_UNUSED,
bool migratable ATTRIBUTE_UNUSED)
{
virCPUDefPtr cpu = NULL;
virCPUppc64Baseline(virCPUDefPtr *cpus,
unsigned int ncpus,
virDomainCapsCPUModelsPtr models ATTRIBUTE_UNUSED,
+ const char **features ATTRIBUTE_UNUSED,
bool migratable ATTRIBUTE_UNUSED)
{
struct ppc64_map *map;
virCPUx86Baseline(virCPUDefPtr *cpus,
unsigned int ncpus,
virDomainCapsCPUModelsPtr models,
+ const char **features,
bool migratable)
{
virCPUx86MapPtr map = NULL;
bool outputVendor = true;
const char *modelName;
bool matchingNames = true;
+ virCPUDataPtr featData = NULL;
if (!(map = virCPUx86GetMap()))
goto error;
model = NULL;
}
+ if (features) {
+ virCPUx86FeaturePtr feat;
+
+ if (!(featData = virCPUDataNew(archs[0])))
+ goto cleanup;
+
+ for (i = 0; features[i]; i++) {
+ if ((feat = x86FeatureFind(map, features[i])) &&
+ x86DataAdd(&featData->data.x86, &feat->data) < 0)
+ goto cleanup;
+ }
+
+ x86DataIntersect(&base_model->data, &featData->data.x86);
+ }
+
if (x86DataIsEmpty(&base_model->data)) {
virReportError(VIR_ERR_OPERATION_FAILED,
"%s", _("CPUs are incompatible"));
cleanup:
x86ModelFree(base_model);
+ virCPUx86DataFree(featData);
return cpu;
if (!(cpus = virCPUDefListParse(xmlCPUs, ncpus, VIR_CPU_TYPE_HOST)))
goto cleanup;
- if (!(cpu = virCPUBaseline(VIR_ARCH_NONE, cpus, ncpus, NULL,
+ if (!(cpu = virCPUBaseline(VIR_ARCH_NONE, cpus, ncpus, NULL, NULL,
!!(flags & VIR_CONNECT_BASELINE_CPU_MIGRATABLE))))
goto cleanup;
if (!(cpus = virCPUDefListParse(xmlCPUs, ncpus, VIR_CPU_TYPE_HOST)))
goto cleanup;
- if (!(baseline = virCPUBaseline(VIR_ARCH_NONE, cpus, ncpus, NULL,
+ if (!(baseline = virCPUBaseline(VIR_ARCH_NONE, cpus, ncpus, NULL, NULL,
!!(flags & VIR_CONNECT_BASELINE_CPU_MIGRATABLE))))
goto cleanup;
if (!(cpus = virCPUDefListParse(xmlCPUs, ncpus, VIR_CPU_TYPE_HOST)))
goto cleanup;
- if (!(cpu = virCPUBaseline(VIR_ARCH_NONE, cpus, ncpus, NULL, false)))
+ if (!(cpu = virCPUBaseline(VIR_ARCH_NONE, cpus, ncpus, NULL, NULL, false)))
goto cleanup;
if ((flags & VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES) &&
if (!(cpus = virCPUDefListParse(xmlCPUs, ncpus, VIR_CPU_TYPE_HOST)))
goto cleanup;
- if (!(cpu = virCPUBaseline(VIR_ARCH_NONE, cpus, ncpus, NULL, false)))
+ if (!(cpu = virCPUBaseline(VIR_ARCH_NONE, cpus, ncpus, NULL, NULL, false)))
goto cleanup;
if ((flags & VIR_CONNECT_BASELINE_CPU_EXPAND_FEATURES) &&
if (!(cpus = cpuTestLoadMultiXML(data->arch, data->name, &ncpus)))
goto cleanup;
- baseline = virCPUBaseline(data->arch, cpus, ncpus, NULL,
+ baseline = virCPUBaseline(data->arch, cpus, ncpus, NULL, NULL,
!!(data->flags & VIR_CONNECT_BASELINE_CPU_MIGRATABLE));
if (baseline &&