render / rpms / libvirt

Forked from rpms/libvirt 7 months ago
Clone
404507
From 94ea163b2853d51a3037e8f8ee664058ae7c541d Mon Sep 17 00:00:00 2001
404507
Message-Id: <94ea163b2853d51a3037e8f8ee664058ae7c541d@dist-git>
4cd28d
From: Paolo Bonzini <pbonzini@redhat.com>
4cd28d
Date: Tue, 12 Dec 2017 16:23:41 +0100
4cd28d
Subject: [PATCH] qemu: capabilities: force update if the microcode version
4cd28d
 does not match
4cd28d
4cd28d
A microcode update can cause the CPUID bits to change; an example
4cd28d
from the past was the update that disabled TSX on several Haswell
4cd28d
and Broadwell machines.
4cd28d
4cd28d
Therefore, place microcode version in the virQEMUCaps struct and
4cd28d
XML, and rebuild the cache if the versions do not match.
4cd28d
4cd28d
CVE-2017-5715
4cd28d
4cd28d
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
4cd28d
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
4cd28d
4cd28d
Conflicts:
4cd28d
	tests/qemucapabilitiesdata/caps_2.10.0-gicv2.aarch64.xml
4cd28d
	tests/qemucapabilitiesdata/caps_2.10.0-gicv3.aarch64.xml
404507
            - missing in 7.5
4cd28d
---
404507
 src/qemu/qemu_capabilities.c                       | 40 +++++++++++++++++++++-
404507
 src/qemu/qemu_capabilities.h                       |  6 ++--
404507
 src/qemu/qemu_capspriv.h                           |  5 +++
404507
 src/qemu/qemu_driver.c                             |  9 ++++-
4cd28d
 tests/qemucapabilitiesdata/caps_1.2.2.x86_64.xml   |  1 +
4cd28d
 tests/qemucapabilitiesdata/caps_1.3.1.x86_64.xml   |  1 +
4cd28d
 tests/qemucapabilitiesdata/caps_1.4.2.x86_64.xml   |  1 +
4cd28d
 tests/qemucapabilitiesdata/caps_1.5.3.x86_64.xml   |  1 +
4cd28d
 tests/qemucapabilitiesdata/caps_1.6.0.x86_64.xml   |  1 +
4cd28d
 tests/qemucapabilitiesdata/caps_1.7.0.x86_64.xml   |  1 +
4cd28d
 tests/qemucapabilitiesdata/caps_2.1.1.x86_64.xml   |  1 +
404507
 tests/qemucapabilitiesdata/caps_2.10.0.ppc64.xml   |  1 +
404507
 tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml   |  1 +
404507
 tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml  |  1 +
4cd28d
 tests/qemucapabilitiesdata/caps_2.4.0.x86_64.xml   |  1 +
4cd28d
 tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml   |  1 +
4cd28d
 .../caps_2.6.0-gicv2.aarch64.xml                   |  1 +
4cd28d
 .../caps_2.6.0-gicv3.aarch64.xml                   |  1 +
404507
 tests/qemucapabilitiesdata/caps_2.6.0.ppc64.xml    |  1 +
4cd28d
 tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml   |  1 +
4cd28d
 tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml    |  1 +
4cd28d
 tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml   |  1 +
4cd28d
 tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml    |  1 +
4cd28d
 tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml   |  1 +
404507
 tests/qemucapabilitiesdata/caps_2.9.0.ppc64.xml    |  1 +
404507
 tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml    |  1 +
4cd28d
 tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml   |  1 +
404507
 tests/qemucapabilitiestest.c                       | 14 +++++---
4cd28d
 tests/qemucapsprobe.c                              |  2 +-
4cd28d
 tests/testutilsqemu.c                              |  2 +-
404507
 30 files changed, 91 insertions(+), 10 deletions(-)
