From fc72a6ceaa4859ef3043b706100827d4fbcc3bed Mon Sep 17 00:00:00 2001 From: Laszlo Ersek Date: Thu, 21 May 2020 00:58:40 +0200 Subject: OvmfPkg/Tcg2ConfigPei: factor out InternalTpm12Detect() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move the calls to the Tpm12RequestUseTpm() and Tpm12SubmitCommand() Tpm12DeviceLib functions to a separate C file, so that we can override these actions in a subsequent patch. This code movement requires moving the TPM_RSP_GET_TICKS / TestTpm12() helper structure / function too. While at it, give the TestTpm12() function @retval / @return documentation, plus wrap an overlong line in it. Functionally, this patch is a no-op. Cc: Ard Biesheuvel Cc: Eric Auger Cc: Jordan Justen Cc: Marc-André Lureau Cc: Philippe Mathieu-Daudé Cc: Simon Hardy Cc: Stefan Berger Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2728 Signed-off-by: Laszlo Ersek Message-Id: <20200520225841.17793-3-lersek@redhat.com> Reviewed-by: Ard Biesheuvel Tested-by: Ard Biesheuvel --- OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf | 2 + OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPeim.c | 46 ++----------------- OvmfPkg/Tcg/Tcg2Config/Tpm12Support.c | 79 ++++++++++++++++++++++++++++++++ OvmfPkg/Tcg/Tcg2Config/Tpm12Support.h | 30 ++++++++++++ 4 files changed, 115 insertions(+), 42 deletions(-) create mode 100644 OvmfPkg/Tcg/Tcg2Config/Tpm12Support.c create mode 100644 OvmfPkg/Tcg/Tcg2Config/Tpm12Support.h (limited to 'OvmfPkg/Tcg') diff --git a/OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf b/OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf index b79d0a3fb9..aa996b7da7 100644 --- a/OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf +++ b/OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPei.inf @@ -21,6 +21,8 @@ [Sources] Tcg2ConfigPeim.c + Tpm12Support.c + Tpm12Support.h [Packages] MdePkg/MdePkg.dec diff --git a/OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPeim.c b/OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPeim.c index 44abd6c541..cc54d95cad 100644 --- a/OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPeim.c +++ b/OvmfPkg/Tcg/Tcg2Config/Tcg2ConfigPeim.c @@ -15,13 +15,13 @@ #include #include -#include #include #include #include -#include #include +#include "Tpm12Support.h" + STATIC CONST EFI_PEI_PPI_DESCRIPTOR mTpmSelectedPpi = { (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), &gEfiTpmDeviceSelectedGuid, @@ -34,44 +34,6 @@ STATIC CONST EFI_PEI_PPI_DESCRIPTOR mTpmInitializationDonePpiList = { NULL }; -#pragma pack (1) - -typedef struct { - TPM_RSP_COMMAND_HDR Hdr; - TPM_CURRENT_TICKS CurrentTicks; -} TPM_RSP_GET_TICKS; - -#pragma pack () - -/** - Probe for the TPM for 1.2 version, by sending TPM1.2 GetTicks - - Sending a TPM1.2 command to a TPM2 should return a TPM1.2 - header (tag = 0xc4) and error code (TPM_BADTAG = 0x1e) -**/ -static -EFI_STATUS -TestTpm12 ( - ) -{ - EFI_STATUS Status; - TPM_RQU_COMMAND_HDR Command; - TPM_RSP_GET_TICKS Response; - UINT32 Length; - - Command.tag = SwapBytes16 (TPM_TAG_RQU_COMMAND); - Command.paramSize = SwapBytes32 (sizeof (Command)); - Command.ordinal = SwapBytes32 (TPM_ORD_GetTicks); - - Length = sizeof (Response); - Status = Tpm12SubmitCommand (sizeof (Command), (UINT8 *)&Command, &Length, (UINT8 *)&Response); - if (EFI_ERROR (Status)) { - return Status; - } - - return EFI_SUCCESS; -} - /** The entry point for Tcg2 configuration driver. @@ -90,8 +52,8 @@ Tcg2ConfigPeimEntryPoint ( DEBUG ((DEBUG_INFO, "%a\n", __FUNCTION__)); - Status = Tpm12RequestUseTpm (); - if (!EFI_ERROR (Status) && !EFI_ERROR (TestTpm12 ())) { + Status = InternalTpm12Detect (); + if (!EFI_ERROR (Status)) { DEBUG ((DEBUG_INFO, "%a: TPM1.2 detected\n", __FUNCTION__)); Size = sizeof (gEfiTpmDeviceInstanceTpm12Guid); Status = PcdSetPtrS ( diff --git a/OvmfPkg/Tcg/Tcg2Config/Tpm12Support.c b/OvmfPkg/Tcg/Tcg2Config/Tpm12Support.c new file mode 100644 index 0000000000..4f5a775c7a --- /dev/null +++ b/OvmfPkg/Tcg/Tcg2Config/Tpm12Support.c @@ -0,0 +1,79 @@ +/** @file + Implement the InternalTpm12Detect() function on top of the Tpm12DeviceLib + class. + + Copyright (C) 2020, Red Hat, Inc. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include + +#include "Tpm12Support.h" + +#pragma pack (1) +typedef struct { + TPM_RSP_COMMAND_HDR Hdr; + TPM_CURRENT_TICKS CurrentTicks; +} TPM_RSP_GET_TICKS; +#pragma pack () + +/** + Probe for the TPM for 1.2 version, by sending TPM1.2 GetTicks + + Sending a TPM1.2 command to a TPM2 should return a TPM1.2 + header (tag = 0xc4) and error code (TPM_BADTAG = 0x1e) + + @retval EFI_SUCCESS TPM version 1.2 probing successful. + + @return Error codes propagated from Tpm12SubmitCommand(). +**/ +STATIC +EFI_STATUS +TestTpm12 ( + ) +{ + EFI_STATUS Status; + TPM_RQU_COMMAND_HDR Command; + TPM_RSP_GET_TICKS Response; + UINT32 Length; + + Command.tag = SwapBytes16 (TPM_TAG_RQU_COMMAND); + Command.paramSize = SwapBytes32 (sizeof (Command)); + Command.ordinal = SwapBytes32 (TPM_ORD_GetTicks); + + Length = sizeof (Response); + Status = Tpm12SubmitCommand (sizeof (Command), (UINT8 *)&Command, &Length, + (UINT8 *)&Response); + if (EFI_ERROR (Status)) { + return Status; + } + + return EFI_SUCCESS; +} + +/** + Detect the presence of a TPM with interface version 1.2. + + @retval EFI_SUCCESS TPM-1.2 available. The Tpm12RequestUseTpm() and + Tpm12SubmitCommand(TPM_ORD_GetTicks) operations + (from the Tpm12DeviceLib class) have succeeded. + + @return Error codes propagated from Tpm12RequestUseTpm() and + Tpm12SubmitCommand(). +**/ +EFI_STATUS +InternalTpm12Detect ( + VOID + ) +{ + EFI_STATUS Status; + + Status = Tpm12RequestUseTpm (); + if (EFI_ERROR (Status)) { + return Status; + } + + return TestTpm12 (); +} diff --git a/OvmfPkg/Tcg/Tcg2Config/Tpm12Support.h b/OvmfPkg/Tcg/Tcg2Config/Tpm12Support.h new file mode 100644 index 0000000000..c739775d23 --- /dev/null +++ b/OvmfPkg/Tcg/Tcg2Config/Tpm12Support.h @@ -0,0 +1,30 @@ +/** @file + Declare the InternalTpm12Detect() function, hiding the TPM-1.2 detection + internals. + + Copyright (C) 2020, Red Hat, Inc. + + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef TPM12_SUPPORT_H_ +#define TPM12_SUPPORT_H_ + +#include + +/** + Detect the presence of a TPM with interface version 1.2. + + @retval EFI_SUCCESS TPM-1.2 available. The Tpm12RequestUseTpm() and + Tpm12SubmitCommand(TPM_ORD_GetTicks) operations + (from the Tpm12DeviceLib class) have succeeded. + + @return Error codes propagated from Tpm12RequestUseTpm() and + Tpm12SubmitCommand(). +**/ +EFI_STATUS +InternalTpm12Detect ( + VOID + ); + +#endif // TPM12_SUPPORT_H_ -- cgit v1.2.3