]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/FwPadFile.c
Remove IntelFrameworkModulePkg
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / FirmwareVolume / FwVolDxe / FwPadFile.c
diff --git a/IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/FwPadFile.c b/IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/FwPadFile.c
deleted file mode 100644 (file)
index a50bd13..0000000
+++ /dev/null
@@ -1,1221 +0,0 @@
-/** @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