4cd28d
4cd28d
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
404507
index 165fdbc5ea..09323d2580 100644
4cd28d
--- a/src/qemu/qemu_capabilities.c
4cd28d
+++ b/src/qemu/qemu_capabilities.c
404507
@@ -507,6 +507,7 @@ struct _virQEMUCaps {
4cd28d
     unsigned int version;
4cd28d
     unsigned int kvmVersion;
404507
     unsigned int libvirtVersion;
4cd28d
+    unsigned int microcodeVersion;
4cd28d
     char *package;
4cd28d
 
4cd28d
     virArch arch;
404507
@@ -2296,6 +2297,7 @@ virQEMUCapsPtr virQEMUCapsNewCopy(virQEMUCapsPtr qemuCaps)
4cd28d
 
4cd28d
     ret->version = qemuCaps->version;
4cd28d
     ret->kvmVersion = qemuCaps->kvmVersion;
4cd28d
+    ret->microcodeVersion = qemuCaps->microcodeVersion;
4cd28d
 
4cd28d
     if (VIR_STRDUP(ret->package, qemuCaps->package) < 0)
4cd28d
         goto error;
404507
@@ -3819,6 +3821,7 @@ struct _virQEMUCapsCachePriv {
404507
     uid_t runUid;
404507
     gid_t runGid;
404507
     virArch hostArch;
404507
+    unsigned int microcodeVersion;
404507
 };
404507
 typedef struct _virQEMUCapsCachePriv virQEMUCapsCachePriv;
404507
 typedef virQEMUCapsCachePriv *virQEMUCapsCachePrivPtr;
404507
@@ -3941,6 +3944,13 @@ virQEMUCapsLoadCache(virArch hostArch,
4cd28d
         goto cleanup;
4cd28d
     }
4cd28d
 
4cd28d
+    if (virXPathUInt("string(./microcodeVersion)", ctxt,
4cd28d
+                     &qemuCaps->microcodeVersion) < 0) {
4cd28d
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
4cd28d
+                       _("missing microcode version in QEMU capabilities cache"));
4cd28d
+        goto cleanup;
4cd28d
+    }
4cd28d
+
4cd28d
     if (virXPathBoolean("boolean(./package)", ctxt) > 0) {
4cd28d
         qemuCaps->package = virXPathString("string(./package)", ctxt);
4cd28d
         if (!qemuCaps->package &&
404507
@@ -4219,6 +4229,9 @@ virQEMUCapsFormatCache(virQEMUCapsPtr qemuCaps)
4cd28d
     virBufferAsprintf(&buf, "<kvmVersion>%d</kvmVersion>\n",
4cd28d
                       qemuCaps->kvmVersion);
4cd28d
 
4cd28d
+    virBufferAsprintf(&buf, "<microcodeVersion>%u</microcodeVersion>\n",
4cd28d
+                      qemuCaps->microcodeVersion);
4cd28d
+
4cd28d
     if (qemuCaps->package)
4cd28d
         virBufferAsprintf(&buf, "<package>%s</package>\n",
4cd28d
                           qemuCaps->package);
404507
@@ -4360,6 +4373,16 @@ virQEMUCapsIsValid(void *data,
404507
         return false;
4cd28d
     }
4cd28d
 
404507
+    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM) &&
404507
+        priv->microcodeVersion != qemuCaps->microcodeVersion) {
404507
+        VIR_DEBUG("Outdated capabilities for '%s': microcode version changed "
404507
+                  "(%u vs %u)",
404507
+                  qemuCaps->binary,
404507
+                  priv->microcodeVersion,
404507
+                  qemuCaps->microcodeVersion);
404507
+        return false;
404507
+    }
404507
+
404507
     return true;
404507
 }
4cd28d
 
404507
@@ -5189,6 +5212,7 @@ virQEMUCapsNewForBinaryInternal(virArch hostArch,
404507
                                 const char *libDir,
4cd28d
                                 uid_t runUid,
4cd28d
                                 gid_t runGid,
4cd28d
+                                unsigned int microcodeVersion,
4cd28d
                                 bool qmpOnly)
4cd28d
 {
4cd28d
     virQEMUCapsPtr qemuCaps;
404507
@@ -5245,6 +5269,9 @@ virQEMUCapsNewForBinaryInternal(virArch hostArch,
404507
     virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_KVM);
404507
     virQEMUCapsInitHostCPUModel(qemuCaps, hostArch, VIR_DOMAIN_VIRT_QEMU);
4cd28d
 
4cd28d
+    if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM))
4cd28d
+        qemuCaps->microcodeVersion = microcodeVersion;
4cd28d
+
4cd28d
  cleanup:
4cd28d
     VIR_FREE(qmperr);
4cd28d
     return qemuCaps;
404507
@@ -5266,6 +5293,7 @@ virQEMUCapsNewData(const char *binary,
404507
                                            priv->libDir,
404507
                                            priv->runUid,
404507
                                            priv->runGid,
404507
+                                           priv->microcodeVersion,
404507
                                            false);
4cd28d
 }
4cd28d
 
