summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2020-11-23 17:24:04 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2020-11-24 09:49:56 +0100
commit8b35facbb9712d5cef97be3a56c0f52807cf8384 (patch)
tree990058f7ba7883970f50606e809ff8a7fff01a91
parent9f1cb23e05ffe592b3fd371a2ae7621ff5735713 (diff)
downloadbarebox-8b35facbb9712d5cef97be3a56c0f52807cf8384.tar.gz
barebox-8b35facbb9712d5cef97be3a56c0f52807cf8384.tar.xz
i.MX: HABv4: Improve HAB event printing
Instead of using a fixed sized buffer for the report_event function, let's call it two times, once with a NULL pointer to get the size of the event and a second time with a buffer of that size. Also, instead of separating the events into warning and error type, iterate over all events in one single loop. This helps to get the events in the order they occured which probably helps the reader to make more sense of them. This also gets rid of the "ERROR: Recompile with larger event data buffer" message which recently appeared everytime a warning or error was reported. Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
-rw-r--r--drivers/hab/habv4.c55
1 files changed, 31 insertions, 24 deletions
diff --git a/drivers/hab/habv4.c b/drivers/hab/habv4.c
index e94f827549..c2acb81369 100644
--- a/drivers/hab/habv4.c
+++ b/drivers/hab/habv4.c
@@ -500,11 +500,34 @@ static bool is_known_rng_fail_event(const uint8_t *data, size_t len)
return false;
}
+static uint8_t *hab_get_event(const struct habv4_rvt *rvt, int index, int *len)
+{
+ enum hab_status err;
+ uint8_t *buf;
+
+ err = rvt->report_event(HAB_STATUS_ANY, index, NULL, len);
+ if (err != HAB_STATUS_SUCCESS)
+ return NULL;
+
+ buf = malloc(*len);
+ if (!buf)
+ return NULL;
+
+ err = rvt->report_event(HAB_STATUS_ANY, index, buf, len);
+ if (err != HAB_STATUS_SUCCESS) {
+ pr_err("Unexpected HAB return code\n");
+ free(buf);
+ return NULL;
+ }
+
+ return buf;
+}
+
static int habv4_get_status(const struct habv4_rvt *rvt)
{
- uint8_t data[256];
+ uint8_t *data;
uint32_t len;
- uint32_t index = 0;
+ int i;
enum hab_status status;
enum hab_config config = 0x0;
enum hab_state state = 0x0;
@@ -524,40 +547,24 @@ static int habv4_get_status(const struct habv4_rvt *rvt)
return 0;
}
- len = sizeof(data);
- while (rvt->report_event(HAB_STATUS_WARNING, index, data, &len) == HAB_STATUS_SUCCESS) {
+ for (i = 0;; i++) {
+ data = hab_get_event(rvt, i, &len);
+ if (!data)
+ break;
/* suppress RNG self-test fail events if they can be handled in software */
if (IS_ENABLED(CONFIG_CRYPTO_DEV_FSL_CAAM_RNG_SELF_TEST) &&
is_known_rng_fail_event(data, len)) {
pr_debug("RNG self-test failure detected, will run software self-test\n");
} else {
- pr_err("-------- HAB warning Event %d --------\n", index);
+ pr_err("-------- HAB Event %d --------\n", i);
pr_err("event data:\n");
habv4_display_event(data, len);
}
- len = sizeof(data);
- index++;
+ free(data);
}
- len = sizeof(data);
- index = 0;
- while (rvt->report_event(HAB_STATUS_FAILURE, index, data, &len) == HAB_STATUS_SUCCESS) {
- pr_err("-------- HAB failure Event %d --------\n", index);
- pr_err("event data:\n");
-
- habv4_display_event(data, len);
- len = sizeof(data);
- index++;
- }
-
- /* Check reason for stopping */
- len = sizeof(data);
- index = 0;
- if (rvt->report_event(HAB_STATUS_ANY, index, NULL, &len) == HAB_STATUS_SUCCESS)
- pr_err("ERROR: Recompile with larger event data buffer (at least %d bytes)\n\n", len);
-
return -EPERM;
}