]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/Library/PeilessStartupLib/IntelTdx.c
OvmfPkg: Refactor MeasureHobList
[mirror_edk2.git] / OvmfPkg / Library / PeilessStartupLib / IntelTdx.c
CommitLineData
4b0a6226
MX
1/** @file\r
2 Copyright (c) 2022, Intel Corporation. All rights reserved.<BR>\r
3 SPDX-License-Identifier: BSD-2-Clause-Patent\r
4**/\r
5\r
6#include <PiPei.h>\r
7#include <Library/BaseLib.h>\r
8#include <Library/BaseMemoryLib.h>\r
9#include <Library/DebugLib.h>\r
ff0ffe59
MX
10#include <IndustryStandard/Tpm20.h>\r
11#include <IndustryStandard/UefiTcgPlatform.h>\r
12#include <Library/HobLib.h>\r
13#include <Library/PrintLib.h>\r
d59279f8 14#include <Library/TcgEventLogRecordLib.h>\r
ff0ffe59
MX
15#include <Library/TpmMeasurementLib.h>\r
16\r
4b0a6226
MX
17#include "PeilessStartupInternal.h"\r
18\r
d59279f8
MX
19#define FV_HANDOFF_TABLE_DESC "Fv(XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX)"\r
20typedef PLATFORM_FIRMWARE_BLOB2_STRUCT CFV_HANDOFF_TABLE_POINTERS2;\r
21\r
ff0ffe59
MX
22/**\r
23 Get the FvName from the FV header.\r
24\r
25 Causion: The FV is untrusted input.\r
26\r
27 @param[in] FvBase Base address of FV image.\r
28 @param[in] FvLength Length of FV image.\r
29\r
30 @return FvName pointer\r
31 @retval NULL FvName is NOT found\r
32**/\r
33VOID *\r
34GetFvName (\r
35 IN EFI_PHYSICAL_ADDRESS FvBase,\r
36 IN UINT64 FvLength\r
37 )\r
38{\r
39 EFI_FIRMWARE_VOLUME_HEADER *FvHeader;\r
40 EFI_FIRMWARE_VOLUME_EXT_HEADER *FvExtHeader;\r
41\r
42 if (FvBase >= MAX_ADDRESS) {\r
43 return NULL;\r
44 }\r
45\r
46 if (FvLength >= MAX_ADDRESS - FvBase) {\r
47 return NULL;\r
48 }\r
49\r
50 if (FvLength < sizeof (EFI_FIRMWARE_VOLUME_HEADER)) {\r
51 return NULL;\r
52 }\r
53\r
54 FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *)(UINTN)FvBase;\r
55 if (FvHeader->ExtHeaderOffset < sizeof (EFI_FIRMWARE_VOLUME_HEADER)) {\r
56 return NULL;\r
57 }\r
58\r
59 if (FvHeader->ExtHeaderOffset + sizeof (EFI_FIRMWARE_VOLUME_EXT_HEADER) > FvLength) {\r
60 return NULL;\r
61 }\r
62\r
63 FvExtHeader = (EFI_FIRMWARE_VOLUME_EXT_HEADER *)(UINTN)(FvBase + FvHeader->ExtHeaderOffset);\r
64\r
65 return &FvExtHeader->FvName;\r
66}\r
67\r
68/**\r
69 Measure FV image.\r
70\r
71 @param[in] FvBase Base address of FV image.\r
72 @param[in] FvLength Length of FV image.\r
73 @param[in] PcrIndex Index of PCR\r
74\r
75 @retval EFI_SUCCESS Fv image is measured successfully\r
76 or it has been already measured.\r
77 @retval EFI_OUT_OF_RESOURCES No enough memory to log the new event.\r
78 @retval EFI_DEVICE_ERROR The command was unsuccessful.\r
79\r
80**/\r
81EFI_STATUS\r
82EFIAPI\r
83MeasureFvImage (\r
84 IN EFI_PHYSICAL_ADDRESS FvBase,\r
85 IN UINT64 FvLength,\r
86 IN UINT8 PcrIndex\r
87 )\r
88{\r
d59279f8
MX
89 EFI_STATUS Status;\r
90 CFV_HANDOFF_TABLE_POINTERS2 FvBlob2;\r
91 VOID *FvName;\r
ff0ffe59
MX
92\r
93 //\r
94 // Init the log event for FV measurement\r
95 //\r
96 FvBlob2.BlobDescriptionSize = sizeof (FvBlob2.BlobDescription);\r
97 CopyMem (FvBlob2.BlobDescription, FV_HANDOFF_TABLE_DESC, sizeof (FvBlob2.BlobDescription));\r
98 FvName = GetFvName (FvBase, FvLength);\r
99 if (FvName != NULL) {\r
100 AsciiSPrint ((CHAR8 *)FvBlob2.BlobDescription, sizeof (FvBlob2.BlobDescription), "Fv(%g)", FvName);\r
101 }\r
102\r
103 FvBlob2.BlobBase = FvBase;\r
104 FvBlob2.BlobLength = FvLength;\r
105\r
106 Status = TpmMeasureAndLogData (\r
107 1, // PCRIndex\r
108 EV_EFI_PLATFORM_FIRMWARE_BLOB2, // EventType\r
109 (VOID *)&FvBlob2, // EventData\r
110 sizeof (FvBlob2), // EventSize\r
111 (UINT8 *)(UINTN)FvBase, // HashData\r
112 (UINTN)(FvLength) // HashDataLen\r
113 );\r
114\r
115 if (EFI_ERROR (Status)) {\r
116 DEBUG ((DEBUG_ERROR, "The FV which failed to be measured starts at: 0x%x\n", FvBase));\r
117 ASSERT (FALSE);\r
118 }\r
119\r
120 return Status;\r
121}\r