404507
@@ -5348,7 +5376,8 @@ virFileCachePtr
4cd28d
 virQEMUCapsCacheNew(const char *libDir,
4cd28d
                     const char *cacheDir,
4cd28d
                     uid_t runUid,
4cd28d
-                    gid_t runGid)
4cd28d
+                    gid_t runGid,
4cd28d
+                    unsigned int microcodeVersion)
4cd28d
 {
404507
     char *capsCacheDir = NULL;
404507
     virFileCachePtr cache = NULL;
404507
@@ -5371,6 +5400,7 @@ virQEMUCapsCacheNew(const char *libDir,
4cd28d
 
404507
     priv->runUid = runUid;
404507
     priv->runGid = runGid;
404507
+    priv->microcodeVersion = microcodeVersion;
4cd28d
 
404507
  cleanup:
404507
     VIR_FREE(capsCacheDir);
404507
@@ -5848,3 +5878,11 @@ virQEMUCapsFillDomainCaps(virCapsPtr caps,
4cd28d
         return -1;
4cd28d
     return 0;
4cd28d
 }
4cd28d
+
4cd28d
+
4cd28d
+void
4cd28d
+virQEMUCapsSetMicrocodeVersion(virQEMUCapsPtr qemuCaps,
4cd28d
+                               unsigned int microcodeVersion)
4cd28d
+{
4cd28d
+    qemuCaps->microcodeVersion = microcodeVersion;
4cd28d
+}
4cd28d
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
404507
index 0fb2a10a17..4b5d70fbb0 100644
4cd28d
--- a/src/qemu/qemu_capabilities.h
4cd28d
+++ b/src/qemu/qemu_capabilities.h
404507
@@ -520,8 +520,10 @@ void virQEMUCapsFilterByMachineType(virQEMUCapsPtr qemuCaps,
4cd28d
                                     const char *machineType);
4cd28d
 
404507
 virFileCachePtr virQEMUCapsCacheNew(const char *libDir,
404507
-                                        const char *cacheDir,
4cd28d
-                                        uid_t uid, gid_t gid);
404507
+                                    const char *cacheDir,
404507
+                                    uid_t uid,
404507
+                                    gid_t gid,
404507
+                                    unsigned int microcodeVersion);
404507
 virQEMUCapsPtr virQEMUCapsCacheLookup(virFileCachePtr cache,
4cd28d
                                       const char *binary);
404507
 virQEMUCapsPtr virQEMUCapsCacheLookupCopy(virFileCachePtr cache,
4cd28d
diff --git a/src/qemu/qemu_capspriv.h b/src/qemu/qemu_capspriv.h
404507
index 219daa3629..98d163b920 100644
4cd28d
--- a/src/qemu/qemu_capspriv.h
4cd28d
+++ b/src/qemu/qemu_capspriv.h
404507
@@ -36,6 +36,7 @@ virQEMUCapsNewForBinaryInternal(virArch hostArch,
404507
                                 const char *libDir,
4cd28d
                                 uid_t runUid,
4cd28d
                                 gid_t runGid,
4cd28d
+                                unsigned int microcodeVersion,
4cd28d
                                 bool qmpOnly);
4cd28d
 
404507
 int virQEMUCapsLoadCache(virArch hostArch,
404507
@@ -102,4 +103,8 @@ int
404507
 virQEMUCapsProbeQMPCPUDefinitions(virQEMUCapsPtr qemuCaps,
404507
                                   qemuMonitorPtr mon,
404507
                                   bool tcg);
4cd28d
+
4cd28d
+void
4cd28d
+virQEMUCapsSetMicrocodeVersion(virQEMUCapsPtr qemuCaps,
4cd28d
+                               unsigned int microcodeVersion);
4cd28d
 #endif
4cd28d
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
404507
index fa73fc30d6..0bc6eaa431 100644
4cd28d
--- a/src/qemu/qemu_driver.c
4cd28d
+++ b/src/qemu/qemu_driver.c
404507
@@ -633,6 +633,8 @@ qemuStateInitialize(bool privileged,
4cd28d
     char *hugepagePath = NULL;
404507
     char *memoryBackingPath = NULL;
4cd28d
     size_t i;
4cd28d
+    virCPUDefPtr hostCPU = NULL;
4cd28d
+    unsigned int microcodeVersion = 0;
4cd28d
 
4cd28d
     if (VIR_ALLOC(qemu_driver) < 0)
4cd28d
         return -1;
404507
@@ -855,10 +857,15 @@ qemuStateInitialize(bool privileged,
4cd28d
         run_gid = cfg->group;
4cd28d
     }
4cd28d
 
4cd28d
+    if ((hostCPU = virCPUProbeHost(virArchFromHost())))
4cd28d
+        microcodeVersion = hostCPU->microcodeVersion;
4cd28d
+    virCPUDefFree(hostCPU);
4cd28d
+
4cd28d
     qemu_driver->qemuCapsCache = virQEMUCapsCacheNew(cfg->libDir,
4cd28d
                                                      cfg->cacheDir,
4cd28d
                                                      run_uid,
4cd28d
-                                                     run_gid);
4cd28d
+                                                     run_gid,
4cd28d
+                                                     microcodeVersion);
4cd28d
     if (!qemu_driver->qemuCapsCache)
4cd28d
         goto error;
4cd28d
 
4cd28d
diff --git a/tests/qemucapabilitiesdata/caps_1.2.2.x86_64.xml b/tests/qemucapabilitiesdata/caps_1.2.2.x86_64.xml
404507
index d560811ab7..3001d487c6 100644
4cd28d
--- a/tests/qemucapabilitiesdata/caps_1.2.2.x86_64.xml
4cd28d
+++ b/tests/qemucapabilitiesdata/caps_1.2.2.x86_64.xml
4cd28d
@@ -112,6 +112,7 @@
404507
   <flag name='isa-serial'/>
4cd28d
   <version>1002002</version>
4cd28d
   <kvmVersion>0</kvmVersion>
4cd28d
+  <microcodeVersion>26900</microcodeVersion>
4cd28d
   <package></package>
4cd28d
   <arch>x86_64</arch>
4cd28d
   <cpu type='kvm' name='qemu64'/>
4cd28d
diff --git a/tests/qemucapabilitiesdata/caps_1.3.1.x86_64.xml b/tests/qemucapabilitiesdata/caps_1.3.1.x86_64.xml
404507
index 576475f7fa..283f30ef07 100644
4cd28d
--- a/tests/qemucapabilitiesdata/caps_1.3.1.x86_64.xml
4cd28d
+++ b/tests/qemucapabilitiesdata/caps_1.3.1.x86_64.xml
4cd28d
@@ -130,6 +130,7 @@
404507
   <flag name='isa-serial'/>
4cd28d
   <version>1003001</version>
4cd28d
   <kvmVersion>0</kvmVersion>
4cd28d
+  <microcodeVersion>30198</microcodeVersion>
4cd28d
   <package></package>
4cd28d
   <arch>x86_64</arch>
4cd28d
   <cpu type='kvm' name='qemu64'/>
4cd28d
diff --git a/tests/qemucapabilitiesdata/caps_1.4.2.x86_64.xml b/tests/qemucapabilitiesdata/caps_1.4.2.x86_64.xml
404507
index 0c271d3e41..200069ae86 100644
4cd28d
--- a/tests/qemucapabilitiesdata/caps_1.4.2.x86_64.xml
4cd28d
+++ b/tests/qemucapabilitiesdata/caps_1.4.2.x86_64.xml
4cd28d
@@ -131,6 +131,7 @@
404507
   <flag name='isa-serial'/>
4cd28d
   <version>1004002</version>
4cd28d
   <kvmVersion>0</kvmVersion>
4cd28d
+  <microcodeVersion>30915</microcodeVersion>
4cd28d
   <package></package>
4cd28d
   <arch>x86_64</arch>
4cd28d
   <cpu type='kvm' name='Opteron_G5'/>
4cd28d
diff --git a/tests/qemucapabilitiesdata/caps_1.5.3.x86_64.xml b/tests/qemucapabilitiesdata/caps_1.5.3.x86_64.xml
404507
index 5c667975bf..e02c0961cd 100644
4cd28d
--- a/tests/qemucapabilitiesdata/caps_1.5.3.x86_64.xml
4cd28d
+++ b/tests/qemucapabilitiesdata/caps_1.5.3.x86_64.xml
4cd28d
@@ -143,6 +143,7 @@
404507
   <flag name='isa-serial'/>
4cd28d
   <version>1005003</version>
4cd28d
   <kvmVersion>0</kvmVersion>
4cd28d
+  <microcodeVersion>47019</microcodeVersion>
4cd28d
   <package></package>
4cd28d
   <arch>x86_64</arch>
4cd28d
   <cpu type='kvm' name='Opteron_G5'/>
4cd28d
diff --git a/tests/qemucapabilitiesdata/caps_1.6.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_1.6.0.x86_64.xml
404507
index 8ae07a91db..e3896685e9 100644
4cd28d
--- a/tests/qemucapabilitiesdata/caps_1.6.0.x86_64.xml
4cd28d
+++ b/tests/qemucapabilitiesdata/caps_1.6.0.x86_64.xml
4cd28d
@@ -148,6 +148,7 @@
404507
   <flag name='isa-serial'/>
4cd28d
   <version>1006000</version>
4cd28d
   <kvmVersion>0</kvmVersion>
4cd28d
+  <microcodeVersion>45248</microcodeVersion>
4cd28d
   <package></package>
4cd28d
   <arch>x86_64</arch>
4cd28d
   <cpu type='kvm' name='Opteron_G5'/>
4cd28d
diff --git a/tests/qemucapabilitiesdata/caps_1.7.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_1.7.0.x86_64.xml
404507
index 34bd6be1cd..5b4d1ea661 100644
4cd28d
--- a/tests/qemucapabilitiesdata/caps_1.7.0.x86_64.xml
4cd28d
+++ b/tests/qemucapabilitiesdata/caps_1.7.0.x86_64.xml
4cd28d
@@ -150,6 +150,7 @@
404507
   <flag name='isa-serial'/>
4cd28d
   <version>1007000</version>
4cd28d
   <kvmVersion>0</kvmVersion>
4cd28d
+  <microcodeVersion>50692</microcodeVersion>
4cd28d
   <package></package>
4cd28d
   <arch>x86_64</arch>
4cd28d
   <cpu type='kvm' name='Opteron_G5'/>
4cd28d
diff --git a/tests/qemucapabilitiesdata/caps_2.1.1.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.1.1.x86_64.xml
404507
index 0d7c144ff7..200e57adac 100644
4cd28d
--- a/tests/qemucapabilitiesdata/caps_2.1.1.x86_64.xml
4cd28d
+++ b/tests/qemucapabilitiesdata/caps_2.1.1.x86_64.xml
4cd28d
@@ -166,6 +166,7 @@
404507
   <flag name='isa-serial'/>
4cd28d
   <version>2001001</version>
4cd28d
   <kvmVersion>0</kvmVersion>
4cd28d
+  <microcodeVersion>59488</microcodeVersion>
4cd28d
   <package></package>
4cd28d
   <arch>x86_64</arch>
4cd28d
   <cpu type='kvm' name='Opteron_G5'/>
404507
diff --git a/tests/qemucapabilitiesdata/caps_2.10.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_2.10.0.ppc64.xml
404507
index 09cce92067..d9ba077123 100644
404507
--- a/tests/qemucapabilitiesdata/caps_2.10.0.ppc64.xml
404507
+++ b/tests/qemucapabilitiesdata/caps_2.10.0.ppc64.xml
404507
@@ -184,6 +184,7 @@
404507
   <flag name='isa-serial'/>
404507
   <version>2010000</version>
404507
   <kvmVersion>0</kvmVersion>
404507
+  <microcodeVersion>383421</microcodeVersion>
404507
   <package> (v2.10.0)</package>
404507
   <arch>ppc64</arch>
404507
   <cpu type='kvm' name='default'/>
404507
diff --git a/tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml
404507
index 00fe1cffa7..d9cbbd8ccb 100644
404507
--- a/tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml
404507
+++ b/tests/qemucapabilitiesdata/caps_2.10.0.s390x.xml
404507
@@ -146,6 +146,7 @@
404507
   <flag name='disk-share-rw'/>
404507
   <version>2010000</version>
404507
   <kvmVersion>0</kvmVersion>
404507
+  <microcodeVersion>304153</microcodeVersion>
404507
   <package></package>
404507
   <arch>s390x</arch>
404507
   <hostCPU type='kvm' model='z14-base' migratability='no'>
404507
diff --git a/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml
404507
index 2417251678..c7b9787142 100644
404507
--- a/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml
404507
+++ b/tests/qemucapabilitiesdata/caps_2.10.0.x86_64.xml
404507
@@ -229,6 +229,7 @@
404507
   <flag name='isa-serial'/>
404507
   <version>2010000</version>
404507
   <kvmVersion>0</kvmVersion>
404507
+  <microcodeVersion>345185</microcodeVersion>
404507
   <package> (v2.10.0)</package>
404507
   <arch>x86_64</arch>
404507
   <hostCPU type='kvm' model='base' migratability='yes'>
4cd28d
diff --git a/tests/qemucapabilitiesdata/caps_2.4.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.4.0.x86_64.xml
404507
index 5007523c1f..9b315aecf4 100644
4cd28d
--- a/tests/qemucapabilitiesdata/caps_2.4.0.x86_64.xml
4cd28d
+++ b/tests/qemucapabilitiesdata/caps_2.4.0.x86_64.xml
404507
@@ -191,6 +191,7 @@
404507
   <flag name='isa-serial'/>
4cd28d
   <version>2004000</version>
4cd28d
   <kvmVersion>0</kvmVersion>
4cd28d
+  <microcodeVersion>75653</microcodeVersion>
4cd28d
   <package></package>
4cd28d
   <arch>x86_64</arch>
4cd28d
   <cpu type='kvm' name='Opteron_G5'/>
4cd28d
diff --git a/tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml
404507
index a9ad292d01..3096eadf72 100644
4cd28d
--- a/tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml
4cd28d
+++ b/tests/qemucapabilitiesdata/caps_2.5.0.x86_64.xml
404507
@@ -197,6 +197,7 @@
404507
   <flag name='isa-serial'/>
4cd28d
   <version>2005000</version>
4cd28d
   <kvmVersion>0</kvmVersion>
4cd28d
+  <microcodeVersion>216775</microcodeVersion>
4cd28d
   <package></package>
4cd28d
   <arch>x86_64</arch>
4cd28d
   <cpu type='kvm' name='Opteron_G5'/>
4cd28d
diff --git a/tests/qemucapabilitiesdata/caps_2.6.0-gicv2.aarch64.xml b/tests/qemucapabilitiesdata/caps_2.6.0-gicv2.aarch64.xml
404507
index d3e2e18faa..4cdd894a97 100644
4cd28d
--- a/tests/qemucapabilitiesdata/caps_2.6.0-gicv2.aarch64.xml
4cd28d
+++ b/tests/qemucapabilitiesdata/caps_2.6.0-gicv2.aarch64.xml
404507
@@ -176,6 +176,7 @@
404507
   <flag name='pl011'/>
4cd28d
   <version>2006000</version>
4cd28d
   <kvmVersion>0</kvmVersion>
4cd28d
+  <microcodeVersion>228838</microcodeVersion>
4cd28d
   <package></package>
4cd28d
   <arch>aarch64</arch>
4cd28d
   <cpu type='kvm' name='pxa262'/>
4cd28d
diff --git a/tests/qemucapabilitiesdata/caps_2.6.0-gicv3.aarch64.xml b/tests/qemucapabilitiesdata/caps_2.6.0-gicv3.aarch64.xml
404507
index bc86d03537..5655af7d3d 100644
4cd28d
--- a/tests/qemucapabilitiesdata/caps_2.6.0-gicv3.aarch64.xml
4cd28d
+++ b/tests/qemucapabilitiesdata/caps_2.6.0-gicv3.aarch64.xml
404507
@@ -176,6 +176,7 @@
404507
   <flag name='pl011'/>
4cd28d
   <version>2006000</version>
4cd28d
   <kvmVersion>0</kvmVersion>
4cd28d
+  <microcodeVersion>228838</microcodeVersion>
4cd28d
   <package></package>
4cd28d
   <arch>aarch64</arch>
4cd28d
   <cpu type='kvm' name='pxa262'/>
404507
diff --git a/tests/qemucapabilitiesdata/caps_2.6.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_2.6.0.ppc64.xml
404507
index 27d99bd937..31701bb40b 100644
404507
--- a/tests/qemucapabilitiesdata/caps_2.6.0.ppc64.xml
404507
+++ b/tests/qemucapabilitiesdata/caps_2.6.0.ppc64.xml
404507
@@ -171,6 +171,7 @@
404507
   <flag name='isa-serial'/>
4cd28d
   <version>2006000</version>
4cd28d
   <kvmVersion>0</kvmVersion>
404507
+  <microcodeVersion>263602</microcodeVersion>
4cd28d
   <package></package>
4cd28d
   <arch>ppc64</arch>
4cd28d
   <cpu type='kvm' name='default'/>
4cd28d
diff --git a/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml
404507
index 97621612ab..6ae19ffd36 100644
4cd28d
--- a/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml
4cd28d
+++ b/tests/qemucapabilitiesdata/caps_2.6.0.x86_64.xml
404507
@@ -207,6 +207,7 @@
404507
   <flag name='isa-serial'/>
4cd28d
   <version>2006000</version>
4cd28d
   <kvmVersion>0</kvmVersion>
4cd28d
+  <microcodeVersion>227579</microcodeVersion>
4cd28d
   <package></package>
4cd28d
   <arch>x86_64</arch>
4cd28d
   <cpu type='kvm' name='Opteron_G5'/>
4cd28d
diff --git a/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml
404507
index c2f310cd46..b6ec680d5c 100644
4cd28d
--- a/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml
4cd28d
+++ b/tests/qemucapabilitiesdata/caps_2.7.0.s390x.xml
404507
@@ -138,6 +138,7 @@
404507
   <flag name='sclplmconsole'/>
4cd28d
   <version>2007000</version>
4cd28d
   <kvmVersion>0</kvmVersion>
4cd28d
+  <microcodeVersion>217559</microcodeVersion>
4cd28d
   <package></package>
4cd28d
   <arch>s390x</arch>
4cd28d
   <cpu type='kvm' name='host'/>
4cd28d
diff --git a/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml
404507
index e4ea9452c5..294ac126e5 100644
4cd28d
--- a/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml
4cd28d
+++ b/tests/qemucapabilitiesdata/caps_2.7.0.x86_64.xml
404507
@@ -211,6 +211,7 @@
404507
   <flag name='isa-serial'/>
4cd28d
   <version>2007000</version>
4cd28d
   <kvmVersion>0</kvmVersion>
4cd28d
+  <microcodeVersion>239276</microcodeVersion>
4cd28d
   <package> (v2.7.0)</package>
4cd28d
   <arch>x86_64</arch>
4cd28d
   <cpu type='kvm' name='Opteron_G5'/>
4cd28d
diff --git a/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml
404507
index f6e024dc61..d788ad206e 100644
4cd28d
--- a/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml
4cd28d
+++ b/tests/qemucapabilitiesdata/caps_2.8.0.s390x.xml
404507
@@ -140,6 +140,7 @@
404507
   <flag name='sclplmconsole'/>
4cd28d
   <version>2007093</version>
4cd28d
   <kvmVersion>0</kvmVersion>
4cd28d
+  <microcodeVersion>242460</microcodeVersion>
4cd28d
   <package></package>
4cd28d
   <arch>s390x</arch>
4cd28d
   <hostCPU type='kvm' model='zEC12.2-base' migratability='no'>
4cd28d
diff --git a/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml
404507
index c6d3e21d5c..156563d99a 100644
4cd28d
--- a/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml
4cd28d
+++ b/tests/qemucapabilitiesdata/caps_2.8.0.x86_64.xml
404507
@@ -213,6 +213,7 @@
404507
   <flag name='isa-serial'/>
4cd28d
   <version>2008000</version>
4cd28d
   <kvmVersion>0</kvmVersion>
4cd28d
+  <microcodeVersion>255931</microcodeVersion>
4cd28d
   <package> (v2.8.0)</package>
4cd28d
   <arch>x86_64</arch>
4cd28d
   <cpu type='kvm' name='host' usable='yes'/>
404507
diff --git a/tests/qemucapabilitiesdata/caps_2.9.0.ppc64.xml b/tests/qemucapabilitiesdata/caps_2.9.0.ppc64.xml
404507
index f5cf0ba932..aa0c833a0c 100644
404507
--- a/tests/qemucapabilitiesdata/caps_2.9.0.ppc64.xml
404507
+++ b/tests/qemucapabilitiesdata/caps_2.9.0.ppc64.xml
404507
@@ -178,6 +178,7 @@
404507
   <flag name='isa-serial'/>
404507
   <version>2009000</version>
404507
   <kvmVersion>0</kvmVersion>
404507
+  <microcodeVersion>347135</microcodeVersion>
404507
   <package> (v2.9.0)</package>
404507
   <arch>ppc64</arch>
404507
   <cpu type='kvm' name='default'/>
404507
diff --git a/tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml b/tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml
404507
index 5c4a02c8b1..ba809b6ae3 100644
404507
--- a/tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml
404507
+++ b/tests/qemucapabilitiesdata/caps_2.9.0.s390x.xml
404507
@@ -142,6 +142,7 @@
404507
   <flag name='disk-share-rw'/>
404507
   <version>2009000</version>
404507
   <kvmVersion>0</kvmVersion>
404507
+  <microcodeVersion>265878</microcodeVersion>
404507
   <package></package>
404507
   <arch>s390x</arch>
404507
   <hostCPU type='kvm' model='z13.2-base' migratability='no'>
4cd28d
diff --git a/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml b/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
404507
index 82cc4e79f4..11f2508a04 100644
4cd28d
--- a/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
4cd28d
+++ b/tests/qemucapabilitiesdata/caps_2.9.0.x86_64.xml
404507
@@ -225,6 +225,7 @@
404507
   <flag name='isa-serial'/>
404507
   <version>2009000</version>
4cd28d
   <kvmVersion>0</kvmVersion>
404507
+  <microcodeVersion>321194</microcodeVersion>
404507
   <package> (v2.9.0)</package>
4cd28d
   <arch>x86_64</arch>
4cd28d
   <hostCPU type='kvm' model='base' migratability='yes'>
4cd28d
diff --git a/tests/qemucapabilitiestest.c b/tests/qemucapabilitiestest.c
404507
index 6e39866ebe..44b3b1fda5 100644
4cd28d
--- a/tests/qemucapabilitiestest.c
4cd28d
+++ b/tests/qemucapabilitiestest.c
4cd28d
@@ -61,10 +61,16 @@ testQemuCaps(const void *opaque)
4cd28d
                                   qemuMonitorTestGetMonitor(mon)) < 0)
4cd28d
         goto cleanup;
4cd28d
 
4cd28d
-    if (virQEMUCapsGet(capsActual, QEMU_CAPS_KVM) &&
4cd28d
-        virQEMUCapsInitQMPMonitorTCG(capsActual,
4cd28d
-                                     qemuMonitorTestGetMonitor(mon)) < 0)
4cd28d
-        goto cleanup;
4cd28d
+    if (virQEMUCapsGet(capsActual, QEMU_CAPS_KVM)) {
4cd28d
+        if (virQEMUCapsInitQMPMonitorTCG(capsActual,
4cd28d
+                                         qemuMonitorTestGetMonitor(mon)) < 0)
4cd28d
+            goto cleanup;
4cd28d
+
4cd28d
+        /* Fill microcodeVersion with a "random" value which is the file
4cd28d
+         * length to provide a reproducible number for testing.
4cd28d
+         */
4cd28d
+        virQEMUCapsSetMicrocodeVersion(capsActual, virFileLength(repliesFile, -1));
4cd28d
+    }
4cd28d
 
404507
     if (!(actual = virQEMUCapsFormatCache(capsActual)))
4cd28d
         goto cleanup;
4cd28d
diff --git a/tests/qemucapsprobe.c b/tests/qemucapsprobe.c
404507
index 4b8d6229b4..a5f5a38b16 100644
4cd28d
--- a/tests/qemucapsprobe.c
4cd28d
+++ b/tests/qemucapsprobe.c
404507
@@ -72,7 +72,7 @@ main(int argc, char **argv)
4cd28d
         return EXIT_FAILURE;
4cd28d
 
404507
     if (!(caps = virQEMUCapsNewForBinaryInternal(VIR_ARCH_NONE, argv[1], "/tmp",
4cd28d
-                                                 -1, -1, true)))
4cd28d
+                                                 -1, -1, 0, true)))
4cd28d
         return EXIT_FAILURE;
4cd28d
 
4cd28d
     virObjectUnref(caps);
4cd28d
diff --git a/tests/testutilsqemu.c b/tests/testutilsqemu.c
404507
index 2c7124bf26..f8182033fc 100644
4cd28d
--- a/tests/testutilsqemu.c
4cd28d
+++ b/tests/testutilsqemu.c
404507
@@ -603,7 +603,7 @@ int qemuTestDriverInit(virQEMUDriver *driver)
4cd28d
 
4cd28d
     /* Using /dev/null for libDir and cacheDir automatically produces errors
4cd28d
      * upon attempt to use any of them */
4cd28d
-    driver->qemuCapsCache = virQEMUCapsCacheNew("/dev/null", "/dev/null", 0, 0);
4cd28d
+    driver->qemuCapsCache = virQEMUCapsCacheNew("/dev/null", "/dev/null", 0, 0, 0);
4cd28d
     if (!driver->qemuCapsCache)
4cd28d
         goto error;
4cd28d
 
4cd28d
-- 
4cd28d
2.15.1
4cd28d