Fix GenFvImage to generate FvImage when the required size is same to the size of...
authorlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Thu, 13 Aug 2009 09:40:49 +0000 (09:40 +0000)
committerlgao4 <lgao4@7335b38e-4728-0410-8992-fb3ffe349368>
Thu, 13 Aug 2009 09:40:49 +0000 (09:40 +0000)
git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@1680 7335b38e-4728-0410-8992-fb3ffe349368

Source/C/GenFv/GenFv.c
Source/C/GenFv/GenFvInternalLib.c

index 74c3a21..78fdfb2 100644 (file)
@@ -233,10 +233,10 @@ Returns:
   //\r
   memset (&mFvDataInfo, 0, sizeof (FV_INFO));\r
   memset (&mCapDataInfo, 0, sizeof (CAP_INFO)); \r
-       //\r
-       // Set the default FvGuid\r
-       //\r
-       memcpy (&mFvDataInfo.FvFileSystemGuid, &mEfiFirmwareFileSystem2Guid, sizeof (EFI_GUID));\r
+  //\r
+  // Set the default FvGuid\r
+  //\r
+  memcpy (&mFvDataInfo.FvFileSystemGuid, &mEfiFirmwareFileSystem2Guid, sizeof (EFI_GUID));\r
    \r
   //\r
   // Parse command line\r
