From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stefan Berger Subject: Re: [Qemu-devel] [PATCH v5 4/6] Qemu-Xen-vTPM: Qemu vTPM xenstubdoms backen. Date: Wed, 15 Apr 2015 10:50:01 -0400 Message-ID: <552E7A99.8010805__25224.4793497541$1429109596$gmane$org@linux.vnet.ibm.com> References: <1428649159-30879-1-git-send-email-quan.xu@intel.com> <1428649159-30879-5-git-send-email-quan.xu@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1428649159-30879-5-git-send-email-quan.xu@intel.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Quan Xu , stefano.stabellini@eu.citrix.com, eblake@redhat.com Cc: wei.liu2@citrix.com, qemu-devel@nongnu.org, xen-devel@lists.xen.org, aliguori@amazon.com, pbonzini@redhat.com, dgdegra@tycho.nsa.gov List-Id: xen-devel@lists.xenproject.org On 04/10/2015 02:59 AM, Quan Xu wrote: > This Patch provides the glue for the TPM_TIS(Qemu frontend) to Xen > stubdom vTPM domain that provides the actual TPM functionality. It > sends data and TPM commends with xen_vtpm_frontend. It is similar as > another two vTPM backens: > *vTPM passthrough backen Since QEMU 1.5. > *vTPM libtpms-based backen. > > Some details: > This part of the patch provides support for the spawning of a thread > that will interact with stubdom vTPM domain by the xen_vtpm_frontend. > It expects a signal from the frontend to wake and pick up the TPM > command that is supposed to be processed and delivers the response > packet using a callback function provided by the frontend. > > The backend connects itself to the frontend by filling out an interface > structure with pointers to the function implementing support for various > operations. > > (QEMU) vTPM XenStubdoms backen is initialized by Qemu command line options, > "-tpmdev xenstubdoms,id=xenvtpm0 -device tpm-tis,tpmdev=xenvtpm0" > > Signed-off-by: Quan Xu > > --Changes in v5: > -comments enhancement. > --- > hw/tpm/Makefile.objs | 2 +- > hw/tpm/tpm_xenstubdoms.c | 256 +++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 257 insertions(+), 1 deletion(-) > create mode 100644 hw/tpm/tpm_xenstubdoms.c > > diff --git a/hw/tpm/Makefile.objs b/hw/tpm/Makefile.objs > index 57919fa..190e776 100644 > --- a/hw/tpm/Makefile.objs > +++ b/hw/tpm/Makefile.objs > @@ -1,3 +1,3 @@ > common-obj-$(CONFIG_TPM_TIS) += tpm_tis.o > common-obj-$(CONFIG_TPM_PASSTHROUGH) += tpm_passthrough.o > -common-obj-$(CONFIG_TPM_XENSTUBDOMS) += xen_vtpm_frontend.o > +common-obj-$(CONFIG_TPM_XENSTUBDOMS) += tpm_xenstubdoms.o xen_vtpm_frontend.o > diff --git a/hw/tpm/tpm_xenstubdoms.c b/hw/tpm/tpm_xenstubdoms.c > new file mode 100644 > index 0000000..3d046fc > --- /dev/null > +++ b/hw/tpm/tpm_xenstubdoms.c > @@ -0,0 +1,256 @@ > +/* > + * Xen Stubdom vTPM driver > + * > + * Copyright (c) 2015 Intel Corporation > + * Authors: > + * Quan Xu > + * > + * This library is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public > + * License as published by the Free Software Foundation; either > + * version 2 of the License, or (at your option) any later version. > + * > + * This library is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with this library; if not, see > + */ > + > +#include > +#include "qemu-common.h" > +#include "qapi/error.h" > +#include "qemu/sockets.h" > +#include "qemu/log.h" > +#include "sysemu/tpm_backend.h" > +#include "tpm_int.h" > +#include "hw/hw.h" > +#include "hw/i386/pc.h" > +#include "hw/xen/xen_backend.h" > +#include "sysemu/tpm_backend_int.h" > +#include "tpm_tis.h" > + > +#ifdef DEBUG_TPM > +#define DPRINTF(fmt, ...) \ > + do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0) > +#else > +#define DPRINTF(fmt, ...) \ > + do { } while (0) > +#endif > + > +#define TYPE_TPM_XENSTUBDOMS "tpm-xenstubdoms" > +#define TPM_XENSTUBDOMS(obj) \ > + OBJECT_CHECK(TPMXenstubdomsState, (obj), TYPE_TPM_XENSTUBDOMS) > + > +static const TPMDriverOps tpm_xenstubdoms_driver; > + > +/* Data structures */ > +typedef struct TPMXenstubdomsThreadParams { > + TPMState *tpm_state; > + TPMRecvDataCB *recv_data_callback; > + TPMBackend *tb; > +} TPMXenstubdomsThreadParams; > + > +struct TPMXenstubdomsState { > + TPMBackend parent; > + TPMBackendThread tbt; > + TPMXenstubdomsThreadParams tpm_thread_params; > + bool had_startup_error; > +}; > + > +typedef struct TPMXenstubdomsState TPMXenstubdomsState; > + > +/* Functions */ > +static void tpm_xenstubdoms_cancel_cmd(TPMBackend *tb); > + > +static int tpm_xenstubdoms_unix_transfer(const TPMLocality *locty_data) > +{ > + size_t rlen; > + struct XenDevice *xendev; > + int ret; > + > + xendev = xen_find_xendev("vtpm", xen_domid, xenstore_dev); > + if (xendev == NULL) { > + xen_be_printf(xendev, 0, "Can not find vtpm device.\n"); > + return -1; > + } > + > + ret = vtpm_send(xendev, locty_data->w_buffer.buffer, > + locty_data->r_buffer.size, locty_data->w_offset); > + if (ret < 0) { > + xen_be_printf(xendev, 0, "Can not send vtpm command.\n"); > + return -1; > + } > + > + vtpm_recv(xendev, locty_data->r_buffer.buffer, locty_data->r_buffer.size, > + &rlen); > + return 0; > +} > + > +static void tpm_xenstubdoms_worker_thread(gpointer data, > + gpointer user_data) > +{ > + TPMXenstubdomsThreadParams *thr_parms = user_data; > + TPMBackendCmd cmd = (TPMBackendCmd)data; > + > + switch (cmd) { > + case TPM_BACKEND_CMD_PROCESS_CMD: > + tpm_xenstubdoms_unix_transfer(thr_parms->tpm_state->locty_data); > + thr_parms->recv_data_callback(thr_parms->tpm_state, > + thr_parms->tpm_state->locty_number, > + false); Didn't look at this before. I still think you should reorder the patches. Rest looks good. Stefan