]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: add external backend for tpm
authorJán Tomko <jtomko@redhat.com>
Mon, 17 Oct 2022 13:20:24 +0000 (15:20 +0200)
committerJán Tomko <jtomko@redhat.com>
Mon, 19 Dec 2022 09:33:20 +0000 (10:33 +0100)
Introduce a new backend type 'external' for connecting to a swtpm daemon
not managed by libvirtd.

Mostly in one commit, thanks to -Wswitch and the way we generate
capabilities.

https://bugzilla.redhat.com/show_bug.cgi?id=2063723

Signed-off-by: Ján Tomko <jtomko@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
61 files changed:
src/conf/domain_audit.c
src/conf/domain_conf.c
src/conf/domain_conf.h
src/conf/domain_validate.c
src/conf/schemas/domaincommon.rng
src/qemu/qemu_capabilities.c
src/qemu/qemu_cgroup.c
src/qemu/qemu_command.c
src/qemu/qemu_domain.c
src/qemu/qemu_namespace.c
src/qemu/qemu_tpm.c
src/security/security_dac.c
src/security/security_selinux.c
tests/domaincapsdata/qemu_4.2.0-q35.x86_64.xml
tests/domaincapsdata/qemu_4.2.0-tcg.x86_64.xml
tests/domaincapsdata/qemu_4.2.0.x86_64.xml
tests/domaincapsdata/qemu_5.0.0-q35.x86_64.xml
tests/domaincapsdata/qemu_5.0.0-tcg.x86_64.xml
tests/domaincapsdata/qemu_5.0.0-virt.aarch64.xml
tests/domaincapsdata/qemu_5.0.0.aarch64.xml
tests/domaincapsdata/qemu_5.0.0.ppc64.xml
tests/domaincapsdata/qemu_5.0.0.x86_64.xml
tests/domaincapsdata/qemu_5.1.0-q35.x86_64.xml
tests/domaincapsdata/qemu_5.1.0-tcg.x86_64.xml
tests/domaincapsdata/qemu_5.1.0.x86_64.xml
tests/domaincapsdata/qemu_5.2.0-q35.x86_64.xml
tests/domaincapsdata/qemu_5.2.0-tcg.x86_64.xml
tests/domaincapsdata/qemu_5.2.0-virt.aarch64.xml
tests/domaincapsdata/qemu_5.2.0.aarch64.xml
tests/domaincapsdata/qemu_5.2.0.ppc64.xml
tests/domaincapsdata/qemu_5.2.0.x86_64.xml
tests/domaincapsdata/qemu_6.0.0-q35.x86_64.xml
tests/domaincapsdata/qemu_6.0.0-tcg.x86_64.xml
tests/domaincapsdata/qemu_6.0.0-virt.aarch64.xml
tests/domaincapsdata/qemu_6.0.0.aarch64.xml
tests/domaincapsdata/qemu_6.0.0.x86_64.xml
tests/domaincapsdata/qemu_6.1.0-q35.x86_64.xml
tests/domaincapsdata/qemu_6.1.0-tcg.x86_64.xml
tests/domaincapsdata/qemu_6.1.0.x86_64.xml
tests/domaincapsdata/qemu_6.2.0-q35.x86_64.xml
tests/domaincapsdata/qemu_6.2.0-tcg.x86_64.xml
tests/domaincapsdata/qemu_6.2.0-virt.aarch64.xml
tests/domaincapsdata/qemu_6.2.0.aarch64.xml
tests/domaincapsdata/qemu_6.2.0.ppc64.xml
tests/domaincapsdata/qemu_6.2.0.x86_64.xml
tests/domaincapsdata/qemu_7.0.0-q35.x86_64.xml
tests/domaincapsdata/qemu_7.0.0-tcg.x86_64.xml
tests/domaincapsdata/qemu_7.0.0-virt.aarch64.xml
tests/domaincapsdata/qemu_7.0.0.aarch64.xml
tests/domaincapsdata/qemu_7.0.0.ppc64.xml
tests/domaincapsdata/qemu_7.0.0.x86_64.xml
tests/domaincapsdata/qemu_7.1.0-q35.x86_64.xml
tests/domaincapsdata/qemu_7.1.0-tcg.x86_64.xml
tests/domaincapsdata/qemu_7.1.0.ppc64.xml
tests/domaincapsdata/qemu_7.1.0.x86_64.xml
tests/domaincapsdata/qemu_7.2.0-q35.x86_64.xml
tests/domaincapsdata/qemu_7.2.0-tcg.x86_64.xml
tests/domaincapsdata/qemu_7.2.0.x86_64.xml
tests/qemuxml2argvdata/tpm-external.xml [new file with mode: 0644]
tests/qemuxml2xmloutdata/tpm-external.x86_64-latest.xml [new symlink]
tests/qemuxml2xmltest.c

