]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/GenFfs/GenFfs.c
Sync BaseTool trunk (version r2610) into EDKII BaseTools.
[mirror_edk2.git] / BaseTools / Source / C / GenFfs / GenFfs.c
index 24081ebfc44e8ac1765ac2062a25ca84fe5d4964..6f4804e90a0aa554e0d3f6011b728f42b8f6eabe 100644 (file)
@@ -1,6 +1,6 @@
 /**\r
 \r
-Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2013, 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
@@ -119,7 +119,7 @@ Returns:
   //\r
   // Copyright declaration\r
   // \r
-  fprintf (stdout, "Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.\n\n");\r
+  fprintf (stdout, "Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.\n\n");\r
 \r
   //\r
   // Details Option\r
@@ -284,10 +284,11 @@ Returns:
   UINT32                     Index;\r
   FILE                       *InFile;\r
   EFI_COMMON_SECTION_HEADER  *SectHeader;\r
-  EFI_COMMON_SECTION_HEADER  TempSectHeader;\r
+  EFI_COMMON_SECTION_HEADER2 TempSectHeader;\r
   EFI_TE_IMAGE_HEADER        TeHeader;\r
   UINT32                     TeOffset;\r
   EFI_GUID_DEFINED_SECTION   GuidSectHeader;\r
+  EFI_GUID_DEFINED_SECTION2  GuidSectHeader2;\r
   UINT32                     HeaderSize;\r
 \r
   Size          = 0;\r
@@ -332,8 +333,12 @@ Returns:
     // Check this section is Te/Pe section, and Calculate the numbers of Te/Pe section.\r
     //\r
     TeOffset = 0;\r
-    HeaderSize = sizeof (EFI_COMMON_SECTION_HEADER);\r
-    fread (&TempSectHeader, 1, sizeof (TempSectHeader), InFile);\r
+    if (FileSize >= MAX_FFS_SIZE) {\r
+      HeaderSize = sizeof (EFI_COMMON_SECTION_HEADER2);\r
+    } else {\r
+      HeaderSize = sizeof (EFI_COMMON_SECTION_HEADER);\r
+    }\r
+    fread (&TempSectHeader, 1, HeaderSize, InFile);\r
     if (TempSectHeader.Type == EFI_SECTION_TE) {\r
       (*PESectionNum) ++;\r
       fread (&TeHeader, 1, sizeof (TeHeader), InFile);\r
@@ -344,9 +349,16 @@ Returns:
       (*PESectionNum) ++;\r
     } else if (TempSectHeader.Type == EFI_SECTION_GUID_DEFINED) {\r
       fseek (InFile, 0, SEEK_SET);\r
-      fread (&GuidSectHeader, 1, sizeof (GuidSectHeader), InFile);\r
-      if ((GuidSectHeader.Attributes & EFI_GUIDED_SECTION_PROCESSING_REQUIRED) == 0) {\r
-        HeaderSize = GuidSectHeader.DataOffset;\r
+      if (FileSize >= MAX_SECTION_SIZE) {\r
+        fread (&GuidSectHeader2, 1, sizeof (GuidSectHeader2), InFile);\r
+        if ((GuidSectHeader2.Attributes & EFI_GUIDED_SECTION_PROCESSING_REQUIRED) == 0) {\r
+          HeaderSize = GuidSectHeader2.DataOffset;\r
+        }\r
+      } else {\r
+        fread (&GuidSectHeader, 1, sizeof (GuidSectHeader), InFile);\r
+        if ((GuidSectHeader.Attributes & EFI_GUIDED_SECTION_PROCESSING_REQUIRED) == 0) {\r
+          HeaderSize = GuidSectHeader.DataOffset;\r
+        }\r
       }\r
       (*PESectionNum) ++;\r
     } else if (TempSectHeader.Type == EFI_SECTION_COMPRESSION || \r
@@ -378,6 +390,9 @@ Returns:
       Offset = Offset - Size - HeaderSize - TeOffset;\r
        \r
       if (FileBuffer != NULL && ((Size + Offset) < *BufferLength)) {\r
+        //\r
+        // The maximal alignment is 64K, the raw section size must be less than 0xffffff\r
+        //\r
         memset (FileBuffer + Size, 0, Offset);\r
         SectHeader          = (EFI_COMMON_SECTION_HEADER *) (FileBuffer + Size);\r
         SectHeader->Type    = EFI_SECTION_RAW;\r
@@ -453,11 +468,12 @@ Returns:
   UINT8                   *FileBuffer;\r
   UINT32                  FileSize;\r
   UINT32                  MaxAlignment;\r
-  EFI_FFS_FILE_HEADER     FfsFileHeader;\r
+  EFI_FFS_FILE_HEADER2    FfsFileHeader;\r
   FILE                    *FfsFile;\r
   UINT32                  Index;\r
   UINT64                  LogLevel;\r
   UINT8                   PeSectionNum;\r
+  UINT32                  HeaderSize;\r
   \r
   //\r
   // Init local variables\r
@@ -816,7 +832,7 @@ Returns:
   //\r
   // Create Ffs file header.\r
   //\r
-  memset (&FfsFileHeader, 0, sizeof (EFI_FFS_FILE_HEADER));\r
+  memset (&FfsFileHeader, 0, sizeof (EFI_FFS_FILE_HEADER2));\r
   memcpy (&FfsFileHeader.Name, &FileGuid, sizeof (EFI_GUID));\r
   FfsFileHeader.Type       = FfsFiletype;\r
   //\r
@@ -832,16 +848,27 @@ Returns:
     FfsAlign = Index;\r
   }\r
   VerboseMsg ("the alignment of the generated FFS file is %u", (unsigned) mFfsValidAlign [FfsAlign + 1]);  \r
-  FfsFileHeader.Attributes = (EFI_FFS_FILE_ATTRIBUTES) (FfsAttrib | (FfsAlign << 3));\r
   \r
   //\r
   // Now FileSize includes the EFI_FFS_FILE_HEADER\r
   //\r
-  FileSize += sizeof (EFI_FFS_FILE_HEADER);\r
+  if (FileSize + sizeof (EFI_FFS_FILE_HEADER) >= MAX_FFS_SIZE) {\r
+    HeaderSize = sizeof (EFI_FFS_FILE_HEADER2);\r
+    FileSize += sizeof (EFI_FFS_FILE_HEADER2);\r
+    FfsFileHeader.ExtendedSize = FileSize;\r
+    memset(FfsFileHeader.Size, 0, sizeof (UINT8) * 3);\r
+    FfsAttrib |= FFS_ATTRIB_LARGE_FILE;\r
+  } else {\r
+    HeaderSize = sizeof (EFI_FFS_FILE_HEADER);\r
+    FileSize += sizeof (EFI_FFS_FILE_HEADER);\r
+    FfsFileHeader.Size[0]  = (UINT8) (FileSize & 0xFF);\r
+    FfsFileHeader.Size[1]  = (UINT8) ((FileSize & 0xFF00) >> 8);\r
+    FfsFileHeader.Size[2]  = (UINT8) ((FileSize & 0xFF0000) >> 16);\r
+  }\r
   VerboseMsg ("the size of the generated FFS file is %u bytes", (unsigned) FileSize);\r
-  FfsFileHeader.Size[0]  = (UINT8) (FileSize & 0xFF);\r
-  FfsFileHeader.Size[1]  = (UINT8) ((FileSize & 0xFF00) >> 8);\r
-  FfsFileHeader.Size[2]  = (UINT8) ((FileSize & 0xFF0000) >> 16);\r
+\r
+  FfsFileHeader.Attributes = (EFI_FFS_FILE_ATTRIBUTES) (FfsAttrib | (FfsAlign << 3));\r
+\r
   //\r
   // Fill in checksums and state, these must be zero for checksumming\r
   //\r
@@ -851,7 +878,7 @@ Returns:
   //\r
   FfsFileHeader.IntegrityCheck.Checksum.Header = CalculateChecksum8 (\r
                                                    (UINT8 *) &FfsFileHeader,\r
-                                                   sizeof (EFI_FFS_FILE_HEADER)\r
+                                                   HeaderSize\r
                                                    );\r
 \r
   if (FfsFileHeader.Attributes & FFS_ATTRIB_CHECKSUM) {\r
@@ -860,7 +887,7 @@ Returns:
     //\r
     FfsFileHeader.IntegrityCheck.Checksum.File = CalculateChecksum8 (\r
                                                    FileBuffer, \r
-                                                   FileSize - sizeof (EFI_FFS_FILE_HEADER)\r
+                                                   FileSize - HeaderSize\r
                                                    );    \r
   } else {\r
     FfsFileHeader.IntegrityCheck.Checksum.File = FFS_FIXED_CHECKSUM;\r
@@ -880,11 +907,11 @@ Returns:
   //\r
   // write header\r
   //\r
-  fwrite (&FfsFileHeader, 1, sizeof (FfsFileHeader), FfsFile);\r
+  fwrite (&FfsFileHeader, 1, HeaderSize, FfsFile);\r
   //\r
   // write data\r
   //\r
-  fwrite (FileBuffer, 1, FileSize - sizeof (EFI_FFS_FILE_HEADER), FfsFile);\r
+  fwrite (FileBuffer, 1, FileSize - HeaderSize, FfsFile);\r
 \r
   fclose (FfsFile);\r
 \r