[edk2-devel] [Patch V2 07/12] UefiPayloadPkg: Fix up UPL Pcd database
Guo Dong
guo.dong at intel.com
Wed Jun 23 23:45:38 UTC 2021
Reviewed-by: Guo Dong <guo.dong at intel.com>
> -----Original Message-----
> From: Liu, Zhiguang <zhiguang.liu at intel.com>
> Sent: Tuesday, June 22, 2021 7:53 PM
> To: devel at edk2.groups.io
> Cc: Ma, Maurice <maurice.ma at intel.com>; Dong, Guo
> <guo.dong at intel.com>; You, Benjamin <benjamin.you at intel.com>
> Subject: [Patch V2 07/12] UefiPayloadPkg: Fix up UPL Pcd database
>
> V1:
> Edk2 bootloader will pass the pei pcd database, and UPL also contain a
> PCD database.
> Dxe PCD driver has the assumption that the two PCD database can be
> catenated and the local token number should be successive。
> This patch will manually fix up the UPL PCD database to meet that
> assumption.
> V2:
> Update the function comments
>
> Cc: Maurice Ma <maurice.ma at intel.com>
> Cc: Guo Dong <guo.dong at intel.com>
> Cc: Benjamin You <benjamin.you at intel.com>
> Signed-off-by: Zhiguang Liu <zhiguang.liu at intel.com>
> ---
> UefiPayloadPkg/UefiPayloadEntry/LoadDxeCore.c | 19
> ++++++++++++-------
> UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h | 45
> +++++++++++++++++++++++++++++++++++++++++++++
> UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c | 57
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
> UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf | 2 ++
> UefiPayloadPkg/UefiPayloadPkg.dec | 2 ++
> UefiPayloadPkg/UefiPayloadPkg.dsc | 1 +
> 6 files changed, 119 insertions(+), 7 deletions(-)
>
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/LoadDxeCore.c
> b/UefiPayloadPkg/UefiPayloadEntry/LoadDxeCore.c
> index f5d70c59f8..0b6cb47cd0 100644
> --- a/UefiPayloadPkg/UefiPayloadEntry/LoadDxeCore.c
> +++ b/UefiPayloadPkg/UefiPayloadEntry/LoadDxeCore.c
> @@ -114,20 +114,23 @@ LoadPeCoffImage (
> }
>
>
>
> /**
>
> - This function searchs a given file type within a valid FV.
>
> + This function searchs a given file type with a given Guid within a valid FV.
>
> + If input Guid is NULL, will locate the first section having the given file type
>
>
>
> @param FvHeader A pointer to firmware volume header that contains
> the set of files
>
> to be searched.
>
> @param FileType File type to be searched.
>
> + @param Guid Will ignore if it is NULL.
>
> @param FileHeader A pointer to the discovered file, if successful.
>
>
>
> @retval EFI_SUCCESS Successfully found FileType
>
> @retval EFI_NOT_FOUND File type can't be found.
>
> **/
>
> EFI_STATUS
>
> -FvFindFile (
>
> +FvFindFileByTypeGuid (
>
> IN EFI_FIRMWARE_VOLUME_HEADER *FvHeader,
>
> IN EFI_FV_FILETYPE FileType,
>
> + IN EFI_GUID *Guid OPTIONAL,
>
> OUT EFI_FFS_FILE_HEADER **FileHeader
>
> )
>
> {
>
> @@ -171,8 +174,10 @@ FvFindFile (
> // Look for file type
>
> //
>
> if (File->Type == FileType) {
>
> - *FileHeader = File;
>
> - return EFI_SUCCESS;
>
> + if (Guid == NULL || CompareGuid(&File->Name, Guid)) {
>
> + *FileHeader = File;
>
> + return EFI_SUCCESS;
>
> + }
>
> }
>
> }
>
>
>
> @@ -266,7 +271,7 @@ LoadDxeCore (
> //
>
> // DXE FV is inside Payload FV. Here find DXE FV from Payload FV
>
> //
>
> - Status = FvFindFile (PayloadFv,
> EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE, &FileHeader);
>
> + Status = FvFindFileByTypeGuid (PayloadFv,
> EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE, NULL, &FileHeader);
>
> if (EFI_ERROR (Status)) {
>
> return Status;
>
> }
>
> @@ -283,7 +288,7 @@ LoadDxeCore (
> //
>
> // Find DXE core file from DXE FV
>
> //
>
> - Status = FvFindFile (DxeCoreFv, EFI_FV_FILETYPE_DXE_CORE, &FileHeader);
>
> + Status = FvFindFileByTypeGuid (DxeCoreFv, EFI_FV_FILETYPE_DXE_CORE,
> NULL, &FileHeader);
>
> if (EFI_ERROR (Status)) {
>
> return Status;
>
> }
>
> @@ -330,7 +335,7 @@ UniversalLoadDxeCore (
> //
>
> // Find DXE core file from DXE FV
>
> //
>
> - Status = FvFindFile (DxeFv, EFI_FV_FILETYPE_DXE_CORE, &FileHeader);
>
> + Status = FvFindFileByTypeGuid (DxeFv, EFI_FV_FILETYPE_DXE_CORE, NULL,
> &FileHeader);
>
> if (EFI_ERROR (Status)) {
>
> return Status;
>
> }
>
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
> b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
> index dff7b6b87f..331724c687 100644
> --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
> +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
> @@ -35,6 +35,7 @@
> #include <UniversalPayload/AcpiTable.h>
>
> #include <UniversalPayload/UniversalPayload.h>
>
> #include <UniversalPayload/ExtraData.h>
>
> +#include <Guid/PcdDataBaseSignatureGuid.h>
>
>
>
> #define LEGACY_8259_MASK_REGISTER_MASTER 0x21
>
> #define LEGACY_8259_MASK_REGISTER_SLAVE 0xA1
>
> @@ -159,4 +160,48 @@ HandOffToDxeCore (
> IN EFI_PEI_HOB_POINTERS HobList
>
> );
>
>
>
> +EFI_STATUS
>
> +FixUpPcdDatabase (
>
> + IN EFI_FIRMWARE_VOLUME_HEADER *DxeFv
>
> + );
>
> +
>
> +/**
>
> + This function searchs a given section type within a valid FFS file.
>
> +
>
> + @param FileHeader A pointer to the file header that contains the set
> of sections to
>
> + be searched.
>
> + @param SearchType The value of the section type to search.
>
> + @param SectionData A pointer to the discovered section, if
> successful.
>
> +
>
> + @retval EFI_SUCCESS The section was found.
>
> + @retval EFI_NOT_FOUND The section was not found.
>
> +
>
> +**/
>
> +EFI_STATUS
>
> +FileFindSection (
>
> + IN EFI_FFS_FILE_HEADER *FileHeader,
>
> + IN EFI_SECTION_TYPE SectionType,
>
> + OUT VOID **SectionData
>
> + );
>
> +
>
> +/**
>
> + This function searchs a given file type with a given Guid within a valid FV.
>
> + If input Guid is NULL, will locate the first section having the given file type
>
> +
>
> + @param FvHeader A pointer to firmware volume header that contains
> the set of files
>
> + to be searched.
>
> + @param FileType File type to be searched.
>
> + @param Guid Will ignore if it is NULL.
>
> + @param FileHeader A pointer to the discovered file, if successful.
>
> +
>
> + @retval EFI_SUCCESS Successfully found FileType
>
> + @retval EFI_NOT_FOUND File type can't be found.
>
> +**/
>
> +EFI_STATUS
>
> +FvFindFileByTypeGuid (
>
> + IN EFI_FIRMWARE_VOLUME_HEADER *FvHeader,
>
> + IN EFI_FV_FILETYPE FileType,
>
> + IN EFI_GUID *Guid OPTIONAL,
>
> + OUT EFI_FFS_FILE_HEADER **FileHeader
>
> + );
>
> #endif
>
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
> b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
> index 9d59454486..b8c1317df0 100644
> --- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
> +++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
> @@ -25,6 +25,62 @@
>
>
> extern VOID *mHobList;
>
>
>
> +/**
>
> + Some bootloader may pass a pcd database, and UPL also contain a PCD
> database.
>
> + Dxe PCD driver has the assumption that the two PCD database can be
> catenated and
>
> + the local token number should be successive。
>
> + This function will fix up the UPL PCD database to meet that assumption.
>
> +
>
> + @param[in] DxeFv The FV where to find the Universal PCD database.
>
> +
>
> + @retval EFI_SUCCESS If it completed successfully.
>
> + @retval other Failed to fix up.
>
> +**/
>
> +EFI_STATUS
>
> +FixUpPcdDatabase (
>
> + IN EFI_FIRMWARE_VOLUME_HEADER *DxeFv
>
> + )
>
> +{
>
> + EFI_STATUS Status;
>
> + EFI_FFS_FILE_HEADER *FileHeader;
>
> + VOID *PcdRawData;
>
> + PEI_PCD_DATABASE *PeiDatabase;
>
> + PEI_PCD_DATABASE *UplDatabase;
>
> + EFI_HOB_GUID_TYPE *GuidHob;
>
> + DYNAMICEX_MAPPING *ExMapTable;
>
> + UINTN Index;
>
> +
>
> + GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);
>
> + if (GuidHob == NULL) {
>
> + //
>
> + // No fix-up is needed.
>
> + //
>
> + return EFI_SUCCESS;
>
> + }
>
> + PeiDatabase = (PEI_PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);
>
> + DEBUG ((DEBUG_INFO, "Find the Pei PCD data base, the total local token
> number is %d\n", PeiDatabase->LocalTokenCount));
>
> +
>
> + Status = FvFindFileByTypeGuid (DxeFv, EFI_FV_FILETYPE_DRIVER,
> PcdGetPtr (PcdPcdDriverFile), &FileHeader);
>
> + ASSERT_EFI_ERROR (Status);
>
> + if (EFI_ERROR (Status)) {
>
> + return Status;
>
> + }
>
> + Status = FileFindSection (FileHeader, EFI_SECTION_RAW, &PcdRawData);
>
> + ASSERT_EFI_ERROR (Status);
>
> + if (EFI_ERROR (Status)) {
>
> + return Status;
>
> + }
>
> +
>
> + UplDatabase = (PEI_PCD_DATABASE *) PcdRawData;
>
> + ExMapTable = (DYNAMICEX_MAPPING *) (UINTN) ((UINTN) PcdRawData
> + UplDatabase->ExMapTableOffset);
>
> +
>
> + for (Index = 0; Index < UplDatabase->ExTokenCount; Index++) {
>
> + ExMapTable[Index].TokenNumber += PeiDatabase->LocalTokenCount;
>
> + }
>
> + DEBUG ((DEBUG_INFO, "Fix up UPL PCD database successfully\n"));
>
> + return EFI_SUCCESS;
>
> +}
>
> +
>
> /**
>
> Add HOB into HOB list
>
>
>
> @@ -332,6 +388,7 @@ _ModuleEntryPoint (
> Status = BuildHobs (BootloaderParameter, &DxeFv);
>
> ASSERT_EFI_ERROR (Status);
>
>
>
> + FixUpPcdDatabase (DxeFv);
>
> Status = UniversalLoadDxeCore (DxeFv, &DxeCoreEntryPoint);
>
> ASSERT_EFI_ERROR (Status);
>
>
>
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
> b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
> index 77cd25aafd..76d7e4791c 100644
> --- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
> +++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
> @@ -63,6 +63,7 @@
> gEfiAcpiTableGuid
>
> gUefiSerialPortInfoGuid
>
> gUniversalPayloadExtraDataGuid
>
> + gPcdDataBaseHobGuid
>
>
>
> [FeaturePcd.IA32]
>
> gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ##
> CONSUMES
>
> @@ -72,6 +73,7 @@
>
>
>
>
> [Pcd.IA32,Pcd.X64]
>
> + gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile
>
> gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable ##
> SOMETIMES_CONSUMES
>
>
> gEfiMdeModulePkgTokenSpaceGuid.PcdPteMemoryEncryptionAddressOrM
> ask ## CONSUMES
>
>
> gEfiMdeModulePkgTokenSpaceGuid.PcdNullPointerDetectionPropertyMask
> ## CONSUMES
>
> diff --git a/UefiPayloadPkg/UefiPayloadPkg.dec
> b/UefiPayloadPkg/UefiPayloadPkg.dec
> index 105e1f5a1c..d84f560995 100644
> --- a/UefiPayloadPkg/UefiPayloadPkg.dec
> +++ b/UefiPayloadPkg/UefiPayloadPkg.dec
> @@ -72,3 +72,5 @@
> gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesCode
> |0x80|UINT32|0x
>
>
> # Size of the region used by UEFI in permanent memory
>
>
> gUefiPayloadPkgTokenSpaceGuid.PcdSystemMemoryUefiRegionSize|0x020
> 00000|UINT32|0x00000017
>
> +
>
> +gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile|{ 0x57, 0x72, 0xcf, 0x80,
> 0xab, 0x87, 0xf9, 0x47, 0xa3, 0xfe, 0xD5, 0x0B, 0x76, 0xd8, 0x95,
> 0x41 }|VOID*|0x00000018
>
> diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc
> b/UefiPayloadPkg/UefiPayloadPkg.dsc
> index d8277efccd..e3d669a6d6 100644
> --- a/UefiPayloadPkg/UefiPayloadPkg.dsc
> +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc
> @@ -298,6 +298,7 @@
> gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable|TRUE
>
> gEfiMdeModulePkgTokenSpaceGuid.PcdBootManagerMenuFile|{ 0x21,
> 0xaa, 0x2c, 0x46, 0x14, 0x76, 0x03, 0x45, 0x83, 0x6e, 0x8a, 0xb6, 0xf4, 0x66,
> 0x23, 0x31 }
>
>
>
> + gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile|{ 0x57, 0x72, 0xcf,
> 0x80, 0xab, 0x87, 0xf9, 0x47, 0xa3, 0xfe, 0xD5, 0x0B, 0x76, 0xd8, 0x95, 0x41 }
>
>
>
> !if $(SOURCE_DEBUG_ENABLE)
>
>
> gEfiSourceLevelDebugPkgTokenSpaceGuid.PcdDebugLoadImageMethod|0x
> 2
>
> --
> 2.30.0.windows.2
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#77013): https://edk2.groups.io/g/devel/message/77013
Mute This Topic: https://groups.io/mt/83730184/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-
More information about the edk2-devel-archive
mailing list