+++ /dev/null
-/** @file\r
- Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>\r
- SPDX-License-Identifier: BSD-2-Clause-Patent\r
-**/\r
-\r
-#include <PiPei.h>\r
-#include <Library/BaseLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <IndustryStandard/Tpm20.h>\r
-#include <IndustryStandard/UefiTcgPlatform.h>\r
-#include <Library/HobLib.h>\r
-#include <Library/PrintLib.h>\r
-#include <Library/TcgEventLogRecordLib.h>\r
-#include <Library/TpmMeasurementLib.h>\r
-\r
-#include "PeilessStartupInternal.h"\r
-\r
-#define FV_HANDOFF_TABLE_DESC "Fv(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)"\r
-typedef PLATFORM_FIRMWARE_BLOB2_STRUCT CFV_HANDOFF_TABLE_POINTERS2;\r
-\r
-/**\r
- Get the FvName from the FV header.\r
-\r
- Causion: The FV is untrusted input.\r
-\r
- @param[in] FvBase Base address of FV image.\r
- @param[in] FvLength Length of FV image.\r
-\r
- @return FvName pointer\r
- @retval NULL FvName is NOT found\r
-**/\r
-VOID *\r
-GetFvName (\r
- IN EFI_PHYSICAL_ADDRESS FvBase,\r
- IN UINT64 FvLength\r
- )\r
-{\r
- EFI_FIRMWARE_VOLUME_HEADER *FvHeader;\r
- EFI_FIRMWARE_VOLUME_EXT_HEADER *FvExtHeader;\r
-\r
- if (FvBase >= MAX_ADDRESS) {\r
- return NULL;\r
- }\r
-\r
- if (FvLength >= MAX_ADDRESS - FvBase) {\r
- return NULL;\r
- }\r
-\r
- if (FvLength < sizeof (EFI_FIRMWARE_VOLUME_HEADER)) {\r
- return NULL;\r
- }\r
-\r
- FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)FvBase;\r
- if (FvHeader->ExtHeaderOffset < sizeof (EFI_FIRMWARE_VOLUME_HEADER)) {\r
- return NULL;\r
- }\r
-\r
- if (FvHeader->ExtHeaderOffset + sizeof (EFI_FIRMWARE_VOLUME_EXT_HEADER) > FvLength) {\r
- return NULL;\r
- }\r
-\r
- FvExtHeader = (EFI_FIRMWARE_VOLUME_EXT_HEADER *)(UINTN)(FvBase + FvHeader->ExtHeaderOffset);\r
-\r
- return &FvExtHeader->FvName;\r
-}\r
-\r
-/**\r
- Measure FV image.\r
-\r
- @param[in] FvBase Base address of FV image.\r
- @param[in] FvLength Length of FV image.\r
- @param[in] PcrIndex Index of PCR\r
-\r
- @retval EFI_SUCCESS Fv image is measured successfully\r
- or it has been already measured.\r
- @retval EFI_OUT_OF_RESOURCES No enough memory to log the new event.\r
- @retval EFI_DEVICE_ERROR The command was unsuccessful.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-MeasureFvImage (\r
- IN EFI_PHYSICAL_ADDRESS FvBase,\r
- IN UINT64 FvLength,\r
- IN UINT8 PcrIndex\r
- )\r
-{\r
- EFI_STATUS Status;\r
- CFV_HANDOFF_TABLE_POINTERS2 FvBlob2;\r
- VOID *FvName;\r
-\r
- //\r
- // Init the log event for FV measurement\r
- //\r
- FvBlob2.BlobDescriptionSize = sizeof (FvBlob2.BlobDescription);\r
- CopyMem (FvBlob2.BlobDescription, FV_HANDOFF_TABLE_DESC, sizeof (FvBlob2.BlobDescription));\r
- FvName = GetFvName (FvBase, FvLength);\r
- if (FvName != NULL) {\r
- AsciiSPrint ((CHAR8 *)FvBlob2.BlobDescription, sizeof (FvBlob2.BlobDescription), "Fv(%g)", FvName);\r
- }\r
-\r
- FvBlob2.BlobBase = FvBase;\r
- FvBlob2.BlobLength = FvLength;\r
-\r
- Status = TpmMeasureAndLogData (\r
- 1, // PCRIndex\r
- EV_EFI_PLATFORM_FIRMWARE_BLOB2, // EventType\r
- (VOID *)&FvBlob2, // EventData\r
- sizeof (FvBlob2), // EventSize\r
- (UINT8 *)(UINTN)FvBase, // HashData\r
- (UINTN)(FvLength) // HashDataLen\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- DEBUG ((DEBUG_ERROR, "The FV which failed to be measured starts at: 0x%x\n", FvBase));\r
- ASSERT (FALSE);\r
- }\r
-\r
- return Status;\r
-}\r