)\r
{\r
EFI_FFS_FILE_STATE FileState;\r
+ UINT8 DataCheckSum;\r
+ UINT32 FileLength;\r
\r
FileState = GetFileState (ErasePolarity, FfsHeader);\r
switch (FileState) {\r
case EFI_FILE_DELETED:\r
case EFI_FILE_DATA_VALID:\r
case EFI_FILE_MARKED_FOR_UPDATE:\r
- //\r
- // Some other vliadation like file content checksum might be done here.\r
- // For performance issue, Tiano only do FileState check.\r
- //\r
- return TRUE;\r
+ DataCheckSum = FFS_FIXED_CHECKSUM;\r
+ FileLength = *(UINT32 *)(FfsHeader->Size) & 0x00FFFFFF;\r
+ if ((FfsHeader->Attributes & FFS_ATTRIB_CHECKSUM) == FFS_ATTRIB_CHECKSUM) {\r
+ DataCheckSum = CalculateCheckSum8 ((CONST UINT8 *)FfsHeader + sizeof(EFI_FFS_FILE_HEADER), FileLength - sizeof(EFI_FFS_FILE_HEADER));\r
+ }\r
+ if (FfsHeader->IntegrityCheck.Checksum.File == DataCheckSum) {\r
+ return TRUE;\r
+ }\r
\r
default:\r
return FALSE;\r
UINT64 FvLength;\r
UINT8 ErasePolarity;\r
UINT8 FileState;\r
+ UINT8 DataCheckSum;\r
\r
//\r
// Convert the handle of FV to FV header for memory-mapped firmware volume\r
FileLength = *(UINT32 *)(FfsFileHeader->Size) & 0x00FFFFFF;\r
FileOccupiedSize = GET_OCCUPIED_SIZE(FileLength, 8);\r
\r
+ DataCheckSum = FFS_FIXED_CHECKSUM;\r
+ if ((FfsFileHeader->Attributes & FFS_ATTRIB_CHECKSUM) == FFS_ATTRIB_CHECKSUM) {\r
+ DataCheckSum = CalculateCheckSum8 ((CONST UINT8 *)FfsFileHeader + sizeof(EFI_FFS_FILE_HEADER), FileLength - sizeof(EFI_FFS_FILE_HEADER));\r
+ }\r
+ if (FfsFileHeader->IntegrityCheck.Checksum.File != DataCheckSum) {\r
+ ASSERT (FALSE);\r
+ *FileHeader = NULL;\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
if (FileName != NULL) {\r
if (CompareGuid (&FfsFileHeader->Name, (EFI_GUID*)FileName)) {\r
*FileHeader = FfsFileHeader;\r