/** @file\r
FFS file access utilities.\r
\r
-Copyright (c) 2006 - 2008, Intel Corporation. <BR>\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
\r
-#include <DxeMain.h>\r
-\r
-#define PHYSICAL_ADDRESS_TO_POINTER(Address) ((VOID *)((UINTN)(Address)))\r
+#include "DxeMain.h"\r
+#include "FwVolDriver.h"\r
\r
\r
/**\r
Get the FFS file state by checking the highest bit set in the header's state field.\r
\r
- @param ErasePolarity Erase polarity attribute of the firmware volume \r
- @param FfsHeader Points to the FFS file header \r
+ @param ErasePolarity Erase polarity attribute of the firmware volume\r
+ @param FfsHeader Points to the FFS file header\r
\r
@return FFS File state\r
\r
HighestBit >>= 1;\r
}\r
\r
- return (EFI_FFS_FILE_STATE)HighestBit;\r
+ return (EFI_FFS_FILE_STATE) HighestBit;\r
}\r
\r
\r
/**\r
Check if a block of buffer is erased.\r
\r
- @param ErasePolarity Erase polarity attribute of the firmware volume \r
- @param InBuffer The buffer to be checked \r
- @param BufferSize Size of the buffer in bytes \r
+ @param ErasePolarity Erase polarity attribute of the firmware volume\r
+ @param InBuffer The buffer to be checked\r
+ @param BufferSize Size of the buffer in bytes\r
\r
- @retval TRUE The block of buffer is erased \r
+ @retval TRUE The block of buffer is erased\r
@retval FALSE The block of buffer is not erased\r
\r
**/\r
/**\r
Verify checksum of the firmware volume header.\r
\r
- @param FvHeader Points to the firmware volume header to be checked \r
+ @param FvHeader Points to the firmware volume header to be checked\r
\r
- @retval TRUE Checksum verification passed \r
+ @retval TRUE Checksum verification passed\r
@retval FALSE Checksum verification failed\r
\r
**/\r
IN EFI_FIRMWARE_VOLUME_HEADER *FvHeader\r
)\r
{\r
- UINT32 Index;\r
- UINT32 HeaderLength;\r
UINT16 Checksum;\r
- UINT16 *Ptr;\r
\r
- HeaderLength = FvHeader->HeaderLength;\r
- Ptr = (UINT16 *)FvHeader;\r
- Checksum = 0;\r
-\r
- for (Index = 0; Index < HeaderLength / sizeof (UINT16); Index++) {\r
- Checksum = (UINT16)(Checksum + Ptr[Index]);\r
- }\r
+ Checksum = CalculateSum16 ((UINT16 *) FvHeader, FvHeader->HeaderLength);\r
\r
if (Checksum == 0) {\r
return TRUE;\r
/**\r
Verify checksum of the FFS file header.\r
\r
- @param FfsHeader Points to the FFS file header to be checked \r
+ @param FfsHeader Points to the FFS file header to be checked\r
\r
- @retval TRUE Checksum verification passed \r
+ @retval TRUE Checksum verification passed\r
@retval FALSE Checksum verification failed\r
\r
**/\r
IN EFI_FFS_FILE_HEADER *FfsHeader\r
)\r
{\r
- UINT32 Index;\r
- UINT8 *Ptr;\r
- UINT8 HeaderChecksum;\r
-\r
- Ptr = (UINT8 *)FfsHeader;\r
- HeaderChecksum = 0;\r
- for (Index = 0; Index < sizeof(EFI_FFS_FILE_HEADER); Index++) {\r
- HeaderChecksum = (UINT8)(HeaderChecksum + Ptr[Index]);\r
- }\r
+ UINT8 HeaderChecksum;\r
\r
+ if (IS_FFS_FILE2 (FfsHeader)) {\r
+ HeaderChecksum = CalculateSum8 ((UINT8 *) FfsHeader, sizeof (EFI_FFS_FILE_HEADER2));\r
+ } else {\r
+ HeaderChecksum = CalculateSum8 ((UINT8 *) FfsHeader, sizeof (EFI_FFS_FILE_HEADER));\r
+ }\r
HeaderChecksum = (UINT8) (HeaderChecksum - FfsHeader->State - FfsHeader->IntegrityCheck.Checksum.File);\r
\r
if (HeaderChecksum == 0) {\r
/**\r
Check if it's a valid FFS file header.\r
\r
- @param ErasePolarity Erase polarity attribute of the firmware volume \r
- @param FfsHeader Points to the FFS file header to be checked \r
- @param FileState FFS file state to be returned \r
+ @param ErasePolarity Erase polarity attribute of the firmware volume\r
+ @param FfsHeader Points to the FFS file header to be checked\r
+ @param FileState FFS file state to be returned\r
\r
- @retval TRUE Valid FFS file header \r
+ @retval TRUE Valid FFS file header\r
@retval FALSE Invalid FFS file header\r
\r
**/\r
*FileState = GetFileState (ErasePolarity, FfsHeader);\r
\r
switch (*FileState) {\r
- case EFI_FILE_HEADER_VALID:\r
- case EFI_FILE_DATA_VALID:\r
- case EFI_FILE_MARKED_FOR_UPDATE:\r
- case EFI_FILE_DELETED:\r
- //\r
- // Here we need to verify header checksum\r
- //\r
- return VerifyHeaderChecksum (FfsHeader);\r
- \r
- case EFI_FILE_HEADER_CONSTRUCTION:\r
- case EFI_FILE_HEADER_INVALID:\r
- default:\r
- return FALSE;\r
+ case EFI_FILE_HEADER_VALID:\r
+ case EFI_FILE_DATA_VALID:\r
+ case EFI_FILE_MARKED_FOR_UPDATE:\r
+ case EFI_FILE_DELETED:\r
+ //\r
+ // Here we need to verify header checksum\r
+ //\r
+ return VerifyHeaderChecksum (FfsHeader);\r
+\r
+ case EFI_FILE_HEADER_CONSTRUCTION:\r
+ case EFI_FILE_HEADER_INVALID:\r
+ default:\r
+ return FALSE;\r
}\r
}\r
\r
\r
-\r
/**\r
Check if it's a valid FFS file.\r
Here we are sure that it has a valid FFS file header since we must call IsValidFfsHeader() first.\r
\r
- @param ErasePolarity Erase polarity attribute of the firmware volume \r
- @param FfsHeader Points to the FFS file to be checked \r
+ @param ErasePolarity Erase polarity attribute of the firmware volume\r
+ @param FfsHeader Points to the FFS file to be checked\r
\r
- @retval TRUE Valid FFS file \r
+ @retval TRUE Valid FFS file\r
@retval FALSE Invalid FFS file\r
\r
**/\r
)\r
{\r
EFI_FFS_FILE_STATE FileState;\r
+ UINT8 DataCheckSum;\r
\r
FileState = GetFileState (ErasePolarity, FfsHeader);\r
switch (FileState) {\r
\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
+ case EFI_FILE_DELETED:\r
+ case EFI_FILE_DATA_VALID:\r
+ case EFI_FILE_MARKED_FOR_UPDATE:\r
+ DataCheckSum = FFS_FIXED_CHECKSUM;\r
+ if ((FfsHeader->Attributes & FFS_ATTRIB_CHECKSUM) == FFS_ATTRIB_CHECKSUM) {\r
+ if (IS_FFS_FILE2 (FfsHeader)) {\r
+ DataCheckSum = CalculateCheckSum8 ((CONST UINT8 *) FfsHeader + sizeof (EFI_FFS_FILE_HEADER2), FFS_FILE2_SIZE (FfsHeader) - sizeof(EFI_FFS_FILE_HEADER2));\r
+ } else {\r
+ DataCheckSum = CalculateCheckSum8 ((CONST UINT8 *) FfsHeader + sizeof (EFI_FFS_FILE_HEADER), FFS_FILE_SIZE (FfsHeader) - sizeof(EFI_FFS_FILE_HEADER));\r
+ }\r
+ }\r
+ if (FfsHeader->IntegrityCheck.Checksum.File == DataCheckSum) {\r
return TRUE;\r
+ }\r
\r
- default:\r
- return FALSE;\r
+ default:\r
+ return FALSE;\r
}\r
}\r
\r