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
}\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