From patchwork Mon Apr 30 12:16:36 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefan Berger X-Patchwork-Id: 155851 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id E6018B6F62 for ; Mon, 30 Apr 2012 22:18:24 +1000 (EST) Received: from localhost ([::1]:60231 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SOpYc-0003xy-Nx for incoming@patchwork.ozlabs.org; Mon, 30 Apr 2012 08:18:22 -0400 Received: from eggs.gnu.org ([208.118.235.92]:40248) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SOpYL-0003hb-28 for qemu-devel@nongnu.org; Mon, 30 Apr 2012 08:18:06 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SOpYF-0005mz-Rj for qemu-devel@nongnu.org; Mon, 30 Apr 2012 08:18:04 -0400 Received: from e32.co.us.ibm.com ([32.97.110.150]:60492) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SOpYF-0005mp-IJ for qemu-devel@nongnu.org; Mon, 30 Apr 2012 08:17:59 -0400 Received: from /spool/local by e32.co.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 30 Apr 2012 06:17:57 -0600 Received: from d03dlp01.boulder.ibm.com (9.17.202.177) by e32.co.us.ibm.com (192.168.1.132) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Mon, 30 Apr 2012 06:17:19 -0600 Received: from d03relay05.boulder.ibm.com (d03relay05.boulder.ibm.com [9.17.195.107]) by d03dlp01.boulder.ibm.com (Postfix) with ESMTP id 2DB4E1FF004F for ; Mon, 30 Apr 2012 06:17:17 -0600 (MDT) Received: from d03av01.boulder.ibm.com (d03av01.boulder.ibm.com [9.17.195.167]) by d03relay05.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q3UCH5R5103728 for ; Mon, 30 Apr 2012 06:17:07 -0600 Received: from d03av01.boulder.ibm.com (loopback [127.0.0.1]) by d03av01.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q3UCH4LD021639 for ; Mon, 30 Apr 2012 06:17:04 -0600 Received: from d941e-5.watson.ibm.com (d941e-5.watson.ibm.com [9.59.241.149]) by d03av01.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id q3UCH3L6021620 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 30 Apr 2012 06:17:04 -0600 Received: from d941e-5.watson.ibm.com (localhost [127.0.0.1]) by d941e-5.watson.ibm.com (8.14.5/8.14.3) with ESMTP id q3UCH2XH000394; Mon, 30 Apr 2012 08:17:02 -0400 Received: (from root@localhost) by d941e-5.watson.ibm.com (8.14.5/8.14.5/Submit) id q3UCH1Wu000393; Mon, 30 Apr 2012 08:17:01 -0400 From: Stefan Berger To: stefanb@linux.vnet.ibm.com, qemu-devel@nongnu.org, anthony@codemonkey.ws Date: Mon, 30 Apr 2012 08:16:36 -0400 Message-Id: <1335788196-315-8-git-send-email-stefanb@linux.vnet.ibm.com> X-Mailer: git-send-email 1.7.6.5 In-Reply-To: <1335788196-315-1-git-send-email-stefanb@linux.vnet.ibm.com> References: <1335788196-315-1-git-send-email-stefanb@linux.vnet.ibm.com> X-Content-Scanned: Fidelis XPS MAILER x-cbid: 12043012-3270-0000-0000-000005EF81C1 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 32.97.110.150 Cc: andreas.niederl@iaik.tugraz.at, mst@redhat.com Subject: [Qemu-devel] [PATCH V16 7/7] Add fd parameter for TPM passthrough driver X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Enable the passing of a file descriptor via fd=<..> to access the host's TPM device using the TPM passthrough driver. Signed-off-by: Stefan Berger --- hw/tpm_passthrough.c | 61 ++++++++++++++++++++++++++++++++++++++----------- qemu-config.c | 5 ++++ qemu-options.hx | 11 ++++++-- 3 files changed, 60 insertions(+), 17 deletions(-) diff --git a/hw/tpm_passthrough.c b/hw/tpm_passthrough.c index 11980a8..a296048 100644 --- a/hw/tpm_passthrough.c +++ b/hw/tpm_passthrough.c @@ -306,30 +306,62 @@ static int tpm_passthrough_handle_device_opts(QemuOpts *opts, TPMBackend *tb) { const char *value; size_t bufsize; + struct stat statbuf; - value = qemu_opt_get(opts, "path"); - if (!value) { - value = TPM_PASSTHROUGH_DEFAULT_DEVICE; - } + value = qemu_opt_get(opts, "fd"); + if (value) { + if (qemu_opt_get(opts, "path")) { + error_report("fd= is invalid with path="); + goto err_exit; + } + + 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"); + goto err_exit; + } + + bufsize = sizeof("fd=") + sizeof(stringify(INT_MAX)) + 1; + + tb->parameters = g_malloc0(bufsize); + + snprintf(tb->parameters, bufsize, "fd=%d", tb->s.tpm_pt->tpm_fd); + } else { + value = qemu_opt_get(opts, "path"); + if (!value) { + value = TPM_PASSTHROUGH_DEFAULT_DEVICE; + } + + tb->s.tpm_pt->tpm_dev = g_strdup(value); - tb->s.tpm_pt->tpm_dev = g_strdup(value); + bufsize = sizeof("path=") + strlen(tb->s.tpm_pt->tpm_dev) + 1; - bufsize = sizeof("path=") + strlen(tb->s.tpm_pt->tpm_dev) + 1; + tb->parameters = g_malloc0(bufsize); - tb->parameters = g_malloc0(bufsize); + snprintf(tb->parameters, bufsize, "path=%s", tb->s.tpm_pt->tpm_dev); - snprintf(tb->parameters, bufsize, "path=%s", tb->s.tpm_pt->tpm_dev); + 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_free_parameters; + } + } + + if (fstat(tb->s.tpm_pt->tpm_fd, &statbuf) != 0) { + error_report("Cannot determine file descriptor type for TPM " + "device: %s", strerror(errno)); + goto err_close_tpmdev; + } - 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); + /* only allow character devices for now */ + if (!S_ISCHR(statbuf.st_mode)) { + error_report("TPM file descriptor is not a character device"); goto err_free_parameters; } if (tpm_passthrough_test_tpmdev(tb->s.tpm_pt->tpm_fd)) { - error_report("'%s' is not a TPM device.\n", - tb->s.tpm_pt->tpm_dev); + error_report("Device is not a TPM.\n"); goto err_close_tpmdev; } @@ -346,6 +378,7 @@ static int tpm_passthrough_handle_device_opts(QemuOpts *opts, TPMBackend *tb) g_free(tb->s.tpm_pt->tpm_dev); tb->s.tpm_pt->tpm_dev = NULL; + err_exit: return 1; } diff --git a/qemu-config.c b/qemu-config.c index edc8d5d..a5e2677 100644 --- a/qemu-config.c +++ b/qemu-config.c @@ -628,6 +628,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 */ } }, }; diff --git a/qemu-options.hx b/qemu-options.hx index b9920da..679a194 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -2008,8 +2008,9 @@ DEFHEADING() DEFHEADING(TPM device options:) DEF("tpmdev", HAS_ARG, QEMU_OPTION_tpmdev, \ - "-tpmdev passthrough,id=id[,path=path]\n" - " use path to provide path to a character device; default is /dev/tpm0\n", + "-tpmdev passthrough,id=id[,path=path][,fd=h]\n" + " use path to provide path to a character device; default is /dev/tpm0\n" + " use fd to provide a file descriptor to a character device\n", QEMU_ARCH_ALL) STEXI @@ -2031,7 +2032,7 @@ Use ? to print all available TPM backend types. 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. @@ -2040,6 +2041,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