else
return virCPUDefCopy(cpu);
}
+
+
+/**
+ * virCPUValidateFeatures:
+ *
+ * @arch: CPU architecture
+ * @cpu: CPU definition to be checked
+ *
+ * Checks whether all CPU features specified in @cpu are valid.
+ *
+ * Returns 0 on success (all features are valid), -1 on error.
+ */
+int
+virCPUValidateFeatures(virArch arch,
+ virCPUDefPtr cpu)
+{
+ struct cpuArchDriver *driver;
+
+ VIR_DEBUG("arch=%s, cpu=%p, nfeatures=%zu",
+ virArchToString(arch), cpu, cpu->nfeatures);
+
+ if (!(driver = cpuGetSubDriver(arch)))
+ return -1;
+
+ if (driver->validateFeatures)
+ return driver->validateFeatures(cpu);
+ else
+ return 0;
+}
typedef virCPUDefPtr
(*virCPUArchCopyMigratable)(virCPUDefPtr cpu);
+typedef int
+(*virCPUArchValidateFeatures)(virCPUDefPtr cpu);
+
struct cpuArchDriver {
const char *name;
const virArch *arch;
virCPUArchConvertLegacy convertLegacy;
virCPUArchExpandFeatures expandFeatures;
virCPUArchCopyMigratable copyMigratable;
+ virCPUArchValidateFeatures validateFeatures;
};
virCPUCopyMigratable(virArch arch,
virCPUDefPtr cpu);
+int
+virCPUValidateFeatures(virArch arch,
+ virCPUDefPtr cpu)
+ ATTRIBUTE_NONNULL(2);
+
/* virCPUDataFormat and virCPUDataParse are implemented for unit tests only and
* have no real-life usage
*/