Received: by 2002:a25:8b12:0:0:0:0:0 with SMTP id i18csp1603260ybl; Fri, 30 Aug 2019 22:13:51 -0700 (PDT) X-Google-Smtp-Source: APXvYqwWam/1gsubraflM89N1IMnULalILcRcaDqoS+ZlWyiMaXJHBc6T3pTL8zKhgBxjlDVFQQ2 X-Received: by 2002:a63:a66:: with SMTP id z38mr16336148pgk.247.1567228431633; Fri, 30 Aug 2019 22:13:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1567228431; cv=none; d=google.com; s=arc-20160816; b=soOUyPTeRmzLeXQq7N45EyMkymB0AwIGzTqyfGbIopDCP75zIEQIrtr7DFkTuVcbPv ifwGz5g+6Ydljls2t5kD2yimb8uvsKtB+gnKMCuw3wCJSyfgVT1ibiupI/CZwAvBvc1/ VQAWtKa0MbGjOnel2+5gwnSlsg5knnCyKfSAkSfDTvE6HEcGPcYgy+tBdJ51EGvROpVZ dueWKsPwSJ13DeD9923ilRixgojkJhWk6YdLTQagPzzH43DlBgyudTtEh2QzpWbC3uR4 bTUw/uL8+1PADbmHQPEO9zP7ofvZgPf5+/upvX3d4tv54ZuyPUpzy7zuFUsM6hH9ZHf6 UrvQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-filter; bh=rNNVJqcR6NyxsAwJxb30OZR4fJI7d/++paGukKWkcT8=; b=D3anBq/2dkofXBDR6Y/PY1i2S7acRUq4rjms++L2IzTL03KiXOloD0uMNYoIY5KKB+ AWOqRnP0946wToA9W712CgUqS55YUyB9XvLFqmD6yksWcva5G+/feKtgFBDSukbAgc5G 178dnInpo/qbNUNB+8uAfJqyqCZShC+EnhXCejCDvQzWPtqfNSCu7oqdG/uvwEHj3JXF hbnjhZn29LXfqGZWZfMkPDlYJYjz8GEQSvD7UXJRYexQn5yO6njeOnIyN70+zxpjw/Yj QQlR5gPl1ZvWLaHoFVXLE883AlX5KlswJgek/WGijoG6tnSvQlEmZ3WeeRe7XiUEogF+ AGZQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linux.microsoft.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id o8si5987570pgj.239.2019.08.30.22.13.35; Fri, 30 Aug 2019 22:13:51 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linux.microsoft.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726143AbfHaFL2 (ORCPT + 99 others); Sat, 31 Aug 2019 01:11:28 -0400 Received: from linux.microsoft.com ([13.77.154.182]:35994 "EHLO linux.microsoft.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725298AbfHaFL2 (ORCPT ); Sat, 31 Aug 2019 01:11:28 -0400 Received: from localhost.localdomain (c-67-168-100-174.hsd1.wa.comcast.net [67.168.100.174]) by linux.microsoft.com (Postfix) with ESMTPSA id 5E8BD20B7186; Fri, 30 Aug 2019 22:11:26 -0700 (PDT) DKIM-Filter: OpenDKIM Filter v2.11.0 linux.microsoft.com 5E8BD20B7186 From: Jordan Hand To: jarkko.sakkinen@linux.intel.com Cc: Jordan Hand , Peter Huewe , Jason Gunthorpe , Arnd Bergmann , Greg Kroah-Hartman , Thomas Gleixner , Allison Randal , linux-integrity@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v4] tpm: Parse event log from TPM2 ACPI table Date: Fri, 30 Aug 2019 22:10:27 -0700 Message-Id: <20190831051027.11544-1-jorhand@linux.microsoft.com> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- 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; + 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