Signed-off-by: Stefan Berger <stef...@linux.vnet.ibm.com>

---
 src/qemu/qemu_capabilities.c |   56 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 56 insertions(+)

Index: libvirt/src/qemu/qemu_capabilities.c
===================================================================
--- libvirt.orig/src/qemu/qemu_capabilities.c
+++ libvirt/src/qemu/qemu_capabilities.c
@@ -38,6 +38,7 @@
 #include "virbitmap.h"
 #include "virnodesuspend.h"
 #include "qemu_monitor.h"
+#include "virstring.h"
 
 #include <fcntl.h>
 #include <sys/stat.h>
@@ -2131,6 +2132,59 @@ virQEMUCapsProbeQMPCPUDefinitions(virQEM
 
 
 static int
+virQEMUCapsProbeQMPTPM(virQEMUCapsPtr qemuCaps,
+                       qemuMonitorPtr mon)
+{
+    int nentries, i;
+    char **entries = NULL;
+    struct typeToCaps {
+        int type;
+        enum virQEMUCapsFlags caps;
+    };
+    const struct typeToCaps tpmTypesToCaps[] = {
+        {
+            .type = VIR_DOMAIN_TPM_TYPE_PASSTHROUGH,
+            .caps = QEMU_CAPS_DEVICE_TPM_PASSTHROUGH,
+        },
+    };
+    const struct typeToCaps tpmModelsToCaps[] = {
+        {
+            .type = VIR_DOMAIN_TPM_MODEL_TIS,
+            .caps = QEMU_CAPS_DEVICE_TPM_TIS,
+        },
+    };
+
+    if ((nentries = qemuMonitorGetTPMModels(mon, &entries)) < 0)
+        return -1;
+
+    if (nentries > 0) {
+        for (i = 0; i < ARRAY_CARDINALITY(tpmModelsToCaps); i++) {
+            const char *needle = virDomainTPMModelTypeToString(
+                tpmModelsToCaps[i].type);
+            if (virStringArrayHasString(entries, needle))
+                virQEMUCapsSet(qemuCaps, tpmModelsToCaps[i].caps);
+        }
+    }
+    virStringFreeList(entries);
+
+    if ((nentries = qemuMonitorGetTPMTypes(mon, &entries)) < 0)
+        return -1;
+
+    if (nentries > 0) {
+        for (i = 0; i < ARRAY_CARDINALITY(tpmTypesToCaps); i++) {
+            const char *needle = virDomainTPMBackendTypeToString(
+                tpmTypesToCaps[i].type);
+            if (virStringArrayHasString(entries, needle))
+                virQEMUCapsSet(qemuCaps, tpmTypesToCaps[i].caps);
+        }
+    }
+    virStringFreeList(entries);
+
+    return 0;
+}
+
+
+static int
 virQEMUCapsProbeQMPKVMState(virQEMUCapsPtr qemuCaps,
                             qemuMonitorPtr mon)
 {
@@ -2480,6 +2534,8 @@ virQEMUCapsInitQMP(virQEMUCapsPtr qemuCa
         goto cleanup;
     if (virQEMUCapsProbeQMPKVMState(qemuCaps, mon) < 0)
         goto cleanup;
+    if (virQEMUCapsProbeQMPTPM(qemuCaps, mon) < 0)
+        goto cleanup;
 
     ret = 0;
 

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to