Layers on top of Firmware Block protocol to produce a file abstraction\r
of FV based files.\r
\r
- Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
\r
This program and the accompanying materials\r
are licensed and made available under the terms and conditions\r
UINT8 *FreeStart;\r
UINTN FreeSize;\r
UINT8 ErasePolarity;\r
- UINTN FileLength;\r
EFI_FFS_FILE_STATE FileState;\r
UINT8 *TopFvAddress;\r
UINTN TestLength;\r
}\r
ASSERT (FwVolHeader != NULL);\r
\r
+ FvDevice->IsFfs3Fv = CompareGuid (&FwVolHeader->FileSystemGuid, &gEfiFirmwareFileSystem3Guid);\r
+\r
//\r
// Double Check firmware volume header here\r
//\r
(EFI_FFS_FILE_HEADER *) Ptr\r
);\r
if ((FileState == EFI_FILE_HEADER_INVALID) || (FileState == EFI_FILE_HEADER_CONSTRUCTION)) {\r
- Ptr += sizeof (EFI_FFS_FILE_HEADER);\r
+ if (IS_FFS_FILE2 (Ptr)) {\r
+ if (!FvDevice->IsFfs3Fv) {\r
+ DEBUG ((EFI_D_ERROR, "Found a FFS3 formatted file: %g in a non-FFS3 formatted FV.\n", &((EFI_FFS_FILE_HEADER *) Ptr)->Name));\r
+ }\r
+ Ptr = Ptr + sizeof (EFI_FFS_FILE_HEADER2);\r
+ } else {\r
+ Ptr = Ptr + sizeof (EFI_FFS_FILE_HEADER);\r
+ }\r
\r
continue;\r
\r
}\r
}\r
\r
+ if (IS_FFS_FILE2 (Ptr)) {\r
+ ASSERT (FFS_FILE2_SIZE (Ptr) > 0x00FFFFFF);\r
+ if (!FvDevice->IsFfs3Fv) {\r
+ DEBUG ((EFI_D_ERROR, "Found a FFS3 formatted file: %g in a non-FFS3 formatted FV.\n", &((EFI_FFS_FILE_HEADER *) Ptr)->Name));\r
+ Ptr = Ptr + FFS_FILE2_SIZE (Ptr);\r
+ //\r
+ // Adjust Ptr to the next 8-byte aligned boundry.\r
+ //\r
+ while (((UINTN) Ptr & 0x07) != 0) {\r
+ Ptr++;\r
+ }\r
+ continue;\r
+ }\r
+ }\r
+\r
if (IsValidFFSFile (FvDevice, (EFI_FFS_FILE_HEADER *) Ptr)) {\r
- FileLength = *(UINT32 *) ((EFI_FFS_FILE_HEADER *) Ptr)->Size & 0x00FFFFFF;\r
FileState = GetFileState (\r
FvDevice->ErasePolarity,\r
(EFI_FFS_FILE_HEADER *) Ptr\r
InsertTailList (&FvDevice->FfsFileListHeader, &FfsFileEntry->Link);\r
}\r
\r
- Ptr += FileLength;\r
+ if (IS_FFS_FILE2 (Ptr)) {\r
+ Ptr = Ptr + FFS_FILE2_SIZE (Ptr);\r
+ } else {\r
+ Ptr = Ptr + FFS_FILE_SIZE (Ptr);\r
+ }\r
\r
//\r
// Adjust Ptr to the next 8-byte aligned boundry.\r
if (EFI_ERROR (Status)) {\r
return EFI_NOT_FOUND;\r
}\r
- //\r
- // Get FV with gEfiFirmwareFileSystemGuid\r
- //\r
+\r
for (Index = 0; Index < HandleCount; Index += 1) {\r
Status = gBS->HandleProtocol (\r
HandleBuffer[Index],\r
// Check to see that the file system is indeed formatted in a way we can\r
// understand it...\r
//\r
- if (!CompareGuid (\r
- &FwVolHeader->FileSystemGuid,\r
- &gEfiFirmwareFileSystem2Guid\r
- )) {\r
+ if ((!CompareGuid (&FwVolHeader->FileSystemGuid, &gEfiFirmwareFileSystem2Guid)) &&\r
+ (!CompareGuid (&FwVolHeader->FileSystemGuid, &gEfiFirmwareFileSystem3Guid))) {\r
FreePool (FwVolHeader);\r
continue;\r
}\r