index f0a16e5..91c4c19 100644 (file)
@@ -515,6 +515,7 @@ EFI_STATUS
 AddPadFile (\r
   IN OUT MEMORY_FILE  *FvImage,\r
   IN UINT32           DataAlignment,\r
+  IN VOID             *FvEnd,\r
   IN EFI_FIRMWARE_VOLUME_EXT_HEADER *ExtHeader\r
   )\r
 /*++\r
@@ -526,9 +527,10 @@ Routine Description:
 \r
 Arguments:\r
 \r
-  FvImage         The memory image of the FV to add it to.  The current offset\r
-                  must be valid.\r
+  FvImage         The memory image of the FV to add it to.\r
+                  The current offset must be valid.\r
   DataAlignment   The data alignment of the next FFS file.\r
+  FvEnd           End of the empty data in FvImage.\r
   ExtHeader       PI FvExtHeader Optional \r
 \r
 Returns:\r
@@ -557,30 +559,6 @@ Returns:
     return EFI_SUCCESS;\r
   }\r
 \r
-  //\r
-  // Write pad file header\r
-  //\r
-  PadFile = (EFI_FFS_FILE_HEADER *) FvImage->CurrentFilePointer;\r
-\r
-  //\r
-  // Verify that we have enough space for the file header\r
-  //\r
-  if (ExtHeader != NULL) {\r
-    if ((UINTN) (PadFile + sizeof (EFI_FFS_FILE_HEADER) + ExtHeader->ExtHeaderSize) >= (UINTN) FvImage->Eof) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }    \r
-  } else {\r
-    if ((UINTN) (PadFile + sizeof (EFI_FFS_FILE_HEADER)) >= (UINTN) FvImage->Eof) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    }\r
-  }\r
-\r
-  //\r
-  // write PadFile FFS header with PadType, don't need to set PAD file guid in its header.\r
-  //\r
-  PadFile->Type       = EFI_FV_FILETYPE_FFS_PAD;\r
-  PadFile->Attributes = 0;\r
-\r
   //\r
   // Calculate the pad file size\r
   //\r
@@ -588,11 +566,7 @@ Returns:
   // This is the earliest possible valid offset (current plus pad file header\r
   // plus the next file header)\r
   //\r
-  if (ExtHeader != NULL) {\r
-    PadFileSize = (UINTN) FvImage->CurrentFilePointer - (UINTN) FvImage->FileImage + (sizeof (EFI_FFS_FILE_HEADER) * 2) + ExtHeader->ExtHeaderSize;\r
-  } else {\r
-    PadFileSize = (UINTN) FvImage->CurrentFilePointer - (UINTN) FvImage->FileImage + (sizeof (EFI_FFS_FILE_HEADER) * 2);\r
-  }\r
+  PadFileSize = (UINTN) FvImage->CurrentFilePointer - (UINTN) FvImage->FileImage + (sizeof (EFI_FFS_FILE_HEADER) * 2);\r
 \r
   //\r
   // Add whatever it takes to get to the next aligned address\r
@@ -610,6 +584,31 @@ Returns:
   //\r
   PadFileSize -= (UINTN) FvImage->CurrentFilePointer - (UINTN) FvImage->FileImage;\r
   \r
+  //\r
+  // Append extension header size\r
+  //\r
+  if (ExtHeader != NULL) {\r
+    PadFileSize = PadFileSize + ExtHeader->ExtHeaderSize;\r
+  }\r
+\r
+  //\r
+  // Verify that we have enough space for the file header\r
+  //\r
+  if (((UINTN) FvImage->CurrentFilePointer + PadFileSize) > (UINTN) FvEnd) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  //\r
+  // Write pad file header\r
+  //\r
+  PadFile = (EFI_FFS_FILE_HEADER *) FvImage->CurrentFilePointer;\r
+\r
+  //\r
+  // Write PadFile FFS header with PadType, don't need to set PAD file guid in its header.\r
+  //\r
+  PadFile->Type       = EFI_FV_FILETYPE_FFS_PAD;\r
+  PadFile->Attributes = 0;\r
+\r
   //\r
   // Write pad file size (calculated size minus next file header size)\r
   //\r
@@ -631,26 +630,26 @@ Returns:
     (EFI_FFS_FILE_HEADER *) PadFile,\r
     (EFI_FIRMWARE_VOLUME_HEADER *) FvImage->FileImage\r
     );\r
-  \r
+\r
+  //\r
+  // Update the current FV pointer\r
+  //\r
+  FvImage->CurrentFilePointer += PadFileSize;\r
+\r
   if (ExtHeader != NULL) {\r
     //\r
     // Copy Fv Extension Header and Set Fv Extension header offset\r
     //\r
     memcpy (PadFile + 1, ExtHeader, ExtHeader->ExtHeaderSize);\r
     ((EFI_FIRMWARE_VOLUME_HEADER *) FvImage->FileImage)->ExtHeaderOffset = (UINT16) ((UINTN) (PadFile + 1) - (UINTN) FvImage->FileImage);\r
+         //\r
+         // Make next file start at QWord Boundry\r
+         //\r
+         while (((UINTN) FvImage->CurrentFilePointer & (EFI_FFS_FILE_HEADER_ALIGNMENT - 1)) != 0) {\r
+           FvImage->CurrentFilePointer++;\r
+         }\r
   }\r
 \r
-  //\r
-  // Verify that we have enough space (including the padding)\r
-  //\r
-  if (((UINTN)PadFile + PadFileSize) >= (UINTN) FvImage->Eof) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-  //\r
-  // Update the current FV pointer\r
-  //\r
-  FvImage->CurrentFilePointer += PadFileSize;\r
-\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -1099,7 +1098,7 @@ Returns:
   //\r
   // Add pad file if necessary\r
   //\r
-  Status = AddPadFile (FvImage, 1 << CurrentFileAlignment, NULL);\r
+  Status = AddPadFile (FvImage, 1 << CurrentFileAlignment, *VtfFileImage, NULL);\r
   if (EFI_ERROR (Status)) {\r
     Error (NULL, 0, 4002, "Resource", "FV space is full, could not add pad file for data alignment property.");\r
     free (FileBuffer);\r
@@ -1108,7 +1107,7 @@ Returns:
   //\r
   // Add file\r
   //\r
-  if ((FvImage->CurrentFilePointer + FileSize) < FvImage->Eof) {\r
+  if ((FvImage->CurrentFilePointer + FileSize) <= *VtfFileImage) {\r
     //\r
     // Rebase the PE or TE image in FileBuffer of FFS file for XIP. \r
     // Rebase Bs and Rt drivers for the debug genfvmap tool.\r
@@ -1177,6 +1176,10 @@ Returns:
     return EFI_SUCCESS;\r
   }\r
 \r
+  if ((UINTN) VtfFileImage < (UINTN) FvImage->CurrentFilePointer) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
   //\r
   // Pad file starts at beginning of free space\r
   //\r
@@ -1264,11 +1267,11 @@ Returns:
   UINT8                     *BytePointer2;\r
   UINT16                    *WordPointer;\r
   UINT16                    CheckSum;\r
+  UINT32                    IpiVector;\r
   UINTN                     Index;\r
   EFI_FFS_FILE_STATE        SavedState;\r
   UINT64                    FitAddress;\r
   FIT_TABLE                 *FitTablePtr;\r
-  UINT32                    IpiVector;\r
 \r
   //\r
   // Verify input parameters\r
@@ -2175,7 +2178,7 @@ Returns:
   if (mFvDataInfo.FvNameGuidSet) {\r
     memcpy (&FvExtHeader.FvName, &mFvDataInfo.FvNameGuid, sizeof (EFI_GUID));\r
     FvExtHeader.ExtHeaderSize = sizeof (EFI_FIRMWARE_VOLUME_EXT_HEADER);\r
-    AddPadFile (&FvImageMemoryFile, 8, &FvExtHeader);\r
+    AddPadFile (&FvImageMemoryFile, 4, VtfFileImage, &FvExtHeader);\r
     //\r
     // Fv Extension header change update Fv Header Check sum\r
     //\r
@@ -2385,7 +2388,9 @@ Returns:
   UINT32              FfsAlignment;\r
   EFI_FFS_FILE_HEADER FfsHeader;\r
   BOOLEAN             VtfFileFlag;\r
+  UINTN               VtfFileSize;\r
   \r
+  VtfFileSize = 0;\r
   VtfFileFlag = FALSE;\r
   fpin  = NULL;\r
   Index = 0;\r
@@ -2456,24 +2461,22 @@ Returns:
                return EFI_ABORTED;\r
              }\r
              VtfFileFlag = TRUE;\r
-             //\r
-             // The space between Vft File and the latest file must be able to contain \r
-             // one ffs file header in order to add one pad file.\r
-             //\r
-             CurrentOffset += sizeof (EFI_FFS_FILE_HEADER);\r
-           }\r
-           //\r
-           // Get the alignment of FFS file \r
-           //\r
-           ReadFfsAlignment (&FfsHeader, &FfsAlignment);\r
-           FfsAlignment = 1 << FfsAlignment;\r
-           //\r
-           // Add Pad file\r
-           //\r
-           if (((CurrentOffset + sizeof (EFI_FFS_FILE_HEADER)) % FfsAlignment) != 0) {\r
-             CurrentOffset = (CurrentOffset + sizeof (EFI_FFS_FILE_HEADER) * 2 + FfsAlignment - 1) & ~(FfsAlignment - 1);\r
-             CurrentOffset -= sizeof (EFI_FFS_FILE_HEADER);\r
-           }\r
+        VtfFileSize = FfsFileSize;\r
+        continue;\r
+      }\r
+\r
+      //\r
+      // Get the alignment of FFS file \r
+      //\r
+      ReadFfsAlignment (&FfsHeader, &FfsAlignment);\r
+      FfsAlignment = 1 << FfsAlignment;\r
+      //\r
+      // Add Pad file\r
+      //\r
+      if (((CurrentOffset + sizeof (EFI_FFS_FILE_HEADER)) % FfsAlignment) != 0) {\r
+        CurrentOffset = (CurrentOffset + sizeof (EFI_FFS_FILE_HEADER) * 2 + FfsAlignment - 1) & ~(FfsAlignment - 1);\r
+        CurrentOffset -= sizeof (EFI_FFS_FILE_HEADER);\r
+      }\r
          }\r
 \r
     //\r
@@ -2492,7 +2495,7 @@ Returns:
        CurrentOffset = (CurrentOffset + EFI_FFS_FILE_HEADER_ALIGNMENT - 1) & ~(EFI_FFS_FILE_HEADER_ALIGNMENT - 1);\r
     }\r
   }\r
-  \r
+  CurrentOffset += VtfFileSize;\r
   DebugMsg (NULL, 0, 9, "FvImage size", "The caculated fv image size is 0x%x and the current set fv image size is 0x%x", (unsigned) CurrentOffset, (unsigned) FvInfoPtr->Size);\r
   \r
   if (FvInfoPtr->Size == 0) { \r