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
+ Copyright (c) 2006 - 2017, 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
/**\r
\r
Firmware volume inherits authentication status from the FV image file and section(in another firmware volume)\r
- where it came from.\r
+ where it came from or propagated from PEI-phase.\r
\r
@param FvDevice A pointer to the FvDevice.\r
\r
IN FV_DEVICE *FvDevice\r
)\r
{\r
- EFI_STATUS Status;\r
- EFI_FIRMWARE_VOLUME_HEADER *CachedFvHeader;\r
- EFI_FIRMWARE_VOLUME_EXT_HEADER *CachedFvExtHeader;\r
- EFI_FIRMWARE_VOLUME2_PROTOCOL *ParentFvProtocol;\r
- UINTN Key;\r
- EFI_GUID FileNameGuid;\r
- EFI_FV_FILETYPE FileType;\r
- EFI_FV_FILE_ATTRIBUTES FileAttributes;\r
- UINTN FileSize;\r
- EFI_SECTION_TYPE SectionType;\r
- UINT32 AuthenticationStatus;\r
- EFI_FIRMWARE_VOLUME_HEADER *FvHeader;\r
- EFI_FIRMWARE_VOLUME_EXT_HEADER *FvExtHeader;\r
- UINTN BufferSize;\r
-\r
- CachedFvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) FvDevice->CachedFv;\r
+ EFI_STATUS Status;\r
+ EFI_FIRMWARE_VOLUME_HEADER *CachedFvHeader;\r
+ EFI_FIRMWARE_VOLUME_EXT_HEADER *CachedFvExtHeader;\r
+ EFI_FIRMWARE_VOLUME2_PROTOCOL *ParentFvProtocol;\r
+ UINTN Key;\r
+ EFI_GUID FileNameGuid;\r
+ EFI_FV_FILETYPE FileType;\r
+ EFI_FV_FILE_ATTRIBUTES FileAttributes;\r
+ UINTN FileSize;\r
+ EFI_SECTION_TYPE SectionType;\r
+ UINT32 AuthenticationStatus;\r
+ EFI_FIRMWARE_VOLUME_HEADER *FvHeader;\r
+ EFI_FIRMWARE_VOLUME_EXT_HEADER *FvExtHeader;\r
+ UINTN BufferSize;\r
+ EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb;\r
+ EFI_FVB_ATTRIBUTES_2 FvbAttributes;\r
+ EFI_PHYSICAL_ADDRESS BaseAddress;\r
+ EFI_PEI_HOB_POINTERS Fv3Hob;\r
\r
if (FvDevice->Fv.ParentHandle != NULL) {\r
+ CachedFvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) FvDevice->CachedFv;\r
+\r
//\r
- // By Parent Handle, find out the FV image file and section(in another firmware volume) where the firmware volume came from \r
+ // By Parent Handle, find out the FV image file and section(in another firmware volume) where the firmware volume came from\r
//\r
Status = gBS->HandleProtocol (FvDevice->Fv.ParentHandle, &gEfiFirmwareVolume2ProtocolGuid, (VOID **) &ParentFvProtocol);\r
if (!EFI_ERROR (Status) && (ParentFvProtocol != NULL)) {\r
if (!EFI_ERROR (Status)) {\r
if ((FvHeader->FvLength == CachedFvHeader->FvLength) &&\r
(FvHeader->ExtHeaderOffset == CachedFvHeader->ExtHeaderOffset)) {\r
- if (FvHeader->ExtHeaderOffset !=0) {\r
+ if (FvHeader->ExtHeaderOffset != 0) {\r
//\r
// Both FVs contain extension header, then compare their FV Name GUID\r
//\r
}\r
} while (TRUE);\r
}\r
+ } else {\r
+ Fvb = FvDevice->Fvb;\r
+\r
+ Status = Fvb->GetAttributes (Fvb, &FvbAttributes);\r
+ if (EFI_ERROR (Status)) {\r
+ return;\r
+ }\r
+\r
+ if ((FvbAttributes & EFI_FVB2_MEMORY_MAPPED) != 0) {\r
+ //\r
+ // Get volume base address\r
+ //\r
+ Status = Fvb->GetPhysicalAddress (Fvb, &BaseAddress);\r
+ if (EFI_ERROR (Status)) {\r
+ return;\r
+ }\r
+\r
+ //\r
+ // Get the authentication status propagated from PEI-phase to DXE.\r
+ //\r
+ Fv3Hob.Raw = GetHobList ();\r
+ while ((Fv3Hob.Raw = GetNextHob (EFI_HOB_TYPE_FV3, Fv3Hob.Raw)) != NULL) {\r
+ if (Fv3Hob.FirmwareVolume3->BaseAddress == BaseAddress) {\r
+ FvDevice->AuthenticationStatus = Fv3Hob.FirmwareVolume3->AuthenticationStatus;\r
+ return;\r
+ }\r
+ Fv3Hob.Raw = GET_NEXT_HOB (Fv3Hob);\r
+ }\r
+ }\r
}\r
}\r
\r