virDomainCapsCPUModelsPtr
-virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon)
+virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon,
+ virArch arch)
{
virDomainCapsCPUModelsPtr models = NULL;
qemuMonitorCPUDefInfoPtr *cpus = NULL;
if ((ncpus = qemuMonitorGetCPUDefinitions(mon, &cpus)) < 0)
return NULL;
+ /* QEMU 2.11 for Power renamed all CPU models to lower case, we need to
+ * translate them back to libvirt's upper case model names. */
+ if (ARCH_IS_PPC(arch)) {
+ VIR_AUTOSTRINGLIST libvirtModels = NULL;
+ char **name;
+
+ if (virCPUGetModels(arch, &libvirtModels) < 0)
+ goto error;
+
+ for (name = libvirtModels; name && *name; name++) {
+ for (i = 0; i < ncpus; i++) {
+ if (STRCASENEQ(cpus[i]->name, *name))
+ continue;
+
+ VIR_FREE(cpus[i]->name);
+ if (VIR_STRDUP(cpus[i]->name, *name) < 0)
+ goto error;
+ }
+ }
+ }
+
if (!(models = virDomainCapsCPUModelsNew(ncpus)))
goto error;
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_DEFINITIONS))
return 0;
- if (!(models = virQEMUCapsFetchCPUDefinitions(mon)))
+ if (!(models = virQEMUCapsFetchCPUDefinitions(mon, qemuCaps->arch)))
return -1;
if (tcg || !virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM))
virDomainCapsCPUUsable usable);
virDomainCapsCPUModelsPtr virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps,
virDomainVirtType type);
-virDomainCapsCPUModelsPtr virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon);
+virDomainCapsCPUModelsPtr virQEMUCapsFetchCPUDefinitions(qemuMonitorPtr mon,
+ virArch arch);
typedef enum {
/* Host CPU definition reported in domain capabilities. */
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
goto error;
- models = virQEMUCapsFetchCPUDefinitions(priv->mon);
+ models = virQEMUCapsFetchCPUDefinitions(priv->mon, vm->def->os.arch);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
goto error;
<mode name='host-model' supported='yes'>
<model fallback='allow'>POWER8</model>
</mode>
- <mode name='custom' supported='no'/>
+ <mode name='custom' supported='yes'>
+ <model usable='unknown'>POWER9</model>
+ <model usable='unknown'>POWER8</model>
+ <model usable='unknown'>POWER7</model>
+ </mode>
</cpu>
<devices>
<disk supported='yes'>
<cpu type='kvm' name='970mp'/>
<cpu type='kvm' name='970fx'/>
<cpu type='kvm' name='970'/>
- <cpu type='kvm' name='power9'/>
+ <cpu type='kvm' name='POWER9'/>
<cpu type='kvm' name='power8nvl'/>
- <cpu type='kvm' name='power8'/>
+ <cpu type='kvm' name='POWER8'/>
<cpu type='kvm' name='power8e'/>
<cpu type='kvm' name='power7+'/>
- <cpu type='kvm' name='power7'/>
+ <cpu type='kvm' name='POWER7'/>
<cpu type='kvm' name='power5gs'/>
<cpu type='kvm' name='power5+'/>
<cpu type='kvm' name='apollo7pm'/>
<cpu type='tcg' name='970mp'/>
<cpu type='tcg' name='970fx'/>
<cpu type='tcg' name='970'/>
- <cpu type='tcg' name='power9'/>
+ <cpu type='tcg' name='POWER9'/>
<cpu type='tcg' name='power8nvl'/>
- <cpu type='tcg' name='power8'/>
+ <cpu type='tcg' name='POWER8'/>
<cpu type='tcg' name='power8e'/>
<cpu type='tcg' name='power7+'/>
- <cpu type='tcg' name='power7'/>
+ <cpu type='tcg' name='POWER7'/>
<cpu type='tcg' name='power5gs'/>
<cpu type='tcg' name='power5+'/>
<cpu type='tcg' name='apollo7pm'/>
<cpu type='kvm' name='970mp'/>
<cpu type='kvm' name='970fx'/>
<cpu type='kvm' name='970'/>
- <cpu type='kvm' name='power9'/>
+ <cpu type='kvm' name='POWER9'/>
<cpu type='kvm' name='power8nvl'/>
- <cpu type='kvm' name='power8'/>
+ <cpu type='kvm' name='POWER8'/>
<cpu type='kvm' name='power8e'/>
<cpu type='kvm' name='power7+'/>
- <cpu type='kvm' name='power7'/>
+ <cpu type='kvm' name='POWER7'/>
<cpu type='kvm' name='power5gs'/>
<cpu type='kvm' name='power5+'/>
<cpu type='kvm' name='apollo7pm'/>
<cpu type='tcg' name='970mp'/>
<cpu type='tcg' name='970fx'/>
<cpu type='tcg' name='970'/>
- <cpu type='tcg' name='power9'/>
+ <cpu type='tcg' name='POWER9'/>
<cpu type='tcg' name='power8nvl'/>
- <cpu type='tcg' name='power8'/>
+ <cpu type='tcg' name='POWER8'/>
<cpu type='tcg' name='power8e'/>
<cpu type='tcg' name='power7+'/>
- <cpu type='tcg' name='power7'/>
+ <cpu type='tcg' name='POWER7'/>
<cpu type='tcg' name='power5gs'/>
<cpu type='tcg' name='power5+'/>
<cpu type='tcg' name='apollo7pm'/>
<cpu type='kvm' name='ppc'/>
<cpu type='kvm' name='ppc32'/>
<cpu type='kvm' name='ppc64'/>
- <cpu type='kvm' name='power9'/>
+ <cpu type='kvm' name='POWER9'/>
<cpu type='kvm' name='power8nvl'/>
- <cpu type='kvm' name='power8'/>
+ <cpu type='kvm' name='POWER8'/>
<cpu type='kvm' name='power8e'/>
<cpu type='kvm' name='power7+'/>
- <cpu type='kvm' name='power7'/>
+ <cpu type='kvm' name='POWER7'/>
<cpu type='kvm' name='power5gs'/>
<cpu type='kvm' name='power5+'/>
<cpu type='kvm' name='970mp'/>
<cpu type='tcg' name='ppc'/>
<cpu type='tcg' name='ppc32'/>
<cpu type='tcg' name='ppc64'/>
- <cpu type='tcg' name='power9'/>
+ <cpu type='tcg' name='POWER9'/>
<cpu type='tcg' name='power8nvl'/>
- <cpu type='tcg' name='power8'/>
+ <cpu type='tcg' name='POWER8'/>
<cpu type='tcg' name='power8e'/>
<cpu type='tcg' name='power7+'/>
- <cpu type='tcg' name='power7'/>
+ <cpu type='tcg' name='POWER7'/>
<cpu type='tcg' name='power5gs'/>
<cpu type='tcg' name='power5+'/>
<cpu type='tcg' name='970mp'/>
<cpu type='kvm' name='ppc'/>
<cpu type='kvm' name='ppc32'/>
<cpu type='kvm' name='ppc64'/>
- <cpu type='kvm' name='power9'/>
+ <cpu type='kvm' name='POWER9'/>
<cpu type='kvm' name='power8nvl'/>
- <cpu type='kvm' name='power8'/>
+ <cpu type='kvm' name='POWER8'/>
<cpu type='kvm' name='power8e'/>
<cpu type='kvm' name='power7+'/>
- <cpu type='kvm' name='power7'/>
+ <cpu type='kvm' name='POWER7'/>
<cpu type='kvm' name='power5gs'/>
<cpu type='kvm' name='power5+'/>
<cpu type='kvm' name='970mp'/>
<cpu type='tcg' name='ppc'/>
<cpu type='tcg' name='ppc32'/>
<cpu type='tcg' name='ppc64'/>
- <cpu type='tcg' name='power9'/>
+ <cpu type='tcg' name='POWER9'/>
<cpu type='tcg' name='power8nvl'/>
- <cpu type='tcg' name='power8'/>
+ <cpu type='tcg' name='POWER8'/>
<cpu type='tcg' name='power8e'/>
<cpu type='tcg' name='power7+'/>
- <cpu type='tcg' name='power7'/>
+ <cpu type='tcg' name='POWER7'/>
<cpu type='tcg' name='power5gs'/>
<cpu type='tcg' name='power5+'/>
<cpu type='tcg' name='970mp'/>