14 EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK,
15 &gEfiPeiFirmwareVolumeInfoPpiGuid,
19 (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
20 &gEfiPeiFirmwareVolumeInfo2PpiGuid,
37 EFI_PEI_FIRMWARE_VOLUME_PPI_SIGNATURE,
38 EFI_PEI_FIRMWARE_VOLUME_PPI_REVISION
54 EFI_PEI_FIRMWARE_VOLUME_PPI_SIGNATURE,
55 EFI_PEI_FIRMWARE_VOLUME_PPI_REVISION
60 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
61 &gEfiFirmwareFileSystem2Guid,
66 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
67 &gEfiFirmwareFileSystem3Guid,
92UINT8 mFvAttributes2[] = { 17, 18, 19, 20, 21, 22, 23, 24 };
104 IN EFI_FFS_FILE_ATTRIBUTES FfsAttributes
110 DataAlignment = (UINT8)((FfsAttributes & FFS_ATTRIB_DATA_ALIGNMENT) >> 3);
111 ASSERT (DataAlignment < 8);
113 if ((FfsAttributes & FFS_ATTRIB_DATA_ALIGNMENT_2) != 0) {
119 if ((FfsAttributes & FFS_ATTRIB_FIXED) == FFS_ATTRIB_FIXED) {
120 FileAttribute |= EFI_FV_FILE_ATTRIB_FIXED;
123 return FileAttribute;
138 IN UINT8 ErasePolarity,
142 EFI_FFS_FILE_STATE FileState;
143 EFI_FFS_FILE_STATE HighestBit;
145 FileState = FfsHeader->State;
147 if (ErasePolarity != 0) {
148 FileState = (EFI_FFS_FILE_STATE) ~FileState;
155 while (HighestBit != 0 && (HighestBit & FileState) == 0) {
178 if (IS_FFS_FILE2 (FileHeader)) {
183 TestFileHeader.
State = 0;
192 TestFileHeader.
State = 0;
217 BestIndex = PrivateData->
FvCount;
224 for (Index = 0; Index < PrivateData->
FvCount; Index++) {
225 FwVolHeader = PrivateData->
Fv[Index].FvHeader;
226 if (((UINT64)(
UINTN)FileHandle > (UINT64)(
UINTN)FwVolHeader) && \
227 ((UINT64)(
UINTN)FileHandle <= ((UINT64)(
UINTN)FwVolHeader + FwVolHeader->FvLength - 1)))
229 if (BestIndex == PrivateData->
FvCount) {
232 if ((UINT64)(
UINTN)PrivateData->
Fv[BestIndex].FvHeader < (UINT64)(
UINTN)FwVolHeader) {
239 if (BestIndex < PrivateData->FvCount) {
240 return &PrivateData->
Fv[BestIndex];
269 IN EFI_FV_FILETYPE SearchType,
279 UINT32 FileOccupiedSize;
296 if ((FwVolHeader->
Attributes & EFI_FVB2_ERASE_POLARITY) != 0) {
307 if ((*FileHeader ==
NULL) || (FileName !=
NULL)) {
320 if (IS_FFS_FILE2 (*FileHeader)) {
322 DEBUG ((DEBUG_ERROR,
"It is a FFS3 formatted file: %g in a non-FFS3 formatted FV.\n", &(*FileHeader)->Name));
325 FileLength = FFS_FILE2_SIZE (*FileHeader);
326 ASSERT (FileLength > 0x00FFFFFF);
334 FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
338 FileOffset = ((UINT8 *)FfsFileHeader - (UINT8 *)FwVolHeader);
339 ASSERT (FileOffset <= MAX_UINT32);
345 FileState =
GetFileState (ErasePolarity, FfsFileHeader);
348 case EFI_FILE_HEADER_INVALID:
349 if (IS_FFS_FILE2 (FfsFileHeader)) {
351 DEBUG ((DEBUG_ERROR,
"Found a FFS3 formatted file: %g in a non-FFS3 formatted FV.\n", &FfsFileHeader->
Name));
363 case EFI_FILE_DATA_VALID:
364 case EFI_FILE_MARKED_FOR_UPDATE:
368 return EFI_NOT_FOUND;
371 if (IS_FFS_FILE2 (FfsFileHeader)) {
372 FileLength = FFS_FILE2_SIZE (FfsFileHeader);
373 ASSERT (FileLength > 0x00FFFFFF);
374 FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
376 DEBUG ((DEBUG_ERROR,
"Found a FFS3 formatted file: %g in a non-FFS3 formatted FV.\n", &FfsFileHeader->
Name));
377 FileOffset += FileOccupiedSize;
383 FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
387 if ((FfsFileHeader->
Attributes & FFS_ATTRIB_CHECKSUM) == FFS_ATTRIB_CHECKSUM) {
388 if (IS_FFS_FILE2 (FfsFileHeader)) {
398 return EFI_NOT_FOUND;
401 if (FileName !=
NULL) {
403 *FileHeader = FfsFileHeader;
407 if ((FfsFileHeader->
Type == EFI_FV_FILETYPE_PEIM) ||
408 (FfsFileHeader->
Type == EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER) ||
409 (FfsFileHeader->
Type == EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE))
411 *FileHeader = FfsFileHeader;
413 }
else if (AprioriFile !=
NULL) {
414 if (FfsFileHeader->
Type == EFI_FV_FILETYPE_FREEFORM) {
421 (FfsFileHeader->
Type != EFI_FV_FILETYPE_FFS_PAD))
423 *FileHeader = FfsFileHeader;
427 FileOffset += FileOccupiedSize;
431 case EFI_FILE_DELETED:
432 if (IS_FFS_FILE2 (FfsFileHeader)) {
434 DEBUG ((DEBUG_ERROR,
"Found a FFS3 formatted file: %g in a non-FFS3 formatted FV.\n", &FfsFileHeader->
Name));
437 FileLength = FFS_FILE2_SIZE (FfsFileHeader);
438 ASSERT (FileLength > 0x00FFFFFF);
443 FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
444 FileOffset += FileOccupiedSize;
450 return EFI_NOT_FOUND;
455 return EFI_NOT_FOUND;
473 if (FvHeader->ExtHeaderOffset == 0) {
478 return &FvExtHeader->
FvName;
524 Status = FvPpi->ProcessVolume (
526 SecCoreData->BootFirmwareVolumeBase,
533 ASSERT (PrivateData->Fv !=
NULL);
534 PrivateData->MaxFvCount = FV_GROWTH_STEP;
539 PrivateData->Fv[PrivateData->FvCount].FvHeader = BfvHeader;
540 PrivateData->Fv[PrivateData->FvCount].FvPpi = FvPpi;
541 PrivateData->Fv[PrivateData->FvCount].FvHandle = FvHandle;
542 PrivateData->Fv[PrivateData->FvCount].AuthenticationStatus = 0;
545 "The %dth FV[%g] start address is 0x%11p, size is 0x%08x, handle is 0x%p\n",
546 (UINT32)PrivateData->FvCount,
552 PrivateData->FvCount++;
598 if (
CompareGuid (NotifyDescriptor->Guid, &gEfiPeiFirmwareVolumeInfo2PpiGuid)) {
636 if (!EFI_ERROR (Status)) {
640 Status = FvPpi->ProcessVolume (FvPpi, FvInfo2Ppi.
FvInfo, FvInfo2Ppi.
FvInfoSize, &FvHandle);
641 if (EFI_ERROR (Status)) {
642 DEBUG ((DEBUG_ERROR,
"Fail to process new found FV, FV may be corrupted!\n"));
649 for (FvIndex = 0; FvIndex < PrivateData->
FvCount; FvIndex++) {
650 if (PrivateData->
Fv[FvIndex].FvHandle == FvHandle) {
656 DEBUG ((DEBUG_INFO,
"The FV %p has already been processed!\n", FvInfo2Ppi.
FvInfo));
668 ASSERT (TempPtr !=
NULL);
674 PrivateData->
Fv = TempPtr;
682 PrivateData->
Fv[PrivateData->
FvCount].FvPpi = FvPpi;
683 PrivateData->
Fv[PrivateData->
FvCount].FvHandle = FvHandle;
685 CurFvCount = PrivateData->
FvCount;
688 "The %dth FV[%g] start address is 0x%11p, size is 0x%08x, handle is 0x%p\n",
702 Status = FvPpi->FindFileByType (
704 EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE,
708 if (!EFI_ERROR (Status)) {
709 Status = FvPpi->FindSectionByType (
711 EFI_SECTION_PEI_DEPEX,
715 if (!EFI_ERROR (Status)) {
724 DEBUG ((DEBUG_INFO,
"Found firmware volume Image File[%g] %p in FV[%d] %p\n", FileHandle, FileHandle, CurFvCount, FvHandle));
727 }
while (FileHandle !=
NULL);
729 DEBUG ((DEBUG_ERROR,
"Fail to process FV %p because no corresponding EFI_FIRMWARE_VOLUME_PPI is found!\n", FvInfo2Ppi.
FvInfo));
765 if (Hob.Raw !=
NULL) {
766 GuidRecorded = (
EFI_GUID *)GET_GUID_HOB_DATA (Hob);
767 if (
CompareGuid (GuidRecorded, GuidedSectionGuid)) {
772 if (!EFI_ERROR (Status) && (Interface !=
NULL)) {
809 IN EFI_SECTION_TYPE SectionType,
814 OUT UINT32 *AuthenticationStatus,
819 UINT32 SectionLength;
826 UINT32 Authentication;
829 BOOLEAN SectionCached;
830 VOID *TempOutputBuffer;
831 UINT32 TempAuthenticationStatus;
832 UINT16 GuidedSectionAttributes;
835 *OutputBuffer =
NULL;
838 Status = EFI_NOT_FOUND;
841 while (ParsedLength < SectionSize) {
842 if (IS_SECTION2 (Section)) {
843 ASSERT (SECTION2_SIZE (Section) > 0x00FFFFFF);
845 DEBUG ((DEBUG_ERROR,
"Found a FFS3 formatted section in a non-FFS3 formatted FV.\n"));
846 SectionLength = SECTION2_SIZE (Section);
847 if (SectionLength == 0) {
855 SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
856 ASSERT (SectionLength != 0);
857 ParsedLength += SectionLength;
863 if (Section->Type == SectionType) {
867 (*SectionInstance)--;
868 if (*SectionInstance == 0) {
872 if (IS_SECTION2 (Section)) {
880 if (IS_SECTION2 (Section)) {
881 SectionLength = SECTION2_SIZE (Section);
886 if (SectionLength == 0) {
894 SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
895 ASSERT (SectionLength != 0);
896 ParsedLength += SectionLength;
904 SectionCached =
FALSE;
905 for (Index = 0; Index < PrivateData->CacheSection.AllSectionCount; Index++) {
906 if (Section == PrivateData->CacheSection.Section[Index]) {
907 SectionCached =
TRUE;
908 PpiOutput = PrivateData->CacheSection.SectionData[Index];
909 PpiOutputSize = PrivateData->CacheSection.SectionSize[Index];
910 Authentication = PrivateData->CacheSection.AuthenticationStatus[Index];
914 TempAuthenticationStatus = 0;
922 &TempAuthenticationStatus,
925 if (!EFI_ERROR (Status)) {
926 *OutputBuffer = TempOutputBuffer;
927 *AuthenticationStatus = TempAuthenticationStatus | Authentication;
936 if (!SectionCached) {
937 Status = EFI_NOT_FOUND;
939 if (Section->Type == EFI_SECTION_GUID_DEFINED) {
940 if (IS_SECTION2 (Section)) {
949 Status = GuidSectionPpi->ExtractSection (
961 if ((GuidedSectionAttributes & EFI_GUIDED_SECTION_AUTH_STATUS_VALID) == EFI_GUIDED_SECTION_AUTH_STATUS_VALID) {
962 Authentication |= EFI_AUTH_STATUS_IMAGE_SIGNED | EFI_AUTH_STATUS_NOT_TESTED;
965 if (IS_SECTION2 (Section)) {
975 if (!EFI_ERROR (Status)) {
976 Status = DecompressPpi->Decompress (
985 if (!EFI_ERROR (Status)) {
986 if ((Authentication & EFI_AUTH_STATUS_NOT_TESTED) == 0) {
990 if (PrivateData->CacheSection.AllSectionCount < CACHE_SETION_MAX_NUMBER) {
991 PrivateData->CacheSection.AllSectionCount++;
994 PrivateData->CacheSection.Section[PrivateData->CacheSection.SectionIndex] = Section;
995 PrivateData->CacheSection.SectionData[PrivateData->CacheSection.SectionIndex] = PpiOutput;
996 PrivateData->CacheSection.SectionSize[PrivateData->CacheSection.SectionIndex] = PpiOutputSize;
997 PrivateData->CacheSection.AuthenticationStatus[PrivateData->CacheSection.SectionIndex] = Authentication;
998 PrivateData->CacheSection.SectionIndex = (PrivateData->CacheSection.SectionIndex + 1)%CACHE_SETION_MAX_NUMBER;
1001 TempAuthenticationStatus = 0;
1009 &TempAuthenticationStatus,
1012 if (!EFI_ERROR (Status)) {
1013 *OutputBuffer = TempOutputBuffer;
1014 *AuthenticationStatus = TempAuthenticationStatus | Authentication;
1021 if (IS_SECTION2 (Section)) {
1022 SectionLength = SECTION2_SIZE (Section);
1027 if (SectionLength == 0) {
1035 SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
1036 ASSERT (SectionLength != 0);
1037 ParsedLength += SectionLength;
1041 return EFI_NOT_FOUND;
1061 IN EFI_SECTION_TYPE SectionType,
1069 if ((CoreFvHandle ==
NULL) || (CoreFvHandle->FvPpi ==
NULL)) {
1070 return EFI_NOT_FOUND;
1073 return CoreFvHandle->FvPpi->FindSectionByType (CoreFvHandle->FvPpi, SectionType, FileHandle, SectionData);
1094 IN EFI_SECTION_TYPE SectionType,
1098 OUT UINT32 *AuthenticationStatus
1104 if ((CoreFvHandle ==
NULL) || (CoreFvHandle->FvPpi ==
NULL)) {
1105 return EFI_NOT_FOUND;
1108 if ((CoreFvHandle->FvPpi->
Signature == EFI_PEI_FIRMWARE_VOLUME_PPI_SIGNATURE) &&
1109 (CoreFvHandle->FvPpi->
Revision == EFI_PEI_FIRMWARE_VOLUME_PPI_REVISION))
1111 return CoreFvHandle->FvPpi->FindSectionByType2 (CoreFvHandle->FvPpi, SectionType, SectionInstance, FileHandle, SectionData, AuthenticationStatus);
1118 return EFI_UNSUPPORTED;
1141 IN UINT8 SearchType,
1150 if ((CoreFvHandle ==
NULL) || (CoreFvHandle->FvPpi ==
NULL)) {
1151 return EFI_NOT_FOUND;
1154 return CoreFvHandle->FvPpi->FindFileByType (CoreFvHandle->FvPpi, SearchType, FvHandle, FileHandle);
1181 if (VolumeHandle ==
NULL) {
1182 return EFI_INVALID_PARAMETER;
1188 if (CoreFvHandle ==
NULL) {
1189 *VolumeHandle =
NULL;
1190 return EFI_NOT_FOUND;
1193 *VolumeHandle = CoreFvHandle->FvHandle;
1221 if ((VolumeHandle ==
NULL) || (FileName ==
NULL) || (FileHandle ==
NULL)) {
1222 return EFI_INVALID_PARAMETER;
1226 if ((CoreFvHandle ==
NULL) || (CoreFvHandle->FvPpi ==
NULL)) {
1227 return EFI_NOT_FOUND;
1230 return CoreFvHandle->FvPpi->FindFileByName (CoreFvHandle->FvPpi, FileName, &VolumeHandle, FileHandle);
1254 return EFI_INVALID_PARAMETER;
1261 if ((CoreFvHandle ==
NULL) || (CoreFvHandle->FvPpi ==
NULL)) {
1262 return EFI_INVALID_PARAMETER;
1265 return CoreFvHandle->FvPpi->GetFileInfo (CoreFvHandle->FvPpi, FileHandle,
FileInfo);
1289 return EFI_INVALID_PARAMETER;
1296 if ((CoreFvHandle ==
NULL) || (CoreFvHandle->FvPpi ==
NULL)) {
1297 return EFI_INVALID_PARAMETER;
1300 if ((CoreFvHandle->FvPpi->
Signature == EFI_PEI_FIRMWARE_VOLUME_PPI_SIGNATURE) &&
1301 (CoreFvHandle->FvPpi->
Revision == EFI_PEI_FIRMWARE_VOLUME_PPI_REVISION))
1303 return CoreFvHandle->FvPpi->GetFileInfo2 (CoreFvHandle->FvPpi, FileHandle,
FileInfo);
1310 return EFI_UNSUPPORTED;
1339 if ((VolumeInfo ==
NULL) || (VolumeHandle ==
NULL)) {
1340 return EFI_INVALID_PARAMETER;
1345 if ((CoreHandle ==
NULL) || (CoreHandle->FvPpi ==
NULL)) {
1346 return EFI_INVALID_PARAMETER;
1349 return CoreHandle->FvPpi->GetVolumeInfo (CoreHandle->FvPpi, VolumeHandle, VolumeInfo);
1369 OUT UINT32 *FvUsedSize,
1370 OUT UINT8 *EraseByte
1373 UINT16 ExtHeaderOffset;
1379 if (ExtHeaderOffset != 0) {
1389 if ((
ReadUnaligned32 (&FvHeader->Attributes) & EFI_FVB2_ERASE_POLARITY) != 0) {
1397 "FV at 0x%x has 0x%x used size, and erase byte is 0x%02x\n",
1447 UINT32 AuthenticationStatus;
1457 while ((HobPtr.Raw =
GetNextHob (EFI_HOB_TYPE_FV2, HobPtr.Raw)) !=
NULL) {
1462 DEBUG ((DEBUG_INFO,
"FV file %p has been dispatched!\r\n", ParentFvFileHandle));
1466 HobPtr.Raw = GET_NEXT_HOB (HobPtr);
1469 ParentFvHandle = ParentFvCoreHandle->FvHandle;
1470 ParentFvPpi = ParentFvCoreHandle->FvPpi;
1479 AuthenticationStatus = 0;
1480 if ((ParentFvPpi->
Signature == EFI_PEI_FIRMWARE_VOLUME_PPI_SIGNATURE) &&
1481 (ParentFvPpi->
Revision == EFI_PEI_FIRMWARE_VOLUME_PPI_REVISION))
1483 Status = ParentFvPpi->FindSectionByType2 (
1485 EFI_SECTION_FIRMWARE_VOLUME_IMAGE,
1489 &AuthenticationStatus
1500 Status = ParentFvPpi->FindSectionByType (
1502 EFI_SECTION_FIRMWARE_VOLUME_IMAGE,
1508 if (EFI_ERROR (Status)) {
1512 Status =
VerifyPeim (PrivateData, ParentFvHandle, ParentFvFileHandle, AuthenticationStatus);
1513 if (Status == EFI_SECURITY_VIOLATION) {
1527 if (FvAlignment < 8) {
1533 "%a() FV at 0x%x, FvAlignment required is 0x%x\n",
1542 if ((
UINTN)FvHeader % FvAlignment != 0) {
1545 if (NewFvBuffer ==
NULL) {
1546 Status = EFI_OUT_OF_RESOURCES;
1556 (UINT8 *)NewFvBuffer + FvUsedSize,
1557 (
UINTN)(FvLength - FvUsedSize),
1568 Status = ParentFvPpi->GetVolumeInfo (ParentFvPpi, ParentFvHandle, &ParentFvImageInfo);
1571 Status = ParentFvPpi->GetFileInfo (ParentFvPpi, ParentFvFileHandle, &
FileInfo);
1583 &ParentFvImageInfo.
FvName,
1585 AuthenticationStatus
1589 &FvHeader->FileSystemGuid,
1591 (UINT32)FvHeader->FvLength,
1592 &ParentFvImageInfo.
FvName,
1611 &ParentFvImageInfo.
FvName,
1621 AuthenticationStatus,
1623 &ParentFvImageInfo.
FvName,
1675 ASSERT (FvHandle !=
NULL);
1677 if (Buffer ==
NULL) {
1678 return EFI_VOLUME_CORRUPTED;
1691 if (EFI_ERROR (Status)) {
1692 DEBUG ((DEBUG_ERROR,
"Fail to verify FV which address is 0x%11p", Buffer));
1693 return EFI_VOLUME_CORRUPTED;
1725 IN EFI_FV_FILETYPE SearchType,
1771 if ((FvHandle ==
NULL) || (FileName ==
NULL) || (FileHandle ==
NULL)) {
1772 return EFI_INVALID_PARAMETER;
1775 if (*FvHandle !=
NULL) {
1777 if (Status == EFI_NOT_FOUND) {
1784 Status = EFI_NOT_FOUND;
1787 for (Index = 0; Index < PrivateData->
FvCount; Index++) {
1791 if (PrivateData->
Fv[Index].FvPpi !=
NULL) {
1792 Status =
FindFileEx (PrivateData->
Fv[Index].FvHandle, FileName, 0, FileHandle,
NULL);
1793 if (!EFI_ERROR (Status)) {
1794 *FvHandle = PrivateData->
Fv[Index].FvHandle;
1832 UINT8 ErasePolarity;
1838 return EFI_INVALID_PARAMETER;
1845 if (CoreFvHandle ==
NULL) {
1846 return EFI_INVALID_PARAMETER;
1849 FwVolInstance = PEI_FW_VOL_INSTANCE_FROM_FV_THIS (This);
1851 if ((CoreFvHandle->FvHeader->
Attributes & EFI_FVB2_ERASE_POLARITY) != 0) {
1862 switch (FileState) {
1863 case EFI_FILE_DATA_VALID:
1864 case EFI_FILE_MARKED_FOR_UPDATE:
1867 return EFI_INVALID_PARAMETER;
1871 if (IS_FFS_FILE2 (FileHeader)) {
1872 ASSERT (FFS_FILE2_SIZE (FileHeader) > 0x00FFFFFF);
1873 if (!FwVolInstance->IsFfs3Fv) {
1874 DEBUG ((DEBUG_ERROR,
"It is a FFS3 formatted file: %g in a non-FFS3 formatted FV.\n", &FileHeader->
Name));
1875 return EFI_INVALID_PARAMETER;
1888 if ((CoreFvHandle->FvHeader->
Attributes & EFI_FVB2_MEMORY_MAPPED) == EFI_FVB2_MEMORY_MAPPED) {
1889 FileInfo->FileAttributes |= EFI_FV_FILE_ATTRIB_MEMORY_MAPPED;
1926 return EFI_INVALID_PARAMETER;
1933 if (CoreFvHandle ==
NULL) {
1934 return EFI_INVALID_PARAMETER;
1938 if (!EFI_ERROR (Status)) {
1939 FileInfo->AuthenticationStatus = CoreFvHandle->AuthenticationStatus;
1970 if ((VolumeInfo ==
NULL) || (FvHandle ==
NULL)) {
1971 return EFI_INVALID_PARAMETER;
1984 if (FwVolHeader.
Signature != EFI_FVH_SIGNATURE) {
1985 return EFI_INVALID_PARAMETER;
1989 VolumeInfo->FvAttributes = FwVolHeader.
Attributes;
1990 VolumeInfo->FvStart = (
VOID *)FvHandle;
1991 VolumeInfo->FvSize = FwVolHeader.
FvLength;
2025 IN EFI_SECTION_TYPE SearchType,
2030 UINT32 AuthenticationStatus;
2062 IN EFI_SECTION_TYPE SearchType,
2066 OUT UINT32 *AuthenticationStatus
2076 UINT32 ExtractedAuthenticationStatus;
2078 if (SectionData ==
NULL) {
2079 return EFI_NOT_FOUND;
2082 FwVolInstance = PEI_FW_VOL_INSTANCE_FROM_FV_THIS (This);
2088 if (CoreFvHandle ==
NULL) {
2089 return EFI_NOT_FOUND;
2094 if (IS_FFS_FILE2 (FfsFileHeader)) {
2095 ASSERT (FFS_FILE2_SIZE (FfsFileHeader) > 0x00FFFFFF);
2096 if (!FwVolInstance->IsFfs3Fv) {
2097 DEBUG ((DEBUG_ERROR,
"It is a FFS3 formatted file: %g in a non-FFS3 formatted FV.\n", &FfsFileHeader->
Name));
2098 return EFI_NOT_FOUND;
2108 Instance = SearchInstance + 1;
2109 ExtractedAuthenticationStatus = 0;
2117 &ExtractedAuthenticationStatus,
2118 FwVolInstance->IsFfs3Fv
2120 if (!EFI_ERROR (Status)) {
2124 *AuthenticationStatus = ExtractedAuthenticationStatus | CoreFvHandle->AuthenticationStatus;
2147 for (Index = 0; Index < PrivateData->
FvCount; Index++) {
2148 if (FvHandle == PrivateData->
Fv[Index].FvHandle) {
2149 return &PrivateData->
Fv[Index];
2173 if (Instance >= Private->FvCount) {
2177 return &Private->Fv[Instance];
2203 &gEfiFirmwareFileSystem2Guid,
2220 for (Index = 0; Index < PrivateData->FvCount; Index++) {
2221 if (PrivateData->Fv[Index].FvPpi == OldFfsFvPpi) {
2222 PrivateData->Fv[Index].FvPpi = &mPeiFfs2FwVol.Fv;
2231 &gEfiFirmwareFileSystem3Guid,
2248 for (Index = 0; Index < PrivateData->FvCount; Index++) {
2249 if (PrivateData->Fv[Index].FvPpi == OldFfsFvPpi) {
2250 PrivateData->Fv[Index].FvPpi = &mPeiFfs3FwVol.Fv;
2281 if (PrivateData->UnknownFvInfoCount >= PrivateData->MaxUnknownFvInfoCount) {
2288 ASSERT (TempPtr !=
NULL);
2291 PrivateData->UnknownFvInfo,
2294 PrivateData->UnknownFvInfo = TempPtr;
2295 PrivateData->MaxUnknownFvInfoCount = PrivateData->MaxUnknownFvInfoCount + FV_GROWTH_STEP;
2298 NewUnknownFv = &PrivateData->UnknownFvInfo[PrivateData->UnknownFvInfoCount];
2299 PrivateData->UnknownFvInfoCount++;
2301 CopyGuid (&NewUnknownFv->FvFormat, &FvInfo2Ppi->FvFormat);
2302 NewUnknownFv->FvInfo = FvInfo2Ppi->FvInfo;
2303 NewUnknownFv->FvInfoSize = FvInfo2Ppi->FvInfoSize;
2304 NewUnknownFv->AuthenticationStatus = FvInfo2Ppi->AuthenticationStatus;
2305 NewUnknownFv->NotifyDescriptor.
Flags = (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST);
2306 NewUnknownFv->NotifyDescriptor.
Guid = &NewUnknownFv->FvFormat;
2333 OUT UINT32 *FvInfoSize,
2334 OUT UINT32 *AuthenticationStatus
2341 for ( ; Index < PrivateData->UnknownFvInfoCount; Index++) {
2342 if (
CompareGuid (Format, &PrivateData->UnknownFvInfo[Index].FvFormat)) {
2347 if (Index == PrivateData->UnknownFvInfoCount) {
2348 return EFI_NOT_FOUND;
2351 *FvInfo = PrivateData->UnknownFvInfo[Index].FvInfo;
2352 *FvInfoSize = PrivateData->UnknownFvInfo[Index].FvInfoSize;
2353 *AuthenticationStatus = PrivateData->UnknownFvInfo[Index].AuthenticationStatus;
2359 for ( ; Index2 < PrivateData->UnknownFvInfoCount; Index2++, Index++) {
2363 PrivateData->UnknownFvInfoCount--;
2391 UINT32 AuthenticationStatus;
2394 BOOLEAN IsProcessed;
2405 Status =
FindUnknownFormatFvInfo (PrivateData, NotifyDescriptor->Guid, &FvInfo, &FvInfoSize, &AuthenticationStatus);
2406 if (EFI_ERROR (Status)) {
2413 Status = FvPpi->ProcessVolume (FvPpi, FvInfo, FvInfoSize, &FvHandle);
2414 if (EFI_ERROR (Status)) {
2415 DEBUG ((DEBUG_ERROR,
"Fail to process the FV 0x%p, FV may be corrupted!\n", FvInfo));
2422 IsProcessed =
FALSE;
2423 for (FvIndex = 0; FvIndex < PrivateData->
FvCount; FvIndex++) {
2424 if (PrivateData->
Fv[FvIndex].FvHandle == FvHandle) {
2425 DEBUG ((DEBUG_INFO,
"The FV %p has already been processed!\n", FvInfo));
2442 ASSERT (TempPtr !=
NULL);
2448 PrivateData->
Fv = TempPtr;
2456 PrivateData->
Fv[PrivateData->
FvCount].FvPpi = FvPpi;
2457 PrivateData->
Fv[PrivateData->
FvCount].FvHandle = FvHandle;
2458 PrivateData->
Fv[PrivateData->
FvCount].AuthenticationStatus = AuthenticationStatus;
2459 CurFvCount = PrivateData->
FvCount;
2462 "The %dth FV[%g] start address is 0x%11p, size is 0x%08x, handle is 0x%p\n",
2476 Status = FvPpi->FindFileByType (
2478 EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE,
2482 if (!EFI_ERROR (Status)) {
2483 Status = FvPpi->FindSectionByType (
2485 EFI_SECTION_PEI_DEPEX,
2489 if (!EFI_ERROR (Status)) {
2498 DEBUG ((DEBUG_INFO,
"Found firmware volume Image File[%g] %p in FV[%d] %p\n", FileHandle, FileHandle, CurFvCount, FvHandle));
2499 ProcessFvFile (PrivateData, &PrivateData->
Fv[CurFvCount], FileHandle);
2501 }
while (FileHandle !=
NULL);
CONST EFI_PEI_SERVICES **EFIAPI GetPeiServicesTablePointer(VOID)
VOID EFIAPI BuildFv2Hob(IN EFI_PHYSICAL_ADDRESS BaseAddress, IN UINT64 Length, IN CONST EFI_GUID *FvName, IN CONST EFI_GUID *FileName)
VOID *EFIAPI GetFirstGuidHob(IN CONST EFI_GUID *Guid)
VOID EFIAPI BuildFvHob(IN EFI_PHYSICAL_ADDRESS BaseAddress, IN UINT64 Length)
VOID EFIAPI BuildFv3Hob(IN EFI_PHYSICAL_ADDRESS BaseAddress, IN UINT64 Length, IN UINT32 AuthenticationStatus, IN BOOLEAN ExtractedFv, IN CONST EFI_GUID *FvName OPTIONAL, IN CONST EFI_GUID *FileName OPTIONAL)
VOID *EFIAPI GetNextHob(IN UINT16 Type, IN CONST VOID *HobStart)
VOID *EFIAPI GetHobList(VOID)
UINT64 EFIAPI ReadUnaligned64(IN CONST VOID *Buffer)
UINT8 EFIAPI CalculateSum8(IN CONST UINT8 *Buffer, IN UINTN Length)
UINT8 EFIAPI CalculateCheckSum8(IN CONST UINT8 *Buffer, IN UINTN Length)
UINT32 EFIAPI ReadUnaligned32(IN CONST VOID *Buffer)
UINT16 EFIAPI ReadUnaligned16(IN CONST VOID *Buffer)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI SetMem(OUT VOID *Buffer, IN UINTN Length, IN UINT8 Value)
BOOLEAN EFIAPI CompareGuid(IN CONST GUID *Guid1, IN CONST GUID *Guid2)
GUID *EFIAPI CopyGuid(OUT GUID *DestinationGuid, IN CONST GUID *SourceGuid)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
STATIC BOOLEAN EFIAPI FileHandleToVolume(IN EFI_PEI_FILE_HANDLE FileHandle, OUT EFI_PEI_FV_HANDLE *VolumeHandle)
STATIC EFI_FFS_FILE_STATE GetFileState(IN UINT8 ErasePolarity, IN EFI_FFS_FILE_HEADER *FfsHeader)
EFI_STATUS FindFileEx(IN CONST EFI_PEI_FV_HANDLE FvHandle, IN CONST EFI_GUID *FileName OPTIONAL, IN EFI_FV_FILETYPE SearchType, IN OUT EFI_PEI_FILE_HANDLE *FileHandle)
STATIC UINT8 CalculateHeaderChecksum(IN EFI_FFS_FILE_HEADER *FileHeader)
VOID *EFIAPI AllocateZeroPool(IN UINTN AllocationSize)
VOID EFIAPI PeiServicesInstallFvInfoPpi(IN CONST EFI_GUID *FvFormat OPTIONAL, IN CONST VOID *FvInfo, IN UINT32 FvInfoSize, IN CONST EFI_GUID *ParentFvName OPTIONAL, IN CONST EFI_GUID *ParentFileName OPTIONAL)
EFI_STATUS EFIAPI PeiServicesLocatePpi(IN CONST EFI_GUID *Guid, IN UINTN Instance, IN OUT EFI_PEI_PPI_DESCRIPTOR **PpiDescriptor, IN OUT VOID **Ppi)
EFI_STATUS EFIAPI PeiServicesNotifyPpi(IN CONST EFI_PEI_NOTIFY_DESCRIPTOR *NotifyList)
EFI_STATUS EFIAPI PeiServicesInstallPpi(IN CONST EFI_PEI_PPI_DESCRIPTOR *PpiList)
EFI_STATUS EFIAPI PeiServicesReInstallPpi(IN CONST EFI_PEI_PPI_DESCRIPTOR *OldPpi, IN CONST EFI_PEI_PPI_DESCRIPTOR *NewPpi)
BOOLEAN PeimDispatchReadiness(IN EFI_PEI_SERVICES **PeiServices, IN VOID *DependencyExpression)
EFI_STATUS EFIAPI PeiFfsGetVolumeInfo(IN EFI_PEI_FV_HANDLE VolumeHandle, OUT EFI_FV_INFO *VolumeInfo)
EFI_STATUS EFIAPI PeiFfsFindFileByName(IN CONST EFI_GUID *FileName, IN EFI_PEI_FV_HANDLE VolumeHandle, OUT EFI_PEI_FILE_HANDLE *FileHandle)
EFI_STATUS EFIAPI PeiFfsFvPpiGetFileInfo2(IN CONST EFI_PEI_FIRMWARE_VOLUME_PPI *This, IN EFI_PEI_FILE_HANDLE FileHandle, OUT EFI_FV_FILE_INFO2 *FileInfo)
PEI_CORE_FV_HANDLE * FvHandleToCoreHandle(IN EFI_PEI_FV_HANDLE FvHandle)
EFI_STATUS EFIAPI PeiFfsFvPpiFindSectionByType2(IN CONST EFI_PEI_FIRMWARE_VOLUME_PPI *This, IN EFI_SECTION_TYPE SearchType, IN UINTN SearchInstance, IN EFI_PEI_FILE_HANDLE FileHandle, OUT VOID **SectionData, OUT UINT32 *AuthenticationStatus)
EFI_STATUS AddUnknownFormatFvInfo(IN PEI_CORE_INSTANCE *PrivateData, IN EFI_PEI_FIRMWARE_VOLUME_INFO2_PPI *FvInfo2Ppi)
PEI_CORE_FV_HANDLE * FindNextCoreFvHandle(IN PEI_CORE_INSTANCE *Private, IN UINTN Instance)
VOID PeiReinitializeFv(IN PEI_CORE_INSTANCE *PrivateData)
EFI_STATUS EFIAPI PeiFfsFindSectionData3(IN CONST EFI_PEI_SERVICES **PeiServices, IN EFI_SECTION_TYPE SectionType, IN UINTN SectionInstance, IN EFI_PEI_FILE_HANDLE FileHandle, OUT VOID **SectionData, OUT UINT32 *AuthenticationStatus)
EFI_STATUS EFIAPI PeiFfsFvPpiFindFileByType(IN CONST EFI_PEI_FIRMWARE_VOLUME_PPI *This, IN EFI_FV_FILETYPE SearchType, IN EFI_PEI_FV_HANDLE FvHandle, IN OUT EFI_PEI_FILE_HANDLE *FileHandle)
EFI_STATUS EFIAPI PeiFfsGetFileInfo(IN EFI_PEI_FILE_HANDLE FileHandle, OUT EFI_FV_FILE_INFO *FileInfo)
BOOLEAN GetFvUsedSize(IN EFI_FIRMWARE_VOLUME_HEADER *FvHeader, OUT UINT32 *FvUsedSize, OUT UINT8 *EraseByte)
EFI_STATUS EFIAPI PeiFfsGetFileInfo2(IN EFI_PEI_FILE_HANDLE FileHandle, OUT EFI_FV_FILE_INFO2 *FileInfo)
EFI_STATUS FindUnknownFormatFvInfo(IN PEI_CORE_INSTANCE *PrivateData, IN EFI_GUID *Format, OUT VOID **FvInfo, OUT UINT32 *FvInfoSize, OUT UINT32 *AuthenticationStatus)
EFI_STATUS EFIAPI PeiFfsFvPpiProcessVolume(IN CONST EFI_PEI_FIRMWARE_VOLUME_PPI *This, IN VOID *Buffer, IN UINTN BufferSize, OUT EFI_PEI_FV_HANDLE *FvHandle)
EFI_STATUS EFIAPI FirmwareVolumeInfoPpiNotifyCallback(IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, IN VOID *Ppi)
VOID PeiInitializeFv(IN PEI_CORE_INSTANCE *PrivateData, IN CONST EFI_SEC_PEI_HAND_OFF *SecCoreData)
EFI_STATUS EFIAPI PeiFfsFvPpiGetFileInfo(IN CONST EFI_PEI_FIRMWARE_VOLUME_PPI *This, IN EFI_PEI_FILE_HANDLE FileHandle, OUT EFI_FV_FILE_INFO *FileInfo)
EFI_STATUS EFIAPI PeiFfsFindNextVolume(IN CONST EFI_PEI_SERVICES **PeiServices, IN UINTN Instance, IN OUT EFI_PEI_FV_HANDLE *VolumeHandle)
EFI_STATUS EFIAPI PeiFfsFindSectionData(IN CONST EFI_PEI_SERVICES **PeiServices, IN EFI_SECTION_TYPE SectionType, IN EFI_PEI_FILE_HANDLE FileHandle, OUT VOID **SectionData)
EFI_FV_FILE_ATTRIBUTES FfsAttributes2FvFileAttributes(IN EFI_FFS_FILE_ATTRIBUTES FfsAttributes)
EFI_STATUS EFIAPI PeiFfsFindNextFile(IN CONST EFI_PEI_SERVICES **PeiServices, IN UINT8 SearchType, IN EFI_PEI_FV_HANDLE FvHandle, IN OUT EFI_PEI_FILE_HANDLE *FileHandle)
EFI_STATUS EFIAPI PeiFfsFvPpiFindSectionByType(IN CONST EFI_PEI_FIRMWARE_VOLUME_PPI *This, IN EFI_SECTION_TYPE SearchType, IN EFI_PEI_FILE_HANDLE FileHandle, OUT VOID **SectionData)
EFI_STATUS ProcessSection(IN CONST EFI_PEI_SERVICES **PeiServices, IN EFI_SECTION_TYPE SectionType, IN OUT UINTN *SectionInstance, IN EFI_COMMON_SECTION_HEADER *Section, IN UINTN SectionSize, OUT VOID **OutputBuffer, OUT UINT32 *AuthenticationStatus, IN BOOLEAN IsFfs3Fv)
EFI_STATUS EFIAPI PeiFfsFvPpiGetVolumeInfo(IN CONST EFI_PEI_FIRMWARE_VOLUME_PPI *This, IN EFI_PEI_FV_HANDLE FvHandle, OUT EFI_FV_INFO *VolumeInfo)
EFI_STATUS EFIAPI PeiFfsFvPpiFindFileByName(IN CONST EFI_PEI_FIRMWARE_VOLUME_PPI *This, IN CONST EFI_GUID *FileName, IN EFI_PEI_FV_HANDLE *FvHandle, OUT EFI_PEI_FILE_HANDLE *FileHandle)
EFI_GUID * GetFvName(IN CONST EFI_FIRMWARE_VOLUME_HEADER *FvHeader)
BOOLEAN VerifyGuidedSectionGuid(IN EFI_GUID *GuidedSectionGuid, OUT EFI_PEI_GUIDED_SECTION_EXTRACTION_PPI **GuidedSectionExtraction)
EFI_STATUS ProcessFvFile(IN PEI_CORE_INSTANCE *PrivateData, IN PEI_CORE_FV_HANDLE *ParentFvCoreHandle, IN EFI_PEI_FILE_HANDLE ParentFvFileHandle)
EFI_STATUS EFIAPI ThirdPartyFvPpiNotifyCallback(IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, IN VOID *Ppi)
#define ALIGN_POINTER(Pointer, Alignment)
#define ASSERT_EFI_ERROR(StatusParameter)
#define DEBUG(Expression)
EFI_STATUS VerifyFv(IN EFI_FIRMWARE_VOLUME_HEADER *CurrentFvAddress)
EFI_STATUS VerifyPeim(IN PEI_CORE_INSTANCE *PrivateData, IN EFI_PEI_FV_HANDLE VolumeHandle, IN EFI_PEI_FILE_HANDLE FileHandle, IN UINT32 AuthenticationStatus)
#define PEI_CORE_INTERNAL_FFS_FILE_DISPATCH_TYPE
#define PEI_CORE_INSTANCE_FROM_PS_THIS(a)
VOID EFIAPI PeiServicesInstallFvInfo2Ppi(IN CONST EFI_GUID *FvFormat OPTIONAL, IN CONST VOID *FvInfo, IN UINT32 FvInfoSize, IN CONST EFI_GUID *ParentFvName OPTIONAL, IN CONST EFI_GUID *ParentFileName OPTIONAL, IN UINT32 AuthenticationStatus)
#define EFI_FILE_HEADER_CONSTRUCTION
#define EFI_FV_FILETYPE_ALL
#define EFI_GUIDED_SECTION_PROCESSING_REQUIRED
#define EFI_SECTION_COMPRESSION
#define FFS_FIXED_CHECKSUM
#define FFS_FILE_SIZE(FfsFileHeaderPtr)
#define SECTION_SIZE(SectionHeaderPtr)
UINT32 EFI_FV_FILE_ATTRIBUTES
VOID * EFI_PEI_FILE_HANDLE
VOID *EFIAPI AllocateAlignedPages(IN UINTN Pages, IN UINTN Alignment)
EFI_FILE_INFO * FileInfo(IN EFI_FILE_HANDLE FHand)
UINT64 EFI_PHYSICAL_ADDRESS
#define EFI_SIZE_TO_PAGES(Size)
UINT32 AuthenticationStatus
EFI_PEIM_NOTIFY_ENTRY_POINT Notify
EFI_FFS_INTEGRITY_CHECK IntegrityCheck
EFI_FFS_INTEGRITY_CHECK IntegrityCheck
EFI_FFS_FILE_ATTRIBUTES Attributes
EFI_FVB_ATTRIBUTES_2 Attributes