[libvirt] [PATCH v3 03/14] conf: Add support for external swtpm TPM emulator to domain XML

2018-05-04 Thread Stefan Berger
This patch adds support for an external swtpm TPM emulator. The XML for
this type of TPM looks as follows:

 
   
 

The XML will currently only define a TPM 1.2.

Extend the documentation.

Add a test case testing the XML parser and formatter.

Signed-off-by: Stefan Berger 
---
 docs/formatdomain.html.in | 30 +++
 docs/schemas/domaincommon.rng |  5 +
 src/conf/domain_audit.c   |  2 ++
 src/conf/domain_conf.c| 28 ++---
 src/conf/domain_conf.h|  7 +++
 src/qemu/qemu_cgroup.c|  1 +
 src/qemu/qemu_command.c   |  1 +
 src/qemu/qemu_domain.c|  1 +
 src/security/security_dac.c   |  2 ++
 src/security/security_selinux.c   |  2 ++
 tests/qemuxml2argvdata/tpm-emulator.xml   | 30 +++
 tests/qemuxml2xmloutdata/tpm-emulator.xml | 34 +++
 tests/qemuxml2xmltest.c   |  1 +
 13 files changed, 137 insertions(+), 7 deletions(-)
 create mode 100644 tests/qemuxml2argvdata/tpm-emulator.xml
 create mode 100644 tests/qemuxml2xmloutdata/tpm-emulator.xml

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 6a0110e..2a8912f 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -7649,6 +7649,26 @@ qemu-kvm -net nic,model=? /dev/null
 
 ...
 
+
+
+  The emulator device type gives access to a TPM emulator providing
+  TPM functionlity for each VM. QEMU talks to it over a Unix socket. With
+  the emulator device type each guest gets its own private TPM.
+  'emulator' since 4.4.0
+
+
+ Example: usage of the TPM Emulator
+
+
+  ...
+  
+
+  
+  
+
+  
+  ...
+
 
   model
   
@@ -7682,6 +7702,16 @@ qemu-kvm -net nic,model=? /dev/null
 
   
 
+
+  emulator
+  
+
+  For this backend type the 'swtpm' TPM Emulator must be installed 
on the
+  host. Libvirt will automatically start an independent TPM 
emulator
+  for each QEMU guest requesting access to it.
+
+  
+
   
 
 
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 7bad7dd..c65a9a3 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -4137,6 +4137,11 @@
   
   
 
+
+  
+ emulator
+  
+
   
 
   
diff --git a/src/conf/domain_audit.c b/src/conf/domain_audit.c
index 82868bc..25cccdd 100644
--- a/src/conf/domain_audit.c
+++ b/src/conf/domain_audit.c
@@ -586,6 +586,8 @@ virDomainAuditTPM(virDomainObjPtr vm, virDomainTPMDefPtr 
tpm,
   "virt=%s resrc=dev reason=%s %s uuid=%s %s",
   virt, reason, vmname, uuidstr, device);
 break;
+case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+break;
 case VIR_DOMAIN_TPM_TYPE_LAST:
 default:
 break;
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 0ea3e4c..d9945dd 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -864,7 +864,8 @@ VIR_ENUM_IMPL(virDomainTPMModel, VIR_DOMAIN_TPM_MODEL_LAST,
   "tpm-crb")
 
 VIR_ENUM_IMPL(virDomainTPMBackend, VIR_DOMAIN_TPM_TYPE_LAST,
-  "passthrough")
+  "passthrough",
+  "emulator")
 
 VIR_ENUM_IMPL(virDomainIOMMUModel, VIR_DOMAIN_IOMMU_MODEL_LAST,
   "intel")
@@ -2601,6 +2602,11 @@ void virDomainTPMDefFree(virDomainTPMDefPtr def)
 case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
 VIR_FREE(def->data.passthrough.source.data.file.path);
 break;
+case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+VIR_FREE(def->data.emulator.source.data.nix.path);
+VIR_FREE(def->data.emulator.storagepath);
+VIR_FREE(def->data.emulator.logfile);
+break;
 case VIR_DOMAIN_TPM_TYPE_LAST:
 break;
 }
