Commit8923699291
introduced an explicit Tpm12CommandLib dependency to Tcg2ConfigPei. In reality this lib class is not consumed by Tcg2ConfigPei at all (such a dependency is not even inherited from other lib instances). Simplify the module by dropping the superfluous dependency. (The Tpm12CommandLib class resolution that was also added in commit8923699291
is not useless, at the platform build level: it is consumed by TcgPei and TcgDxe. Meaning that said Tpm12CommandLib resolution should have likely been a part of the subsequent patch in the original series, namely commit 6be54f15a0c9.) Commit8923699291
also introduced SwapBytesXx() calls. Those functions are provided by BaseLib. Spell out the BaseLib dependency. Functionally, this patch is a no-op. Cc: Ard Biesheuvel <ard.biesheuvel@arm.com> Cc: Eric Auger <eric.auger@redhat.com> Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Marc-André Lureau <marcandre.lureau@redhat.com> Cc: Philippe Mathieu-Daudé <philmd@redhat.com> Cc: Simon Hardy <simon.hardy@itdev.co.uk> Cc: Stefan Berger <stefanb@linux.ibm.com> Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2728 Signed-off-by: Laszlo Ersek <lersek@redhat.com> Message-Id: <20200520225841.17793-2-lersek@redhat.com> Reviewed-by: Ard Biesheuvel <ard.biesheuvel@arm.com> Tested-by: Ard Biesheuvel <ard.biesheuvel@arm.com>
136 lines
3.8 KiB
C
136 lines
3.8 KiB
C
/** @file
|
|
Set TPM device type
|
|
|
|
In SecurityPkg, this module initializes the TPM device type based on a UEFI
|
|
variable and/or hardware detection. In OvmfPkg, the module only performs TPM2
|
|
hardware detection.
|
|
|
|
Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
|
|
Copyright (C) 2018, Red Hat, Inc.
|
|
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
**/
|
|
|
|
|
|
#include <PiPei.h>
|
|
|
|
#include <Guid/TpmInstance.h>
|
|
#include <Library/BaseLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/PeiServicesLib.h>
|
|
#include <Library/Tpm2DeviceLib.h>
|
|
#include <Library/Tpm12DeviceLib.h>
|
|
#include <Ppi/TpmInitialized.h>
|
|
|
|
STATIC CONST EFI_PEI_PPI_DESCRIPTOR mTpmSelectedPpi = {
|
|
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
|
|
&gEfiTpmDeviceSelectedGuid,
|
|
NULL
|
|
};
|
|
|
|
STATIC CONST EFI_PEI_PPI_DESCRIPTOR mTpmInitializationDonePpiList = {
|
|
EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
|
|
&gPeiTpmInitializationDonePpiGuid,
|
|
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.
|
|
|
|
@param FileHandle Handle of the file being invoked.
|
|
@param PeiServices Describes the list of possible PEI Services.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
Tcg2ConfigPeimEntryPoint (
|
|
IN EFI_PEI_FILE_HANDLE FileHandle,
|
|
IN CONST EFI_PEI_SERVICES **PeiServices
|
|
)
|
|
{
|
|
UINTN Size;
|
|
EFI_STATUS Status;
|
|
|
|
DEBUG ((DEBUG_INFO, "%a\n", __FUNCTION__));
|
|
|
|
Status = Tpm12RequestUseTpm ();
|
|
if (!EFI_ERROR (Status) && !EFI_ERROR (TestTpm12 ())) {
|
|
DEBUG ((DEBUG_INFO, "%a: TPM1.2 detected\n", __FUNCTION__));
|
|
Size = sizeof (gEfiTpmDeviceInstanceTpm12Guid);
|
|
Status = PcdSetPtrS (
|
|
PcdTpmInstanceGuid,
|
|
&Size,
|
|
&gEfiTpmDeviceInstanceTpm12Guid
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
} else {
|
|
Status = Tpm2RequestUseTpm ();
|
|
if (!EFI_ERROR (Status)) {
|
|
DEBUG ((DEBUG_INFO, "%a: TPM2 detected\n", __FUNCTION__));
|
|
Size = sizeof (gEfiTpmDeviceInstanceTpm20DtpmGuid);
|
|
Status = PcdSetPtrS (
|
|
PcdTpmInstanceGuid,
|
|
&Size,
|
|
&gEfiTpmDeviceInstanceTpm20DtpmGuid
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
} else {
|
|
DEBUG ((DEBUG_INFO, "%a: no TPM detected\n", __FUNCTION__));
|
|
//
|
|
// If no TPM2 was detected, we still need to install
|
|
// TpmInitializationDonePpi. Namely, Tcg2Pei will exit early upon seeing
|
|
// the default (all-bits-zero) contents of PcdTpmInstanceGuid, thus we have
|
|
// to install the PPI in its place, in order to unblock any dependent
|
|
// PEIMs.
|
|
//
|
|
Status = PeiServicesInstallPpi (&mTpmInitializationDonePpiList);
|
|
ASSERT_EFI_ERROR (Status);
|
|
}
|
|
}
|
|
|
|
//
|
|
// Selection done
|
|
//
|
|
Status = PeiServicesInstallPpi (&mTpmSelectedPpi);
|
|
ASSERT_EFI_ERROR (Status);
|
|
|
|
return Status;
|
|
}
|