summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLans Zhang <jia.zhang@windriver.com>2016-09-30 10:46:31 +0800
committerPeter Jones <pmjones@gmail.com>2016-09-30 09:38:33 -0400
commitd3884fe8336be793e3b3ad5813f5e6c436d78d60 (patch)
tree5175a92103a3cc20ce6b28754796de7a59682014
parent6c180c6004ac464d7e83c1dc4c24047fad281b32 (diff)
downloadefi-boot-shim-d3884fe8336be793e3b3ad5813f5e6c436d78d60.tar.gz
efi-boot-shim-d3884fe8336be793e3b3ad5813f5e6c436d78d60.zip
shim: trigger to record further logs to tcg 2.0 final event log area
According to TCG EFI Protocol Specification for TPM 2.0 family, all events generated after the invocation of EFI_TCG2_GET_EVENT_LOG shall be stored in an instance of an EFI_CONFIGURATION_TABLE aka EFI TCG 2.0 final events table. Hence, it is necessary to trigger the internal switch through calling get_event_log() in order to allow to retrieve the logs from OS runtime. Signed-off-by: Lans Zhang <jia.zhang@windriver.com>
-rw-r--r--tpm.c21
-rw-r--r--tpm.h2
2 files changed, 23 insertions, 0 deletions
diff --git a/tpm.c b/tpm.c
index 71bcf9b9..0305b401 100644
--- a/tpm.c
+++ b/tpm.c
@@ -61,6 +61,21 @@ static BOOLEAN tpm2_present(efi_tpm2_protocol_t *tpm)
return FALSE;
}
+/*
+ * According to TCG EFI Protocol Specification for TPM 2.0 family,
+ * all events generated after the invocation of EFI_TCG2_GET_EVENT_LOG
+ * shall be stored in an instance of an EFI_CONFIGURATION_TABLE aka
+ * EFI TCG 2.0 final events table. Hence, it is necessary to trigger the
+ * internal switch through calling get_event_log() in order to allow
+ * to retrieve the logs from OS runtime.
+ */
+static EFI_STATUS trigger_tcg2_final_events_table(efi_tpm2_protocol_t *tpm2)
+{
+ return uefi_call_wrapper(tpm2->get_event_log, 5, tpm2,
+ EFI_TCG2_EVENT_LOG_FORMAT_TCG_2, NULL,
+ NULL, NULL);
+}
+
EFI_STATUS tpm_log_event(EFI_PHYSICAL_ADDRESS buf, UINTN size, UINT8 pcr,
const CHAR8 *description)
{
@@ -76,6 +91,12 @@ EFI_STATUS tpm_log_event(EFI_PHYSICAL_ADDRESS buf, UINTN size, UINT8 pcr,
if (!tpm2_present(tpm2))
return EFI_SUCCESS;
+ status = trigger_tcg2_final_events_table(tpm2);
+ if (EFI_ERROR(status)) {
+ perror(L"Unable to trigger tcg2 final events table\n");
+ return status;
+ }
+
event = AllocatePool(sizeof(*event) + strlen(description) + 1);
if (!event) {
perror(L"Unable to allocate event structure\n");
diff --git a/tpm.h b/tpm.h
index 2c21b262..5f47b071 100644
--- a/tpm.h
+++ b/tpm.h
@@ -114,6 +114,8 @@ typedef struct tdEFI_TCG2_EVENT {
uint8_t Event[1];
} __attribute__ ((packed)) EFI_TCG2_EVENT;
+#define EFI_TCG2_EVENT_LOG_FORMAT_TCG_2 0x00000002
+
struct efi_tpm2_protocol
{
EFI_STATUS (EFIAPI *get_capability) (struct efi_tpm2_protocol *this,