}\r
\r
//\r
- // Read the FV Name Guid\r
+ // Read the FV Extension Header File Name\r
//\r
- if (!FvInfo->FvNameGuidSet) {\r
- Status = FindToken (InfFile, ATTRIBUTES_SECTION_STRING, EFI_FV_NAMEGUID_STRING, 0, Value);\r
- if (Status == EFI_SUCCESS) {\r
- //\r
- // Get the guid value\r
- //\r
- Status = StringToGuid (Value, &GuidValue);\r
- if (EFI_ERROR (Status)) {\r
- Error (NULL, 0, 2000, "Invalid parameter", "%s = %s", EFI_FV_NAMEGUID_STRING, Value);\r
- return EFI_ABORTED;\r
- }\r
- memcpy (&FvInfo->FvNameGuid, &GuidValue, sizeof (EFI_GUID));\r
- FvInfo->FvNameGuidSet = TRUE;\r
- }\r
+ Status = FindToken (InfFile, ATTRIBUTES_SECTION_STRING, EFI_FV_EXT_HEADER_FILE_NAME, 0, Value);\r
+ if (Status == EFI_SUCCESS) {\r
+ strcpy (FvInfo->FvExtHeaderFile, Value);\r
}\r
\r
//\r
EFI_FFS_FILE_STATE SavedState;\r
UINT64 FitAddress;\r
FIT_TABLE *FitTablePtr;\r
+ BOOLEAN Vtf0Detected;\r
\r
//\r
// Verify input parameters\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
+ if (\r
+ (((UINTN)FvImage->Eof - (UINTN)FvImage->FileImage) >=\r
+ IA32_X64_VTF_SIGNATURE_OFFSET) &&\r
+ (*(UINT32 *)(VOID*)((UINTN) FvImage->Eof -\r
+ IA32_X64_VTF_SIGNATURE_OFFSET) ==\r
+ IA32_X64_VTF0_SIGNATURE)\r
+ ) {\r
+ Vtf0Detected = TRUE;\r
+ } else {\r
+ Vtf0Detected = FALSE;\r
+ }\r
+\r
//\r
// Find the Sec Core\r
//\r
Status = GetFileByType (EFI_FV_FILETYPE_SECURITY_CORE, 1, &SecCoreFile);\r
if (EFI_ERROR (Status) || SecCoreFile == NULL) {\r
+ if (Vtf0Detected) {\r
+ //\r
+ // If the SEC core file is not found, but the VTF-0 signature\r
+ // is found, we'll treat it as a VTF-0 'Volume Top File'.\r
+ // This means no modifications are required to the VTF.\r
+ //\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
Error (NULL, 0, 3000, "Invalid", "could not find the SEC core file in the FV.");\r
return EFI_ABORTED;\r
}\r
return EFI_ABORTED;\r
} \r
\r
+ if (\r
+ Vtf0Detected &&\r
+ (MachineType == EFI_IMAGE_MACHINE_IA32 ||\r
+ MachineType == EFI_IMAGE_MACHINE_X64)\r
+ ) {\r
+ //\r
+ // If the SEC core code is IA32 or X64 and the VTF-0 signature\r
+ // is found, we'll treat it as a VTF-0 'Volume Top File'.\r
+ // This means no modifications are required to the VTF.\r
+ //\r
+ return EFI_SUCCESS;\r
+ }\r
+\r
//\r
// Physical address is FV base + offset of PE32 + offset of the entry point\r
//\r
SecCoreEntryAddressPtr = (EFI_PHYSICAL_ADDRESS *) ((UINTN) FvImage->Eof - IPF_SALE_ENTRY_ADDRESS_OFFSET);\r
*SecCoreEntryAddressPtr = SecCorePhysicalAddress;\r
\r
- } else if (\r
- (MachineType == EFI_IMAGE_MACHINE_IA32 ||\r
- MachineType == EFI_IMAGE_MACHINE_X64) &&\r
- (((UINTN)FvImage->Eof - (UINTN)FvImage->FileImage) >= IA32_X64_VTF_SIGNATURE_OFFSET) &&\r
- (*(UINT32 *)(VOID*)((UINTN) FvImage->Eof - IA32_X64_VTF_SIGNATURE_OFFSET) ==\r
- IA32_X64_VTF0_SIGNATURE)\r
- ) {\r
- //\r
- // If VTF-0 signature is found, then no modifications are needed.\r
- //\r
} else if (MachineType == EFI_IMAGE_MACHINE_IA32 || MachineType == EFI_IMAGE_MACHINE_X64) {\r
//\r
// Get the location to update\r
VtfFile->State = 0;\r
if (VtfFile->Attributes & FFS_ATTRIB_CHECKSUM) {\r
VtfFile->IntegrityCheck.Checksum.File = CalculateChecksum8 (\r
- (UINT8 *) VtfFile,\r
- GetLength (VtfFile->Size)\r
+ (UINT8 *) (VtfFile + 1),\r
+ GetLength (VtfFile->Size) - sizeof (EFI_FFS_FILE_HEADER)\r
);\r
} else {\r
VtfFile->IntegrityCheck.Checksum.File = FFS_FIXED_CHECKSUM;\r
\r
--*/\r
{\r
- EFI_STATUS Status;\r
- MEMORY_FILE InfMemoryFile;\r
- MEMORY_FILE FvImageMemoryFile;\r
- UINTN Index;\r
- EFI_FIRMWARE_VOLUME_HEADER *FvHeader;\r
- EFI_FFS_FILE_HEADER *VtfFileImage;\r
- UINT8 *FvBufferHeader; // to make sure fvimage header 8 type alignment.\r
- UINT8 *FvImage;\r
- UINTN FvImageSize;\r
- FILE *FvFile;\r
- CHAR8 FvMapName [_MAX_PATH];\r
- FILE *FvMapFile;\r
- EFI_FIRMWARE_VOLUME_EXT_HEADER FvExtHeader;\r
+ EFI_STATUS Status;\r
+ MEMORY_FILE InfMemoryFile;\r
+ MEMORY_FILE FvImageMemoryFile;\r
+ UINTN Index;\r
+ EFI_FIRMWARE_VOLUME_HEADER *FvHeader;\r
+ EFI_FFS_FILE_HEADER *VtfFileImage;\r
+ UINT8 *FvBufferHeader; // to make sure fvimage header 8 type alignment.\r
+ UINT8 *FvImage;\r
+ UINTN FvImageSize;\r
+ FILE *FvFile;\r
+ CHAR8 FvMapName [_MAX_PATH];\r
+ FILE *FvMapFile;\r
+ EFI_FIRMWARE_VOLUME_EXT_HEADER *FvExtHeader;\r
+ FILE *FvExtHeaderFile;\r
+ UINTN FileSize;\r
\r
FvBufferHeader = NULL;\r
FvFile = NULL;\r
mFvDataInfo.FvFileSystemGuid.Data4[6],\r
mFvDataInfo.FvFileSystemGuid.Data4[7]);\r
}\r
+\r
+ //\r
+ // Add PI FV extension header\r
+ //\r
+ FvExtHeader = NULL;\r
+ FvExtHeaderFile = NULL;\r
+ if (mFvDataInfo.FvExtHeaderFile[0] != 0) {\r
+ //\r
+ // Open the FV Extension Header file\r
+ //\r
+ FvExtHeaderFile = fopen (mFvDataInfo.FvExtHeaderFile, "rb");\r
+\r
+ //\r
+ // Get the file size\r
+ //\r
+ FileSize = _filelength (fileno (FvExtHeaderFile));\r
+\r
+ //\r
+ // Allocate a buffer for the FV Extension Header\r
+ //\r
+ FvExtHeader = malloc(FileSize);\r
+ if (FvExtHeader == NULL) {\r
+ fclose (FvExtHeaderFile);\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ //\r
+ // Read the FV Extension Header\r
+ //\r
+ fread (FvExtHeader, sizeof (UINT8), FileSize, FvExtHeaderFile);\r
+ fclose (FvExtHeaderFile);\r
+\r
+ //\r
+ // See if there is an override for the FV Name GUID\r
+ //\r
+ if (mFvDataInfo.FvNameGuidSet) {\r
+ memcpy (&FvExtHeader->FvName, &mFvDataInfo.FvNameGuid, sizeof (EFI_GUID));\r
+ }\r
+ memcpy (&mFvDataInfo.FvNameGuid, &FvExtHeader->FvName, sizeof (EFI_GUID));\r
+ mFvDataInfo.FvNameGuidSet = TRUE;\r
+ } else if (mFvDataInfo.FvNameGuidSet) {\r
+ //\r
+ // Allocate a buffer for the FV Extension Header\r
+ //\r
+ FvExtHeader = malloc(sizeof (EFI_FIRMWARE_VOLUME_EXT_HEADER));\r
+ if (FvExtHeader == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ memcpy (&FvExtHeader->FvName, &mFvDataInfo.FvNameGuid, sizeof (EFI_GUID));\r
+ FvExtHeader->ExtHeaderSize = sizeof (EFI_FIRMWARE_VOLUME_EXT_HEADER);\r
+ }\r
+\r
//\r
// Debug message Fv Name Guid\r
//\r
}\r
\r
//\r
- // Set PI FV extension header\r
+ // Add PI FV extension header\r
//\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, 4, VtfFileImage, &FvExtHeader);\r
+ if (FvExtHeader != NULL) {\r
+ //\r
+ // Add FV Extended Header contents to the FV as a PAD file\r
+ //\r
+ AddPadFile (&FvImageMemoryFile, 4, VtfFileImage, FvExtHeader);\r
+\r
//\r
// Fv Extension header change update Fv Header Check sum\r
//\r
if (FvBufferHeader != NULL) {\r
free (FvBufferHeader);\r
}\r
+\r
+ if (FvExtHeader != NULL) {\r
+ free (FvExtHeader);\r
+ }\r
\r
if (FvFile != NULL) {\r
fclose (FvFile);\r
UINTN Index;\r
FILE *fpin;\r
UINTN FfsFileSize;\r
+ UINTN FvExtendHeaderSize;\r
UINT32 FfsAlignment;\r
EFI_FFS_FILE_HEADER FfsHeader;\r
BOOLEAN VtfFileFlag;\r
UINTN VtfFileSize;\r
\r
+ FvExtendHeaderSize = 0;\r
VtfFileSize = 0;\r
VtfFileFlag = FALSE;\r
fpin = NULL;\r
//\r
// Calculate PI extension header\r
//\r
- if (CompareGuid (&mFvDataInfo.FvNameGuid, &mZeroGuid) != 0) {\r
+ if (mFvDataInfo.FvExtHeaderFile[0] != '\0') {\r
+ fpin = fopen (mFvDataInfo.FvExtHeaderFile, "rb");\r
+ if (fpin == NULL) {\r
+ Error (NULL, 0, 0001, "Error opening file", mFvDataInfo.FvExtHeaderFile);\r
+ return EFI_ABORTED;\r
+ }\r
+ FvExtendHeaderSize = _filelength (fileno (fpin));\r
+ fclose (fpin);\r
+ CurrentOffset += sizeof (EFI_FFS_FILE_HEADER) + FvExtendHeaderSize;\r
+ CurrentOffset = (CurrentOffset + 7) & (~7);\r
+ } else if (mFvDataInfo.FvNameGuidSet) {\r
CurrentOffset += sizeof (EFI_FFS_FILE_HEADER) + sizeof (EFI_FIRMWARE_VOLUME_EXT_HEADER);\r
CurrentOffset = (CurrentOffset + 7) & (~7);\r
}\r
SavedState = FfsFile->State;\r
FfsFile->IntegrityCheck.Checksum.File = 0;\r
FfsFile->State = 0;\r
- if (FfsFile->Attributes & FFS_ATTRIB_CHECKSUM) {\r
- FfsFile->IntegrityCheck.Checksum.File = CalculateChecksum8 (\r
- (UINT8 *) FfsFile,\r
- GetLength (FfsFile->Size)\r
- );\r
- } else {\r
- FfsFile->IntegrityCheck.Checksum.File = FFS_FIXED_CHECKSUM;\r
- }\r
-\r
+ FfsFile->IntegrityCheck.Checksum.File = CalculateChecksum8 (\r
+ (UINT8 *) (FfsFile + 1),\r
+ GetLength (FfsFile->Size) - sizeof (EFI_FFS_FILE_HEADER)\r
+ );\r
FfsFile->State = SavedState;\r
}\r
\r
SavedState = FfsFile->State;\r
FfsFile->IntegrityCheck.Checksum.File = 0;\r
FfsFile->State = 0;\r
- if (FfsFile->Attributes & FFS_ATTRIB_CHECKSUM) {\r
- FfsFile->IntegrityCheck.Checksum.File = CalculateChecksum8 (\r
- (UINT8 *) FfsFile,\r
- GetLength (FfsFile->Size)\r
- );\r
- } else {\r
- FfsFile->IntegrityCheck.Checksum.File = FFS_FIXED_CHECKSUM;\r
- }\r
-\r
+ FfsFile->IntegrityCheck.Checksum.File = CalculateChecksum8 (\r
+ (UINT8 *)(FfsFile + 1),\r
+ GetLength (FfsFile->Size) - sizeof (EFI_FFS_FILE_HEADER)\r
+ );\r
FfsFile->State = SavedState;\r
}\r
//\r