IN EFI_BOOT_MODE BootMode\r
)\r
{\r
- UINTN FvIndex;\r
- CONST HASH_ALG_INFO *AlgInfo;\r
- UINT8 *HashValue;\r
- UINT8 *FvHashValue;\r
- VOID *FvBuffer;\r
- EFI_STATUS Status;\r
+ UINTN FvIndex;\r
+ CONST HASH_ALG_INFO *AlgInfo;\r
+ UINT8 *HashValue;\r
+ UINT8 *FvHashValue;\r
+ VOID *FvBuffer;\r
+ EDKII_PEI_FIRMWARE_VOLUME_SHADOW_PPI *FvShadowPpi;\r
+ EFI_STATUS Status;\r
\r
if ((HashInfo == NULL) ||\r
(HashInfo->HashSize == 0) ||\r
// Copy FV to permanent memory to avoid potential TOC/TOU.\r
//\r
FvBuffer = AllocatePages (EFI_SIZE_TO_PAGES ((UINTN)FvInfo[FvIndex].Length));\r
+\r
ASSERT (FvBuffer != NULL);\r
- CopyMem (FvBuffer, (CONST VOID *)(UINTN)FvInfo[FvIndex].Base, (UINTN)FvInfo[FvIndex].Length);\r
+ Status = PeiServicesLocatePpi (\r
+ &gEdkiiPeiFirmwareVolumeShadowPpiGuid,\r
+ 0,\r
+ NULL,\r
+ (VOID **)&FvShadowPpi\r
+ );\r
+\r
+ if (!EFI_ERROR (Status)) {\r
+ Status = FvShadowPpi->FirmwareVolumeShadow (\r
+ (EFI_PHYSICAL_ADDRESS)FvInfo[FvIndex].Base,\r
+ FvBuffer,\r
+ (UINTN)FvInfo[FvIndex].Length\r
+ );\r
+ }\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ CopyMem (\r
+ FvBuffer,\r
+ (CONST VOID *)(UINTN)FvInfo[FvIndex].Base,\r
+ (UINTN)FvInfo[FvIndex].Length\r
+ );\r
+ }\r
\r
if (!AlgInfo->HashAll (FvBuffer, (UINTN)FvInfo[FvIndex].Length, FvHashValue)) {\r
Status = EFI_ABORTED;\r
#include <IndustryStandard/Tpm20.h>\r
\r
#include <Ppi/FirmwareVolumeInfoStoredHashFv.h>\r
+#include <Ppi/FirmwareVolumeShadowPpi.h>\r
\r
#include <Library/PeiServicesLib.h>\r
#include <Library/PcdLib.h>\r