]> git.proxmox.com Git - mirror_edk2.git/commitdiff
BaseTools GenFv: Report the correct spare FV image size
authorLiming Gao <liming.gao@intel.com>
Tue, 9 Jun 2020 08:16:48 +0000 (16:16 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Thu, 11 Jun 2020 14:36:54 +0000 (14:36 +0000)
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2790

If the top FFS is placed in FV image, current FV will show there is no space.
In fact, the pad ffs in FV image can be regarded as the spare space.
This change reports the max pad ffs size as the spare space for use.

Signed-off-by: Liming Gao <liming.gao@intel.com>
Cc: Bob Feng <bob.c.feng@intel.com>
Reviewed-by: Bob Feng <bob.c.feng@intel.com>
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