#include <Library/MemoryAllocationLib.h>\r
#include <Library/ReportStatusCodeLib.h>\r
#include <Library/ResetSystemLib.h>\r
+#include <Library/PrintLib.h>\r
\r
#define PERF_ID_TCG2_PEI 0x3080\r
\r
UINT32 mMeasuredMaxChildFvIndex = 0;\r
UINT32 mMeasuredChildFvIndex = 0;\r
\r
+#pragma pack (1)\r
+\r
+#define FV_HANDOFF_TABLE_DESC "Fv(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)"\r
+typedef struct {\r
+ UINT8 BlobDescriptionSize;\r
+ UINT8 BlobDescription[sizeof(FV_HANDOFF_TABLE_DESC)];\r
+ EFI_PHYSICAL_ADDRESS BlobBase;\r
+ UINT64 BlobLength;\r
+} FV_HANDOFF_TABLE_POINTERS2;\r
+\r
+#pragma pack ()\r
+\r
/**\r
Measure and record the Firmware Volume Information once FvInfoPPI install.\r
\r
);\r
}\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
+ if (FvLength >= MAX_ADDRESS - FvBase) {\r
+ return NULL;\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
+ if (FvHeader->ExtHeaderOffset + sizeof(EFI_FIRMWARE_VOLUME_EXT_HEADER) > FvLength) {\r
+ return NULL;\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
Add it into the measured FV list after the FV is measured successfully.\r
UINT32 Index;\r
EFI_STATUS Status;\r
EFI_PLATFORM_FIRMWARE_BLOB FvBlob;\r
+ FV_HANDOFF_TABLE_POINTERS2 FvBlob2;\r
+ VOID *EventData;\r
+ VOID *FvName;\r
TCG_PCR_EVENT_HDR TcgEventHdr;\r
UINT32 Instance;\r
UINT32 Tpm2HashMask;\r
//\r
// Init the log event for FV measurement\r
//\r
- FvBlob.BlobBase = FvBase;\r
- FvBlob.BlobLength = FvLength;\r
- TcgEventHdr.PCRIndex = 0;\r
- TcgEventHdr.EventType = EV_EFI_PLATFORM_FIRMWARE_BLOB;\r
- TcgEventHdr.EventSize = sizeof (FvBlob);\r
+ if (PcdGet32(PcdTcgPfpMeasurementRevision) >= TCG_EfiSpecIDEventStruct_SPEC_ERRATA_TPM2_REV_105) {\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
+ FvBlob2.BlobBase = FvBase;\r
+ FvBlob2.BlobLength = FvLength;\r
+ TcgEventHdr.EventType = EV_EFI_PLATFORM_FIRMWARE_BLOB2;\r
+ TcgEventHdr.EventSize = sizeof (FvBlob2);\r
+ EventData = &FvBlob2;\r
+ } else {\r
+ FvBlob.BlobBase = FvBase;\r
+ FvBlob.BlobLength = FvLength;\r
+ TcgEventHdr.PCRIndex = 0;\r
+ TcgEventHdr.EventType = EV_EFI_PLATFORM_FIRMWARE_BLOB;\r
+ TcgEventHdr.EventSize = sizeof (FvBlob);\r
+ EventData = &FvBlob;\r
+ }\r
\r
if (Tpm2HashMask == 0) {\r
//\r
);\r
\r
if (!EFI_ERROR(Status)) {\r
- Status = LogHashEvent (&DigestList, &TcgEventHdr, (UINT8*) &FvBlob);\r
- DEBUG ((DEBUG_INFO, "The pre-hashed FV which is extended & logged by Tcg2Pei starts at: 0x%x\n", FvBlob.BlobBase));\r
- DEBUG ((DEBUG_INFO, "The pre-hashed FV which is extended & logged by Tcg2Pei has the size: 0x%x\n", FvBlob.BlobLength));\r
+ Status = LogHashEvent (&DigestList, &TcgEventHdr, EventData);\r
+ DEBUG ((DEBUG_INFO, "The pre-hashed FV which is extended & logged by Tcg2Pei starts at: 0x%x\n", FvBase));\r
+ DEBUG ((DEBUG_INFO, "The pre-hashed FV which is extended & logged by Tcg2Pei has the size: 0x%x\n", FvLength));\r
} else if (Status == EFI_DEVICE_ERROR) {\r
BuildGuidHob (&gTpmErrorHobGuid,0);\r
REPORT_STATUS_CODE (\r
//\r
Status = HashLogExtendEvent (\r
0,\r
- (UINT8*) (UINTN) FvBlob.BlobBase,\r
- (UINTN) FvBlob.BlobLength,\r
- &TcgEventHdr,\r
- (UINT8*) &FvBlob\r
+ (UINT8*) (UINTN) FvBase, // HashData\r
+ (UINTN) FvLength, // HashDataLen\r
+ &TcgEventHdr, // EventHdr\r
+ EventData // EventData\r
);\r
- DEBUG ((DEBUG_INFO, "The FV which is measured by Tcg2Pei starts at: 0x%x\n", FvBlob.BlobBase));\r
- DEBUG ((DEBUG_INFO, "The FV which is measured by Tcg2Pei has the size: 0x%x\n", FvBlob.BlobLength));\r
+ DEBUG ((DEBUG_INFO, "The FV which is measured by Tcg2Pei starts at: 0x%x\n", FvBase));\r
+ DEBUG ((DEBUG_INFO, "The FV which is measured by Tcg2Pei has the size: 0x%x\n", FvLength));\r
}\r
\r
if (EFI_ERROR(Status)) {\r