[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v7 5/8] tmp backend: Add new api to read backend
From: |
Valluri, Amarnath |
Subject: |
Re: [Qemu-devel] [PATCH v7 5/8] tmp backend: Add new api to read backend TpmInfo |
Date: |
Mon, 25 Sep 2017 12:01:51 +0000 |
On Fri, 2017-09-22 at 17:35 +0200, Marc-André Lureau wrote:
> Hi
>
> On Fri, Sep 22, 2017 at 2:33 PM, Amarnath Valluri
> <address@hidden> wrote:
> >
> > TPM configuration options are backend implementation details and
> > shall not be
> > part of base TPMBackend object, and these shall not be accessed
> > directly outside
> > of the class, hence added a new interface method, get_tpm_options()
> > to
> > TPMDriverOps., which shall be implemented by the derived classes to
> > return
> > configured tpm options.
> >
> > A new tpm backend api - tpm_backend_query_tpm() which uses
> > _get_tpm_options() to
> > prepare TpmInfo.
> >
> > Signed-off-by: Amarnath Valluri <address@hidden>
> > Reviewed-by: Stefan Berger <address@hidden>
> > ---
> > backends/tpm.c | 22 +++++++++++++--
> > hmp.c | 7 ++---
> > hw/tpm/tpm_passthrough.c | 64 +++++++++++++++++++++++++++++++-
> > ------------
> > include/sysemu/tpm_backend.h | 25 +++++++++++++++--
> > tpm.c | 32 +---------------------
> > 5 files changed, 93 insertions(+), 57 deletions(-)
> >
> > diff --git a/backends/tpm.c b/backends/tpm.c
> > index c409a46..6ade9e4 100644
> > --- a/backends/tpm.c
> > +++ b/backends/tpm.c
> > @@ -138,6 +138,26 @@ TPMVersion
> > tpm_backend_get_tpm_version(TPMBackend *s)
> > return k->ops->get_tpm_version(s);
> > }
> >
> > +TpmTypeOptions *tpm_backend_get_tpm_options(TPMBackend *s)
> > +{
> > + TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
> > +
> > + assert(k->ops->get_tpm_options);
> > +
> > + return k->ops->get_tpm_options(s);
> > +}
> > +
> Why make this public API?
Yes, I agree no need of this API, i will remove this
>
> >
> > +TPMInfo *tpm_backend_query_tpm(TPMBackend *s)
> > +{
> > + TPMInfo *info = g_new0(TPMInfo, 1);
> > +
> > + info->id = g_strdup(s->id);
> > + info->model = s->fe_model;
> > + info->options = tpm_backend_get_tpm_options(s);
> Callback could be called directly from here.
>
> >
> > +
> > + return info;
> > +}
> > +
> > static bool tpm_backend_prop_get_opened(Object *obj, Error **errp)
> > {
> > TPMBackend *s = TPM_BACKEND(obj);
> > @@ -192,8 +212,6 @@ static void
> > tpm_backend_instance_finalize(Object *obj)
> > TPMBackend *s = TPM_BACKEND(obj);
> >
> > g_free(s->id);
> > - g_free(s->path);
> > - g_free(s->cancel_path);
> > tpm_backend_thread_end(s);
> > }
> >
> > diff --git a/hmp.c b/hmp.c
> > index 0fb2bc7..cf62b2e 100644
> > --- a/hmp.c
> > +++ b/hmp.c
> > @@ -31,6 +31,7 @@
> > #include "qapi/qmp/qerror.h"
> > #include "qapi/string-input-visitor.h"
> > #include "qapi/string-output-visitor.h"
> > +#include "qapi/util.h"
> > #include "qapi-visit.h"
> > #include "qom/object_interfaces.h"
> > #include "ui/console.h"
> > @@ -1012,10 +1013,10 @@ void hmp_info_tpm(Monitor *mon, const QDict
> > *qdict)
> > c, TpmModel_str(ti->model));
> >
> > monitor_printf(mon, " \\ %s: type=%s",
> > - ti->id, TpmTypeOptionsKind_str(ti->options-
> > >type));
> > + ti->id, TpmType_str(ti->options->type));
> >
> Why this change? It is still a TpmTypeOptionsKind no?
This is was issue with my rebase, i will fix.
>
> >
> > switch (ti->options->type) {
> > - case TPM_TYPE_OPTIONS_KIND_PASSTHROUGH:
> > + case TPM_TYPE_PASSTHROUGH:
> > tpo = ti->options->u.passthrough.data;
> > monitor_printf(mon, "%s%s%s%s",
> > tpo->has_path ? ",path=" : "",
> > @@ -1023,7 +1024,7 @@ void hmp_info_tpm(Monitor *mon, const QDict
> > *qdict)
> > tpo->has_cancel_path ? ",cancel-path="
> > : "",
> > tpo->has_cancel_path ? tpo->cancel_path
> > : "");
> > break;
> > - case TPM_TYPE_OPTIONS_KIND__MAX:
> > + case TPM_TYPE__MAX:
> > break;
> > }
> > monitor_printf(mon, "\n");
> > diff --git a/hw/tpm/tpm_passthrough.c b/hw/tpm/tpm_passthrough.c
> > index a0459a6..fb7dad8 100644
> > --- a/hw/tpm/tpm_passthrough.c
> > +++ b/hw/tpm/tpm_passthrough.c
> > @@ -49,7 +49,8 @@
> > struct TPMPassthruState {
> > TPMBackend parent;
> >
> > - char *tpm_dev;
> > + TPMPassthroughOptions *options;
> > + const char *tpm_dev;
> > int tpm_fd;
> > bool tpm_executing;
> > bool tpm_op_canceled;
> > @@ -308,15 +309,14 @@ static TPMVersion
> > tpm_passthrough_get_tpm_version(TPMBackend *tb)
> > * in Documentation/ABI/stable/sysfs-class-tpm.
> > * From /dev/tpm0 create /sys/class/misc/tpm0/device/cancel
> > */
> > -static int tpm_passthrough_open_sysfs_cancel(TPMBackend *tb)
> > +static int tpm_passthrough_open_sysfs_cancel(TPMPassthruState
> > *tpm_pt)
> I suspect this change could be done in an earlier/separate patch
I feel this change is better part of this commit as this is side effect
of rearragend tpm options, now these are part of TPMPasstrhuState so
_open_sysfs_cancel() need not work on TPMBackend.
>
> >
> > {
> > - TPMPassthruState *tpm_pt = TPM_PASSTHROUGH(tb);
> > int fd = -1;
> > char *dev;
> > char path[PATH_MAX];
> >
> > - if (tb->cancel_path) {
> > - fd = qemu_open(tb->cancel_path, O_WRONLY);
> > + if (tpm_pt->options->cancel_path) {
> > + fd = qemu_open(tpm_pt->options->cancel_path, O_WRONLY);
> > if (fd < 0) {
> > error_report("Could not open TPM cancel path : %s",
> > strerror(errno));
> > @@ -331,7 +331,7 @@ static int
> > tpm_passthrough_open_sysfs_cancel(TPMBackend *tb)
> > dev) < sizeof(path)) {
> > fd = qemu_open(path, O_WRONLY);
> > if (fd >= 0) {
> > - tb->cancel_path = g_strdup(path);
> > + tpm_pt->options->cancel_path = g_strdup(path);
> > } else {
> > error_report("tpm_passthrough: Could not open TPM
> > cancel "
> > "path %s : %s", path,
> > strerror(errno));
> > @@ -351,17 +351,18 @@ static int
> > tpm_passthrough_handle_device_opts(QemuOpts *opts, TPMBackend *tb)
> > const char *value;
> >
> > value = qemu_opt_get(opts, "cancel-path");
> > - tb->cancel_path = g_strdup(value);
> > + if (value) {
> > + tpm_pt->options->cancel_path = g_strdup(value);
> > + tpm_pt->options->has_cancel_path = true;
> > + }
> >
> > value = qemu_opt_get(opts, "path");
> > - if (!value) {
> > - value = TPM_PASSTHROUGH_DEFAULT_DEVICE;
> > + if (value) {
> > + tpm_pt->options->has_path = true;
> > + tpm_pt->options->path = g_strdup(value);
> > }
> >
> > - tpm_pt->tpm_dev = g_strdup(value);
> > -
> > - tb->path = g_strdup(tpm_pt->tpm_dev);
> > -
> > + tpm_pt->tpm_dev = value ? value :
> > TPM_PASSTHROUGH_DEFAULT_DEVICE;
> Isn't that duplicated with tpm_pt->options->path ? And different
> values...
This is intentional, options->path holds the configuration value, where
as tpm_dev points the real device path used.
>
> >
> > tpm_pt->tpm_fd = qemu_open(tpm_pt->tpm_dev, O_RDWR);
> > if (tpm_pt->tpm_fd < 0) {
> > error_report("Cannot access TPM device using '%s': %s",
> > @@ -382,10 +383,8 @@ static int
> > tpm_passthrough_handle_device_opts(QemuOpts *opts, TPMBackend *tb)
> > tpm_pt->tpm_fd = -1;
> >
> > err_free_parameters:
> > - g_free(tb->path);
> > - tb->path = NULL;
> > -
> > - g_free(tpm_pt->tpm_dev);
> > + qapi_free_TPMPassthroughOptions(tpm_pt->options);
> > + tpm_pt->options = NULL;
> > tpm_pt->tpm_dev = NULL;
> >
> > return 1;
> > @@ -403,7 +402,7 @@ static TPMBackend
> > *tpm_passthrough_create(QemuOpts *opts, const char *id)
> > goto err_exit;
> > }
> >
> > - tpm_pt->cancel_fd = tpm_passthrough_open_sysfs_cancel(tb);
> > + tpm_pt->cancel_fd = tpm_passthrough_open_sysfs_cancel(tpm_pt);
> > if (tpm_pt->cancel_fd < 0) {
> > goto err_exit;
> > }
> > @@ -416,6 +415,31 @@ err_exit:
> > return NULL;
> > }
> >
> > +static TpmTypeOptions *tpm_passthrough_get_tpm_options(TPMBackend
> > *tb)
> > +{
> > + TPMPassthruState *tpm_pt = TPM_PASSTHROUGH(tb);
> > + TpmTypeOptions *options = NULL;
> > + TPMPassthroughOptions *poptions = NULL;
> > +
> > + poptions = g_new0(TPMPassthroughOptions, 1);
> > +
> > + if (tpm_pt->options->has_path) {
> > + poptions->has_path = true;
> > + poptions->path = g_strdup(tpm_pt->options->path);
> > + }
> > +
> > + if (tpm_pt->options->has_cancel_path) {
> > + poptions->has_cancel_path = true;
> > + poptions->cancel_path = g_strdup(tpm_pt->options-
> > >cancel_path);
> > + }
> > +
> That looks like a job for QAPI_CLONE.
Ok, I was not knowing this, Thanks for pointing it. I will fix.
- Amarnath
- [Qemu-devel] [PATCH v7 0/8] Provide support for the software TPM emulator, Amarnath Valluri, 2017/09/22
- [Qemu-devel] [PATCH v7 4/8] tpm-backend: Made few interface methods optional, Amarnath Valluri, 2017/09/22
- [Qemu-devel] [PATCH v7 1/8] tpm-backend: Remove unneeded member variable from backend class, Amarnath Valluri, 2017/09/22
- [Qemu-devel] [PATCH v7 2/8] tpm-backend: Move thread handling inside TPMBackend, Amarnath Valluri, 2017/09/22
- [Qemu-devel] [PATCH v7 3/8] tpm-backend: Initialize and free data members in it's own methods, Amarnath Valluri, 2017/09/22
- [Qemu-devel] [PATCH v7 5/8] tmp backend: Add new api to read backend TpmInfo, Amarnath Valluri, 2017/09/22
- [Qemu-devel] [PATCH v7 6/8] tpm-backend: Move realloc_buffer() implementation to tpm-tis model, Amarnath Valluri, 2017/09/22
- [Qemu-devel] [PATCH v7 7/8] tpm-passthrough: move reusable code to utils, Amarnath Valluri, 2017/09/22
- [Qemu-devel] [PATCH v7 8/8] tpm: Added support for TPM emulator, Amarnath Valluri, 2017/09/22
- Re: [Qemu-devel] [PATCH v7 8/8] tpm: Added support for TPM emulator, Stefan Berger, 2017/09/22
- Re: [Qemu-devel] [PATCH v7 8/8] tpm: Added support for TPM emulator, Marc-André Lureau, 2017/09/24
- Re: [Qemu-devel] [PATCH v7 8/8] tpm: Added support for TPM emulator, Stefan Berger, 2017/09/24
- Re: [Qemu-devel] [PATCH v7 8/8] tpm: Added support for TPM emulator, Valluri, Amarnath, 2017/09/26
- Re: [Qemu-devel] [PATCH v7 8/8] tpm: Added support for TPM emulator, Marc-André Lureau, 2017/09/26
- Re: [Qemu-devel] [PATCH v7 8/8] tpm: Added support for TPM emulator, Valluri, Amarnath, 2017/09/26