]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/GenFv/GenFvInternalLib.c
BaseTools GenFv: Report the correct spare FV image size
[mirror_edk2.git] / BaseTools / Source / C / GenFv / GenFvInternalLib.c
index d29a891c9c31353221b84ff5136ef3fb9314cf77..b5ffed93a9747b2d7a08e77716f6e19dacb9fb5f 100644 (file)
@@ -3140,6 +3140,7 @@ Returns:
 --*/\r
 {\r
   UINTN               CurrentOffset;\r
+  UINTN               OrigOffset;\r
   UINTN               Index;\r
   FILE                *fpin;\r
   UINTN               FfsFileSize;\r
@@ -3148,8 +3149,10 @@ Returns:
   UINT32              FfsHeaderSize;\r
   EFI_FFS_FILE_HEADER FfsHeader;\r
   UINTN               VtfFileSize;\r
+  UINTN               MaxPadFileSize;\r
 \r
   FvExtendHeaderSize = 0;\r
+  MaxPadFileSize = 0;\r
   VtfFileSize = 0;\r
   fpin  = NULL;\r
   Index = 0;\r
@@ -3258,8 +3261,12 @@ Returns:
         //\r
         // Only EFI_FFS_FILE_HEADER is needed for a pad section.\r
         //\r
+        OrigOffset    = CurrentOffset;\r
         CurrentOffset = (CurrentOffset + FfsHeaderSize + sizeof(EFI_FFS_FILE_HEADER) + FfsAlignment - 1) & ~(FfsAlignment - 1);\r
         CurrentOffset -= FfsHeaderSize;\r
+        if ((CurrentOffset - OrigOffset) > MaxPadFileSize) {\r
+          MaxPadFileSize = CurrentOffset - OrigOffset;\r
+        }\r
       }\r
     }\r
 \r
@@ -3303,6 +3310,12 @@ Returns:
   //\r
   mFvTotalSize = FvInfoPtr->Size;\r
   mFvTakenSize = CurrentOffset;\r
+  if ((mFvTakenSize == mFvTotalSize) && (MaxPadFileSize > 0)) {\r
+    //\r
+    // This FV means TOP FFS has been taken. Then, check whether there is padding data for use.\r
+    //\r
+    mFvTakenSize = mFvTakenSize - MaxPadFileSize;\r
+  }\r
 \r
   return EFI_SUCCESS;\r
 }\r