lkml.org 
[lkml]   [2019]   [Sep]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH v4] tpm: Parse event log from TPM2 ACPI table
On Fri Aug 30 19, Jordan Hand wrote:
>For systems with a TPM2 chip which use ACPI to expose event logs, retrieve the
>crypto-agile event log from the TPM2 ACPI table. The TPM2 table is defined
>in section 7.3 of the TCG ACPI Specification (see link).
>
>The TPM2 table is used by SeaBIOS in place of the TCPA table when the system's
>TPM is version 2.0 to denote (among other metadata) the location of the
>crypto-agile log.
>
>Link: https://trustedcomputinggroup.org/resource/tcg-acpi-specification/
>Signed-off-by: Jordan Hand <jorhand@linux.microsoft.com>
>---
> drivers/char/tpm/eventlog/acpi.c | 60 ++++++++++++++++++++++----------
> 1 file changed, 41 insertions(+), 19 deletions(-)
>
>diff --git a/drivers/char/tpm/eventlog/acpi.c b/drivers/char/tpm/eventlog/acpi.c
>index 63ada5e53f13..38a8bcec1dd5 100644
>--- a/drivers/char/tpm/eventlog/acpi.c
>+++ b/drivers/char/tpm/eventlog/acpi.c
>@@ -41,17 +41,23 @@ struct acpi_tcpa {
> };
> };
>
>+/* If an event log is present, the TPM2 ACPI table will contain the full
>+ * trailer
>+ */
>+
> /* read binary bios log */
> int tpm_read_log_acpi(struct tpm_chip *chip)
> {
>- struct acpi_tcpa *buff;
>+ struct acpi_table_header *buff;
>+ struct acpi_tcpa *tcpa;
>+ struct acpi_tpm2_trailer *tpm2_trailer;
> acpi_status status;
> void __iomem *virt;
> u64 len, start;
>+ int log_type;
> struct tpm_bios_log *log;
>-
>- if (chip->flags & TPM_CHIP_FLAG_TPM2)
>- return -ENODEV;
>+ bool is_tpm2 = chip->flags & TPM_CHIP_FLAG_TPM2;
>+ acpi_string table_sig;
>
> log = &chip->log;
>
>@@ -61,26 +67,42 @@ int tpm_read_log_acpi(struct tpm_chip *chip)
> if (!chip->acpi_dev_handle)
> return -ENODEV;
>
>- /* Find TCPA entry in RSDT (ACPI_LOGICAL_ADDRESSING) */
>- status = acpi_get_table(ACPI_SIG_TCPA, 1,
>- (struct acpi_table_header **)&buff);
>+ /* Find TCPA or TPM2 entry in RSDT (ACPI_LOGICAL_ADDRESSING) */
>+ table_sig = is_tpm2 ? ACPI_SIG_TPM2 : ACPI_SIG_TCPA;
>+ status = acpi_get_table(table_sig, 1, &buff);
>
> if (ACPI_FAILURE(status))
> return -ENODEV;
>
>- switch(buff->platform_class) {
>- case BIOS_SERVER:
>- len = buff->server.log_max_len;
>- start = buff->server.log_start_addr;
>- break;
>- case BIOS_CLIENT:
>- default:
>- len = buff->client.log_max_len;
>- start = buff->client.log_start_addr;
>- break;
>+ if (!is_tpm2) {
>+ tcpa = (struct acpi_tcpa *)buff;
>+ switch (tcpa->platform_class) {
>+ case BIOS_SERVER:
>+ len = tcpa->server.log_max_len;
>+ start = tcpa->server.log_start_addr;
>+ break;
>+ case BIOS_CLIENT:
>+ default:
>+ len = tcpa->client.log_max_len;
>+ start = tcpa->client.log_start_addr;
>+ break;
>+ }
>+ log_type = EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2;
>+ } else if (buff->length ==
>+ sizeof(struct acpi_table_tpm2) +
>+ sizeof(struct acpi_tpm2_trailer)) {
>+ tpm2_trailer = (struct acpi_tpm2_trailer *)buff;
>+
>+ len = tpm2_trailer.minimum_log_length;
>+ start = tpm2_trailer.log_address;

Are your builds not failing here? Both v3 and v4 have this.

>+ log_type = EFI_TCG2_EVENT_LOG_FORMAT_TCG_2;
>+ } else {
>+ return -ENODEV;
> }
>+
> if (!len) {
>- dev_warn(&chip->dev, "%s: TCPA log area empty\n", __func__);
>+ dev_warn(&chip->dev, "%s: %s log area empty\n",
>+ __func__, table_sig);
> return -EIO;
> }
>
>@@ -98,7 +120,7 @@ int tpm_read_log_acpi(struct tpm_chip *chip)
> memcpy_fromio(log->bios_event_log, virt, len);
>
> acpi_os_unmap_iomem(virt, len);
>- return EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2;
>+ return log_type;
>
> err:
> kfree(log->bios_event_log);
>--
>2.20.1
>

\
 
 \ /
  Last update: 2019-09-03 20:29    [W:0.060 / U:0.020 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site