aboutsummaryrefslogtreecommitdiffstats
path: root/meta/recipes-devtools/qemu/qemu/0001-tpm-Clean-up-driver-registration-lookup.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta/recipes-devtools/qemu/qemu/0001-tpm-Clean-up-driver-registration-lookup.patch')
-rw-r--r--meta/recipes-devtools/qemu/qemu/0001-tpm-Clean-up-driver-registration-lookup.patch154
1 files changed, 154 insertions, 0 deletions
diff --git a/meta/recipes-devtools/qemu/qemu/0001-tpm-Clean-up-driver-registration-lookup.patch b/meta/recipes-devtools/qemu/qemu/0001-tpm-Clean-up-driver-registration-lookup.patch
new file mode 100644
index 0000000000..1a484b91c3
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu/0001-tpm-Clean-up-driver-registration-lookup.patch
@@ -0,0 +1,154 @@
+From a0f8d150794164f41cd7288c9ed059bbf21c95ec Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= <marcandre.lureau@redhat.com>
+Date: Thu, 24 Aug 2017 10:45:58 +0200
+Subject: [PATCH 01/12] tpm: Clean up driver registration & lookup
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+We have a strict separation between enum TpmType and be_drivers[]:
+
+* TpmType may have any number of members. It just happens to have one.
+
+* tpm_register_driver() uses the first empty slot in be_drivers[].
+
+ If you register more than tpm_models[] has space,
+ tpm_register_driver() fails. Its caller silently ignores the
+ failure.
+
+ If you register more than one with a given TpmType,
+ tpm_display_backend_drivers() will shows all of them, but
+ tpm_driver_find_by_type() and tpm_get_backend_driver() will find
+ only the one one that registered first.
+
+Since we only ever register one driver, and be_drivers[] has space for
+just that one, this contraption even works.
+
+Turn be_drivers[] into a straight map from enum TpmType to driver.
+Much simpler, and has a decent chance to actually work should we ever
+acquire additional drivers.
+
+While there, use qapi_enum_parse() in tpm_get_backend_driver().
+
+Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
+Message-Id: <20170822132255.23945-8-marcandre.lureau@redhat.com>
+Reviewed-by: Markus Armbruster <armbru@redhat.com>
+[Rebased, superfluous initializer dropped, commit message rewritten]
+Cc: Stefan Berger <stefanb@us.ibm.com>
+Signed-off-by: Markus Armbruster <armbru@redhat.com>
+Message-Id: <1503564371-26090-4-git-send-email-armbru@redhat.com>
+
+Upstream-Status: Backport
+---
+ include/sysemu/tpm_backend.h | 2 +-
+ tpm.c | 45 +++++++++++++-------------------------------
+ 2 files changed, 14 insertions(+), 33 deletions(-)
+
+diff --git a/include/sysemu/tpm_backend.h b/include/sysemu/tpm_backend.h
+index b58f52d39f..1d21c6b19b 100644
+--- a/include/sysemu/tpm_backend.h
++++ b/include/sysemu/tpm_backend.h
+@@ -227,6 +227,6 @@ TPMBackend *qemu_find_tpm(const char *id);
+
+ const TPMDriverOps *tpm_get_backend_driver(const char *type);
+ int tpm_register_model(enum TpmModel model);
+-int tpm_register_driver(const TPMDriverOps *tdo);
++void tpm_register_driver(const TPMDriverOps *tdo);
+
+ #endif
+diff --git a/tpm.c b/tpm.c
+index 9a7c7114d3..bb45d0c08e 100644
+--- a/tpm.c
++++ b/tpm.c
+@@ -14,6 +14,7 @@
+ #include "qemu/osdep.h"
+
+ #include "qapi/qmp/qerror.h"
++#include "qapi/util.h"
+ #include "sysemu/tpm_backend.h"
+ #include "sysemu/tpm.h"
+ #include "qemu/config-file.h"
+@@ -25,11 +26,8 @@ static QLIST_HEAD(, TPMBackend) tpm_backends =
+
+
+ #define TPM_MAX_MODELS 1
+-#define TPM_MAX_DRIVERS 1
+
+-static TPMDriverOps const *be_drivers[TPM_MAX_DRIVERS] = {
+- NULL,
+-};
++static TPMDriverOps const *be_drivers[TPM_TYPE__MAX];
+
+ static enum TpmModel tpm_models[TPM_MAX_MODELS] = {
+ TPM_MODEL__MAX,
+@@ -63,31 +61,18 @@ static bool tpm_model_is_registered(enum TpmModel model)
+
+ const TPMDriverOps *tpm_get_backend_driver(const char *type)
+ {
+- int i;
+-
+- for (i = 0; i < TPM_MAX_DRIVERS && be_drivers[i] != NULL; i++) {
+- if (!strcmp(TpmType_lookup[be_drivers[i]->type], type)) {
+- return be_drivers[i];
+- }
+- }
++ int i = qapi_enum_parse(TpmType_lookup, type, TPM_TYPE__MAX, -1, NULL);
+
+- return NULL;
++ return i >= 0 ? be_drivers[i] : NULL;
+ }
+
+ #ifdef CONFIG_TPM
+
+-int tpm_register_driver(const TPMDriverOps *tdo)
++void tpm_register_driver(const TPMDriverOps *tdo)
+ {
+- int i;
++ assert(!be_drivers[tdo->type]);
+
+- for (i = 0; i < TPM_MAX_DRIVERS; i++) {
+- if (!be_drivers[i]) {
+- be_drivers[i] = tdo;
+- return 0;
+- }
+- }
+- error_report("Could not register TPM driver");
+- return 1;
++ be_drivers[tdo->type] = tdo;
+ }
+
+ /*
+@@ -100,9 +85,12 @@ static void tpm_display_backend_drivers(void)
+
+ fprintf(stderr, "Supported TPM types (choose only one):\n");
+
+- for (i = 0; i < TPM_MAX_DRIVERS && be_drivers[i] != NULL; i++) {
++ for (i = 0; i < TPM_TYPE__MAX; i++) {
++ if (be_drivers[i] == NULL) {
++ continue;
++ }
+ fprintf(stderr, "%12s %s\n",
+- TpmType_lookup[be_drivers[i]->type], be_drivers[i]->desc());
++ TpmType_lookup[i], be_drivers[i]->desc());
+ }
+ fprintf(stderr, "\n");
+ }
+@@ -239,14 +227,7 @@ int tpm_config_parse(QemuOptsList *opts_list, const char *optarg)
+
+ static const TPMDriverOps *tpm_driver_find_by_type(enum TpmType type)
+ {
+- int i;
+-
+- for (i = 0; i < TPM_MAX_DRIVERS && be_drivers[i] != NULL; i++) {
+- if (be_drivers[i]->type == type) {
+- return be_drivers[i];
+- }
+- }
+- return NULL;
++ return be_drivers[type];
+ }
+
+ static TPMInfo *qmp_query_tpm_inst(TPMBackend *drv)
+--
+2.11.0
+