]> git.proxmox.com Git - mirror_edk2.git/commitdiff
UefiPayloadPkg: Get and enter DxeCore for Universal Payload
authorZhiguang Liu <zhiguang.liu@intel.com>
Fri, 7 May 2021 07:41:59 +0000 (15:41 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Thu, 24 Jun 2021 09:16:22 +0000 (09:16 +0000)
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.ma@intel.com>
Cc: Guo Dong <guo.dong@intel.com>
Cc: Benjamin You <benjamin.you@intel.com>
Reviewed-by: Guo Dong <guo.dong@intel.com>
Signed-off-by: Zhiguang Liu <zhiguang.liu@intel.com>
UefiPayloadPkg/UefiPayloadEntry/LoadDxeCore.c
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c

index de9dbb0b0efd8ddb410ecbf6d983877ddc06754c..f5d70c59f8e3359022e6667dfb0e9b42082f5872 100644 (file)
@@ -305,3 +305,50 @@ LoadDxeCore (
 \r
   return EFI_SUCCESS;\r
 }\r
+\r
+/**\r
+  Find DXE core from FV and build DXE core HOBs.\r
+\r
+  @param[in]   DxeFv                 The FV where to find the DXE core.\r
+  @param[out]  DxeCoreEntryPoint     DXE core entry point\r
+\r
+  @retval EFI_SUCCESS        If it completed successfully.\r
+  @retval EFI_NOT_FOUND      If it failed to load DXE FV.\r
+**/\r
+EFI_STATUS\r
+UniversalLoadDxeCore (\r
+  IN  EFI_FIRMWARE_VOLUME_HEADER *DxeFv,\r
+  OUT PHYSICAL_ADDRESS           *DxeCoreEntryPoint\r
+  )\r
+{\r
+  EFI_STATUS                  Status;\r
+  EFI_FFS_FILE_HEADER         *FileHeader;\r
+  VOID                        *PeCoffImage;\r
+  EFI_PHYSICAL_ADDRESS        ImageAddress;\r
+  UINT64                      ImageSize;\r
+\r
+  //\r
+  // Find DXE core file from DXE FV\r
+  //\r
+  Status = FvFindFile (DxeFv, EFI_FV_FILETYPE_DXE_CORE, &FileHeader);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  Status = FileFindSection (FileHeader, EFI_SECTION_PE32, (VOID **)&PeCoffImage);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Get DXE core info\r
+  //\r
+  Status = LoadPeCoffImage (PeCoffImage, &ImageAddress, &ImageSize, DxeCoreEntryPoint);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  BuildModuleHob (&FileHeader->Name, ImageAddress, EFI_SIZE_TO_PAGES ((UINT32) ImageSize) * EFI_PAGE_SIZE, *DxeCoreEntryPoint);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
index 1ad7a37023a437a5e2905f5fe690195a2ab1151a..dff7b6b87f2cce927b209e12dff5a5009bee59d4 100644 (file)
@@ -33,6 +33,8 @@
 #include <Guid/GraphicsInfoHob.h>\r
 #include <UniversalPayload/SmbiosTable.h>\r
 #include <UniversalPayload/AcpiTable.h>\r
+#include <UniversalPayload/UniversalPayload.h>\r
+#include <UniversalPayload/ExtraData.h>\r
 \r
 #define LEGACY_8259_MASK_REGISTER_MASTER  0x21\r
 #define LEGACY_8259_MASK_REGISTER_SLAVE   0xA1\r
@@ -127,6 +129,21 @@ LoadDxeCore (
   OUT PHYSICAL_ADDRESS        *DxeCoreEntryPoint\r
   );\r
 \r
+/**\r
+  Find DXE core from FV and build DXE core HOBs.\r
+\r
+  @param[in]   DxeFv                 The FV where to find the DXE core.\r
+  @param[out]  DxeCoreEntryPoint     DXE core entry point\r
+\r
+  @retval EFI_SUCCESS        If it completed successfully.\r
+  @retval EFI_NOT_FOUND      If it failed to load DXE FV.\r
+**/\r
+EFI_STATUS\r
+UniversalLoadDxeCore (\r
+  IN  EFI_FIRMWARE_VOLUME_HEADER *DxeFv,\r
+  OUT PHYSICAL_ADDRESS           *DxeCoreEntryPoint\r
+  );\r
+\r
 /**\r
    Transfers control to DxeCore.\r
 \r
index 66e87bcb9b414e0f4474dca219a2715492ffc0e4..13f4587cd9899171e4e7f98e992be171a0bfa03b 100644 (file)
@@ -179,7 +179,8 @@ FindAnotherHighestBelow4GResourceDescriptor (
 **/\r
 EFI_STATUS\r
 BuildHobs (\r
-  IN UINTN                     BootloaderParameter\r
+  IN  UINTN                       BootloaderParameter,\r
+  OUT EFI_FIRMWARE_VOLUME_HEADER  **DxeFv\r
   )\r
 {\r
   EFI_PEI_HOB_POINTERS             Hob;\r
@@ -190,6 +191,9 @@ BuildHobs (
   EFI_PHYSICAL_ADDRESS             MemoryTop;\r
   EFI_HOB_RESOURCE_DESCRIPTOR      *PhitResourceHob;\r
   EFI_HOB_RESOURCE_DESCRIPTOR      *ResourceHob;\r
+  UNIVERSAL_PAYLOAD_EXTRA_DATA     *ExtraData;\r
+  UINT8                            *GuidHob;\r
+  EFI_HOB_FIRMWARE_VOLUME          *FvHob;\r
 \r
   Hob.Raw = (UINT8 *) BootloaderParameter;\r
   MinimalNeededSize = FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);\r
@@ -254,6 +258,10 @@ BuildHobs (
   // From now on, mHobList will point to the new Hob range.\r
   //\r
 \r
+  //\r
+  // Create an empty FvHob for the DXE FV that contains DXE core.\r
+  //\r
+  BuildFvHob ((EFI_PHYSICAL_ADDRESS) 0, 0);\r
   //\r
   // Since payload created new Hob, move all hobs except PHIT from boot loader hob list.\r
   //\r
@@ -265,6 +273,25 @@ BuildHobs (
     Hob.Raw = GET_NEXT_HOB (Hob);\r
   }\r
 \r
+  //\r
+  // Get DXE FV location\r
+  //\r
+  GuidHob = GetFirstGuidHob(&gUniversalPayloadExtraDataGuid);\r
+  ASSERT (GuidHob != NULL);\r
+  ExtraData = (UNIVERSAL_PAYLOAD_EXTRA_DATA *) GET_GUID_HOB_DATA (GuidHob);\r
+  ASSERT (ExtraData->Count == 1);\r
+  ASSERT (AsciiStrCmp (ExtraData->Entry[0].Identifier, "uefi_fv") == 0);\r
+\r
+  *DxeFv = (EFI_FIRMWARE_VOLUME_HEADER *) (UINTN) ExtraData->Entry[0].Base;\r
+  ASSERT ((*DxeFv)->FvLength == ExtraData->Entry[0].Size);\r
+\r
+  //\r
+  // Update DXE FV information to first fv hob in the hob list, which\r
+  // is the empty FvHob created before.\r
+  //\r
+  FvHob = GetFirstHob (EFI_HOB_TYPE_FV);\r
+  FvHob->BaseAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) *DxeFv;\r
+  FvHob->Length = (*DxeFv)->FvLength;\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -280,10 +307,13 @@ _ModuleEntryPoint (
   )\r
 {\r
   EFI_STATUS                    Status;\r
+  PHYSICAL_ADDRESS              DxeCoreEntryPoint;\r
   EFI_HOB_HANDOFF_INFO_TABLE    *HandoffHobTable;\r
   EFI_PEI_HOB_POINTERS          Hob;\r
+  EFI_FIRMWARE_VOLUME_HEADER    *DxeFv;\r
 \r
   mHobList = (VOID *) BootloaderParameter;\r
+  DxeFv    = NULL;\r
   // Call constructor for all libraries\r
   ProcessLibraryConstructorList ();\r
 \r
@@ -294,7 +324,11 @@ _ModuleEntryPoint (
   InitializeFloatingPointUnits ();\r
 \r
   // Build HOB based on information from Bootloader\r
-  Status = BuildHobs (BootloaderParameter);\r
+  Status = BuildHobs (BootloaderParameter, &DxeFv);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  Status = UniversalLoadDxeCore (DxeFv, &DxeCoreEntryPoint);\r
+  ASSERT_EFI_ERROR (Status);\r
 \r
   //\r
   // Mask off all legacy 8259 interrupt sources\r
@@ -304,6 +338,7 @@ _ModuleEntryPoint (
 \r
   HandoffHobTable = (EFI_HOB_HANDOFF_INFO_TABLE *) GetFirstHob(EFI_HOB_TYPE_HANDOFF);\r
   Hob.HandoffInformationTable = HandoffHobTable;\r
+  HandOffToDxeCore (DxeCoreEntryPoint, Hob);\r
 \r
   // Should not get here\r
   CpuDeadLoop ();\r
index 58ff87d9696f098b2536c9c9445d505034d65bd9..77cd25aafd5b584184368d2be9d4ef1025b92690 100644 (file)
@@ -62,6 +62,7 @@
   gEfiSmbiosTableGuid\r
   gEfiAcpiTableGuid\r
   gUefiSerialPortInfoGuid\r
+  gUniversalPayloadExtraDataGuid\r
 \r
 [FeaturePcd.IA32]\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode      ## CONSUMES\r
index 73ea30e7a2d82a3c05efacb2b3ca8425786445c7..dec87ee1ef2e3913cf59ca24db9e132311889bcb 100644 (file)
@@ -66,8 +66,8 @@ HandOffToDxeCore (
   //\r
   // Get the address and size of the GHCB pages\r
   //\r
-  GhcbBase = (VOID *) PcdGet64 (PcdGhcbBase);\r
-  GhcbSize = PcdGet64 (PcdGhcbSize);\r
+  GhcbBase = 0;\r
+  GhcbSize = 0;\r
 \r
   PageTables = 0;\r
   if (FeaturePcdGet (PcdDxeIplBuildPageTables)) {\r