else
return 0;
}
+
+
+/**
+ * virCPUDataAddFeature:
+ *
+ * @cpuData: CPU data
+ * @name: feature to be added to @cpuData
+ *
+ * Adds a feature called @name to @cpuData.
+ *
+ * Returns 0 on success, -1 on error.
+ */
+int
+virCPUDataAddFeature(virCPUDataPtr cpuData,
+ const char *name)
+{
+ struct cpuArchDriver *driver;
+
+ VIR_DEBUG("arch=%s, cpuData=%p, name=%s",
+ virArchToString(cpuData->arch), cpuData, name);
+
+ if (!(driver = cpuGetSubDriver(cpuData->arch)))
+ return -1;
+
+ if (!driver->dataAddFeature) {
+ virReportError(VIR_ERR_NO_SUPPORT,
+ _("cannot add guest CPU feature for %s architecture"),
+ virArchToString(cpuData->arch));
+ return -1;
+ }
+
+ return driver->dataAddFeature(cpuData, name);
+}
typedef int
(*virCPUArchValidateFeatures)(virCPUDefPtr cpu);
+typedef int
+(*virCPUArchDataAddFeature)(virCPUDataPtr cpuData,
+ const char *name);
+
struct cpuArchDriver {
const char *name;
const virArch *arch;
virCPUArchExpandFeatures expandFeatures;
virCPUArchCopyMigratable copyMigratable;
virCPUArchValidateFeatures validateFeatures;
+ virCPUArchDataAddFeature dataAddFeature;
};
virCPUDefPtr cpu)
ATTRIBUTE_NONNULL(2);
+int
+virCPUDataAddFeature(virCPUDataPtr cpuData,
+ const char *name);
+
/* virCPUDataFormat and virCPUDataParse are implemented for unit tests only and
* have no real-life usage
*/
}
-int
+static int
virCPUx86DataAddFeature(virCPUDataPtr cpuData,
const char *name)
{
.expandFeatures = virCPUx86ExpandFeatures,
.copyMigratable = virCPUx86CopyMigratable,
.validateFeatures = virCPUx86ValidateFeatures,
+ .dataAddFeature = virCPUx86DataAddFeature,
};
int virCPUx86DataSetVendor(virCPUDataPtr cpuData,
const char *vendor);
-
-int virCPUx86DataAddFeature(virCPUDataPtr cpuData,
- const char *name);
virCPUCompareXML;
virCPUConvertLegacy;
virCPUCopyMigratable;
+virCPUDataAddFeature;
virCPUDataCheckFeature;
virCPUDataFormat;
virCPUDataFree;
# cpu/cpu_x86.h
virCPUx86DataAdd;
-virCPUx86DataAddFeature;
virCPUx86DataGetSignature;
virCPUx86DataSetSignature;
virCPUx86DataSetVendor;
(migratable && prop->migratable == VIR_TRISTATE_BOOL_NO))
continue;
- if (virCPUx86DataAddFeature(data, name) < 0)
+ if (virCPUDataAddFeature(data, name) < 0)
goto cleanup;
break;