From: Jiri Denemark <[email protected]>

We will need to generate the capabilities in a different way based on
the flags.

Signed-off-by: Jiri Denemark <[email protected]>
---
 src/qemu/qemu_capabilities.c | 36 ++++++++++++++++++++++++++----------
 src/qemu/qemu_capabilities.h |  3 ++-
 src/qemu/qemu_conf.c         |  6 ++++--
 src/qemu/qemu_conf.h         |  3 ++-
 src/qemu/qemu_driver.c       | 15 ++-------------
 tests/domaincapstest.c       |  2 +-
 6 files changed, 37 insertions(+), 28 deletions(-)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 90bd43e628..a612011ee1 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -795,6 +795,9 @@ struct _virQEMUCapsHostCPUData {
     unsigned int physAddrSize;
     /* Host CPU definition reported in domain capabilities. */
     virCPUDef *reported;
+    /* Host CPU definition with possibly extra features that are supported by
+     * the stack, but should not be included in a host-model CPU. */
+    virCPUDef *supported;
     /* Migratable host CPU definition used for updating guest CPU. */
     virCPUDef *migratable;
     /* CPU definition with features detected by libvirt using virCPUGetHost
@@ -6637,14 +6640,25 @@ virQEMUCapsFillDomainCPUMaximum(virDomainCaps *domCaps)
 
 static void
 virQEMUCapsFillDomainCPUHostModel(virQEMUCaps *qemuCaps,
-                                  virDomainCaps *domCaps)
+                                  virDomainCaps *domCaps,
+                                  unsigned int flags)
 {
-    virCPUDef *cpu = virQEMUCapsGetHostModel(qemuCaps, domCaps->virttype,
-                                             VIR_QEMU_CAPS_HOST_CPU_REPORTED);
+    virQEMUCapsHostCPUType cpuType = VIR_QEMU_CAPS_HOST_CPU_REPORTED;
+    virCPUDef *cpu;
 
-    domCaps->cpu.hostModel = virCPUDefCopy(cpu);
-    domCaps->cpu.hostModel->addr = virQEMUCapsGetHostPhysAddr(qemuCaps,
-                                                              
domCaps->virttype);
+    cpu = virCPUDefCopy(virQEMUCapsGetHostModel(qemuCaps, domCaps->virttype,
+                                                cpuType));
+    domCaps->cpu.hostModel = cpu;
+
+    cpu->addr = virQEMUCapsGetHostPhysAddr(qemuCaps, domCaps->virttype);
+
+    if (flags & 
VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES) {
+        virQEMUCapsUpdateCPUDeprecatedFeatures(qemuCaps, domCaps->virttype,
+                                               cpu, VIR_CPU_FEATURE_DISABLE);
+    }
+
+    if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES)
+        virCPUExpandFeatures(domCaps->arch, cpu);
 }
 
 
@@ -6669,7 +6683,8 @@ virQEMUCapsFillDomainCPUCustom(virQEMUCaps *qemuCaps,
 static void
 virQEMUCapsFillDomainCPUCaps(virQEMUCaps *qemuCaps,
                              virArch hostarch,
-                             virDomainCaps *domCaps)
+                             virDomainCaps *domCaps,
+                             unsigned int flags)
 {
     if (virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, domCaps->virttype,
                                       VIR_CPU_MODE_HOST_PASSTHROUGH,
@@ -6686,7 +6701,7 @@ virQEMUCapsFillDomainCPUCaps(virQEMUCaps *qemuCaps,
     if (virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, domCaps->virttype,
                                       VIR_CPU_MODE_HOST_MODEL,
                                       domCaps->machine)) {
-        virQEMUCapsFillDomainCPUHostModel(qemuCaps, domCaps);
+        virQEMUCapsFillDomainCPUHostModel(qemuCaps, domCaps, flags);
     }
 
     if (virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, domCaps->virttype,
@@ -7315,7 +7330,8 @@ virQEMUCapsFillDomainCaps(virQEMUDriverConfig *cfg,
                           virQEMUCaps *qemuCaps,
                           virArch hostarch,
                           virDomainCaps *domCaps,
-                          bool privileged)
+                          bool privileged,
+                          unsigned int flags)
 {
     virDomainCapsOS *os = &domCaps->os;
     virDomainCapsDeviceDisk *disk = &domCaps->disk;
@@ -7358,7 +7374,7 @@ virQEMUCapsFillDomainCaps(virQEMUDriverConfig *cfg,
                                     firmwares, nfirmwares) < 0)
         return -1;
 
-    virQEMUCapsFillDomainCPUCaps(qemuCaps, hostarch, domCaps);
+    virQEMUCapsFillDomainCPUCaps(qemuCaps, hostarch, domCaps, flags);
     virQEMUCapsFillDomainMemoryBackingCaps(qemuCaps, memoryBacking);
     virQEMUCapsFillDomainDeviceDiskCaps(qemuCaps, domCaps->machine, disk);
     virQEMUCapsFillDomainDeviceGraphicsCaps(cfg, qemuCaps, graphics);
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index c26e06104d..b26b5d3145 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -903,7 +903,8 @@ int virQEMUCapsFillDomainCaps(virQEMUDriverConfig *cfg,
                               virQEMUCaps *qemuCaps,
                               virArch hostarch,
                               virDomainCaps *domCaps,
-                              bool privileged);
+                              bool privileged,
+                              unsigned int flags);
 
 void virQEMUCapsFillDomainMemoryBackingCaps(virQEMUCaps *qemuCaps,
                                             virDomainCapsMemoryBacking 
*memoryBacking);
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 9c32310096..9b94733a38 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -1753,7 +1753,8 @@ virQEMUDriverGetDomainCapabilities(virQEMUDriver *driver,
                                    virQEMUCaps *qemuCaps,
                                    const char *machine,
                                    virArch arch,
-                                   virDomainVirtType virttype)
+                                   virDomainVirtType virttype,
+                                   unsigned int flags)
 {
     g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
     g_autoptr(virDomainCaps) domCaps = NULL;
@@ -1787,7 +1788,8 @@ virQEMUDriverGetDomainCapabilities(virQEMUDriver *driver,
                                   qemuCaps,
                                   driver->hostarch,
                                   domCaps,
-                                  driver->privileged) < 0)
+                                  driver->privileged,
+                                  flags) < 0)
         return NULL;
 
     return g_steal_pointer(&domCaps);
diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index 511ab77f71..a2ca4ddbdb 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -383,7 +383,8 @@ virQEMUDriverGetDomainCapabilities(virQEMUDriver *driver,
                                    virQEMUCaps *qemuCaps,
                                    const char *machine,
                                    virArch arch,
-                                   virDomainVirtType virttype);
+                                   virDomainVirtType virttype,
+                                   unsigned int flags);
 
 int qemuDriverAllocateID(virQEMUDriver *driver);
 virDomainXMLOption *virQEMUDriverCreateXMLConf(virQEMUDriver *driver,
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index bcafacfb60..c351ce40af 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -16982,21 +16982,10 @@ qemuConnectGetDomainCapabilities(virConnectPtr conn,
 
     if (!(domCaps = virQEMUDriverGetDomainCapabilities(driver,
                                                        qemuCaps, machine,
-                                                       arch, virttype)))
+                                                       arch, virttype,
+                                                       flags)))
         return NULL;
 
-    if (flags & 
VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES) {
-        virQEMUCapsUpdateCPUDeprecatedFeatures(qemuCaps, virttype,
-                                               domCaps->cpu.hostModel,
-                                               VIR_CPU_FEATURE_DISABLE);
-    }
-
-    if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_EXPAND_CPU_FEATURES) {
-        virCPUDef *cpu = domCaps->cpu.hostModel;
-        if (cpu && virCPUExpandFeatures(arch, cpu) < 0)
-            return NULL;
-    }
-
     return virDomainCapsFormat(domCaps);
 }
 
diff --git a/tests/domaincapstest.c b/tests/domaincapstest.c
index 5b2fc80f0a..f2248c2435 100644
--- a/tests/domaincapstest.c
+++ b/tests/domaincapstest.c
@@ -101,7 +101,7 @@ fillQemuCaps(virDomainCaps *domCaps,
 
     if (virQEMUCapsFillDomainCaps(cfg,
                                   qemuCaps, domCaps->arch, domCaps,
-                                  false) < 0)
+                                  false, 0) < 0)
         return -1;
 
     /* As of f05b6a918e28 we are expecting to see OVMF_CODE.fd file which
-- 
2.54.0

Reply via email to