virQEMUCapsAddCPUDefinitions(virQEMUCapsPtr qemuCaps,
virDomainVirtType type,
const char **name,
- size_t count)
+ size_t count,
+ virDomainCapsCPUUsable usable)
{
size_t i;
virDomainCapsCPUModelsPtr cpus = NULL;
}
for (i = 0; i < count; i++) {
- if (virDomainCapsCPUModelsAdd(cpus, name[i], -1,
- VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0)
+ if (virDomainCapsCPUModelsAdd(cpus, name[i], -1, usable) < 0)
return -1;
}
qemuCaps->kvmCPUModels = models;
for (i = 0; i < ncpus; i++) {
- if (virDomainCapsCPUModelsAddSteal(models,
- &cpus[i]->name,
- VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0)
+ virDomainCapsCPUUsable usable = VIR_DOMCAPS_CPU_USABLE_UNKNOWN;
+
+ if (cpus[i]->usable == VIR_TRISTATE_BOOL_YES)
+ usable = VIR_DOMCAPS_CPU_USABLE_YES;
+ else if (cpus[i]->usable == VIR_TRISTATE_BOOL_NO)
+ usable = VIR_DOMCAPS_CPU_USABLE_NO;
+
+ if (virDomainCapsCPUModelsAddSteal(models, &cpus[i]->name, usable) < 0)
goto cleanup;
}
qemuCaps->tcgCPUModels = cpus;
for (i = 0; i < n; i++) {
+ int usable = VIR_DOMCAPS_CPU_USABLE_UNKNOWN;
+
+ if ((str = virXMLPropString(nodes[i], "usable")) &&
+ (usable = virDomainCapsCPUUsableTypeFromString(str)) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ _("unknown value '%s' in attribute 'usable'"), str);
+ goto cleanup;
+ }
+ VIR_FREE(str);
+
if (!(str = virXMLPropString(nodes[i], "name"))) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("missing cpu name in QEMU capabilities cache"));
goto cleanup;
}
- if (virDomainCapsCPUModelsAddSteal(cpus, &str,
- VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0)
+ if (virDomainCapsCPUModelsAddSteal(cpus, &str, usable) < 0)
goto cleanup;
}
return;
for (i = 0; i < cpus->nmodels; i++) {
+ virDomainCapsCPUModelPtr cpu = cpus->models + i;
+
virBufferAsprintf(buf, "<cpu type='%s' ", typeStr);
- virBufferEscapeString(buf, "name='%s'/>\n", cpus->models[i].name);
+ virBufferEscapeString(buf, "name='%s'", cpu->name);
+ if (cpu->usable) {
+ virBufferAsprintf(buf, " usable='%s'",
+ virDomainCapsCPUUsableTypeToString(cpu->usable));
+ }
+ virBufferAddLit(buf, "/>\n");
}
}
int virQEMUCapsAddCPUDefinitions(virQEMUCapsPtr qemuCaps,
virDomainVirtType type,
const char **name,
- size_t count);
+ size_t count,
+ virDomainCapsCPUUsable usable);
int virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps,
virDomainVirtType type,
char ***names,
typedef qemuMonitorCPUDefInfo *qemuMonitorCPUDefInfoPtr;
struct _qemuMonitorCPUDefInfo {
+ virTristateBool usable;
char *name;
};
if (VIR_STRDUP(cpu->name, tmp) < 0)
goto cleanup;
+
+ if (virJSONValueObjectHasKey(child, "unavailable-features")) {
+ virJSONValuePtr blockers;
+
+ blockers = virJSONValueObjectGetArray(child,
+ "unavailable-features");
+ if (!blockers) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("unavailable-features in query-cpu-definitions "
+ "reply data was not an array"));
+ goto cleanup;
+ }
+
+ if (virJSONValueArraySize(blockers) > 0)
+ cpu->usable = VIR_TRISTATE_BOOL_NO;
+ else
+ cpu->usable = VIR_TRISTATE_BOOL_YES;
+ }
}
ret = n;
<model fallback='allow'>Broadwell</model>
</mode>
<mode name='custom' supported='yes'>
- <model usable='unknown'>qemu64</model>
- <model usable='unknown'>qemu32</model>
- <model usable='unknown'>phenom</model>
- <model usable='unknown'>pentium3</model>
- <model usable='unknown'>pentium2</model>
- <model usable='unknown'>pentium</model>
- <model usable='unknown'>n270</model>
- <model usable='unknown'>kvm64</model>
- <model usable='unknown'>kvm32</model>
- <model usable='unknown'>coreduo</model>
- <model usable='unknown'>core2duo</model>
- <model usable='unknown'>athlon</model>
- <model usable='unknown'>Westmere</model>
- <model usable='unknown'>Skylake-Client</model>
- <model usable='unknown'>SandyBridge</model>
- <model usable='unknown'>Penryn</model>
- <model usable='unknown'>Opteron_G5</model>
- <model usable='unknown'>Opteron_G4</model>
- <model usable='unknown'>Opteron_G3</model>
- <model usable='unknown'>Opteron_G2</model>
- <model usable='unknown'>Opteron_G1</model>
- <model usable='unknown'>Nehalem</model>
- <model usable='unknown'>IvyBridge</model>
- <model usable='unknown'>Haswell</model>
- <model usable='unknown'>Haswell-noTSX</model>
- <model usable='unknown'>Conroe</model>
- <model usable='unknown'>Broadwell</model>
- <model usable='unknown'>Broadwell-noTSX</model>
- <model usable='unknown'>486</model>
+ <model usable='yes'>qemu64</model>
+ <model usable='yes'>qemu32</model>
+ <model usable='no'>phenom</model>
+ <model usable='yes'>pentium3</model>
+ <model usable='yes'>pentium2</model>
+ <model usable='yes'>pentium</model>
+ <model usable='yes'>n270</model>
+ <model usable='yes'>kvm64</model>
+ <model usable='yes'>kvm32</model>
+ <model usable='yes'>coreduo</model>
+ <model usable='yes'>core2duo</model>
+ <model usable='yes'>athlon</model>
+ <model usable='yes'>Westmere</model>
+ <model usable='no'>Skylake-Client</model>
+ <model usable='no'>SandyBridge</model>
+ <model usable='yes'>Penryn</model>
+ <model usable='no'>Opteron_G5</model>
+ <model usable='no'>Opteron_G4</model>
+ <model usable='no'>Opteron_G3</model>
+ <model usable='yes'>Opteron_G2</model>
+ <model usable='yes'>Opteron_G1</model>
+ <model usable='yes'>Nehalem</model>
+ <model usable='no'>IvyBridge</model>
+ <model usable='no'>Haswell</model>
+ <model usable='no'>Haswell-noTSX</model>
+ <model usable='yes'>Conroe</model>
+ <model usable='no'>Broadwell</model>
+ <model usable='no'>Broadwell-noTSX</model>
+ <model usable='yes'>486</model>
</mode>
</cpu>
<devices>
<model fallback='allow'>Broadwell</model>
</mode>
<mode name='custom' supported='yes'>
- <model usable='unknown'>qemu64</model>
- <model usable='unknown'>qemu32</model>
- <model usable='unknown'>phenom</model>
- <model usable='unknown'>pentium3</model>
- <model usable='unknown'>pentium2</model>
- <model usable='unknown'>pentium</model>
- <model usable='unknown'>n270</model>
- <model usable='unknown'>kvm64</model>
- <model usable='unknown'>kvm32</model>
- <model usable='unknown'>coreduo</model>
- <model usable='unknown'>core2duo</model>
- <model usable='unknown'>athlon</model>
- <model usable='unknown'>Westmere</model>
- <model usable='unknown'>Skylake-Client</model>
- <model usable='unknown'>SandyBridge</model>
- <model usable='unknown'>Penryn</model>
- <model usable='unknown'>Opteron_G5</model>
- <model usable='unknown'>Opteron_G4</model>
- <model usable='unknown'>Opteron_G3</model>
- <model usable='unknown'>Opteron_G2</model>
- <model usable='unknown'>Opteron_G1</model>
- <model usable='unknown'>Nehalem</model>
- <model usable='unknown'>IvyBridge</model>
- <model usable='unknown'>Haswell</model>
- <model usable='unknown'>Haswell-noTSX</model>
- <model usable='unknown'>Conroe</model>
- <model usable='unknown'>Broadwell</model>
- <model usable='unknown'>Broadwell-noTSX</model>
- <model usable='unknown'>486</model>
+ <model usable='yes'>qemu64</model>
+ <model usable='yes'>qemu32</model>
+ <model usable='no'>phenom</model>
+ <model usable='yes'>pentium3</model>
+ <model usable='yes'>pentium2</model>
+ <model usable='yes'>pentium</model>
+ <model usable='yes'>n270</model>
+ <model usable='yes'>kvm64</model>
+ <model usable='yes'>kvm32</model>
+ <model usable='yes'>coreduo</model>
+ <model usable='yes'>core2duo</model>
+ <model usable='no'>athlon</model>
+ <model usable='yes'>Westmere</model>
+ <model usable='yes'>Skylake-Client</model>
+ <model usable='yes'>SandyBridge</model>
+ <model usable='yes'>Penryn</model>
+ <model usable='no'>Opteron_G5</model>
+ <model usable='no'>Opteron_G4</model>
+ <model usable='no'>Opteron_G3</model>
+ <model usable='yes'>Opteron_G2</model>
+ <model usable='yes'>Opteron_G1</model>
+ <model usable='yes'>Nehalem</model>
+ <model usable='yes'>IvyBridge</model>
+ <model usable='yes'>Haswell</model>
+ <model usable='yes'>Haswell-noTSX</model>
+ <model usable='yes'>Conroe</model>
+ <model usable='yes'>Broadwell</model>
+ <model usable='yes'>Broadwell-noTSX</model>
+ <model usable='yes'>486</model>
</mode>
</cpu>
<devices>
<kvmVersion>0</kvmVersion>
<package> (v2.8.0-rc1-dirty)</package>
<arch>x86_64</arch>
- <cpu type='kvm' name='host'/>
- <cpu type='kvm' name='qemu64'/>
- <cpu type='kvm' name='qemu32'/>
- <cpu type='kvm' name='phenom'/>
- <cpu type='kvm' name='pentium3'/>
- <cpu type='kvm' name='pentium2'/>
- <cpu type='kvm' name='pentium'/>
- <cpu type='kvm' name='n270'/>
- <cpu type='kvm' name='kvm64'/>
- <cpu type='kvm' name='kvm32'/>
- <cpu type='kvm' name='coreduo'/>
- <cpu type='kvm' name='core2duo'/>
- <cpu type='kvm' name='athlon'/>
- <cpu type='kvm' name='Westmere'/>
- <cpu type='kvm' name='Skylake-Client'/>
- <cpu type='kvm' name='SandyBridge'/>
- <cpu type='kvm' name='Penryn'/>
- <cpu type='kvm' name='Opteron_G5'/>
- <cpu type='kvm' name='Opteron_G4'/>
- <cpu type='kvm' name='Opteron_G3'/>
- <cpu type='kvm' name='Opteron_G2'/>
- <cpu type='kvm' name='Opteron_G1'/>
- <cpu type='kvm' name='Nehalem'/>
- <cpu type='kvm' name='IvyBridge'/>
- <cpu type='kvm' name='Haswell'/>
- <cpu type='kvm' name='Haswell-noTSX'/>
- <cpu type='kvm' name='Conroe'/>
- <cpu type='kvm' name='Broadwell'/>
- <cpu type='kvm' name='Broadwell-noTSX'/>
- <cpu type='kvm' name='486'/>
- <cpu type='tcg' name='host'/>
- <cpu type='tcg' name='qemu64'/>
- <cpu type='tcg' name='qemu32'/>
- <cpu type='tcg' name='phenom'/>
- <cpu type='tcg' name='pentium3'/>
- <cpu type='tcg' name='pentium2'/>
- <cpu type='tcg' name='pentium'/>
- <cpu type='tcg' name='n270'/>
- <cpu type='tcg' name='kvm64'/>
- <cpu type='tcg' name='kvm32'/>
- <cpu type='tcg' name='coreduo'/>
- <cpu type='tcg' name='core2duo'/>
- <cpu type='tcg' name='athlon'/>
- <cpu type='tcg' name='Westmere'/>
- <cpu type='tcg' name='Skylake-Client'/>
- <cpu type='tcg' name='SandyBridge'/>
- <cpu type='tcg' name='Penryn'/>
- <cpu type='tcg' name='Opteron_G5'/>
- <cpu type='tcg' name='Opteron_G4'/>
- <cpu type='tcg' name='Opteron_G3'/>
- <cpu type='tcg' name='Opteron_G2'/>
- <cpu type='tcg' name='Opteron_G1'/>
- <cpu type='tcg' name='Nehalem'/>
- <cpu type='tcg' name='IvyBridge'/>
- <cpu type='tcg' name='Haswell'/>
- <cpu type='tcg' name='Haswell-noTSX'/>
- <cpu type='tcg' name='Conroe'/>
- <cpu type='tcg' name='Broadwell'/>
- <cpu type='tcg' name='Broadwell-noTSX'/>
- <cpu type='tcg' name='486'/>
+ <cpu type='kvm' name='host' usable='yes'/>
+ <cpu type='kvm' name='qemu64' usable='yes'/>
+ <cpu type='kvm' name='qemu32' usable='yes'/>
+ <cpu type='kvm' name='phenom' usable='no'/>
+ <cpu type='kvm' name='pentium3' usable='yes'/>
+ <cpu type='kvm' name='pentium2' usable='yes'/>
+ <cpu type='kvm' name='pentium' usable='yes'/>
+ <cpu type='kvm' name='n270' usable='yes'/>
+ <cpu type='kvm' name='kvm64' usable='yes'/>
+ <cpu type='kvm' name='kvm32' usable='yes'/>
+ <cpu type='kvm' name='coreduo' usable='yes'/>
+ <cpu type='kvm' name='core2duo' usable='yes'/>
+ <cpu type='kvm' name='athlon' usable='no'/>
+ <cpu type='kvm' name='Westmere' usable='yes'/>
+ <cpu type='kvm' name='Skylake-Client' usable='yes'/>
+ <cpu type='kvm' name='SandyBridge' usable='yes'/>
+ <cpu type='kvm' name='Penryn' usable='yes'/>
+ <cpu type='kvm' name='Opteron_G5' usable='no'/>
+ <cpu type='kvm' name='Opteron_G4' usable='no'/>
+ <cpu type='kvm' name='Opteron_G3' usable='no'/>
+ <cpu type='kvm' name='Opteron_G2' usable='yes'/>
+ <cpu type='kvm' name='Opteron_G1' usable='yes'/>
+ <cpu type='kvm' name='Nehalem' usable='yes'/>
+ <cpu type='kvm' name='IvyBridge' usable='yes'/>
+ <cpu type='kvm' name='Haswell' usable='yes'/>
+ <cpu type='kvm' name='Haswell-noTSX' usable='yes'/>
+ <cpu type='kvm' name='Conroe' usable='yes'/>
+ <cpu type='kvm' name='Broadwell' usable='yes'/>
+ <cpu type='kvm' name='Broadwell-noTSX' usable='yes'/>
+ <cpu type='kvm' name='486' usable='yes'/>
+ <cpu type='tcg' name='host' usable='no'/>
+ <cpu type='tcg' name='qemu64' usable='yes'/>
+ <cpu type='tcg' name='qemu32' usable='yes'/>
+ <cpu type='tcg' name='phenom' usable='no'/>
+ <cpu type='tcg' name='pentium3' usable='yes'/>
+ <cpu type='tcg' name='pentium2' usable='yes'/>
+ <cpu type='tcg' name='pentium' usable='yes'/>
+ <cpu type='tcg' name='n270' usable='yes'/>
+ <cpu type='tcg' name='kvm64' usable='yes'/>
+ <cpu type='tcg' name='kvm32' usable='yes'/>
+ <cpu type='tcg' name='coreduo' usable='yes'/>
+ <cpu type='tcg' name='core2duo' usable='yes'/>
+ <cpu type='tcg' name='athlon' usable='yes'/>
+ <cpu type='tcg' name='Westmere' usable='yes'/>
+ <cpu type='tcg' name='Skylake-Client' usable='no'/>
+ <cpu type='tcg' name='SandyBridge' usable='no'/>
+ <cpu type='tcg' name='Penryn' usable='yes'/>
+ <cpu type='tcg' name='Opteron_G5' usable='no'/>
+ <cpu type='tcg' name='Opteron_G4' usable='no'/>
+ <cpu type='tcg' name='Opteron_G3' usable='no'/>
+ <cpu type='tcg' name='Opteron_G2' usable='yes'/>
+ <cpu type='tcg' name='Opteron_G1' usable='yes'/>
+ <cpu type='tcg' name='Nehalem' usable='yes'/>
+ <cpu type='tcg' name='IvyBridge' usable='no'/>
+ <cpu type='tcg' name='Haswell' usable='no'/>
+ <cpu type='tcg' name='Haswell-noTSX' usable='no'/>
+ <cpu type='tcg' name='Conroe' usable='yes'/>
+ <cpu type='tcg' name='Broadwell' usable='no'/>
+ <cpu type='tcg' name='Broadwell-noTSX' usable='no'/>
+ <cpu type='tcg' name='486' usable='yes'/>
<machine name='pc-i440fx-2.8' alias='pc' hotplugCpus='yes' maxCpus='255'/>
<machine name='pc-0.12' hotplugCpus='yes' maxCpus='255'/>
<machine name='pc-i440fx-2.4' hotplugCpus='yes' maxCpus='255'/>
" \"name\": \"qemu64\" "
" }, "
" { "
- " \"name\": \"Opteron_G4\" "
+ " \"name\": \"Opteron_G4\", "
+ " \"unavailable-features\": [\"vme\"]"
" }, "
" { "
- " \"name\": \"Westmere\" "
+ " \"name\": \"Westmere\", "
+ " \"unavailable-features\": []"
" } "
" ]"
"}") < 0)
goto cleanup;
}
-#define CHECK(i, wantname) \
+#define CHECK_FULL(i, wantname, Usable) \
do { \
if (STRNEQ(cpus[i]->name, (wantname))) { \
virReportError(VIR_ERR_INTERNAL_ERROR, \
cpus[i]->name, (wantname)); \
goto cleanup; \
} \
+ if (cpus[i]->usable != (Usable)) { \
+ virReportError(VIR_ERR_INTERNAL_ERROR, \
+ "%s: expecting usable flag %d, got %d", \
+ cpus[i]->name, Usable, cpus[i]->usable); \
+ goto cleanup; \
+ } \
} while (0)
+#define CHECK(i, wantname) \
+ CHECK_FULL(i, wantname, VIR_TRISTATE_BOOL_ABSENT)
+
+#define CHECK_USABLE(i, wantname, usable) \
+ CHECK_FULL(i, wantname, \
+ usable ? VIR_TRISTATE_BOOL_YES : VIR_TRISTATE_BOOL_NO)
+
CHECK(0, "qemu64");
- CHECK(1, "Opteron_G4");
- CHECK(2, "Westmere");
+ CHECK_USABLE(1, "Opteron_G4", false);
+ CHECK_USABLE(2, "Westmere", true);
#undef CHECK
+#undef CHECK_USABLE
+#undef CHECK_FULL
ret = 0;
if (ARCH_IS_X86(arch)) {
if (virQEMUCapsAddCPUDefinitions(caps, VIR_DOMAIN_VIRT_KVM, x86Models,
- ARRAY_CARDINALITY(x86Models)) < 0 ||
+ ARRAY_CARDINALITY(x86Models),
+ VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0 ||
virQEMUCapsAddCPUDefinitions(caps, VIR_DOMAIN_VIRT_QEMU, x86Models,
- ARRAY_CARDINALITY(x86Models)) < 0)
+ ARRAY_CARDINALITY(x86Models),
+ VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0)
return -1;
if (!skipLegacy) {
if (virQEMUCapsAddCPUDefinitions(caps, VIR_DOMAIN_VIRT_KVM,
x86LegacyModels,
- ARRAY_CARDINALITY(x86LegacyModels)) < 0 ||
+ ARRAY_CARDINALITY(x86LegacyModels),
+ VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0 ||
virQEMUCapsAddCPUDefinitions(caps, VIR_DOMAIN_VIRT_QEMU,
x86LegacyModels,
- ARRAY_CARDINALITY(x86LegacyModels)) < 0)
+ ARRAY_CARDINALITY(x86LegacyModels),
+ VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0)
return -1;
}
} else if (ARCH_IS_ARM(arch)) {
if (virQEMUCapsAddCPUDefinitions(caps, VIR_DOMAIN_VIRT_KVM, armModels,
- ARRAY_CARDINALITY(armModels)) < 0 ||
+ ARRAY_CARDINALITY(armModels),
+ VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0 ||
virQEMUCapsAddCPUDefinitions(caps, VIR_DOMAIN_VIRT_QEMU, armModels,
- ARRAY_CARDINALITY(armModels)) < 0)
+ ARRAY_CARDINALITY(armModels),
+ VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0)
return -1;
} else if (ARCH_IS_PPC64(arch)) {
if (virQEMUCapsAddCPUDefinitions(caps, VIR_DOMAIN_VIRT_KVM, ppc64Models,
- ARRAY_CARDINALITY(ppc64Models)) < 0 ||
+ ARRAY_CARDINALITY(ppc64Models),
+ VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0 ||
virQEMUCapsAddCPUDefinitions(caps, VIR_DOMAIN_VIRT_QEMU, ppc64Models,
- ARRAY_CARDINALITY(ppc64Models)) < 0)
+ ARRAY_CARDINALITY(ppc64Models),
+ VIR_DOMCAPS_CPU_USABLE_UNKNOWN) < 0)
return -1;
}