aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/qemu/qemu/0007-tpm-backend-Add-new-api-to-read-backend-TpmInfo.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/qemu/qemu/0007-tpm-backend-Add-new-api-to-read-backend-TpmInfo.patch')
-rw-r--r--meta/recipes-devtools/qemu/qemu/0007-tpm-backend-Add-new-api-to-read-backend-TpmInfo.patch293
1 files changed, 293 insertions, 0 deletions
diff --git a/meta/recipes-devtools/qemu/qemu/0007-tpm-backend-Add-new-api-to-read-backend-TpmInfo.patch b/meta/recipes-devtools/qemu/qemu/0007-tpm-backend-Add-new-api-to-read-backend-TpmInfo.patch
new file mode 100644
index 0000000000..6d79ac4d63
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu/0007-tpm-backend-Add-new-api-to-read-backend-TpmInfo.patch
@@ -0,0 +1,293 @@
+From 5f698395b5de1ab2826f5aad99d757ce31d7c95f Mon Sep 17 00:00:00 2001
+From: Amarnath Valluri <amarnath.valluri@intel.com>
+Date: Mon, 6 Mar 2017 00:10:10 +0200
+Subject: [PATCH 07/12] tpm backend: Add new api to read backend TpmInfo
+
+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 <amarnath.valluri@intel.com>
+Reviewed-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
+
+Upstream-Status: Backport[f59864ba3aedd26aef7c84545cc1e565caccebf7]
+---
+ backends/tpm.c | 15 +++++++++++--
+ hw/tpm/tpm_passthrough.c | 51 +++++++++++++++++++++++++++-----------------
+ include/sysemu/tpm_backend.h | 15 +++++++++++--
+ tpm.c | 32 +--------------------------
+ 4 files changed, 59 insertions(+), 54 deletions(-)
+
+diff --git a/backends/tpm.c b/backends/tpm.c
+index 8911597fab..de313c9d5a 100644
+--- a/backends/tpm.c
++++ b/backends/tpm.c
+@@ -142,6 +142,19 @@ TPMVersion tpm_backend_get_tpm_version(TPMBackend *s)
+ return k->ops->get_tpm_version(s);
+ }
+
++TPMInfo *tpm_backend_query_tpm(TPMBackend *s)
++{
++ TPMInfo *info = g_new0(TPMInfo, 1);
++ TPMBackendClass *k = TPM_BACKEND_GET_CLASS(s);
++
++ info->id = g_strdup(s->id);
++ info->model = s->fe_model;
++ info->options = k->ops->get_tpm_options ?
++ k->ops->get_tpm_options(s) : NULL;
++
++ return info;
++}
++
+ static bool tpm_backend_prop_get_opened(Object *obj, Error **errp)
+ {
+ TPMBackend *s = TPM_BACKEND(obj);
+@@ -196,8 +209,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/hw/tpm/tpm_passthrough.c b/hw/tpm/tpm_passthrough.c
+index 4c21e52b7c..84fc49a4d3 100644
+--- a/hw/tpm/tpm_passthrough.c
++++ b/hw/tpm/tpm_passthrough.c
+@@ -30,6 +30,7 @@
+ #include "tpm_int.h"
+ #include "hw/hw.h"
+ #include "hw/i386/pc.h"
++#include "qapi/clone-visitor.h"
+ #include "tpm_tis.h"
+ #include "tpm_util.h"
+
+@@ -49,7 +50,8 @@
+ struct TPMPassthruState {
+ TPMBackend parent;
+
+- char *tpm_dev;
++ TPMPassthroughOptions *options;
++ const char *tpm_dev;
+ int tpm_fd;
+ bool tpm_executing;
+ bool tpm_op_canceled;
+@@ -296,15 +298,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)
+ {
+- 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));
+@@ -319,7 +320,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));
+@@ -339,17 +340,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;
+ 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",
+@@ -370,10 +372,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;
+@@ -391,7 +391,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;
+ }
+@@ -404,6 +404,17 @@ err_exit:
+ return NULL;
+ }
+
++static TpmTypeOptions *tpm_passthrough_get_tpm_options(TPMBackend *tb)
++{
++ TpmTypeOptions *options = g_new0(TpmTypeOptions, 1);
++
++ options->type = TPM_TYPE_OPTIONS_KIND_PASSTHROUGH;
++ options->u.passthrough.data = QAPI_CLONE(TPMPassthroughOptions,
++ TPM_PASSTHROUGH(tb)->options);
++
++ return options;
++}
++
+ static const QemuOptDesc tpm_passthrough_cmdline_opts[] = {
+ TPM_STANDARD_CMDLINE_OPTS,
+ {
+@@ -430,12 +441,14 @@ static const TPMDriverOps tpm_passthrough_driver = {
+ .get_tpm_established_flag = tpm_passthrough_get_tpm_established_flag,
+ .reset_tpm_established_flag = tpm_passthrough_reset_tpm_established_flag,
+ .get_tpm_version = tpm_passthrough_get_tpm_version,
++ .get_tpm_options = tpm_passthrough_get_tpm_options,
+ };
+
+ static void tpm_passthrough_inst_init(Object *obj)
+ {
+ TPMPassthruState *tpm_pt = TPM_PASSTHROUGH(obj);
+
++ tpm_pt->options = g_new0(TPMPassthroughOptions, 1);
+ tpm_pt->tpm_fd = -1;
+ tpm_pt->cancel_fd = -1;
+ }
+@@ -448,7 +461,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->options);
+ }
+
+ 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 9ea707253a..e96c1918cc 100644
+--- a/include/sysemu/tpm_backend.h
++++ b/include/sysemu/tpm_backend.h
+@@ -49,10 +49,9 @@ struct TPMBackend {
+ TPMRecvDataCB *recv_data_callback;
+ bool had_startup_error;
+
++ /* <public> */
+ char *id;
+ enum TpmModel fe_model;
+- char *path;
+- char *cancel_path;
+
+ QLIST_ENTRY(TPMBackend) list;
+ };
+@@ -96,6 +95,8 @@ struct TPMDriverOps {
+ int (*reset_tpm_established_flag)(TPMBackend *t, uint8_t locty);
+
+ TPMVersion (*get_tpm_version)(TPMBackend *t);
++
++ TpmTypeOptions *(*get_tpm_options)(TPMBackend *t);
+ };
+
+
+@@ -214,6 +215,16 @@ void tpm_backend_open(TPMBackend *s, Error **errp);
+ */
+ TPMVersion tpm_backend_get_tpm_version(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);
+
+ const TPMDriverOps *tpm_get_backend_driver(const char *type);
+diff --git a/tpm.c b/tpm.c
+index 9f4f37da50..cac400ef3e 100644
+--- a/tpm.c
++++ b/tpm.c
+@@ -203,36 +203,6 @@ static const TPMDriverOps *tpm_driver_find_by_type(enum TpmType type)
+ return be_drivers[type];
+ }
+
+-static TPMInfo *qmp_query_tpm_inst(TPMBackend *drv)
+-{
+- TPMInfo *res = g_new0(TPMInfo, 1);
+- TPMPassthroughOptions *tpo;
+-
+- res->id = g_strdup(drv->id);
+- res->model = drv->fe_model;
+- res->options = g_new0(TpmTypeOptions, 1);
+-
+- switch (tpm_backend_get_type(drv)) {
+- case TPM_TYPE_PASSTHROUGH:
+- res->options->type = TPM_TYPE_OPTIONS_KIND_PASSTHROUGH;
+- tpo = g_new0(TPMPassthroughOptions, 1);
+- res->options->u.passthrough.data = tpo;
+- if (drv->path) {
+- tpo->path = g_strdup(drv->path);
+- tpo->has_path = true;
+- }
+- if (drv->cancel_path) {
+- tpo->cancel_path = g_strdup(drv->cancel_path);
+- tpo->has_cancel_path = 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.
+@@ -247,7 +217,7 @@ TPMInfoList *qmp_query_tpm(Error **errp)
+ continue;
+ }
+ info = g_new0(TPMInfoList, 1);
+- info->value = qmp_query_tpm_inst(drv);
++ info->value = tpm_backend_query_tpm(drv);
+
+ if (!cur_item) {
+ head = cur_item = info;
+--
+2.11.0
+