diff options
| author | Lans Zhang <jia.zhang@windriver.com> | 2016-09-30 10:46:31 +0800 |
|---|---|---|
| committer | Peter Jones <pmjones@gmail.com> | 2016-09-30 09:38:33 -0400 |
| commit | d3884fe8336be793e3b3ad5813f5e6c436d78d60 (patch) | |
| tree | 5175a92103a3cc20ce6b28754796de7a59682014 | |
| parent | 6c180c6004ac464d7e83c1dc4c24047fad281b32 (diff) | |
| download | efi-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.c | 21 | ||||
| -rw-r--r-- | tpm.h | 2 |
2 files changed, 23 insertions, 0 deletions
@@ -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"); @@ -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, |
