mirror of https://github.com/acidanthera/audk.git
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:
parent
daa7a3eb47
commit
9fc9e7e0f4
|
@ -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
|
||||||
//
|
//
|
||||||
|
|
Loading…
Reference in New Issue