+++ /dev/null
-/** @file\r
- Implements functions to pad firmware file.\r
-\r
- Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
-\r
- SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-**/\r
-\r
-#include "FwVolDriver.h"\r
-\r
-/**\r
- Calculate the checksum for a PAD file.\r
-\r
- @param PadFileHeader The Pad File to be caculeted the checksum.\r
-\r
-**/\r
-VOID\r
-SetPadFileChecksum (\r
- IN EFI_FFS_FILE_HEADER *PadFileHeader\r
- )\r
-{\r
- if ((PadFileHeader->Attributes & FFS_ATTRIB_CHECKSUM) != 0) {\r
-\r
- if (IS_FFS_FILE2 (PadFileHeader)) {\r
- //\r
- // Calculate checksum of Pad File Data\r
- //\r
- PadFileHeader->IntegrityCheck.Checksum.File =\r
- CalculateCheckSum8 ((UINT8 *) PadFileHeader + sizeof (EFI_FFS_FILE_HEADER2), FFS_FILE2_SIZE (PadFileHeader) - sizeof (EFI_FFS_FILE_HEADER2));\r
-\r
- } else {\r
- //\r
- // Calculate checksum of Pad File Data\r
- //\r
- PadFileHeader->IntegrityCheck.Checksum.File =\r
- CalculateCheckSum8 ((UINT8 *) PadFileHeader + sizeof (EFI_FFS_FILE_HEADER), FFS_FILE_SIZE (PadFileHeader) - sizeof (EFI_FFS_FILE_HEADER));\r
- }\r
-\r
- } else {\r
-\r
- PadFileHeader->IntegrityCheck.Checksum.File = FFS_FIXED_CHECKSUM;\r
-\r
- }\r
-\r
- return ;\r
-}\r
-\r
-/**\r
- Create a PAD File in the Free Space.\r
-\r
- @param FvDevice Firmware Volume Device.\r
- @param FreeSpaceEntry Indicating in which Free Space(Cache) the Pad file will be inserted.\r
- @param Size Pad file Size, not include the header.\r
- @param PadFileEntry The Ffs File Entry that points to this Pad File.\r
-\r
- @retval EFI_SUCCESS Successfully create a PAD file.\r
- @retval EFI_OUT_OF_RESOURCES No enough free space to create a PAD file.\r
- @retval EFI_INVALID_PARAMETER Size is not 8 byte alignment.\r
- @retval EFI_DEVICE_ERROR Free space is not erased.\r
-**/\r
-EFI_STATUS\r
-FvCreatePadFileInFreeSpace (\r
- IN FV_DEVICE *FvDevice,\r
- IN FREE_SPACE_ENTRY *FreeSpaceEntry,\r
- IN UINTN Size,\r
- OUT FFS_FILE_LIST_ENTRY **PadFileEntry\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_FFS_FILE_HEADER *PadFileHeader;\r
- UINTN Offset;\r
- UINTN NumBytesWritten;\r
- UINTN StateOffset;\r
- UINT8 *StartPos;\r
- FFS_FILE_LIST_ENTRY *FfsFileEntry;\r
- UINTN HeaderSize;\r
- UINTN FileSize;\r
-\r
- HeaderSize = sizeof (EFI_FFS_FILE_HEADER);\r
- FileSize = Size + HeaderSize;\r
- if (FileSize > 0x00FFFFFF) {\r
- HeaderSize = sizeof (EFI_FFS_FILE_HEADER2);\r
- FileSize = Size + HeaderSize;\r
- }\r
-\r
- if (FreeSpaceEntry->Length < FileSize) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- if ((Size & 0x07) != 0) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- StartPos = FreeSpaceEntry->StartingAddress;\r
-\r
- //\r
- // First double check the space\r
- //\r
- if (!IsBufferErased (\r
- FvDevice->ErasePolarity,\r
- StartPos,\r
- FileSize\r
- )) {\r
- return EFI_DEVICE_ERROR;\r
- }\r
-\r
- PadFileHeader = (EFI_FFS_FILE_HEADER *) StartPos;\r
-\r
- //\r
- // Create File Step 1\r
- //\r
- SetFileState (EFI_FILE_HEADER_CONSTRUCTION, PadFileHeader);\r
-\r
- Offset = (UINTN) (StartPos - FvDevice->CachedFv);\r
- StateOffset = Offset + (UINT8 *) &PadFileHeader->State - (UINT8 *) PadFileHeader;\r
-\r
- NumBytesWritten = sizeof (EFI_FFS_FILE_STATE);\r
- Status = FvcWrite (\r
- FvDevice,\r
- StateOffset,\r
- &NumBytesWritten,\r
- &PadFileHeader->State\r
- );\r
- if (EFI_ERROR (Status)) {\r
- SetFileState (EFI_FILE_HEADER_CONSTRUCTION, PadFileHeader);\r
- return Status;\r
- }\r
- //\r
- // Update Free Space Entry, since header is allocated\r
- //\r
- FreeSpaceEntry->Length -= HeaderSize;\r
- FreeSpaceEntry->StartingAddress += HeaderSize;\r
-\r
- //\r
- // Fill File Name Guid, here we assign a NULL-GUID to Pad files\r
- //\r
- ZeroMem (&PadFileHeader->Name, sizeof (EFI_GUID));\r
-\r
- //\r
- // Fill File Type, checksum(0), Attributes(0), Size\r
- //\r
- PadFileHeader->Type = EFI_FV_FILETYPE_FFS_PAD;\r
- PadFileHeader->Attributes = 0;\r
- if ((FileSize) > 0x00FFFFFF) {\r
- ((EFI_FFS_FILE_HEADER2 *) PadFileHeader)->ExtendedSize = (UINT32) FileSize;\r
- *(UINT32 *) PadFileHeader->Size &= 0xFF000000;\r
- PadFileHeader->Attributes |= FFS_ATTRIB_LARGE_FILE;\r
- } else {\r
- *(UINT32 *) PadFileHeader->Size &= 0xFF000000;\r
- *(UINT32 *) PadFileHeader->Size |= FileSize;\r
- }\r
-\r
- SetHeaderChecksum (PadFileHeader);\r
- SetPadFileChecksum (PadFileHeader);\r
-\r
- Offset = (UINTN) (StartPos - FvDevice->CachedFv);\r
-\r
- NumBytesWritten = HeaderSize;\r
- Status = FvcWrite (\r
- FvDevice,\r
- Offset,\r
- &NumBytesWritten,\r
- (UINT8 *) PadFileHeader\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- //\r
- // Step 2, then Mark header valid, since no data write,\r
- // mark the data valid at the same time.\r
- //\r
- SetFileState (EFI_FILE_HEADER_VALID, PadFileHeader);\r
- SetFileState (EFI_FILE_DATA_VALID, PadFileHeader);\r
-\r
- Offset = (UINTN) (StartPos - FvDevice->CachedFv);\r
- StateOffset = Offset + (UINT8 *) &PadFileHeader->State - (UINT8 *) PadFileHeader;\r
-\r
- NumBytesWritten = sizeof (EFI_FFS_FILE_STATE);\r
- Status = FvcWrite (\r
- FvDevice,\r
- StateOffset,\r
- &NumBytesWritten,\r
- &PadFileHeader->State\r
- );\r
- if (EFI_ERROR (Status)) {\r
- SetFileState (EFI_FILE_HEADER_VALID, PadFileHeader);\r
- SetFileState (EFI_FILE_DATA_VALID, PadFileHeader);\r
- return Status;\r
- }\r
- //\r
- // Update Free Space Entry, since header is allocated\r
- //\r
- FreeSpaceEntry->Length -= Size;\r
- FreeSpaceEntry->StartingAddress += Size;\r
-\r
- //\r
- // If successfully, insert an FfsFileEntry at the end of ffs file list\r
- //\r
- FfsFileEntry = AllocateZeroPool (sizeof (FFS_FILE_LIST_ENTRY));\r
- ASSERT (FfsFileEntry != NULL);\r
-\r
- FfsFileEntry->FfsHeader = (UINT8 *) (UINTN) StartPos;\r
- InsertTailList (&FvDevice->FfsFileListHeader, &FfsFileEntry->Link);\r
-\r
- *PadFileEntry = FfsFileEntry;\r
- FvDevice->CurrentFfsFile = FfsFileEntry;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Fill pad file header within firmware cache.\r
-\r
- @param PadFileHeader The start of the Pad File Buffer.\r
- @param PadFileLength The length of the pad file including the header.\r
-\r
-**/\r
-VOID\r
-FvFillPadFile (\r
- IN EFI_FFS_FILE_HEADER *PadFileHeader,\r
- IN UINTN PadFileLength\r
- )\r
-{\r
- //\r
- // Fill File Name Guid, here we assign a NULL-GUID to Pad files\r
- //\r
- ZeroMem (&PadFileHeader->Name, sizeof (EFI_GUID));\r
-\r
- //\r
- // Fill File Type, checksum(0), Attributes(0), Size\r
- //\r
- PadFileHeader->Type = EFI_FV_FILETYPE_FFS_PAD;\r
- PadFileHeader->Attributes = 0;\r
- if (PadFileLength > 0x00FFFFFF) {\r
- ((EFI_FFS_FILE_HEADER2 *) PadFileHeader)->ExtendedSize = (UINT32) PadFileLength;\r
- *(UINT32 *) PadFileHeader->Size &= 0xFF000000;\r
- PadFileHeader->Attributes |= FFS_ATTRIB_LARGE_FILE;\r
- } else {\r
- *(UINT32 *) PadFileHeader->Size &= 0xFF000000;\r
- *(UINT32 *) PadFileHeader->Size |= PadFileLength;\r
- }\r
-\r
- SetHeaderChecksum (PadFileHeader);\r
- SetPadFileChecksum (PadFileHeader);\r
-\r
- //\r
- // Set File State to 0x00000111\r
- //\r
- SetFileState (EFI_FILE_HEADER_CONSTRUCTION, PadFileHeader);\r
- SetFileState (EFI_FILE_HEADER_VALID, PadFileHeader);\r
- SetFileState (EFI_FILE_DATA_VALID, PadFileHeader);\r
-\r
- return ;\r
-}\r
-\r
-/**\r
- Create entire FFS file.\r
-\r
- @param FileHeader Starting Address of a Buffer that hold the FFS File image.\r
- @param FfsFileBuffer The source buffer that contains the File Data.\r
- @param BufferSize The length of FfsFileBuffer.\r
- @param ActualFileSize Size of FFS file.\r
- @param FileName The Guid of Ffs File.\r
- @param FileType The type of the written Ffs File.\r
- @param FileAttributes The attributes of the written Ffs File.\r
-\r
- @retval EFI_INVALID_PARAMETER File type is not valid.\r
- @retval EFI_SUCCESS FFS file is successfully created.\r
-\r
-**/\r
-EFI_STATUS\r
-FvFillFfsFile (\r
- OUT EFI_FFS_FILE_HEADER *FileHeader,\r
- IN UINT8 *FfsFileBuffer,\r
- IN UINTN BufferSize,\r
- IN UINTN ActualFileSize,\r
- IN EFI_GUID *FileName,\r
- IN EFI_FV_FILETYPE FileType,\r
- IN EFI_FV_FILE_ATTRIBUTES FileAttributes\r
- )\r
-{\r
- EFI_FFS_FILE_ATTRIBUTES TmpFileAttribute;\r
- EFI_FFS_FILE_HEADER *TmpFileHeader;\r
-\r
- //\r
- // File Type value 0x0E~0xE0 are reserved\r
- //\r
- if ((FileType > EFI_FV_FILETYPE_SMM_CORE) && (FileType < 0xE0)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- TmpFileHeader = (EFI_FFS_FILE_HEADER *) FfsFileBuffer;\r
- //\r
- // First fill all fields ready in FfsFileBuffer\r
- //\r
- CopyGuid (&TmpFileHeader->Name, FileName);\r
- TmpFileHeader->Type = FileType;\r
-\r
- //\r
- // Convert the FileAttributes to FFSFileAttributes\r
- //\r
- FvFileAttrib2FfsFileAttrib (FileAttributes, &TmpFileAttribute);\r
-\r
- TmpFileHeader->Attributes = TmpFileAttribute;\r
-\r
- if (ActualFileSize > 0x00FFFFFF) {\r
- ((EFI_FFS_FILE_HEADER2 *) FileHeader)->ExtendedSize = (UINT32) ActualFileSize;\r
- *(UINT32 *) FileHeader->Size &= 0xFF000000;\r
- FileHeader->Attributes |= FFS_ATTRIB_LARGE_FILE;\r
- } else {\r
- *(UINT32 *) FileHeader->Size &= 0xFF000000;\r
- *(UINT32 *) FileHeader->Size |= ActualFileSize;\r
- }\r
-\r
- SetHeaderChecksum (TmpFileHeader);\r
- SetFileChecksum (TmpFileHeader, ActualFileSize);\r
-\r
- SetFileState (EFI_FILE_HEADER_CONSTRUCTION, TmpFileHeader);\r
- SetFileState (EFI_FILE_HEADER_VALID, TmpFileHeader);\r
- SetFileState (EFI_FILE_DATA_VALID, TmpFileHeader);\r
-\r
- //\r
- // Copy data from FfsFileBuffer to FileHeader(cache)\r
- //\r
- CopyMem (FileHeader, FfsFileBuffer, BufferSize);\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Fill some other extra space using 0xFF(Erase Value).\r
-\r
- @param ErasePolarity Fv erase value.\r
- @param FileHeader Point to the start of FFS File.\r
- @param ExtraLength The pading length.\r
-\r
-**/\r
-VOID\r
-FvAdjustFfsFile (\r
- IN UINT8 ErasePolarity,\r
- IN EFI_FFS_FILE_HEADER *FileHeader,\r
- IN UINTN ExtraLength\r
- )\r
-{\r
- UINT8 *Ptr;\r
- UINT8 PadingByte;\r
-\r
- if (IS_FFS_FILE2 (FileHeader)) {\r
- Ptr = (UINT8 *) FileHeader + FFS_FILE2_SIZE (FileHeader);\r
- } else {\r
- Ptr = (UINT8 *) FileHeader + FFS_FILE_SIZE (FileHeader);\r
- }\r
-\r
- if (ErasePolarity == 0) {\r
- PadingByte = 0;\r
- } else {\r
- PadingByte = 0xFF;\r
- }\r
- //\r
- // Fill the non-used space with Padding Byte\r
- //\r
- SetMem (Ptr, ExtraLength, PadingByte);\r
-\r
- return ;\r
-}\r
-\r
-/**\r
- Free File List entry pointed by FileListHead.\r
-\r
- @param FileListHeader FileListEntry Header.\r
-\r
-**/\r
-VOID\r
-FreeFileList (\r
- IN LIST_ENTRY *FileListHead\r
- )\r
-{\r
- FFS_FILE_LIST_ENTRY *FfsFileEntry;\r
- LIST_ENTRY *NextEntry;\r
-\r
- FfsFileEntry = (FFS_FILE_LIST_ENTRY *) (FileListHead->ForwardLink);\r
-\r
- //\r
- // Loop the whole list entry to free resources\r
- //\r
- while (&FfsFileEntry->Link != FileListHead) {\r
- NextEntry = (&FfsFileEntry->Link)->ForwardLink;\r
- FreePool (FfsFileEntry);\r
- FfsFileEntry = (FFS_FILE_LIST_ENTRY *) NextEntry;\r
- }\r
-\r
- return ;\r
-}\r
-\r
-/**\r
- Create a new file within a PAD file area.\r
-\r
- @param FvDevice Firmware Volume Device.\r
- @param FfsFileBuffer A buffer that holds an FFS file,(it contains a File Header which is in init state).\r
- @param BufferSize The size of FfsFileBuffer.\r
- @param ActualFileSize The actual file length, it may not be multiples of 8.\r
- @param FileName The FFS File Name.\r
- @param FileType The FFS File Type.\r
- @param FileAttributes The Attributes of the FFS File to be created.\r
-\r
- @retval EFI_SUCCESS Successfully create a new file within the found PAD file area.\r
- @retval EFI_OUT_OF_RESOURCES No suitable PAD file is found.\r
- @retval other errors New file is created failed.\r
-\r
-**/\r
-EFI_STATUS\r
-FvCreateNewFileInsidePadFile (\r
- IN FV_DEVICE *FvDevice,\r
- IN UINT8 *FfsFileBuffer,\r
- IN UINTN BufferSize,\r
- IN UINTN ActualFileSize,\r
- IN EFI_GUID *FileName,\r
- IN EFI_FV_FILETYPE FileType,\r
- IN EFI_FV_FILE_ATTRIBUTES FileAttributes\r
- )\r
-{\r
- UINTN RequiredAlignment;\r
- FFS_FILE_LIST_ENTRY *PadFileEntry;\r
- EFI_STATUS Status;\r
- UINTN PadAreaLength;\r
- UINTN PadSize;\r
- EFI_FFS_FILE_HEADER *FileHeader;\r
- EFI_FFS_FILE_HEADER *OldPadFileHeader;\r
- EFI_FFS_FILE_HEADER *PadFileHeader;\r
- EFI_FFS_FILE_HEADER *TailPadFileHeader;\r
- UINTN StateOffset;\r
- UINTN Offset;\r
- UINTN NumBytesWritten;\r
- UINT8 *StartPos;\r
- LIST_ENTRY NewFileList;\r
- FFS_FILE_LIST_ENTRY *NewFileListEntry;\r
- FFS_FILE_LIST_ENTRY *FfsEntry;\r
- FFS_FILE_LIST_ENTRY *NextFfsEntry;\r
-\r
- //\r
- // First get the required alignment from the File Attributes\r
- //\r
- RequiredAlignment = GetRequiredAlignment (FileAttributes);\r
-\r
- //\r
- // Find a suitable PAD File\r
- //\r
- Status = FvLocatePadFile (\r
- FvDevice,\r
- BufferSize,\r
- RequiredAlignment,\r
- &PadSize,\r
- &PadFileEntry\r
- );\r
-\r
- if (EFI_ERROR (Status)) {\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- OldPadFileHeader = (EFI_FFS_FILE_HEADER *) PadFileEntry->FfsHeader;\r
-\r
- //\r
- // Step 1: Update Pad File Header\r
- //\r
- SetFileState (EFI_FILE_MARKED_FOR_UPDATE, OldPadFileHeader);\r
-\r
- StartPos = PadFileEntry->FfsHeader;\r
-\r
- Offset = (UINTN) (StartPos - FvDevice->CachedFv);\r
- StateOffset = Offset + (UINT8 *) &OldPadFileHeader->State - (UINT8 *) OldPadFileHeader;\r
-\r
- NumBytesWritten = sizeof (EFI_FFS_FILE_STATE);\r
- Status = FvcWrite (\r
- FvDevice,\r
- StateOffset,\r
- &NumBytesWritten,\r
- &OldPadFileHeader->State\r
- );\r
- if (EFI_ERROR (Status)) {\r
- SetFileState (EFI_FILE_HEADER_CONSTRUCTION, OldPadFileHeader);\r
- return Status;\r
- }\r
-\r
- //\r
- // Step 2: Update Pad area\r
- //\r
- InitializeListHead (&NewFileList);\r
-\r
- if (IS_FFS_FILE2 (OldPadFileHeader)) {\r
- PadAreaLength = FFS_FILE2_SIZE (OldPadFileHeader) - sizeof (EFI_FFS_FILE_HEADER);\r
- PadFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) OldPadFileHeader + sizeof (EFI_FFS_FILE_HEADER2));\r
- } else {\r
- PadAreaLength = FFS_FILE_SIZE (OldPadFileHeader) - sizeof (EFI_FFS_FILE_HEADER);\r
- PadFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) OldPadFileHeader + sizeof (EFI_FFS_FILE_HEADER));\r
- }\r
-\r
- if (PadSize != 0) {\r
- //\r
- // Insert a PAD file before to achieve required alignment\r
- //\r
- FvFillPadFile (PadFileHeader, PadSize);\r
- NewFileListEntry = AllocatePool (sizeof (FFS_FILE_LIST_ENTRY));\r
- ASSERT (NewFileListEntry != NULL);\r
- NewFileListEntry->FfsHeader = (UINT8 *) PadFileHeader;\r
- InsertTailList (&NewFileList, &NewFileListEntry->Link);\r
- }\r
-\r
- FileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) PadFileHeader + PadSize);\r
-\r
- Status = FvFillFfsFile (\r
- FileHeader,\r
- FfsFileBuffer,\r
- BufferSize,\r
- ActualFileSize,\r
- FileName,\r
- FileType,\r
- FileAttributes\r
- );\r
- if (EFI_ERROR (Status)) {\r
- FreeFileList (&NewFileList);\r
- return Status;\r
- }\r
-\r
- NewFileListEntry = AllocatePool (sizeof (FFS_FILE_LIST_ENTRY));\r
- ASSERT (NewFileListEntry != NULL);\r
-\r
- NewFileListEntry->FfsHeader = (UINT8 *) FileHeader;\r
- InsertTailList (&NewFileList, &NewFileListEntry->Link);\r
-\r
- FvDevice->CurrentFfsFile = NewFileListEntry;\r
-\r
- if (PadAreaLength > (BufferSize + PadSize)) {\r
- if ((PadAreaLength - BufferSize - PadSize) >= sizeof (EFI_FFS_FILE_HEADER)) {\r
- //\r
- // we can insert another PAD file\r
- //\r
- TailPadFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FileHeader + BufferSize);\r
- FvFillPadFile (TailPadFileHeader, PadAreaLength - BufferSize - PadSize);\r
-\r
- NewFileListEntry = AllocatePool (sizeof (FFS_FILE_LIST_ENTRY));\r
- ASSERT (NewFileListEntry != NULL);\r
-\r
- NewFileListEntry->FfsHeader = (UINT8 *) TailPadFileHeader;\r
- InsertTailList (&NewFileList, &NewFileListEntry->Link);\r
- } else {\r
- //\r
- // because left size cannot hold another PAD file header,\r
- // adjust the writing file size (just in cache)\r
- //\r
- FvAdjustFfsFile (\r
- FvDevice->ErasePolarity,\r
- FileHeader,\r
- PadAreaLength - BufferSize - PadSize\r
- );\r
- }\r
- }\r
- //\r
- // Start writing to FV\r
- //\r
- if (IS_FFS_FILE2 (OldPadFileHeader)) {\r
- StartPos = (UINT8 *) OldPadFileHeader + sizeof (EFI_FFS_FILE_HEADER2);\r
- } else {\r
- StartPos = (UINT8 *) OldPadFileHeader + sizeof (EFI_FFS_FILE_HEADER);\r
- }\r
-\r
- Offset = (UINTN) (StartPos - FvDevice->CachedFv);\r
-\r
- NumBytesWritten = PadAreaLength;\r
- Status = FvcWrite (\r
- FvDevice,\r
- Offset,\r
- &NumBytesWritten,\r
- StartPos\r
- );\r
- if (EFI_ERROR (Status)) {\r
- FreeFileList (&NewFileList);\r
- FvDevice->CurrentFfsFile = NULL;\r
- return Status;\r
- }\r
-\r
- //\r
- // Step 3: Mark Pad file header as EFI_FILE_HEADER_INVALID\r
- //\r
- SetFileState (EFI_FILE_HEADER_INVALID, OldPadFileHeader);\r
-\r
- StartPos = PadFileEntry->FfsHeader;\r
-\r
- Offset = (UINTN) (StartPos - FvDevice->CachedFv);\r
- StateOffset = Offset + (UINT8 *) &OldPadFileHeader->State - (UINT8 *) OldPadFileHeader;\r
-\r
- NumBytesWritten = sizeof (EFI_FFS_FILE_STATE);\r
- Status = FvcWrite (\r
- FvDevice,\r
- StateOffset,\r
- &NumBytesWritten,\r
- &OldPadFileHeader->State\r
- );\r
- if (EFI_ERROR (Status)) {\r
- SetFileState (EFI_FILE_HEADER_INVALID, OldPadFileHeader);\r
- FreeFileList (&NewFileList);\r
- FvDevice->CurrentFfsFile = NULL;\r
- return Status;\r
- }\r
-\r
- //\r
- // If all successfully, update FFS_FILE_LIST\r
- //\r
-\r
- //\r
- // Delete old pad file entry\r
- //\r
- FfsEntry = (FFS_FILE_LIST_ENTRY *) PadFileEntry->Link.BackLink;\r
- NextFfsEntry = (FFS_FILE_LIST_ENTRY *) PadFileEntry->Link.ForwardLink;\r
-\r
- FreePool (PadFileEntry);\r
-\r
- FfsEntry->Link.ForwardLink = NewFileList.ForwardLink;\r
- (NewFileList.ForwardLink)->BackLink = &FfsEntry->Link;\r
- NextFfsEntry->Link.BackLink = NewFileList.BackLink;\r
- (NewFileList.BackLink)->ForwardLink = &NextFfsEntry->Link;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Free all FfsBuffer.\r
-\r
- @param NumOfFiles Number of FfsBuffer.\r
- @param FfsBuffer An array of pointer to an FFS File Buffer\r
-\r
-**/\r
-VOID\r
-FreeFfsBuffer (\r
- IN UINTN NumOfFiles,\r
- IN UINT8 **FfsBuffer\r
- )\r
-{\r
- UINTN Index;\r
- for (Index = 0; Index < NumOfFiles; Index++) {\r
- if (FfsBuffer[Index] != NULL) {\r
- FreePool (FfsBuffer[Index]);\r
- }\r
- }\r
-}\r
-\r
-/**\r
- Create multiple files within a PAD File area.\r
-\r
- @param FvDevice Firmware Volume Device.\r
- @param PadFileEntry The pad file entry to be written in.\r
- @param NumOfFiles Total File number to be written.\r
- @param BufferSize The array of buffer size of each FfsBuffer.\r
- @param ActualFileSize The array of actual file size.\r
- @param PadSize The array of leading pad file size for each FFS File\r
- @param FfsBuffer The array of Ffs Buffer pointer.\r
- @param FileData The array of EFI_FV_WRITE_FILE_DATA structure,\r
- used to get name, attributes, type, etc.\r
-\r
- @retval EFI_SUCCESS Add the input multiple files into PAD file area.\r
- @retval EFI_OUT_OF_RESOURCES No enough memory is allocated.\r
- @retval other error Files can't be added into PAD file area.\r
-\r
-**/\r
-EFI_STATUS\r
-FvCreateMultipleFilesInsidePadFile (\r
- IN FV_DEVICE *FvDevice,\r
- IN FFS_FILE_LIST_ENTRY *PadFileEntry,\r
- IN UINTN NumOfFiles,\r
- IN UINTN *BufferSize,\r
- IN UINTN *ActualFileSize,\r
- IN UINTN *PadSize,\r
- IN UINT8 **FfsBuffer,\r
- IN EFI_FV_WRITE_FILE_DATA *FileData\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_FFS_FILE_HEADER *OldPadFileHeader;\r
- UINTN Index;\r
- EFI_FFS_FILE_HEADER *PadFileHeader;\r
- EFI_FFS_FILE_HEADER *FileHeader;\r
- EFI_FFS_FILE_HEADER *TailPadFileHeader;\r
- UINTN TotalSize;\r
- UINTN PadAreaLength;\r
- LIST_ENTRY NewFileList;\r
- FFS_FILE_LIST_ENTRY *NewFileListEntry;\r
- UINTN Offset;\r
- UINTN NumBytesWritten;\r
- UINT8 *StartPos;\r
- FFS_FILE_LIST_ENTRY *FfsEntry;\r
- FFS_FILE_LIST_ENTRY *NextFfsEntry;\r
-\r
- InitializeListHead (&NewFileList);\r
-\r
- NewFileListEntry = NULL;\r
-\r
- OldPadFileHeader = (EFI_FFS_FILE_HEADER *) PadFileEntry->FfsHeader;\r
- if (IS_FFS_FILE2 (OldPadFileHeader)) {\r
- PadAreaLength = FFS_FILE2_SIZE (OldPadFileHeader) - sizeof (EFI_FFS_FILE_HEADER2);\r
- } else {\r
- PadAreaLength = FFS_FILE_SIZE (OldPadFileHeader) - sizeof (EFI_FFS_FILE_HEADER);\r
- }\r
-\r
- Status = UpdateHeaderBit (\r
- FvDevice,\r
- OldPadFileHeader,\r
- EFI_FILE_MARKED_FOR_UPDATE\r
- );\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- //\r
- // Update PAD area\r
- //\r
- TotalSize = 0;\r
- if (IS_FFS_FILE2 (OldPadFileHeader)) {\r
- PadFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) OldPadFileHeader + sizeof (EFI_FFS_FILE_HEADER2));\r
- } else {\r
- PadFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) OldPadFileHeader + sizeof (EFI_FFS_FILE_HEADER));\r
- }\r
- FileHeader = PadFileHeader;\r
-\r
- for (Index = 0; Index < NumOfFiles; Index++) {\r
- if (PadSize[Index] != 0) {\r
- FvFillPadFile (PadFileHeader, PadSize[Index]);\r
- NewFileListEntry = AllocatePool (sizeof (FFS_FILE_LIST_ENTRY));\r
- if (NewFileListEntry == NULL) {\r
- FreeFileList (&NewFileList);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewFileListEntry->FfsHeader = (UINT8 *) PadFileHeader;\r
- InsertTailList (&NewFileList, &NewFileListEntry->Link);\r
- }\r
-\r
- FileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) PadFileHeader + PadSize[Index]);\r
- Status = FvFillFfsFile (\r
- FileHeader,\r
- FfsBuffer[Index],\r
- BufferSize[Index],\r
- ActualFileSize[Index],\r
- FileData[Index].NameGuid,\r
- FileData[Index].Type,\r
- FileData[Index].FileAttributes\r
- );\r
- if (EFI_ERROR (Status)) {\r
- FreeFileList (&NewFileList);\r
- return Status;\r
- }\r
-\r
- NewFileListEntry = AllocatePool (sizeof (FFS_FILE_LIST_ENTRY));\r
- if (NewFileListEntry == NULL) {\r
- FreeFileList (&NewFileList);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewFileListEntry->FfsHeader = (UINT8 *) FileHeader;\r
- InsertTailList (&NewFileList, &NewFileListEntry->Link);\r
-\r
- PadFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FileHeader + BufferSize[Index]);\r
- TotalSize += PadSize[Index];\r
- TotalSize += BufferSize[Index];\r
- }\r
-\r
- FvDevice->CurrentFfsFile = NewFileListEntry;\r
- //\r
- // Maybe we need a tail pad file\r
- //\r
- if (PadAreaLength > TotalSize) {\r
- if ((PadAreaLength - TotalSize) >= sizeof (EFI_FFS_FILE_HEADER)) {\r
- //\r
- // we can insert another PAD file\r
- //\r
- TailPadFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FileHeader + BufferSize[NumOfFiles - 1]);\r
- FvFillPadFile (TailPadFileHeader, PadAreaLength - TotalSize);\r
-\r
- NewFileListEntry = AllocatePool (sizeof (FFS_FILE_LIST_ENTRY));\r
- if (NewFileListEntry == NULL) {\r
- FreeFileList (&NewFileList);\r
- FvDevice->CurrentFfsFile = NULL;\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewFileListEntry->FfsHeader = (UINT8 *) TailPadFileHeader;\r
- InsertTailList (&NewFileList, &NewFileListEntry->Link);\r
- } else {\r
- //\r
- // because left size cannot hold another PAD file header,\r
- // adjust the writing file size (just in cache)\r
- //\r
- FvAdjustFfsFile (\r
- FvDevice->ErasePolarity,\r
- FileHeader,\r
- PadAreaLength - TotalSize\r
- );\r
- }\r
- }\r
- //\r
- // Start writing to FV\r
- //\r
- if (IS_FFS_FILE2 (OldPadFileHeader)) {\r
- StartPos = (UINT8 *) OldPadFileHeader + sizeof (EFI_FFS_FILE_HEADER2);\r
- } else {\r
- StartPos = (UINT8 *) OldPadFileHeader + sizeof (EFI_FFS_FILE_HEADER);\r
- }\r
-\r
- Offset = (UINTN) (StartPos - FvDevice->CachedFv);\r
-\r
- NumBytesWritten = PadAreaLength;\r
- Status = FvcWrite (\r
- FvDevice,\r
- Offset,\r
- &NumBytesWritten,\r
- StartPos\r
- );\r
- if (EFI_ERROR (Status)) {\r
- FreeFileList (&NewFileList);\r
- FvDevice->CurrentFfsFile = NULL;\r
- return Status;\r
- }\r
-\r
- Status = UpdateHeaderBit (\r
- FvDevice,\r
- OldPadFileHeader,\r
- EFI_FILE_HEADER_INVALID\r
- );\r
- if (EFI_ERROR (Status)) {\r
- FreeFileList (&NewFileList);\r
- FvDevice->CurrentFfsFile = NULL;\r
- return Status;\r
- }\r
-\r
- //\r
- // Update File List Link\r
- //\r
-\r
- //\r
- // First delete old pad file entry\r
- //\r
- FfsEntry = (FFS_FILE_LIST_ENTRY *) PadFileEntry->Link.BackLink;\r
- NextFfsEntry = (FFS_FILE_LIST_ENTRY *) PadFileEntry->Link.ForwardLink;\r
-\r
- FreePool (PadFileEntry);\r
-\r
- FfsEntry->Link.ForwardLink = NewFileList.ForwardLink;\r
- (NewFileList.ForwardLink)->BackLink = &FfsEntry->Link;\r
- NextFfsEntry->Link.BackLink = NewFileList.BackLink;\r
- (NewFileList.BackLink)->ForwardLink = &NextFfsEntry->Link;\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Create multiple files within the Free Space.\r
-\r
- @param FvDevice Firmware Volume Device.\r
- @param FreeSpaceEntry Indicating in which Free Space(Cache) the multiple files will be inserted.\r
- @param NumOfFiles Total File number to be written.\r
- @param BufferSize The array of buffer size of each FfsBuffer.\r
- @param ActualFileSize The array of actual file size.\r
- @param PadSize The array of leading pad file size for each FFS File\r
- @param FfsBuffer The array of Ffs Buffer pointer.\r
- @param FileData The array of EFI_FV_WRITE_FILE_DATA structure,\r
- used to get name, attributes, type, etc.\r
-\r
- @retval EFI_SUCCESS Add the input multiple files into PAD file area.\r
- @retval EFI_OUT_OF_RESOURCES No enough memory is allocated.\r
- @retval other error Files can't be added into PAD file area.\r
-\r
-**/\r
-EFI_STATUS\r
-FvCreateMultipleFilesInsideFreeSpace (\r
- IN FV_DEVICE *FvDevice,\r
- IN FREE_SPACE_ENTRY *FreeSpaceEntry,\r
- IN UINTN NumOfFiles,\r
- IN UINTN *BufferSize,\r
- IN UINTN *ActualFileSize,\r
- IN UINTN *PadSize,\r
- IN UINT8 **FfsBuffer,\r
- IN EFI_FV_WRITE_FILE_DATA *FileData\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINTN Index;\r
- EFI_FFS_FILE_HEADER *PadFileHeader;\r
- EFI_FFS_FILE_HEADER *FileHeader;\r
- UINTN TotalSize;\r
- LIST_ENTRY NewFileList;\r
- FFS_FILE_LIST_ENTRY *NewFileListEntry;\r
- UINTN Offset;\r
- UINTN NumBytesWritten;\r
- UINT8 *StartPos;\r
-\r
- InitializeListHead (&NewFileList);\r
-\r
- NewFileListEntry = NULL;\r
-\r
- TotalSize = 0;\r
- StartPos = FreeSpaceEntry->StartingAddress;\r
- PadFileHeader = (EFI_FFS_FILE_HEADER *) StartPos;\r
- FileHeader = PadFileHeader;\r
-\r
- for (Index = 0; Index < NumOfFiles; Index++) {\r
- if (PadSize[Index] != 0) {\r
- FvFillPadFile (PadFileHeader, PadSize[Index]);\r
- NewFileListEntry = AllocatePool (sizeof (FFS_FILE_LIST_ENTRY));\r
- if (NewFileListEntry == NULL) {\r
- FreeFileList (&NewFileList);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewFileListEntry->FfsHeader = (UINT8 *) PadFileHeader;\r
- InsertTailList (&NewFileList, &NewFileListEntry->Link);\r
- }\r
-\r
- FileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) PadFileHeader + PadSize[Index]);\r
- Status = FvFillFfsFile (\r
- FileHeader,\r
- FfsBuffer[Index],\r
- BufferSize[Index],\r
- ActualFileSize[Index],\r
- FileData[Index].NameGuid,\r
- FileData[Index].Type,\r
- FileData[Index].FileAttributes\r
- );\r
- if (EFI_ERROR (Status)) {\r
- FreeFileList (&NewFileList);\r
- return Status;\r
- }\r
-\r
- NewFileListEntry = AllocatePool (sizeof (FFS_FILE_LIST_ENTRY));\r
- if (NewFileListEntry == NULL) {\r
- FreeFileList (&NewFileList);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- NewFileListEntry->FfsHeader = (UINT8 *) FileHeader;\r
- InsertTailList (&NewFileList, &NewFileListEntry->Link);\r
-\r
- PadFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FileHeader + BufferSize[Index]);\r
- TotalSize += PadSize[Index];\r
- TotalSize += BufferSize[Index];\r
- }\r
-\r
- if (FreeSpaceEntry->Length < TotalSize) {\r
- FreeFileList (&NewFileList);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
-\r
- FvDevice->CurrentFfsFile = NewFileListEntry;\r
-\r
- //\r
- // Start writing to FV\r
- //\r
- Offset = (UINTN) (StartPos - FvDevice->CachedFv);\r
-\r
- NumBytesWritten = TotalSize;\r
- Status = FvcWrite (\r
- FvDevice,\r
- Offset,\r
- &NumBytesWritten,\r
- StartPos\r
- );\r
- if (EFI_ERROR (Status)) {\r
- FreeFileList (&NewFileList);\r
- FvDevice->CurrentFfsFile = NULL;\r
- return Status;\r
- }\r
-\r
- FreeSpaceEntry->Length -= TotalSize;\r
- FreeSpaceEntry->StartingAddress += TotalSize;\r
-\r
- NewFileListEntry = (FFS_FILE_LIST_ENTRY *) (NewFileList.ForwardLink);\r
-\r
- while (NewFileListEntry != (FFS_FILE_LIST_ENTRY *) &NewFileList) {\r
- InsertTailList (&FvDevice->FfsFileListHeader, &NewFileListEntry->Link);\r
- NewFileListEntry = (FFS_FILE_LIST_ENTRY *) (NewFileListEntry->Link.ForwardLink);\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Write multiple files into FV in reliable method.\r
-\r
- @param FvDevice Firmware Volume Device.\r
- @param NumOfFiles Total File number to be written.\r
- @param FileData The array of EFI_FV_WRITE_FILE_DATA structure,\r
- used to get name, attributes, type, etc\r
- @param FileOperation The array of operation for each file.\r
-\r
- @retval EFI_SUCCESS Files are added into FV.\r
- @retval EFI_OUT_OF_RESOURCES No enough free PAD files to add the input files.\r
- @retval EFI_INVALID_PARAMETER File number is less than or equal to 1.\r
- @retval EFI_UNSUPPORTED File number exceeds the supported max numbers of files.\r
-\r
-**/\r
-EFI_STATUS\r
-FvCreateMultipleFiles (\r
- IN FV_DEVICE *FvDevice,\r
- IN UINTN NumOfFiles,\r
- IN EFI_FV_WRITE_FILE_DATA *FileData,\r
- IN BOOLEAN *FileOperation\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT8 *FfsBuffer[MAX_FILES];\r
- UINTN Index1;\r
- UINTN Index2;\r
- UINTN BufferSize[MAX_FILES];\r
- UINTN ActualFileSize[MAX_FILES];\r
- UINTN RequiredAlignment[MAX_FILES];\r
- UINTN PadSize[MAX_FILES];\r
- FFS_FILE_LIST_ENTRY *PadFileEntry;\r
- UINTN TotalSizeNeeded;\r
- FREE_SPACE_ENTRY *FreeSpaceEntry;\r
- EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv;\r
- UINTN Key;\r
- EFI_GUID FileNameGuid;\r
- EFI_FV_FILETYPE OldFileType;\r
- EFI_FV_FILE_ATTRIBUTES OldFileAttributes;\r
- UINTN OldFileSize;\r
- FFS_FILE_LIST_ENTRY *OldFfsFileEntry[MAX_FILES];\r
- EFI_FFS_FILE_HEADER *OldFileHeader[MAX_FILES];\r
- BOOLEAN IsCreateFile;\r
- UINTN HeaderSize;\r
-\r
- //\r
- // To use this function, we must ensure that the NumOfFiles is great\r
- // than 1\r
- //\r
- if (NumOfFiles <= 1) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- if (NumOfFiles > MAX_FILES) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- Fv = &FvDevice->Fv;\r
-\r
- SetMem (FfsBuffer, NumOfFiles, 0);\r
- SetMem (RequiredAlignment, NumOfFiles, 8);\r
- SetMem (PadSize, NumOfFiles, 0);\r
- ZeroMem (OldFfsFileEntry, sizeof (OldFfsFileEntry));\r
- ZeroMem (OldFileHeader, sizeof (OldFileHeader));\r
-\r
- //\r
- // Adjust file size\r
- //\r
- for (Index1 = 0; Index1 < NumOfFiles; Index1++) {\r
- HeaderSize = sizeof (EFI_FFS_FILE_HEADER);\r
- ActualFileSize[Index1] = FileData[Index1].BufferSize + HeaderSize;\r
- if (ActualFileSize[Index1] > 0x00FFFFFF) {\r
- HeaderSize = sizeof (EFI_FFS_FILE_HEADER2);\r
- ActualFileSize[Index1] = FileData[Index1].BufferSize + HeaderSize;\r
- }\r
- BufferSize[Index1] = ActualFileSize[Index1];\r
-\r
- if (BufferSize[Index1] == HeaderSize) {\r
- //\r
- // clear file attributes, zero-length file does not have any attributes\r
- //\r
- FileData[Index1].FileAttributes = 0;\r
- }\r
-\r
- while ((BufferSize[Index1] & 0x07) != 0) {\r
- BufferSize[Index1]++;\r
- }\r
-\r
- FfsBuffer[Index1] = AllocateZeroPool (BufferSize[Index1]);\r
-\r
- //\r
- // Copy File Data into FileBuffer\r
- //\r
- CopyMem (\r
- FfsBuffer[Index1] + HeaderSize,\r
- FileData[Index1].Buffer,\r
- FileData[Index1].BufferSize\r
- );\r
-\r
- if (FvDevice->ErasePolarity == 1) {\r
- for (Index2 = 0; Index2 < HeaderSize; Index2++) {\r
- FfsBuffer[Index1][Index2] = (UINT8)~FfsBuffer[Index1][Index2];\r
- }\r
- }\r
-\r
- if ((FileData[Index1].FileAttributes & EFI_FV_FILE_ATTRIB_ALIGNMENT) != 0) {\r
- RequiredAlignment[Index1] = GetRequiredAlignment (FileData[Index1].FileAttributes);\r
- }\r
- //\r
- // If update file, mark the original file header to\r
- // EFI_FILE_MARKED_FOR_UPDATE\r
- //\r
- IsCreateFile = FileOperation[Index1];\r
- if (!IsCreateFile) {\r
-\r
- Key = 0;\r
- do {\r
- OldFileType = 0;\r
- Status = Fv->GetNextFile (\r
- Fv,\r
- &Key,\r
- &OldFileType,\r
- &FileNameGuid,\r
- &OldFileAttributes,\r
- &OldFileSize\r
- );\r
- if (EFI_ERROR (Status)) {\r
- FreeFfsBuffer (NumOfFiles, FfsBuffer);\r
- return Status;\r
- }\r
- } while (!CompareGuid (&FileNameGuid, FileData[Index1].NameGuid));\r
-\r
- //\r
- // Get FfsFileEntry from the search key\r
- //\r
- OldFfsFileEntry[Index1] = (FFS_FILE_LIST_ENTRY *) Key;\r
- OldFileHeader[Index1] = (EFI_FFS_FILE_HEADER *) OldFfsFileEntry[Index1]->FfsHeader;\r
- Status = UpdateHeaderBit (\r
- FvDevice,\r
- OldFileHeader[Index1],\r
- EFI_FILE_MARKED_FOR_UPDATE\r
- );\r
- if (EFI_ERROR (Status)) {\r
- FreeFfsBuffer (NumOfFiles, FfsBuffer);\r
- return Status;\r
- }\r
- }\r
- }\r
- //\r
- // First to search a suitable pad file that can hold so\r
- // many files\r
- //\r
- Status = FvSearchSuitablePadFile (\r
- FvDevice,\r
- NumOfFiles,\r
- BufferSize,\r
- RequiredAlignment,\r
- PadSize,\r
- &TotalSizeNeeded,\r
- &PadFileEntry\r
- );\r
-\r
- if (Status == EFI_NOT_FOUND) {\r
- //\r
- // Try to find a free space that can hold these files\r
- //\r
- Status = FvSearchSuitableFreeSpace (\r
- FvDevice,\r
- NumOfFiles,\r
- BufferSize,\r
- RequiredAlignment,\r
- PadSize,\r
- &TotalSizeNeeded,\r
- &FreeSpaceEntry\r
- );\r
- if (EFI_ERROR (Status)) {\r
- FreeFfsBuffer (NumOfFiles, FfsBuffer);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- Status = FvCreateMultipleFilesInsideFreeSpace (\r
- FvDevice,\r
- FreeSpaceEntry,\r
- NumOfFiles,\r
- BufferSize,\r
- ActualFileSize,\r
- PadSize,\r
- FfsBuffer,\r
- FileData\r
- );\r
-\r
- } else {\r
- //\r
- // Create multiple files inside such a pad file\r
- // to achieve lock-step update\r
- //\r
- Status = FvCreateMultipleFilesInsidePadFile (\r
- FvDevice,\r
- PadFileEntry,\r
- NumOfFiles,\r
- BufferSize,\r
- ActualFileSize,\r
- PadSize,\r
- FfsBuffer,\r
- FileData\r
- );\r
- }\r
-\r
- FreeFfsBuffer (NumOfFiles, FfsBuffer);\r
-\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- //\r
- // Delete those updated files\r
- //\r
- for (Index1 = 0; Index1 < NumOfFiles; Index1++) {\r
- IsCreateFile = FileOperation[Index1];\r
- if (!IsCreateFile && OldFfsFileEntry[Index1] != NULL) {\r
- (OldFfsFileEntry[Index1]->Link.BackLink)->ForwardLink = OldFfsFileEntry[Index1]->Link.ForwardLink;\r
- (OldFfsFileEntry[Index1]->Link.ForwardLink)->BackLink = OldFfsFileEntry[Index1]->Link.BackLink;\r
- FreePool (OldFfsFileEntry[Index1]);\r
- }\r
- }\r
- //\r
- // Set those files' state to EFI_FILE_DELETED\r
- //\r
- for (Index1 = 0; Index1 < NumOfFiles; Index1++) {\r
- IsCreateFile = FileOperation[Index1];\r
- if (!IsCreateFile && OldFileHeader[Index1] != NULL) {\r
- Status = UpdateHeaderBit (FvDevice, OldFileHeader[Index1], EFI_FILE_DELETED);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- }\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r