]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Dxe/FwVol/FwVol.c
MdeModulePkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / MdeModulePkg / Core / Dxe / FwVol / FwVol.c
index fe12d6e0ac30572a50149a7decb0e465536c0de6..e2f58c4d82a81a770c493d2e9f5bec65692b47d6 100644 (file)
@@ -3,14 +3,8 @@
   Layers on top of Firmware Block protocol to produce a file abstraction\r
   of FV based files.\r
 \r
-Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>\r
-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 - 2019, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -34,8 +28,8 @@ FV_DEVICE mFvDevice = {
     FvReadFile,\r
     FvReadFileSection,\r
     FvWriteFile,\r
-    FvGetNextFile,   \r
-       sizeof (UINTN),\r
+    FvGetNextFile,\r
+  sizeof (UINTN),\r
     NULL,\r
     FvGetVolumeInfo,\r
     FvSetVolumeInfo\r
@@ -56,7 +50,7 @@ FV_DEVICE mFvDevice = {
 // FFS helper functions\r
 //\r
 /**\r
-  Read data from Firmware Block by FVB protocol Read. \r
+  Read data from Firmware Block by FVB protocol Read.\r
   The data may cross the multi block ranges.\r
 \r
   @param  Fvb                   The FW_VOL_BLOCK_PROTOCOL instance from which to read data.\r
@@ -86,7 +80,7 @@ ReadFvbData (
   UINTN                       BlockIndex;\r
   UINTN                       ReadDataSize;\r
   EFI_STATUS                  Status;\r
-  \r
+\r
   //\r
   // Try read data in current block\r
   //\r
@@ -102,7 +96,7 @@ ReadFvbData (
     //\r
     return Status;\r
   }\r
-  \r
+\r
   //\r
   // Data crosses the blocks, read data from next block\r
   //\r
@@ -118,7 +112,7 @@ ReadFvbData (
     //\r
     // Read data from the crossing blocks\r
     //\r
-    BlockIndex = 0; \r
+    BlockIndex = 0;\r
     while (BlockIndex < NumberOfBlocks && DataSize >= BlockSize) {\r
       Status = Fvb->Read (Fvb, *StartLba + BlockIndex, 0, &BlockSize, Data);\r
       if (EFI_ERROR (Status)) {\r
@@ -128,20 +122,20 @@ ReadFvbData (
       DataSize -= BlockSize;\r
       BlockIndex ++;\r
     }\r
-    \r
+\r
     //\r
     // Data doesn't exceed the current block range.\r
     //\r
     if (DataSize < BlockSize) {\r
       break;\r
     }\r
-    \r
+\r
     //\r
     // Data must be got from the next block range.\r
     //\r
     *StartLba += NumberOfBlocks;\r
   }\r
-  \r
+\r
   //\r
   // read the remaining data\r
   //\r
@@ -151,7 +145,7 @@ ReadFvbData (
       return Status;\r
     }\r
   }\r
-  \r
+\r
   //\r
   // Update Lba and Offset used by the following read.\r
   //\r
@@ -189,7 +183,7 @@ GetFwVolHeader (
   EFI_LBA                     StartLba;\r
   UINTN                       Offset;\r
   UINT8                       *Buffer;\r
-  \r
+\r
   //\r
   // Read the standard FV header\r
   //\r
@@ -329,8 +323,6 @@ FvCheck (
   FFS_FILE_LIST_ENTRY                   *FfsFileEntry;\r
   EFI_FFS_FILE_HEADER                   *FfsHeader;\r
   UINT8                                 *CacheLocation;\r
-  UINTN                                 LbaOffset;\r
-  UINTN                                 HeaderSize;\r
   UINTN                                 Index;\r
   EFI_LBA                               LbaIndex;\r
   UINTN                                 Size;\r
@@ -353,11 +345,7 @@ FvCheck (
     return Status;\r
   }\r
 \r
-  //\r
-  // Size is the size of the FV minus the head. We have already allocated\r
-  // the header to check to make sure the volume is valid\r
-  //\r
-  Size = (UINTN)(FwVolHeader->FvLength - FwVolHeader->HeaderLength);\r
+  Size = (UINTN) FwVolHeader->FvLength;\r
   if ((FvbAttributes & EFI_FVB2_MEMORY_MAPPED) != 0) {\r
     FvDevice->IsMemoryMapped = TRUE;\r
 \r
@@ -369,7 +357,7 @@ FvCheck (
     //\r
     // Don't cache memory mapped FV really.\r
     //\r
-    FvDevice->CachedFv = (UINT8 *) (UINTN) (PhysicalAddress + FwVolHeader->HeaderLength);\r
+    FvDevice->CachedFv = (UINT8 *) (UINTN) PhysicalAddress;\r
   } else {\r
     FvDevice->IsMemoryMapped = FALSE;\r
     FvDevice->CachedFv = AllocatePool (Size);\r
@@ -380,52 +368,27 @@ FvCheck (
   }\r
 \r
   //\r
-  // Remember a pointer to the end fo the CachedFv\r
+  // Remember a pointer to the end of the CachedFv\r
   //\r
   FvDevice->EndOfCachedFv = FvDevice->CachedFv + Size;\r
 \r
   if (!FvDevice->IsMemoryMapped) {\r
     //\r
-    // Copy FV minus header into memory using the block map we have all ready\r
-    // read into memory.\r
+    // Copy FV into memory using the block map.\r
     //\r
     BlockMap = FwVolHeader->BlockMap;\r
     CacheLocation = FvDevice->CachedFv;\r
     LbaIndex = 0;\r
-    LbaOffset = 0;\r
-    HeaderSize = FwVolHeader->HeaderLength;\r
     while ((BlockMap->NumBlocks != 0) || (BlockMap->Length != 0)) {\r
-      Index = 0;\r
-      Size  = BlockMap->Length;\r
-      if (HeaderSize > 0) {\r
-        //\r
-        // Skip header size\r
-        //\r
-        for (; Index < BlockMap->NumBlocks && HeaderSize >= BlockMap->Length; Index ++) {\r
-          HeaderSize -= BlockMap->Length;\r
-          LbaIndex ++;\r
-        }\r
-\r
-        //\r
-        // Check whether FvHeader is crossing the multi block range.\r
-        //\r
-        if (Index >= BlockMap->NumBlocks) {\r
-          BlockMap++;\r
-          continue;\r
-        } else if (HeaderSize > 0) {\r
-          LbaOffset = HeaderSize;\r
-          Size = BlockMap->Length - HeaderSize;\r
-          HeaderSize = 0;\r
-        }\r
-      }\r
-    \r
       //\r
-      // read the FV data  \r
+      // read the FV data\r
       //\r
-      for (; Index < BlockMap->NumBlocks; Index ++) {\r
-        Status = Fvb->Read (Fvb,\r
+      Size = BlockMap->Length;\r
+      for (Index = 0; Index < BlockMap->NumBlocks; Index++) {\r
+        Status = Fvb->Read (\r
+                        Fvb,\r
                         LbaIndex,\r
-                        LbaOffset,\r
+                        0,\r
                         &Size,\r
                         CacheLocation\r
                         );\r
@@ -438,13 +401,7 @@ FvCheck (
         }\r
 \r
         LbaIndex++;\r
-        CacheLocation += Size;\r
-\r
-        //\r
-        // After we skip Fv Header always read from start of block\r
-        //\r
-        LbaOffset = 0;\r
-        Size  = BlockMap->Length;\r
+        CacheLocation += BlockMap->Length;\r
       }\r
 \r
       BlockMap++;\r
@@ -475,12 +432,12 @@ FvCheck (
     //\r
     // Searching for files starts on an 8 byte aligned boundary after the end of the Extended Header if it exists.\r
     //\r
-    FwVolExtHeader = (EFI_FIRMWARE_VOLUME_EXT_HEADER *) (FvDevice->CachedFv + (FwVolHeader->ExtHeaderOffset - FwVolHeader->HeaderLength));\r
+    FwVolExtHeader = (EFI_FIRMWARE_VOLUME_EXT_HEADER *) (FvDevice->CachedFv + FwVolHeader->ExtHeaderOffset);\r
     FfsHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FwVolExtHeader + FwVolExtHeader->ExtHeaderSize);\r
-    FfsHeader = (EFI_FFS_FILE_HEADER *) ALIGN_POINTER (FfsHeader, 8);\r
   } else {\r
-    FfsHeader = (EFI_FFS_FILE_HEADER *) (FvDevice->CachedFv);\r
+    FfsHeader = (EFI_FFS_FILE_HEADER *) (FvDevice->CachedFv + FwVolHeader->HeaderLength);\r
   }\r
+  FfsHeader = (EFI_FFS_FILE_HEADER *) ALIGN_POINTER (FfsHeader, 8);\r
   TopFvAddress = FvDevice->EndOfCachedFv;\r
   while (((UINTN) FfsHeader >= (UINTN) FvDevice->CachedFv) && ((UINTN) FfsHeader <= (UINTN) ((UINTN) TopFvAddress - sizeof (EFI_FFS_FILE_HEADER)))) {\r
 \r
@@ -711,14 +668,11 @@ NotifyFwVolBlock (
       FvDevice->FwVolHeader     = FwVolHeader;\r
       FvDevice->IsFfs3Fv        = CompareGuid (&FwVolHeader->FileSystemGuid, &gEfiFirmwareFileSystem3Guid);\r
       FvDevice->Fv.ParentHandle = Fvb->ParentHandle;\r
+      //\r
+      // Inherit the authentication status from FVB.\r
+      //\r
+      FvDevice->AuthenticationStatus = GetFvbAuthenticationStatus (Fvb);\r
 \r
-      if (Fvb->ParentHandle != NULL) {\r
-        //\r
-        // Inherit the authentication status from FVB.\r
-        //\r
-        FvDevice->AuthenticationStatus = GetFvbAuthenticationStatus (Fvb);\r
-      }\r
-      \r
       if (!EFI_ERROR (FvCheck (FvDevice))) {\r
         //\r
         // Install an New FV protocol on the existing handle\r