]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Universal/FirmwareVolume/FwVolDxe/FwVol.c
Add core FFS3 support, FwVolDxe and SectionExtraction.
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / FirmwareVolume / FwVolDxe / FwVol.c
index f453d5ec0a1a3914a24c381d994d1348eb162895..a3e507afd05e615b6c4b8df44e04a8851027862c 100644 (file)
@@ -4,7 +4,7 @@
   Layers on top of Firmware Block protocol to produce a file abstraction\r
   of FV based files.\r
 \r
-  Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
 \r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions\r
@@ -206,7 +206,6 @@ FvCheck (
   UINT8                               *FreeStart;\r
   UINTN                               FreeSize;\r
   UINT8                               ErasePolarity;\r
-  UINTN                               FileLength;\r
   EFI_FFS_FILE_STATE                  FileState;\r
   UINT8                               *TopFvAddress;\r
   UINTN                               TestLength;\r
@@ -230,6 +229,8 @@ FvCheck (
   }\r
   ASSERT (FwVolHeader != NULL);\r
 \r
+  FvDevice->IsFfs3Fv = CompareGuid (&FwVolHeader->FileSystemGuid, &gEfiFirmwareFileSystem3Guid);\r
+\r
   //\r
   // Double Check firmware volume header here\r
   //\r
@@ -412,7 +413,14 @@ FvCheck (
                     (EFI_FFS_FILE_HEADER *) Ptr\r
                     );\r
       if ((FileState == EFI_FILE_HEADER_INVALID) || (FileState == EFI_FILE_HEADER_CONSTRUCTION)) {\r
-        Ptr += sizeof (EFI_FFS_FILE_HEADER);\r
+        if (IS_FFS_FILE2 (Ptr)) {\r
+          if (!FvDevice->IsFfs3Fv) {\r
+            DEBUG ((EFI_D_ERROR, "Found a FFS3 formatted file: %g in a non-FFS3 formatted FV.\n", &((EFI_FFS_FILE_HEADER *) Ptr)->Name));\r
+          }\r
+          Ptr = Ptr + sizeof (EFI_FFS_FILE_HEADER2);\r
+        } else {\r
+          Ptr = Ptr + sizeof (EFI_FFS_FILE_HEADER);\r
+        }\r
 \r
         continue;\r
 \r
@@ -425,8 +433,22 @@ FvCheck (
       }\r
     }\r
 \r
+    if (IS_FFS_FILE2 (Ptr)) {\r
+      ASSERT (FFS_FILE2_SIZE (Ptr) > 0x00FFFFFF);\r
+      if (!FvDevice->IsFfs3Fv) {\r
+        DEBUG ((EFI_D_ERROR, "Found a FFS3 formatted file: %g in a non-FFS3 formatted FV.\n", &((EFI_FFS_FILE_HEADER *) Ptr)->Name));\r
+        Ptr = Ptr + FFS_FILE2_SIZE (Ptr);\r
+        //\r
+        // Adjust Ptr to the next 8-byte aligned boundry.\r
+        //\r
+        while (((UINTN) Ptr & 0x07) != 0) {\r
+          Ptr++;\r
+        }\r
+        continue;\r
+      }\r
+    }\r
+\r
     if (IsValidFFSFile (FvDevice, (EFI_FFS_FILE_HEADER *) Ptr)) {\r
-      FileLength = *(UINT32 *) ((EFI_FFS_FILE_HEADER *) Ptr)->Size & 0x00FFFFFF;\r
       FileState = GetFileState (\r
                     FvDevice->ErasePolarity,\r
                     (EFI_FFS_FILE_HEADER *) Ptr\r
@@ -449,7 +471,11 @@ FvCheck (
         InsertTailList (&FvDevice->FfsFileListHeader, &FfsFileEntry->Link);\r
       }\r
 \r
-      Ptr += FileLength;\r
+      if (IS_FFS_FILE2 (Ptr)) {\r
+        Ptr = Ptr + FFS_FILE2_SIZE (Ptr);\r
+      } else {\r
+        Ptr = Ptr + FFS_FILE_SIZE (Ptr);\r
+      }\r
 \r
       //\r
       // Adjust Ptr to the next 8-byte aligned boundry.\r
@@ -513,9 +539,7 @@ FwVolDriverInit (
   if (EFI_ERROR (Status)) {\r
     return EFI_NOT_FOUND;\r
   }\r
-  //\r
-  // Get FV with gEfiFirmwareFileSystemGuid\r
-  //\r
+\r
   for (Index = 0; Index < HandleCount; Index += 1) {\r
     Status = gBS->HandleProtocol (\r
                     HandleBuffer[Index],\r
@@ -536,10 +560,8 @@ FwVolDriverInit (
     // Check to see that the file system is indeed formatted in a way we can\r
     // understand it...\r
     //\r
-    if (!CompareGuid (\r
-          &FwVolHeader->FileSystemGuid,\r
-          &gEfiFirmwareFileSystem2Guid\r
-          )) {\r
+    if ((!CompareGuid (&FwVolHeader->FileSystemGuid, &gEfiFirmwareFileSystem2Guid)) &&\r
+        (!CompareGuid (&FwVolHeader->FileSystemGuid, &gEfiFirmwareFileSystem3Guid))) {\r
       FreePool (FwVolHeader);\r
       continue;\r
     }\r