index 974df5a037bb020e47b1896fc0db27efa73e232f..82cf6ab74957f53ae4bfe40ac25ecfafae18fe70 100644 (file)
@@ -556,6 +556,17 @@ virDomainAuditTPM(virDomainObj *vm, virDomainTPMDef *tpm,
                   "virt=%s resrc=tpm-emulator reason=%s %s uuid=%s %s",
                   virt, reason, vmname, uuidstr, device);
         break;
+    case VIR_DOMAIN_TPM_TYPE_EXTERNAL:
+        path = tpm->data.external.source->data.nix.path;
+        if (!(device = virAuditEncode("device", VIR_AUDIT_STR(path)))) {
+            VIR_WARN("OOM while encoding audit message");
+            goto cleanup;
+        }
+
+        VIR_AUDIT(VIR_AUDIT_RECORD_RESOURCE, success,
+                  "virt=%s resrc=tpm-external reason=%s %s uuid=%s %s",
+                  virt, reason, vmname, uuidstr, device);
+        break;
     case VIR_DOMAIN_TPM_TYPE_LAST:
     default:
         break;
index a180398b1401ebeb7af0b703b5113d49dd62dccf..6c088ff2954f2b9bd009a1b2af7f7d3d912516d7 100644 (file)
@@ -1281,6 +1281,7 @@ VIR_ENUM_IMPL(virDomainTPMBackend,
               VIR_DOMAIN_TPM_TYPE_LAST,
               "passthrough",
               "emulator",
+              "external",
 );
 
 VIR_ENUM_IMPL(virDomainTPMVersion,
@@ -3309,6 +3310,9 @@ void virDomainTPMDefFree(virDomainTPMDef *def)
         g_free(def->data.emulator.logfile);
         virBitmapFree(def->data.emulator.activePcrBanks);
         break;
+    case VIR_DOMAIN_TPM_TYPE_EXTERNAL:
+        virObjectUnref(def->data.external.source);
+        break;
     case VIR_DOMAIN_TPM_TYPE_LAST:
         break;
     }
@@ -10257,6 +10261,7 @@ virDomainTPMDefParseXML(virDomainXMLOption *xmlopt,
     g_autofree char *persistent_state = NULL;
     g_autofree xmlNodePtr *backends = NULL;
     g_autofree xmlNodePtr *nodes = NULL;
+    g_autofree char *type = NULL;
     int bank;
 
     if (!(def = virDomainTPMDefNew(xmlopt)))
@@ -10344,6 +10349,28 @@ virDomainTPMDefParseXML(virDomainXMLOption *xmlopt,
             virBitmapSetBitExpand(def->data.emulator.activePcrBanks, bank);
         }
         break;
+    case VIR_DOMAIN_TPM_TYPE_EXTERNAL:
+        if (!(type = virXPathString("string(./backend/source/@type)", ctxt))) {
+            virReportError(VIR_ERR_XML_ERROR, "%s",
+                           _("missing external TPM backend type"));
+            goto error;
+        }
+
+        if (!(def->data.external.source = virDomainChrSourceDefNew(xmlopt)))
+            goto error;
+
+        def->data.external.source->type = virDomainChrTypeFromString(type);
+        if (def->data.external.source->type < 0) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("unknown backend type '%s' for external TPM"),
+                           type);
+            goto error;
+        }
+
+        if (virDomainChrSourceDefParseXML(def->data.external.source,
+                                          backends[0], flags, NULL, ctxt) < 0)
+            goto error;
+        break;
     case VIR_DOMAIN_TPM_TYPE_LAST:
         goto error;
     }
@@ -20443,6 +20470,7 @@ virDomainTPMDefCheckABIStability(virDomainTPMDef *src,
         break;
 
     case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
+    case VIR_DOMAIN_TPM_TYPE_EXTERNAL:
     case VIR_DOMAIN_TPM_TYPE_LAST:
         break;
     }
