Querying "host" CPU model expansion only makes sense for KVM. QEMU 2.9.0
introduces a new "max" CPU model which can be used to ask QEMU what the
best CPU it can provide to a TCG domain is.
Signed-off-by: Jiri Denemark <jdenemar(a)redhat.com>
---
src/qemu/qemu_capabilities.c | 151 ++++++++++++-----
src/qemu/qemu_capabilities.h | 3 +-
src/qemu/qemu_capspriv.h | 3 +-
src/qemu/qemu_command.c | 2 +-
src/qemu/qemu_process.c | 5 +-
.../qemucapabilitiesdata/caps_2.8.0.s390x.replies | 8 +
tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml | 2 +-
.../qemucapabilitiesdata/caps_2.9.0.x86_64.replies | 179 +++++++++++++++++++++
tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml | 172 +++++++++++++++++++-
tests/qemuxml2argvtest.c | 3 +-
10 files changed, 480 insertions(+), 48 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 466852d13..2ba82456e 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -400,13 +400,15 @@ struct _virQEMUCaps {
size_t ngicCapabilities;
virGICCapability *gicCapabilities;
- qemuMonitorCPUModelInfoPtr hostCPUModelInfo;
+ qemuMonitorCPUModelInfoPtr kvmCPUModelInfo;
+ qemuMonitorCPUModelInfoPtr tcgCPUModelInfo;
/* Anything below is not stored in the cache since the values are
* re-computed from the other fields or external data sources every
* time we probe QEMU or load the results from the cache.
*/
- virCPUDefPtr hostCPUModel;
+ virCPUDefPtr kvmCPUModel;
+ virCPUDefPtr tcgCPUModel;
};
struct virQEMUCapsSearchData {
@@ -2163,12 +2165,20 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps)
goto error;
}
- if (qemuCaps->hostCPUModel &&
- !(ret->hostCPUModel = virCPUDefCopy(qemuCaps->hostCPUModel)))
+ if (qemuCaps->kvmCPUModel &&
+ !(ret->kvmCPUModel = virCPUDefCopy(qemuCaps->kvmCPUModel)))
goto error;
- if (qemuCaps->hostCPUModelInfo &&
- !(ret->hostCPUModelInfo =
qemuMonitorCPUModelInfoCopy(qemuCaps->hostCPUModelInfo)))
+ if (qemuCaps->tcgCPUModel &&
+ !(ret->tcgCPUModel = virCPUDefCopy(qemuCaps->tcgCPUModel)))
+ goto error;
+
+ if (qemuCaps->kvmCPUModelInfo &&
+ !(ret->kvmCPUModelInfo =
qemuMonitorCPUModelInfoCopy(qemuCaps->kvmCPUModelInfo)))
+ goto error;
+
+ if (qemuCaps->tcgCPUModelInfo &&
+ !(ret->tcgCPUModelInfo =
qemuMonitorCPUModelInfoCopy(qemuCaps->tcgCPUModelInfo)))
goto error;
if (VIR_ALLOC_N(ret->machineTypes, qemuCaps->nmachineTypes) < 0)
@@ -2217,8 +2227,10 @@ void virQEMUCapsDispose(void *obj)
VIR_FREE(qemuCaps->gicCapabilities);
- qemuMonitorCPUModelInfoFree(qemuCaps->hostCPUModelInfo);
- virCPUDefFree(qemuCaps->hostCPUModel);
+ qemuMonitorCPUModelInfoFree(qemuCaps->kvmCPUModelInfo);
+ qemuMonitorCPUModelInfoFree(qemuCaps->tcgCPUModelInfo);
+ virCPUDefFree(qemuCaps->kvmCPUModel);
+ virCPUDefFree(qemuCaps->tcgCPUModel);
}
void
@@ -2435,9 +2447,13 @@ virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps,
virCPUDefPtr
-virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps)
+virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps,
+ virDomainVirtType type)
{
- return qemuCaps->hostCPUModel;
+ if (type == VIR_DOMAIN_VIRT_KVM)
+ return qemuCaps->kvmCPUModel;
+ else
+ return qemuCaps->tcgCPUModel;
}
@@ -2455,7 +2471,7 @@ virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps,
virQEMUCapsGuestIsNative(caps->host.arch, qemuCaps->arch);
case VIR_CPU_MODE_HOST_MODEL:
- return !!qemuCaps->hostCPUModel;
+ return !!virQEMUCapsGetHostModel(qemuCaps, type);
case VIR_CPU_MODE_CUSTOM:
if (type == VIR_DOMAIN_VIRT_KVM)
@@ -2822,14 +2838,24 @@ virQEMUCapsProbeQMPCPUDefinitions(virQEMUCapsPtr qemuCaps,
static int
virQEMUCapsProbeQMPHostCPU(virQEMUCapsPtr qemuCaps,
- qemuMonitorPtr mon)
+ qemuMonitorPtr mon,
+ bool tcg)
{
- if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION) ||
- !virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM))
+ qemuMonitorCPUModelInfoPtr *modelInfo;
+ const char *model;
+
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION))
return 0;
- return qemuMonitorGetCPUModelExpansion(mon, "static", "host",
- &qemuCaps->hostCPUModelInfo);
+ if (tcg || !virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM)) {
+ modelInfo = &qemuCaps->tcgCPUModelInfo;
+ model = "max";
+ } else {
+ modelInfo = &qemuCaps->kvmCPUModelInfo;
+ model = "host";
+ }
+
+ return qemuMonitorGetCPUModelExpansion(mon, "static", model, modelInfo);
}
struct tpmTypeToCaps {
@@ -3053,12 +3079,16 @@ virQEMUCapsCPUFilterFeatures(const char *name,
*/
static int
virQEMUCapsInitCPUModelS390(virQEMUCapsPtr qemuCaps,
+ virDomainVirtType type,
virCPUDefPtr cpu)
{
- qemuMonitorCPUModelInfoPtr modelInfo = qemuCaps->hostCPUModelInfo;
+ qemuMonitorCPUModelInfoPtr modelInfo;
size_t i;
- if (!modelInfo) {
+ if (type != VIR_DOMAIN_VIRT_KVM)
+ return -1;
+
+ if (!(modelInfo = qemuCaps->kvmCPUModelInfo)) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("missing host CPU model info from QEMU capabilities "
"for binary %s"),
@@ -3098,12 +3128,13 @@ virQEMUCapsInitCPUModelS390(virQEMUCapsPtr qemuCaps,
*/
static int
virQEMUCapsInitCPUModel(virQEMUCapsPtr qemuCaps,
+ virDomainVirtType type,
virCPUDefPtr cpu)
{
int ret = 1;
if (ARCH_IS_S390(qemuCaps->arch))
- ret = virQEMUCapsInitCPUModelS390(qemuCaps, cpu);
+ ret = virQEMUCapsInitCPUModelS390(qemuCaps, type, cpu);
if (ret == 0)
cpu->fallback = VIR_CPU_FALLBACK_FORBID;
@@ -3114,7 +3145,8 @@ virQEMUCapsInitCPUModel(virQEMUCapsPtr qemuCaps,
void
virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
- virCapsPtr caps)
+ virCapsPtr caps,
+ virDomainVirtType type)
{
virCPUDefPtr cpu = NULL;
int rc;
@@ -3130,7 +3162,7 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
cpu->match = VIR_CPU_MATCH_EXACT;
cpu->fallback = VIR_CPU_FALLBACK_ALLOW;
- if ((rc = virQEMUCapsInitCPUModel(qemuCaps, cpu)) < 0) {
+ if ((rc = virQEMUCapsInitCPUModel(qemuCaps, type, cpu)) < 0) {
goto error;
} else if (rc == 1) {
VIR_DEBUG("No host CPU model info from QEMU; using host
capabilities");
@@ -3143,7 +3175,11 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
goto error;
}
- qemuCaps->hostCPUModel = cpu;
+ if (type == VIR_DOMAIN_VIRT_KVM)
+ qemuCaps->kvmCPUModel = cpu;
+ else
+ qemuCaps->tcgCPUModel = cpu;
+
return;
error:
@@ -3154,7 +3190,8 @@ virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
static int
virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsPtr qemuCaps,
- xmlXPathContextPtr ctxt)
+ xmlXPathContextPtr ctxt,
+ virDomainVirtType type)
{
xmlNodePtr hostCPUNode;
xmlNodePtr *featureNodes = NULL;
@@ -3164,7 +3201,12 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsPtr qemuCaps,
size_t i;
int n;
- if (!(hostCPUNode = virXPathNode("./hostCPU", ctxt))) {
+ if (type == VIR_DOMAIN_VIRT_KVM)
+ hostCPUNode = virXPathNode("./hostCPU[@type='kvm']", ctxt);
+ else
+ hostCPUNode = virXPathNode("./hostCPU[@type='tcg']", ctxt);
+
+ if (!hostCPUNode) {
ret = 0;
goto cleanup;
}
@@ -3232,7 +3274,10 @@ virQEMUCapsLoadHostCPUModelInfo(virQEMUCapsPtr qemuCaps,
}
}
- qemuCaps->hostCPUModelInfo = hostCPU;
+ if (type == VIR_DOMAIN_VIRT_KVM)
+ qemuCaps->kvmCPUModelInfo = hostCPU;
+ else
+ qemuCaps->tcgCPUModelInfo = hostCPU;
hostCPU = NULL;
ret = 0;
@@ -3438,7 +3483,8 @@ virQEMUCapsLoadCache(virCapsPtr caps,
}
VIR_FREE(str);
- if (virQEMUCapsLoadHostCPUModelInfo(qemuCaps, ctxt) < 0)
+ if (virQEMUCapsLoadHostCPUModelInfo(qemuCaps, ctxt, VIR_DOMAIN_VIRT_KVM) < 0 ||
+ virQEMUCapsLoadHostCPUModelInfo(qemuCaps, ctxt, VIR_DOMAIN_VIRT_QEMU) < 0)
goto cleanup;
if (virQEMUCapsLoadCPUModels(qemuCaps, ctxt, VIR_DOMAIN_VIRT_KVM) < 0 ||
@@ -3546,7 +3592,8 @@ virQEMUCapsLoadCache(virCapsPtr caps,
}
VIR_FREE(nodes);
- virQEMUCapsInitHostCPUModel(qemuCaps, caps);
+ virQEMUCapsInitHostCPUModel(qemuCaps, caps, VIR_DOMAIN_VIRT_KVM);
+ virQEMUCapsInitHostCPUModel(qemuCaps, caps, VIR_DOMAIN_VIRT_QEMU);
ret = 0;
cleanup:
@@ -3560,12 +3607,26 @@ virQEMUCapsLoadCache(virCapsPtr caps,
static void
virQEMUCapsFormatHostCPUModelInfo(virQEMUCapsPtr qemuCaps,
- virBufferPtr buf)
+ virBufferPtr buf,
+ virDomainVirtType type)
{
- qemuMonitorCPUModelInfoPtr model = qemuCaps->hostCPUModelInfo;
+ qemuMonitorCPUModelInfoPtr model;
+ const char *typeStr;
size_t i;
- virBufferAsprintf(buf, "<hostCPU model='%s'>\n",
model->name);
+ if (type == VIR_DOMAIN_VIRT_KVM) {
+ typeStr = "kvm";
+ model = qemuCaps->kvmCPUModelInfo;
+ } else {
+ typeStr = "tcg";
+ model = qemuCaps->tcgCPUModelInfo;
+ }
+
+ if (!model)
+ return;
+
+ virBufferAsprintf(buf, "<hostCPU type='%s'
model='%s'>\n",
+ typeStr, model->name);
virBufferAdjustIndent(buf, 2);
for (i = 0; i < model->nprops; i++) {
@@ -3670,8 +3731,8 @@ virQEMUCapsFormatCache(virQEMUCapsPtr qemuCaps,
virBufferAsprintf(&buf, "<arch>%s</arch>\n",
virArchToString(qemuCaps->arch));
- if (qemuCaps->hostCPUModelInfo)
- virQEMUCapsFormatHostCPUModelInfo(qemuCaps, &buf);
+ virQEMUCapsFormatHostCPUModelInfo(qemuCaps, &buf, VIR_DOMAIN_VIRT_KVM);
+ virQEMUCapsFormatHostCPUModelInfo(qemuCaps, &buf, VIR_DOMAIN_VIRT_QEMU);
virQEMUCapsFormatCPUModels(qemuCaps, &buf, VIR_DOMAIN_VIRT_KVM);
virQEMUCapsFormatCPUModels(qemuCaps, &buf, VIR_DOMAIN_VIRT_QEMU);
@@ -3806,11 +3867,15 @@ virQEMUCapsReset(virQEMUCapsPtr qemuCaps)
VIR_FREE(qemuCaps->gicCapabilities);
qemuCaps->ngicCapabilities = 0;
- qemuMonitorCPUModelInfoFree(qemuCaps->hostCPUModelInfo);
- qemuCaps->hostCPUModelInfo = NULL;
+ qemuMonitorCPUModelInfoFree(qemuCaps->kvmCPUModelInfo);
+ qemuMonitorCPUModelInfoFree(qemuCaps->tcgCPUModelInfo);
+ qemuCaps->kvmCPUModelInfo = NULL;
+ qemuCaps->tcgCPUModelInfo = NULL;
- virCPUDefFree(qemuCaps->hostCPUModel);
- qemuCaps->hostCPUModel = NULL;
+ virCPUDefFree(qemuCaps->kvmCPUModel);
+ virCPUDefFree(qemuCaps->tcgCPUModel);
+ qemuCaps->kvmCPUModel = NULL;
+ qemuCaps->tcgCPUModel = NULL;
}
@@ -4368,7 +4433,7 @@ virQEMUCapsInitQMPMonitor(virQEMUCapsPtr qemuCaps,
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_QMP_SCHEMA) &&
virQEMUCapsProbeQMPSchemaCapabilities(qemuCaps, mon) < 0)
goto cleanup;
- if (virQEMUCapsProbeQMPHostCPU(qemuCaps, mon) < 0)
+ if (virQEMUCapsProbeQMPHostCPU(qemuCaps, mon, false) < 0)
goto cleanup;
/* 'intel-iommu' shows up as a device since 2.2.0, but can
@@ -4410,6 +4475,9 @@ virQEMUCapsInitQMPMonitorTCG(virQEMUCapsPtr qemuCaps
ATTRIBUTE_UNUSED,
if (virQEMUCapsProbeQMPCPUDefinitions(qemuCaps, mon, true) < 0)
goto cleanup;
+ if (virQEMUCapsProbeQMPHostCPU(qemuCaps, mon, true) < 0)
+ goto cleanup;
+
ret = 0;
cleanup:
return ret;
@@ -4754,7 +4822,8 @@ virQEMUCapsNewForBinaryInternal(virCapsPtr caps,
virQEMUCapsRememberCached(qemuCaps, cacheDir) < 0)
goto error;
- virQEMUCapsInitHostCPUModel(qemuCaps, caps);
+ virQEMUCapsInitHostCPUModel(qemuCaps, caps, VIR_DOMAIN_VIRT_KVM);
+ virQEMUCapsInitHostCPUModel(qemuCaps, caps, VIR_DOMAIN_VIRT_QEMU);
}
cleanup:
@@ -5200,8 +5269,10 @@ virQEMUCapsFillDomainCPUCaps(virCapsPtr caps,
domCaps->cpu.hostPassthrough = true;
if (virQEMUCapsIsCPUModeSupported(qemuCaps, caps, domCaps->virttype,
- VIR_CPU_MODE_HOST_MODEL))
- domCaps->cpu.hostModel = virCPUDefCopy(qemuCaps->hostCPUModel);
+ VIR_CPU_MODE_HOST_MODEL)) {
+ virCPUDefPtr cpu = virQEMUCapsGetHostModel(qemuCaps, domCaps->virttype);
+ domCaps->cpu.hostModel = virCPUDefCopy(cpu);
+ }
if (virQEMUCapsIsCPUModeSupported(qemuCaps, caps, domCaps->virttype,
VIR_CPU_MODE_CUSTOM)) {
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index 95bb67d44..3331142ea 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -441,7 +441,8 @@ int virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps,
virDomainVirtType type,
char ***names,
size_t *count);
-virCPUDefPtr virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps);
+virCPUDefPtr virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps,
+ virDomainVirtType type);
bool virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps,
virCapsPtr caps,
virDomainVirtType type,
diff --git a/src/qemu/qemu_capspriv.h b/src/qemu/qemu_capspriv.h
index 38b971e0e..75499d462 100644
--- a/src/qemu/qemu_capspriv.h
+++ b/src/qemu/qemu_capspriv.h
@@ -71,5 +71,6 @@ virQEMUCapsSetArch(virQEMUCapsPtr qemuCaps,
void
virQEMUCapsInitHostCPUModel(virQEMUCapsPtr qemuCaps,
- virCapsPtr caps);
+ virCapsPtr caps,
+ virDomainVirtType type);
#endif
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index c00a47a91..4e83dee37 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -6782,7 +6782,7 @@ qemuBuildCpuCommandLine(virCommandPtr cmd,
if (def->cpu->mode == VIR_CPU_MODE_CUSTOM)
cpuDef = def->cpu;
else if (def->cpu->mode == VIR_CPU_MODE_HOST_PASSTHROUGH)
- cpuDef = virQEMUCapsGetHostModel(qemuCaps);
+ cpuDef = virQEMUCapsGetHostModel(qemuCaps, def->virtType);
if (cpuDef) {
int svm = virCPUCheckFeature(def->os.arch, cpuDef, "svm");
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 92fa69b3c..b9df01da5 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -5147,13 +5147,14 @@ qemuProcessUpdateGuestCPU(virDomainDefPtr def,
/* custom CPUs in TCG mode don't need to be compared to host CPU */
if (def->virtType != VIR_DOMAIN_VIRT_QEMU ||
def->cpu->mode != VIR_CPU_MODE_CUSTOM) {
- if (virCPUCompare(caps->host.arch, virQEMUCapsGetHostModel(qemuCaps),
+ if (virCPUCompare(caps->host.arch,
+ virQEMUCapsGetHostModel(qemuCaps, def->virtType),
def->cpu, true) < 0)
return -1;
}
if (virCPUUpdate(def->os.arch, def->cpu,
- virQEMUCapsGetHostModel(qemuCaps)) < 0)
+ virQEMUCapsGetHostModel(qemuCaps, def->virtType)) < 0)
goto cleanup;
if (virQEMUCapsGetCPUDefinitions(qemuCaps, def->virtType,
diff --git a/tests/qemucapabilitiesdata/caps_2.8.0.s390x.replies
b/tests/qemucapabilitiesdata/caps_2.8.0.s390x.replies
index 0405d5d7b..c3cbeee0a 100644
--- a/tests/qemucapabilitiesdata/caps_2.8.0.s390x.replies
+++ b/tests/qemucapabilitiesdata/caps_2.8.0.s390x.replies
@@ -13378,3 +13378,11 @@
],
"id": "libvirt-2"
}
+
+{
+ "id": "libvirt-3",
+ "error": {
+ "class": "GenericError",
+ "desc": "The CPU definition 'max' is unknown."
+ }
+}
diff --git a/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml
b/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml
index 1f652bdc2..df7eb18f6 100644
--- a/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml
+++ b/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml
@@ -133,7 +133,7 @@
<kvmVersion>0</kvmVersion>
<package></package>
<arch>s390x</arch>
- <hostCPU model='zEC12.2-base'>
+ <hostCPU type='kvm' model='zEC12.2-base'>
<property name='aefsi' boolean='yes'/>
<property name='msa5' boolean='yes'/>
<property name='msa4' boolean='yes'/>
diff --git a/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.replies
b/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.replies
index 8d54788df..390f40f9f 100644
--- a/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.replies
+++ b/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.replies
@@ -14708,3 +14708,182 @@
],
"id": "libvirt-2"
}
+
+{
+ "return": {
+ "model": {
+ "name": "base",
+ "props": {
+ "cmov": true,
+ "ia64": false,
+ "aes": true,
+ "mmx": true,
+ "rdpid": false,
+ "arat": true,
+ "pause-filter": false,
+ "xsavec": false,
+ "osxsave": false,
+ "kvm-asyncpf": false,
+ "perfctr-core": false,
+ "mpx": true,
+ "pbe": false,
+ "avx512cd": false,
+ "decodeassists": false,
+ "sse4.1": true,
+ "family": 6,
+ "avx512f": false,
+ "msr": true,
+ "mce": true,
+ "mca": true,
+ "xcrypt": false,
+ "min-level": 13,
+ "xgetbv1": true,
+ "cid": false,
+ "ds": false,
+ "fxsr": true,
+ "xsaveopt": true,
+ "xtpr": false,
+ "avx512vl": false,
+ "avx512-vpopcntdq": false,
+ "phe": false,
+ "extapic": false,
+ "3dnowprefetch": false,
+ "cr8legacy": true,
+ "xcrypt-en": false,
+ "pn": false,
+ "dca": false,
+ "vendor": "AuthenticAMD",
+ "pku": true,
+ "smx": false,
+ "cmp-legacy": false,
+ "avx512-4fmaps": false,
+ "vmcb-clean": false,
+ "hle": false,
+ "3dnowext": true,
+ "npt": false,
+ "clwb": true,
+ "lbrv": false,
+ "adx": true,
+ "ss": true,
+ "pni": true,
+ "svm-lock": false,
+ "smep": true,
+ "smap": true,
+ "pfthreshold": false,
+ "x2apic": false,
+ "avx512vbmi": false,
+ "flushbyasid": false,
+ "f16c": false,
+ "ace2-en": false,
+ "pae": true,
+ "pat": true,
+ "sse": true,
+ "phe-en": false,
+ "kvm-nopiodelay": false,
+ "tm": false,
+ "kvmclock-stable-bit": false,
+ "hypervisor": true,
+ "pcommit": true,
+ "syscall": true,
+ "avx512dq": false,
+ "svm": true,
+ "invtsc": false,
+ "sse2": true,
+ "est": false,
+ "avx512ifma": false,
+ "tm2": false,
+ "kvm-pv-eoi": false,
+ "cx8": true,
+ "kvm-mmu": false,
+ "sse4.2": true,
+ "pge": true,
+ "pdcm": false,
+ "model": 6,
+ "movbe": true,
+ "nrip-save": false,
+ "ssse3": true,
+ "sse4a": true,
+ "invpcid": false,
+ "pdpe1gb": true,
+ "tsc-deadline": false,
+ "fma": false,
+ "cx16": true,
+ "de": true,
+ "stepping": 3,
+ "xsave": true,
+ "clflush": true,
+ "skinit": false,
+ "tsc": true,
+ "tce": false,
+ "fpu": true,
+ "ds-cpl": false,
+ "ibs": false,
+ "fma4": false,
+ "la57": true,
+ "osvw": false,
+ "apic": true,
+ "pmm": false,
+ "tsc-adjust": false,
+ "kvm-steal-time": false,
+ "kvmclock": false,
+ "lwp": false,
+ "xop": false,
+ "avx": false,
+ "ospke": true,
+ "acpi": true,
+ "avx512bw": false,
+ "ace2": false,
+ "fsgsbase": true,
+ "ht": false,
+ "nx": true,
+ "pclmulqdq": true,
+ "mmxext": true,
+ "popcnt": true,
+ "xsaves": false,
+ "lm": true,
+ "umip": false,
+ "pse": true,
+ "avx2": false,
+ "sep": true,
+ "nodeid-msr": false,
+ "misalignsse": false,
+ "min-xlevel": 2147483658,
+ "bmi1": true,
+ "bmi2": true,
+ "kvm-pv-unhalt": false,
+ "tsc-scale": false,
+ "topoext": false,
+ "clflushopt": true,
+ "monitor": true,
+ "avx512er": false,
+ "pmm-en": false,
+ "pcid": false,
+ "3dnow": true,
+ "erms": true,
+ "lahf-lm": true,
+ "fxsr-opt": false,
+ "xstore": false,
+ "rtm": false,
+ "lmce": false,
+ "perfctr-nb": false,
+ "rdrand": false,
+ "rdseed": false,
+ "avx512-4vnniw": false,
+ "vme": false,
+ "vmx": false,
+ "dtes64": false,
+ "mtrr": true,
+ "rdtscp": true,
+ "pse36": true,
+ "tbm": false,
+ "wdt": false,
+ "model-id": "QEMU TCG CPU version 2.5+",
+ "sha-ni": false,
+ "abm": true,
+ "avx512pf": false,
+ "xstore-en": false
+ }
+ }
+ },
+ "id": "libvirt-3"
+}
diff --git a/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
b/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
index 32368e648..520bf80f4 100644
--- a/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
@@ -205,7 +205,7 @@
<kvmVersion>0</kvmVersion>
<package> (v2.8.0-877-g38e4b757b4)</package>
<arch>x86_64</arch>
- <hostCPU model='base'>
+ <hostCPU type='kvm' model='base'>
<property name='cmov' boolean='yes'/>
<property name='ia64' boolean='no'/>
<property name='aes' boolean='yes'/>
@@ -375,6 +375,176 @@
<property name='avx512pf' boolean='no'/>
<property name='xstore-en' boolean='no'/>
</hostCPU>
+ <hostCPU type='tcg' model='base'>
+ <property name='cmov' boolean='yes'/>
+ <property name='ia64' boolean='no'/>
+ <property name='aes' boolean='yes'/>
+ <property name='mmx' boolean='yes'/>
+ <property name='rdpid' boolean='no'/>
+ <property name='arat' boolean='yes'/>
+ <property name='pause-filter' boolean='no'/>
+ <property name='xsavec' boolean='no'/>
+ <property name='osxsave' boolean='no'/>
+ <property name='kvm-asyncpf' boolean='no'/>
+ <property name='perfctr-core' boolean='no'/>
+ <property name='mpx' boolean='yes'/>
+ <property name='pbe' boolean='no'/>
+ <property name='avx512cd' boolean='no'/>
+ <property name='decodeassists' boolean='no'/>
+ <property name='sse4.1' boolean='yes'/>
+ <property name='family' ull='6'/>
+ <property name='avx512f' boolean='no'/>
+ <property name='msr' boolean='yes'/>
+ <property name='mce' boolean='yes'/>
+ <property name='mca' boolean='yes'/>
+ <property name='xcrypt' boolean='no'/>
+ <property name='min-level' ull='13'/>
+ <property name='xgetbv1' boolean='yes'/>
+ <property name='cid' boolean='no'/>
+ <property name='ds' boolean='no'/>
+ <property name='fxsr' boolean='yes'/>
+ <property name='xsaveopt' boolean='yes'/>
+ <property name='xtpr' boolean='no'/>
+ <property name='avx512vl' boolean='no'/>
+ <property name='avx512-vpopcntdq' boolean='no'/>
+ <property name='phe' boolean='no'/>
+ <property name='extapic' boolean='no'/>
+ <property name='3dnowprefetch' boolean='no'/>
+ <property name='cr8legacy' boolean='yes'/>
+ <property name='xcrypt-en' boolean='no'/>
+ <property name='pn' boolean='no'/>
+ <property name='dca' boolean='no'/>
+ <property name='vendor' string='AuthenticAMD'/>
+ <property name='pku' boolean='yes'/>
+ <property name='smx' boolean='no'/>
+ <property name='cmp-legacy' boolean='no'/>
+ <property name='avx512-4fmaps' boolean='no'/>
+ <property name='vmcb-clean' boolean='no'/>
+ <property name='hle' boolean='no'/>
+ <property name='3dnowext' boolean='yes'/>
+ <property name='npt' boolean='no'/>
+ <property name='clwb' boolean='yes'/>
+ <property name='lbrv' boolean='no'/>
+ <property name='adx' boolean='yes'/>
+ <property name='ss' boolean='yes'/>
+ <property name='pni' boolean='yes'/>
+ <property name='svm-lock' boolean='no'/>
+ <property name='smep' boolean='yes'/>
+ <property name='smap' boolean='yes'/>
+ <property name='pfthreshold' boolean='no'/>
+ <property name='x2apic' boolean='no'/>
+ <property name='avx512vbmi' boolean='no'/>
+ <property name='flushbyasid' boolean='no'/>
+ <property name='f16c' boolean='no'/>
+ <property name='ace2-en' boolean='no'/>
+ <property name='pae' boolean='yes'/>
+ <property name='pat' boolean='yes'/>
+ <property name='sse' boolean='yes'/>
+ <property name='phe-en' boolean='no'/>
+ <property name='kvm-nopiodelay' boolean='no'/>
+ <property name='tm' boolean='no'/>
+ <property name='kvmclock-stable-bit' boolean='no'/>
+ <property name='hypervisor' boolean='yes'/>
+ <property name='pcommit' boolean='yes'/>
+ <property name='syscall' boolean='yes'/>
+ <property name='avx512dq' boolean='no'/>
+ <property name='svm' boolean='yes'/>
+ <property name='invtsc' boolean='no'/>
+ <property name='sse2' boolean='yes'/>
+ <property name='est' boolean='no'/>
+ <property name='avx512ifma' boolean='no'/>
+ <property name='tm2' boolean='no'/>
+ <property name='kvm-pv-eoi' boolean='no'/>
+ <property name='cx8' boolean='yes'/>
+ <property name='kvm-mmu' boolean='no'/>
+ <property name='sse4.2' boolean='yes'/>
+ <property name='pge' boolean='yes'/>
+ <property name='pdcm' boolean='no'/>
+ <property name='model' ull='6'/>
+ <property name='movbe' boolean='yes'/>
+ <property name='nrip-save' boolean='no'/>
+ <property name='ssse3' boolean='yes'/>
+ <property name='sse4a' boolean='yes'/>
+ <property name='invpcid' boolean='no'/>
+ <property name='pdpe1gb' boolean='yes'/>
+ <property name='tsc-deadline' boolean='no'/>
+ <property name='fma' boolean='no'/>
+ <property name='cx16' boolean='yes'/>
+ <property name='de' boolean='yes'/>
+ <property name='stepping' ull='3'/>
+ <property name='xsave' boolean='yes'/>
+ <property name='clflush' boolean='yes'/>
+ <property name='skinit' boolean='no'/>
+ <property name='tsc' boolean='yes'/>
+ <property name='tce' boolean='no'/>
+ <property name='fpu' boolean='yes'/>
+ <property name='ds-cpl' boolean='no'/>
+ <property name='ibs' boolean='no'/>
+ <property name='fma4' boolean='no'/>
+ <property name='la57' boolean='yes'/>
+ <property name='osvw' boolean='no'/>
+ <property name='apic' boolean='yes'/>
+ <property name='pmm' boolean='no'/>
+ <property name='tsc-adjust' boolean='no'/>
+ <property name='kvm-steal-time' boolean='no'/>
+ <property name='kvmclock' boolean='no'/>
+ <property name='lwp' boolean='no'/>
+ <property name='xop' boolean='no'/>
+ <property name='avx' boolean='no'/>
+ <property name='ospke' boolean='yes'/>
+ <property name='acpi' boolean='yes'/>
+ <property name='avx512bw' boolean='no'/>
+ <property name='ace2' boolean='no'/>
+ <property name='fsgsbase' boolean='yes'/>
+ <property name='ht' boolean='no'/>
+ <property name='nx' boolean='yes'/>
+ <property name='pclmulqdq' boolean='yes'/>
+ <property name='mmxext' boolean='yes'/>
+ <property name='popcnt' boolean='yes'/>
+ <property name='xsaves' boolean='no'/>
+ <property name='lm' boolean='yes'/>
+ <property name='umip' boolean='no'/>
+ <property name='pse' boolean='yes'/>
+ <property name='avx2' boolean='no'/>
+ <property name='sep' boolean='yes'/>
+ <property name='nodeid-msr' boolean='no'/>
+ <property name='misalignsse' boolean='no'/>
+ <property name='min-xlevel' ull='2147483658'/>
+ <property name='bmi1' boolean='yes'/>
+ <property name='bmi2' boolean='yes'/>
+ <property name='kvm-pv-unhalt' boolean='no'/>
+ <property name='tsc-scale' boolean='no'/>
+ <property name='topoext' boolean='no'/>
+ <property name='clflushopt' boolean='yes'/>
+ <property name='monitor' boolean='yes'/>
+ <property name='avx512er' boolean='no'/>
+ <property name='pmm-en' boolean='no'/>
+ <property name='pcid' boolean='no'/>
+ <property name='3dnow' boolean='yes'/>
+ <property name='erms' boolean='yes'/>
+ <property name='lahf-lm' boolean='yes'/>
+ <property name='fxsr-opt' boolean='no'/>
+ <property name='xstore' boolean='no'/>
+ <property name='rtm' boolean='no'/>
+ <property name='lmce' boolean='no'/>
+ <property name='perfctr-nb' boolean='no'/>
+ <property name='rdrand' boolean='no'/>
+ <property name='rdseed' boolean='no'/>
+ <property name='avx512-4vnniw' boolean='no'/>
+ <property name='vme' boolean='no'/>
+ <property name='vmx' boolean='no'/>
+ <property name='dtes64' boolean='no'/>
+ <property name='mtrr' boolean='yes'/>
+ <property name='rdtscp' boolean='yes'/>
+ <property name='pse36' boolean='yes'/>
+ <property name='tbm' boolean='no'/>
+ <property name='wdt' boolean='no'/>
+ <property name='model-id' string='QEMU TCG CPU version 2.5+'/>
+ <property name='sha-ni' boolean='no'/>
+ <property name='abm' boolean='yes'/>
+ <property name='avx512pf' boolean='no'/>
+ <property name='xstore-en' boolean='no'/>
+ </hostCPU>
<cpu type='kvm' name='max' usable='yes'/>
<cpu type='kvm' name='host' usable='yes'/>
<cpu type='kvm' name='base' usable='yes'/>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index faa99c64c..5ba2eeab9 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -384,7 +384,8 @@ testUpdateQEMUCaps(const struct testInfo *info,
if (testAddCPUModels(info->qemuCaps, info->skipLegacyCPUs) < 0)
goto cleanup;
- virQEMUCapsInitHostCPUModel(info->qemuCaps, caps);
+ virQEMUCapsInitHostCPUModel(info->qemuCaps, caps, VIR_DOMAIN_VIRT_KVM);
+ virQEMUCapsInitHostCPUModel(info->qemuCaps, caps, VIR_DOMAIN_VIRT_QEMU);
virQEMUCapsFilterByMachineType(info->qemuCaps, vm->def->os.machine);
--
2.11.1