15#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
16 (ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1))
32 IN UINT8 ErasePolarity,
36 EFI_FFS_FILE_STATE FileState;
37 EFI_FFS_FILE_STATE HighestBit;
39 FileState = FfsHeader->State;
41 if (ErasePolarity != 0) {
42 FileState = (EFI_FFS_FILE_STATE) ~FileState;
46 while (HighestBit != 0 && (HighestBit & FileState) == 0) {
73 Ptr = (UINT8 *)FileHeader;
76 Sum = (UINT8)(Sum + Ptr[Index]);
77 Sum = (UINT8)(Sum + Ptr[Index+1]);
78 Sum = (UINT8)(Sum + Ptr[Index+2]);
79 Sum = (UINT8)(Sum + Ptr[Index+3]);
83 Sum = (UINT8)(Sum + Ptr[Index]);
89 Sum = (UINT8)(Sum - FileHeader->State);
93 Sum = (UINT8)(Sum - FileHeader->IntegrityCheck.Checksum.File);
119 if (Hob.Raw ==
NULL) {
124 Hob.Raw =
GetNextHob (EFI_HOB_TYPE_FV, Hob.Raw);
125 if (Hob.Raw !=
NULL) {
127 if (((UINT64)(
UINTN)FileHandle > (UINT64)(
UINTN)FwVolHeader) && \
128 ((UINT64)(
UINTN)FileHandle <= ((UINT64)(
UINTN)FwVolHeader + FwVolHeader->FvLength - 1)))
134 Hob.Raw =
GetNextHob (EFI_HOB_TYPE_FV, GET_NEXT_HOB (Hob));
136 }
while (Hob.Raw !=
NULL);
155 IN EFI_FV_FILETYPE SearchType,
164 UINT32 FileOccupiedSize;
174 if (FwVolHeader->
Attributes & EFI_FVB2_ERASE_POLARITY) {
185 if ((*FileHeader ==
NULL) || (FileName !=
NULL)) {
196 FileLength = *(UINT32 *)(*FileHeader)->
Size & 0x00FFFFFF;
197 FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
204 FileOffset = (UINT32)((UINT8 *)FfsFileHeader - (UINT8 *)FwVolHeader);
205 ASSERT (FileOffset <= 0xFFFFFFFF);
211 FileState =
GetFileState (ErasePolarity, FfsFileHeader);
214 case EFI_FILE_HEADER_INVALID:
219 case EFI_FILE_DATA_VALID:
220 case EFI_FILE_MARKED_FOR_UPDATE:
224 return EFI_NOT_FOUND;
227 FileLength = *(UINT32 *)(FfsFileHeader->
Size) & 0x00FFFFFF;
228 FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
230 if (FileName !=
NULL) {
232 *FileHeader = FfsFileHeader;
236 (FfsFileHeader->
Type != EFI_FV_FILETYPE_FFS_PAD))
238 *FileHeader = FfsFileHeader;
242 FileOffset += FileOccupiedSize;
246 case EFI_FILE_DELETED:
247 FileLength = *(UINT32 *)(FfsFileHeader->
Size) & 0x00FFFFFF;
248 FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
249 FileOffset += FileOccupiedSize;
255 return EFI_NOT_FOUND;
260 return EFI_NOT_FOUND;
277 IN EFI_SECTION_TYPE SectionType,
281 OUT VOID **OutputBuffer
285 UINT32 SectionLength;
289 UINT32 DstBufferSize;
291 UINT32 ScratchBufferSize;
293 UINT16 SectionAttribute;
294 UINT32 AuthenticationStatus;
295 CHAR8 *CompressedData;
296 UINT32 CompressedDataLength;
300 *OutputBuffer =
NULL;
302 Status = EFI_NOT_FOUND;
303 while (ParsedLength < SectionSize) {
304 if (IS_SECTION2 (Section)) {
305 ASSERT (SECTION2_SIZE (Section) > 0x00FFFFFF);
308 if (Section->Type == SectionType) {
309 if (SectionCheckHook !=
NULL) {
316 if (IS_SECTION2 (Section)) {
324 goto CheckNextSection;
328 if (IS_SECTION2 (Section)) {
330 SectionLength = SECTION2_SIZE (Section);
332 if (CompressionSection2->
CompressionType != EFI_STANDARD_COMPRESSION) {
333 return EFI_UNSUPPORTED;
343 return EFI_UNSUPPORTED;
352 CompressedDataLength,
356 }
else if (Section->Type == EFI_SECTION_GUID_DEFINED) {
365 if (EFI_ERROR (Status)) {
369 DEBUG ((DEBUG_ERROR,
"Decompress GetInfo Failed - %r\n", Status));
370 return EFI_NOT_FOUND;
377 if (ScratchBuffer ==
NULL) {
378 return EFI_OUT_OF_RESOURCES;
385 if (DstBuffer ==
NULL) {
386 return EFI_OUT_OF_RESOURCES;
393 if (IS_SECTION2 (Section)) {
403 if (IS_SECTION2 (Section)) {
414 }
else if (Section->Type == EFI_SECTION_GUID_DEFINED) {
415 Status = ExtractGuidedSectionDecode (
419 &AuthenticationStatus
423 if (EFI_ERROR (Status)) {
427 DEBUG ((DEBUG_ERROR,
"Decompress Failed - %r\n", Status));
428 return EFI_NOT_FOUND;
441 if (IS_SECTION2 (Section)) {
442 SectionLength = SECTION2_SIZE (Section);
451 SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
452 ASSERT (SectionLength != 0);
453 ParsedLength += SectionLength;
457 return EFI_NOT_FOUND;
477 IN EFI_SECTION_TYPE SectionType,
480 OUT VOID **SectionData
495 FileSize = *(UINT32 *)(FfsFileHeader->
Size) & 0x00FFFFFF;
522 IN EFI_SECTION_TYPE SectionType,
524 OUT VOID **SectionData
575 if (Hob.Raw ==
NULL) {
576 return EFI_NOT_FOUND;
580 Hob.Raw =
GetNextHob (EFI_HOB_TYPE_FV, Hob.Raw);
581 if (Hob.Raw !=
NULL) {
582 if (Instance-- == 0) {
587 Hob.Raw =
GetNextHob (EFI_HOB_TYPE_FV, GET_NEXT_HOB (Hob));
589 }
while (Hob.Raw !=
NULL);
591 return EFI_NOT_FOUND;
622 if ((VolumeHandle ==
NULL) || (FileName ==
NULL) || (FileHandle ==
NULL)) {
623 return EFI_INVALID_PARAMETER;
626 Status =
FindFileEx (VolumeHandle, FileName, 0, FileHandle);
627 if (Status == EFI_NOT_FOUND) {
663 return EFI_INVALID_PARAMETER;
671 return EFI_INVALID_PARAMETER;
686 case EFI_FILE_DATA_VALID:
687 case EFI_FILE_MARKED_FOR_UPDATE:
690 return EFI_INVALID_PARAMETER;
698 FileInfo->Buffer = (FileHeader + 1);
728 if (VolumeInfo ==
NULL) {
729 return EFI_INVALID_PARAMETER;
741 if (FwVolHeader.
Signature != EFI_FVH_SIGNATURE) {
742 return EFI_INVALID_PARAMETER;
745 VolumeInfo->FvAttributes = FwVolHeader.
Attributes;
746 VolumeInfo->FvStart = (VOID *)VolumeHandle;
747 VolumeInfo->FvSize = FwVolHeader.
FvLength;
772 IN EFI_FV_FILETYPE FileType,
788 if (EFI_ERROR (Status)) {
793 if (!EFI_ERROR (Status)) {
831 while ((HobFv2.Raw =
GetNextHob (EFI_HOB_TYPE_FV2, HobFv2.Raw)) !=
NULL) {
839 HobFv2.Raw = GET_NEXT_HOB (HobFv2);
846 if (EFI_ERROR (Status)) {
853 ZeroMem (&FvImageInfo,
sizeof (FvImageInfo));
860 FvAlignment = 1 << ((FvImageInfo.
FvAttributes & EFI_FVB2_ALIGNMENT) >> 16);
861 if (FvAlignment < 8) {
870 if (FvBuffer ==
NULL) {
871 return EFI_OUT_OF_RESOURCES;
VOID EFIAPI BuildFv2Hob(IN EFI_PHYSICAL_ADDRESS BaseAddress, IN UINT64 Length, IN CONST EFI_GUID *FvName, IN CONST EFI_GUID *FileName)
VOID EFIAPI BuildFvHob(IN EFI_PHYSICAL_ADDRESS BaseAddress, IN UINT64 Length)
VOID *EFIAPI GetNextHob(IN UINT16 Type, IN CONST VOID *HobStart)
VOID *EFIAPI GetHobList(VOID)
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
BOOLEAN EFIAPI CompareGuid(IN CONST GUID *Guid1, IN CONST GUID *Guid2)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
EFI_STATUS EFIAPI FfsFindSectionDataWithHook(IN EFI_SECTION_TYPE SectionType, IN FFS_CHECK_SECTION_HOOK SectionCheckHook, IN EFI_PEI_FILE_HANDLE FileHandle, OUT VOID **SectionData)
EFI_STATUS EFIAPI FfsFindFileByName(IN CONST EFI_GUID *FileName, IN EFI_PEI_FV_HANDLE VolumeHandle, OUT EFI_PEI_FILE_HANDLE *FileHandle)
EFI_STATUS EFIAPI FfsFindSectionData(IN EFI_SECTION_TYPE SectionType, IN EFI_PEI_FILE_HANDLE FileHandle, OUT VOID **SectionData)
STATIC BOOLEAN EFIAPI FileHandleToVolume(IN EFI_PEI_FILE_HANDLE FileHandle, OUT EFI_PEI_FV_HANDLE *VolumeHandle)
EFI_STATUS EFIAPI FfsGetFileInfo(IN EFI_PEI_FILE_HANDLE FileHandle, OUT EFI_FV_FILE_INFO *FileInfo)
EFI_STATUS EFIAPI FfsFindNextVolume(IN UINTN Instance, IN OUT EFI_PEI_FV_HANDLE *VolumeHandle)
STATIC EFI_FFS_FILE_STATE GetFileState(IN UINT8 ErasePolarity, IN EFI_FFS_FILE_HEADER *FfsHeader)
EFI_STATUS EFIAPI FfsAnyFvFindFirstFile(IN EFI_FV_FILETYPE FileType, OUT EFI_PEI_FV_HANDLE *VolumeHandle, OUT EFI_PEI_FILE_HANDLE *FileHandle)
EFI_STATUS EFIAPI FfsProcessFvFile(IN EFI_PEI_FILE_HANDLE FvFileHandle)
EFI_STATUS EFIAPI FfsFindNextFile(IN UINT8 SearchType, IN EFI_PEI_FV_HANDLE VolumeHandle, IN OUT EFI_PEI_FILE_HANDLE *FileHandle)
EFI_STATUS EFIAPI FfsGetVolumeInfo(IN EFI_PEI_FV_HANDLE VolumeHandle, OUT EFI_FV_INFO *VolumeInfo)
EFI_STATUS FfsProcessSection(IN EFI_SECTION_TYPE SectionType, IN FFS_CHECK_SECTION_HOOK SectionCheckHook, IN EFI_COMMON_SECTION_HEADER *Section, IN UINTN SectionSize, OUT VOID **OutputBuffer)
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)
#define ALIGN_POINTER(Pointer, Alignment)
#define ASSERT_EFI_ERROR(StatusParameter)
#define DEBUG(Expression)
#define EFI_FV_FILETYPE_ALL
#define EFI_SECTION_COMPRESSION
#define SECTION_SIZE(SectionHeaderPtr)
VOID * EFI_PEI_FILE_HANDLE
VOID *EFIAPI AllocateAlignedPages(IN UINTN Pages, IN UINTN Alignment)
VOID *EFIAPI AllocatePages(IN UINTN Pages)
EFI_STATUS(EFIAPI * FFS_CHECK_SECTION_HOOK)(IN EFI_COMMON_SECTION_HEADER *Section)
EFI_FILE_INFO * FileInfo(IN EFI_FILE_HANDLE FHand)
UINT64 EFI_PHYSICAL_ADDRESS
#define EFI_SIZE_TO_PAGES(Size)
RETURN_STATUS EFIAPI UefiDecompress(IN CONST VOID *Source, IN OUT VOID *Destination, IN OUT VOID *Scratch OPTIONAL)
RETURN_STATUS EFIAPI UefiDecompressGetInfo(IN CONST VOID *Source, IN UINT32 SourceSize, OUT UINT32 *DestinationSize, OUT UINT32 *ScratchSize)
EFI_FFS_FILE_ATTRIBUTES Attributes
EFI_FVB_ATTRIBUTES_2 Attributes
EFI_FVB_ATTRIBUTES_2 FvAttributes
EFI_PHYSICAL_ADDRESS BaseAddress