@@ -24047,6 +24075,13 @@ virDomainTPMDefFormat(virBuffer *buf,
             virXMLFormatElement(&backendChildBuf, "active_pcr_banks", NULL, &activePcrBanksBuf);
         }
         break;
+    case VIR_DOMAIN_TPM_TYPE_EXTERNAL:
+        if (def->data.external.source->type == VIR_DOMAIN_CHR_TYPE_UNIX) {
+            virBufferAddLit(&backendChildBuf, "<source type='unix' mode='connect'");
+            virBufferEscapeString(&backendChildBuf, " path='%s'/>\n",
+                                  def->data.external.source->data.nix.path);
+        }
+        break;
     case VIR_DOMAIN_TPM_TYPE_LAST:
         break;
     }
index c19dfc54703d3c16cb7c90144a7ebca71028061c..1404c550533d2c2c221796ebc7555c19a2b985fe 100644 (file)
@@ -1421,6 +1421,7 @@ typedef enum {
 typedef enum {
     VIR_DOMAIN_TPM_TYPE_PASSTHROUGH,
     VIR_DOMAIN_TPM_TYPE_EMULATOR,
+    VIR_DOMAIN_TPM_TYPE_EXTERNAL,
 
     VIR_DOMAIN_TPM_TYPE_LAST
 } virDomainTPMBackendType;
@@ -1464,6 +1465,9 @@ struct _virDomainTPMDef {
             bool persistent_state;
             virBitmap *activePcrBanks;
         } emulator;
+        struct {
+            virDomainChrSourceDef *source;
+        } external;
     } data;
 };
 
index 95b8d9b41938f0fc2348f5e7bd2cd26316c86a25..2c63a0b3430c710041992b93b98ad959c7f122a9 100644 (file)
@@ -2727,6 +2727,24 @@ virDomainTPMDevValidate(const virDomainTPMDef *tpm)
         break;
 
     case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
+        break;
+
+    case VIR_DOMAIN_TPM_TYPE_EXTERNAL:
+        if (tpm->data.external.source->type != VIR_DOMAIN_CHR_TYPE_UNIX) {
+            virReportError(VIR_ERR_XML_ERROR, "%s",
+                           _("only source type 'unix' is supported for external TPM device"));
+            return -1;
+        }
+        if (tpm->data.external.source->data.nix.listen) {
+            virReportError(VIR_ERR_XML_ERROR, "%s",
+                           _("only 'client' mode is supported for external TPM device"));
+            return -1;
+        }
+        if (tpm->data.external.source->data.nix.path == NULL) {
+            virReportError(VIR_ERR_XML_ERROR, "%s",
+                           _("missing socket path for external TPM device"));
+            return -1;
+        }
     case VIR_DOMAIN_TPM_TYPE_LAST:
         break;
     }
index 8bc627d114f62d103d336af37e9a586970a22069..c588a48fd26d5ac4718a62f12e2f22a1dc624d64 100644 (file)
             </attribute>
           </optional>
         </group>
+        <group>
+          <attribute name="type">
+            <value>external</value>
+          </attribute>
+          <ref name="tpm-external-source"/>
+        </group>
       </choice>
       <optional>
         <attribute name="version">
     </optional>
   </define>
 
+  <define name="tpm-external-source">
+    <optional>
+      <element name="source">
+        <attribute name="type">
+          <value>unix</value>
+        </attribute>
+        <attribute name="path">
+          <ref name="filePath"/>
+        </attribute>
+        <attribute name="mode">
+          <value>connect</value>
+        </attribute>
+      </element>
+    </optional>
+  </define>
+
   <define name="tpm-backend-emulator-encryption">
     <optional>
       <element name="encryption">
