[PATCH v4 4/6] tpm: unify the tcg2 eventlog structures
Ludwig Nussel
ludwig.nussel at siemens.com
Mon Jun 29 10:01:03 CEST 2026
From: Ilias Apalodimas <ilias.apalodimas at linaro.org>
We currently have two structures describing the internal TCG EventLog
buffers we keep in memory.
The first one is 'struct event_log_buffer' and it carries all the
necessary members to keep track of the information needed to implement
the EFI TCG protocol.
The second one is 'struct tcg2_event_log' which was introduced later,
when some functions from the TCG protocol moved to U-Boots core, and is
is used to measure binaries when booting with bootm, booti etc.
The split led to some duplication -- e.g tcg2_measure_data() and
measure_event() functions are very similar with the exception of
extending the EventLog.
Since the latter is a subset of the former, let's move all the members
to a single struct and use that instead.
Signed-off-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
Signed-off-by: Ludwig Nussel <ludwig.nussel at siemens.com>
---
(no changes since v1)
include/tpm_tcg2.h | 15 ++++++++++
lib/efi_loader/efi_tcg2.c | 60 +++++++++++++--------------------------
2 files changed, 34 insertions(+), 41 deletions(-)
diff --git a/include/tpm_tcg2.h b/include/tpm_tcg2.h
index db3f6f486e9..e954a276ecd 100644
--- a/include/tpm_tcg2.h
+++ b/include/tpm_tcg2.h
@@ -163,6 +163,15 @@ struct tcg_efi_spec_id_event {
* @log_size: Log space available
* @found: Boolean indicating if an existing log was discovered
* @allocated: Boolean indicating that the log was allocated by u-boot
+ * @final_buffer: finalevent config table buffer. Only used for EFI
+ * @final_position: current position of 'final_buffer'. Only used for EFI
+ * @last_event_size: Size of the last event. Only used for EFI
+ * @get_event_called: true if GetEventLog has been invoked at least once.
+ * Only used for EFI
+ * @ebs_called: true if ExitBootServices has been invoked.
+ * Only used for EFI
+ * @truncated: true if the 'buffer' is truncated.
+ * Only used for EFI
*/
struct tcg2_event_log {
u8 *log;
@@ -170,6 +179,12 @@ struct tcg2_event_log {
u32 log_size;
bool found;
bool allocated;
+ void *final_buffer;
+ u32 final_position;
+ u32 last_event_size;
+ bool get_event_called;
+ bool ebs_called;
+ bool truncated;
};
/**
diff --git a/lib/efi_loader/efi_tcg2.c b/lib/efi_loader/efi_tcg2.c
index 1860dc50238..85e7ecd0583 100644
--- a/lib/efi_loader/efi_tcg2.c
+++ b/lib/efi_loader/efi_tcg2.c
@@ -25,29 +25,7 @@
#include <linux/unaligned/generic.h>
#include <hexdump.h>
-/**
- * struct event_log_buffer - internal eventlog management structure
- *
- * @buffer: eventlog buffer
- * @final_buffer: finalevent config table buffer
- * @pos: current position of 'buffer'
- * @final_pos: current position of 'final_buffer'
- * @get_event_called: true if GetEventLog has been invoked at least once
- * @ebs_called: true if ExitBootServices has been invoked
- * @truncated: true if the 'buffer' is truncated
- */
-struct event_log_buffer {
- void *buffer;
- void *final_buffer;
- size_t pos; /* eventlog position */
- size_t final_pos; /* final events config table position */
- size_t last_event_size;
- bool get_event_called;
- bool ebs_called;
- bool truncated;
-};
-
-static struct event_log_buffer event_log;
+static struct tcg2_event_log event_log;
static bool tcg2_efi_app_invoked;
/*
* When requesting TPM2_CAP_TPM_PROPERTIES the value is on a standard offset.
@@ -105,7 +83,7 @@ static efi_status_t tcg2_agile_log_append(u32 pcr_index, u32 event_type,
struct tpml_digest_values *digest_list,
u32 size, u8 event[])
{
- void *log = (void *)((uintptr_t)event_log.buffer + event_log.pos);
+ void *log = (void *)((uintptr_t)event_log.log + event_log.log_position);
u32 event_size = size + tcg2_event_get_size(digest_list);
struct efi_tcg2_final_events_table *final_event;
efi_status_t ret = EFI_SUCCESS;
@@ -113,12 +91,12 @@ static efi_status_t tcg2_agile_log_append(u32 pcr_index, u32 event_type,
/* if ExitBootServices hasn't been called update the normal log */
if (!event_log.ebs_called) {
if (event_log.truncated ||
- event_log.pos + event_size > CONFIG_TPM2_EVENT_LOG_SIZE) {
+ event_log.log_position + event_size > CONFIG_TPM2_EVENT_LOG_SIZE) {
event_log.truncated = true;
return EFI_VOLUME_FULL;
}
tcg2_log_append(pcr_index, event_type, digest_list, size, event, log);
- event_log.pos += event_size;
+ event_log.log_position += event_size;
event_log.last_event_size = event_size;
}
@@ -126,15 +104,15 @@ static efi_status_t tcg2_agile_log_append(u32 pcr_index, u32 event_type,
return ret;
/* if GetEventLog has been called update FinalEventLog as well */
- if (event_log.final_pos + event_size > CONFIG_TPM2_EVENT_LOG_SIZE)
+ if (event_log.final_position + event_size > CONFIG_TPM2_EVENT_LOG_SIZE)
return EFI_VOLUME_FULL;
- log = (void *)((uintptr_t)event_log.final_buffer + event_log.final_pos);
+ log = (void *)((uintptr_t)event_log.final_buffer + event_log.final_position);
tcg2_log_append(pcr_index, event_type, digest_list, size, event, log);
final_event = event_log.final_buffer;
final_event->number_of_events++;
- event_log.final_pos += event_size;
+ event_log.final_position += event_size;
return ret;
}
@@ -358,8 +336,8 @@ efi_tcg2_get_eventlog(struct efi_tcg2_protocol *this,
ret = EFI_SUCCESS;
goto out;
}
- *event_log_location = (uintptr_t)event_log.buffer;
- *event_log_last_entry = (uintptr_t)(event_log.buffer + event_log.pos -
+ *event_log_location = (uintptr_t)event_log.log;
+ *event_log_last_entry = (uintptr_t)(event_log.log + event_log.log_position -
event_log.last_event_size);
*event_log_truncated = event_log.truncated;
event_log.get_event_called = true;
@@ -799,8 +777,8 @@ static void tcg2_uninit(void)
if (ret != EFI_SUCCESS && ret != EFI_NOT_FOUND)
log_err("Failed to delete final events config table\n");
- efi_free_pool(event_log.buffer);
- event_log.buffer = NULL;
+ efi_free_pool(event_log.log);
+ event_log.log = NULL;
efi_free_pool(event_log.final_buffer);
event_log.final_buffer = NULL;
@@ -836,7 +814,7 @@ static efi_status_t create_final_event(void)
final_event = event_log.final_buffer;
final_event->number_of_events = 0;
final_event->version = EFI_TCG2_FINAL_EVENTS_TABLE_VERSION;
- event_log.final_pos = sizeof(*final_event);
+ event_log.final_position = sizeof(*final_event);
ret = efi_install_configuration_table(&efi_guid_final_events,
final_event);
if (ret != EFI_SUCCESS) {
@@ -920,7 +898,7 @@ static efi_status_t efi_init_event_log(void)
ret = efi_allocate_pool(EFI_BOOT_SERVICES_DATA,
CONFIG_TPM2_EVENT_LOG_SIZE,
- (void **)&event_log.buffer);
+ (void **)&event_log.log);
if (ret != EFI_SUCCESS)
return ret;
@@ -928,13 +906,13 @@ static efi_status_t efi_init_event_log(void)
* initialize log area as 0xff so the OS can easily figure out the
* last log entry
*/
- memset(event_log.buffer, 0xff, CONFIG_TPM2_EVENT_LOG_SIZE);
+ memset(event_log.log, 0xff, CONFIG_TPM2_EVENT_LOG_SIZE);
/*
* The log header is defined to be in SHA1 event log entry format.
* Setup event header
*/
- event_log.pos = 0;
+ event_log.log_position = 0;
event_log.last_event_size = 0;
event_log.get_event_called = false;
event_log.ebs_called = false;
@@ -944,7 +922,7 @@ static efi_status_t efi_init_event_log(void)
* Check if earlier firmware have passed any eventlog. Different
* platforms can use different ways to do so.
*/
- elog.log = event_log.buffer;
+ elog.log = event_log.log;
elog.log_size = CONFIG_TPM2_EVENT_LOG_SIZE;
rc = tcg2_log_prepare_buffer(dev, &elog, false);
if (rc) {
@@ -952,7 +930,7 @@ static efi_status_t efi_init_event_log(void)
goto free_pool;
}
- event_log.pos = elog.log_position;
+ event_log.log_position = elog.log_position;
/*
* Add SCRTM version to the log if previous firmmware
@@ -971,8 +949,8 @@ static efi_status_t efi_init_event_log(void)
return ret;
free_pool:
- efi_free_pool(event_log.buffer);
- event_log.buffer = NULL;
+ efi_free_pool(event_log.log);
+ event_log.log = NULL;
return ret;
}
--
2.43.0
More information about the U-Boot
mailing list