if (nodeGetInfo(&nodeinfo))
return -1;
- if (!(caps->host.cpu = virCPUGetHost(arch, VIR_CPU_TYPE_HOST, &nodeinfo)))
+ if (!(caps->host.cpu = virCPUGetHost(arch, VIR_CPU_TYPE_HOST,
+ &nodeinfo, NULL, 0)))
return -1;
return 0;
* @arch: CPU architecture
* @type: requested type of the CPU
* @nodeInfo: simplified CPU topology (optional)
+ * @models: list of CPU models that can be considered for host CPU
+ * @nmodels: number of CPU models in @models
*
* Create CPU definition describing the host's CPU.
*
* host CPU model. In other words, a CPU definition containing just the
* topology is a successful result even if detecting the host CPU model fails.
*
+ * It possible to limit the CPU model which may appear in the created CPU
+ * definition by passing non-NULL @models list. This is useful when requesting
+ * a CPU model usable on a specific hypervisor. If @models is NULL, any CPU
+ * model known to libvirt may appear in the result.
+ *
* Returns host CPU definition or NULL on error.
*/
virCPUDefPtr
virCPUGetHost(virArch arch,
virCPUType type,
- virNodeInfoPtr nodeInfo)
+ virNodeInfoPtr nodeInfo,
+ const char **models,
+ unsigned int nmodels)
{
struct cpuArchDriver *driver;
virCPUDefPtr cpu = NULL;
- VIR_DEBUG("arch=%s, type=%s, nodeInfo=%p",
- virArchToString(arch), virCPUTypeToString(type), nodeInfo);
+ VIR_DEBUG("arch=%s, type=%s, nodeInfo=%p, models=%p, nmodels=%u",
+ virArchToString(arch), virCPUTypeToString(type), nodeInfo,
+ models, nmodels);
if (!(driver = cpuGetSubDriver(arch)))
return NULL;
* filled in.
*/
if (driver->getHost) {
- if (driver->getHost(cpu) < 0 && !nodeInfo)
+ if (driver->getHost(cpu, models, nmodels) < 0 &&
+ !nodeInfo)
goto error;
} else if (nodeInfo) {
VIR_DEBUG("cannot detect host CPU model for %s architecture",
(*cpuArchDataFree) (virCPUDataPtr data);
typedef int
-(*virCPUArchGetHost)(virCPUDefPtr cpu);
+(*virCPUArchGetHost)(virCPUDefPtr cpu,
+ const char **models,
+ unsigned int nmodels);
typedef virCPUDefPtr
(*cpuArchBaseline) (virCPUDefPtr *cpus,
virCPUDefPtr
virCPUGetHost(virArch arch,
virCPUType type,
- virNodeInfoPtr nodeInfo);
+ virNodeInfoPtr nodeInfo,
+ const char **models,
+ unsigned int nmodels);
char *
cpuBaselineXML(const char **xmlCPUs,
static int
-virCPUppc64GetHost(virCPUDefPtr cpu)
+virCPUppc64GetHost(virCPUDefPtr cpu,
+ const char **models,
+ unsigned int nmodels)
{
virCPUDataPtr cpuData = NULL;
virCPUppc64Data *data;
#endif
data->pvr[0].mask = 0xfffffffful;
- ret = ppc64DriverDecode(cpu, cpuData, NULL, 0, NULL, 0);
+ ret = ppc64DriverDecode(cpu, cpuData, models, nmodels, NULL, 0);
cleanup:
virCPUppc64DataFree(cpuData);
static int
-virCPUx86GetHost(virCPUDefPtr cpu)
+virCPUx86GetHost(virCPUDefPtr cpu,
+ const char **models,
+ unsigned int nmodels)
{
virCPUDataPtr cpuData = NULL;
int ret = -1;
cpuidSet(CPUX86_EXTENDED, cpuData) < 0)
goto cleanup;
- ret = x86DecodeCPUData(cpu, cpuData, NULL, 0, NULL, 0);
+ ret = x86DecodeCPUData(cpu, cpuData, models, nmodels, NULL, 0);
cleanup:
virCPUx86DataFree(cpuData);
if (nodeGetInfo(&nodeinfo))
return -1;
- if (!(caps->host.cpu = virCPUGetHost(arch, VIR_CPU_TYPE_HOST, &nodeinfo)))
+ if (!(caps->host.cpu = virCPUGetHost(arch, VIR_CPU_TYPE_HOST,
+ &nodeinfo, NULL, 0)))
return -1;
return 0;
NULL, NULL, 0, NULL) == NULL)
goto error;
- if (!(cpu = virCPUGetHost(caps->host.arch, VIR_CPU_TYPE_HOST, NULL)))
+ if (!(cpu = virCPUGetHost(caps->host.arch, VIR_CPU_TYPE_HOST,
+ NULL, NULL, 0)))
goto error;
/* x86_64 guests are supported if
goto error;
if (!(caps->host.cpu = virCPUGetHost(caps->host.arch, VIR_CPU_TYPE_HOST,
- &nodeinfo)))
+ &nodeinfo, NULL, 0)))
goto error;
if (virCapabilitiesAddHostMigrateTransport(caps, "vzmigr") < 0)