index 2553b5b3add8d1a66fdafe1267fb15b25486c3e4..3aba9299b1a7ed3727ff9ca26c2f566d349705cc 100644 (file)
@@ -6471,8 +6471,10 @@ virQEMUCapsFillDomainDeviceTPMCaps(virQEMUCaps *qemuCaps,
     if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_TPM_PASSTHROUGH))
         VIR_DOMAIN_CAPS_ENUM_SET(tpm->backendModel, VIR_DOMAIN_TPM_TYPE_PASSTHROUGH);
     if (virTPMHasSwtpm()) {
-        if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_TPM_EMULATOR))
+        if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_TPM_EMULATOR)) {
             VIR_DOMAIN_CAPS_ENUM_SET(tpm->backendModel, VIR_DOMAIN_TPM_TYPE_EMULATOR);
+            VIR_DOMAIN_CAPS_ENUM_SET(tpm->backendModel, VIR_DOMAIN_TPM_TYPE_EXTERNAL);
+        }
         if (virTPMSwtpmSetupCapsGet(VIR_TPM_SWTPM_SETUP_FEATURE_TPM_1_2)) {
             VIR_DOMAIN_CAPS_ENUM_SET(tpm->backendVersion, VIR_DOMAIN_TPM_VERSION_1_2);
             tpm->backendVersion.report = true;
index 78c4a035bf72317a06353a4dc8a05babfe22be8e..9cf2d6474a79009fc256437c3ff6e4ee1b0d87bc 100644 (file)
@@ -397,6 +397,7 @@ qemuSetupTPMCgroup(virDomainObj *vm,
     case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
         return qemuSetupChrSourceCgroup(vm, dev->data.passthrough.source);
     case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+    case VIR_DOMAIN_TPM_TYPE_EXTERNAL:
     case VIR_DOMAIN_TPM_TYPE_LAST:
         break;
     }
index 42bd7cb99faf69cab9a903f1f1a479a1b9f46070..ee2e873b956263ba98c87a01979ab99481c43607 100644 (file)
@@ -9241,7 +9241,10 @@ qemuBuildTPMBackendStr(virDomainTPMDef *tpm,
 {
     g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER;
 
-    virBufferAsprintf(&buf, "%s", virDomainTPMBackendTypeToString(tpm->type));
+    if (tpm->type == VIR_DOMAIN_TPM_TYPE_EXTERNAL)
+        virBufferAddLit(&buf, "emulator");
+    else
+        virBufferAsprintf(&buf, "%s", virDomainTPMBackendTypeToString(tpm->type));
     virBufferAsprintf(&buf, ",id=tpm-%s", tpm->info.alias);
 
     switch (tpm->type) {
@@ -9253,6 +9256,7 @@ qemuBuildTPMBackendStr(virDomainTPMDef *tpm,
         virQEMUBuildBufferEscapeComma(&buf, qemuFDPassGetPath(passcancel));
         break;
     case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+    case VIR_DOMAIN_TPM_TYPE_EXTERNAL:
         virBufferAddLit(&buf, ",chardev=chrtpm");
         break;
     case VIR_DOMAIN_TPM_TYPE_LAST:
@@ -9295,6 +9299,11 @@ qemuBuildTPMCommandLine(virCommand *cmd,
             return -1;
         break;
 
+    case VIR_DOMAIN_TPM_TYPE_EXTERNAL:
+        if (qemuBuildChardevCommand(cmd, tpm->data.external.source, "chrtpm", priv->qemuCaps) < 0)
+            return -1;
+        break;
+
     case VIR_DOMAIN_TPM_TYPE_LAST:
         virReportEnumRangeError(virDomainTPMBackendType, tpm->type);
         return -1;
index 8892f28fce6661772ca7d32b009142858f8380c0..5c05032ce3828d08db2e9476f9a18c626fd71bea 100644 (file)
@@ -1201,6 +1201,7 @@ qemuDomainTPMPrivateFormat(const virDomainTPMDef *tpm,
         break;
 
     case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
+    case VIR_DOMAIN_TPM_TYPE_EXTERNAL:
     case VIR_DOMAIN_TPM_TYPE_LAST:
         break;
     }
@@ -11753,6 +11754,9 @@ qemuDomainDeviceBackendChardevForeachOne(virDomainDeviceDef *dev,
         case VIR_DOMAIN_TPM_TYPE_EMULATOR:
             return cb(dev, dev->data.tpm->data.emulator.source, opaque);
 
+        case VIR_DOMAIN_TPM_TYPE_EXTERNAL:
+            return cb(dev, dev->data.tpm->data.external.source, opaque);
+
         case VIR_DOMAIN_TPM_TYPE_LAST:
             return 0;
         }
index 90c0b900241d843c2d8b6afd219b5df1c61b8658..0f7351ad469d8f09c561fd0437b3546dd5eb1924 100644 (file)
@@ -457,6 +457,7 @@ qemuDomainSetupTPM(virDomainTPMDef *dev,
         break;
 
     case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+    case VIR_DOMAIN_TPM_TYPE_EXTERNAL:
     case VIR_DOMAIN_TPM_TYPE_LAST:
         /* nada */
         break;
index 36d5beb20282837032826f619102bffab03567b3..f2edaf5eaa754b291d62074563d1e10240a5e6d2 100644 (file)
@@ -1028,6 +1028,7 @@ qemuTPMHasSharedStorage(virDomainDef *def)
         case VIR_DOMAIN_TPM_TYPE_EMULATOR:
             return virFileIsSharedFS(tpm->data.emulator.storagepath) == 1;
         case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
+        case VIR_DOMAIN_TPM_TYPE_EXTERNAL:
         case VIR_DOMAIN_TPM_TYPE_LAST:
             break;
         }
@@ -1048,6 +1049,7 @@ qemuTPMCanMigrateSharedStorage(virDomainDef *def)
         case VIR_DOMAIN_TPM_TYPE_EMULATOR:
             return QEMU_DOMAIN_TPM_PRIVATE(tpm)->swtpm.can_migrate_shared_storage;
         case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
+        case VIR_DOMAIN_TPM_TYPE_EXTERNAL:
         case VIR_DOMAIN_TPM_TYPE_LAST:
             break;
         }
index 5ca63e30f47eba90441dc2606f266ca5bc506f99..917fcf76a3e8e79f59b09fa65f9026f8384b00fd 100644 (file)
@@ -1699,6 +1699,7 @@ virSecurityDACSetTPMFileLabel(virSecurityManager *mgr,
                                                   tpm->data.emulator.source,
                                                   false, false);
         break;
+    case VIR_DOMAIN_TPM_TYPE_EXTERNAL:
     case VIR_DOMAIN_TPM_TYPE_LAST:
         break;
     }
@@ -1722,6 +1723,7 @@ virSecurityDACRestoreTPMFileLabel(virSecurityManager *mgr,
         break;
     case VIR_DOMAIN_TPM_TYPE_EMULATOR:
         /* swtpm will have removed the Unix socket upon termination */
+    case VIR_DOMAIN_TPM_TYPE_EXTERNAL:
     case VIR_DOMAIN_TPM_TYPE_LAST:
         break;
     }
index 415a26a38666aa51a1d723ab9d2a11cc1a14f8e4..93cc12407a60c91d96c0e7c2e764aff4d63f505f 100644 (file)
@@ -1660,6 +1660,7 @@ virSecuritySELinuxSetTPMFileLabel(virSecurityManager *mgr,
         if (rc < 0)
             return -1;
         break;
+    case VIR_DOMAIN_TPM_TYPE_EXTERNAL:
     case VIR_DOMAIN_TPM_TYPE_LAST:
         break;
     }
@@ -1695,6 +1696,7 @@ virSecuritySELinuxRestoreTPMFileLabelInt(virSecurityManager *mgr,
         break;
     case VIR_DOMAIN_TPM_TYPE_EMULATOR:
         /* swtpm will have removed the Unix socket upon termination */
+    case VIR_DOMAIN_TPM_TYPE_EXTERNAL:
     case VIR_DOMAIN_TPM_TYPE_LAST:
         break;
     }
index 9375fc9457a05f8b376e20be0ebe9f2dab518f02..d0bf0bdc7b730fae5c5f02da769cc4bec6c9ddca 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 860ffd1047d14f12fba2aab895bf3a86c36420e0..6a3818fb4e21c3bf18b5e683e01bc1ca05266f17 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 0187584e6bf717a18971b804bfbb7f3db6943f70..36a4081764a454c55028371a630acf624287e1da 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 3f534b77a26c3c70bf35c1789f861f7b3b60123f..05884cdb862177ef859ba89be84f2e3bbeb42052 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 2826ce58e1d730a0f8e9556bcd8f3e154566ac7f..c53b84c1401ffa01cf08037f8bac023d92661138 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 1ae7dfdc01c954952c4381f42643042ee2eb90a5..e74a3d9f5fb352276485171283e2f76653591dc8 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 74db0a256140bf06bbb1edbdb8646751d5974b59..605575c793e422424a39007849be92422882a62b 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 804172d0130aca9352f4d6f871b7fe0cc731c2ca..a5b718618b4c3d8953f83c0ffaaa4fdee508afa4 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index a83e942ca5753d28417231653314f0ad853b466b..fd1f42b555066a1e6637b09c2d2ee522e66dec21 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index f10a106d9acfb51b2ecc197fcb4550108a20cd9a..a04c3e713091b9171354ed0056a8a97de6301ac5 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index a2a3b501cc9fb6c0e9c90f8788baa7e66494a923..a7b2ff8d7d2f2040ea2e241453cb895ea7a85574 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 926ac6c231d3882297bef197896105f9f18a7fe0..45b7dcf6e4608e4efb70f9e879a3c6f282c9db63 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 31ff03f9f0d91a010ebcc3dfb3a1b78cfc5548c5..61cfa7d449b7d9296563426cf9a0af9e84a36c69 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index fdaa0ae5bc06b6b583e8c680c0f503043a8efd72..caced52187a90d66b8874879ccabe969e017b09f 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 762fbe2f50df4b798e61f317ae28ee4e7c118d54..f19ad3269328d8a5cb082d8956ed4553dc371b27 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 74db0a256140bf06bbb1edbdb8646751d5974b59..605575c793e422424a39007849be92422882a62b 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 02e038d44533190bff02379ae3a58714308a5668..8ae7487c1e79c0c24a67ab28260a8ca897a4fab9 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index cfd6ff1d84b7c7be59fc5412a16388f42b055b01..67f8b0fd83d7dee4ca618f61445589827be5b770 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 048c47e9f605d2cad1ccc2fd1613ff6b190f509a..08585e6cb09211492317ae37911ae83f64cbbbdd 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 75bf330a79ac6f8bceb9850da169d75a00b1ec6b..7536a42ad50e44f82d41abf1986e2bbc4171f7c3 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 30446b75f765fe5f33bfc0a113353b67faefce47..1235dd0ab78eb39ebcf3d159d241ed99f9770ca3 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 6c30318d347e5853150ead5a0c244743b9d4d8a9..461e34f1d68b87749725c25ec884e09bb57ac73b 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 8b9e910fdc89c76f9304c23c8e8f7ad50b390b2e..632f7c21d1f41e1cf617ce606d9e4fc2113869b4 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index bc4912bc6283a759275fdb82b1ce2f581c109cc1..35d1014626822d522604c07b622dee2057566aa3 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 6cbdb1d6aea357fcce2b9e604a561a04bac03f7e..9d56f2dda789c98c8562a1bcc08944ac342d5100 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 5efb7b595ce76e50b0e156229bb164a107aaedd5..591ca12d72c19274431b9ad65b0cec19c434f8df 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 1281dc5ff80485bb34511768fd0707e35c85960e..7558e78423cab46b7caf4b7ba8d7dd09cd871894 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 2fcff7a96fe91855cb3f1eedae3733b5683e31f2..c667b944da1c2b86ad72ed942d1f2dd1d3b95283 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 5aa882061282add7d8c689eda245f6d0c10f4a1e..2c9ba98a0a610959725f366d74fbbd1b15826676 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 96c426cd4fe95a95a798dd2007fe5dcd30e0a116..9b546f59bc83edda04004afc1971a78f98d45b17 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 350c55e2c0149ea10ce407aa30d6ea50d769d3a8..fd7c9d8d5adbc42065efb20ab2b594c990ac3444 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index ae789c3a9b88d21eaa9e3b1e4c50e5c3e982ad10..a20d3722fd4772f4002a8c97ad8e5364a4a32993 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>1.2</value>
index 59b2988de0dffab78b38702bba713706c0531517..ac9d384bb3b73dd1176740a99812209f475f3cd6 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>2.0</value>
index 58d8bdee3fb19e1ab5250baae55e719b81c2ec25..2419875474430b8fab62ffd5abc515b227c6b2cc 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>2.0</value>
index 4ec23a8b85a77c00207af08cd7bc43994e2877df..f4eb8a728b940fa3e12ccf7201ef6ae772a6e610 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>2.0</value>
index d3f90db5a8a7df368f3e325aabb8331d88ad8675..053bec369bcd37ebb23691b81038810d32e58400 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>2.0</value>
index e9322a02e2e79cad493f04a19f207ca4b4c6f664..9c09174d77c6a064b4f903e70831df98922f8864 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>2.0</value>
index 368c359dcfdec9ebaeade1bcd7d782d9dddf2e3c..886e14ea49d48c9b41d641a0174b0fd3555e3fa0 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>2.0</value>
index 831ef667e911996d4cc7d04c3a3bd897b3242257..6b5e8a682055cd64bcd8bcf61e804a41ac59611b 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>2.0</value>
index e5d5768b402089b0b7f0497f9154973fc64466b5..e44804c21cac8a30fd9cadf378176d1fbebc3427 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>2.0</value>
index 73c2cb84e49d369de9214be2f1d4f89ff4a9d464..15cf6a9cf8b022a9b553ae62aac7d9c41f5e8656 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>2.0</value>
index 0e2aa77a7dd9c8628753c7b9e5f13e7de80165a7..d4069dd6f0eab176015b63a709fb4b8035389595 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>2.0</value>
index 8c6399a7b6b5a1e070be62e97a8f1ba3e855c4b9..e6997ccbc618fce1f36b031089f9d49bd815d7e4 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>2.0</value>
index b04beaa9d6ff4428bdd84bb1f7f81a1d1b4d056a..b9bf0b6a048bdab9f993d80b6fc4fa37671ab771 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>2.0</value>
index 86385dacbd7d2602ec06417a4db9ad244de699af..67ecdc0b1230bc10fb72a6ff44db954d64458d8f 100644 (file)
       <enum name='backendModel'>
         <value>passthrough</value>
         <value>emulator</value>
+        <value>external</value>
       </enum>
       <enum name='backendVersion'>
         <value>2.0</value>
diff --git a/tests/qemuxml2argvdata/tpm-external.xml b/tests/qemuxml2argvdata/tpm-external.xml
new file mode 100644 (file)
index 0000000..c8f9c72
--- /dev/null
@@ -0,0 +1,40 @@
+<domain type='qemu'>
+  <name>TPM-VM</name>
+  <uuid>11d7cd22-da89-3094-6212-079a48a309a1</uuid>
+  <memory unit='KiB'>2097152</memory>
+  <currentMemory unit='KiB'>512288</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch='x86_64' machine='pc-i440fx-2.12'>hvm</type>
+    <boot dev='hd'/>
+    <bootmenu enable='yes'/>
+  </os>
+  <features>
+    <acpi/>
+  </features>
+  <cpu mode='custom' match='exact' check='none'>
+    <model fallback='forbid'>qemu64</model>
+  </cpu>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/usr/bin/qemu-system-x86_64</emulator>
+    <controller type='usb' index='0' model='piix3-uhci'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
+    </controller>
+    <controller type='pci' index='0' model='pci-root'/>
+    <input type='mouse' bus='ps2'/>
+    <input type='keyboard' bus='ps2'/>
+    <tpm model='tpm-tis'>
+      <backend type='external'>
+        <source type='unix' mode='connect' path='/tmp/path.sock'/>
+      </backend>
+    </tpm>
+    <audio id='1' type='none'/>
+    <memballoon model='virtio'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+    </memballoon>
+  </devices>
+</domain>
diff --git a/tests/qemuxml2xmloutdata/tpm-external.x86_64-latest.xml b/tests/qemuxml2xmloutdata/tpm-external.x86_64-latest.xml
new file mode 120000 (symlink)
index 0000000..3ce73f0
--- /dev/null
@@ -0,0 +1 @@
+../qemuxml2argvdata/tpm-external.xml
\ No newline at end of file
index e13da8bd2cc6a08013e5d6b76a4c2467b3e51fdc..0e729ca905f670d79a8616f62e20da0257fa06c4 100644 (file)
@@ -744,6 +744,7 @@ mymain(void)
     DO_TEST_CAPS_LATEST("tpm-emulator-tpm2-enc");
     DO_TEST_CAPS_LATEST("tpm-emulator-tpm2-pstate");
     DO_TEST_CAPS_ARCH_LATEST("aarch64-tpm", "aarch64");
+    DO_TEST_CAPS_LATEST("tpm-external");
 
     DO_TEST_NOCAPS("metadata");
     DO_TEST_NOCAPS("metadata-duplicate");