[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 3/4] Qemu-Xen-vTPM: Qemu vTPM xenstubdoms driver.



On Sun, 2 Nov 2014, Quan Xu wrote:
> This driver provides vTPM initialization and sending data and TPM
> commends to a Xen stubdom vTPM domain.
    ^ commands

Driver for what? QEMU usually doesn't have drivers, QEMU has emulated
devices. Is this an emulated device? Is it supposed to be run inside the
stubdom?

Please add more description to the commit message. I should be able to
understand what you are doing before reading the patch. Reading code
changes is to make sure that the implementation details are correct. In
this case, I really don't know what you are trying to achieve yet.


> Signed-off-by: Quan Xu <quan.xu@xxxxxxxxx>
>
>  hw/tpm/Makefile.objs     |   1 +
>  hw/tpm/tpm_xenstubdoms.c | 238 
> +++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 239 insertions(+)
>  create mode 100644 hw/tpm/tpm_xenstubdoms.c
> 
> diff --git a/hw/tpm/Makefile.objs b/hw/tpm/Makefile.objs
> index 99f5983..39fc0f9 100644
> --- a/hw/tpm/Makefile.objs
> +++ b/hw/tpm/Makefile.objs
> @@ -1,2 +1,3 @@
>  common-obj-$(CONFIG_TPM_TIS) += tpm_tis.o
>  common-obj-$(CONFIG_TPM_PASSTHROUGH) += tpm_passthrough.o
> +common-obj-$(CONFIG_TPM_XENSTUBDOMS) += tpm_xenstubdoms.o
> diff --git a/hw/tpm/tpm_xenstubdoms.c b/hw/tpm/tpm_xenstubdoms.c
> new file mode 100644
> index 0000000..845df18
> --- /dev/null
> +++ b/hw/tpm/tpm_xenstubdoms.c
> @@ -0,0 +1,238 @@
> +/*
> + * Xen Stubdom vTPM driver
> + *
> + *  Copyright (c) 2014 Intel Corporation
> + *  Authors:
> + *    Quan Xu <quan.xu@xxxxxxxxx>
> + *
> + * 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;
> +    xen_vtpm_send(locty_data->w_buffer.buffer, locty_data->w_offset);
> +    xen_vtpm_recv(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.
> + *    */
> +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);
> +}
> +
> +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)
> -- 
> 1.8.3.2
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.