[PATCH v2 6/8] qemu: build command line for the TPM Proxy device

Daniel Henrique Barboza posted 8 patches 4 years, 6 months ago
There is a newer version of this series
[PATCH v2 6/8] qemu: build command line for the TPM Proxy device
Posted by Daniel Henrique Barboza 4 years, 6 months ago
This patch wraps it up all the wiring done in previous patches,
enabling a PPC64 guest to launch a guest using a TPM Proxy
device.

Note that device validation is already being done in qemu_validate.c,
qemuValidateDomainDeviceDefTPM(), on domain define time. We don't
need to verify QEMU capabilities for this device again inside
qemu_command.c.

Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
---
 src/qemu/qemu_alias.c   | 16 ++++++++++++++++
 src/qemu/qemu_command.c | 21 +++++++++++++++++++++
 2 files changed, 37 insertions(+)

diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c
index b0ea62af39..08fe5aa501 100644
--- a/src/qemu/qemu_alias.c
+++ b/src/qemu/qemu_alias.c
@@ -413,6 +413,18 @@ qemuAssignDeviceTPMAlias(virDomainTPMDefPtr tpm,
 }
 
 
+static int
+qemuAssignDeviceTPMProxyAlias(virDomainTPMDefPtr tpmproxy,
+                              int idx)
+{
+    if (tpmproxy->info.alias)
+        return 0;
+
+    tpmproxy->info.alias = g_strdup_printf("tpmproxy%d", idx);
+    return 0;
+}
+
+
 int
 qemuAssignDeviceRedirdevAlias(virDomainDefPtr def,
                               virDomainRedirdevDefPtr redirdev,
@@ -673,6 +685,10 @@ qemuAssignDeviceAliases(virDomainDefPtr def, virQEMUCapsPtr qemuCaps)
         if (qemuAssignDeviceTPMAlias(def->tpm, 0) < 0)
             return -1;
     }
+    if (def->tpmproxy) {
+        if (qemuAssignDeviceTPMProxyAlias(def->tpmproxy, 0) < 0)
+            return -1;
+    }
     for (i = 0; i < def->nmems; i++) {
         if (qemuAssignDeviceMemoryAlias(NULL, def->mems[i], false) < 0)
             return -1;
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index bfe70ed228..0b97db7388 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -8981,6 +8981,24 @@ qemuBuildTPMCommandLine(virCommandPtr cmd,
     return 0;
 }
 
+static int
+qemuBuildTPMProxyCommandLine(virCommandPtr cmd,
+                             const virDomainDef *def)
+{
+    const virDomainTPMDef *tpmproxy = def->tpmproxy;
+
+    if (!tpmproxy)
+        return 0;
+
+    virCommandAddArg(cmd, "-device");
+    virCommandAddArgFormat(cmd, "%s,id=%s,host-path=%s",
+                           virDomainTPMModelTypeToString(tpmproxy->model),
+                           tpmproxy->info.alias,
+                           tpmproxy->data.passthrough.source.data.file.path);
+
+    return 0;
+}
+
 static int
 qemuBuildSEVCommandLine(virDomainObjPtr vm, virCommandPtr cmd,
                         virDomainSEVDefPtr sev)
@@ -9662,6 +9680,9 @@ qemuBuildCommandLine(virQEMUDriverPtr driver,
     if (qemuBuildTPMCommandLine(cmd, def, qemuCaps) < 0)
         return NULL;
 
+    if (qemuBuildTPMProxyCommandLine(cmd, def) < 0)
+        return NULL;
+
     if (qemuBuildInputCommandLine(cmd, def, qemuCaps) < 0)
         return NULL;
 
-- 
2.26.2

Re: [PATCH v2 6/8] qemu: build command line for the TPM Proxy device
Posted by Stefan Berger 4 years, 6 months ago
On 5/13/20 10:10 AM, Daniel Henrique Barboza wrote:
> This patch wraps it up all the wiring done in previous patches,
> enabling a PPC64 guest to launch a guest using a TPM Proxy
> device.
>
> Note that device validation is already being done in qemu_validate.c,
> qemuValidateDomainDeviceDefTPM(), on domain define time. We don't
> need to verify QEMU capabilities for this device again inside
> qemu_command.c.
>
> Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>

Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>


> ---
>   src/qemu/qemu_alias.c   | 16 ++++++++++++++++
>   src/qemu/qemu_command.c | 21 +++++++++++++++++++++
>   2 files changed, 37 insertions(+)
>
> diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c
> index b0ea62af39..08fe5aa501 100644
> --- a/src/qemu/qemu_alias.c
> +++ b/src/qemu/qemu_alias.c
> @@ -413,6 +413,18 @@ qemuAssignDeviceTPMAlias(virDomainTPMDefPtr tpm,
>   }
>   
>   
> +static int
> +qemuAssignDeviceTPMProxyAlias(virDomainTPMDefPtr tpmproxy,
> +                              int idx)
> +{
> +    if (tpmproxy->info.alias)
> +        return 0;
> +
> +    tpmproxy->info.alias = g_strdup_printf("tpmproxy%d", idx);
> +    return 0;
> +}
> +
> +
>   int
>   qemuAssignDeviceRedirdevAlias(virDomainDefPtr def,
>                                 virDomainRedirdevDefPtr redirdev,
> @@ -673,6 +685,10 @@ qemuAssignDeviceAliases(virDomainDefPtr def, virQEMUCapsPtr qemuCaps)
>           if (qemuAssignDeviceTPMAlias(def->tpm, 0) < 0)
>               return -1;
>       }
> +    if (def->tpmproxy) {
> +        if (qemuAssignDeviceTPMProxyAlias(def->tpmproxy, 0) < 0)
> +            return -1;
> +    }
>       for (i = 0; i < def->nmems; i++) {
>           if (qemuAssignDeviceMemoryAlias(NULL, def->mems[i], false) < 0)
>               return -1;
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index bfe70ed228..0b97db7388 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -8981,6 +8981,24 @@ qemuBuildTPMCommandLine(virCommandPtr cmd,
>       return 0;
>   }
>   
> +static int
> +qemuBuildTPMProxyCommandLine(virCommandPtr cmd,
> +                             const virDomainDef *def)
> +{
> +    const virDomainTPMDef *tpmproxy = def->tpmproxy;
> +
> +    if (!tpmproxy)
> +        return 0;
> +
> +    virCommandAddArg(cmd, "-device");
> +    virCommandAddArgFormat(cmd, "%s,id=%s,host-path=%s",
> +                           virDomainTPMModelTypeToString(tpmproxy->model),
> +                           tpmproxy->info.alias,
> +                           tpmproxy->data.passthrough.source.data.file.path);
> +
> +    return 0;
> +}
> +
>   static int
>   qemuBuildSEVCommandLine(virDomainObjPtr vm, virCommandPtr cmd,
>                           virDomainSEVDefPtr sev)
> @@ -9662,6 +9680,9 @@ qemuBuildCommandLine(virQEMUDriverPtr driver,
>       if (qemuBuildTPMCommandLine(cmd, def, qemuCaps) < 0)
>           return NULL;
>   
> +    if (qemuBuildTPMProxyCommandLine(cmd, def) < 0)
> +        return NULL;
> +
>       if (qemuBuildInputCommandLine(cmd, def, qemuCaps) < 0)
>           return NULL;
>