@@ -12582,6 +12588,11 @@ virDomainSmartcardDefParseXML(virDomainXMLOptionPtr 
xmlopt,
  *   
  * 
  *
+ * or like this:
+ *
+ * 
+ *   
+ * 
  */
 static virDomainTPMDefPtr
 virDomainTPMDefParseXML(virDomainXMLOptionPtr xmlopt,
@@ -12648,6 +12659,8 @@ virDomainTPMDefParseXML(virDomainXMLOptionPtr xmlopt,
 def->data.passthrough.source.type = VIR_DOMAIN_CHR_TYPE_DEV;
 path = NULL;
 break;
+case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+break;
 case VIR_DOMAIN_TPM_TYPE_LAST:
 goto error;
 }
@@ -24815,22 +24828,23 @@ virDomainTPMDefFormat(virBufferPtr buf,
 virBufferAsprintf(buf, "\n",
   virDomainTPMModelTypeToString(def->model));
 virBufferAdjustIndent(buf, 2);
-virBufferAsprintf(buf, "\n",
+virBufferAsprintf(buf, "type));
-virBufferAdjustIndent(buf, 

Re: [libvirt] [PATCH v3 03/14] conf: Add support for external swtpm TPM emulator to domain XML

2018-05-08 Thread John Ferlan


On 05/04/2018 04:21 PM, Stefan Berger wrote:
> This patch adds support for an external swtpm TPM emulator. The XML for
> this type of TPM looks as follows:
> 
>  
>
>  
> 
> The XML will currently only define a TPM 1.2.
> 
> Extend the documentation.
> 
> Add a test case testing the XML parser and formatter.
> 
> Signed-off-by: Stefan Berger 
> ---
>  docs/formatdomain.html.in | 30 +++
>  docs/schemas/domaincommon.rng |  5 +
>  src/conf/domain_audit.c   |  2 ++
>  src/conf/domain_conf.c| 28 ++---
>  src/conf/domain_conf.h|  7 +++
>  src/qemu/qemu_cgroup.c|  1 +
>  src/qemu/qemu_command.c   |  1 +
>  src/qemu/qemu_domain.c|  1 +
>  src/security/security_dac.c   |  2 ++
>  src/security/security_selinux.c   |  2 ++
>  tests/qemuxml2argvdata/tpm-emulator.xml   | 30 +++
>  tests/qemuxml2xmloutdata/tpm-emulator.xml | 34 
> +++
>  tests/qemuxml2xmltest.c   |  1 +
>  13 files changed, 137 insertions(+), 7 deletions(-)
>  create mode 100644 tests/qemuxml2argvdata/tpm-emulator.xml
>  create mode 100644 tests/qemuxml2xmloutdata/tpm-emulator.xml
> 

[...]

>  static virDomainTPMDefPtr
>  virDomainTPMDefParseXML(virDomainXMLOptionPtr xmlopt,
> @@ -12648,6 +12659,8 @@ virDomainTPMDefParseXML(virDomainXMLOptionPtr xmlopt,
>  def->data.passthrough.source.type = VIR_DOMAIN_CHR_TYPE_DEV;
>  path = NULL;
>  break;
> +case VIR_DOMAIN_TPM_TYPE_EMULATOR:
> +break;
>  case VIR_DOMAIN_TPM_TYPE_LAST:
>  goto error;
>  }
> @@ -24815,22 +24828,23 @@ virDomainTPMDefFormat(virBufferPtr buf,
>  virBufferAsprintf(buf, "\n",
>virDomainTPMModelTypeToString(def->model));
>  virBufferAdjustIndent(buf, 2);
> -virBufferAsprintf(buf, "\n",
> +virBufferAsprintf(buf, "virDomainTPMBackendTypeToString(def->type));
> -virBufferAdjustIndent(buf, 2);
>  
>  switch (def->type) {
>  case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
> -virBufferEscapeString(buf, "\n",
> +virBufferAddLit(buf, ">\n");
> +virBufferEscapeString(buf, "  \n",
>def->data.passthrough.source.data.file.path);

syntax-check would have told you to use virBufferAdjustIndent around
this and not use "   +virBufferAddLit(buf, "\n");
> +break;
> +case VIR_DOMAIN_TPM_TYPE_EMULATOR:
> +virBufferAddLit(buf, "/>\n");
>  break;
>  case VIR_DOMAIN_TPM_TYPE_LAST:
>  break;
>  }
>  
> -virBufferAdjustIndent(buf, -2);
> -virBufferAddLit(buf, "\n");
> -
>  virDomainDeviceInfoFormat(buf, &def->info, flags);
>  
>  virBufferAdjustIndent(buf, -2);

With the adjustment,

Reviewed-by: John Ferlan 

John

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