diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index e4fdd9a1eb..b2d5242264 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -725,6 +725,7 @@ struct _virQEMUCaps {
char *kernelVersion;
virArch arch;
+ virCPUData *cpuData;
size_t ngicCapabilities;
virGICCapability *gicCapabilities;
@@ -1965,6 +1966,7 @@ virQEMUCaps *virQEMUCapsNewCopy(virQEMUCaps *qemuCaps)
ret->kernelVersion = g_strdup(qemuCaps->kernelVersion);
ret->arch = qemuCaps->arch;
+ ret->cpuData = virCPUDataNewCopy(qemuCaps->cpuData);
if (virQEMUCapsAccelCopy(&ret->kvm, &qemuCaps->kvm) < 0 ||
virQEMUCapsAccelCopy(&ret->tcg, &qemuCaps->tcg) < 0)
@@ -2015,6 +2017,8 @@ void virQEMUCapsDispose(void *obj)
g_free(qemuCaps->gicCapabilities);
+ virCPUDataFree(qemuCaps->cpuData);
+
virSEVCapabilitiesFree(qemuCaps->sevCapabilities);
virQEMUCapsAccelClear(&qemuCaps->kvm);
@@ -4260,6 +4264,12 @@ virQEMUCapsLoadCache(virArch hostArch,
}
VIR_FREE(str);
+ if (virXPathBoolean("boolean(./cpudata)", ctxt) > 0) {
+ qemuCaps->cpuData = virCPUDataParseNode(virXPathNode("./cpudata", ctxt));
+ if (!qemuCaps->cpuData)
+ goto cleanup;
+ }
+
if (virQEMUCapsLoadAccel(qemuCaps, ctxt, VIR_DOMAIN_VIRT_KVM) < 0 ||
virQEMUCapsLoadAccel(qemuCaps, ctxt, VIR_DOMAIN_VIRT_QEMU) < 0)
goto cleanup;
@@ -4561,6 +4571,11 @@ virQEMUCapsFormatCache(virQEMUCaps *qemuCaps)
virBufferAsprintf(&buf, "%s\n",
qemuCaps->kernelVersion);
+ if (qemuCaps->cpuData) {
+ g_autofree char * cpudata = virCPUDataFormat(qemuCaps->cpuData);
+ virBufferAsprintf(&buf, "%s", cpudata);
+ }
+
virBufferAsprintf(&buf, "%s\n",
virArchToString(qemuCaps->arch));
@@ -5418,6 +5433,7 @@ virQEMUCapsNewForBinaryInternal(virArch hostArch,
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM)) {
qemuCaps->hostCPUSignature = g_strdup(hostCPUSignature);
qemuCaps->microcodeVersion = microcodeVersion;
+ qemuCaps->cpuData = NULL;
qemuCaps->kernelVersion = g_strdup(kernelVersion);