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
\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
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
// 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
//\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
(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
//\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
//\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
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
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
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
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
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
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