ReCaculate the checksum after fixing up AP section for Sec module.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2260 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
klu2 2007-01-17 08:07:41 +00:00
parent daa7a3eb47
commit 9fc9e7e0f4
1 changed files with 171 additions and 12 deletions

View File

@ -171,6 +171,141 @@ Returns:
} }
VOID
SetHeaderChecksum (
IN EFI_FFS_FILE_HEADER *FfsHeader
)
/*++
Routine Description:
Caculate the checksum for the FFS header.
Parameters:
FfsHeader - FFS File Header which needs to caculate the checksum
Return:
N/A
--*/
{
EFI_FFS_FILE_STATE State;
UINT8 HeaderChecksum;
UINT8 FileChecksum;
//
// The state and the File checksum are not included
//
State = FfsHeader->State;
FfsHeader->State = 0;
FileChecksum = FfsHeader->IntegrityCheck.Checksum.File;
FfsHeader->IntegrityCheck.Checksum.File = 0;
FfsHeader->IntegrityCheck.Checksum.Header = 0;
HeaderChecksum = CalculateChecksum8 ((UINT8 *)FfsHeader,sizeof (EFI_FFS_FILE_HEADER));
FfsHeader->IntegrityCheck.Checksum.Header = (UINT8) (~(0x100-HeaderChecksum) + 1);
FfsHeader->State = State;
FfsHeader->IntegrityCheck.Checksum.File = FileChecksum;
return ;
}
VOID
SetFileChecksum (
IN EFI_FFS_FILE_HEADER *FfsHeader,
IN UINTN ActualFileSize
)
/*++
Routine Description:
Caculate the checksum for the FFS File, usually it is caculated before
the file tail is set.
Parameters:
FfsHeader - FFS File Header which needs to caculate the checksum
ActualFileSize - The whole Ffs File Length, including the FFS Tail
if exists, but at this time, it is 0.
Return:
N/A
--*/
{
EFI_FFS_FILE_STATE State;
UINT8 FileChecksum;
UINTN ActualSize;
if (FfsHeader->Attributes & FFS_ATTRIB_CHECKSUM) {
//
// The file state is not included
//
State = FfsHeader->State;
FfsHeader->State = 0;
FfsHeader->IntegrityCheck.Checksum.File = 0;
if (FfsHeader->Attributes & FFS_ATTRIB_TAIL_PRESENT) {
ActualSize = ActualFileSize - 2;
} else {
ActualSize = ActualFileSize;
}
//
// File checksum does not including the file tail
//
FileChecksum = CalculateChecksum8 ((UINT8 *)FfsHeader,sizeof (EFI_FFS_FILE_HEADER));
FfsHeader->IntegrityCheck.Checksum.File = (UINT8) (~(0x100-FileChecksum) + 1);
FfsHeader->State = State;
} else {
FfsHeader->IntegrityCheck.Checksum.File = FFS_FIXED_CHECKSUM;
}
return ;
}
VOID
SetFileTail (
IN EFI_FFS_FILE_HEADER *FfsHeader,
IN UINTN ActualFileSize
)
/*++
Routine Description:
Set the file tail if needed
Parameters:
FfsHeader - FFS File Header which needs to caculate the checksum
ActualFileSize - The whole Ffs File Length, including the FFS Tail
if exists.
Return:
N/A
--*/
{
UINT8 TailLow;
UINT8 TailHigh;
UINT16 Tail;
if (FfsHeader->Attributes & FFS_ATTRIB_TAIL_PRESENT) {
//
// Insert tail here, since tail may not aligned on an even
// address, we need to do byte operation here.
//
Tail = (UINT16)~FfsHeader->IntegrityCheck.TailReference;
TailLow = (UINT8) Tail;
TailHigh = (UINT8) (Tail >> 8);
*((UINT8 *) FfsHeader + ActualFileSize - 2) = TailLow;
*((UINT8 *) FfsHeader + ActualFileSize - 1) = TailHigh;
}
return ;
}
STATUS STATUS
main ( main (
@ -210,6 +345,7 @@ Returns:
UINT32 TempResult; UINT32 TempResult;
UINT32 Index; UINT32 Index;
UINT32 IpiVector; UINT32 IpiVector;
STATUS Status;
TempGuid = NULL; TempGuid = NULL;
SetUtilityName (UTILITY_NAME); SetUtilityName (UTILITY_NAME);
@ -271,10 +407,17 @@ Returns:
fclose (FpIn); fclose (FpIn);
return STATUS_ERROR; return STATUS_ERROR;
} }
//
// Prepare to walk the FV image
//
InitializeFvLib (FileBuffer, FvrecoveryFileSize);
// //
// Close the input Fvrecovery.fv file // Close the input Fvrecovery.fv file
// //
fclose (FpIn); fclose (FpIn);
// //
// Find the pad FFS file // Find the pad FFS file
// //
@ -323,7 +466,8 @@ Returns:
Error (NULL, 0, 0, "The position to place Ap reset vector is not in E and F segment!", NULL); Error (NULL, 0, 0, "The position to place Ap reset vector is not in E and F segment!", NULL);
free ((VOID *)FileBufferRaw); free ((VOID *)FileBufferRaw);
return STATUS_ERROR; return STATUS_ERROR;
} }
// //
// Fix up Ap reset vector and calculate the IPI vector // Fix up Ap reset vector and calculate the IPI vector
// //
@ -333,10 +477,33 @@ Returns:
TempResult = 0x0FFFFFFFF - ((UINT32)FvHeader + (UINT32)FvLength - 1 - (UINT32)FixPoint); TempResult = 0x0FFFFFFFF - ((UINT32)FvHeader + (UINT32)FvLength - 1 - (UINT32)FixPoint);
TempResult >>= 12; TempResult >>= 12;
IpiVector = TempResult & 0x0FF; IpiVector = TempResult & 0x0FF;
//
// Update Pad file and checksum
//
UpdatePadFileGuid (FvHeader, FileHeader, FileLength, TempGuid); UpdatePadFileGuid (FvHeader, FileHeader, FileLength, TempGuid);
//
// Get FileHeader of SEC Ffs
//
Status = GetFileByType (EFI_FV_FILETYPE_SECURITY_CORE, 1, &FileHeader);
//
// Write IPI Vector at Offset FvrecoveryFileSize - 8
//
*(UINT32 *)((UINTN)(FileBuffer + FvrecoveryFileSize - 8)) = IpiVector;
if (Status == STATUS_SUCCESS) {
FileLength = (*(UINT32 *)(FileHeader->Size)) & 0x00FFFFFF;
//
// Update the Checksum of SEC ffs
//
SetHeaderChecksum (FileHeader);
SetFileChecksum (FileHeader, FileLength);
SetFileTail (FileHeader, FileLength);
} else {
Error (NULL, 0, 0, "Do not get SEC FFS File Header!", NULL);
}
// //
// Open the output Fvrecovery.fv file // Open the output Fvrecovery.fv file
// //
@ -353,15 +520,7 @@ Returns:
free ((VOID *)FileBufferRaw); free ((VOID *)FileBufferRaw);
return STATUS_ERROR; return STATUS_ERROR;
} }
//
//
//
fseek (FpOut, -8, SEEK_END);
if ((fwrite (&IpiVector, 1, sizeof(UINT32), FpOut)) != sizeof(UINT32)) {
Error (NULL, 0, 0, "Write output file error!", NULL);
free ((VOID *)FileBufferRaw);
return STATUS_ERROR;
}
// //
// Close the output Fvrecovery.fv file // Close the output Fvrecovery.fv file
// //