Add support for the TPM2 ACPI table. If we find it and its of the appropriate size, we can get the log_area_start_address and log_area_minimum_size from it.
The latest version of the spec can be found here:
https://trustedcomputinggroup.org/tcg-acpi-specification/
Signed-off-by: Stefan Berger stefanb@linux.vnet.ibm.com --- src/std/acpi.h | 13 +++++++++++++ src/tcgbios.c | 52 +++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 54 insertions(+), 11 deletions(-)
diff --git a/src/std/acpi.h b/src/std/acpi.h index c2ea707..c01fa7b 100644 --- a/src/std/acpi.h +++ b/src/std/acpi.h @@ -307,4 +307,17 @@ struct tcpa_descriptor_rev2 #define TCPA_ACPI_CLASS_CLIENT 0 #define TCPA_ACPI_CLASS_SERVER 1
+#define TPM2_SIGNATURE 0x324D5054 +struct tpm2_descriptor_rev2 +{ + ACPI_TABLE_HEADER_DEF + u16 platform_class; + u16 reserved; + u64 address_of_control_area; + u32 start_method; + u8 start_method_params[12]; + u32 log_area_minimum_length; + u64 log_area_start_address; +} PACKED; + #endif // acpi.h diff --git a/src/tcgbios.c b/src/tcgbios.c index 151707b..9348a23 100644 --- a/src/tcgbios.c +++ b/src/tcgbios.c @@ -48,15 +48,9 @@ struct { u8 * log_area_last_entry; } tpm_state VARLOW;
-static int -tpm_tcpa_probe(void) +static int tpm_set_log_area(u8 *log_area_start_address, + u32 log_area_minimum_length) { - struct tcpa_descriptor_rev2 *tcpa = find_acpi_table(TCPA_SIGNATURE); - if (!tcpa) - return -1; - - u8 *log_area_start_address = (u8*)(long)tcpa->log_area_start_address; - u32 log_area_minimum_length = tcpa->log_area_minimum_length; if (!log_area_start_address || !log_area_minimum_length) return -1;
@@ -69,6 +63,39 @@ tpm_tcpa_probe(void) return 0; }
+static int +tpm_tcpa_probe(void) +{ + struct tcpa_descriptor_rev2 *tcpa = find_acpi_table(TCPA_SIGNATURE); + if (!tcpa) + return -1; + + dprintf(DEBUG_tcg, "TCGBIOS: TCPA: LASA = %p, LAML = %u\n", + (u8 *)(long)tcpa->log_area_start_address, + tcpa->log_area_minimum_length); + + return tpm_set_log_area((u8*)(long)tcpa->log_area_start_address, + tcpa->log_area_minimum_length); +} + +static int +tpm_tpm2_probe(void) +{ + struct tpm2_descriptor_rev2 *tpm2 = find_acpi_table(TPM2_SIGNATURE); + if (!tpm2) + return -1; + + if (tpm2->length < 76) + return -1; + + dprintf(DEBUG_tcg, "TCGBIOS: TPM2: LASA = %p, LAML = %u\n", + (u8 *)(long)tpm2->log_area_start_address, + tpm2->log_area_minimum_length); + + return tpm_set_log_area((u8*)(long)tpm2->log_area_start_address, + tpm2->log_area_minimum_length); +} + /* * Extend the ACPI log with the given entry by copying the * entry data into the log. @@ -949,9 +976,12 @@ tpm_setup(void) "TCGBIOS: Detected a TPM %s.\n", (TPM_version == TPM_VERSION_1_2) ? "1.2" : "2");
- int ret = tpm_tcpa_probe(); - if (ret) - return; + int ret = tpm_tpm2_probe(); + if (ret) { + ret = tpm_tcpa_probe(); + if (ret) + return; + }
TPM_working = 1;