1 diff --git a/BaseTools/Source/C/GenFv/GenFvInternalLib.c b/BaseTools/Source/C/GenFv/GenFvInternalLib.c
5 --- a/BaseTools/Source/C/GenFv/GenFvInternalLib.c
6 +++ b/BaseTools/Source/C/GenFv/GenFvInternalLib.c
7 @@ -505,6 +505,7 @@ Returns:
12 IN OUT MEMORY_FILE *FvImage,
13 IN UINT32 DataAlignment,
15 @@ -536,6 +537,8 @@ Returns:
17 EFI_FFS_FILE_HEADER *PadFile;
19 + UINTN PadFileOffset;
20 + UINTN ExtHeaderSize;
23 // Verify input parameters.
24 @@ -558,32 +561,29 @@ Returns:
25 // This is the earliest possible valid offset (current plus pad file header
26 // plus the next file header)
28 - PadFileSize = (UINTN) FvImage->CurrentFilePointer - (UINTN) FvImage->FileImage + (sizeof (EFI_FFS_FILE_HEADER) * 2);
29 + // The padding is added into its own FFS file (which requires a header) added before the aligned file:
30 + // | ... FV data before AlignedFile ... | Pad File FFS Header | Padding | AlignedFile FFS Header (+ ExtHeader) | AlignedData
33 - // Add whatever it takes to get to the next aligned address
34 + // Calculate the Offset of the Pad File from the beginning of the FV file
36 - while ((PadFileSize % DataAlignment) != 0) {
40 - // Subtract the next file header size
42 - PadFileSize -= sizeof (EFI_FFS_FILE_HEADER);
45 - // Subtract the starting offset to get size
47 - PadFileSize -= (UINTN) FvImage->CurrentFilePointer - (UINTN) FvImage->FileImage;
48 + PadFileOffset = (UINTN) FvImage->CurrentFilePointer - (UINTN) FvImage->FileImage;
51 - // Append extension header size
52 + // Get the size of the extension header if exists
54 if (ExtHeader != NULL) {
55 - PadFileSize = PadFileSize + ExtHeader->ExtHeaderSize;
56 + ExtHeaderSize = ExtHeader->ExtHeaderSize;
62 + // Calculate the Size of the Padding to ensure the alignment of the data of the Next file
64 + PadFileSize = DataAlignment - ((FvInfo->BaseAddress + PadFileOffset + sizeof (EFI_FFS_FILE_HEADER) + ExtHeaderSize) & (DataAlignment - 1));
67 // Verify that we have enough space for the file header
69 if (((UINTN) FvImage->CurrentFilePointer + PadFileSize) > (UINTN) FvEnd) {
70 @@ -1110,7 +1110,7 @@ Returns:
72 // Add pad file if necessary
74 - Status = AddPadFile (FvImage, 1 << CurrentFileAlignment, *VtfFileImage, NULL);
75 + Status = AddPadFile (FvInfo, FvImage, 1 << CurrentFileAlignment, *VtfFileImage, NULL);
76 if (EFI_ERROR (Status)) {
77 Error (NULL, 0, 4002, "Resource", "FV space is full, could not add pad file for data alignment property.");
79 @@ -2295,7 +2295,7 @@ Returns:
81 // Add FV Extended Header contents to the FV as a PAD file
83 - AddPadFile (&FvImageMemoryFile, 4, VtfFileImage, FvExtHeader);
84 + AddPadFile (&mFvDataInfo, &FvImageMemoryFile, 4, VtfFileImage, FvExtHeader);
87 // Fv Extension header change update Fv Header Check sum