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(a)gmail.com>
Reviewed-by: Stefan Berger <stefanb(a)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;