/** @file\r
\r
-Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2015 - 2021, Intel Corporation. All rights reserved.<BR>\r
Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.<BR>\r
\r
SPDX-License-Identifier: BSD-2-Clause-Patent\r
UINT8 *ptr;\r
UINTN Index;\r
UINT8 Sum;\r
+ UINTN Size;\r
\r
- Sum = 0;\r
- ptr = (UINT8 *)FileHeader;\r
+ Sum = 0;\r
+ ptr = (UINT8 *)FileHeader;\r
+ Size = IS_FFS_FILE2 (FileHeader) ? sizeof (EFI_FFS_FILE_HEADER2) : sizeof (EFI_FFS_FILE_HEADER);\r
\r
- for (Index = 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index += 4) {\r
+ for (Index = 0; Index < Size - 3; Index += 4) {\r
Sum = (UINT8)(Sum + ptr[Index]);\r
Sum = (UINT8)(Sum + ptr[Index + 1]);\r
Sum = (UINT8)(Sum + ptr[Index + 2]);\r
Sum = (UINT8)(Sum + ptr[Index + 3]);\r
}\r
\r
- for ( ; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) {\r
+ for ( ; Index < Size; Index++) {\r
Sum = (UINT8)(Sum + ptr[Index]);\r
}\r
\r
// Length is 24 bits wide so mask upper 8 bits\r
// FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.\r
//\r
- FileLength = FFS_FILE_SIZE (*FileHeader);\r
+ FileLength = IS_FFS_FILE2 (*FileHeader) ?\r
+ FFS_FILE2_SIZE (*FileHeader) : FFS_FILE_SIZE (*FileHeader);\r
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);\r
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)*FileHeader + FileOccupiedSize);\r
}\r
\r
switch (FileState) {\r
case EFI_FILE_HEADER_INVALID:\r
- FileOffset += sizeof (EFI_FFS_FILE_HEADER);\r
- FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER));\r
+ if (IS_FFS_FILE2 (FfsFileHeader)) {\r
+ FileOffset += sizeof (EFI_FFS_FILE_HEADER2);\r
+ FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER2));\r
+ } else {\r
+ FileOffset += sizeof (EFI_FFS_FILE_HEADER);\r
+ FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER));\r
+ }\r
+\r
break;\r
\r
case EFI_FILE_DATA_VALID:\r
case EFI_FILE_MARKED_FOR_UPDATE:\r
if (CalculateHeaderChecksum (FfsFileHeader) == 0) {\r
- FileLength = FFS_FILE_SIZE (FfsFileHeader);\r
+ FileLength = IS_FFS_FILE2 (FfsFileHeader) ?\r
+ FFS_FILE2_SIZE (FfsFileHeader) : FFS_FILE_SIZE (FfsFileHeader);\r
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);\r
\r
if ((SearchType == FfsFileHeader->Type) || (SearchType == EFI_FV_FILETYPE_ALL)) {\r
break;\r
\r
case EFI_FILE_DELETED:\r
- FileLength = FFS_FILE_SIZE (FfsFileHeader);\r
+ FileLength = IS_FFS_FILE2 (FfsFileHeader) ?\r
+ FFS_FILE2_SIZE (FfsFileHeader) : FFS_FILE_SIZE (FfsFileHeader);\r
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);\r
FileOffset += FileOccupiedSize;\r
FfsFileHeader = (EFI_FFS_FILE_HEADER *)((UINT8 *)FfsFileHeader + FileOccupiedSize);\r
\r
Section = (EFI_COMMON_SECTION_HEADER *)(UINTN)CurrentAddress;\r
\r
- Size = SECTION_SIZE (Section);\r
+ Size = IS_SECTION2 (Section) ? SECTION2_SIZE (Section) : SECTION_SIZE (Section);\r
if (Size < sizeof (*Section)) {\r
return EFI_VOLUME_CORRUPTED;\r
}\r
// Does not include FfsFileHeader header size\r
// FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.\r
//\r
- Section = (EFI_COMMON_SECTION_HEADER *)(FfsFileHeader + 1);\r
- FileSize = FFS_FILE_SIZE (FfsFileHeader);\r
- FileSize -= sizeof (EFI_FFS_FILE_HEADER);\r
+ if (IS_FFS_FILE2 (FfsFileHeader)) {\r
+ Section = (EFI_COMMON_SECTION_HEADER *)((EFI_FFS_FILE_HEADER2 *)FfsFileHeader + 1);\r
+ FileSize = FFS_FILE2_SIZE (FfsFileHeader) - sizeof (EFI_FFS_FILE_HEADER2);\r
+ } else {\r
+ Section = (EFI_COMMON_SECTION_HEADER *)(FfsFileHeader + 1);\r
+ FileSize = FFS_FILE_SIZE (FfsFileHeader) - sizeof (EFI_FFS_FILE_HEADER);\r
+ }\r
\r
Status = FindFfsSectionInSections (\r
Section,\r
// Does not include FfsFileHeader header size\r
// FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.\r
//\r
- Section = (EFI_COMMON_SECTION_HEADER *)(FfsFileHeader + 1);\r
- FileSize = FFS_FILE_SIZE (FfsFileHeader);\r
- FileSize -= sizeof (EFI_FFS_FILE_HEADER);\r
+ if (IS_FFS_FILE2 (FfsFileHeader)) {\r
+ Section = (EFI_COMMON_SECTION_HEADER *)((EFI_FFS_FILE_HEADER2 *)FfsFileHeader + 1);\r
+ FileSize = FFS_FILE2_SIZE (FfsFileHeader) - sizeof (EFI_FFS_FILE_HEADER2);\r
+ } else {\r
+ Section = (EFI_COMMON_SECTION_HEADER *)(FfsFileHeader + 1);\r
+ FileSize = FFS_FILE_SIZE (FfsFileHeader) - sizeof (EFI_FFS_FILE_HEADER);\r
+ }\r
\r
*SectionData = NULL;\r
ParsedLength = 0;\r
while (ParsedLength < FileSize) {\r
if (Section->Type == SectionType) {\r
- *SectionData = (VOID *)(Section + 1);\r
- *SectionDataSize = SECTION_SIZE (Section);\r
+ if (IS_SECTION2 (Section)) {\r
+ *SectionData = (VOID *)((EFI_COMMON_SECTION_HEADER2 *)Section + 1);\r
+ *SectionDataSize = SECTION2_SIZE (Section);\r
+ } else {\r
+ *SectionData = (VOID *)(Section + 1);\r
+ *SectionDataSize = SECTION_SIZE (Section);\r
+ }\r
+\r
return EFI_SUCCESS;\r
}\r
\r
// SectionLength is adjusted it is 4 byte aligned.\r
// Go to the next section\r
//\r
- SectionLength = SECTION_SIZE (Section);\r
+ SectionLength = IS_SECTION2 (Section) ? SECTION2_SIZE (Section) : SECTION_SIZE (Section);\r
SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);\r
\r
ParsedLength += SectionLength;\r