Please update the below function description to match the function impl. +/**
+ Find DXE core from FV and build DXE core HOBs. + + @param[in] FvBase FV base to load DXE core from + @param[out] DxeCoreEntryPoint DXE core entry point + + @retval EFI_SUCCESS If it completed successfully. + @retval EFI_NOT_FOUND If it failed to load DXE FV. +**/ +EFI_STATUS +FixUpPcdDatabase ( + IN EFI_FIRMWARE_VOLUME_HEADER *DxeFv + ) Remove the original one "*FileHeader = File;" since a new one is added in Guid check condition. > @@ -172,7 +175,10 @@ FvFindFile ( > // > > if (File->Type == FileType) { > > *FileHeader = File; > > - return EFI_SUCCESS; > > + if (Guid == NULL || CompareGuid(&File->Name, Guid)) { > > + *FileHeader = File; > > + return EFI_SUCCESS; > > + } Thanks, Guo > -----Original Message----- > From: Liu, Zhiguang <zhiguang....@intel.com> > Sent: Sunday, June 20, 2021 8:47 AM > To: devel@edk2.groups.io > Cc: Ma, Maurice <maurice...@intel.com>; Dong, Guo > <guo.d...@intel.com>; You, Benjamin <benjamin....@intel.com> > Subject: [PATCH 07/12] UefiPayloadPkg: Fix up UPL Pcd database > > 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. > > Cc: Maurice Ma <maurice...@intel.com> > Cc: Guo Dong <guo.d...@intel.com> > Cc: Benjamin You <benjamin....@intel.com> > Signed-off-by: Zhiguang Liu <zhiguang....@intel.com> > --- > UefiPayloadPkg/UefiPayloadEntry/LoadDxeCore.c | 18 > ++++++++++++------ > UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h | 45 > +++++++++++++++++++++++++++++++++++++++++++++ > UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c | 55 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf | 2 ++ > UefiPayloadPkg/UefiPayloadPkg.dec | 2 ++ > UefiPayloadPkg/UefiPayloadPkg.dsc | 1 + > 6 files changed, 117 insertions(+), 6 deletions(-) > > diff --git a/UefiPayloadPkg/UefiPayloadEntry/LoadDxeCore.c > b/UefiPayloadPkg/UefiPayloadEntry/LoadDxeCore.c > index f5d70c59f8..f943a2632c 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 > > ) > > { > > @@ -172,7 +175,10 @@ FvFindFile ( > // > > if (File->Type == FileType) { > > *FileHeader = File; > > - return EFI_SUCCESS; > > + if (Guid == NULL || CompareGuid(&File->Name, Guid)) { > > + *FileHeader = File; > > + return EFI_SUCCESS; > > + } > > } > > } > > > > @@ -266,7 +272,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 +289,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 +336,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 35098f5141..78a67fa1a5 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 > > @@ -149,4 +150,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..dcf750befc 100644 > --- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c > +++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c > @@ -25,6 +25,60 @@ > > > extern VOID *mHobList; > > > > +/** > > + Find DXE core from FV and build DXE core HOBs. > > + > > + @param[in] FvBase FV base to load DXE core from > > + @param[out] DxeCoreEntryPoint DXE core entry point > > + > > + @retval EFI_SUCCESS If it completed successfully. > > + @retval EFI_NOT_FOUND If it failed to load DXE FV. > > +**/ > > +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 +386,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.16.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#76866): https://edk2.groups.io/g/devel/message/76866 Mute This Topic: https://groups.io/mt/83669561/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-