}
+/** virCPUGetCanonicalModel:
+ *
+ * @arch: CPU architecture
+ * @model: CPU model to be checked
+ *
+ * Returns @model's canonical name if @model is an alias or NULL otherwise.
+ */
+const char *
+virCPUGetCanonicalModel(virArch arch,
+ const char *model)
+{
+ struct cpuArchDriver *driver;
+
+ VIR_DEBUG("arch=%s model=%s", virArchToString(arch), model);
+
+ if (!(driver = cpuGetSubDriver(arch)))
+ return NULL;
+
+ if (!driver->getCanonicalModel)
+ return NULL;
+
+ return driver->getCanonicalModel(model);
+}
+
+
/**
* virCPUArchIsSupported:
*
(*virCPUArchGetCheckMode)(const char *modelName,
bool *compat);
+typedef const char *
+(*virCPUArchGetCanonicalModel)(const char *model);
+
struct cpuArchDriver {
const char *name;
const virArch *arch;
virCPUArchDataIsIdentical dataIsIdentical;
virCPUArchDataGetHost dataGetHost;
virCPUArchGetCheckMode getCheckMode;
+ virCPUArchGetCanonicalModel getCanonicalModel;
};
const virCPUDef *cpu,
bool *compat);
+const char *
+virCPUGetCanonicalModel(virArch arch,
+ const char *model);
+
bool
virCPUArchIsSupported(virArch arch);
}
+static const char *
+virCPUx86GetCanonicalModel(const char *modelName)
+{
+ virCPUx86Map *map;
+ virCPUx86Model *model;
+
+ if (!(map = virCPUx86GetMap()))
+ return NULL;
+
+ model = x86ModelFind(map, modelName);
+
+ if (!model || !model->canonical)
+ return NULL;
+
+ return model->canonical->name;
+}
+
+
struct cpuArchDriver cpuDriverX86 = {
.name = "x86",
.arch = archs,
.dataGetHost = virCPUx86DataGetHost,
#endif
.getCheckMode = virCPUx86GetCheckMode,
+ .getCanonicalModel = virCPUx86GetCanonicalModel,
};
virCPUDataParse;
virCPUDataParseNode;
virCPUExpandFeatures;
+virCPUGetCanonicalModel;
virCPUGetCheckMode;
virCPUGetHost;
virCPUGetHostIsSupported;