return false;
}
-struct cpuGetModelsData
-{
- char **data;
- size_t len; /* It includes the last element of DATA, which is NULL. */
-};
-
-static int
-cpuGetArchModelsCb(cpuMapElement element,
- xmlXPathContextPtr ctxt,
- void *cbdata)
-{
- char *name;
- struct cpuGetModelsData *data = cbdata;
- if (element != CPU_MAP_ELEMENT_MODEL)
- return 0;
-
- name = virXPathString("string(@name)", ctxt);
- if (name == NULL)
- return -1;
-
- if (!data->data) {
- VIR_FREE(name);
- data->len++;
- return 0;
- }
-
- return VIR_INSERT_ELEMENT(data->data, data->len - 1, data->len, name);
-}
-
-
-static int
-cpuGetArchModels(const char *arch, struct cpuGetModelsData *data)
-{
- return cpuMapLoad(arch, cpuGetArchModelsCb, data);
-}
-
-
/**
* cpuGetModels:
*
int
cpuGetModels(const char *archName, char ***models)
{
- struct cpuGetModelsData data;
- virArch arch;
struct cpuArchDriver *driver;
- data.data = NULL;
- data.len = 1;
+ virArch arch;
+
+ VIR_DEBUG("arch=%s", archName);
arch = virArchFromString(archName);
if (arch == VIR_ARCH_NONE) {
virReportError(VIR_ERR_INVALID_ARG,
_("cannot find architecture %s"),
archName);
- goto error;
+ return -1;
}
driver = cpuGetSubDriver(arch);
virReportError(VIR_ERR_INVALID_ARG,
_("cannot find a driver for the architecture %s"),
archName);
- goto error;
+ return -1;
}
- if (models && VIR_ALLOC_N(data.data, data.len) < 0)
- goto error;
-
- if (cpuGetArchModels(driver->name, &data) < 0)
- goto error;
-
- if (models)
- *models = data.data;
-
- return data.len - 1;
+ if (!driver->getModels) {
+ virReportError(VIR_ERR_NO_SUPPORT,
+ _("CPU driver for %s has no CPU model support"),
+ virArchToString(arch));
+ return -1;
+ }
- error:
- virStringFreeList(data.data);
- return -1;
+ return driver->getModels(models);
}
goto cleanup;
}
+static int
+ppcGetModels(char ***models)
+{
+ struct ppc_map *map;
+ struct ppc_model *model;
+ char *name;
+ size_t nmodels = 0;
+
+ if (!(map = ppcLoadMap()))
+ goto error;
+
+ if (models && VIR_ALLOC_N(*models, 0) < 0)
+ goto error;
+
+ model = map->models;
+ while (model != NULL) {
+ if (VIR_STRDUP(name, model->name) < 0)
+ goto error;
+
+ if (VIR_INSERT_ELEMENT(*models, 0, nmodels, name) < 0)
+ goto error;
+
+ model = model->next;
+ }
+
+ cleanup:
+ ppcMapFree(map);
+
+ return nmodels;
+
+ error:
+ virStringFreeList(*models);
+ nmodels = -1;
+ goto cleanup;
+}
+
struct cpuArchDriver cpuDriverPowerPC = {
.name = "ppc64",
.arch = archs,
.baseline = ppcBaseline,
.update = ppcUpdate,
.hasFeature = NULL,
+ .getModels = ppcGetModels,
};
return ret;
}
+static int
+x86GetModels(char ***models)
+{
+ const struct x86_map *map;
+ struct x86_model *model;
+ char *name;
+ size_t nmodels = 0;
+
+ if (!(map = virCPUx86GetMap()))
+ return -1;
+
+ if (models && VIR_ALLOC_N(*models, 0) < 0)
+ goto error;
+
+ model = map->models;
+ while (model != NULL) {
+ if (VIR_STRDUP(name, model->name) < 0)
+ goto error;
+
+ if (VIR_INSERT_ELEMENT(*models, 0, nmodels, name) < 0)
+ goto error;
+
+ model = model->next;
+ }
+
+ return nmodels;
+
+ error:
+ virStringFreeList(*models);
+ return -1;
+}
+
struct cpuArchDriver cpuDriverX86 = {
.name = "x86",
.hasFeature = x86HasFeature,
.dataFormat = x86CPUDataFormat,
.dataParse = x86CPUDataParse,
+ .getModels = x86GetModels,
};