Logfile is the output fv map file name. if it is not\n\\r
given, the FvName.map will be the default map file name\n"); \r
fprintf (stdout, " -g Guid, --capguid GuidValue\n\\r
- GuidValue is one specific capsule or fv vendor guid value.\n\\r
+ GuidValue is one specific capsule or fv file system guid value.\n\\r
+ Its format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n");\r
+ fprintf (stdout, " --FvnameGuid\n\\r
+ GuidValue is the Fv Name Guid value.\n\\r
Its format is xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx\n");\r
fprintf (stdout, " --capflag CapFlag\n\\r
Capsule Reset Flag can be PersistAcrossReset,\n\\r
//\r
// Set the default FvGuid\r
//\r
- memcpy (&mFvDataInfo.FvGuid, &mEfiFirmwareFileSystem2Guid, sizeof (EFI_GUID));\r
+ memcpy (&mFvDataInfo.FvFileSystemGuid, &mEfiFirmwareFileSystem2Guid, sizeof (EFI_GUID));\r
\r
//\r
// Parse command line\r
Error (NULL, 0, 1003, "Invalid option value", "%s = %s", EFI_GUID_STRING, argv[1]);\r
return EFI_ABORTED;\r
}\r
- memcpy (&mFvDataInfo.FvGuid, &mCapDataInfo.CapGuid, sizeof (EFI_GUID));\r
+ memcpy (&mFvDataInfo.FvFileSystemGuid, &mCapDataInfo.CapGuid, sizeof (EFI_GUID));\r
DebugMsg (NULL, 0, 9, "Capsule Guid", "%s = %s", EFI_CAPSULE_GUID_STRING, argv[1]);\r
- DebugMsg (NULL, 0, 9, "FV Guid", "%s = %s", EFI_FV_GUID_STRING, argv[1]);\r
+ DebugMsg (NULL, 0, 9, "FV Guid", "%s = %s", EFI_FV_FILESYSTEMGUID_STRING, argv[1]);\r
+ argc -= 2;\r
+ argv += 2;\r
+ continue; \r
+ }\r
+\r
+ if (stricmp (argv[0], "--FvnameGuid") == 0) {\r
+ //\r
+ // Get Fv Name Guid\r
+ //\r
+ Status = StringToGuid (argv[1], &mFvDataInfo.FvNameGuid);\r
+ if (EFI_ERROR (Status)) {\r
+ Error (NULL, 0, 1003, "Invalid option value", "%s = %s", EFI_GUID_STRING, argv[1]);\r
+ return EFI_ABORTED;\r
+ }\r
+ DebugMsg (NULL, 0, 9, "FV Name Guid", "%s = %s", EFI_FV_NAMEGUID_STRING, argv[1]);\r
argc -= 2;\r
argv += 2;\r
continue; \r
}\r
\r
//\r
- // Read the FV Guid\r
+ // Read the FV File System Guid\r
//\r
- Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_FV_GUID_STRING, 0, Value);\r
+ Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_FV_FILESYSTEMGUID_STRING, 0, Value);\r
if (Status == EFI_SUCCESS) {\r
//\r
// Get the guid value\r
//\r
- StringToGuid (Value, &FvInfo->FvGuid);\r
+ StringToGuid (Value, &FvInfo->FvFileSystemGuid);\r
+ }\r
+\r
+ //\r
+ // Read the FV Name Guid\r
+ //\r
+ Status = FindToken (InfFile, OPTIONS_SECTION_STRING, EFI_FV_NAMEGUID_STRING, 0, Value);\r
+ if (Status == EFI_SUCCESS) {\r
+ //\r
+ // Get the guid value\r
+ //\r
+ StringToGuid (Value, &FvInfo->FvNameGuid);\r
+ DebugMsg (NULL, 0, 9, "FV Name Guid", "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X", \r
+ FvInfo->FvNameGuid.Data1,\r
+ FvInfo->FvNameGuid.Data2,\r
+ FvInfo->FvNameGuid.Data3,\r
+ FvInfo->FvNameGuid.Data4[0],\r
+ FvInfo->FvNameGuid.Data4[1],\r
+ FvInfo->FvNameGuid.Data4[2],\r
+ FvInfo->FvNameGuid.Data4[3],\r
+ FvInfo->FvNameGuid.Data4[4],\r
+ FvInfo->FvNameGuid.Data4[5],\r
+ FvInfo->FvNameGuid.Data4[6],\r
+ FvInfo->FvNameGuid.Data4[7]);\r
}\r
- DebugMsg (NULL, 0, 9, "FV File Guid", "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X", \r
- FvInfo->FvGuid.Data1,\r
- FvInfo->FvGuid.Data2,\r
- FvInfo->FvGuid.Data3,\r
- FvInfo->FvGuid.Data4[0],\r
- FvInfo->FvGuid.Data4[1],\r
- FvInfo->FvGuid.Data4[2],\r
- FvInfo->FvGuid.Data4[3],\r
- FvInfo->FvGuid.Data4[4],\r
- FvInfo->FvGuid.Data4[5],\r
- FvInfo->FvGuid.Data4[6],\r
- FvInfo->FvGuid.Data4[7]);\r
\r
//\r
// Read the FV file name\r
EFI_STATUS\r
AddPadFile (\r
IN OUT MEMORY_FILE *FvImage,\r
- IN UINT32 DataAlignment\r
+ IN UINT32 DataAlignment,\r
+ IN EFI_FIRMWARE_VOLUME_EXT_HEADER *ExtHeader\r
)\r
/*++\r
\r
FvImage The memory image of the FV to add it to. The current offset\r
must be valid.\r
DataAlignment The data alignment of the next FFS file.\r
+ ExtHeader PI FvExtHeader Optional \r
\r
Returns:\r
\r
//\r
// Check if a pad file is necessary\r
//\r
- if (((UINTN) FvImage->CurrentFilePointer - (UINTN) FvImage->FileImage + sizeof (EFI_FFS_FILE_HEADER)) % DataAlignment == 0) {\r
+ if ((ExtHeader == NULL) && (((UINTN) FvImage->CurrentFilePointer - (UINTN) FvImage->FileImage + sizeof (EFI_FFS_FILE_HEADER)) % DataAlignment == 0)) {\r
return EFI_SUCCESS;\r
}\r
\r
//\r
// Verify that we have enough space for the file header\r
//\r
- if ((UINTN) (PadFile + sizeof (EFI_FFS_FILE_HEADER)) >= (UINTN) FvImage->Eof) {\r
- return EFI_OUT_OF_RESOURCES;\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
// This is the earliest possible valid offset (current plus pad file header\r
// plus the next file header)\r
//\r
- PadFileSize = (UINTN) FvImage->CurrentFilePointer - (UINTN) FvImage->FileImage + (sizeof (EFI_FFS_FILE_HEADER) * 2);\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
\r
//\r
// Add whatever it takes to get to the next aligned address\r
PadFile->IntegrityCheck.Checksum.File = 0;\r
PadFile->State = 0;\r
PadFile->IntegrityCheck.Checksum.Header = CalculateChecksum8 ((UINT8 *) PadFile, sizeof (EFI_FFS_FILE_HEADER));\r
- if (PadFile->Attributes & FFS_ATTRIB_CHECKSUM) {\r
- PadFile->IntegrityCheck.Checksum.File = CalculateChecksum8 ((UINT8 *) PadFile, PadFileSize);\r
- } else {\r
- PadFile->IntegrityCheck.Checksum.File = FFS_FIXED_CHECKSUM;\r
- }\r
+ PadFile->IntegrityCheck.Checksum.File = FFS_FIXED_CHECKSUM;\r
\r
PadFile->State = EFI_FILE_HEADER_CONSTRUCTION | EFI_FILE_HEADER_VALID | EFI_FILE_DATA_VALID;\r
UpdateFfsFileState (\r
(EFI_FFS_FILE_HEADER *) PadFile,\r
(EFI_FIRMWARE_VOLUME_HEADER *) FvImage->FileImage\r
);\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
\r
//\r
- // Verify that we have enough space (including the padding\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
// Add pad file if necessary\r
//\r
- Status = AddPadFile (FvImage, 1 << CurrentFileAlignment);\r
+ Status = AddPadFile (FvImage, 1 << CurrentFileAlignment, 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
PadFile->IntegrityCheck.Checksum.File = 0;\r
PadFile->State = 0;\r
PadFile->IntegrityCheck.Checksum.Header = CalculateChecksum8 ((UINT8 *) PadFile, sizeof (EFI_FFS_FILE_HEADER));\r
- if (PadFile->Attributes & FFS_ATTRIB_CHECKSUM) {\r
- PadFile->IntegrityCheck.Checksum.File = CalculateChecksum8 ((UINT8 *) PadFile, FileSize);\r
- } else {\r
- PadFile->IntegrityCheck.Checksum.File = FFS_FIXED_CHECKSUM;\r
- }\r
+ PadFile->IntegrityCheck.Checksum.File = FFS_FIXED_CHECKSUM;\r
\r
PadFile->State = EFI_FILE_HEADER_CONSTRUCTION | EFI_FILE_HEADER_VALID | EFI_FILE_DATA_VALID;\r
\r
FILE *FvFile;\r
CHAR8 FvMapName [_MAX_PATH];\r
FILE *FvMapFile;\r
+ EFI_FIRMWARE_VOLUME_EXT_HEADER FvExtHeader;\r
\r
FvBufferHeader = NULL;\r
FvFile = NULL;\r
Error (NULL, 0, 1001, "Missing required argument", "Block Size");\r
return EFI_ABORTED;\r
}\r
-\r
- if (CompareGuid (&mFvDataInfo.FvGuid, &mEfiFirmwareFileSystem2Guid) == 0) {\r
+ \r
+ //\r
+ // Debug message Fv File System Guid\r
+ //\r
+ DebugMsg (NULL, 0, 9, "FV File System Guid", "%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X", \r
+ mFvDataInfo.FvFileSystemGuid.Data1,\r
+ mFvDataInfo.FvFileSystemGuid.Data2,\r
+ mFvDataInfo.FvFileSystemGuid.Data3,\r
+ mFvDataInfo.FvFileSystemGuid.Data4[0],\r
+ mFvDataInfo.FvFileSystemGuid.Data4[1],\r
+ mFvDataInfo.FvFileSystemGuid.Data4[2],\r
+ mFvDataInfo.FvFileSystemGuid.Data4[3],\r
+ mFvDataInfo.FvFileSystemGuid.Data4[4],\r
+ mFvDataInfo.FvFileSystemGuid.Data4[5],\r
+ mFvDataInfo.FvFileSystemGuid.Data4[6],\r
+ mFvDataInfo.FvFileSystemGuid.Data4[7]);\r
+\r
+ if (CompareGuid (&mFvDataInfo.FvFileSystemGuid, &mEfiFirmwareFileSystem2Guid) == 0) {\r
mFvDataInfo.IsPiFvImage = TRUE;\r
- } \r
+ }\r
\r
//\r
// FvMap file to log the function address of all modules in one Fvimage\r
memset (FvHeader->ZeroVector, 0, 16);\r
\r
//\r
- // Copy the FFS GUID\r
+ // Copy the Fv file system GUID\r
//\r
- memcpy (&FvHeader->FileSystemGuid, &mFvDataInfo.FvGuid, sizeof (EFI_GUID));\r
+ memcpy (&FvHeader->FileSystemGuid, &mFvDataInfo.FvFileSystemGuid, sizeof (EFI_GUID));\r
\r
FvHeader->FvLength = FvImageSize;\r
FvHeader->Signature = EFI_FVH_SIGNATURE;\r
fprintf (FvMapFile, " = 0x%x\n\n", mFvTotalSize - mFvTakenSize);\r
}\r
\r
+ //\r
+ // Set PI FV extension header\r
+ //\r
+ if (CompareGuid (&mFvDataInfo.FvNameGuid, &mZeroGuid) != 0) {\r
+ memcpy (&FvExtHeader.FvName, &mFvDataInfo.FvNameGuid, sizeof (EFI_GUID));\r
+ FvExtHeader.ExtHeaderSize = sizeof (EFI_FIRMWARE_VOLUME_EXT_HEADER);\r
+ AddPadFile (&FvImageMemoryFile, 8, &FvExtHeader);\r
+ //\r
+ // Fv Extension header change update Fv Header Check sum\r
+ //\r
+ FvHeader->Checksum = 0;\r
+ FvHeader->Checksum = CalculateChecksum16 ((UINT16 *) FvHeader, FvHeader->HeaderLength / sizeof (UINT16));\r
+ }\r
+\r
//\r
// Add files to FV\r
//\r
break;\r
}\r
}\r
+ \r
+ //\r
+ // Calculate PI extension header\r
+ //\r
+ if (CompareGuid (&mFvDataInfo.FvNameGuid, &mZeroGuid) != 0) {\r
+ CurrentOffset += sizeof (EFI_FFS_FILE_HEADER) + sizeof (EFI_FIRMWARE_VOLUME_EXT_HEADER);\r
+ CurrentOffset = (CurrentOffset + 7) & (~7);\r
+ }\r
\r
//\r
// Accumlate every FFS file size.\r