]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Allow DXE dispatcher to ignore EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE type FFS file...
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 23 Aug 2007 06:26:50 +0000 (06:26 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 23 Aug 2007 06:26:50 +0000 (06:26 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3694 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Core/Dxe/Dispatcher/Dispatcher.c

index 9792a16485c2a05a2a51884bf2e1302002c415a0..d3d50ec7c239c480458af7c8fe969ecb5e3685ee 100644 (file)
@@ -786,6 +786,59 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+STATIC\r
+BOOLEAN\r
+FvFoundInHobFv2 (\r
+  IN  EFI_HANDLE                      FvHandle,\r
+  IN  CONST EFI_GUID                  *DriverName\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Check if a FV Image type file (EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE) is\r
+  described by a EFI_HOB_FIRMWARE_VOLUME2 Hob.\r
+\r
+Arguments:\r
+\r
+  FvHandle    - The handle which FVB protocol installed on.\r
+  DriverName  - The driver guid specified.\r
+\r
+Returns:\r
+\r
+  TRUE    - This file is found in a EFI_HOB_FIRMWARE_VOLUME2 Hob.\r
+\r
+  FALSE   - Not found.\r
+  \r
+\r
+--*/\r
+{\r
+  EFI_PEI_HOB_POINTERS                HobFv2;\r
+  EFI_STATUS                          Status;\r
+  EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL  *Fvb;\r
+  EFI_FIRMWARE_VOLUME_HEADER          *FvHeader;\r
+  EFI_PHYSICAL_ADDRESS                FvHeaderAddr;\r
+  \r
+  HobFv2.Raw = GetHobList ();\r
+  \r
+  while ((HobFv2.Raw = GetNextHob (EFI_HOB_TYPE_FV2, HobFv2.Raw)) != NULL) {\r
+    if (CompareGuid (DriverName, &HobFv2.FirmwareVolume2->FileName)) {\r
+      Status = CoreHandleProtocol (FvHandle, &gEfiFirmwareVolumeBlockProtocolGuid, &Fvb);\r
+      if (!EFI_ERROR (Status)) {\r
+        Status = Fvb->GetPhysicalAddress (Fvb, &FvHeaderAddr);\r
+        if (!EFI_ERROR (Status)) {\r
+          FvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) FvHeaderAddr;\r
+          if (CompareGuid (&FvHeader->FileSystemGuid, &HobFv2.FirmwareVolume2->FvName)) {\r
+            return TRUE;\r
+          }\r
+        }\r
+      }\r
+    }\r
+    HobFv2.Raw = GET_NEXT_HOB (HobFv2);\r
+  }\r
+\r
+  return FALSE;\r
+}\r
 \r
 \r
 EFI_STATUS \r
@@ -1038,6 +1091,14 @@ Returns:
               }\r
             }\r
           } else if (Type == EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE) {\r
+            //\r
+            // Check if this EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE file has already \r
+            // been extracted.\r
+            //\r
+            if (FvFoundInHobFv2 (FvHandle, &NameGuid)) {\r
+              continue;\r
+            }\r
+            \r
             //\r
             // Found a firmware volume image. Produce a firmware volume block\r
             // protocol for it so it gets dispatched from. This is usually a \r