Re: [Qemu-devel] [v3 4/5] Qemu-Xen-vTPM: Qemu vTPM xenstubdoms backen.

2015-01-16 Thread Xu, Quan


 -Original Message-
 From: Stefan Berger [mailto:stef...@linux.vnet.ibm.com]
 Sent: Thursday, January 15, 2015 11:49 PM
 To: Xu, Quan; qemu-devel@nongnu.org
 Cc: stefano.stabell...@eu.citrix.com; xen-de...@lists.xen.org
 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 quan...@intel.com
  ---
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 000..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 quan...@intel.com
  + *
  + * 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

Re: [Qemu-devel] [v3 4/5] Qemu-Xen-vTPM: Qemu vTPM xenstubdoms backen.

2015-01-15 Thread Stefan Berger

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 quan...@intel.com
---
  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 000..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 quan...@intel.com
+ *
+ * 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