Reviewed-by: Guo Dong <guo.d...@intel.com>
> -----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 06/12] UefiPayloadPkg: Get and enter DxeCore for Universal > Payload > > From gUniversalPayloadExtraDataGuid Guid Hob, get the Dxe FV information, > and get the Dxe Core from the FV. > Also, make sure if there are muliple FV hob, the FV hob pointing to this FV > will be the first in the hob list. > > 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 | 47 > +++++++++++++++++++++++++++++++++++++++++++++++ > UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h | 17 > +++++++++++++++++ > UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c | 44 > ++++++++++++++++++++++++++++++++++++++++++-- > UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf | 1 + > UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c | 4 ++-- > 5 files changed, 109 insertions(+), 4 deletions(-) > > diff --git a/UefiPayloadPkg/UefiPayloadEntry/LoadDxeCore.c > b/UefiPayloadPkg/UefiPayloadEntry/LoadDxeCore.c > index de9dbb0b0e..f5d70c59f8 100644 > --- a/UefiPayloadPkg/UefiPayloadEntry/LoadDxeCore.c > +++ b/UefiPayloadPkg/UefiPayloadEntry/LoadDxeCore.c > @@ -305,3 +305,50 @@ LoadDxeCore ( > > > return EFI_SUCCESS; > > } > > + > > +/** > > + Find DXE core from FV and build DXE core HOBs. > > + > > + @param[in] DxeFv The FV where to find the DXE core. > > + @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 > > +UniversalLoadDxeCore ( > > + IN EFI_FIRMWARE_VOLUME_HEADER *DxeFv, > > + OUT PHYSICAL_ADDRESS *DxeCoreEntryPoint > > + ) > > +{ > > + EFI_STATUS Status; > > + EFI_FFS_FILE_HEADER *FileHeader; > > + VOID *PeCoffImage; > > + EFI_PHYSICAL_ADDRESS ImageAddress; > > + UINT64 ImageSize; > > + > > + // > > + // Find DXE core file from DXE FV > > + // > > + Status = FvFindFile (DxeFv, EFI_FV_FILETYPE_DXE_CORE, &FileHeader); > > + if (EFI_ERROR (Status)) { > > + return Status; > > + } > > + > > + Status = FileFindSection (FileHeader, EFI_SECTION_PE32, (VOID > **)&PeCoffImage); > > + if (EFI_ERROR (Status)) { > > + return Status; > > + } > > + > > + // > > + // Get DXE core info > > + // > > + Status = LoadPeCoffImage (PeCoffImage, &ImageAddress, &ImageSize, > DxeCoreEntryPoint); > > + if (EFI_ERROR (Status)) { > > + return Status; > > + } > > + > > + BuildModuleHob (&FileHeader->Name, ImageAddress, > EFI_SIZE_TO_PAGES ((UINT32) ImageSize) * EFI_PAGE_SIZE, > *DxeCoreEntryPoint); > > + > > + return EFI_SUCCESS; > > +} > > diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h > b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h > index e9c3ec3073..35098f5141 100644 > --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h > +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h > @@ -33,6 +33,8 @@ > #include <Guid/GraphicsInfoHob.h> > > #include <UniversalPayload/SmbiosTable.h> > > #include <UniversalPayload/AcpiTable.h> > > +#include <UniversalPayload/UniversalPayload.h> > > +#include <UniversalPayload/ExtraData.h> > > > > #define LEGACY_8259_MASK_REGISTER_MASTER 0x21 > > #define LEGACY_8259_MASK_REGISTER_SLAVE 0xA1 > > @@ -117,6 +119,21 @@ LoadDxeCore ( > OUT PHYSICAL_ADDRESS *DxeCoreEntryPoint > > ); > > > > +/** > > + Find DXE core from FV and build DXE core HOBs. > > + > > + @param[in] DxeFv The FV where to find the DXE core. > > + @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 > > +UniversalLoadDxeCore ( > > + IN EFI_FIRMWARE_VOLUME_HEADER *DxeFv, > > + OUT PHYSICAL_ADDRESS *DxeCoreEntryPoint > > + ); > > + > > /** > > Transfers control to DxeCore. > > > > diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c > b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c > index 66e87bcb9b..9d59454486 100644 > --- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c > +++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c > @@ -179,7 +179,8 @@ FindAnotherHighestBelow4GResourceDescriptor ( > **/ > > EFI_STATUS > > BuildHobs ( > > - IN UINTN BootloaderParameter > > + IN UINTN BootloaderParameter, > > + OUT EFI_FIRMWARE_VOLUME_HEADER **DxeFv > > ) > > { > > EFI_PEI_HOB_POINTERS Hob; > > @@ -190,6 +191,10 @@ BuildHobs ( > EFI_PHYSICAL_ADDRESS MemoryTop; > > EFI_HOB_RESOURCE_DESCRIPTOR *PhitResourceHob; > > EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob; > > + UNIVERSAL_PAYLOAD_EXTRA_DATA *ExtraData; > > + UINT8 *GuidHob; > > + EFI_HOB_FIRMWARE_VOLUME *FvHob; > > + UNIVERSAL_PAYLOAD_GENERIC_HEADER *GenericHeader; > > > > Hob.Raw = (UINT8 *) BootloaderParameter; > > MinimalNeededSize = FixedPcdGet32 (PcdSystemMemoryUefiRegionSize); > > @@ -254,6 +259,10 @@ BuildHobs ( > // From now on, mHobList will point to the new Hob range. > > // > > > > + // > > + // Create an empty FvHob for the DXE FV that contains DXE core. > > + // > > + BuildFvHob ((EFI_PHYSICAL_ADDRESS) 0, 0); > > // > > // Since payload created new Hob, move all hobs except PHIT from boot > loader hob list. > > // > > @@ -265,6 +274,29 @@ BuildHobs ( > Hob.Raw = GET_NEXT_HOB (Hob); > > } > > > > + // > > + // Get DXE FV location > > + // > > + GuidHob = GetFirstGuidHob(&gUniversalPayloadExtraDataGuid); > > + ASSERT (GuidHob != NULL); > > + GenericHeader = (UNIVERSAL_PAYLOAD_GENERIC_HEADER *) > GET_GUID_HOB_DATA (GuidHob); > > + ASSERT (sizeof (UNIVERSAL_PAYLOAD_GENERIC_HEADER) <= > GET_GUID_HOB_DATA_SIZE (GuidHob)); > > + ASSERT (GenericHeader->Length <= GET_GUID_HOB_DATA_SIZE > (GuidHob)); > > + ASSERT (GenericHeader->Length >= (sizeof > (UNIVERSAL_PAYLOAD_EXTRA_DATA) + sizeof > (UNIVERSAL_PAYLOAD_EXTRA_DATA_ENTRY))); > > + ExtraData = (UNIVERSAL_PAYLOAD_EXTRA_DATA *) > GET_GUID_HOB_DATA (GuidHob); > > + ASSERT (ExtraData->Count == 1); > > + ASSERT (AsciiStrCmp (ExtraData->Entry[0].Identifier, "uefi_fv") == 0); > > + > > + *DxeFv = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) ExtraData- > >Entry[0].Base; > > + ASSERT ((*DxeFv)->FvLength == ExtraData->Entry[0].Size); > > + > > + // > > + // Update DXE FV information to first fv hob in the hob list, which > > + // is the empty FvHob created before. > > + // > > + FvHob = GetFirstHob (EFI_HOB_TYPE_FV); > > + FvHob->BaseAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) *DxeFv; > > + FvHob->Length = (*DxeFv)->FvLength; > > return EFI_SUCCESS; > > } > > > > @@ -280,10 +312,13 @@ _ModuleEntryPoint ( > ) > > { > > EFI_STATUS Status; > > + PHYSICAL_ADDRESS DxeCoreEntryPoint; > > EFI_HOB_HANDOFF_INFO_TABLE *HandoffHobTable; > > EFI_PEI_HOB_POINTERS Hob; > > + EFI_FIRMWARE_VOLUME_HEADER *DxeFv; > > > > mHobList = (VOID *) BootloaderParameter; > > + DxeFv = NULL; > > // Call constructor for all libraries > > ProcessLibraryConstructorList (); > > > > @@ -294,7 +329,11 @@ _ModuleEntryPoint ( > InitializeFloatingPointUnits (); > > > > // Build HOB based on information from Bootloader > > - Status = BuildHobs (BootloaderParameter); > > + Status = BuildHobs (BootloaderParameter, &DxeFv); > > + ASSERT_EFI_ERROR (Status); > > + > > + Status = UniversalLoadDxeCore (DxeFv, &DxeCoreEntryPoint); > > + ASSERT_EFI_ERROR (Status); > > > > // > > // Mask off all legacy 8259 interrupt sources > > @@ -304,6 +343,7 @@ _ModuleEntryPoint ( > > > HandoffHobTable = (EFI_HOB_HANDOFF_INFO_TABLE *) > GetFirstHob(EFI_HOB_TYPE_HANDOFF); > > Hob.HandoffInformationTable = HandoffHobTable; > > + HandOffToDxeCore (DxeCoreEntryPoint, Hob); > > > > // Should not get here > > CpuDeadLoop (); > > diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf > b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf > index 58ff87d969..77cd25aafd 100644 > --- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf > +++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf > @@ -62,6 +62,7 @@ > gEfiSmbiosTableGuid > > gEfiAcpiTableGuid > > gUefiSerialPortInfoGuid > > + gUniversalPayloadExtraDataGuid > > > > [FeaturePcd.IA32] > > gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ## > CONSUMES > > diff --git a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c > b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c > index 73ea30e7a2..dec87ee1ef 100644 > --- a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c > +++ b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c > @@ -66,8 +66,8 @@ HandOffToDxeCore ( > // > > // Get the address and size of the GHCB pages > > // > > - GhcbBase = (VOID *) PcdGet64 (PcdGhcbBase); > > - GhcbSize = PcdGet64 (PcdGhcbSize); > > + GhcbBase = 0; > > + GhcbSize = 0; > > > > PageTables = 0; > > if (FeaturePcdGet (PcdDxeIplBuildPageTables)) { > > -- > 2.16.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#76870): https://edk2.groups.io/g/devel/message/76870 Mute This Topic: https://groups.io/mt/83669560/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-