From: Michal Privoznik <mpriv...@redhat.com>

After previous commit the virDomainCapsFeatureHyperv struct
gained new members. Since virQEMUCaps struct holds a pointer to
such struct we must format and parse it to/from capabilities XML.

Signed-off-by: Michal Privoznik <mpriv...@redhat.com>
---
 src/qemu/qemu_capabilities.c | 42 ++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions(+)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 2ccddbfcaa..f571596b30 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -4496,6 +4496,7 @@ virQEMUCapsParseHypervCapabilities(virQEMUCaps *qemuCaps,
     g_autoptr(virDomainCapsFeatureHyperv) hvcaps = NULL;
     xmlNodePtr n = NULL;
     g_autofree xmlNodePtr *capNodes = NULL;
+    int rc;
     int ncapNodes;
     size_t i;
 
@@ -4531,6 +4532,28 @@ virQEMUCapsParseHypervCapabilities(virQEMUCaps *qemuCaps,
         VIR_DOMAIN_CAPS_ENUM_SET(hvcaps->features, val);
     }
 
+    rc = virXPathUInt("string(./hypervCapabilities/spinlocks)",
+                      ctxt, &hvcaps->spinlocks);
+    if (rc == -2)
+        return -1;
+
+    rc = virXPathTristateSwitch("string(./hypervCapabilities/stimer_direct)",
+                                ctxt, &hvcaps->stimer_direct);
+    if (rc == -2)
+        return -1;
+
+    rc = virXPathTristateSwitch("string(./hypervCapabilities/tlbflush_direct)",
+                                ctxt, &hvcaps->tlbflush_direct);
+    if (rc == -2)
+        return -1;
+
+    rc = 
virXPathTristateSwitch("string(./hypervCapabilities/tlbflush_extended)",
+                                ctxt, &hvcaps->tlbflush_extended);
+    if (rc == -2)
+        return -1;
+
+    hvcaps->vendor_id = 
virXPathString("string(./hypervCapabilities/vendor_id)", ctxt);
+
     qemuCaps->hypervCapabilities = g_steal_pointer(&hvcaps);
     return 0;
 }
@@ -5070,6 +5093,25 @@ virQEMUCapsFormatHypervCapabilities(virQEMUCaps 
*qemuCaps,
             virBufferAsprintf(&childBuf, "<cap name='%s'/>\n",
                               virDomainHypervTypeToString(i));
         }
+
+        if (hvcaps->spinlocks != 0) {
+            virBufferAsprintf(&childBuf, "<spinlocks>%u</spinlocks>\n",
+                              hvcaps->spinlocks);
+        }
+        if (hvcaps->stimer_direct != VIR_TRISTATE_SWITCH_ABSENT) {
+            virBufferAsprintf(&childBuf, "<stimer_direct>%s</stimer_direct>\n",
+                              
virTristateSwitchTypeToString(hvcaps->stimer_direct));
+        }
+        if (hvcaps->tlbflush_direct != VIR_TRISTATE_SWITCH_ABSENT) {
+            virBufferAsprintf(&childBuf, 
"<tlbflush_direct>%s</tlbflush_direct>\n",
+                              
virTristateSwitchTypeToString(hvcaps->tlbflush_direct));
+        }
+        if (hvcaps->tlbflush_extended != VIR_TRISTATE_SWITCH_ABSENT) {
+            virBufferAsprintf(&childBuf, 
"<tlbflush_extended>%s</tlbflush_extended>\n",
+                              
virTristateSwitchTypeToString(hvcaps->tlbflush_extended));
+        }
+        virBufferEscapeString(&childBuf, "<vendor_id>%s</vendor_id>\n",
+                              hvcaps->vendor_id);
     }
 
     return virXMLFormatElement(buf, "hypervCapabilities", &attrBuf, &childBuf);
-- 
2.49.1

Reply via email to