Add TPM device validation:

 - Accept only the external TPM backend supported by bhyve.
 - Accept only one TPM device as bhyve does not support more than one.
 - Do not accept UNIX socket paths with commas as commas are used
   to delimit options in bhyve.
 - Accept only the CRB model as it's the only one supported by bhyve.

Also, explicitly set model to CRB when it's not specified.

Signed-off-by: Roman Bogorodskiy <[email protected]>
---
 src/bhyve/bhyve_domain.c                      | 35 +++++++++++++++-
 .../x86_64/bhyvexml2argv-tpm-comma-path.xml   | 16 ++++++++
 .../x86_64/bhyvexml2argv-tpm-crb.args         | 12 ++++++
 .../x86_64/bhyvexml2argv-tpm-crb.ldargs       |  4 ++
 .../x86_64/bhyvexml2argv-tpm-crb.xml          | 28 +++++++++++++
 .../bhyvexml2argv-tpm-invalid-model.xml       | 16 ++++++++
 .../bhyvexml2argv-tpm-multiple-devices.xml    | 21 ++++++++++
 tests/bhyvexml2argvtest.c                     |  4 ++
 .../x86_64/bhyvexml2xmlout-tpm.xml            | 41 +++++++++++++++++++
 tests/bhyvexml2xmltest.c                      |  4 ++
 10 files changed, 180 insertions(+), 1 deletion(-)
 create mode 100644 
tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-comma-path.xml
 create mode 100644 tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.args
 create mode 100644 tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.ldargs
 create mode 100644 tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.xml
 create mode 100644 
tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-invalid-model.xml
 create mode 100644 
tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-multiple-devices.xml
 create mode 100644 tests/bhyvexml2xmloutdata/x86_64/bhyvexml2xmlout-tpm.xml

diff --git a/src/bhyve/bhyve_domain.c b/src/bhyve/bhyve_domain.c
index 93be75d52d..e0004e6dab 100644
--- a/src/bhyve/bhyve_domain.c
+++ b/src/bhyve/bhyve_domain.c
@@ -311,6 +311,11 @@ bhyveDomainDeviceDefPostParse(virDomainDeviceDef *dev,
         dev->data.video->type = VIR_DOMAIN_VIDEO_TYPE_GOP;
     }
 
+    if (dev->type == VIR_DOMAIN_DEVICE_TPM &&
+        dev->data.tpm->model == VIR_DOMAIN_TPM_MODEL_DEFAULT) {
+        dev->data.tpm->model = VIR_DOMAIN_TPM_MODEL_CRB;
+    }
+
     if (dev->type == VIR_DOMAIN_DEVICE_CHR &&
         dev->data.chr->source->type == VIR_DOMAIN_CHR_TYPE_NMDM) {
         virDomainChrDef *chr = dev->data.chr;
@@ -521,11 +526,33 @@ bhyveDomainDeviceDefValidate(const virDomainDeviceDef 
*dev,
     case VIR_DOMAIN_DEVICE_SHMEM:
     case VIR_DOMAIN_DEVICE_SMARTCARD:
     case VIR_DOMAIN_DEVICE_SOUND:
-    case VIR_DOMAIN_DEVICE_TPM:
     case VIR_DOMAIN_DEVICE_VIDEO:
     case VIR_DOMAIN_DEVICE_VSOCK:
     case VIR_DOMAIN_DEVICE_WATCHDOG:
         break;
+
+    case VIR_DOMAIN_DEVICE_TPM:
+        if (dev->data.tpm->type != VIR_DOMAIN_TPM_TYPE_EXTERNAL) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("Only 'external' TPM device backend is 
supported"));
+            return -1;
+        }
+
+        if (dev->data.tpm->model != VIR_DOMAIN_TPM_MODEL_DEFAULT &&
+            dev->data.tpm->model != VIR_DOMAIN_TPM_MODEL_CRB) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("TPM model '%1$s' is not supported by bhyve"),
+                           
virDomainTPMModelTypeToString(dev->data.tpm->model));
+            return -1;
+        }
+
+        if 
(virStringHasChars(dev->data.tpm->data.external.source->data.nix.path,
+                              ",")) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                           _("Commas (',') are not allowed in UNIX socket 
paths"));
+            return -1;
+        }
+        break;
     }
 
     return 0;
