aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/std/acpi.h13
-rw-r--r--src/tcgbios.c52
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 bde1ef8..40b3028 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;