From nobody Wed Nov 5 18:21:34 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1496667014250172.2889958250638; Mon, 5 Jun 2017 05:50:14 -0700 (PDT) Received: from localhost ([::1]:33177 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dHrSV-0001DQ-Ls for importer@patchew.org; Mon, 05 Jun 2017 08:50:11 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43118) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dHrN6-0004rO-Ax for qemu-devel@nongnu.org; Mon, 05 Jun 2017 08:44:39 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dHrN4-0001DR-De for qemu-devel@nongnu.org; Mon, 05 Jun 2017 08:44:36 -0400 Received: from mga07.intel.com ([134.134.136.100]:29413) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1dHrN4-00019b-1l for qemu-devel@nongnu.org; Mon, 05 Jun 2017 08:44:34 -0400 Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP; 05 Jun 2017 05:44:33 -0700 Received: from avallurigigabyte.fi.intel.com ([10.237.72.170]) by orsmga002.jf.intel.com with ESMTP; 05 Jun 2017 05:44:31 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.39,300,1493708400"; d="scan'208";a="95699351" From: Amarnath Valluri To: qemu-devel@nongnu.org Date: Mon, 5 Jun 2017 15:45:08 +0300 Message-Id: <1496666711-14630-6-git-send-email-amarnath.valluri@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1496666711-14630-1-git-send-email-amarnath.valluri@intel.com> References: <1496666711-14630-1-git-send-email-amarnath.valluri@intel.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 134.134.136.100 Subject: [Qemu-devel] [PATCH v5 5/8] tmp backend: Add new api to read backend TpmInfo X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Amarnath Valluri , marcandre.lureau@gmail.com Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" TPM configuration options are backend implementation details and shall not = be part of base TPMBackend object, and these shall not be accessed directly ou= tside 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 Reviewed-by: Stefan Berger --- backends/tpm.c | 22 +++++++++++++-- hmp.c | 6 ++--- hw/tpm/tpm_passthrough.c | 64 ++++++++++++++++++++++++++++++++++++----= ---- include/sysemu/tpm_backend.h | 25 +++++++++++++++-- tpm.c | 32 +--------------------- 5 files changed, 100 insertions(+), 49 deletions(-) diff --git a/backends/tpm.c b/backends/tpm.c index 05002e6..4ae6129 100644 --- a/backends/tpm.c +++ b/backends/tpm.c @@ -131,6 +131,26 @@ TPMVersion tpm_backend_get_tpm_version(TPMBackend *s) return k->ops->get_tpm_version(s); } =20 +TpmTypeOptions *tpm_backend_get_tpm_options(TPMBackend *s) +{ + TPMBackendClass *k =3D TPM_BACKEND_GET_CLASS(s); + + assert(k->ops->get_tpm_options); + + return k->ops->get_tpm_options(s); +} + +TPMInfo *tpm_backend_query_tpm(TPMBackend *s) +{ + TPMInfo *info =3D g_new0(TPMInfo, 1); + + info->id =3D g_strdup(s->id); + info->model =3D s->fe_model; + info->options =3D tpm_backend_get_tpm_options(s); + + return info; +} + static bool tpm_backend_prop_get_opened(Object *obj, Error **errp) { TPMBackend *s =3D TPM_BACKEND(obj); @@ -185,8 +205,6 @@ static void tpm_backend_instance_finalize(Object *obj) TPMBackend *s =3D TPM_BACKEND(obj); =20 g_free(s->id); - g_free(s->path); - g_free(s->cancel_path); tpm_backend_thread_end(s); } =20 diff --git a/hmp.c b/hmp.c index 524e589..9338938 100644 --- a/hmp.c +++ b/hmp.c @@ -956,10 +956,10 @@ void hmp_info_tpm(Monitor *mon, const QDict *qdict) c, TpmModel_lookup[ti->model]); =20 monitor_printf(mon, " \\ %s: type=3D%s", - ti->id, TpmTypeOptionsKind_lookup[ti->options->type= ]); + ti->id, TpmType_lookup[ti->options->type]); =20 switch (ti->options->type) { - case TPM_TYPE_OPTIONS_KIND_PASSTHROUGH: + case TPM_TYPE_PASSTHROUGH: tpo =3D ti->options->u.passthrough.data; monitor_printf(mon, "%s%s%s%s", tpo->has_path ? ",path=3D" : "", @@ -967,7 +967,7 @@ void hmp_info_tpm(Monitor *mon, const QDict *qdict) tpo->has_cancel_path ? ",cancel-path=3D" : "", tpo->has_cancel_path ? tpo->cancel_path : ""); break; - case TPM_TYPE_OPTIONS_KIND__MAX: + default: break; } monitor_printf(mon, "\n"); diff --git a/hw/tpm/tpm_passthrough.c b/hw/tpm/tpm_passthrough.c index a0459a6..c7706e4 100644 --- a/hw/tpm/tpm_passthrough.c +++ b/hw/tpm/tpm_passthrough.c @@ -49,6 +49,7 @@ struct TPMPassthruState { TPMBackend parent; =20 + TPMPassthroughOptions *ops; char *tpm_dev; int tpm_fd; bool tpm_executing; @@ -308,15 +309,14 @@ static TPMVersion tpm_passthrough_get_tpm_version(TPM= Backend *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) { - TPMPassthruState *tpm_pt =3D TPM_PASSTHROUGH(tb); int fd =3D -1; char *dev; char path[PATH_MAX]; =20 - if (tb->cancel_path) { - fd =3D qemu_open(tb->cancel_path, O_WRONLY); + if (tpm_pt->ops->cancel_path) { + fd =3D qemu_open(tpm_pt->ops->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 =3D qemu_open(path, O_WRONLY); if (fd >=3D 0) { - tb->cancel_path =3D g_strdup(path); + tpm_pt->ops->cancel_path =3D g_strdup(path); } else { error_report("tpm_passthrough: Could not open TPM cancel " "path %s : %s", path, strerror(errno)); @@ -351,17 +351,24 @@ static int tpm_passthrough_handle_device_opts(QemuOpt= s *opts, TPMBackend *tb) const char *value; =20 value =3D qemu_opt_get(opts, "cancel-path"); - tb->cancel_path =3D g_strdup(value); + if (value) { + tpm_pt->ops->cancel_path =3D g_strdup(value); + tpm_pt->ops->has_cancel_path =3D true; + } else { + tpm_pt->ops->has_cancel_path =3D false; + } =20 value =3D qemu_opt_get(opts, "path"); if (!value) { value =3D TPM_PASSTHROUGH_DEFAULT_DEVICE; + tpm_pt->ops->has_path =3D false; + } else { + tpm_pt->ops->has_path =3D true; } =20 + tpm_pt->ops->path =3D g_strdup(value); tpm_pt->tpm_dev =3D g_strdup(value); =20 - tb->path =3D g_strdup(tpm_pt->tpm_dev); - tpm_pt->tpm_fd =3D qemu_open(tpm_pt->tpm_dev, O_RDWR); if (tpm_pt->tpm_fd < 0) { error_report("Cannot access TPM device using '%s': %s", @@ -382,8 +389,8 @@ static int tpm_passthrough_handle_device_opts(QemuOpts = *opts, TPMBackend *tb) tpm_pt->tpm_fd =3D -1; =20 err_free_parameters: - g_free(tb->path); - tb->path =3D NULL; + g_free(tpm_pt->ops->path); + tpm_pt->ops->path =3D NULL; =20 g_free(tpm_pt->tpm_dev); tpm_pt->tpm_dev =3D NULL; @@ -403,7 +410,7 @@ static TPMBackend *tpm_passthrough_create(QemuOpts *opt= s, const char *id) goto err_exit; } =20 - tpm_pt->cancel_fd =3D tpm_passthrough_open_sysfs_cancel(tb); + tpm_pt->cancel_fd =3D tpm_passthrough_open_sysfs_cancel(tpm_pt); if (tpm_pt->cancel_fd < 0) { goto err_exit; } @@ -416,6 +423,38 @@ err_exit: return NULL; } =20 +static TpmTypeOptions *tpm_passthrough_get_tpm_options(TPMBackend *tb) +{ + TPMPassthruState *tpm_pt =3D TPM_PASSTHROUGH(tb); + TpmTypeOptions *ops =3D NULL; + TPMPassthroughOptions *pops =3D NULL; + + pops =3D g_new0(TPMPassthroughOptions, 1); + if (!pops) { + return NULL; + } + + if (tpm_pt->ops->has_path) { + pops->has_path =3D true; + pops->path =3D g_strdup(tpm_pt->ops->path); + } + + if (tpm_pt->ops->has_cancel_path) { + pops->has_cancel_path =3D true; + pops->cancel_path =3D g_strdup(tpm_pt->ops->cancel_path); + } + + ops =3D g_new0(TpmTypeOptions, 1); + if (!ops) { + qapi_free_TPMPassthroughOptions(pops); + return NULL; + } + ops->type =3D TPM_TYPE_PASSTHROUGH; + ops->u.passthrough.data =3D pops; + + return ops; +} + static const QemuOptDesc tpm_passthrough_cmdline_opts[] =3D { TPM_STANDARD_CMDLINE_OPTS, { @@ -443,12 +482,14 @@ static const TPMDriverOps tpm_passthrough_driver =3D { .get_tpm_established_flag =3D tpm_passthrough_get_tpm_established_flag, .reset_tpm_established_flag =3D tpm_passthrough_reset_tpm_established_= flag, .get_tpm_version =3D tpm_passthrough_get_tpm_version, + .get_tpm_options =3D tpm_passthrough_get_tpm_options, }; =20 static void tpm_passthrough_inst_init(Object *obj) { TPMPassthruState *tpm_pt =3D TPM_PASSTHROUGH(obj); =20 + tpm_pt->ops =3D g_new0(TPMPassthroughOptions, 1); tpm_pt->tpm_fd =3D -1; tpm_pt->cancel_fd =3D -1; } @@ -462,6 +503,7 @@ static void tpm_passthrough_inst_finalize(Object *obj) qemu_close(tpm_pt->tpm_fd); qemu_close(tpm_pt->cancel_fd); g_free(tpm_pt->tpm_dev); + qapi_free_TPMPassthroughOptions(tpm_pt->ops); } =20 static void tpm_passthrough_class_init(ObjectClass *klass, void *data) diff --git a/include/sysemu/tpm_backend.h b/include/sysemu/tpm_backend.h index d6ae463..6e5bb8d 100644 --- a/include/sysemu/tpm_backend.h +++ b/include/sysemu/tpm_backend.h @@ -48,10 +48,9 @@ struct TPMBackend { GThreadPool *thread_pool; TPMRecvDataCB *recv_data_callback; =20 + /* */ char *id; enum TpmModel fe_model; - char *path; - char *cancel_path; =20 QLIST_ENTRY(TPMBackend) list; }; @@ -97,6 +96,8 @@ struct TPMDriverOps { int (*reset_tpm_established_flag)(TPMBackend *t, uint8_t locty); =20 TPMVersion (*get_tpm_version)(TPMBackend *t); + + TpmTypeOptions *(*get_tpm_options)(TPMBackend *t); }; =20 /** @@ -206,6 +207,26 @@ void tpm_backend_open(TPMBackend *s, Error **errp); */ TPMVersion tpm_backend_get_tpm_version(TPMBackend *s); =20 +/** + * tpm_backend_get_tpm_options: + * @s: the backend + * + * Get the backend configuration options + * + * Returns newly allocated TpmTypeOptions + */ +TpmTypeOptions *tpm_backend_get_tpm_options(TPMBackend *s); + +/** + * tpm_backend_query_tpm: + * @s: the backend + * + * Query backend tpm info + * + * Returns newly allocated TPMInfo + */ +TPMInfo *tpm_backend_query_tpm(TPMBackend *s); + TPMBackend *qemu_find_tpm(const char *id); =20 const TPMDriverOps *tpm_get_backend_driver(const char *type); diff --git a/tpm.c b/tpm.c index 2979508..84e9667 100644 --- a/tpm.c +++ b/tpm.c @@ -249,36 +249,6 @@ static const TPMDriverOps *tpm_driver_find_by_type(enu= m TpmType type) return NULL; } =20 -static TPMInfo *qmp_query_tpm_inst(TPMBackend *drv) -{ - TPMInfo *res =3D g_new0(TPMInfo, 1); - TPMPassthroughOptions *tpo; - - res->id =3D g_strdup(drv->id); - res->model =3D drv->fe_model; - res->options =3D g_new0(TpmTypeOptions, 1); - - switch (tpm_backend_get_type(drv)) { - case TPM_TYPE_PASSTHROUGH: - res->options->type =3D TPM_TYPE_OPTIONS_KIND_PASSTHROUGH; - tpo =3D g_new0(TPMPassthroughOptions, 1); - res->options->u.passthrough.data =3D tpo; - if (drv->path) { - tpo->path =3D g_strdup(drv->path); - tpo->has_path =3D true; - } - if (drv->cancel_path) { - tpo->cancel_path =3D g_strdup(drv->cancel_path); - tpo->has_cancel_path =3D true; - } - break; - case TPM_TYPE__MAX: - break; - } - - return res; -} - /* * Walk the list of active TPM backends and collect information about them * following the schema description in qapi-schema.json. @@ -293,7 +263,7 @@ TPMInfoList *qmp_query_tpm(Error **errp) continue; } info =3D g_new0(TPMInfoList, 1); - info->value =3D qmp_query_tpm_inst(drv); + info->value =3D tpm_backend_query_tpm(drv); =20 if (!cur_item) { head =3D cur_item =3D info; --=20 2.7.4