]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/Common/FirmwareVolumeBuffer.c
BaseTools: Clean up source files
[mirror_edk2.git] / BaseTools / Source / C / Common / FirmwareVolumeBuffer.c
index c8586b407829c44c718b2cdda4a6ff7b5d4f0566..c68d2ee0dbd7c6208626c918b6cb4c4724da0f4e 100644 (file)
@@ -1,6 +1,7 @@
 /** @file\r
+EFI Firmware Volume routines which work on a Fv image in buffers.\r
 \r
-Copyright (c) 1999 - 2008, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 1999 - 2018, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -9,14 +10,6 @@ http://opensource.org/licenses/bsd-license.php
 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
-Module Name:\r
-\r
-  FirmwareVolumeBuffer.c\r
-\r
-Abstract:\r
-\r
-  EFI Firmware Volume routines which work on a Fv image in buffers.\r
-\r
 **/\r
 \r
 #include "FirmwareVolumeBufferLib.h"\r
@@ -33,6 +26,42 @@ Abstract:
     )\r
 \r
 \r
+//\r
+// Local prototypes\r
+//\r
+\r
+STATIC\r
+UINT32\r
+FvBufGetSecHdrLen(\r
+   IN EFI_COMMON_SECTION_HEADER *SectionHeader\r
+   )\r
+{\r
+  if (SectionHeader == NULL) {\r
+    return 0;\r
+  }\r
+  if (FvBufExpand3ByteSize(SectionHeader->Size) == 0xffffff) {\r
+    return sizeof(EFI_COMMON_SECTION_HEADER2);\r
+  }\r
+  return sizeof(EFI_COMMON_SECTION_HEADER);\r
+}\r
+\r
+STATIC\r
+UINT32\r
+FvBufGetSecFileLen (\r
+  IN EFI_COMMON_SECTION_HEADER *SectionHeader\r
+  )\r
+{\r
+  UINT32 Length;\r
+  if (SectionHeader == NULL) {\r
+    return 0;\r
+  }\r
+  Length = FvBufExpand3ByteSize(SectionHeader->Size);\r
+  if (Length == 0xffffff) {\r
+    Length = ((EFI_COMMON_SECTION_HEADER2 *)SectionHeader)->ExtendedSize;\r
+  }\r
+  return Length;\r
+}\r
+\r
 //\r
 // Local prototypes\r
 //\r
@@ -92,7 +121,7 @@ Returns:
     return Status;\r
   }\r
 \r
