Eric Blake <eblake(a)redhat.com> writes:
NACK, needs a v4; this is where we need to fix things to do the
right
subdriver mapping. Quoting IRC:
and I know which one to change
[15:30] jdenemar eblake: cpu-models should work for both x86 and x86_64 imho
[15:31] eblake yep - where the map file lists x86, we need the
cpu-models to support it for both i686 and x86_64
[15:32] jdenemar yeah, the x86 in cpu_map.xml is actually a cpu driver
name and the driver has a list of archs it supports
[15:34] eblake jdenemar: giuseppe_s used cpuMapLoad(arch, ...) - which
is only doing a literal string match
[15:34] eblake so where do we reverse map the driver names in the map
file into actual arch names?
[15:35] eblake or, where SHOULD we be doing that mapping?
[15:38] jdenemar every cpu api in cpu.c calls cpuGetSubDriver to get the
driver from a real arch
[15:41] jdenemar so there should be a high level cpu api that takes a
real arch and gives model names, that should look up the appropriate sub
driver, call its api and it should load its section of cpu_map.xml and
return the list
Jiri, would something like this suffice or am I missing some other
details?
Thanks,
Giuseppe
+int
+cpuGetModels(const char *archName, char ***models)
+{
+ struct cpuGetModelsData data;
+ virArch arch;
+ struct cpuArchDriver *driver;
+ data.data = NULL;
+ data.len = 1;
+
+ arch = virArchFromString(archName);
+ if (arch == VIR_ARCH_NONE) {
+ virReportError(VIR_ERR_INVALID_ARG,
+ _("cannot find architecture %s"),
+ archName);
+ goto error;
+ }
+
+ driver = cpuGetSubDriver(arch);
+ if (driver == NULL) {
+ virReportError(VIR_ERR_INVALID_ARG,
+ _("cannot find a driver for the architecture %s"),
+ archName);
+ goto error;
+ }
+
+ 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;
+
+error:
+ virStringFreeList(data.data);
+ return -1;
+}