@@ -600,6 +627,12 @@ bhyveDomainDefValidate(const virDomainDef *def,
         }
     }
 
+    if (def->ntpms > 1) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("bhyve only supports a single TPM device"));
+        return -1;
+    }
+
     if (def->nhostdevs && !def->mem.locked) {
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                        _("using passthrough devices requires locking guest 
memory"));
diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-comma-path.xml 
b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-comma-path.xml
new file mode 100644
index 0000000000..a12466d743
--- /dev/null
+++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-comma-path.xml
@@ -0,0 +1,16 @@
+<domain type='bhyve'>
+  <name>bhyve</name>
+  <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid>
+  <memory>219136</memory>
+  <vcpu>1</vcpu>
+  <os>
+    <type>hvm</type>
+  </os>
+  <devices>
+    <tpm>
+      <backend type='external'>
+        <source type='unix' mode='connect' path='/var/run/swtpm/tpm,0'/>
+      </backend>
+    </tpm>
+  </devices>
+</domain>
diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.args 
b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.args
new file mode 100644
index 0000000000..9b3b639a94
--- /dev/null
+++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.args
@@ -0,0 +1,12 @@
+bhyve \
+-c 1 \
+-m 214 \
+-u \
+-H \
+-P \
+-s 0:0,hostbridge \
+-s 1:0,lpc \
+-s 2:0,ahci,hd:/tmp/freebsd.img \
+-s 3:0,virtio-net,faketapdev,mac=52:54:00:b9:94:02 \
+-l tpm,swtpm,/var/run/swtpm/tpm \
+bhyve
diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.ldargs 
b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.ldargs
new file mode 100644
index 0000000000..5905f4b3e6
--- /dev/null
+++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.ldargs
@@ -0,0 +1,4 @@
+bhyveload \
+-m 214 \
+-d /tmp/freebsd.img \
+bhyve
diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.xml 
b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.xml
new file mode 100644
index 0000000000..76f690a6d6
--- /dev/null
+++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-crb.xml
@@ -0,0 +1,28 @@
+<domain type='bhyve'>
+  <name>bhyve</name>
+  <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid>
+  <memory>219136</memory>
+  <vcpu>1</vcpu>
+  <os>
+    <type>hvm</type>
+  </os>
+  <devices>
+    <disk type='file'>
+      <driver name='file' type='raw'/>
+      <source file='/tmp/freebsd.img'/>
+      <target dev='hda' bus='sata'/>
+      <address type='drive' controller='0' bus='0' target='2' unit='0'/>
+    </disk>
+    <interface type='bridge'>
+      <mac address='52:54:00:b9:94:02'/>
+      <model type='virtio'/>
+      <source bridge="virbr0"/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' 
function='0x0'/>
+    </interface>
+    <tpm model='tpm-crb'>
+      <backend type='external'>
+        <source type='unix' mode='connect' path='/var/run/swtpm/tpm'/>
+      </backend>
+    </tpm>
+  </devices>
+</domain>
diff --git a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-invalid-model.xml 
b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-invalid-model.xml
new file mode 100644
index 0000000000..634aa4d9f1
--- /dev/null
+++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-invalid-model.xml
@@ -0,0 +1,16 @@
+<domain type='bhyve'>
+  <name>bhyve</name>
+  <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid>
+  <memory>219136</memory>
+  <vcpu>1</vcpu>
+  <os>
+    <type>hvm</type>
+  </os>
+  <devices>
+    <tpm model='tpm-tis'>
+      <backend type='external'>
+        <source type='unix' mode='connect' path='/var/run/swtpm/tpm'/>
+      </backend>
+    </tpm>
+  </devices>
+</domain>
diff --git 
a/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-multiple-devices.xml 
b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-multiple-devices.xml
new file mode 100644
index 0000000000..4a7160b695
--- /dev/null
+++ b/tests/bhyvexml2argvdata/x86_64/bhyvexml2argv-tpm-multiple-devices.xml
@@ -0,0 +1,21 @@
+<domain type='bhyve'>
+  <name>bhyve</name>
+  <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid>
+  <memory>219136</memory>
+  <vcpu>1</vcpu>
+  <os>
+    <type>hvm</type>
+  </os>
+  <devices>
+    <tpm>
+      <backend type='external'>
+        <source type='unix' mode='connect' path='/var/run/swtpm/tpm0'/>
+      </backend>
+    </tpm>
+    <tpm>
+      <backend type='external'>
+        <source type='unix' mode='connect' path='/var/run/swtpm/tpm1'/>
+      </backend>
+    </tpm>
+  </devices>
+</domain>
diff --git a/tests/bhyvexml2argvtest.c b/tests/bhyvexml2argvtest.c
index 58e6d11cec..679467fe72 100644
--- a/tests/bhyvexml2argvtest.c
+++ b/tests/bhyvexml2argvtest.c
@@ -311,6 +311,10 @@ mymain(void)
     DO_TEST_FAILURE("memtune-unsupported-params");
     DO_TEST("sysinfo-smbios");
     DO_TEST("tpm");
+    DO_TEST("tpm-crb");
+    DO_TEST_FAILURE("tpm-comma-path");
+    DO_TEST_FAILURE("tpm-invalid-model");
+    DO_TEST_FAILURE("tpm-multiple-devices");
     driver.bhyvecaps &= ~BHYVE_CAP_LPC_TPM;
     DO_TEST_FAILURE("tpm");
 
diff --git a/tests/bhyvexml2xmloutdata/x86_64/bhyvexml2xmlout-tpm.xml 
b/tests/bhyvexml2xmloutdata/x86_64/bhyvexml2xmlout-tpm.xml
new file mode 100644
index 0000000000..2a75a723db
--- /dev/null
+++ b/tests/bhyvexml2xmloutdata/x86_64/bhyvexml2xmlout-tpm.xml
@@ -0,0 +1,41 @@
+<domain type='bhyve'>
+  <name>bhyve</name>
+  <uuid>df3be7e7-a104-11e3-aeb0-50e5492bd3dc</uuid>
+  <memory unit='KiB'>219136</memory>
+  <currentMemory unit='KiB'>219136</currentMemory>
+  <vcpu placement='static'>1</vcpu>
+  <os>
+    <type arch='x86_64'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <disk type='file' device='disk'>
+      <driver name='file' type='raw'/>
+      <source file='/tmp/freebsd.img'/>
+      <target dev='hda' bus='sata'/>
+      <address type='drive' controller='0' bus='0' target='2' unit='0'/>
+    </disk>
+    <controller type='pci' index='0' model='pci-root'/>
+    <controller type='isa' index='0'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' 
function='0x0'/>
+    </controller>
+    <controller type='sata' index='0'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x02' 
function='0x0'/>
+    </controller>
+    <interface type='bridge'>
+      <mac address='52:54:00:b9:94:02'/>
+      <source bridge='virbr0'/>
+      <model type='virtio'/>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' 
function='0x0'/>
+    </interface>
+    <tpm model='tpm-crb'>
+      <backend type='external'>
+        <source type='unix' mode='connect' path='/var/run/swtpm/tpm'/>
+      </backend>
+    </tpm>
+  </devices>
+</domain>
diff --git a/tests/bhyvexml2xmltest.c b/tests/bhyvexml2xmltest.c
index 336278ce1c..be3459b200 100644
--- a/tests/bhyvexml2xmltest.c
+++ b/tests/bhyvexml2xmltest.c
@@ -155,6 +155,10 @@ mymain(void)
     DO_TEST_FAILURE("virtio-console-invalid-name");
     DO_TEST_FAILURE("virtio-console-invalid-path");
     DO_TEST_FAILURE("sata-disk-invalid-serial");
+    DO_TEST_DIFFERENT("tpm");
+    DO_TEST_FAILURE("tpm-comma-path");
+    DO_TEST_FAILURE("tpm-invalid-model");
+    DO_TEST_FAILURE("tpm-multiple-devices");
 
     /* Address allocation tests */
     DO_TEST_DIFFERENT("addr-single-sata-disk");
-- 
2.55.0

Reply via email to