[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [v3 4/5] Qemu-Xen-vTPM: Qemu vTPM xenstubdoms backen.
From: |
Xu, Quan |
Subject: |
Re: [Qemu-devel] [v3 4/5] Qemu-Xen-vTPM: Qemu vTPM xenstubdoms backen. |
Date: |
Fri, 16 Jan 2015 15:36:46 +0000 |
> -----Original Message-----
> From: Stefan Berger [mailto:address@hidden
> Sent: Thursday, January 15, 2015 11:49 PM
> To: Xu, Quan; address@hidden
> Cc: address@hidden; address@hidden
> Subject: Re: [Qemu-devel] [v3 4/5] Qemu-Xen-vTPM: Qemu vTPM xenstubdoms
> backen.
>
> On 12/30/2014 06:03 PM, 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"
> >
> > --Changes in v3:
> > -Call vtpm_send() and vtpm_recv() directly.
> >
> > Signed-off-by: Quan Xu <address@hidden>
> > ---
> > hw/tpm/Makefile.objs | 2 +-
> > hw/tpm/tpm_xenstubdoms.c | 245
> +++++++++++++++++++++++++++++++++++++++++++++++
> > 2 files changed, 246 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..98ea496
> > --- /dev/null
> > +++ b/hw/tpm/tpm_xenstubdoms.c
> > @@ -0,0 +1,245 @@
> > +/*
> > + * Xen Stubdom vTPM driver
> > + *
> > + * Copyright (c) 2014 Intel Corporation
> > + * Authors:
> > + * Quan Xu <address@hidden>
> > + *
> > + * 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
> > +<http://www.gnu.org/licenses/> */
> > +
> > +#include <dirent.h>
> > +#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;
> > +
> > + xendev = xen_be_find_xendev("vtpm", xen_domid, 0);
> > + if (xendev == NULL) {
> > + xen_be_printf(xendev, 0, "Con not find vtpm device\n");
> > + return -1;
> > + }
> > + vtpm_send(xendev, locty_data->w_buffer.buffer,
> locty_data->w_offset);
> > + vtpm_recv(xendev, locty_data->r_buffer.buffer, &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:
> > + /* here need a the cmd process function */
> > +
> 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);
> > + break;
> > + case TPM_BACKEND_CMD_INIT:
> > + case TPM_BACKEND_CMD_END:
> > + case TPM_BACKEND_CMD_TPM_RESET:
> > + /* nothing to do */
> > + break;
> > + }
> > +}
> > +
> > +/*
> > + * * Start the TPM (thread). If it had been started before, then terminate
> > + * * and start it again.
> > + * */
>
> Can you fix the comment style?
Stefan,
Thanks, I appreciate your review. I will fix it in v4 .
>
> > +static int tpm_xenstubdoms_startup_tpm(TPMBackend *tb) {
> > + TPMXenstubdomsState *tpm_xs = TPM_XENSTUBDOMS(tb);
> > +
> > + tpm_backend_thread_tpm_reset(&tpm_xs->tbt,
> tpm_xenstubdoms_worker_thread,
> > + &tpm_xs->tpm_thread_params);
> > +
> > + return 0;
> > +}
> > +
> > +static void tpm_xenstubdoms_reset(TPMBackend *tb) {
> > + TPMXenstubdomsState *tpm_xs = TPM_XENSTUBDOMS(tb);
> > +
> > + tpm_backend_thread_end(&tpm_xs->tbt);
> > + tpm_xs->had_startup_error = false; }
> > +
> > +static int tpm_xenstubdoms_init(TPMBackend *tb, TPMState *s,
> > + TPMRecvDataCB *recv_data_cb) {
> > + TPMXenstubdomsState *tpm_xs = TPM_XENSTUBDOMS(tb);
> > +
> > + tpm_xs->tpm_thread_params.tpm_state = s;
> > + tpm_xs->tpm_thread_params.recv_data_callback = recv_data_cb;
> > + tpm_xs->tpm_thread_params.tb = tb;
> > + return 0;
> > +}
> > +
> > +static bool tpm_xenstubdoms_get_tpm_established_flag(TPMBackend *tb)
> > +{
> > + return false;
> > +}
> > +
> > +static bool tpm_xenstubdoms_get_startup_error(TPMBackend *tb) {
> > + TPMXenstubdomsState *tpm_xs = TPM_XENSTUBDOMS(tb);
> > +
> > + return tpm_xs->had_startup_error; }
> > +
> > +static size_t tpm_xenstubdoms_realloc_buffer(TPMSizedBuffer *sb) {
> > + size_t wanted_size = 4096; /* Linux tpm.c buffer size */
> > +
> > + if (sb->size != wanted_size) {
> > + sb->buffer = g_realloc(sb->buffer, wanted_size);
> > + sb->size = wanted_size;
> > + }
> > + return sb->size;
> > +}
> > +
> > +static void tpm_xenstubdoms_deliver_request(TPMBackend *tb) {
> > + TPMXenstubdomsState *tpm_xs = TPM_XENSTUBDOMS(tb);
> > + tpm_backend_thread_deliver_request(&tpm_xs->tbt);
> > +}
>
> Add empty line between var. decl and command.
Okay, I will add it in v4.
-Quan
>
> > +
> > +static void tpm_xenstubdoms_cancel_cmd(TPMBackend *tb) { }
> > +
> > +static const char *tpm_xenstubdoms_create_desc(void)
> > +{
> > + return "Xenstubdoms TPM backend driver"; }
> > +
> > +static TPMBackend *tpm_xenstubdoms_create(QemuOpts *opts, const char
> > +*id) {
> > + Object *obj = object_new(TYPE_TPM_XENSTUBDOMS);
> > + TPMBackend *tb = TPM_BACKEND(obj);
> > +
> > + tb->id = g_strdup(id);
> > + tb->fe_model = -1;
> > + tb->ops = &tpm_xenstubdoms_driver;
> > + return tb;
> > +}
> > +
> > +static void tpm_xenstubdoms_destroy(TPMBackend *tb) {
> > + TPMXenstubdomsState *tpm_xh = TPM_XENSTUBDOMS(tb);
> > + tpm_backend_thread_end(&tpm_xh->tbt);
> > +
> > + g_free(tb->id);
> > +}
> > +
> > +static const QemuOptDesc tpm_xenstubdoms_cmdline_opts[] = {
> > + TPM_STANDARD_CMDLINE_OPTS,
> > + {},
> > +};
> > +
> > +static const TPMDriverOps tpm_xenstubdoms_driver = {
> > + .type = TPM_TYPE_XENSTUBDOMS,
> > + .opts = tpm_xenstubdoms_cmdline_opts,
> > + .desc = tpm_xenstubdoms_create_desc,
> > + .create = tpm_xenstubdoms_create,
> > + .destroy = tpm_xenstubdoms_destroy,
> > + .init = tpm_xenstubdoms_init,
> > + .startup_tpm = tpm_xenstubdoms_startup_tpm,
> > + .realloc_buffer = tpm_xenstubdoms_realloc_buffer,
> > + .reset = tpm_xenstubdoms_reset,
> > + .had_startup_error = tpm_xenstubdoms_get_startup_error,
> > + .deliver_request = tpm_xenstubdoms_deliver_request,
> > + .cancel_cmd = tpm_xenstubdoms_cancel_cmd,
> > + .get_tpm_established_flag =
> > +tpm_xenstubdoms_get_tpm_established_flag,
> > +};
> > +
> > +static void tpm_xenstubdoms_inst_init(Object *obj) { }
> > +
> > +static void tpm_xenstubdoms_inst_finalize(Object *obj) { }
> > +
> > +static void tpm_xenstubdoms_class_init(ObjectClass *klass, void
> > +*data) {
> > + TPMBackendClass *tbc = TPM_BACKEND_CLASS(klass);
> > + tbc->ops = &tpm_xenstubdoms_driver; }
> > +
> > +static const TypeInfo tpm_xenstubdoms_info = {
> > + .name = TYPE_TPM_XENSTUBDOMS,
> > + .parent = TYPE_TPM_BACKEND,
> > + .instance_size = sizeof(TPMXenstubdomsState),
> > + .class_init = tpm_xenstubdoms_class_init,
> > + .instance_init = tpm_xenstubdoms_inst_init,
> > + .instance_finalize = tpm_xenstubdoms_inst_finalize, };
> > +
> > +static void tpm_xenstubdoms_register(void) {
> > + type_register_static(&tpm_xenstubdoms_info);
> > + tpm_register_driver(&tpm_xenstubdoms_driver);
> > +}
> > +
> > +type_init(tpm_xenstubdoms_register)
>
> Stefan