}
+/** virCPUGetVendorForModel:
+ *
+ * @arch: CPU architecture
+ * @model: CPU model to be checked
+ *
+ * Returns @model's vendor or NULL if the vendor is unknown.
+ */
+const char *
+virCPUGetVendorForModel(virArch arch,
+ const char *model)
+{
+ struct cpuArchDriver *driver;
+
+ VIR_DEBUG("arch=%s", virArchToString(arch));
+
+ if (!(driver = cpuGetSubDriver(arch)))
+ return NULL;
+
+ if (!driver->getVendorForModel)
+ return NULL;
+
+ return driver->getVendorForModel(model);
+}
+
+
/**
* virCPUTranslate:
*
typedef int
(*virCPUArchGetModels)(char ***models);
+typedef const char *
+(*virCPUArchGetVendorForModel)(const char *model);
+
typedef int
(*virCPUArchTranslate)(virCPUDef *cpu,
virDomainCapsCPUModels *models);
virCPUArchDataFormat dataFormat;
virCPUArchDataParse dataParse;
virCPUArchGetModels getModels;
+ virCPUArchGetVendorForModel getVendorForModel;
virCPUArchTranslate translate;
virCPUArchConvertLegacy convertLegacy;
virCPUArchExpandFeatures expandFeatures;
int
virCPUGetModels(virArch arch, char ***models);
+const char *
+virCPUGetVendorForModel(virArch arch,
+ const char *model);
+
int
virCPUTranslate(virArch arch,
virCPUDef *cpu,
static virDomainCapsCPUModels *
-virQEMUCapsCPUDefsToModels(qemuMonitorCPUDefs *defs,
+virQEMUCapsCPUDefsToModels(virArch arch,
+ qemuMonitorCPUDefs *defs,
const char **modelAllowed,
- const char **modelForbidden)
+ const char **modelForbidden,
+ bool vendors)
{
virDomainCapsCPUModels *cpuModels = NULL;
size_t i;
for (i = 0; i < defs->ncpus; i++) {
qemuMonitorCPUDefInfo *cpu = defs->cpus + i;
+ char *vendor = NULL;
if (modelAllowed && !g_strv_contains(modelAllowed, cpu->name))
continue;
if (modelForbidden && g_strv_contains(modelForbidden, cpu->name))
continue;
+ if (vendors)
+ vendor = g_strdup(virCPUGetVendorForModel(arch, cpu->name));
+
virDomainCapsCPUModelsAdd(cpuModels, cpu->name, cpu->usable,
- cpu->blockers, cpu->deprecated, NULL);
+ cpu->blockers, cpu->deprecated, vendor);
}
return cpuModels;
if (!(defs = virQEMUCapsGetAccel(qemuCaps, type)->cpuModels))
return NULL;
- return virQEMUCapsCPUDefsToModels(defs, modelAllowed, modelForbidden);
+ return virQEMUCapsCPUDefsToModels(qemuCaps->arch, defs,
+ modelAllowed, modelForbidden, true);
}
if (virQEMUCapsFetchCPUDefinitions(mon, arch, &defs) < 0)
return -1;
- if (defs && !(*cpuModels = virQEMUCapsCPUDefsToModels(defs, NULL, NULL)))
+ if (defs &&
+ !(*cpuModels = virQEMUCapsCPUDefsToModels(arch, defs, NULL, NULL, false)))
return -1;
return 0;