IntelFrameworkModulePkg FwVolDxe: Get FV auth status propagated from PEI

FV3 HOB was introduced by new (>= 1.5) PI spec, it is intended to
be used to propagate PEI-phase FV authentication status to DXE.
This patch is to update FwVolDxe to get the authentication status
propagated from PEI-phase to DXE by FV3 HOB when producing FV
protocol.

Cc: Liming Gao <liming.gao@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
This commit is contained in:
Star Zeng 2017-10-03 21:33:04 +08:00
parent c60370454e
commit 2331cab7d4
3 changed files with 57 additions and 23 deletions

View File

@ -4,7 +4,7 @@
Layers on top of Firmware Block protocol to produce a file abstraction Layers on top of Firmware Block protocol to produce a file abstraction
of FV based files. of FV based files.
Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR> Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions are licensed and made available under the terms and conditions
@ -195,7 +195,7 @@ FreeFvDeviceResource (
/** /**
Firmware volume inherits authentication status from the FV image file and section(in another firmware volume) Firmware volume inherits authentication status from the FV image file and section(in another firmware volume)
where it came from. where it came from or propagated from PEI-phase.
@param FvDevice A pointer to the FvDevice. @param FvDevice A pointer to the FvDevice.
@ -205,26 +205,30 @@ FwVolInheritAuthenticationStatus (
IN FV_DEVICE *FvDevice IN FV_DEVICE *FvDevice
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_FIRMWARE_VOLUME_HEADER *CachedFvHeader; EFI_FIRMWARE_VOLUME_HEADER *CachedFvHeader;
EFI_FIRMWARE_VOLUME_EXT_HEADER *CachedFvExtHeader; EFI_FIRMWARE_VOLUME_EXT_HEADER *CachedFvExtHeader;
EFI_FIRMWARE_VOLUME2_PROTOCOL *ParentFvProtocol; EFI_FIRMWARE_VOLUME2_PROTOCOL *ParentFvProtocol;
UINTN Key; UINTN Key;
EFI_GUID FileNameGuid; EFI_GUID FileNameGuid;
EFI_FV_FILETYPE FileType; EFI_FV_FILETYPE FileType;
EFI_FV_FILE_ATTRIBUTES FileAttributes; EFI_FV_FILE_ATTRIBUTES FileAttributes;
UINTN FileSize; UINTN FileSize;
EFI_SECTION_TYPE SectionType; EFI_SECTION_TYPE SectionType;
UINT32 AuthenticationStatus; UINT32 AuthenticationStatus;
EFI_FIRMWARE_VOLUME_HEADER *FvHeader; EFI_FIRMWARE_VOLUME_HEADER *FvHeader;
EFI_FIRMWARE_VOLUME_EXT_HEADER *FvExtHeader; EFI_FIRMWARE_VOLUME_EXT_HEADER *FvExtHeader;
UINTN BufferSize; UINTN BufferSize;
EFI_FIRMWARE_VOLUME_BLOCK_PROTOCOL *Fvb;
CachedFvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) FvDevice->CachedFv; EFI_FVB_ATTRIBUTES_2 FvbAttributes;
EFI_PHYSICAL_ADDRESS BaseAddress;
EFI_PEI_HOB_POINTERS Fv3Hob;
if (FvDevice->Fv.ParentHandle != NULL) { if (FvDevice->Fv.ParentHandle != NULL) {
CachedFvHeader = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) FvDevice->CachedFv;
// //
// By Parent Handle, find out the FV image file and section(in another firmware volume) where the firmware volume came from // By Parent Handle, find out the FV image file and section(in another firmware volume) where the firmware volume came from
// //
Status = gBS->HandleProtocol (FvDevice->Fv.ParentHandle, &gEfiFirmwareVolume2ProtocolGuid, (VOID **) &ParentFvProtocol); Status = gBS->HandleProtocol (FvDevice->Fv.ParentHandle, &gEfiFirmwareVolume2ProtocolGuid, (VOID **) &ParentFvProtocol);
if (!EFI_ERROR (Status) && (ParentFvProtocol != NULL)) { if (!EFI_ERROR (Status) && (ParentFvProtocol != NULL)) {
@ -258,7 +262,7 @@ FwVolInheritAuthenticationStatus (
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
if ((FvHeader->FvLength == CachedFvHeader->FvLength) && if ((FvHeader->FvLength == CachedFvHeader->FvLength) &&
(FvHeader->ExtHeaderOffset == CachedFvHeader->ExtHeaderOffset)) { (FvHeader->ExtHeaderOffset == CachedFvHeader->ExtHeaderOffset)) {
if (FvHeader->ExtHeaderOffset !=0) { if (FvHeader->ExtHeaderOffset != 0) {
// //
// Both FVs contain extension header, then compare their FV Name GUID // Both FVs contain extension header, then compare their FV Name GUID
// //
@ -292,6 +296,35 @@ FwVolInheritAuthenticationStatus (
} }
} while (TRUE); } while (TRUE);
} }
} else {
Fvb = FvDevice->Fvb;
Status = Fvb->GetAttributes (Fvb, &FvbAttributes);
if (EFI_ERROR (Status)) {
return;
}
if ((FvbAttributes & EFI_FVB2_MEMORY_MAPPED) != 0) {
//
// Get volume base address
//
Status = Fvb->GetPhysicalAddress (Fvb, &BaseAddress);
if (EFI_ERROR (Status)) {
return;
}
//
// Get the authentication status propagated from PEI-phase to DXE.
//
Fv3Hob.Raw = GetHobList ();
while ((Fv3Hob.Raw = GetNextHob (EFI_HOB_TYPE_FV3, Fv3Hob.Raw)) != NULL) {
if (Fv3Hob.FirmwareVolume3->BaseAddress == BaseAddress) {
FvDevice->AuthenticationStatus = Fv3Hob.FirmwareVolume3->AuthenticationStatus;
return;
}
Fv3Hob.Raw = GET_NEXT_HOB (Fv3Hob);
}
}
} }
} }

View File

@ -1,7 +1,7 @@
/** @file /** @file
Common defines and definitions for a FwVolDxe driver. Common defines and definitions for a FwVolDxe driver.
Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR> Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials This program and the accompanying materials
are licensed and made available under the terms and conditions are licensed and made available under the terms and conditions
@ -33,6 +33,7 @@
#include <Library/BaseMemoryLib.h> #include <Library/BaseMemoryLib.h>
#include <Library/MemoryAllocationLib.h> #include <Library/MemoryAllocationLib.h>
#include <Library/UefiBootServicesTableLib.h> #include <Library/UefiBootServicesTableLib.h>
#include <Library/HobLib.h>
#define FV_DEVICE_SIGNATURE SIGNATURE_32 ('_', 'F', 'V', '_') #define FV_DEVICE_SIGNATURE SIGNATURE_32 ('_', 'F', 'V', '_')

View File

@ -4,7 +4,7 @@
# This driver produces Firmware Volume2 protocol with full services # This driver produces Firmware Volume2 protocol with full services
# (read/write, get/set) based on Firmware Volume Block protocol. # (read/write, get/set) based on Firmware Volume Block protocol.
# #
# Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR> # Copyright (c) 2006 - 2017, Intel Corporation. All rights reserved.<BR>
# #
# This program and the accompanying materials are # This program and the accompanying materials are
# licensed and made available under the terms and conditions of the BSD License # licensed and made available under the terms and conditions of the BSD License
@ -55,7 +55,7 @@
UefiLib UefiLib
UefiDriverEntryPoint UefiDriverEntryPoint
DebugLib DebugLib
HobLib
[Guids] [Guids]
gEfiFirmwareVolumeTopFileGuid ## CONSUMES ## File # VTF file gEfiFirmwareVolumeTopFileGuid ## CONSUMES ## File # VTF file