From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:54105) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RDgCg-0006X5-7L for qemu-devel@nongnu.org; Tue, 11 Oct 2011 13:33:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RDgCa-000119-LR for qemu-devel@nongnu.org; Tue, 11 Oct 2011 13:33:21 -0400 Received: from e7.ny.us.ibm.com ([32.97.182.137]:38146) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RDgCa-00010u-C4 for qemu-devel@nongnu.org; Tue, 11 Oct 2011 13:33:16 -0400 Received: from d01relay04.pok.ibm.com (d01relay04.pok.ibm.com [9.56.227.236]) by e7.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id p9BGBjcY000770 for ; Tue, 11 Oct 2011 12:11:45 -0400 Received: from d03av03.boulder.ibm.com (d03av03.boulder.ibm.com [9.17.195.169]) by d01relay04.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p9BHXCJZ240070 for ; Tue, 11 Oct 2011 13:33:13 -0400 Received: from d03av03.boulder.ibm.com (loopback [127.0.0.1]) by d03av03.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p9BHX8Yd013705 for ; Tue, 11 Oct 2011 11:33:09 -0600 Message-Id: <20111011173307.695181543@linux.vnet.ibm.com> Date: Tue, 11 Oct 2011 13:32:24 -0400 From: Stefan Berger References: <20111011173216.247822737@linux.vnet.ibm.com> Content-Disposition: inline; filename=qemu_tpm_passthru_fd.diff Subject: [Qemu-devel] [PATCH V12 8/8] Add fd parameter for TPM passthrough driver List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: stefanb@linux.vnet.ibm.com, qemu-devel@nongnu.org Cc: mst@redhat.com, andreas.niederl@iaik.tugraz.at, serge@hallyn.com Enable the passing of a file descriptor via fd=<..> to access the host's TPM device using the TPM passthrough driver. v12: - added documentation part Signed-off-by: Stefan Berger --- hw/tpm_passthrough.c | 74 +++++++++++++++++++++++++++++++++------------------ qemu-config.c | 5 +++ qemu-options.hx | 6 +++- 3 files changed, 58 insertions(+), 27 deletions(-) Index: qemu-git.pt/qemu-config.c =================================================================== --- qemu-git.pt.orig/qemu-config.c +++ qemu-git.pt/qemu-config.c @@ -523,6 +523,11 @@ static QemuOptsList qemu_tpmdev_opts = { .type = QEMU_OPT_STRING, .help = "Persistent storage for TPM state", }, + { + .name = "fd", + .type = QEMU_OPT_STRING, + .help = "Filedescriptor for accessing the TPM", + }, { /* end of list */ } }, }; Index: qemu-git.pt/hw/tpm_passthrough.c =================================================================== --- qemu-git.pt.orig/hw/tpm_passthrough.c +++ qemu-git.pt/hw/tpm_passthrough.c @@ -362,32 +362,54 @@ static int tpm_passthrough_handle_device char buf[64]; int n; - value = qemu_opt_get(opts, "path"); - if (!value) { - value = TPM_PASSTHROUGH_DEFAULT_DEVICE; - } - - n = snprintf(tb->s.tpm_pt->tpm_dev, sizeof(tb->s.tpm_pt->tpm_dev), - "%s", value); - - if (n >= sizeof(tb->s.tpm_pt->tpm_dev)) { - error_report("TPM device path is too long.\n"); - goto err_exit; - } - - snprintf(buf, sizeof(buf), "path=%s", tb->s.tpm_pt->tpm_dev); - - tb->parameters = g_strdup(buf); - - if (tb->parameters == NULL) { - return 1; - } - - tb->s.tpm_pt->tpm_fd = open(tb->s.tpm_pt->tpm_dev, O_RDWR); - if (tb->s.tpm_pt->tpm_fd < 0) { - error_report("Cannot access TPM device using '%s'.\n", - tb->s.tpm_pt->tpm_dev); - goto err_exit; + value = qemu_opt_get(opts, "fd"); + if (value) { + if (qemu_opt_get(opts, "path")) { + error_report("fd= is invalid with path="); + return -1; + } + + tb->s.tpm_pt->tpm_fd = qemu_parse_fd(value); + if (tb->s.tpm_pt->tpm_fd < 0) { + error_report("Illegal file descriptor for TPM device.\n"); + return -1; + } + + snprintf(buf, sizeof(buf), "fd=%d", tb->s.tpm_pt->tpm_fd); + + tb->parameters = g_strdup(buf); + + if (tb->parameters == NULL) { + goto err_close_tpmdev; + } + } else { + value = qemu_opt_get(opts, "path"); + if (!value) { + value = TPM_PASSTHROUGH_DEFAULT_DEVICE; + } + + n = snprintf(tb->s.tpm_pt->tpm_dev, sizeof(tb->s.tpm_pt->tpm_dev), + "%s", value); + + if (n >= sizeof(tb->s.tpm_pt->tpm_dev)) { + error_report("TPM device path is too long.\n"); + goto err_exit; + } + + snprintf(buf, sizeof(buf), "path=%s", tb->s.tpm_pt->tpm_dev); + + tb->parameters = g_strdup(buf); + + if (tb->parameters == NULL) { + return 1; + } + + tb->s.tpm_pt->tpm_fd = open(tb->s.tpm_pt->tpm_dev, O_RDWR); + if (tb->s.tpm_pt->tpm_fd < 0) { + error_report("Cannot access TPM device using '%s'.\n", + tb->s.tpm_pt->tpm_dev); + goto err_exit; + } } if (tpm_passthrough_test_tpmdev(tb->s.tpm_pt->tpm_fd)) { Index: qemu-git.pt/qemu-options.hx =================================================================== --- qemu-git.pt.orig/qemu-options.hx +++ qemu-git.pt/qemu-options.hx @@ -1789,7 +1789,7 @@ Use ? to print all available TPM backend qemu -tpmdev ? @end example -@item -tpmdev passthrough, id=@var{id}, path=@var{path} +@item -tpmdev passthrough, id=@var{id}, path=@var{path}, fd=@var{h} (Linux-host only) Enable access to the host's TPM using the passthrough driver. @@ -1798,6 +1798,10 @@ driver. a Linux host this would be @code{/dev/tpm0}. @option{path} is optional and by default @code{/dev/tpm0} is used. +@option{fd} specifies the file descriptor of the host's TPM device. +@option{fd} and @option{path} are mutually exclusive. +@option{fd} is optional. + Some notes about using the host's TPM with the passthrough driver: The TPM device accessed by the passthrough driver must not be