-  FileToRmLength = FvBufExpand3ByteSize (FileToRm->Size);\r
+  FileToRmLength = FvBufGetFfsFileSize (FileToRm);\r
 \r
   CommonLibBinderSetMem (\r
     FileToRm,\r
@@ -157,6 +186,7 @@ Returns:
 \r
   Status = FvBufClearAllFiles (TempFv);\r
   if (EFI_ERROR (Status)) {\r
+    CommonLibBinderFree (TempFv);\r
     return Status;\r
   }\r
 \r
@@ -218,7 +248,7 @@ Returns:
   EFI_FFS_FILE_STATE StateBackup;\r
   UINT32 FileSize;\r
 \r
-  FileSize = FvBufExpand3ByteSize (File->Size);\r
+  FileSize = FvBufGetFfsFileSize (File);\r
 \r
   //\r
   // Fill in checksums and state, they must be 0 for checksumming.\r
@@ -231,13 +261,13 @@ Returns:
   File->IntegrityCheck.Checksum.Header =\r
     FvBufCalculateChecksum8 (\r
       (UINT8 *) File,\r
-      sizeof (EFI_FFS_FILE_HEADER)\r
+      FvBufGetFfsHeaderSize (File)\r
       );\r
 \r
   if (File->Attributes & FFS_ATTRIB_CHECKSUM) {\r
     File->IntegrityCheck.Checksum.File = FvBufCalculateChecksum8 (\r
-                                                (VOID*)(File + 1),\r
-                                                FileSize - sizeof (EFI_FFS_FILE_HEADER)\r
+                                                (VOID*)((UINT8 *)File + FvBufGetFfsHeaderSize (File)),\r
+                                                FileSize - FvBufGetFfsHeaderSize (File)\r
                                                 );\r
   } else {\r
     File->IntegrityCheck.Checksum.File = FFS_FIXED_CHECKSUM;\r
@@ -324,6 +354,9 @@ Returns:
 \r
   if (*DestinationFv == NULL) {\r
     *DestinationFv = CommonLibBinderAllocate (size);\r
+    if (*DestinationFv == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
   }\r
 \r
   CommonLibBinderCopyMem (*DestinationFv, SourceFv, size);\r
@@ -553,7 +586,7 @@ Returns:
   EFI_FIRMWARE_VOLUME_HEADER *hdr = (EFI_FIRMWARE_VOLUME_HEADER*)Fv;\r
 \r
   EFI_FFS_FILE_HEADER *fhdr = NULL;\r
-  EFI_FVB_ATTRIBUTES FvbAttributes;\r
+  EFI_FVB_ATTRIBUTES_2 FvbAttributes;\r
   UINTN offset;\r
   UINTN fsize;\r
   UINTN newSize;\r
@@ -568,7 +601,7 @@ Returns:
   }\r
 \r
   FvbAttributes = hdr->Attributes;\r
-  newSize = FvBufExpand3ByteSize (((EFI_FFS_FILE_HEADER*)File)->Size);\r
+  newSize = FvBufGetFfsFileSize ((EFI_FFS_FILE_HEADER*)File);\r
 \r
   for(\r
       offset = (UINTN)ALIGN_POINTER (hdr->HeaderLength, 8);\r
@@ -587,7 +620,7 @@ Returns:
       // BUGBUG: Need to make sure that the new file does not already\r
       // exist.\r
 \r
-      fsize = FvBufExpand3ByteSize (fhdr->Size);\r
+      fsize = FvBufGetFfsFileSize (fhdr);\r
       if (fsize == 0 || (offset + fsize > fvSize)) {\r
         return EFI_VOLUME_CORRUPTED;\r
       }\r
@@ -725,7 +758,7 @@ Returns:
   }\r
 \r
   erasedUint8 = (UINT8)((hdr->Attributes & EFI_FVB2_ERASE_POLARITY) ? 0xFF : 0);\r
-  NewFileSize = FvBufExpand3ByteSize (((EFI_FFS_FILE_HEADER*)File)->Size);\r
+  NewFileSize = FvBufGetFfsFileSize ((EFI_FFS_FILE_HEADER*)File);\r
 \r
   if (NewFileSize != (UINTN)ALIGN_POINTER (NewFileSize, 8)) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -739,7 +772,7 @@ Returns:
   LastFileSize = 0;\r
   do {\r
     Status = FvBufFindNextFile (Fv, &Key, (VOID **)&LastFile);\r
-    LastFileSize = FvBufExpand3ByteSize (((EFI_FFS_FILE_HEADER*)File)->Size);\r
+    LastFileSize = FvBufGetFfsFileSize ((EFI_FFS_FILE_HEADER*)File);\r
   } while (!EFI_ERROR (Status));\r
 \r
   //\r
@@ -811,6 +844,64 @@ Returns:
   ((UINT8*)SizeDest)[2] = (UINT8)(Size >> 16);\r
 }\r
 \r
+UINT32\r
+FvBufGetFfsFileSize (\r
+  IN EFI_FFS_FILE_HEADER *Ffs\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Get the FFS file size.\r
+\r
+Arguments:\r
+\r
+  Ffs - Pointer to FFS header\r
+\r
+Returns:\r
+\r
+  UINT32\r
+\r
+--*/\r
+{\r
+  if (Ffs == NULL) {\r
+    return 0;\r
+  }\r
+  if (Ffs->Attributes & FFS_ATTRIB_LARGE_FILE) {\r
+    return (UINT32) ((EFI_FFS_FILE_HEADER2 *)Ffs)->ExtendedSize;\r
+  }\r
+  return FvBufExpand3ByteSize(Ffs->Size);\r
+}\r
+\r
+UINT32\r
+FvBufGetFfsHeaderSize (\r
+  IN EFI_FFS_FILE_HEADER *Ffs\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Get the FFS header size.\r
+\r
+Arguments:\r
+\r
+  Ffs - Pointer to FFS header\r
+\r
+Returns:\r
+\r
+  UINT32\r
+\r
+--*/\r
+{\r
+  if (Ffs == NULL) {\r
+    return 0;\r
+  }\r
+  if (Ffs->Attributes & FFS_ATTRIB_LARGE_FILE) {\r
+    return sizeof(EFI_FFS_FILE_HEADER2);\r
+  }\r
+  return sizeof(EFI_FFS_FILE_HEADER);\r
+}\r
+\r
 UINT32\r
 FvBufExpand3ByteSize (\r
   IN VOID* Size\r
@@ -869,7 +960,7 @@ Returns:
   EFI_FIRMWARE_VOLUME_HEADER *hdr = (EFI_FIRMWARE_VOLUME_HEADER*)Fv;\r
 \r
   EFI_FFS_FILE_HEADER *fhdr = NULL;\r
-  EFI_FVB_ATTRIBUTES FvbAttributes;\r
+  EFI_FVB_ATTRIBUTES_2 FvbAttributes;\r
   UINTN fsize;\r
 \r
   EFI_STATUS Status;\r
@@ -897,7 +988,7 @@ Returns:
     ) {\r
 \r
     fhdr = (EFI_FFS_FILE_HEADER*) ((UINT8*)hdr + *Key);\r
-    fsize = FvBufExpand3ByteSize (fhdr->Size);\r
+    fsize = FvBufGetFfsFileSize (fhdr);\r
 \r
     if (!EFI_TEST_FFS_ATTRIBUTES_BIT(\r
           FvbAttributes,\r
@@ -1089,8 +1180,8 @@ Returns:
     //\r
     // Raw filetypes don't have sections, so we just return the raw data\r
     //\r
-    *RawData = (VOID*)(File + 1);\r
-    *RawDataSize = FvBufExpand3ByteSize (File->Size) - sizeof (*File);\r
+    *RawData = (VOID*)((UINT8 *)File + FvBufGetFfsHeaderSize (File));\r
+    *RawDataSize = FvBufGetFfsFileSize (File) - FvBufGetFfsHeaderSize (File);\r
     return EFI_SUCCESS;\r
   }\r
 \r
@@ -1102,9 +1193,9 @@ Returns:
     return Status;\r
   }\r
 \r
-  *RawData = (VOID*)(Section + 1);\r
+  *RawData = (VOID*)((UINT8 *)Section + FvBufGetSecHdrLen(Section));\r
   *RawDataSize =\r
-    FvBufExpand3ByteSize (Section->Size) - sizeof (*Section);\r
+    FvBufGetSecFileLen (Section) - FvBufGetSecHdrLen(Section);\r
 \r
   return EFI_SUCCESS;\r
 \r
@@ -1144,16 +1235,28 @@ Returns:
   UINT32 NewFileSize;\r
   EFI_RAW_SECTION* NewSection;\r
   UINT32 NewSectionSize;\r
+  UINT32 FfsHdrLen;\r
+  UINT32 SecHdrLen;\r
 \r
   //\r
   // The section size is the DataSize + the size of the section header\r
   //\r
   NewSectionSize = (UINT32)sizeof (EFI_RAW_SECTION) + (UINT32)RawDataSize;\r
+  SecHdrLen = sizeof (EFI_RAW_SECTION);\r
+  if (NewSectionSize >= MAX_SECTION_SIZE) {\r
+    NewSectionSize = (UINT32)sizeof (EFI_RAW_SECTION2) + (UINT32)RawDataSize;\r
+    SecHdrLen = sizeof (EFI_RAW_SECTION2);\r
+  }\r
 \r
   //\r
   // The file size is the size of the file header + the section size\r
   //\r
   NewFileSize = sizeof (EFI_FFS_FILE_HEADER) + NewSectionSize;\r
+  FfsHdrLen = sizeof (EFI_FFS_FILE_HEADER);\r
+  if (NewFileSize >= MAX_FFS_SIZE) {\r
+    NewFileSize = sizeof (EFI_FFS_FILE_HEADER2) + NewSectionSize;\r
+    FfsHdrLen = sizeof (EFI_FFS_FILE_HEADER2);\r
+  }\r
 \r
   //\r
   // Try to allocate a buffer to build the new FFS file in\r
@@ -1167,24 +1270,35 @@ Returns:
   //\r
   // The NewSection follow right after the FFS file header\r
   //\r
-  NewSection = (EFI_RAW_SECTION*)(NewFile + 1);\r
-  FvBufCompact3ByteSize (NewSection->Size, NewSectionSize);\r
+  NewSection = (EFI_RAW_SECTION*)((UINT8*)NewFile + FfsHdrLen);\r
+  if (NewSectionSize >= MAX_SECTION_SIZE) {\r
+    FvBufCompact3ByteSize (NewSection->Size, 0xffffff);\r
+    ((EFI_RAW_SECTION2 *)NewSection)->ExtendedSize = NewSectionSize;\r
+  } else {\r
+    FvBufCompact3ByteSize (NewSection->Size, NewSectionSize);\r
+  }\r
   NewSection->Type = EFI_SECTION_RAW;\r
 \r
   //\r
   // Copy the actual file data into the buffer\r
   //\r
-  CommonLibBinderCopyMem (NewSection + 1, RawData, RawDataSize);\r
+  CommonLibBinderCopyMem ((UINT8 *)NewSection + SecHdrLen, RawData, RawDataSize);\r
 \r
   //\r
   // Initialize the FFS file header\r
   //\r
   CommonLibBinderCopyMem (&NewFile->Name, Filename, sizeof (EFI_GUID));\r
-  FvBufCompact3ByteSize (NewFile->Size, NewFileSize);\r
-  NewFile->Type = EFI_FV_FILETYPE_FREEFORM;\r
   NewFile->Attributes = 0;\r
+  if (NewFileSize >= MAX_FFS_SIZE) {\r
+    FvBufCompact3ByteSize (NewFile->Size, 0x0);\r
+    ((EFI_FFS_FILE_HEADER2 *)NewFile)->ExtendedSize = NewFileSize;\r
+    NewFile->Attributes |= FFS_ATTRIB_LARGE_FILE;\r
+  } else {\r
+    FvBufCompact3ByteSize (NewFile->Size, NewFileSize);\r
+  }\r
+  NewFile->Type = EFI_FV_FILETYPE_FREEFORM;\r
   NewFile->IntegrityCheck.Checksum.Header =\r
-    FvBufCalculateChecksum8 ((UINT8*)NewFile, sizeof (*NewFile));\r
+    FvBufCalculateChecksum8 ((UINT8*)NewFile, FfsHdrLen);\r
   NewFile->IntegrityCheck.Checksum.File = FFS_FIXED_CHECKSUM;\r
   NewFile->State = (UINT8)~( EFI_FILE_HEADER_CONSTRUCTION |\r
                              EFI_FILE_HEADER_VALID |\r
@@ -1239,7 +1353,7 @@ Returns:
   }\r
 \r
   sectionHdr = (EFI_COMMON_SECTION_HEADER*)((UINT8*)SectionsStart + *Key);\r
-  sectionSize = FvBufExpand3ByteSize (sectionHdr->Size);\r
+  sectionSize = FvBufGetSecFileLen (sectionHdr);\r
 \r
   if (sectionSize < sizeof (EFI_COMMON_SECTION_HEADER)) {\r
     return EFI_NOT_FOUND;\r
@@ -1287,10 +1401,10 @@ Returns:
   UINTN                      TotalSectionsSize;\r
   EFI_COMMON_SECTION_HEADER* NextSection;\r
 \r
-  SectionStart = (VOID*)((UINTN)FfsFile + sizeof (EFI_FFS_FILE_HEADER));\r
+  SectionStart = (VOID*)((UINTN)FfsFile + FvBufGetFfsHeaderSize(FfsFile));\r
   TotalSectionsSize =\r
-    FvBufExpand3ByteSize (((EFI_FFS_FILE_HEADER*)FfsFile)->Size) -\r
-    sizeof (EFI_FFS_FILE_HEADER);\r
+    FvBufGetFfsFileSize ((EFI_FFS_FILE_HEADER*)FfsFile) -\r
+    FvBufGetFfsHeaderSize(FfsFile);\r
   Key = 0;\r
   *Count = 0;\r
   while (TRUE) {\r
@@ -1352,10 +1466,10 @@ Returns:
   UINTN                      TotalSectionsSize;\r
   EFI_COMMON_SECTION_HEADER* NextSection;\r
 \r
-  SectionStart = (VOID*)((UINTN)FfsFile + sizeof (EFI_FFS_FILE_HEADER));\r
+  SectionStart = (VOID*)((UINTN)FfsFile + FvBufGetFfsHeaderSize(FfsFile));\r
   TotalSectionsSize =\r
-    FvBufExpand3ByteSize (((EFI_FFS_FILE_HEADER*)FfsFile)->Size) -\r
-    sizeof (EFI_FFS_FILE_HEADER);\r
+    FvBufGetFfsFileSize ((EFI_FFS_FILE_HEADER*)FfsFile) -\r
+    FvBufGetFfsHeaderSize(FfsFile);\r
   Key = 0;\r
   while (TRUE) {\r
     Status = FvBufFindNextSection (\r
@@ -1436,7 +1550,7 @@ Returns:
   EndOfLastFile = (UINT8*)FvHdr + FvHdr->FvLength;\r
   while (!EFI_ERROR (FvBufFindNextFile (Fv, &Key, (VOID **)&FileIt))) {\r
     EndOfLastFile =\r
-      (VOID*)((UINT8*)FileIt + FvBufExpand3ByteSize (FileIt->Size));\r
+      (VOID*)((UINT8*)FileIt + FvBufGetFfsFileSize (FileIt));\r
   }\r
 \r
   //\r
@@ -1540,7 +1654,7 @@ FvBufCalculateSum16 (
   IN UINTN        Size\r
   )\r
 /*++\r
-  \r
+\r
 Routine Description:\r
 \r
   This function calculates the UINT16 sum for the requested region.\r
@@ -1579,7 +1693,7 @@ FvBufCalculateChecksum16 (
   IN UINTN        Size\r
   )\r
 /*++\r
-  \r
+\r
 Routine Description::\r
 \r
   This function calculates the value needed for a valid UINT16 checksum\r