]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Dxe/FwVol/Ffs.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Core / Dxe / FwVol / Ffs.c
index 7673352bbadb0643203415cee643bf16b93ff796..199c7f821b874b724139300e924a2dca08bc9847 100644 (file)
@@ -1,28 +1,21 @@
 /** @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
@@ -47,7 +40,7 @@ GetFileState (
     HighestBit >>= 1;\r
   }\r
 \r
-  return (EFI_FFS_FILE_STATE)HighestBit;\r
+  return (EFI_FFS_FILE_STATE) HighestBit;\r
 }\r
 \r
 \r
@@ -55,11 +48,11 @@ GetFileState (
 /**\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
@@ -95,9 +88,9 @@ IsBufferErased (
 /**\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
@@ -106,18 +99,9 @@ VerifyFvHeaderChecksum (
   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
@@ -130,9 +114,9 @@ VerifyFvHeaderChecksum (
 /**\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
@@ -141,16 +125,13 @@ VerifyHeaderChecksum (
   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
@@ -165,11 +146,11 @@ VerifyHeaderChecksum (
 /**\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
@@ -183,32 +164,31 @@ IsValidFfsHeader (
   *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
@@ -219,21 +199,28 @@ IsValidFfsFile (
   )\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