* [edk2-devel] [PATCH v4 6/6] UefiPayloadPkg: Update UefiPayload driver for FDT support.
@ 2024-06-03 2:19 Linus Liu
2024-06-03 11:27 ` Dhaval Sharma
0 siblings, 1 reply; 6+ messages in thread
From: Linus Liu @ 2024-06-03 2:19 UTC (permalink / raw)
To: devel; +Cc: Benny Lin, Gua Guo, Chasel Chiu, James Lu, Dhaval Sharma
Add FDT detection and comsume FDT when needed.
Move some x86 specific function in the x86 folder.
Create HandOffHob via FDT memory node.
Cc: Benny Lin <benny.lin@intel.com>
Cc: Gua Guo <gua.guo@intel.com>
Cc: Chasel Chiu <chasel.chiu@intel.com>
Cc: James Lu <james.lu@intel.com>
Cc: Dhaval Sharma <dhaval@rivosinc.com>
Signed-off-by: Linus Liu <linus.liu@intel.com>
---
UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c | 428 +++++++++-----------
UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c | 12 +
UefiPayloadPkg/UefiPayloadEntry/Ia32/{DxeLoadFunc.c => DxeLoadFuncFit.c} | 32 +-
UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c | 50 +++
UefiPayloadPkg/UefiPayloadEntry/PrintHob.c | 6 +-
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c | 6 -
UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c | 12 +
UefiPayloadPkg/UefiPayloadEntry/X64/{DxeLoadFunc.c => DxeLoadFuncFit.c} | 31 +-
UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf | 20 +-
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h | 68 ++++
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf | 16 +-
UefiPayloadPkg/UefiPayloadPkg.dsc | 29 +-
12 files changed, 443 insertions(+), 267 deletions(-)
diff --git a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
index eb0b325369a0..813d656950d1 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
@@ -6,6 +6,8 @@
#include "UefiPayloadEntry.h"
#include <Library/FdtLib.h>
#include <Guid/UniversalPayloadBase.h>
+#include <Guid/MemoryTypeInformation.h>
+#include <Library/FdtParserLib.h>
#define MEMORY_ATTRIBUTE_MASK (EFI_RESOURCE_ATTRIBUTE_PRESENT | \
EFI_RESOURCE_ATTRIBUTE_INITIALIZED | \
@@ -23,6 +25,15 @@
EFI_RESOURCE_ATTRIBUTE_INITIALIZED | \
EFI_RESOURCE_ATTRIBUTE_TESTED )
+EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {
+ { EfiACPIReclaimMemory, FixedPcdGet32 (PcdMemoryTypeEfiACPIReclaimMemory) },
+ { EfiACPIMemoryNVS, FixedPcdGet32 (PcdMemoryTypeEfiACPIMemoryNVS) },
+ { EfiReservedMemoryType, FixedPcdGet32 (PcdMemoryTypeEfiReservedMemoryType) },
+ { EfiRuntimeServicesData, FixedPcdGet32 (PcdMemoryTypeEfiRuntimeServicesData) },
+ { EfiRuntimeServicesCode, FixedPcdGet32 (PcdMemoryTypeEfiRuntimeServicesCode) },
+ { EfiMaxMemoryType, 0 }
+};
+
extern VOID *mHobList;
CHAR8 *mLineBuffer = NULL;
@@ -36,6 +47,78 @@ PrintHob (
IN CONST VOID *HobStart
);
+/**
+ Add HOB into HOB list
+ @param[in] Hob The HOB to be added into the HOB list.
+**/
+VOID
+AddNewHob (
+ IN EFI_PEI_HOB_POINTERS *Hob
+ );
+
+/**
+ Found the Resource Descriptor HOB that contains a range (Base, Top)
+ @param[in] HobList Hob start address
+ @param[in] Base Memory start address
+ @param[in] Top Memory end address.
+ @retval The pointer to the Resource Descriptor HOB.
+**/
+EFI_HOB_RESOURCE_DESCRIPTOR *
+FindResourceDescriptorByRange (
+ IN VOID *HobList,
+ IN EFI_PHYSICAL_ADDRESS Base,
+ IN EFI_PHYSICAL_ADDRESS Top
+ );
+
+/**
+ Find the highest below 4G memory resource descriptor, except the input Resource Descriptor.
+ @param[in] HobList Hob start address
+ @param[in] MinimalNeededSize Minimal needed size.
+ @param[in] ExceptResourceHob Ignore this Resource Descriptor.
+ @retval The pointer to the Resource Descriptor HOB.
+**/
+EFI_HOB_RESOURCE_DESCRIPTOR *
+FindAnotherHighestBelow4GResourceDescriptor (
+ IN VOID *HobList,
+ IN UINTN MinimalNeededSize,
+ IN EFI_HOB_RESOURCE_DESCRIPTOR *ExceptResourceHob
+ );
+
+/**
+ Check the HOB and decide if it is need inside Payload
+ Payload maintainer may make decision which HOB is need or needn't
+ Then add the check logic in the function.
+ @param[in] Hob The HOB to check
+ @retval TRUE If HOB is need inside Payload
+ @retval FALSE If HOB is needn't inside Payload
+**/
+BOOLEAN
+FitIsHobNeed (
+ EFI_PEI_HOB_POINTERS Hob
+ );
+
+/**
+ Check the HOB and decide if it is need inside Payload
+
+ Payload maintainer may make decision which HOB is need or needn't
+ Then add the check logic in the function.
+
+ @param[in] Hob The HOB to check
+
+ @retval TRUE If HOB is need inside Payload
+ @retval FALSE If HOB is needn't inside Payload
+**/
+BOOLEAN
+IsHobNeed (
+ EFI_PEI_HOB_POINTERS Hob
+ );
+
+VOID
+EFIAPI
+ProcessLibraryConstructorList (
+ VOID
+ );
+
/**
Find the first substring.
@param String Point to the string where to find the substring.
@@ -191,187 +274,6 @@ FixUpPcdDatabase (
return EFI_SUCCESS;
}
-/**
- Add HOB into HOB list
- @param[in] Hob The HOB to be added into the HOB list.
-**/
-VOID
-AddNewHob (
- IN EFI_PEI_HOB_POINTERS *Hob
- )
-{
- EFI_PEI_HOB_POINTERS NewHob;
-
- if (Hob->Raw == NULL) {
- return;
- }
-
- NewHob.Header = CreateHob (Hob->Header->HobType, Hob->Header->HobLength);
- ASSERT (NewHob.Header != NULL);
- if (NewHob.Header == NULL) {
- return;
- }
-
- CopyMem (NewHob.Header + 1, Hob->Header + 1, Hob->Header->HobLength - sizeof (EFI_HOB_GENERIC_HEADER));
-}
-
-/**
- Found the Resource Descriptor HOB that contains a range (Base, Top)
- @param[in] HobList Hob start address
- @param[in] Base Memory start address
- @param[in] Top Memory end address.
- @retval The pointer to the Resource Descriptor HOB.
-**/
-EFI_HOB_RESOURCE_DESCRIPTOR *
-FindResourceDescriptorByRange (
- IN VOID *HobList,
- IN EFI_PHYSICAL_ADDRESS Base,
- IN EFI_PHYSICAL_ADDRESS Top
- )
-{
- EFI_PEI_HOB_POINTERS Hob;
- EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
-
- for (Hob.Raw = (UINT8 *)HobList; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
- //
- // Skip all HOBs except Resource Descriptor HOBs
- //
- if (GET_HOB_TYPE (Hob) != EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
- continue;
- }
-
- //
- // Skip Resource Descriptor HOBs that do not describe tested system memory
- //
- ResourceHob = Hob.ResourceDescriptor;
- if (ResourceHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY) {
- continue;
- }
-
- if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) != TESTED_MEMORY_ATTRIBUTES) {
- continue;
- }
-
- //
- // Skip Resource Descriptor HOBs that do not contain the PHIT range EfiFreeMemoryBottom..EfiFreeMemoryTop
- //
- if (Base < ResourceHob->PhysicalStart) {
- continue;
- }
-
- if (Top > (ResourceHob->PhysicalStart + ResourceHob->ResourceLength)) {
- continue;
- }
-
- return ResourceHob;
- }
-
- return NULL;
-}
-
-/**
- Find the highest below 4G memory resource descriptor, except the input Resource Descriptor.
- @param[in] HobList Hob start address
- @param[in] MinimalNeededSize Minimal needed size.
- @param[in] ExceptResourceHob Ignore this Resource Descriptor.
- @retval The pointer to the Resource Descriptor HOB.
-**/
-EFI_HOB_RESOURCE_DESCRIPTOR *
-FindAnotherHighestBelow4GResourceDescriptor (
- IN VOID *HobList,
- IN UINTN MinimalNeededSize,
- IN EFI_HOB_RESOURCE_DESCRIPTOR *ExceptResourceHob
- )
-{
- EFI_PEI_HOB_POINTERS Hob;
- EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
- EFI_HOB_RESOURCE_DESCRIPTOR *ReturnResourceHob;
-
- ReturnResourceHob = NULL;
-
- for (Hob.Raw = (UINT8 *)HobList; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
- //
- // Skip all HOBs except Resource Descriptor HOBs
- //
- if (GET_HOB_TYPE (Hob) != EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
- continue;
- }
-
- //
- // Skip Resource Descriptor HOBs that do not describe tested system memory
- //
- ResourceHob = Hob.ResourceDescriptor;
- if (ResourceHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY) {
- continue;
- }
-
- if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) != TESTED_MEMORY_ATTRIBUTES) {
- continue;
- }
-
- //
- // Skip if the Resource Descriptor HOB equals to ExceptResourceHob
- //
- if (ResourceHob == ExceptResourceHob) {
- continue;
- }
-
- //
- // Skip Resource Descriptor HOBs that are beyond 4G
- //
- if ((ResourceHob->PhysicalStart + ResourceHob->ResourceLength) > BASE_4GB) {
- continue;
- }
-
- //
- // Skip Resource Descriptor HOBs that are too small
- //
- if (ResourceHob->ResourceLength < MinimalNeededSize) {
- continue;
- }
-
- //
- // Return the topest Resource Descriptor
- //
- if (ReturnResourceHob == NULL) {
- ReturnResourceHob = ResourceHob;
- } else {
- if (ReturnResourceHob->PhysicalStart < ResourceHob->PhysicalStart) {
- ReturnResourceHob = ResourceHob;
- }
- }
- }
-
- return ReturnResourceHob;
-}
-
-/**
- Check the HOB and decide if it is need inside Payload
- Payload maintainer may make decision which HOB is need or needn't
- Then add the check logic in the function.
- @param[in] Hob The HOB to check
- @retval TRUE If HOB is need inside Payload
- @retval FALSE If HOB is needn't inside Payload
-**/
-BOOLEAN
-IsHobNeed (
- EFI_PEI_HOB_POINTERS Hob
- )
-{
- if (Hob.Header->HobType == EFI_HOB_TYPE_HANDOFF) {
- return FALSE;
- }
-
- if (Hob.Header->HobType == EFI_HOB_TYPE_MEMORY_ALLOCATION) {
- if (CompareGuid (&Hob.MemoryAllocationModule->MemoryAllocationHeader.Name, &gEfiHobMemoryAllocModuleGuid)) {
- return FALSE;
- }
- }
-
- // Arrive here mean the HOB is need
- return TRUE;
-}
-
/**
It will build Fv HOBs based on information from bootloaders.
@param[out] DxeFv The pointer to the DXE FV in memory.
@@ -409,21 +311,25 @@ BuildFitLoadablesFvHob (
Status = FdtCheckHeader (Fdt);
if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_INFO, "FdtCheckHeader UPSUPPORTED\n"));
return EFI_UNSUPPORTED;
}
ConfigNode = FdtSubnodeOffsetNameLen (Fdt, 0, "configurations", (INT32)AsciiStrLen ("configurations"));
if (ConfigNode <= 0) {
+ DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob configurations EFI_NOT_FOUND\n"));
return EFI_NOT_FOUND;
}
Config1Node = FdtSubnodeOffsetNameLen (Fdt, ConfigNode, "conf-1", (INT32)AsciiStrLen ("conf-1"));
if (Config1Node <= 0) {
+ DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob conf-1 EFI_NOT_FOUND\n"));
return EFI_NOT_FOUND;
}
ImageNode = FdtSubnodeOffsetNameLen (Fdt, 0, "images", (INT32)AsciiStrLen ("images"));
if (ImageNode <= 0) {
+ DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob images EFI_NOT_FOUND\n"));
return EFI_NOT_FOUND;
}
@@ -467,31 +373,25 @@ BuildFitLoadablesFvHob (
}
/**
- It will build HOBs based on information from bootloaders.
- @param[in] BootloaderParameter The starting memory address of bootloader parameter block.
- @param[out] DxeFv The pointer to the DXE FV in memory.
- @retval EFI_SUCCESS If it completed successfully.
- @retval Others If it failed to build required HOBs.
+ *
+ Create new HOB for new HOB list
+
+ @param[in] BootloaderParameter The HOB to be added into the HOB list.
**/
-EFI_STATUS
-BuildHobs (
- IN UINTN BootloaderParameter,
- OUT EFI_FIRMWARE_VOLUME_HEADER **DxeFv
+VOID
+CreatNewHobForHoblist (
+ IN UINTN BootloaderParameter
)
{
- EFI_PEI_HOB_POINTERS Hob;
- UINTN MinimalNeededSize;
- EFI_PHYSICAL_ADDRESS FreeMemoryBottom;
- EFI_PHYSICAL_ADDRESS FreeMemoryTop;
- EFI_PHYSICAL_ADDRESS MemoryBottom;
- EFI_PHYSICAL_ADDRESS MemoryTop;
- EFI_HOB_RESOURCE_DESCRIPTOR *PhitResourceHob;
- EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
- UINT8 *GuidHob;
- EFI_HOB_FIRMWARE_VOLUME *FvHob;
- UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTable;
- ACPI_BOARD_INFO *AcpiBoardInfo;
- EFI_HOB_HANDOFF_INFO_TABLE *HobInfo;
+ EFI_PEI_HOB_POINTERS Hob;
+ UINTN MinimalNeededSize;
+ EFI_PHYSICAL_ADDRESS FreeMemoryBottom;
+ EFI_PHYSICAL_ADDRESS FreeMemoryTop;
+ EFI_PHYSICAL_ADDRESS MemoryBottom;
+ EFI_PHYSICAL_ADDRESS MemoryTop;
+ EFI_HOB_RESOURCE_DESCRIPTOR *PhitResourceHob;
+ EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
+ EFI_HOB_HANDOFF_INFO_TABLE *HobInfo;
Hob.Raw = (UINT8 *)BootloaderParameter;
MinimalNeededSize = FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);
@@ -512,7 +412,7 @@ BuildHobs (
//
ResourceHob = FindAnotherHighestBelow4GResourceDescriptor (Hob.Raw, MinimalNeededSize, NULL);
if (ResourceHob == NULL) {
- return EFI_NOT_FOUND;
+ return;
}
MemoryBottom = ResourceHob->PhysicalStart + ResourceHob->ResourceLength - MinimalNeededSize;
@@ -542,7 +442,7 @@ BuildHobs (
//
ResourceHob = FindAnotherHighestBelow4GResourceDescriptor (Hob.Raw, MinimalNeededSize, PhitResourceHob);
if (ResourceHob == NULL) {
- return EFI_NOT_FOUND;
+ return;
}
MemoryBottom = ResourceHob->PhysicalStart + ResourceHob->ResourceLength - MinimalNeededSize;
@@ -553,14 +453,7 @@ BuildHobs (
HobInfo = HobConstructor ((VOID *)(UINTN)MemoryBottom, (VOID *)(UINTN)MemoryTop, (VOID *)(UINTN)FreeMemoryBottom, (VOID *)(UINTN)FreeMemoryTop);
HobInfo->BootMode = Hob.HandoffInformationTable->BootMode;
- //
- // 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.
//
@@ -573,7 +466,57 @@ BuildHobs (
Hob.Raw = GET_NEXT_HOB (Hob);
}
- BuildFitLoadablesFvHob (DxeFv);
+ return;
+}
+
+/**
+ It will build HOBs based on information from bootloaders.
+ @param[in] NewFdtBase The pointer to New FdtBase.
+ @param[out] DxeFv The pointer to the DXE FV in memory.
+ @retval EFI_SUCCESS If it completed successfully.
+ @retval Others If it failed to build required HOBs.
+**/
+EFI_STATUS
+FitBuildHobs (
+ IN UINTN NewFdtBase,
+ OUT EFI_FIRMWARE_VOLUME_HEADER **DxeFv
+ )
+{
+ UINT8 *GuidHob;
+ UINT32 FdtSize;
+ EFI_HOB_FIRMWARE_VOLUME *FvHob;
+ UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTable;
+ ACPI_BOARD_INFO *AcpiBoardInfo;
+ UNIVERSAL_PAYLOAD_DEVICE_TREE *Fdt;
+
+ if (FixedPcdGetBool (PcdHandOffFdtEnable)) {
+ //
+ // Back up FDT in Reserved memory region
+ //
+
+ GuidHob = GetFirstGuidHob (&gUniversalPayloadDeviceTreeGuid);
+ if (GuidHob != NULL) {
+ Fdt = (UNIVERSAL_PAYLOAD_DEVICE_TREE *)GET_GUID_HOB_DATA (GuidHob);
+ if (Fdt != NULL) {
+ DEBUG ((DEBUG_INFO, "Update FDT base to reserved memory\n"));
+ FdtSize = 4 * EFI_PAGE_SIZE;
+ CopyMem ((VOID *)NewFdtBase, (VOID *)(Fdt->DeviceTreeAddress), FdtSize);
+ Fdt->DeviceTreeAddress = NewFdtBase;
+ }
+ }
+ }
+
+ //
+ // To create Memory Type Information HOB
+ //
+ GuidHob = GetFirstGuidHob (&gEfiMemoryTypeInformationGuid);
+ if (GuidHob == NULL) {
+ BuildGuidDataHob (
+ &gEfiMemoryTypeInformationGuid,
+ mDefaultMemoryTypeInformation,
+ sizeof (mDefaultMemoryTypeInformation)
+ );
+ }
//
// Create guid hob for acpi board information
@@ -588,6 +531,12 @@ BuildHobs (
}
}
+ //
+ // Create an empty FvHob for the DXE FV that contains DXE core.
+ //
+ BuildFvHob ((EFI_PHYSICAL_ADDRESS)0, 0);
+
+ BuildFitLoadablesFvHob (DxeFv);
//
// Update DXE FV information to first fv hob in the hob list, which
// is the empty FvHob created before.
@@ -600,12 +549,12 @@ BuildHobs (
/**
Entry point to the C language phase of UEFI payload.
- @param[in] BootloaderParameter The starting address of bootloader parameter block.
+ @param[in] BootloaderParameter The starting address of FDT .
@retval It will not return if SUCCESS, and return error when passing bootloader parameter.
**/
EFI_STATUS
EFIAPI
-_ModuleEntryPoint (
+FitUplEntryPoint (
IN UINTN BootloaderParameter
)
{
@@ -613,14 +562,46 @@ _ModuleEntryPoint (
PHYSICAL_ADDRESS DxeCoreEntryPoint;
EFI_PEI_HOB_POINTERS Hob;
EFI_FIRMWARE_VOLUME_HEADER *DxeFv;
+ PHYSICAL_ADDRESS HobListPtr;
+ VOID *FdtBase;
+ VOID *FdtBaseResvd;
- mHobList = (VOID *)BootloaderParameter;
- DxeFv = NULL;
+ if (FixedPcdGetBool (PcdHandOffFdtEnable)) {
+ mHobList = (VOID *)NULL;
+ } else {
+ mHobList = (VOID *)BootloaderParameter;
+ }
+
+ DxeFv = NULL;
// Call constructor for all libraries
ProcessLibraryConstructorList ();
DEBUG ((DEBUG_INFO, "Entering Universal Payload...\n"));
DEBUG ((DEBUG_INFO, "sizeof(UINTN) = 0x%x\n", sizeof (UINTN)));
+ DEBUG ((DEBUG_INFO, "BootloaderParameter = 0x%x\n", BootloaderParameter));
+
+ DEBUG ((DEBUG_INFO, "Start init Hobs...\n"));
+ HobListPtr = UplInitHob ((VOID *)BootloaderParameter);
+
+ //
+ // Found hob list node
+ //
+ if (HobListPtr != 0) {
+ FdtBase = (VOID *)BootloaderParameter;
+ if (FdtCheckHeader (FdtBase) == 0) {
+ CustomFdtNodeParser ((VOID *)FdtBase, (VOID *)HobListPtr);
+ } else {
+ CreatNewHobForHoblist (BootloaderParameter);
+ }
+
+ FdtBaseResvd = PayloadAllocatePages (4, EfiReservedMemoryType);
+
+ // Build HOB based on information from Bootloader
+ Status = FitBuildHobs ((UINTN)FdtBaseResvd, &DxeFv);
+ }
+
+ // Call constructor for all libraries again since hobs were built
+ ProcessLibraryConstructorList ();
DEBUG_CODE (
//
@@ -629,23 +610,10 @@ _ModuleEntryPoint (
PrintHob (mHobList);
);
- // Initialize floating point operating environment to be compliant with UEFI spec.
- InitializeFloatingPointUnits ();
-
- // Build HOB based on information from Bootloader
- Status = BuildHobs (BootloaderParameter, &DxeFv);
- ASSERT_EFI_ERROR (Status);
-
FixUpPcdDatabase (DxeFv);
Status = UniversalLoadDxeCore (DxeFv, &DxeCoreEntryPoint);
ASSERT_EFI_ERROR (Status);
- //
- // Mask off all legacy 8259 interrupt sources
- //
- IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
- IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
-
Hob.HandoffInformationTable = (EFI_HOB_HANDOFF_INFO_TABLE *)GetFirstHob (EFI_HOB_TYPE_HANDOFF);
HandOffToDxeCore (DxeCoreEntryPoint, Hob);
diff --git a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
index 61a9f01ec9e7..cf9c03a9a8e9 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
@@ -15,12 +15,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h>
#include <Library/HobLib.h>
+#include <Library/FdtLib.h>
#include "VirtualMemory.h"
#include "UefiPayloadEntry.h"
#define STACK_SIZE 0x20000
#define IDT_ENTRY_COUNT 32
+extern VOID *mHobList;
+
typedef struct _X64_IDT_TABLE {
//
// Reserved 4 bytes preceding PeiService and IdtTable,
@@ -268,6 +271,15 @@ HandOffToDxeCore (
UINT32 Index;
X64_IDT_TABLE *IdtTableForX64;
+ // Initialize floating point operating environment to be compliant with UEFI spec.
+ InitializeFloatingPointUnits ();
+
+ //
+ // Mask off all legacy 8259 interrupt sources
+ //
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
//
// Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
//
diff --git a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
similarity index 90%
copy from UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
copy to UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
index 61a9f01ec9e7..439d5bee0b8c 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
@@ -1,10 +1,8 @@
/** @file
Ia32-specific functionality for DxeLoad.
-Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>
-Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
-
-SPDX-License-Identifier: BSD-2-Clause-Patent
+ Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -15,12 +13,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h>
#include <Library/HobLib.h>
+#include <Library/FdtLib.h>
#include "VirtualMemory.h"
#include "UefiPayloadEntry.h"
#define STACK_SIZE 0x20000
#define IDT_ENTRY_COUNT 32
+extern VOID *mHobList;
+
typedef struct _X64_IDT_TABLE {
//
// Reserved 4 bytes preceding PeiService and IdtTable,
@@ -268,6 +269,15 @@ HandOffToDxeCore (
UINT32 Index;
X64_IDT_TABLE *IdtTableForX64;
+ // Initialize floating point operating environment to be compliant with UEFI spec.
+ InitializeFloatingPointUnits ();
+
+ //
+ // Mask off all legacy 8259 interrupt sources
+ //
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
//
// Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
//
@@ -379,3 +389,17 @@ HandOffToDxeCore (
CpuDeadLoop ();
}
}
+
+/**
+ Entry point to the C language phase of UEFI payload.
+ @param[in] BootloaderParameter The starting address of bootloader parameter block.
+ @retval It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+_ModuleEntryPoint (
+ IN UINTN BootloaderParameter
+ )
+{
+ return FitUplEntryPoint (BootloaderParameter);
+}
diff --git a/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c b/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
index 83936ae26e68..36edca81f997 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
@@ -10,6 +10,56 @@
#include "UefiPayloadEntry.h"
+/**
+ Allocates one or more pages of type EfiBootServicesData.
+
+ Allocates the number of pages of MemoryType and returns a pointer to the
+ allocated buffer. The buffer returned is aligned on a 4KB boundary.
+ If Pages is 0, then NULL is returned.
+ If there is not enough memory availble to satisfy the request, then NULL
+ is returned.
+
+ @param Pages The number of 4 KB pages to allocate.
+ @param MemoryType The MemoryType
+ @return A pointer to the allocated buffer or NULL if allocation fails.
+**/
+VOID *
+EFIAPI
+PayloadAllocatePages (
+ IN UINTN Pages,
+ IN EFI_MEMORY_TYPE MemoryType
+ )
+{
+ EFI_PEI_HOB_POINTERS Hob;
+ EFI_PHYSICAL_ADDRESS Offset;
+ EFI_HOB_HANDOFF_INFO_TABLE *HobTable;
+
+ Hob.Raw = GetHobList ();
+ HobTable = Hob.HandoffInformationTable;
+
+ if (Pages == 0) {
+ return NULL;
+ }
+
+ // Make sure allocation address is page alligned.
+ Offset = HobTable->EfiFreeMemoryTop & EFI_PAGE_MASK;
+ if (Offset != 0) {
+ HobTable->EfiFreeMemoryTop -= Offset;
+ }
+
+ //
+ // Check available memory for the allocation
+ //
+ if (HobTable->EfiFreeMemoryTop - ((Pages * EFI_PAGE_SIZE) + sizeof (EFI_HOB_MEMORY_ALLOCATION)) < HobTable->EfiFreeMemoryBottom) {
+ return NULL;
+ }
+
+ HobTable->EfiFreeMemoryTop -= Pages * EFI_PAGE_SIZE;
+ BuildMemoryAllocationHob (HobTable->EfiFreeMemoryTop, Pages * EFI_PAGE_SIZE, MemoryType);
+
+ return (VOID *)(UINTN)HobTable->EfiFreeMemoryTop;
+}
+
/**
Allocates one or more pages of type EfiBootServicesData.
diff --git a/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c b/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
index b63e93c07ec2..153d1b00f637 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
@@ -169,13 +169,13 @@ PrintMemoryAllocationHob (
}
/**
- Print the information in Resource Discriptor Hob.
+ Print the information in Resource Descriptor Hob.
@param[in] HobStart A pointer to HOB of type EFI_HOB_TYPE_RESOURCE_DESCRIPTOR.
@param[in] HobLength The Length in bytes of HOB of type EFI_HOB_TYPE_RESOURCE_DESCRIPTOR.
@retval EFI_SUCCESS If it completed successfully.
**/
EFI_STATUS
-PrintResourceDiscriptorHob (
+PrintResourceDescriptorHob (
IN VOID *HobStart,
IN UINT16 HobLength
)
@@ -620,7 +620,7 @@ PrintFv3Hob (
HOB_PRINT_HANDLER_TABLE mHobHandles[] = {
{ EFI_HOB_TYPE_HANDOFF, "EFI_HOB_TYPE_HANDOFF", PrintHandOffHob },
{ EFI_HOB_TYPE_MEMORY_ALLOCATION, "EFI_HOB_TYPE_MEMORY_ALLOCATION", PrintMemoryAllocationHob },
- { EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, "EFI_HOB_TYPE_RESOURCE_DESCRIPTOR", PrintResourceDiscriptorHob },
+ { EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, "EFI_HOB_TYPE_RESOURCE_DESCRIPTOR", PrintResourceDescriptorHob },
{ EFI_HOB_TYPE_GUID_EXTENSION, "EFI_HOB_TYPE_GUID_EXTENSION", PrintGuidHob },
{ EFI_HOB_TYPE_FV, "EFI_HOB_TYPE_FV", PrintFvHob },
{ EFI_HOB_TYPE_CPU, "EFI_HOB_TYPE_CPU", PrintCpuHob },
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
index f37c00fad774..5b864eeefe10 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
@@ -486,12 +486,6 @@ _ModuleEntryPoint (
Status = UniversalLoadDxeCore (DxeFv, &DxeCoreEntryPoint);
ASSERT_EFI_ERROR (Status);
- //
- // Mask off all legacy 8259 interrupt sources
- //
- IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
- IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
-
Hob.HandoffInformationTable = (EFI_HOB_HANDOFF_INFO_TABLE *)GetFirstHob (EFI_HOB_TYPE_HANDOFF);
HandOffToDxeCore (DxeCoreEntryPoint, Hob);
diff --git a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
index 346e3feb0459..6c3603f12098 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
@@ -13,10 +13,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h>
#include <Library/HobLib.h>
+#include <Library/FdtLib.h>
#include "X64/VirtualMemory.h"
#include "UefiPayloadEntry.h"
#define STACK_SIZE 0x20000
+extern VOID *mHobList;
+
/**
Transfers control to DxeCore.
@@ -40,6 +43,15 @@ HandOffToDxeCore (
VOID *GhcbBase;
UINTN GhcbSize;
+ // Initialize floating point operating environment to be compliant with UEFI spec.
+ InitializeFloatingPointUnits ();
+
+ //
+ // Mask off all legacy 8259 interrupt sources
+ //
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
//
// Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
//
diff --git a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
similarity index 74%
copy from UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
copy to UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
index 346e3feb0459..35b52a911df3 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
@@ -1,8 +1,8 @@
/** @file
x64-specifc functionality for DxeLoad.
-Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
+ Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -13,10 +13,14 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h>
#include <Library/HobLib.h>
+#include <Library/FdtLib.h>
+#include <Library/PcdLib.h>
#include "X64/VirtualMemory.h"
#include "UefiPayloadEntry.h"
#define STACK_SIZE 0x20000
+extern VOID *mHobList;
+
/**
Transfers control to DxeCore.
@@ -40,6 +44,15 @@ HandOffToDxeCore (
VOID *GhcbBase;
UINTN GhcbSize;
+ // Initialize floating point operating environment to be compliant with UEFI spec.
+ InitializeFloatingPointUnits ();
+
+ //
+ // Mask off all legacy 8259 interrupt sources
+ //
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
//
// Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
//
@@ -106,3 +119,17 @@ HandOffToDxeCore (
TopOfStack
);
}
+
+/**
+ Entry point to the C language phase of UEFI payload.
+ @param[in] BootloaderParameter The starting address of bootloader parameter block.
+ @retval It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+_ModuleEntryPoint (
+ IN UINTN BootloaderParameter
+ )
+{
+ return FitUplEntryPoint (BootloaderParameter);
+}
diff --git a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
index b87a0989eee3..c87e674f7cbd 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
+++ b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
@@ -30,13 +30,13 @@
[Sources.Ia32]
X64/VirtualMemory.h
X64/VirtualMemory.c
- Ia32/DxeLoadFunc.c
+ Ia32/DxeLoadFuncFit.c
Ia32/IdtVectorAsm.nasm
[Sources.X64]
X64/VirtualMemory.h
X64/VirtualMemory.c
- X64/DxeLoadFunc.c
+ X64/DxeLoadFuncFit.c
[Packages]
MdePkg/MdePkg.dec
@@ -54,6 +54,8 @@
PeCoffLib
CpuLib
FdtLib
+ CustomFdtNodeParserLib
+ PcdLib
[Guids]
gEfiMemoryTypeInformationGuid
@@ -71,6 +73,7 @@
gUniversalPayloadAcpiTableGuid
gUniversalPayloadPciRootBridgeInfoGuid
gUniversalPayloadSmbios3TableGuid
+ gUniversalPayloadDeviceTreeGuid
[FeaturePcd.IA32]
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ## CONSUMES
@@ -78,7 +81,6 @@
[FeaturePcd.X64]
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables ## CONSUMES
-
[Pcd.IA32,Pcd.X64]
gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile
gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable ## SOMETIMES_CONSUMES
@@ -88,11 +90,19 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbBase ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbSize ## CONSUMES
-
gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemBase
gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemSize
gUefiPayloadPkgTokenSpaceGuid.PcdSystemMemoryUefiRegionSize
-
gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy ## SOMETIMES_CONSUMES
+ gUefiPayloadPkgTokenSpaceGuid.PcdHandOffFdtEnable
+ gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiACPIMemoryNVS
+ gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiACPIReclaimMemory
+ gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiReservedMemoryType
+ gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesData
+ gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesCode
+
+[BuildOptions]
+ MSFT:*_*_*_CC_FLAGS = /wd4244 /wd4305
+ GCC:*_*_*_CC_FLAGS = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
index 80ccc5072c55..09fce8dbcf35 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
+++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
@@ -35,6 +35,7 @@
#include <UniversalPayload/UniversalPayload.h>
#include <UniversalPayload/ExtraData.h>
#include <UniversalPayload/SerialPortInfo.h>
+#include <UniversalPayload/DeviceTree.h>
#include <Guid/PcdDataBaseSignatureGuid.h>
#define LEGACY_8259_MASK_REGISTER_MASTER 0x21
@@ -134,6 +135,31 @@ UniversalLoadDxeCore (
OUT PHYSICAL_ADDRESS *DxeCoreEntryPoint
);
+/**
+ It will Parse FDT -node based on information.
+ @param[in] FdtBase The starting memory address of FdtBase
+ @retval HobList The base address of Hoblist.
+
+**/
+UINT64
+EFIAPI
+FdtNodeParser (
+ IN VOID *FdtBase
+ );
+
+/**
+ It will Parse FDT -custom node based on information.
+ @param[in] FdtBase The starting memory address of FdtBase
+ @param[in] HostList The starting memory address of New Hob list.
+
+**/
+UINTN
+EFIAPI
+CustomFdtNodeParser (
+ IN VOID *FdtBase,
+ IN VOID *HostList
+ );
+
/**
Transfers control to DxeCore.
@@ -206,4 +232,46 @@ BuildHobFromAcpi (
IN UINT64 AcpiTableBase
);
+/**
+ Allocates one or more pages .
+
+ Allocates the number of pages of MemoryType and returns a pointer to the
+ allocated buffer. The buffer returned is aligned on a 4KB boundary.
+ If Pages is 0, then NULL is returned.
+ If there is not enough memory availble to satisfy the request, then NULL
+ is returned.
+
+ @param Pages The number of 4 KB pages to allocate.
+ @param MemoryType The Memorytype
+ @return A pointer to the allocated buffer or NULL if allocation fails.
+**/
+VOID *
+EFIAPI
+PayloadAllocatePages (
+ IN UINTN Pages,
+ IN EFI_MEMORY_TYPE MemoryType
+ );
+
+/**
+ Entry point to the C language phase of UEFI payload.
+ @param[in] FdtPrt The starting address of FDT .
+ @retval It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+FitUplEntryPoint (
+ IN UINTN BootloaderParameter
+ );
+
+/**
+ Entry point to the C language phase of UEFI payload.
+ @param[in] BootloaderParameter The starting address of bootloader parameter block.
+ @retval It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+UplEntryPoint (
+ IN UINTN BootloaderParameter
+ );
+
#endif
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
index a62da5c7059d..be91f7be2819 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
+++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
@@ -6,44 +6,37 @@
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
##
-
[Defines]
INF_VERSION = 1.30
BASE_NAME = UniversalPayloadEntry
FILE_GUID = D4F0F269-1209-4A66-8039-C4D5A700EA4E
MODULE_TYPE = SEC
VERSION_STRING = 1.0
-
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64
#
-
[Sources]
UniversalPayloadEntry.c
LoadDxeCore.c
MemoryAllocation.c
PrintHob.c
AcpiTable.c
-
[Sources.Ia32]
X64/VirtualMemory.h
X64/VirtualMemory.c
Ia32/DxeLoadFunc.c
Ia32/IdtVectorAsm.nasm
-
[Sources.X64]
X64/VirtualMemory.h
X64/VirtualMemory.c
X64/DxeLoadFunc.c
-
[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
UefiCpuPkg/UefiCpuPkg.dec
UefiPayloadPkg/UefiPayloadPkg.dec
-
[LibraryClasses]
BaseMemoryLib
DebugLib
@@ -69,14 +62,12 @@
gUniversalPayloadAcpiTableGuid
gUniversalPayloadPciRootBridgeInfoGuid
gUniversalPayloadSmbios3TableGuid
-
+ gUniversalPayloadBaseGuid
+ gUniversalPayloadDeviceTreeGuid
[FeaturePcd.IA32]
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ## CONSUMES
-
[FeaturePcd.X64]
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables ## CONSUMES
-
-
[Pcd.IA32,Pcd.X64]
gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile
gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable ## SOMETIMES_CONSUMES
@@ -86,12 +77,9 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbBase ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbSize ## CONSUMES
-
gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemBase
gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemSize
gUefiPayloadPkgTokenSpaceGuid.PcdSystemMemoryUefiRegionSize
-
gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy ## SOMETIMES_CONSUMES
-
diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc
index 2860a659f6a7..779f74da7171 100644
--- a/UefiPayloadPkg/UefiPayloadPkg.dsc
+++ b/UefiPayloadPkg/UefiPayloadPkg.dsc
@@ -55,7 +55,7 @@
# ELF: Build UniversalPayload file as UniversalPayload.elf
# FIT: Build UniversalPayload file as UniversalPayload.fit
#
- DEFINE UNIVERSAL_PAYLOAD = FALSE
+ DEFINE UNIVERSAL_PAYLOAD = TRUE
DEFINE UNIVERSAL_PAYLOAD_FORMAT = ELF
#
@@ -226,6 +226,7 @@
OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
RngLib|MdePkg/Library/BaseRngLib/BaseRngLib.inf
HobLib|UefiPayloadPkg/Library/DxeHobLib/DxeHobLib.inf
+ CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserNullLib/CustomFdtNodeParserNullLib.inf
#
# UEFI & PI
@@ -470,6 +471,8 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress|0x0
gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory|FALSE
gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable|TRUE
+ gUefiPayloadPkgTokenSpaceGuid.PcdHandOffFdtEnable|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 }
@@ -513,7 +516,15 @@
!endif
!endif
+
[PcdsPatchableInModule.X64]
+ #
+ # The following parameters are set by Library/PlatformHookLib
+ #
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio|FALSE
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase|0x3F8
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialBaudRate|$(BAUD_RATE)
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterStride|1
!if $(NETWORK_DRIVER_ENABLE) == TRUE
gEfiNetworkPkgTokenSpaceGuid.PcdAllowHttpConnections|TRUE
!endif
@@ -635,7 +646,13 @@
!if $(UNIVERSAL_PAYLOAD_FORMAT) == "ELF"
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
!elseif $(UNIVERSAL_PAYLOAD_FORMAT) == "FIT"
- UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
+ UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf {
+ <LibraryClasses>
+ FdtLib|MdePkg/Library/BaseFdtLib/BaseFdtLib.inf
+ CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserLib/CustomFdtNodeParserLib.inf
+ NULL|UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf
+ NULL|UefiPayloadPkg/Library/HobParseLib/HobParseLib.inf
+ }
!else
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
!endif
@@ -648,7 +665,13 @@
!if $(UNIVERSAL_PAYLOAD_FORMAT) == "ELF"
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
!elseif $(UNIVERSAL_PAYLOAD_FORMAT) == "FIT"
- UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
+ UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf {
+ <LibraryClasses>
+ FdtLib|MdePkg/Library/BaseFdtLib/BaseFdtLib.inf
+ CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserLib/CustomFdtNodeParserLib.inf
+ NULL|UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf
+ NULL|UefiPayloadPkg/Library/HobParseLib/HobParseLib.inf
+ }
!else
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
!endif
--
2.39.2.windows.1
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#119421): https://edk2.groups.io/g/devel/message/119421
Mute This Topic: https://groups.io/mt/106455168/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [edk2-devel] [PATCH v4 6/6] UefiPayloadPkg: Update UefiPayload driver for FDT support.
2024-06-03 2:19 [edk2-devel] [PATCH v4 6/6] UefiPayloadPkg: Update UefiPayload driver for FDT support Linus Liu
@ 2024-06-03 11:27 ` Dhaval Sharma
2024-06-04 17:18 ` Dhaval Sharma
2024-06-04 23:10 ` Chiu, Chasel
0 siblings, 2 replies; 6+ messages in thread
From: Dhaval Sharma @ 2024-06-03 11:27 UTC (permalink / raw)
To: Linus Liu; +Cc: devel, Benny Lin, Gua Guo, Chasel Chiu, James Lu
[-- Attachment #1: Type: text/plain, Size: 44944 bytes --]
BuildFitLoadablesFvHob:
- Fdt variable is not initialized.
- It ONLY gets initialized if GuidHob is found. What if it is not found?
- FdtCheckHeader still evaluating it?
On Mon, Jun 3, 2024 at 7:49 AM Linus Liu <linus.liu@intel.com> wrote:
> Add FDT detection and comsume FDT when needed.
> Move some x86 specific function in the x86 folder.
> Create HandOffHob via FDT memory node.
>
> Cc: Benny Lin <benny.lin@intel.com>
> Cc: Gua Guo <gua.guo@intel.com>
> Cc: Chasel Chiu <chasel.chiu@intel.com>
> Cc: James Lu <james.lu@intel.com>
> Cc: Dhaval Sharma <dhaval@rivosinc.com>
>
> Signed-off-by: Linus Liu <linus.liu@intel.com>
> ---
> UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
> | 428 +++++++++-----------
> UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
> | 12 +
> UefiPayloadPkg/UefiPayloadEntry/Ia32/{DxeLoadFunc.c => DxeLoadFuncFit.c}
> | 32 +-
> UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
> | 50 +++
> UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
> | 6 +-
> UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
> | 6 -
> UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
> | 12 +
> UefiPayloadPkg/UefiPayloadEntry/X64/{DxeLoadFunc.c => DxeLoadFuncFit.c}
> | 31 +-
> UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
> | 20 +-
> UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
> | 68 ++++
> UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
> | 16 +-
> UefiPayloadPkg/UefiPayloadPkg.dsc
> | 29 +-
> 12 files changed, 443 insertions(+), 267 deletions(-)
>
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
> b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
> index eb0b325369a0..813d656950d1 100644
> --- a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
> +++ b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
> @@ -6,6 +6,8 @@
> #include "UefiPayloadEntry.h"
> #include <Library/FdtLib.h>
> #include <Guid/UniversalPayloadBase.h>
> +#include <Guid/MemoryTypeInformation.h>
> +#include <Library/FdtParserLib.h>
>
> #define MEMORY_ATTRIBUTE_MASK (EFI_RESOURCE_ATTRIBUTE_PRESENT
> | \
>
> EFI_RESOURCE_ATTRIBUTE_INITIALIZED | \
> @@ -23,6 +25,15 @@
> EFI_RESOURCE_ATTRIBUTE_INITIALIZED
> | \
> EFI_RESOURCE_ATTRIBUTE_TESTED
> )
>
> +EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {
> + { EfiACPIReclaimMemory, FixedPcdGet32
> (PcdMemoryTypeEfiACPIReclaimMemory) },
> + { EfiACPIMemoryNVS, FixedPcdGet32
> (PcdMemoryTypeEfiACPIMemoryNVS) },
> + { EfiReservedMemoryType, FixedPcdGet32
> (PcdMemoryTypeEfiReservedMemoryType) },
> + { EfiRuntimeServicesData, FixedPcdGet32
> (PcdMemoryTypeEfiRuntimeServicesData) },
> + { EfiRuntimeServicesCode, FixedPcdGet32
> (PcdMemoryTypeEfiRuntimeServicesCode) },
> + { EfiMaxMemoryType, 0
> }
> +};
> +
> extern VOID *mHobList;
>
> CHAR8 *mLineBuffer = NULL;
> @@ -36,6 +47,78 @@ PrintHob (
> IN CONST VOID *HobStart
> );
>
> +/**
> + Add HOB into HOB list
> + @param[in] Hob The HOB to be added into the HOB list.
> +**/
> +VOID
> +AddNewHob (
> + IN EFI_PEI_HOB_POINTERS *Hob
> + );
> +
> +/**
> + Found the Resource Descriptor HOB that contains a range (Base, Top)
> + @param[in] HobList Hob start address
> + @param[in] Base Memory start address
> + @param[in] Top Memory end address.
> + @retval The pointer to the Resource Descriptor HOB.
> +**/
> +EFI_HOB_RESOURCE_DESCRIPTOR *
> +FindResourceDescriptorByRange (
> + IN VOID *HobList,
> + IN EFI_PHYSICAL_ADDRESS Base,
> + IN EFI_PHYSICAL_ADDRESS Top
> + );
> +
> +/**
> + Find the highest below 4G memory resource descriptor, except the input
> Resource Descriptor.
> + @param[in] HobList Hob start address
> + @param[in] MinimalNeededSize Minimal needed size.
> + @param[in] ExceptResourceHob Ignore this Resource Descriptor.
> + @retval The pointer to the Resource Descriptor HOB.
> +**/
> +EFI_HOB_RESOURCE_DESCRIPTOR *
> +FindAnotherHighestBelow4GResourceDescriptor (
> + IN VOID *HobList,
> + IN UINTN MinimalNeededSize,
> + IN EFI_HOB_RESOURCE_DESCRIPTOR *ExceptResourceHob
> + );
> +
> +/**
> + Check the HOB and decide if it is need inside Payload
> + Payload maintainer may make decision which HOB is need or needn't
> + Then add the check logic in the function.
> + @param[in] Hob The HOB to check
> + @retval TRUE If HOB is need inside Payload
> + @retval FALSE If HOB is needn't inside Payload
> +**/
> +BOOLEAN
> +FitIsHobNeed (
> + EFI_PEI_HOB_POINTERS Hob
> + );
> +
> +/**
> + Check the HOB and decide if it is need inside Payload
> +
> + Payload maintainer may make decision which HOB is need or needn't
> + Then add the check logic in the function.
> +
> + @param[in] Hob The HOB to check
> +
> + @retval TRUE If HOB is need inside Payload
> + @retval FALSE If HOB is needn't inside Payload
> +**/
> +BOOLEAN
> +IsHobNeed (
> + EFI_PEI_HOB_POINTERS Hob
> + );
> +
> +VOID
> +EFIAPI
> +ProcessLibraryConstructorList (
> + VOID
> + );
> +
> /**
> Find the first substring.
> @param String Point to the string where to find the substring.
> @@ -191,187 +274,6 @@ FixUpPcdDatabase (
> return EFI_SUCCESS;
> }
>
> -/**
> - Add HOB into HOB list
> - @param[in] Hob The HOB to be added into the HOB list.
> -**/
> -VOID
> -AddNewHob (
> - IN EFI_PEI_HOB_POINTERS *Hob
> - )
> -{
> - EFI_PEI_HOB_POINTERS NewHob;
> -
> - if (Hob->Raw == NULL) {
> - return;
> - }
> -
> - NewHob.Header = CreateHob (Hob->Header->HobType,
> Hob->Header->HobLength);
> - ASSERT (NewHob.Header != NULL);
> - if (NewHob.Header == NULL) {
> - return;
> - }
> -
> - CopyMem (NewHob.Header + 1, Hob->Header + 1, Hob->Header->HobLength -
> sizeof (EFI_HOB_GENERIC_HEADER));
> -}
> -
> -/**
> - Found the Resource Descriptor HOB that contains a range (Base, Top)
> - @param[in] HobList Hob start address
> - @param[in] Base Memory start address
> - @param[in] Top Memory end address.
> - @retval The pointer to the Resource Descriptor HOB.
> -**/
> -EFI_HOB_RESOURCE_DESCRIPTOR *
> -FindResourceDescriptorByRange (
> - IN VOID *HobList,
> - IN EFI_PHYSICAL_ADDRESS Base,
> - IN EFI_PHYSICAL_ADDRESS Top
> - )
> -{
> - EFI_PEI_HOB_POINTERS Hob;
> - EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
> -
> - for (Hob.Raw = (UINT8 *)HobList; !END_OF_HOB_LIST (Hob); Hob.Raw =
> GET_NEXT_HOB (Hob)) {
> - //
> - // Skip all HOBs except Resource Descriptor HOBs
> - //
> - if (GET_HOB_TYPE (Hob) != EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
> - continue;
> - }
> -
> - //
> - // Skip Resource Descriptor HOBs that do not describe tested system
> memory
> - //
> - ResourceHob = Hob.ResourceDescriptor;
> - if (ResourceHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY) {
> - continue;
> - }
> -
> - if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) !=
> TESTED_MEMORY_ATTRIBUTES) {
> - continue;
> - }
> -
> - //
> - // Skip Resource Descriptor HOBs that do not contain the PHIT range
> EfiFreeMemoryBottom..EfiFreeMemoryTop
> - //
> - if (Base < ResourceHob->PhysicalStart) {
> - continue;
> - }
> -
> - if (Top > (ResourceHob->PhysicalStart + ResourceHob->ResourceLength))
> {
> - continue;
> - }
> -
> - return ResourceHob;
> - }
> -
> - return NULL;
> -}
> -
> -/**
> - Find the highest below 4G memory resource descriptor, except the input
> Resource Descriptor.
> - @param[in] HobList Hob start address
> - @param[in] MinimalNeededSize Minimal needed size.
> - @param[in] ExceptResourceHob Ignore this Resource Descriptor.
> - @retval The pointer to the Resource Descriptor HOB.
> -**/
> -EFI_HOB_RESOURCE_DESCRIPTOR *
> -FindAnotherHighestBelow4GResourceDescriptor (
> - IN VOID *HobList,
> - IN UINTN MinimalNeededSize,
> - IN EFI_HOB_RESOURCE_DESCRIPTOR *ExceptResourceHob
> - )
> -{
> - EFI_PEI_HOB_POINTERS Hob;
> - EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
> - EFI_HOB_RESOURCE_DESCRIPTOR *ReturnResourceHob;
> -
> - ReturnResourceHob = NULL;
> -
> - for (Hob.Raw = (UINT8 *)HobList; !END_OF_HOB_LIST (Hob); Hob.Raw =
> GET_NEXT_HOB (Hob)) {
> - //
> - // Skip all HOBs except Resource Descriptor HOBs
> - //
> - if (GET_HOB_TYPE (Hob) != EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
> - continue;
> - }
> -
> - //
> - // Skip Resource Descriptor HOBs that do not describe tested system
> memory
> - //
> - ResourceHob = Hob.ResourceDescriptor;
> - if (ResourceHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY) {
> - continue;
> - }
> -
> - if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) !=
> TESTED_MEMORY_ATTRIBUTES) {
> - continue;
> - }
> -
> - //
> - // Skip if the Resource Descriptor HOB equals to ExceptResourceHob
> - //
> - if (ResourceHob == ExceptResourceHob) {
> - continue;
> - }
> -
> - //
> - // Skip Resource Descriptor HOBs that are beyond 4G
> - //
> - if ((ResourceHob->PhysicalStart + ResourceHob->ResourceLength) >
> BASE_4GB) {
> - continue;
> - }
> -
> - //
> - // Skip Resource Descriptor HOBs that are too small
> - //
> - if (ResourceHob->ResourceLength < MinimalNeededSize) {
> - continue;
> - }
> -
> - //
> - // Return the topest Resource Descriptor
> - //
> - if (ReturnResourceHob == NULL) {
> - ReturnResourceHob = ResourceHob;
> - } else {
> - if (ReturnResourceHob->PhysicalStart < ResourceHob->PhysicalStart) {
> - ReturnResourceHob = ResourceHob;
> - }
> - }
> - }
> -
> - return ReturnResourceHob;
> -}
> -
> -/**
> - Check the HOB and decide if it is need inside Payload
> - Payload maintainer may make decision which HOB is need or needn't
> - Then add the check logic in the function.
> - @param[in] Hob The HOB to check
> - @retval TRUE If HOB is need inside Payload
> - @retval FALSE If HOB is needn't inside Payload
> -**/
> -BOOLEAN
> -IsHobNeed (
> - EFI_PEI_HOB_POINTERS Hob
> - )
> -{
> - if (Hob.Header->HobType == EFI_HOB_TYPE_HANDOFF) {
> - return FALSE;
> - }
> -
> - if (Hob.Header->HobType == EFI_HOB_TYPE_MEMORY_ALLOCATION) {
> - if (CompareGuid
> (&Hob.MemoryAllocationModule->MemoryAllocationHeader.Name,
> &gEfiHobMemoryAllocModuleGuid)) {
> - return FALSE;
> - }
> - }
> -
> - // Arrive here mean the HOB is need
> - return TRUE;
> -}
> -
> /**
> It will build Fv HOBs based on information from bootloaders.
> @param[out] DxeFv The pointer to the DXE FV in memory.
> @@ -409,21 +311,25 @@ BuildFitLoadablesFvHob (
>
> Status = FdtCheckHeader (Fdt);
> if (EFI_ERROR (Status)) {
> + DEBUG ((DEBUG_INFO, "FdtCheckHeader UPSUPPORTED\n"));
> return EFI_UNSUPPORTED;
> }
>
> ConfigNode = FdtSubnodeOffsetNameLen (Fdt, 0, "configurations",
> (INT32)AsciiStrLen ("configurations"));
> if (ConfigNode <= 0) {
> + DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob configurations
> EFI_NOT_FOUND\n"));
> return EFI_NOT_FOUND;
> }
>
> Config1Node = FdtSubnodeOffsetNameLen (Fdt, ConfigNode, "conf-1",
> (INT32)AsciiStrLen ("conf-1"));
> if (Config1Node <= 0) {
> + DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob conf-1 EFI_NOT_FOUND\n"));
> return EFI_NOT_FOUND;
> }
>
> ImageNode = FdtSubnodeOffsetNameLen (Fdt, 0, "images",
> (INT32)AsciiStrLen ("images"));
> if (ImageNode <= 0) {
> + DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob images EFI_NOT_FOUND\n"));
> return EFI_NOT_FOUND;
> }
>
> @@ -467,31 +373,25 @@ BuildFitLoadablesFvHob (
> }
>
> /**
> - It will build HOBs based on information from bootloaders.
> - @param[in] BootloaderParameter The starting memory address of
> bootloader parameter block.
> - @param[out] DxeFv The pointer to the DXE FV in memory.
> - @retval EFI_SUCCESS If it completed successfully.
> - @retval Others If it failed to build required HOBs.
> + *
> + Create new HOB for new HOB list
> +
> + @param[in] BootloaderParameter The HOB to be added into the HOB list.
> **/
> -EFI_STATUS
> -BuildHobs (
> - IN UINTN BootloaderParameter,
> - OUT EFI_FIRMWARE_VOLUME_HEADER **DxeFv
> +VOID
> +CreatNewHobForHoblist (
> + IN UINTN BootloaderParameter
> )
> {
> - EFI_PEI_HOB_POINTERS Hob;
> - UINTN MinimalNeededSize;
> - EFI_PHYSICAL_ADDRESS FreeMemoryBottom;
> - EFI_PHYSICAL_ADDRESS FreeMemoryTop;
> - EFI_PHYSICAL_ADDRESS MemoryBottom;
> - EFI_PHYSICAL_ADDRESS MemoryTop;
> - EFI_HOB_RESOURCE_DESCRIPTOR *PhitResourceHob;
> - EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
> - UINT8 *GuidHob;
> - EFI_HOB_FIRMWARE_VOLUME *FvHob;
> - UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTable;
> - ACPI_BOARD_INFO *AcpiBoardInfo;
> - EFI_HOB_HANDOFF_INFO_TABLE *HobInfo;
> + EFI_PEI_HOB_POINTERS Hob;
> + UINTN MinimalNeededSize;
> + EFI_PHYSICAL_ADDRESS FreeMemoryBottom;
> + EFI_PHYSICAL_ADDRESS FreeMemoryTop;
> + EFI_PHYSICAL_ADDRESS MemoryBottom;
> + EFI_PHYSICAL_ADDRESS MemoryTop;
> + EFI_HOB_RESOURCE_DESCRIPTOR *PhitResourceHob;
> + EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
> + EFI_HOB_HANDOFF_INFO_TABLE *HobInfo;
>
> Hob.Raw = (UINT8 *)BootloaderParameter;
> MinimalNeededSize = FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);
> @@ -512,7 +412,7 @@ BuildHobs (
> //
> ResourceHob = FindAnotherHighestBelow4GResourceDescriptor (Hob.Raw,
> MinimalNeededSize, NULL);
> if (ResourceHob == NULL) {
> - return EFI_NOT_FOUND;
> + return;
> }
>
> MemoryBottom = ResourceHob->PhysicalStart +
> ResourceHob->ResourceLength - MinimalNeededSize;
> @@ -542,7 +442,7 @@ BuildHobs (
> //
> ResourceHob = FindAnotherHighestBelow4GResourceDescriptor (Hob.Raw,
> MinimalNeededSize, PhitResourceHob);
> if (ResourceHob == NULL) {
> - return EFI_NOT_FOUND;
> + return;
> }
>
> MemoryBottom = ResourceHob->PhysicalStart +
> ResourceHob->ResourceLength - MinimalNeededSize;
> @@ -553,14 +453,7 @@ BuildHobs (
>
> HobInfo = HobConstructor ((VOID *)(UINTN)MemoryBottom, (VOID
> *)(UINTN)MemoryTop, (VOID *)(UINTN)FreeMemoryBottom, (VOID
> *)(UINTN)FreeMemoryTop);
> HobInfo->BootMode = Hob.HandoffInformationTable->BootMode;
> - //
> - // 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.
> //
> @@ -573,7 +466,57 @@ BuildHobs (
> Hob.Raw = GET_NEXT_HOB (Hob);
> }
>
> - BuildFitLoadablesFvHob (DxeFv);
> + return;
> +}
> +
> +/**
> + It will build HOBs based on information from bootloaders.
> + @param[in] NewFdtBase The pointer to New FdtBase.
> + @param[out] DxeFv The pointer to the DXE FV in memory.
> + @retval EFI_SUCCESS If it completed successfully.
> + @retval Others If it failed to build required HOBs.
> +**/
> +EFI_STATUS
> +FitBuildHobs (
> + IN UINTN NewFdtBase,
> + OUT EFI_FIRMWARE_VOLUME_HEADER **DxeFv
> + )
> +{
> + UINT8 *GuidHob;
> + UINT32 FdtSize;
> + EFI_HOB_FIRMWARE_VOLUME *FvHob;
> + UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTable;
> + ACPI_BOARD_INFO *AcpiBoardInfo;
> + UNIVERSAL_PAYLOAD_DEVICE_TREE *Fdt;
> +
> + if (FixedPcdGetBool (PcdHandOffFdtEnable)) {
> + //
> + // Back up FDT in Reserved memory region
> + //
> +
> + GuidHob = GetFirstGuidHob (&gUniversalPayloadDeviceTreeGuid);
> + if (GuidHob != NULL) {
> + Fdt = (UNIVERSAL_PAYLOAD_DEVICE_TREE *)GET_GUID_HOB_DATA (GuidHob);
> + if (Fdt != NULL) {
> + DEBUG ((DEBUG_INFO, "Update FDT base to reserved memory\n"));
> + FdtSize = 4 * EFI_PAGE_SIZE;
> + CopyMem ((VOID *)NewFdtBase, (VOID *)(Fdt->DeviceTreeAddress),
> FdtSize);
> + Fdt->DeviceTreeAddress = NewFdtBase;
> + }
> + }
> + }
> +
> + //
> + // To create Memory Type Information HOB
> + //
> + GuidHob = GetFirstGuidHob (&gEfiMemoryTypeInformationGuid);
> + if (GuidHob == NULL) {
> + BuildGuidDataHob (
> + &gEfiMemoryTypeInformationGuid,
> + mDefaultMemoryTypeInformation,
> + sizeof (mDefaultMemoryTypeInformation)
> + );
> + }
>
> //
> // Create guid hob for acpi board information
> @@ -588,6 +531,12 @@ BuildHobs (
> }
> }
>
> + //
> + // Create an empty FvHob for the DXE FV that contains DXE core.
> + //
> + BuildFvHob ((EFI_PHYSICAL_ADDRESS)0, 0);
> +
> + BuildFitLoadablesFvHob (DxeFv);
> //
> // Update DXE FV information to first fv hob in the hob list, which
> // is the empty FvHob created before.
> @@ -600,12 +549,12 @@ BuildHobs (
>
> /**
> Entry point to the C language phase of UEFI payload.
> - @param[in] BootloaderParameter The starting address of bootloader
> parameter block.
> + @param[in] BootloaderParameter The starting address of FDT .
> @retval It will not return if SUCCESS, and return error when
> passing bootloader parameter.
> **/
> EFI_STATUS
> EFIAPI
> -_ModuleEntryPoint (
> +FitUplEntryPoint (
> IN UINTN BootloaderParameter
> )
> {
> @@ -613,14 +562,46 @@ _ModuleEntryPoint (
> PHYSICAL_ADDRESS DxeCoreEntryPoint;
> EFI_PEI_HOB_POINTERS Hob;
> EFI_FIRMWARE_VOLUME_HEADER *DxeFv;
> + PHYSICAL_ADDRESS HobListPtr;
> + VOID *FdtBase;
> + VOID *FdtBaseResvd;
>
> - mHobList = (VOID *)BootloaderParameter;
> - DxeFv = NULL;
> + if (FixedPcdGetBool (PcdHandOffFdtEnable)) {
> + mHobList = (VOID *)NULL;
> + } else {
> + mHobList = (VOID *)BootloaderParameter;
> + }
> +
> + DxeFv = NULL;
> // Call constructor for all libraries
> ProcessLibraryConstructorList ();
>
> DEBUG ((DEBUG_INFO, "Entering Universal Payload...\n"));
> DEBUG ((DEBUG_INFO, "sizeof(UINTN) = 0x%x\n", sizeof (UINTN)));
> + DEBUG ((DEBUG_INFO, "BootloaderParameter = 0x%x\n",
> BootloaderParameter));
> +
> + DEBUG ((DEBUG_INFO, "Start init Hobs...\n"));
> + HobListPtr = UplInitHob ((VOID *)BootloaderParameter);
> +
> + //
> + // Found hob list node
> + //
> + if (HobListPtr != 0) {
> + FdtBase = (VOID *)BootloaderParameter;
> + if (FdtCheckHeader (FdtBase) == 0) {
> + CustomFdtNodeParser ((VOID *)FdtBase, (VOID *)HobListPtr);
> + } else {
> + CreatNewHobForHoblist (BootloaderParameter);
> + }
> +
> + FdtBaseResvd = PayloadAllocatePages (4, EfiReservedMemoryType);
> +
> + // Build HOB based on information from Bootloader
> + Status = FitBuildHobs ((UINTN)FdtBaseResvd, &DxeFv);
> + }
> +
> + // Call constructor for all libraries again since hobs were built
> + ProcessLibraryConstructorList ();
>
> DEBUG_CODE (
> //
> @@ -629,23 +610,10 @@ _ModuleEntryPoint (
> PrintHob (mHobList);
> );
>
> - // Initialize floating point operating environment to be compliant with
> UEFI spec.
> - InitializeFloatingPointUnits ();
> -
> - // Build HOB based on information from Bootloader
> - Status = BuildHobs (BootloaderParameter, &DxeFv);
> - ASSERT_EFI_ERROR (Status);
> -
> FixUpPcdDatabase (DxeFv);
> Status = UniversalLoadDxeCore (DxeFv, &DxeCoreEntryPoint);
> ASSERT_EFI_ERROR (Status);
>
> - //
> - // Mask off all legacy 8259 interrupt sources
> - //
> - IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
> - IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
> -
> Hob.HandoffInformationTable = (EFI_HOB_HANDOFF_INFO_TABLE *)GetFirstHob
> (EFI_HOB_TYPE_HANDOFF);
> HandOffToDxeCore (DxeCoreEntryPoint, Hob);
>
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
> b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
> index 61a9f01ec9e7..cf9c03a9a8e9 100644
> --- a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
> +++ b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
> @@ -15,12 +15,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
> #include <Library/MemoryAllocationLib.h>
> #include <Library/PcdLib.h>
> #include <Library/HobLib.h>
> +#include <Library/FdtLib.h>
> #include "VirtualMemory.h"
> #include "UefiPayloadEntry.h"
>
> #define STACK_SIZE 0x20000
> #define IDT_ENTRY_COUNT 32
>
> +extern VOID *mHobList;
> +
> typedef struct _X64_IDT_TABLE {
> //
> // Reserved 4 bytes preceding PeiService and IdtTable,
> @@ -268,6 +271,15 @@ HandOffToDxeCore (
> UINT32 Index;
> X64_IDT_TABLE *IdtTableForX64;
>
> + // Initialize floating point operating environment to be compliant with
> UEFI spec.
> + InitializeFloatingPointUnits ();
> +
> + //
> + // Mask off all legacy 8259 interrupt sources
> + //
> + IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
> + IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
> +
> //
> // Clear page 0 and mark it as allocated if NULL pointer detection is
> enabled.
> //
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
> b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
> similarity index 90%
> copy from UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
> copy to UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
> index 61a9f01ec9e7..439d5bee0b8c 100644
> --- a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
> +++ b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
> @@ -1,10 +1,8 @@
> /** @file
> Ia32-specific functionality for DxeLoad.
>
> -Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>
> -Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
> -
> -SPDX-License-Identifier: BSD-2-Clause-Patent
> + Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
>
> **/
>
> @@ -15,12 +13,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
> #include <Library/MemoryAllocationLib.h>
> #include <Library/PcdLib.h>
> #include <Library/HobLib.h>
> +#include <Library/FdtLib.h>
> #include "VirtualMemory.h"
> #include "UefiPayloadEntry.h"
>
> #define STACK_SIZE 0x20000
> #define IDT_ENTRY_COUNT 32
>
> +extern VOID *mHobList;
> +
> typedef struct _X64_IDT_TABLE {
> //
> // Reserved 4 bytes preceding PeiService and IdtTable,
> @@ -268,6 +269,15 @@ HandOffToDxeCore (
> UINT32 Index;
> X64_IDT_TABLE *IdtTableForX64;
>
> + // Initialize floating point operating environment to be compliant with
> UEFI spec.
> + InitializeFloatingPointUnits ();
> +
> + //
> + // Mask off all legacy 8259 interrupt sources
> + //
> + IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
> + IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
> +
> //
> // Clear page 0 and mark it as allocated if NULL pointer detection is
> enabled.
> //
> @@ -379,3 +389,17 @@ HandOffToDxeCore (
> CpuDeadLoop ();
> }
> }
> +
> +/**
> + Entry point to the C language phase of UEFI payload.
> + @param[in] BootloaderParameter The starting address of bootloader
> parameter block.
> + @retval It will not return if SUCCESS, and return error when
> passing bootloader parameter.
> +**/
> +EFI_STATUS
> +EFIAPI
> +_ModuleEntryPoint (
> + IN UINTN BootloaderParameter
> + )
> +{
> + return FitUplEntryPoint (BootloaderParameter);
> +}
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
> b/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
> index 83936ae26e68..36edca81f997 100644
> --- a/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
> +++ b/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
> @@ -10,6 +10,56 @@
>
> #include "UefiPayloadEntry.h"
>
> +/**
> + Allocates one or more pages of type EfiBootServicesData.
> +
> + Allocates the number of pages of MemoryType and returns a pointer to the
> + allocated buffer. The buffer returned is aligned on a 4KB boundary.
> + If Pages is 0, then NULL is returned.
> + If there is not enough memory availble to satisfy the request, then NULL
> + is returned.
> +
> + @param Pages The number of 4 KB pages to allocate.
> + @param MemoryType The MemoryType
> + @return A pointer to the allocated buffer or NULL if allocation fails.
> +**/
> +VOID *
> +EFIAPI
> +PayloadAllocatePages (
> + IN UINTN Pages,
> + IN EFI_MEMORY_TYPE MemoryType
> + )
> +{
> + EFI_PEI_HOB_POINTERS Hob;
> + EFI_PHYSICAL_ADDRESS Offset;
> + EFI_HOB_HANDOFF_INFO_TABLE *HobTable;
> +
> + Hob.Raw = GetHobList ();
> + HobTable = Hob.HandoffInformationTable;
> +
> + if (Pages == 0) {
> + return NULL;
> + }
> +
> + // Make sure allocation address is page alligned.
> + Offset = HobTable->EfiFreeMemoryTop & EFI_PAGE_MASK;
> + if (Offset != 0) {
> + HobTable->EfiFreeMemoryTop -= Offset;
> + }
> +
> + //
> + // Check available memory for the allocation
> + //
> + if (HobTable->EfiFreeMemoryTop - ((Pages * EFI_PAGE_SIZE) + sizeof
> (EFI_HOB_MEMORY_ALLOCATION)) < HobTable->EfiFreeMemoryBottom) {
> + return NULL;
> + }
> +
> + HobTable->EfiFreeMemoryTop -= Pages * EFI_PAGE_SIZE;
> + BuildMemoryAllocationHob (HobTable->EfiFreeMemoryTop, Pages *
> EFI_PAGE_SIZE, MemoryType);
> +
> + return (VOID *)(UINTN)HobTable->EfiFreeMemoryTop;
> +}
> +
> /**
> Allocates one or more pages of type EfiBootServicesData.
>
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
> b/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
> index b63e93c07ec2..153d1b00f637 100644
> --- a/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
> +++ b/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
> @@ -169,13 +169,13 @@ PrintMemoryAllocationHob (
> }
>
> /**
> - Print the information in Resource Discriptor Hob.
> + Print the information in Resource Descriptor Hob.
> @param[in] HobStart A pointer to HOB of type
> EFI_HOB_TYPE_RESOURCE_DESCRIPTOR.
> @param[in] HobLength The Length in bytes of HOB of type
> EFI_HOB_TYPE_RESOURCE_DESCRIPTOR.
> @retval EFI_SUCCESS If it completed successfully.
> **/
> EFI_STATUS
> -PrintResourceDiscriptorHob (
> +PrintResourceDescriptorHob (
> IN VOID *HobStart,
> IN UINT16 HobLength
> )
> @@ -620,7 +620,7 @@ PrintFv3Hob (
> HOB_PRINT_HANDLER_TABLE mHobHandles[] = {
> { EFI_HOB_TYPE_HANDOFF, "EFI_HOB_TYPE_HANDOFF",
> PrintHandOffHob },
> { EFI_HOB_TYPE_MEMORY_ALLOCATION, "EFI_HOB_TYPE_MEMORY_ALLOCATION",
> PrintMemoryAllocationHob },
> - { EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, "EFI_HOB_TYPE_RESOURCE_DESCRIPTOR",
> PrintResourceDiscriptorHob },
> + { EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, "EFI_HOB_TYPE_RESOURCE_DESCRIPTOR",
> PrintResourceDescriptorHob },
> { EFI_HOB_TYPE_GUID_EXTENSION, "EFI_HOB_TYPE_GUID_EXTENSION",
> PrintGuidHob },
> { EFI_HOB_TYPE_FV, "EFI_HOB_TYPE_FV",
> PrintFvHob },
> { EFI_HOB_TYPE_CPU, "EFI_HOB_TYPE_CPU",
> PrintCpuHob },
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
> b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
> index f37c00fad774..5b864eeefe10 100644
> --- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
> +++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
> @@ -486,12 +486,6 @@ _ModuleEntryPoint (
> Status = UniversalLoadDxeCore (DxeFv, &DxeCoreEntryPoint);
> ASSERT_EFI_ERROR (Status);
>
> - //
> - // Mask off all legacy 8259 interrupt sources
> - //
> - IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
> - IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
> -
> Hob.HandoffInformationTable = (EFI_HOB_HANDOFF_INFO_TABLE *)GetFirstHob
> (EFI_HOB_TYPE_HANDOFF);
> HandOffToDxeCore (DxeCoreEntryPoint, Hob);
>
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
> b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
> index 346e3feb0459..6c3603f12098 100644
> --- a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
> +++ b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
> @@ -13,10 +13,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
> #include <Library/MemoryAllocationLib.h>
> #include <Library/PcdLib.h>
> #include <Library/HobLib.h>
> +#include <Library/FdtLib.h>
> #include "X64/VirtualMemory.h"
> #include "UefiPayloadEntry.h"
> #define STACK_SIZE 0x20000
>
> +extern VOID *mHobList;
> +
> /**
> Transfers control to DxeCore.
>
> @@ -40,6 +43,15 @@ HandOffToDxeCore (
> VOID *GhcbBase;
> UINTN GhcbSize;
>
> + // Initialize floating point operating environment to be compliant with
> UEFI spec.
> + InitializeFloatingPointUnits ();
> +
> + //
> + // Mask off all legacy 8259 interrupt sources
> + //
> + IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
> + IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
> +
> //
> // Clear page 0 and mark it as allocated if NULL pointer detection is
> enabled.
> //
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
> b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
> similarity index 74%
> copy from UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
> copy to UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
> index 346e3feb0459..35b52a911df3 100644
> --- a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
> +++ b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
> @@ -1,8 +1,8 @@
> /** @file
> x64-specifc functionality for DxeLoad.
>
> -Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>
> -SPDX-License-Identifier: BSD-2-Clause-Patent
> + Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>
> + SPDX-License-Identifier: BSD-2-Clause-Patent
>
> **/
>
> @@ -13,10 +13,14 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
> #include <Library/MemoryAllocationLib.h>
> #include <Library/PcdLib.h>
> #include <Library/HobLib.h>
> +#include <Library/FdtLib.h>
> +#include <Library/PcdLib.h>
> #include "X64/VirtualMemory.h"
> #include "UefiPayloadEntry.h"
> #define STACK_SIZE 0x20000
>
> +extern VOID *mHobList;
> +
> /**
> Transfers control to DxeCore.
>
> @@ -40,6 +44,15 @@ HandOffToDxeCore (
> VOID *GhcbBase;
> UINTN GhcbSize;
>
> + // Initialize floating point operating environment to be compliant with
> UEFI spec.
> + InitializeFloatingPointUnits ();
> +
> + //
> + // Mask off all legacy 8259 interrupt sources
> + //
> + IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
> + IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
> +
> //
> // Clear page 0 and mark it as allocated if NULL pointer detection is
> enabled.
> //
> @@ -106,3 +119,17 @@ HandOffToDxeCore (
> TopOfStack
> );
> }
> +
> +/**
> + Entry point to the C language phase of UEFI payload.
> + @param[in] BootloaderParameter The starting address of bootloader
> parameter block.
> + @retval It will not return if SUCCESS, and return error when
> passing bootloader parameter.
> +**/
> +EFI_STATUS
> +EFIAPI
> +_ModuleEntryPoint (
> + IN UINTN BootloaderParameter
> + )
> +{
> + return FitUplEntryPoint (BootloaderParameter);
> +}
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
> b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
> index b87a0989eee3..c87e674f7cbd 100644
> --- a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
> +++ b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
> @@ -30,13 +30,13 @@
> [Sources.Ia32]
> X64/VirtualMemory.h
> X64/VirtualMemory.c
> - Ia32/DxeLoadFunc.c
> + Ia32/DxeLoadFuncFit.c
> Ia32/IdtVectorAsm.nasm
>
> [Sources.X64]
> X64/VirtualMemory.h
> X64/VirtualMemory.c
> - X64/DxeLoadFunc.c
> + X64/DxeLoadFuncFit.c
>
> [Packages]
> MdePkg/MdePkg.dec
> @@ -54,6 +54,8 @@
> PeCoffLib
> CpuLib
> FdtLib
> + CustomFdtNodeParserLib
> + PcdLib
>
> [Guids]
> gEfiMemoryTypeInformationGuid
> @@ -71,6 +73,7 @@
> gUniversalPayloadAcpiTableGuid
> gUniversalPayloadPciRootBridgeInfoGuid
> gUniversalPayloadSmbios3TableGuid
> + gUniversalPayloadDeviceTreeGuid
>
> [FeaturePcd.IA32]
> gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ##
> CONSUMES
> @@ -78,7 +81,6 @@
> [FeaturePcd.X64]
> gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables ##
> CONSUMES
>
> -
> [Pcd.IA32,Pcd.X64]
> gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile
> gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable
> ## SOMETIMES_CONSUMES
> @@ -88,11 +90,19 @@
> gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard
> ## CONSUMES
> gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbBase
> ## CONSUMES
> gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbSize
> ## CONSUMES
> -
> gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemBase
> gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemSize
> gUefiPayloadPkgTokenSpaceGuid.PcdSystemMemoryUefiRegionSize
> -
> gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack ##
> SOMETIMES_CONSUMES
> gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ##
> SOMETIMES_CONSUMES
> gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy ##
> SOMETIMES_CONSUMES
> + gUefiPayloadPkgTokenSpaceGuid.PcdHandOffFdtEnable
> + gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiACPIMemoryNVS
> + gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiACPIReclaimMemory
> + gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiReservedMemoryType
> + gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesData
> + gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesCode
> +
> +[BuildOptions]
> + MSFT:*_*_*_CC_FLAGS = /wd4244 /wd4305
> + GCC:*_*_*_CC_FLAGS = -Wno-error=pointer-to-int-cast
> -Wno-error=int-to-pointer-cast
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
> b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
> index 80ccc5072c55..09fce8dbcf35 100644
> --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
> +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
> @@ -35,6 +35,7 @@
> #include <UniversalPayload/UniversalPayload.h>
> #include <UniversalPayload/ExtraData.h>
> #include <UniversalPayload/SerialPortInfo.h>
> +#include <UniversalPayload/DeviceTree.h>
> #include <Guid/PcdDataBaseSignatureGuid.h>
>
> #define LEGACY_8259_MASK_REGISTER_MASTER 0x21
> @@ -134,6 +135,31 @@ UniversalLoadDxeCore (
> OUT PHYSICAL_ADDRESS *DxeCoreEntryPoint
> );
>
> +/**
> + It will Parse FDT -node based on information.
> + @param[in] FdtBase The starting memory address of FdtBase
> + @retval HobList The base address of Hoblist.
> +
> +**/
> +UINT64
> +EFIAPI
> +FdtNodeParser (
> + IN VOID *FdtBase
> + );
> +
> +/**
> + It will Parse FDT -custom node based on information.
> + @param[in] FdtBase The starting memory address of FdtBase
> + @param[in] HostList The starting memory address of New Hob list.
> +
> +**/
> +UINTN
> +EFIAPI
> +CustomFdtNodeParser (
> + IN VOID *FdtBase,
> + IN VOID *HostList
> + );
> +
> /**
> Transfers control to DxeCore.
>
> @@ -206,4 +232,46 @@ BuildHobFromAcpi (
> IN UINT64 AcpiTableBase
> );
>
> +/**
> + Allocates one or more pages .
> +
> + Allocates the number of pages of MemoryType and returns a pointer to the
> + allocated buffer. The buffer returned is aligned on a 4KB boundary.
> + If Pages is 0, then NULL is returned.
> + If there is not enough memory availble to satisfy the request, then NULL
> + is returned.
> +
> + @param Pages The number of 4 KB pages to allocate.
> + @param MemoryType The Memorytype
> + @return A pointer to the allocated buffer or NULL if allocation fails.
> +**/
> +VOID *
> +EFIAPI
> +PayloadAllocatePages (
> + IN UINTN Pages,
> + IN EFI_MEMORY_TYPE MemoryType
> + );
> +
> +/**
> + Entry point to the C language phase of UEFI payload.
> + @param[in] FdtPrt The starting address of FDT .
> + @retval It will not return if SUCCESS, and return error when
> passing bootloader parameter.
> +**/
> +EFI_STATUS
> +EFIAPI
> +FitUplEntryPoint (
> + IN UINTN BootloaderParameter
> + );
> +
> +/**
> + Entry point to the C language phase of UEFI payload.
> + @param[in] BootloaderParameter The starting address of bootloader
> parameter block.
> + @retval It will not return if SUCCESS, and return error when
> passing bootloader parameter.
> +**/
> +EFI_STATUS
> +EFIAPI
> +UplEntryPoint (
> + IN UINTN BootloaderParameter
> + );
> +
> #endif
> diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
> b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
> index a62da5c7059d..be91f7be2819 100644
> --- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
> +++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
> @@ -6,44 +6,37 @@
> # SPDX-License-Identifier: BSD-2-Clause-Patent
> #
> ##
> -
> [Defines]
> INF_VERSION = 1.30
> BASE_NAME = UniversalPayloadEntry
> FILE_GUID = D4F0F269-1209-4A66-8039-C4D5A700EA4E
> MODULE_TYPE = SEC
> VERSION_STRING = 1.0
> -
> #
> # The following information is for reference only and not required by the
> build tools.
> #
> # VALID_ARCHITECTURES = IA32 X64
> #
> -
> [Sources]
> UniversalPayloadEntry.c
> LoadDxeCore.c
> MemoryAllocation.c
> PrintHob.c
> AcpiTable.c
> -
> [Sources.Ia32]
> X64/VirtualMemory.h
> X64/VirtualMemory.c
> Ia32/DxeLoadFunc.c
> Ia32/IdtVectorAsm.nasm
> -
> [Sources.X64]
> X64/VirtualMemory.h
> X64/VirtualMemory.c
> X64/DxeLoadFunc.c
> -
> [Packages]
> MdePkg/MdePkg.dec
> MdeModulePkg/MdeModulePkg.dec
> UefiCpuPkg/UefiCpuPkg.dec
> UefiPayloadPkg/UefiPayloadPkg.dec
> -
> [LibraryClasses]
> BaseMemoryLib
> DebugLib
> @@ -69,14 +62,12 @@
> gUniversalPayloadAcpiTableGuid
> gUniversalPayloadPciRootBridgeInfoGuid
> gUniversalPayloadSmbios3TableGuid
> -
> + gUniversalPayloadBaseGuid
> + gUniversalPayloadDeviceTreeGuid
> [FeaturePcd.IA32]
> gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ##
> CONSUMES
> -
> [FeaturePcd.X64]
> gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables ##
> CONSUMES
> -
> -
> [Pcd.IA32,Pcd.X64]
> gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile
> gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable
> ## SOMETIMES_CONSUMES
> @@ -86,12 +77,9 @@
> gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard
> ## CONSUMES
> gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbBase
> ## CONSUMES
> gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbSize
> ## CONSUMES
> -
> gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemBase
> gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemSize
> gUefiPayloadPkgTokenSpaceGuid.PcdSystemMemoryUefiRegionSize
> -
> gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack ##
> SOMETIMES_CONSUMES
> gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ##
> SOMETIMES_CONSUMES
> gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy ##
> SOMETIMES_CONSUMES
> -
> diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc
> b/UefiPayloadPkg/UefiPayloadPkg.dsc
> index 2860a659f6a7..779f74da7171 100644
> --- a/UefiPayloadPkg/UefiPayloadPkg.dsc
> +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc
> @@ -55,7 +55,7 @@
> # ELF: Build UniversalPayload file as UniversalPayload.elf
> # FIT: Build UniversalPayload file as UniversalPayload.fit
> #
> - DEFINE UNIVERSAL_PAYLOAD = FALSE
> + DEFINE UNIVERSAL_PAYLOAD = TRUE
> DEFINE UNIVERSAL_PAYLOAD_FORMAT = ELF
>
> #
> @@ -226,6 +226,7 @@
> OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
> RngLib|MdePkg/Library/BaseRngLib/BaseRngLib.inf
> HobLib|UefiPayloadPkg/Library/DxeHobLib/DxeHobLib.inf
> +
> CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserNullLib/CustomFdtNodeParserNullLib.inf
>
> #
> # UEFI & PI
> @@ -470,6 +471,8 @@
> gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress|0x0
> gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory|FALSE
> gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable|TRUE
> + gUefiPayloadPkgTokenSpaceGuid.PcdHandOffFdtEnable|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 }
> @@ -513,7 +516,15 @@
> !endif
> !endif
>
> +
> [PcdsPatchableInModule.X64]
> + #
> + # The following parameters are set by Library/PlatformHookLib
> + #
> + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio|FALSE
> + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase|0x3F8
> + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialBaudRate|$(BAUD_RATE)
> + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterStride|1
> !if $(NETWORK_DRIVER_ENABLE) == TRUE
> gEfiNetworkPkgTokenSpaceGuid.PcdAllowHttpConnections|TRUE
> !endif
> @@ -635,7 +646,13 @@
> !if $(UNIVERSAL_PAYLOAD_FORMAT) == "ELF"
> UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
> !elseif $(UNIVERSAL_PAYLOAD_FORMAT) == "FIT"
> - UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
> + UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf {
> + <LibraryClasses>
> + FdtLib|MdePkg/Library/BaseFdtLib/BaseFdtLib.inf
> +
> CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserLib/CustomFdtNodeParserLib.inf
> + NULL|UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf
> + NULL|UefiPayloadPkg/Library/HobParseLib/HobParseLib.inf
> + }
> !else
> UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
> !endif
> @@ -648,7 +665,13 @@
> !if $(UNIVERSAL_PAYLOAD_FORMAT) == "ELF"
> UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
> !elseif $(UNIVERSAL_PAYLOAD_FORMAT) == "FIT"
> - UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
> + UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf {
> + <LibraryClasses>
> + FdtLib|MdePkg/Library/BaseFdtLib/BaseFdtLib.inf
> +
> CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserLib/CustomFdtNodeParserLib.inf
> + NULL|UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf
> + NULL|UefiPayloadPkg/Library/HobParseLib/HobParseLib.inf
> + }
> !else
> UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
> !endif
> --
> 2.39.2.windows.1
>
>
--
Thanks!
=D
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#119426): https://edk2.groups.io/g/devel/message/119426
Mute This Topic: https://groups.io/mt/106455168/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
[-- Attachment #2: Type: text/html, Size: 52171 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [edk2-devel] [PATCH v4 6/6] UefiPayloadPkg: Update UefiPayload driver for FDT support.
2024-06-03 11:27 ` Dhaval Sharma
@ 2024-06-04 17:18 ` Dhaval Sharma
2024-06-05 3:47 ` Linus Liu
2024-06-04 23:10 ` Chiu, Chasel
1 sibling, 1 reply; 6+ messages in thread
From: Dhaval Sharma @ 2024-06-04 17:18 UTC (permalink / raw)
To: Linus Liu; +Cc: devel, Benny Lin, Gua Guo, Chasel Chiu, James Lu
[-- Attachment #1: Type: text/plain, Size: 46518 bytes --]
I also believe this code needs to go through crustify etc to ensure it
follows all edk2 standards?
On Mon, Jun 3, 2024 at 4:57 PM Dhaval Sharma <dhaval@rivosinc.com> wrote:
> BuildFitLoadablesFvHob:
>
> - Fdt variable is not initialized.
> - It ONLY gets initialized if GuidHob is found. What if it is not
> found?
> - FdtCheckHeader still evaluating it?
>
>
> On Mon, Jun 3, 2024 at 7:49 AM Linus Liu <linus.liu@intel.com> wrote:
>
>> Add FDT detection and comsume FDT when needed.
>> Move some x86 specific function in the x86 folder.
>> Create HandOffHob via FDT memory node.
>>
>> Cc: Benny Lin <benny.lin@intel.com>
>> Cc: Gua Guo <gua.guo@intel.com>
>> Cc: Chasel Chiu <chasel.chiu@intel.com>
>> Cc: James Lu <james.lu@intel.com>
>> Cc: Dhaval Sharma <dhaval@rivosinc.com>
>>
>> Signed-off-by: Linus Liu <linus.liu@intel.com>
>> ---
>> UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
>> | 428 +++++++++-----------
>> UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
>> | 12 +
>> UefiPayloadPkg/UefiPayloadEntry/Ia32/{DxeLoadFunc.c => DxeLoadFuncFit.c}
>> | 32 +-
>> UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
>> | 50 +++
>> UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
>> | 6 +-
>> UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
>> | 6 -
>> UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
>> | 12 +
>> UefiPayloadPkg/UefiPayloadEntry/X64/{DxeLoadFunc.c => DxeLoadFuncFit.c}
>> | 31 +-
>> UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
>> | 20 +-
>> UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
>> | 68 ++++
>> UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
>> | 16 +-
>> UefiPayloadPkg/UefiPayloadPkg.dsc
>> | 29 +-
>> 12 files changed, 443 insertions(+), 267 deletions(-)
>>
>> diff --git a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
>> b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
>> index eb0b325369a0..813d656950d1 100644
>> --- a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
>> +++ b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
>> @@ -6,6 +6,8 @@
>> #include "UefiPayloadEntry.h"
>> #include <Library/FdtLib.h>
>> #include <Guid/UniversalPayloadBase.h>
>> +#include <Guid/MemoryTypeInformation.h>
>> +#include <Library/FdtParserLib.h>
>>
>> #define MEMORY_ATTRIBUTE_MASK (EFI_RESOURCE_ATTRIBUTE_PRESENT
>> | \
>>
>> EFI_RESOURCE_ATTRIBUTE_INITIALIZED | \
>> @@ -23,6 +25,15 @@
>>
>> EFI_RESOURCE_ATTRIBUTE_INITIALIZED | \
>> EFI_RESOURCE_ATTRIBUTE_TESTED
>> )
>>
>> +EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {
>> + { EfiACPIReclaimMemory, FixedPcdGet32
>> (PcdMemoryTypeEfiACPIReclaimMemory) },
>> + { EfiACPIMemoryNVS, FixedPcdGet32
>> (PcdMemoryTypeEfiACPIMemoryNVS) },
>> + { EfiReservedMemoryType, FixedPcdGet32
>> (PcdMemoryTypeEfiReservedMemoryType) },
>> + { EfiRuntimeServicesData, FixedPcdGet32
>> (PcdMemoryTypeEfiRuntimeServicesData) },
>> + { EfiRuntimeServicesCode, FixedPcdGet32
>> (PcdMemoryTypeEfiRuntimeServicesCode) },
>> + { EfiMaxMemoryType, 0
>> }
>> +};
>> +
>> extern VOID *mHobList;
>>
>> CHAR8 *mLineBuffer = NULL;
>> @@ -36,6 +47,78 @@ PrintHob (
>> IN CONST VOID *HobStart
>> );
>>
>> +/**
>> + Add HOB into HOB list
>> + @param[in] Hob The HOB to be added into the HOB list.
>> +**/
>> +VOID
>> +AddNewHob (
>> + IN EFI_PEI_HOB_POINTERS *Hob
>> + );
>> +
>> +/**
>> + Found the Resource Descriptor HOB that contains a range (Base, Top)
>> + @param[in] HobList Hob start address
>> + @param[in] Base Memory start address
>> + @param[in] Top Memory end address.
>> + @retval The pointer to the Resource Descriptor HOB.
>> +**/
>> +EFI_HOB_RESOURCE_DESCRIPTOR *
>> +FindResourceDescriptorByRange (
>> + IN VOID *HobList,
>> + IN EFI_PHYSICAL_ADDRESS Base,
>> + IN EFI_PHYSICAL_ADDRESS Top
>> + );
>> +
>> +/**
>> + Find the highest below 4G memory resource descriptor, except the input
>> Resource Descriptor.
>> + @param[in] HobList Hob start address
>> + @param[in] MinimalNeededSize Minimal needed size.
>> + @param[in] ExceptResourceHob Ignore this Resource Descriptor.
>> + @retval The pointer to the Resource Descriptor HOB.
>> +**/
>> +EFI_HOB_RESOURCE_DESCRIPTOR *
>> +FindAnotherHighestBelow4GResourceDescriptor (
>> + IN VOID *HobList,
>> + IN UINTN MinimalNeededSize,
>> + IN EFI_HOB_RESOURCE_DESCRIPTOR *ExceptResourceHob
>> + );
>> +
>> +/**
>> + Check the HOB and decide if it is need inside Payload
>> + Payload maintainer may make decision which HOB is need or needn't
>> + Then add the check logic in the function.
>> + @param[in] Hob The HOB to check
>> + @retval TRUE If HOB is need inside Payload
>> + @retval FALSE If HOB is needn't inside Payload
>> +**/
>> +BOOLEAN
>> +FitIsHobNeed (
>> + EFI_PEI_HOB_POINTERS Hob
>> + );
>> +
>> +/**
>> + Check the HOB and decide if it is need inside Payload
>> +
>> + Payload maintainer may make decision which HOB is need or needn't
>> + Then add the check logic in the function.
>> +
>> + @param[in] Hob The HOB to check
>> +
>> + @retval TRUE If HOB is need inside Payload
>> + @retval FALSE If HOB is needn't inside Payload
>> +**/
>> +BOOLEAN
>> +IsHobNeed (
>> + EFI_PEI_HOB_POINTERS Hob
>> + );
>> +
>> +VOID
>> +EFIAPI
>> +ProcessLibraryConstructorList (
>> + VOID
>> + );
>> +
>> /**
>> Find the first substring.
>> @param String Point to the string where to find the substring.
>> @@ -191,187 +274,6 @@ FixUpPcdDatabase (
>> return EFI_SUCCESS;
>> }
>>
>> -/**
>> - Add HOB into HOB list
>> - @param[in] Hob The HOB to be added into the HOB list.
>> -**/
>> -VOID
>> -AddNewHob (
>> - IN EFI_PEI_HOB_POINTERS *Hob
>> - )
>> -{
>> - EFI_PEI_HOB_POINTERS NewHob;
>> -
>> - if (Hob->Raw == NULL) {
>> - return;
>> - }
>> -
>> - NewHob.Header = CreateHob (Hob->Header->HobType,
>> Hob->Header->HobLength);
>> - ASSERT (NewHob.Header != NULL);
>> - if (NewHob.Header == NULL) {
>> - return;
>> - }
>> -
>> - CopyMem (NewHob.Header + 1, Hob->Header + 1, Hob->Header->HobLength -
>> sizeof (EFI_HOB_GENERIC_HEADER));
>> -}
>> -
>> -/**
>> - Found the Resource Descriptor HOB that contains a range (Base, Top)
>> - @param[in] HobList Hob start address
>> - @param[in] Base Memory start address
>> - @param[in] Top Memory end address.
>> - @retval The pointer to the Resource Descriptor HOB.
>> -**/
>> -EFI_HOB_RESOURCE_DESCRIPTOR *
>> -FindResourceDescriptorByRange (
>> - IN VOID *HobList,
>> - IN EFI_PHYSICAL_ADDRESS Base,
>> - IN EFI_PHYSICAL_ADDRESS Top
>> - )
>> -{
>> - EFI_PEI_HOB_POINTERS Hob;
>> - EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
>> -
>> - for (Hob.Raw = (UINT8 *)HobList; !END_OF_HOB_LIST (Hob); Hob.Raw =
>> GET_NEXT_HOB (Hob)) {
>> - //
>> - // Skip all HOBs except Resource Descriptor HOBs
>> - //
>> - if (GET_HOB_TYPE (Hob) != EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
>> - continue;
>> - }
>> -
>> - //
>> - // Skip Resource Descriptor HOBs that do not describe tested system
>> memory
>> - //
>> - ResourceHob = Hob.ResourceDescriptor;
>> - if (ResourceHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY) {
>> - continue;
>> - }
>> -
>> - if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) !=
>> TESTED_MEMORY_ATTRIBUTES) {
>> - continue;
>> - }
>> -
>> - //
>> - // Skip Resource Descriptor HOBs that do not contain the PHIT range
>> EfiFreeMemoryBottom..EfiFreeMemoryTop
>> - //
>> - if (Base < ResourceHob->PhysicalStart) {
>> - continue;
>> - }
>> -
>> - if (Top > (ResourceHob->PhysicalStart +
>> ResourceHob->ResourceLength)) {
>> - continue;
>> - }
>> -
>> - return ResourceHob;
>> - }
>> -
>> - return NULL;
>> -}
>> -
>> -/**
>> - Find the highest below 4G memory resource descriptor, except the input
>> Resource Descriptor.
>> - @param[in] HobList Hob start address
>> - @param[in] MinimalNeededSize Minimal needed size.
>> - @param[in] ExceptResourceHob Ignore this Resource Descriptor.
>> - @retval The pointer to the Resource Descriptor HOB.
>> -**/
>> -EFI_HOB_RESOURCE_DESCRIPTOR *
>> -FindAnotherHighestBelow4GResourceDescriptor (
>> - IN VOID *HobList,
>> - IN UINTN MinimalNeededSize,
>> - IN EFI_HOB_RESOURCE_DESCRIPTOR *ExceptResourceHob
>> - )
>> -{
>> - EFI_PEI_HOB_POINTERS Hob;
>> - EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
>> - EFI_HOB_RESOURCE_DESCRIPTOR *ReturnResourceHob;
>> -
>> - ReturnResourceHob = NULL;
>> -
>> - for (Hob.Raw = (UINT8 *)HobList; !END_OF_HOB_LIST (Hob); Hob.Raw =
>> GET_NEXT_HOB (Hob)) {
>> - //
>> - // Skip all HOBs except Resource Descriptor HOBs
>> - //
>> - if (GET_HOB_TYPE (Hob) != EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
>> - continue;
>> - }
>> -
>> - //
>> - // Skip Resource Descriptor HOBs that do not describe tested system
>> memory
>> - //
>> - ResourceHob = Hob.ResourceDescriptor;
>> - if (ResourceHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY) {
>> - continue;
>> - }
>> -
>> - if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) !=
>> TESTED_MEMORY_ATTRIBUTES) {
>> - continue;
>> - }
>> -
>> - //
>> - // Skip if the Resource Descriptor HOB equals to ExceptResourceHob
>> - //
>> - if (ResourceHob == ExceptResourceHob) {
>> - continue;
>> - }
>> -
>> - //
>> - // Skip Resource Descriptor HOBs that are beyond 4G
>> - //
>> - if ((ResourceHob->PhysicalStart + ResourceHob->ResourceLength) >
>> BASE_4GB) {
>> - continue;
>> - }
>> -
>> - //
>> - // Skip Resource Descriptor HOBs that are too small
>> - //
>> - if (ResourceHob->ResourceLength < MinimalNeededSize) {
>> - continue;
>> - }
>> -
>> - //
>> - // Return the topest Resource Descriptor
>> - //
>> - if (ReturnResourceHob == NULL) {
>> - ReturnResourceHob = ResourceHob;
>> - } else {
>> - if (ReturnResourceHob->PhysicalStart < ResourceHob->PhysicalStart)
>> {
>> - ReturnResourceHob = ResourceHob;
>> - }
>> - }
>> - }
>> -
>> - return ReturnResourceHob;
>> -}
>> -
>> -/**
>> - Check the HOB and decide if it is need inside Payload
>> - Payload maintainer may make decision which HOB is need or needn't
>> - Then add the check logic in the function.
>> - @param[in] Hob The HOB to check
>> - @retval TRUE If HOB is need inside Payload
>> - @retval FALSE If HOB is needn't inside Payload
>> -**/
>> -BOOLEAN
>> -IsHobNeed (
>> - EFI_PEI_HOB_POINTERS Hob
>> - )
>> -{
>> - if (Hob.Header->HobType == EFI_HOB_TYPE_HANDOFF) {
>> - return FALSE;
>> - }
>> -
>> - if (Hob.Header->HobType == EFI_HOB_TYPE_MEMORY_ALLOCATION) {
>> - if (CompareGuid
>> (&Hob.MemoryAllocationModule->MemoryAllocationHeader.Name,
>> &gEfiHobMemoryAllocModuleGuid)) {
>> - return FALSE;
>> - }
>> - }
>> -
>> - // Arrive here mean the HOB is need
>> - return TRUE;
>> -}
>> -
>> /**
>> It will build Fv HOBs based on information from bootloaders.
>> @param[out] DxeFv The pointer to the DXE FV in memory.
>> @@ -409,21 +311,25 @@ BuildFitLoadablesFvHob (
>>
>> Status = FdtCheckHeader (Fdt);
>> if (EFI_ERROR (Status)) {
>> + DEBUG ((DEBUG_INFO, "FdtCheckHeader UPSUPPORTED\n"));
>> return EFI_UNSUPPORTED;
>> }
>>
>> ConfigNode = FdtSubnodeOffsetNameLen (Fdt, 0, "configurations",
>> (INT32)AsciiStrLen ("configurations"));
>> if (ConfigNode <= 0) {
>> + DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob configurations
>> EFI_NOT_FOUND\n"));
>> return EFI_NOT_FOUND;
>> }
>>
>> Config1Node = FdtSubnodeOffsetNameLen (Fdt, ConfigNode, "conf-1",
>> (INT32)AsciiStrLen ("conf-1"));
>> if (Config1Node <= 0) {
>> + DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob conf-1
>> EFI_NOT_FOUND\n"));
>> return EFI_NOT_FOUND;
>> }
>>
>> ImageNode = FdtSubnodeOffsetNameLen (Fdt, 0, "images",
>> (INT32)AsciiStrLen ("images"));
>> if (ImageNode <= 0) {
>> + DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob images
>> EFI_NOT_FOUND\n"));
>> return EFI_NOT_FOUND;
>> }
>>
>> @@ -467,31 +373,25 @@ BuildFitLoadablesFvHob (
>> }
>>
>> /**
>> - It will build HOBs based on information from bootloaders.
>> - @param[in] BootloaderParameter The starting memory address of
>> bootloader parameter block.
>> - @param[out] DxeFv The pointer to the DXE FV in memory.
>> - @retval EFI_SUCCESS If it completed successfully.
>> - @retval Others If it failed to build required HOBs.
>> + *
>> + Create new HOB for new HOB list
>> +
>> + @param[in] BootloaderParameter The HOB to be added into the HOB list.
>> **/
>> -EFI_STATUS
>> -BuildHobs (
>> - IN UINTN BootloaderParameter,
>> - OUT EFI_FIRMWARE_VOLUME_HEADER **DxeFv
>> +VOID
>> +CreatNewHobForHoblist (
>> + IN UINTN BootloaderParameter
>> )
>> {
>> - EFI_PEI_HOB_POINTERS Hob;
>> - UINTN MinimalNeededSize;
>> - EFI_PHYSICAL_ADDRESS FreeMemoryBottom;
>> - EFI_PHYSICAL_ADDRESS FreeMemoryTop;
>> - EFI_PHYSICAL_ADDRESS MemoryBottom;
>> - EFI_PHYSICAL_ADDRESS MemoryTop;
>> - EFI_HOB_RESOURCE_DESCRIPTOR *PhitResourceHob;
>> - EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
>> - UINT8 *GuidHob;
>> - EFI_HOB_FIRMWARE_VOLUME *FvHob;
>> - UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTable;
>> - ACPI_BOARD_INFO *AcpiBoardInfo;
>> - EFI_HOB_HANDOFF_INFO_TABLE *HobInfo;
>> + EFI_PEI_HOB_POINTERS Hob;
>> + UINTN MinimalNeededSize;
>> + EFI_PHYSICAL_ADDRESS FreeMemoryBottom;
>> + EFI_PHYSICAL_ADDRESS FreeMemoryTop;
>> + EFI_PHYSICAL_ADDRESS MemoryBottom;
>> + EFI_PHYSICAL_ADDRESS MemoryTop;
>> + EFI_HOB_RESOURCE_DESCRIPTOR *PhitResourceHob;
>> + EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
>> + EFI_HOB_HANDOFF_INFO_TABLE *HobInfo;
>>
>> Hob.Raw = (UINT8 *)BootloaderParameter;
>> MinimalNeededSize = FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);
>> @@ -512,7 +412,7 @@ BuildHobs (
>> //
>> ResourceHob = FindAnotherHighestBelow4GResourceDescriptor (Hob.Raw,
>> MinimalNeededSize, NULL);
>> if (ResourceHob == NULL) {
>> - return EFI_NOT_FOUND;
>> + return;
>> }
>>
>> MemoryBottom = ResourceHob->PhysicalStart +
>> ResourceHob->ResourceLength - MinimalNeededSize;
>> @@ -542,7 +442,7 @@ BuildHobs (
>> //
>> ResourceHob = FindAnotherHighestBelow4GResourceDescriptor (Hob.Raw,
>> MinimalNeededSize, PhitResourceHob);
>> if (ResourceHob == NULL) {
>> - return EFI_NOT_FOUND;
>> + return;
>> }
>>
>> MemoryBottom = ResourceHob->PhysicalStart +
>> ResourceHob->ResourceLength - MinimalNeededSize;
>> @@ -553,14 +453,7 @@ BuildHobs (
>>
>> HobInfo = HobConstructor ((VOID *)(UINTN)MemoryBottom, (VOID
>> *)(UINTN)MemoryTop, (VOID *)(UINTN)FreeMemoryBottom, (VOID
>> *)(UINTN)FreeMemoryTop);
>> HobInfo->BootMode = Hob.HandoffInformationTable->BootMode;
>> - //
>> - // 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.
>> //
>> @@ -573,7 +466,57 @@ BuildHobs (
>> Hob.Raw = GET_NEXT_HOB (Hob);
>> }
>>
>> - BuildFitLoadablesFvHob (DxeFv);
>> + return;
>> +}
>> +
>> +/**
>> + It will build HOBs based on information from bootloaders.
>> + @param[in] NewFdtBase The pointer to New FdtBase.
>> + @param[out] DxeFv The pointer to the DXE FV in memory.
>> + @retval EFI_SUCCESS If it completed successfully.
>> + @retval Others If it failed to build required HOBs.
>> +**/
>> +EFI_STATUS
>> +FitBuildHobs (
>> + IN UINTN NewFdtBase,
>> + OUT EFI_FIRMWARE_VOLUME_HEADER **DxeFv
>> + )
>> +{
>> + UINT8 *GuidHob;
>> + UINT32 FdtSize;
>> + EFI_HOB_FIRMWARE_VOLUME *FvHob;
>> + UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTable;
>> + ACPI_BOARD_INFO *AcpiBoardInfo;
>> + UNIVERSAL_PAYLOAD_DEVICE_TREE *Fdt;
>> +
>> + if (FixedPcdGetBool (PcdHandOffFdtEnable)) {
>> + //
>> + // Back up FDT in Reserved memory region
>> + //
>> +
>> + GuidHob = GetFirstGuidHob (&gUniversalPayloadDeviceTreeGuid);
>> + if (GuidHob != NULL) {
>> + Fdt = (UNIVERSAL_PAYLOAD_DEVICE_TREE *)GET_GUID_HOB_DATA
>> (GuidHob);
>> + if (Fdt != NULL) {
>> + DEBUG ((DEBUG_INFO, "Update FDT base to reserved memory\n"));
>> + FdtSize = 4 * EFI_PAGE_SIZE;
>> + CopyMem ((VOID *)NewFdtBase, (VOID *)(Fdt->DeviceTreeAddress),
>> FdtSize);
>> + Fdt->DeviceTreeAddress = NewFdtBase;
>> + }
>> + }
>> + }
>> +
>> + //
>> + // To create Memory Type Information HOB
>> + //
>> + GuidHob = GetFirstGuidHob (&gEfiMemoryTypeInformationGuid);
>> + if (GuidHob == NULL) {
>> + BuildGuidDataHob (
>> + &gEfiMemoryTypeInformationGuid,
>> + mDefaultMemoryTypeInformation,
>> + sizeof (mDefaultMemoryTypeInformation)
>> + );
>> + }
>>
>> //
>> // Create guid hob for acpi board information
>> @@ -588,6 +531,12 @@ BuildHobs (
>> }
>> }
>>
>> + //
>> + // Create an empty FvHob for the DXE FV that contains DXE core.
>> + //
>> + BuildFvHob ((EFI_PHYSICAL_ADDRESS)0, 0);
>> +
>> + BuildFitLoadablesFvHob (DxeFv);
>> //
>> // Update DXE FV information to first fv hob in the hob list, which
>> // is the empty FvHob created before.
>> @@ -600,12 +549,12 @@ BuildHobs (
>>
>> /**
>> Entry point to the C language phase of UEFI payload.
>> - @param[in] BootloaderParameter The starting address of bootloader
>> parameter block.
>> + @param[in] BootloaderParameter The starting address of FDT .
>> @retval It will not return if SUCCESS, and return error when
>> passing bootloader parameter.
>> **/
>> EFI_STATUS
>> EFIAPI
>> -_ModuleEntryPoint (
>> +FitUplEntryPoint (
>> IN UINTN BootloaderParameter
>> )
>> {
>> @@ -613,14 +562,46 @@ _ModuleEntryPoint (
>> PHYSICAL_ADDRESS DxeCoreEntryPoint;
>> EFI_PEI_HOB_POINTERS Hob;
>> EFI_FIRMWARE_VOLUME_HEADER *DxeFv;
>> + PHYSICAL_ADDRESS HobListPtr;
>> + VOID *FdtBase;
>> + VOID *FdtBaseResvd;
>>
>> - mHobList = (VOID *)BootloaderParameter;
>> - DxeFv = NULL;
>> + if (FixedPcdGetBool (PcdHandOffFdtEnable)) {
>> + mHobList = (VOID *)NULL;
>> + } else {
>> + mHobList = (VOID *)BootloaderParameter;
>> + }
>> +
>> + DxeFv = NULL;
>> // Call constructor for all libraries
>> ProcessLibraryConstructorList ();
>>
>> DEBUG ((DEBUG_INFO, "Entering Universal Payload...\n"));
>> DEBUG ((DEBUG_INFO, "sizeof(UINTN) = 0x%x\n", sizeof (UINTN)));
>> + DEBUG ((DEBUG_INFO, "BootloaderParameter = 0x%x\n",
>> BootloaderParameter));
>> +
>> + DEBUG ((DEBUG_INFO, "Start init Hobs...\n"));
>> + HobListPtr = UplInitHob ((VOID *)BootloaderParameter);
>> +
>> + //
>> + // Found hob list node
>> + //
>> + if (HobListPtr != 0) {
>> + FdtBase = (VOID *)BootloaderParameter;
>> + if (FdtCheckHeader (FdtBase) == 0) {
>> + CustomFdtNodeParser ((VOID *)FdtBase, (VOID *)HobListPtr);
>> + } else {
>> + CreatNewHobForHoblist (BootloaderParameter);
>> + }
>> +
>> + FdtBaseResvd = PayloadAllocatePages (4, EfiReservedMemoryType);
>> +
>> + // Build HOB based on information from Bootloader
>> + Status = FitBuildHobs ((UINTN)FdtBaseResvd, &DxeFv);
>> + }
>> +
>> + // Call constructor for all libraries again since hobs were built
>> + ProcessLibraryConstructorList ();
>>
>> DEBUG_CODE (
>> //
>> @@ -629,23 +610,10 @@ _ModuleEntryPoint (
>> PrintHob (mHobList);
>> );
>>
>> - // Initialize floating point operating environment to be compliant
>> with UEFI spec.
>> - InitializeFloatingPointUnits ();
>> -
>> - // Build HOB based on information from Bootloader
>> - Status = BuildHobs (BootloaderParameter, &DxeFv);
>> - ASSERT_EFI_ERROR (Status);
>> -
>> FixUpPcdDatabase (DxeFv);
>> Status = UniversalLoadDxeCore (DxeFv, &DxeCoreEntryPoint);
>> ASSERT_EFI_ERROR (Status);
>>
>> - //
>> - // Mask off all legacy 8259 interrupt sources
>> - //
>> - IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
>> - IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
>> -
>> Hob.HandoffInformationTable = (EFI_HOB_HANDOFF_INFO_TABLE
>> *)GetFirstHob (EFI_HOB_TYPE_HANDOFF);
>> HandOffToDxeCore (DxeCoreEntryPoint, Hob);
>>
>> diff --git a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
>> b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
>> index 61a9f01ec9e7..cf9c03a9a8e9 100644
>> --- a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
>> +++ b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
>> @@ -15,12 +15,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
>> #include <Library/MemoryAllocationLib.h>
>> #include <Library/PcdLib.h>
>> #include <Library/HobLib.h>
>> +#include <Library/FdtLib.h>
>> #include "VirtualMemory.h"
>> #include "UefiPayloadEntry.h"
>>
>> #define STACK_SIZE 0x20000
>> #define IDT_ENTRY_COUNT 32
>>
>> +extern VOID *mHobList;
>> +
>> typedef struct _X64_IDT_TABLE {
>> //
>> // Reserved 4 bytes preceding PeiService and IdtTable,
>> @@ -268,6 +271,15 @@ HandOffToDxeCore (
>> UINT32 Index;
>> X64_IDT_TABLE *IdtTableForX64;
>>
>> + // Initialize floating point operating environment to be compliant
>> with UEFI spec.
>> + InitializeFloatingPointUnits ();
>> +
>> + //
>> + // Mask off all legacy 8259 interrupt sources
>> + //
>> + IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
>> + IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
>> +
>> //
>> // Clear page 0 and mark it as allocated if NULL pointer detection is
>> enabled.
>> //
>> diff --git a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
>> b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
>> similarity index 90%
>> copy from UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
>> copy to UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
>> index 61a9f01ec9e7..439d5bee0b8c 100644
>> --- a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
>> +++ b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
>> @@ -1,10 +1,8 @@
>> /** @file
>> Ia32-specific functionality for DxeLoad.
>>
>> -Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>
>> -Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
>> -
>> -SPDX-License-Identifier: BSD-2-Clause-Patent
>> + Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>
>> + SPDX-License-Identifier: BSD-2-Clause-Patent
>>
>> **/
>>
>> @@ -15,12 +13,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
>> #include <Library/MemoryAllocationLib.h>
>> #include <Library/PcdLib.h>
>> #include <Library/HobLib.h>
>> +#include <Library/FdtLib.h>
>> #include "VirtualMemory.h"
>> #include "UefiPayloadEntry.h"
>>
>> #define STACK_SIZE 0x20000
>> #define IDT_ENTRY_COUNT 32
>>
>> +extern VOID *mHobList;
>> +
>> typedef struct _X64_IDT_TABLE {
>> //
>> // Reserved 4 bytes preceding PeiService and IdtTable,
>> @@ -268,6 +269,15 @@ HandOffToDxeCore (
>> UINT32 Index;
>> X64_IDT_TABLE *IdtTableForX64;
>>
>> + // Initialize floating point operating environment to be compliant
>> with UEFI spec.
>> + InitializeFloatingPointUnits ();
>> +
>> + //
>> + // Mask off all legacy 8259 interrupt sources
>> + //
>> + IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
>> + IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
>> +
>> //
>> // Clear page 0 and mark it as allocated if NULL pointer detection is
>> enabled.
>> //
>> @@ -379,3 +389,17 @@ HandOffToDxeCore (
>> CpuDeadLoop ();
>> }
>> }
>> +
>> +/**
>> + Entry point to the C language phase of UEFI payload.
>> + @param[in] BootloaderParameter The starting address of bootloader
>> parameter block.
>> + @retval It will not return if SUCCESS, and return error when
>> passing bootloader parameter.
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +_ModuleEntryPoint (
>> + IN UINTN BootloaderParameter
>> + )
>> +{
>> + return FitUplEntryPoint (BootloaderParameter);
>> +}
>> diff --git a/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
>> b/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
>> index 83936ae26e68..36edca81f997 100644
>> --- a/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
>> +++ b/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
>> @@ -10,6 +10,56 @@
>>
>> #include "UefiPayloadEntry.h"
>>
>> +/**
>> + Allocates one or more pages of type EfiBootServicesData.
>> +
>> + Allocates the number of pages of MemoryType and returns a pointer to
>> the
>> + allocated buffer. The buffer returned is aligned on a 4KB boundary.
>> + If Pages is 0, then NULL is returned.
>> + If there is not enough memory availble to satisfy the request, then
>> NULL
>> + is returned.
>> +
>> + @param Pages The number of 4 KB pages to allocate.
>> + @param MemoryType The MemoryType
>> + @return A pointer to the allocated buffer or NULL if allocation fails.
>> +**/
>> +VOID *
>> +EFIAPI
>> +PayloadAllocatePages (
>> + IN UINTN Pages,
>> + IN EFI_MEMORY_TYPE MemoryType
>> + )
>> +{
>> + EFI_PEI_HOB_POINTERS Hob;
>> + EFI_PHYSICAL_ADDRESS Offset;
>> + EFI_HOB_HANDOFF_INFO_TABLE *HobTable;
>> +
>> + Hob.Raw = GetHobList ();
>> + HobTable = Hob.HandoffInformationTable;
>> +
>> + if (Pages == 0) {
>> + return NULL;
>> + }
>> +
>> + // Make sure allocation address is page alligned.
>> + Offset = HobTable->EfiFreeMemoryTop & EFI_PAGE_MASK;
>> + if (Offset != 0) {
>> + HobTable->EfiFreeMemoryTop -= Offset;
>> + }
>> +
>> + //
>> + // Check available memory for the allocation
>> + //
>> + if (HobTable->EfiFreeMemoryTop - ((Pages * EFI_PAGE_SIZE) + sizeof
>> (EFI_HOB_MEMORY_ALLOCATION)) < HobTable->EfiFreeMemoryBottom) {
>> + return NULL;
>> + }
>> +
>> + HobTable->EfiFreeMemoryTop -= Pages * EFI_PAGE_SIZE;
>> + BuildMemoryAllocationHob (HobTable->EfiFreeMemoryTop, Pages *
>> EFI_PAGE_SIZE, MemoryType);
>> +
>> + return (VOID *)(UINTN)HobTable->EfiFreeMemoryTop;
>> +}
>> +
>> /**
>> Allocates one or more pages of type EfiBootServicesData.
>>
>> diff --git a/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
>> b/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
>> index b63e93c07ec2..153d1b00f637 100644
>> --- a/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
>> +++ b/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
>> @@ -169,13 +169,13 @@ PrintMemoryAllocationHob (
>> }
>>
>> /**
>> - Print the information in Resource Discriptor Hob.
>> + Print the information in Resource Descriptor Hob.
>> @param[in] HobStart A pointer to HOB of type
>> EFI_HOB_TYPE_RESOURCE_DESCRIPTOR.
>> @param[in] HobLength The Length in bytes of HOB of type
>> EFI_HOB_TYPE_RESOURCE_DESCRIPTOR.
>> @retval EFI_SUCCESS If it completed successfully.
>> **/
>> EFI_STATUS
>> -PrintResourceDiscriptorHob (
>> +PrintResourceDescriptorHob (
>> IN VOID *HobStart,
>> IN UINT16 HobLength
>> )
>> @@ -620,7 +620,7 @@ PrintFv3Hob (
>> HOB_PRINT_HANDLER_TABLE mHobHandles[] = {
>> { EFI_HOB_TYPE_HANDOFF, "EFI_HOB_TYPE_HANDOFF",
>> PrintHandOffHob },
>> { EFI_HOB_TYPE_MEMORY_ALLOCATION, "EFI_HOB_TYPE_MEMORY_ALLOCATION",
>> PrintMemoryAllocationHob },
>> - { EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,
>> "EFI_HOB_TYPE_RESOURCE_DESCRIPTOR", PrintResourceDiscriptorHob },
>> + { EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,
>> "EFI_HOB_TYPE_RESOURCE_DESCRIPTOR", PrintResourceDescriptorHob },
>> { EFI_HOB_TYPE_GUID_EXTENSION, "EFI_HOB_TYPE_GUID_EXTENSION",
>> PrintGuidHob },
>> { EFI_HOB_TYPE_FV, "EFI_HOB_TYPE_FV",
>> PrintFvHob },
>> { EFI_HOB_TYPE_CPU, "EFI_HOB_TYPE_CPU",
>> PrintCpuHob },
>> diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
>> b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
>> index f37c00fad774..5b864eeefe10 100644
>> --- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
>> +++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
>> @@ -486,12 +486,6 @@ _ModuleEntryPoint (
>> Status = UniversalLoadDxeCore (DxeFv, &DxeCoreEntryPoint);
>> ASSERT_EFI_ERROR (Status);
>>
>> - //
>> - // Mask off all legacy 8259 interrupt sources
>> - //
>> - IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
>> - IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
>> -
>> Hob.HandoffInformationTable = (EFI_HOB_HANDOFF_INFO_TABLE
>> *)GetFirstHob (EFI_HOB_TYPE_HANDOFF);
>> HandOffToDxeCore (DxeCoreEntryPoint, Hob);
>>
>> diff --git a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
>> b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
>> index 346e3feb0459..6c3603f12098 100644
>> --- a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
>> +++ b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
>> @@ -13,10 +13,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
>> #include <Library/MemoryAllocationLib.h>
>> #include <Library/PcdLib.h>
>> #include <Library/HobLib.h>
>> +#include <Library/FdtLib.h>
>> #include "X64/VirtualMemory.h"
>> #include "UefiPayloadEntry.h"
>> #define STACK_SIZE 0x20000
>>
>> +extern VOID *mHobList;
>> +
>> /**
>> Transfers control to DxeCore.
>>
>> @@ -40,6 +43,15 @@ HandOffToDxeCore (
>> VOID *GhcbBase;
>> UINTN GhcbSize;
>>
>> + // Initialize floating point operating environment to be compliant
>> with UEFI spec.
>> + InitializeFloatingPointUnits ();
>> +
>> + //
>> + // Mask off all legacy 8259 interrupt sources
>> + //
>> + IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
>> + IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
>> +
>> //
>> // Clear page 0 and mark it as allocated if NULL pointer detection is
>> enabled.
>> //
>> diff --git a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
>> b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
>> similarity index 74%
>> copy from UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
>> copy to UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
>> index 346e3feb0459..35b52a911df3 100644
>> --- a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
>> +++ b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
>> @@ -1,8 +1,8 @@
>> /** @file
>> x64-specifc functionality for DxeLoad.
>>
>> -Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>
>> -SPDX-License-Identifier: BSD-2-Clause-Patent
>> + Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>
>> + SPDX-License-Identifier: BSD-2-Clause-Patent
>>
>> **/
>>
>> @@ -13,10 +13,14 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
>> #include <Library/MemoryAllocationLib.h>
>> #include <Library/PcdLib.h>
>> #include <Library/HobLib.h>
>> +#include <Library/FdtLib.h>
>> +#include <Library/PcdLib.h>
>> #include "X64/VirtualMemory.h"
>> #include "UefiPayloadEntry.h"
>> #define STACK_SIZE 0x20000
>>
>> +extern VOID *mHobList;
>> +
>> /**
>> Transfers control to DxeCore.
>>
>> @@ -40,6 +44,15 @@ HandOffToDxeCore (
>> VOID *GhcbBase;
>> UINTN GhcbSize;
>>
>> + // Initialize floating point operating environment to be compliant
>> with UEFI spec.
>> + InitializeFloatingPointUnits ();
>> +
>> + //
>> + // Mask off all legacy 8259 interrupt sources
>> + //
>> + IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
>> + IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
>> +
>> //
>> // Clear page 0 and mark it as allocated if NULL pointer detection is
>> enabled.
>> //
>> @@ -106,3 +119,17 @@ HandOffToDxeCore (
>> TopOfStack
>> );
>> }
>> +
>> +/**
>> + Entry point to the C language phase of UEFI payload.
>> + @param[in] BootloaderParameter The starting address of bootloader
>> parameter block.
>> + @retval It will not return if SUCCESS, and return error when
>> passing bootloader parameter.
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +_ModuleEntryPoint (
>> + IN UINTN BootloaderParameter
>> + )
>> +{
>> + return FitUplEntryPoint (BootloaderParameter);
>> +}
>> diff --git a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
>> b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
>> index b87a0989eee3..c87e674f7cbd 100644
>> --- a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
>> +++ b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
>> @@ -30,13 +30,13 @@
>> [Sources.Ia32]
>> X64/VirtualMemory.h
>> X64/VirtualMemory.c
>> - Ia32/DxeLoadFunc.c
>> + Ia32/DxeLoadFuncFit.c
>> Ia32/IdtVectorAsm.nasm
>>
>> [Sources.X64]
>> X64/VirtualMemory.h
>> X64/VirtualMemory.c
>> - X64/DxeLoadFunc.c
>> + X64/DxeLoadFuncFit.c
>>
>> [Packages]
>> MdePkg/MdePkg.dec
>> @@ -54,6 +54,8 @@
>> PeCoffLib
>> CpuLib
>> FdtLib
>> + CustomFdtNodeParserLib
>> + PcdLib
>>
>> [Guids]
>> gEfiMemoryTypeInformationGuid
>> @@ -71,6 +73,7 @@
>> gUniversalPayloadAcpiTableGuid
>> gUniversalPayloadPciRootBridgeInfoGuid
>> gUniversalPayloadSmbios3TableGuid
>> + gUniversalPayloadDeviceTreeGuid
>>
>> [FeaturePcd.IA32]
>> gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ##
>> CONSUMES
>> @@ -78,7 +81,6 @@
>> [FeaturePcd.X64]
>> gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables ##
>> CONSUMES
>>
>> -
>> [Pcd.IA32,Pcd.X64]
>> gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile
>> gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable
>> ## SOMETIMES_CONSUMES
>> @@ -88,11 +90,19 @@
>> gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard
>> ## CONSUMES
>> gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbBase
>> ## CONSUMES
>> gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbSize
>> ## CONSUMES
>> -
>> gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemBase
>> gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemSize
>> gUefiPayloadPkgTokenSpaceGuid.PcdSystemMemoryUefiRegionSize
>> -
>> gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack ##
>> SOMETIMES_CONSUMES
>> gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ##
>> SOMETIMES_CONSUMES
>> gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy ##
>> SOMETIMES_CONSUMES
>> + gUefiPayloadPkgTokenSpaceGuid.PcdHandOffFdtEnable
>> + gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiACPIMemoryNVS
>> + gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiACPIReclaimMemory
>> + gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiReservedMemoryType
>> + gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesData
>> + gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesCode
>> +
>> +[BuildOptions]
>> + MSFT:*_*_*_CC_FLAGS = /wd4244 /wd4305
>> + GCC:*_*_*_CC_FLAGS = -Wno-error=pointer-to-int-cast
>> -Wno-error=int-to-pointer-cast
>> diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
>> b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
>> index 80ccc5072c55..09fce8dbcf35 100644
>> --- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
>> +++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
>> @@ -35,6 +35,7 @@
>> #include <UniversalPayload/UniversalPayload.h>
>> #include <UniversalPayload/ExtraData.h>
>> #include <UniversalPayload/SerialPortInfo.h>
>> +#include <UniversalPayload/DeviceTree.h>
>> #include <Guid/PcdDataBaseSignatureGuid.h>
>>
>> #define LEGACY_8259_MASK_REGISTER_MASTER 0x21
>> @@ -134,6 +135,31 @@ UniversalLoadDxeCore (
>> OUT PHYSICAL_ADDRESS *DxeCoreEntryPoint
>> );
>>
>> +/**
>> + It will Parse FDT -node based on information.
>> + @param[in] FdtBase The starting memory address of FdtBase
>> + @retval HobList The base address of Hoblist.
>> +
>> +**/
>> +UINT64
>> +EFIAPI
>> +FdtNodeParser (
>> + IN VOID *FdtBase
>> + );
>> +
>> +/**
>> + It will Parse FDT -custom node based on information.
>> + @param[in] FdtBase The starting memory address of FdtBase
>> + @param[in] HostList The starting memory address of New Hob list.
>> +
>> +**/
>> +UINTN
>> +EFIAPI
>> +CustomFdtNodeParser (
>> + IN VOID *FdtBase,
>> + IN VOID *HostList
>> + );
>> +
>> /**
>> Transfers control to DxeCore.
>>
>> @@ -206,4 +232,46 @@ BuildHobFromAcpi (
>> IN UINT64 AcpiTableBase
>> );
>>
>> +/**
>> + Allocates one or more pages .
>> +
>> + Allocates the number of pages of MemoryType and returns a pointer to
>> the
>> + allocated buffer. The buffer returned is aligned on a 4KB boundary.
>> + If Pages is 0, then NULL is returned.
>> + If there is not enough memory availble to satisfy the request, then
>> NULL
>> + is returned.
>> +
>> + @param Pages The number of 4 KB pages to allocate.
>> + @param MemoryType The Memorytype
>> + @return A pointer to the allocated buffer or NULL if allocation fails.
>> +**/
>> +VOID *
>> +EFIAPI
>> +PayloadAllocatePages (
>> + IN UINTN Pages,
>> + IN EFI_MEMORY_TYPE MemoryType
>> + );
>> +
>> +/**
>> + Entry point to the C language phase of UEFI payload.
>> + @param[in] FdtPrt The starting address of FDT .
>> + @retval It will not return if SUCCESS, and return error when
>> passing bootloader parameter.
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +FitUplEntryPoint (
>> + IN UINTN BootloaderParameter
>> + );
>> +
>> +/**
>> + Entry point to the C language phase of UEFI payload.
>> + @param[in] BootloaderParameter The starting address of bootloader
>> parameter block.
>> + @retval It will not return if SUCCESS, and return error when
>> passing bootloader parameter.
>> +**/
>> +EFI_STATUS
>> +EFIAPI
>> +UplEntryPoint (
>> + IN UINTN BootloaderParameter
>> + );
>> +
>> #endif
>> diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
>> b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
>> index a62da5c7059d..be91f7be2819 100644
>> --- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
>> +++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
>> @@ -6,44 +6,37 @@
>> # SPDX-License-Identifier: BSD-2-Clause-Patent
>> #
>> ##
>> -
>> [Defines]
>> INF_VERSION = 1.30
>> BASE_NAME = UniversalPayloadEntry
>> FILE_GUID = D4F0F269-1209-4A66-8039-C4D5A700EA4E
>> MODULE_TYPE = SEC
>> VERSION_STRING = 1.0
>> -
>> #
>> # The following information is for reference only and not required by
>> the build tools.
>> #
>> # VALID_ARCHITECTURES = IA32 X64
>> #
>> -
>> [Sources]
>> UniversalPayloadEntry.c
>> LoadDxeCore.c
>> MemoryAllocation.c
>> PrintHob.c
>> AcpiTable.c
>> -
>> [Sources.Ia32]
>> X64/VirtualMemory.h
>> X64/VirtualMemory.c
>> Ia32/DxeLoadFunc.c
>> Ia32/IdtVectorAsm.nasm
>> -
>> [Sources.X64]
>> X64/VirtualMemory.h
>> X64/VirtualMemory.c
>> X64/DxeLoadFunc.c
>> -
>> [Packages]
>> MdePkg/MdePkg.dec
>> MdeModulePkg/MdeModulePkg.dec
>> UefiCpuPkg/UefiCpuPkg.dec
>> UefiPayloadPkg/UefiPayloadPkg.dec
>> -
>> [LibraryClasses]
>> BaseMemoryLib
>> DebugLib
>> @@ -69,14 +62,12 @@
>> gUniversalPayloadAcpiTableGuid
>> gUniversalPayloadPciRootBridgeInfoGuid
>> gUniversalPayloadSmbios3TableGuid
>> -
>> + gUniversalPayloadBaseGuid
>> + gUniversalPayloadDeviceTreeGuid
>> [FeaturePcd.IA32]
>> gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ##
>> CONSUMES
>> -
>> [FeaturePcd.X64]
>> gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables ##
>> CONSUMES
>> -
>> -
>> [Pcd.IA32,Pcd.X64]
>> gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile
>> gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable
>> ## SOMETIMES_CONSUMES
>> @@ -86,12 +77,9 @@
>> gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard
>> ## CONSUMES
>> gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbBase
>> ## CONSUMES
>> gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbSize
>> ## CONSUMES
>> -
>> gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemBase
>> gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemSize
>> gUefiPayloadPkgTokenSpaceGuid.PcdSystemMemoryUefiRegionSize
>> -
>> gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack ##
>> SOMETIMES_CONSUMES
>> gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ##
>> SOMETIMES_CONSUMES
>> gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy ##
>> SOMETIMES_CONSUMES
>> -
>> diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc
>> b/UefiPayloadPkg/UefiPayloadPkg.dsc
>> index 2860a659f6a7..779f74da7171 100644
>> --- a/UefiPayloadPkg/UefiPayloadPkg.dsc
>> +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc
>> @@ -55,7 +55,7 @@
>> # ELF: Build UniversalPayload file as UniversalPayload.elf
>> # FIT: Build UniversalPayload file as UniversalPayload.fit
>> #
>> - DEFINE UNIVERSAL_PAYLOAD = FALSE
>> + DEFINE UNIVERSAL_PAYLOAD = TRUE
>> DEFINE UNIVERSAL_PAYLOAD_FORMAT = ELF
>>
>> #
>> @@ -226,6 +226,7 @@
>> OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
>> RngLib|MdePkg/Library/BaseRngLib/BaseRngLib.inf
>> HobLib|UefiPayloadPkg/Library/DxeHobLib/DxeHobLib.inf
>> +
>> CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserNullLib/CustomFdtNodeParserNullLib.inf
>>
>> #
>> # UEFI & PI
>> @@ -470,6 +471,8 @@
>> gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress|0x0
>> gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory|FALSE
>> gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable|TRUE
>> + gUefiPayloadPkgTokenSpaceGuid.PcdHandOffFdtEnable|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 }
>> @@ -513,7 +516,15 @@
>> !endif
>> !endif
>>
>> +
>> [PcdsPatchableInModule.X64]
>> + #
>> + # The following parameters are set by Library/PlatformHookLib
>> + #
>> + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio|FALSE
>> + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase|0x3F8
>> + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialBaudRate|$(BAUD_RATE)
>> + gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterStride|1
>> !if $(NETWORK_DRIVER_ENABLE) == TRUE
>> gEfiNetworkPkgTokenSpaceGuid.PcdAllowHttpConnections|TRUE
>> !endif
>> @@ -635,7 +646,13 @@
>> !if $(UNIVERSAL_PAYLOAD_FORMAT) == "ELF"
>> UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
>> !elseif $(UNIVERSAL_PAYLOAD_FORMAT) == "FIT"
>> - UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
>> + UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf {
>> + <LibraryClasses>
>> + FdtLib|MdePkg/Library/BaseFdtLib/BaseFdtLib.inf
>> +
>> CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserLib/CustomFdtNodeParserLib.inf
>> + NULL|UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf
>> + NULL|UefiPayloadPkg/Library/HobParseLib/HobParseLib.inf
>> + }
>> !else
>> UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
>> !endif
>> @@ -648,7 +665,13 @@
>> !if $(UNIVERSAL_PAYLOAD_FORMAT) == "ELF"
>> UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
>> !elseif $(UNIVERSAL_PAYLOAD_FORMAT) == "FIT"
>> - UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
>> + UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf {
>> + <LibraryClasses>
>> + FdtLib|MdePkg/Library/BaseFdtLib/BaseFdtLib.inf
>> +
>> CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserLib/CustomFdtNodeParserLib.inf
>> + NULL|UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf
>> + NULL|UefiPayloadPkg/Library/HobParseLib/HobParseLib.inf
>> + }
>> !else
>> UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
>> !endif
>> --
>> 2.39.2.windows.1
>>
>>
>
> --
> Thanks!
> =D
>
--
Thanks!
=D
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#119451): https://edk2.groups.io/g/devel/message/119451
Mute This Topic: https://groups.io/mt/106455168/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
[-- Attachment #2: Type: text/html, Size: 52812 bytes --]
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [edk2-devel] [PATCH v4 6/6] UefiPayloadPkg: Update UefiPayload driver for FDT support.
2024-06-03 11:27 ` Dhaval Sharma
2024-06-04 17:18 ` Dhaval Sharma
@ 2024-06-04 23:10 ` Chiu, Chasel
2024-06-05 1:34 ` [edk2-devel] FW: " Linus Liu
1 sibling, 1 reply; 6+ messages in thread
From: Chiu, Chasel @ 2024-06-04 23:10 UTC (permalink / raw)
To: Dhaval Sharma, Liu, Linus
Cc: devel@edk2.groups.io, Lin, Benny, Guo, Gua, Lu, James
[-- Attachment #1: Type: text/plain, Size: 43559 bytes --]
Hi Dhaval,
Thanks for good catch! I just copied your feedbacks to the PR, let’s discuss there which will be easier than mail thread.
Thanks,
Chasel
https://github.com/tianocore/edk2/pull/5669/files#r1626731653
From: Dhaval Sharma <dhaval@rivosinc.com>
Sent: Monday, June 3, 2024 4:28 AM
To: Liu, Linus <linus.liu@intel.com>
Cc: devel@edk2.groups.io; Lin, Benny <benny.lin@intel.com>; Guo, Gua <gua.guo@intel.com>; Chiu, Chasel <chasel.chiu@intel.com>; Lu, James <james.lu@intel.com>
Subject: Re: [PATCH v4 6/6] UefiPayloadPkg: Update UefiPayload driver for FDT support.
BuildFitLoadablesFvHob:
* Fdt variable is not initialized.
* It ONLY gets initialized if GuidHob is found. What if it is not found?
* FdtCheckHeader still evaluating it?
On Mon, Jun 3, 2024 at 7:49 AM Linus Liu <linus.liu@intel.com<mailto:linus.liu@intel.com>> wrote:
Add FDT detection and comsume FDT when needed.
Move some x86 specific function in the x86 folder.
Create HandOffHob via FDT memory node.
Cc: Benny Lin <benny.lin@intel.com<mailto:benny.lin@intel.com>>
Cc: Gua Guo <gua.guo@intel.com<mailto:gua.guo@intel.com>>
Cc: Chasel Chiu <chasel.chiu@intel.com<mailto:chasel.chiu@intel.com>>
Cc: James Lu <james.lu@intel.com<mailto:james.lu@intel.com>>
Cc: Dhaval Sharma <dhaval@rivosinc.com<mailto:dhaval@rivosinc.com>>
Signed-off-by: Linus Liu <linus.liu@intel.com<mailto:linus.liu@intel.com>>
---
UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c | 428 +++++++++-----------
UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c | 12 +
UefiPayloadPkg/UefiPayloadEntry/Ia32/{DxeLoadFunc.c => DxeLoadFuncFit.c} | 32 +-
UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c | 50 +++
UefiPayloadPkg/UefiPayloadEntry/PrintHob.c | 6 +-
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c | 6 -
UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c | 12 +
UefiPayloadPkg/UefiPayloadEntry/X64/{DxeLoadFunc.c => DxeLoadFuncFit.c} | 31 +-
UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf | 20 +-
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h | 68 ++++
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf | 16 +-
UefiPayloadPkg/UefiPayloadPkg.dsc | 29 +-
12 files changed, 443 insertions(+), 267 deletions(-)
diff --git a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
index eb0b325369a0..813d656950d1 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
@@ -6,6 +6,8 @@
#include "UefiPayloadEntry.h"
#include <Library/FdtLib.h>
#include <Guid/UniversalPayloadBase.h>
+#include <Guid/MemoryTypeInformation.h>
+#include <Library/FdtParserLib.h>
#define MEMORY_ATTRIBUTE_MASK (EFI_RESOURCE_ATTRIBUTE_PRESENT | \
EFI_RESOURCE_ATTRIBUTE_INITIALIZED | \
@@ -23,6 +25,15 @@
EFI_RESOURCE_ATTRIBUTE_INITIALIZED | \
EFI_RESOURCE_ATTRIBUTE_TESTED )
+EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {
+ { EfiACPIReclaimMemory, FixedPcdGet32 (PcdMemoryTypeEfiACPIReclaimMemory) },
+ { EfiACPIMemoryNVS, FixedPcdGet32 (PcdMemoryTypeEfiACPIMemoryNVS) },
+ { EfiReservedMemoryType, FixedPcdGet32 (PcdMemoryTypeEfiReservedMemoryType) },
+ { EfiRuntimeServicesData, FixedPcdGet32 (PcdMemoryTypeEfiRuntimeServicesData) },
+ { EfiRuntimeServicesCode, FixedPcdGet32 (PcdMemoryTypeEfiRuntimeServicesCode) },
+ { EfiMaxMemoryType, 0 }
+};
+
extern VOID *mHobList;
CHAR8 *mLineBuffer = NULL;
@@ -36,6 +47,78 @@ PrintHob (
IN CONST VOID *HobStart
);
+/**
+ Add HOB into HOB list
+ @param[in] Hob The HOB to be added into the HOB list.
+**/
+VOID
+AddNewHob (
+ IN EFI_PEI_HOB_POINTERS *Hob
+ );
+
+/**
+ Found the Resource Descriptor HOB that contains a range (Base, Top)
+ @param[in] HobList Hob start address
+ @param[in] Base Memory start address
+ @param[in] Top Memory end address.
+ @retval The pointer to the Resource Descriptor HOB.
+**/
+EFI_HOB_RESOURCE_DESCRIPTOR *
+FindResourceDescriptorByRange (
+ IN VOID *HobList,
+ IN EFI_PHYSICAL_ADDRESS Base,
+ IN EFI_PHYSICAL_ADDRESS Top
+ );
+
+/**
+ Find the highest below 4G memory resource descriptor, except the input Resource Descriptor.
+ @param[in] HobList Hob start address
+ @param[in] MinimalNeededSize Minimal needed size.
+ @param[in] ExceptResourceHob Ignore this Resource Descriptor.
+ @retval The pointer to the Resource Descriptor HOB.
+**/
+EFI_HOB_RESOURCE_DESCRIPTOR *
+FindAnotherHighestBelow4GResourceDescriptor (
+ IN VOID *HobList,
+ IN UINTN MinimalNeededSize,
+ IN EFI_HOB_RESOURCE_DESCRIPTOR *ExceptResourceHob
+ );
+
+/**
+ Check the HOB and decide if it is need inside Payload
+ Payload maintainer may make decision which HOB is need or needn't
+ Then add the check logic in the function.
+ @param[in] Hob The HOB to check
+ @retval TRUE If HOB is need inside Payload
+ @retval FALSE If HOB is needn't inside Payload
+**/
+BOOLEAN
+FitIsHobNeed (
+ EFI_PEI_HOB_POINTERS Hob
+ );
+
+/**
+ Check the HOB and decide if it is need inside Payload
+
+ Payload maintainer may make decision which HOB is need or needn't
+ Then add the check logic in the function.
+
+ @param[in] Hob The HOB to check
+
+ @retval TRUE If HOB is need inside Payload
+ @retval FALSE If HOB is needn't inside Payload
+**/
+BOOLEAN
+IsHobNeed (
+ EFI_PEI_HOB_POINTERS Hob
+ );
+
+VOID
+EFIAPI
+ProcessLibraryConstructorList (
+ VOID
+ );
+
/**
Find the first substring.
@param String Point to the string where to find the substring.
@@ -191,187 +274,6 @@ FixUpPcdDatabase (
return EFI_SUCCESS;
}
-/**
- Add HOB into HOB list
- @param[in] Hob The HOB to be added into the HOB list.
-**/
-VOID
-AddNewHob (
- IN EFI_PEI_HOB_POINTERS *Hob
- )
-{
- EFI_PEI_HOB_POINTERS NewHob;
-
- if (Hob->Raw == NULL) {
- return;
- }
-
- NewHob.Header = CreateHob (Hob->Header->HobType, Hob->Header->HobLength);
- ASSERT (NewHob.Header != NULL);
- if (NewHob.Header == NULL) {
- return;
- }
-
- CopyMem (NewHob.Header + 1, Hob->Header + 1, Hob->Header->HobLength - sizeof (EFI_HOB_GENERIC_HEADER));
-}
-
-/**
- Found the Resource Descriptor HOB that contains a range (Base, Top)
- @param[in] HobList Hob start address
- @param[in] Base Memory start address
- @param[in] Top Memory end address.
- @retval The pointer to the Resource Descriptor HOB.
-**/
-EFI_HOB_RESOURCE_DESCRIPTOR *
-FindResourceDescriptorByRange (
- IN VOID *HobList,
- IN EFI_PHYSICAL_ADDRESS Base,
- IN EFI_PHYSICAL_ADDRESS Top
- )
-{
- EFI_PEI_HOB_POINTERS Hob;
- EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
-
- for (Hob.Raw = (UINT8 *)HobList; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
- //
- // Skip all HOBs except Resource Descriptor HOBs
- //
- if (GET_HOB_TYPE (Hob) != EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
- continue;
- }
-
- //
- // Skip Resource Descriptor HOBs that do not describe tested system memory
- //
- ResourceHob = Hob.ResourceDescriptor;
- if (ResourceHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY) {
- continue;
- }
-
- if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) != TESTED_MEMORY_ATTRIBUTES) {
- continue;
- }
-
- //
- // Skip Resource Descriptor HOBs that do not contain the PHIT range EfiFreeMemoryBottom..EfiFreeMemoryTop
- //
- if (Base < ResourceHob->PhysicalStart) {
- continue;
- }
-
- if (Top > (ResourceHob->PhysicalStart + ResourceHob->ResourceLength)) {
- continue;
- }
-
- return ResourceHob;
- }
-
- return NULL;
-}
-
-/**
- Find the highest below 4G memory resource descriptor, except the input Resource Descriptor.
- @param[in] HobList Hob start address
- @param[in] MinimalNeededSize Minimal needed size.
- @param[in] ExceptResourceHob Ignore this Resource Descriptor.
- @retval The pointer to the Resource Descriptor HOB.
-**/
-EFI_HOB_RESOURCE_DESCRIPTOR *
-FindAnotherHighestBelow4GResourceDescriptor (
- IN VOID *HobList,
- IN UINTN MinimalNeededSize,
- IN EFI_HOB_RESOURCE_DESCRIPTOR *ExceptResourceHob
- )
-{
- EFI_PEI_HOB_POINTERS Hob;
- EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
- EFI_HOB_RESOURCE_DESCRIPTOR *ReturnResourceHob;
-
- ReturnResourceHob = NULL;
-
- for (Hob.Raw = (UINT8 *)HobList; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
- //
- // Skip all HOBs except Resource Descriptor HOBs
- //
- if (GET_HOB_TYPE (Hob) != EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
- continue;
- }
-
- //
- // Skip Resource Descriptor HOBs that do not describe tested system memory
- //
- ResourceHob = Hob.ResourceDescriptor;
- if (ResourceHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY) {
- continue;
- }
-
- if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) != TESTED_MEMORY_ATTRIBUTES) {
- continue;
- }
-
- //
- // Skip if the Resource Descriptor HOB equals to ExceptResourceHob
- //
- if (ResourceHob == ExceptResourceHob) {
- continue;
- }
-
- //
- // Skip Resource Descriptor HOBs that are beyond 4G
- //
- if ((ResourceHob->PhysicalStart + ResourceHob->ResourceLength) > BASE_4GB) {
- continue;
- }
-
- //
- // Skip Resource Descriptor HOBs that are too small
- //
- if (ResourceHob->ResourceLength < MinimalNeededSize) {
- continue;
- }
-
- //
- // Return the topest Resource Descriptor
- //
- if (ReturnResourceHob == NULL) {
- ReturnResourceHob = ResourceHob;
- } else {
- if (ReturnResourceHob->PhysicalStart < ResourceHob->PhysicalStart) {
- ReturnResourceHob = ResourceHob;
- }
- }
- }
-
- return ReturnResourceHob;
-}
-
-/**
- Check the HOB and decide if it is need inside Payload
- Payload maintainer may make decision which HOB is need or needn't
- Then add the check logic in the function.
- @param[in] Hob The HOB to check
- @retval TRUE If HOB is need inside Payload
- @retval FALSE If HOB is needn't inside Payload
-**/
-BOOLEAN
-IsHobNeed (
- EFI_PEI_HOB_POINTERS Hob
- )
-{
- if (Hob.Header->HobType == EFI_HOB_TYPE_HANDOFF) {
- return FALSE;
- }
-
- if (Hob.Header->HobType == EFI_HOB_TYPE_MEMORY_ALLOCATION) {
- if (CompareGuid (&Hob.MemoryAllocationModule->MemoryAllocationHeader.Name, &gEfiHobMemoryAllocModuleGuid)) {
- return FALSE;
- }
- }
-
- // Arrive here mean the HOB is need
- return TRUE;
-}
-
/**
It will build Fv HOBs based on information from bootloaders.
@param[out] DxeFv The pointer to the DXE FV in memory.
@@ -409,21 +311,25 @@ BuildFitLoadablesFvHob (
Status = FdtCheckHeader (Fdt);
if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_INFO, "FdtCheckHeader UPSUPPORTED\n"));
return EFI_UNSUPPORTED;
}
ConfigNode = FdtSubnodeOffsetNameLen (Fdt, 0, "configurations", (INT32)AsciiStrLen ("configurations"));
if (ConfigNode <= 0) {
+ DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob configurations EFI_NOT_FOUND\n"));
return EFI_NOT_FOUND;
}
Config1Node = FdtSubnodeOffsetNameLen (Fdt, ConfigNode, "conf-1", (INT32)AsciiStrLen ("conf-1"));
if (Config1Node <= 0) {
+ DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob conf-1 EFI_NOT_FOUND\n"));
return EFI_NOT_FOUND;
}
ImageNode = FdtSubnodeOffsetNameLen (Fdt, 0, "images", (INT32)AsciiStrLen ("images"));
if (ImageNode <= 0) {
+ DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob images EFI_NOT_FOUND\n"));
return EFI_NOT_FOUND;
}
@@ -467,31 +373,25 @@ BuildFitLoadablesFvHob (
}
/**
- It will build HOBs based on information from bootloaders.
- @param[in] BootloaderParameter The starting memory address of bootloader parameter block.
- @param[out] DxeFv The pointer to the DXE FV in memory.
- @retval EFI_SUCCESS If it completed successfully.
- @retval Others If it failed to build required HOBs.
+ *
+ Create new HOB for new HOB list
+
+ @param[in] BootloaderParameter The HOB to be added into the HOB list.
**/
-EFI_STATUS
-BuildHobs (
- IN UINTN BootloaderParameter,
- OUT EFI_FIRMWARE_VOLUME_HEADER **DxeFv
+VOID
+CreatNewHobForHoblist (
+ IN UINTN BootloaderParameter
)
{
- EFI_PEI_HOB_POINTERS Hob;
- UINTN MinimalNeededSize;
- EFI_PHYSICAL_ADDRESS FreeMemoryBottom;
- EFI_PHYSICAL_ADDRESS FreeMemoryTop;
- EFI_PHYSICAL_ADDRESS MemoryBottom;
- EFI_PHYSICAL_ADDRESS MemoryTop;
- EFI_HOB_RESOURCE_DESCRIPTOR *PhitResourceHob;
- EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
- UINT8 *GuidHob;
- EFI_HOB_FIRMWARE_VOLUME *FvHob;
- UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTable;
- ACPI_BOARD_INFO *AcpiBoardInfo;
- EFI_HOB_HANDOFF_INFO_TABLE *HobInfo;
+ EFI_PEI_HOB_POINTERS Hob;
+ UINTN MinimalNeededSize;
+ EFI_PHYSICAL_ADDRESS FreeMemoryBottom;
+ EFI_PHYSICAL_ADDRESS FreeMemoryTop;
+ EFI_PHYSICAL_ADDRESS MemoryBottom;
+ EFI_PHYSICAL_ADDRESS MemoryTop;
+ EFI_HOB_RESOURCE_DESCRIPTOR *PhitResourceHob;
+ EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
+ EFI_HOB_HANDOFF_INFO_TABLE *HobInfo;
Hob.Raw = (UINT8 *)BootloaderParameter;
MinimalNeededSize = FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);
@@ -512,7 +412,7 @@ BuildHobs (
//
ResourceHob = FindAnotherHighestBelow4GResourceDescriptor (Hob.Raw, MinimalNeededSize, NULL);
if (ResourceHob == NULL) {
- return EFI_NOT_FOUND;
+ return;
}
MemoryBottom = ResourceHob->PhysicalStart + ResourceHob->ResourceLength - MinimalNeededSize;
@@ -542,7 +442,7 @@ BuildHobs (
//
ResourceHob = FindAnotherHighestBelow4GResourceDescriptor (Hob.Raw, MinimalNeededSize, PhitResourceHob);
if (ResourceHob == NULL) {
- return EFI_NOT_FOUND;
+ return;
}
MemoryBottom = ResourceHob->PhysicalStart + ResourceHob->ResourceLength - MinimalNeededSize;
@@ -553,14 +453,7 @@ BuildHobs (
HobInfo = HobConstructor ((VOID *)(UINTN)MemoryBottom, (VOID *)(UINTN)MemoryTop, (VOID *)(UINTN)FreeMemoryBottom, (VOID *)(UINTN)FreeMemoryTop);
HobInfo->BootMode = Hob.HandoffInformationTable->BootMode;
- //
- // 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.
//
@@ -573,7 +466,57 @@ BuildHobs (
Hob.Raw = GET_NEXT_HOB (Hob);
}
- BuildFitLoadablesFvHob (DxeFv);
+ return;
+}
+
+/**
+ It will build HOBs based on information from bootloaders.
+ @param[in] NewFdtBase The pointer to New FdtBase.
+ @param[out] DxeFv The pointer to the DXE FV in memory.
+ @retval EFI_SUCCESS If it completed successfully.
+ @retval Others If it failed to build required HOBs.
+**/
+EFI_STATUS
+FitBuildHobs (
+ IN UINTN NewFdtBase,
+ OUT EFI_FIRMWARE_VOLUME_HEADER **DxeFv
+ )
+{
+ UINT8 *GuidHob;
+ UINT32 FdtSize;
+ EFI_HOB_FIRMWARE_VOLUME *FvHob;
+ UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTable;
+ ACPI_BOARD_INFO *AcpiBoardInfo;
+ UNIVERSAL_PAYLOAD_DEVICE_TREE *Fdt;
+
+ if (FixedPcdGetBool (PcdHandOffFdtEnable)) {
+ //
+ // Back up FDT in Reserved memory region
+ //
+
+ GuidHob = GetFirstGuidHob (&gUniversalPayloadDeviceTreeGuid);
+ if (GuidHob != NULL) {
+ Fdt = (UNIVERSAL_PAYLOAD_DEVICE_TREE *)GET_GUID_HOB_DATA (GuidHob);
+ if (Fdt != NULL) {
+ DEBUG ((DEBUG_INFO, "Update FDT base to reserved memory\n"));
+ FdtSize = 4 * EFI_PAGE_SIZE;
+ CopyMem ((VOID *)NewFdtBase, (VOID *)(Fdt->DeviceTreeAddress), FdtSize);
+ Fdt->DeviceTreeAddress = NewFdtBase;
+ }
+ }
+ }
+
+ //
+ // To create Memory Type Information HOB
+ //
+ GuidHob = GetFirstGuidHob (&gEfiMemoryTypeInformationGuid);
+ if (GuidHob == NULL) {
+ BuildGuidDataHob (
+ &gEfiMemoryTypeInformationGuid,
+ mDefaultMemoryTypeInformation,
+ sizeof (mDefaultMemoryTypeInformation)
+ );
+ }
//
// Create guid hob for acpi board information
@@ -588,6 +531,12 @@ BuildHobs (
}
}
+ //
+ // Create an empty FvHob for the DXE FV that contains DXE core.
+ //
+ BuildFvHob ((EFI_PHYSICAL_ADDRESS)0, 0);
+
+ BuildFitLoadablesFvHob (DxeFv);
//
// Update DXE FV information to first fv hob in the hob list, which
// is the empty FvHob created before.
@@ -600,12 +549,12 @@ BuildHobs (
/**
Entry point to the C language phase of UEFI payload.
- @param[in] BootloaderParameter The starting address of bootloader parameter block.
+ @param[in] BootloaderParameter The starting address of FDT .
@retval It will not return if SUCCESS, and return error when passing bootloader parameter.
**/
EFI_STATUS
EFIAPI
-_ModuleEntryPoint (
+FitUplEntryPoint (
IN UINTN BootloaderParameter
)
{
@@ -613,14 +562,46 @@ _ModuleEntryPoint (
PHYSICAL_ADDRESS DxeCoreEntryPoint;
EFI_PEI_HOB_POINTERS Hob;
EFI_FIRMWARE_VOLUME_HEADER *DxeFv;
+ PHYSICAL_ADDRESS HobListPtr;
+ VOID *FdtBase;
+ VOID *FdtBaseResvd;
- mHobList = (VOID *)BootloaderParameter;
- DxeFv = NULL;
+ if (FixedPcdGetBool (PcdHandOffFdtEnable)) {
+ mHobList = (VOID *)NULL;
+ } else {
+ mHobList = (VOID *)BootloaderParameter;
+ }
+
+ DxeFv = NULL;
// Call constructor for all libraries
ProcessLibraryConstructorList ();
DEBUG ((DEBUG_INFO, "Entering Universal Payload...\n"));
DEBUG ((DEBUG_INFO, "sizeof(UINTN) = 0x%x\n", sizeof (UINTN)));
+ DEBUG ((DEBUG_INFO, "BootloaderParameter = 0x%x\n", BootloaderParameter));
+
+ DEBUG ((DEBUG_INFO, "Start init Hobs...\n"));
+ HobListPtr = UplInitHob ((VOID *)BootloaderParameter);
+
+ //
+ // Found hob list node
+ //
+ if (HobListPtr != 0) {
+ FdtBase = (VOID *)BootloaderParameter;
+ if (FdtCheckHeader (FdtBase) == 0) {
+ CustomFdtNodeParser ((VOID *)FdtBase, (VOID *)HobListPtr);
+ } else {
+ CreatNewHobForHoblist (BootloaderParameter);
+ }
+
+ FdtBaseResvd = PayloadAllocatePages (4, EfiReservedMemoryType);
+
+ // Build HOB based on information from Bootloader
+ Status = FitBuildHobs ((UINTN)FdtBaseResvd, &DxeFv);
+ }
+
+ // Call constructor for all libraries again since hobs were built
+ ProcessLibraryConstructorList ();
DEBUG_CODE (
//
@@ -629,23 +610,10 @@ _ModuleEntryPoint (
PrintHob (mHobList);
);
- // Initialize floating point operating environment to be compliant with UEFI spec.
- InitializeFloatingPointUnits ();
-
- // Build HOB based on information from Bootloader
- Status = BuildHobs (BootloaderParameter, &DxeFv);
- ASSERT_EFI_ERROR (Status);
-
FixUpPcdDatabase (DxeFv);
Status = UniversalLoadDxeCore (DxeFv, &DxeCoreEntryPoint);
ASSERT_EFI_ERROR (Status);
- //
- // Mask off all legacy 8259 interrupt sources
- //
- IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
- IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
-
Hob.HandoffInformationTable = (EFI_HOB_HANDOFF_INFO_TABLE *)GetFirstHob (EFI_HOB_TYPE_HANDOFF);
HandOffToDxeCore (DxeCoreEntryPoint, Hob);
diff --git a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
index 61a9f01ec9e7..cf9c03a9a8e9 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
@@ -15,12 +15,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h>
#include <Library/HobLib.h>
+#include <Library/FdtLib.h>
#include "VirtualMemory.h"
#include "UefiPayloadEntry.h"
#define STACK_SIZE 0x20000
#define IDT_ENTRY_COUNT 32
+extern VOID *mHobList;
+
typedef struct _X64_IDT_TABLE {
//
// Reserved 4 bytes preceding PeiService and IdtTable,
@@ -268,6 +271,15 @@ HandOffToDxeCore (
UINT32 Index;
X64_IDT_TABLE *IdtTableForX64;
+ // Initialize floating point operating environment to be compliant with UEFI spec.
+ InitializeFloatingPointUnits ();
+
+ //
+ // Mask off all legacy 8259 interrupt sources
+ //
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
//
// Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
//
diff --git a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
similarity index 90%
copy from UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
copy to UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
index 61a9f01ec9e7..439d5bee0b8c 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
@@ -1,10 +1,8 @@
/** @file
Ia32-specific functionality for DxeLoad.
-Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>
-Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
-
-SPDX-License-Identifier: BSD-2-Clause-Patent
+ Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -15,12 +13,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h>
#include <Library/HobLib.h>
+#include <Library/FdtLib.h>
#include "VirtualMemory.h"
#include "UefiPayloadEntry.h"
#define STACK_SIZE 0x20000
#define IDT_ENTRY_COUNT 32
+extern VOID *mHobList;
+
typedef struct _X64_IDT_TABLE {
//
// Reserved 4 bytes preceding PeiService and IdtTable,
@@ -268,6 +269,15 @@ HandOffToDxeCore (
UINT32 Index;
X64_IDT_TABLE *IdtTableForX64;
+ // Initialize floating point operating environment to be compliant with UEFI spec.
+ InitializeFloatingPointUnits ();
+
+ //
+ // Mask off all legacy 8259 interrupt sources
+ //
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
//
// Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
//
@@ -379,3 +389,17 @@ HandOffToDxeCore (
CpuDeadLoop ();
}
}
+
+/**
+ Entry point to the C language phase of UEFI payload.
+ @param[in] BootloaderParameter The starting address of bootloader parameter block.
+ @retval It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+_ModuleEntryPoint (
+ IN UINTN BootloaderParameter
+ )
+{
+ return FitUplEntryPoint (BootloaderParameter);
+}
diff --git a/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c b/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
index 83936ae26e68..36edca81f997 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
@@ -10,6 +10,56 @@
#include "UefiPayloadEntry.h"
+/**
+ Allocates one or more pages of type EfiBootServicesData.
+
+ Allocates the number of pages of MemoryType and returns a pointer to the
+ allocated buffer. The buffer returned is aligned on a 4KB boundary.
+ If Pages is 0, then NULL is returned.
+ If there is not enough memory availble to satisfy the request, then NULL
+ is returned.
+
+ @param Pages The number of 4 KB pages to allocate.
+ @param MemoryType The MemoryType
+ @return A pointer to the allocated buffer or NULL if allocation fails.
+**/
+VOID *
+EFIAPI
+PayloadAllocatePages (
+ IN UINTN Pages,
+ IN EFI_MEMORY_TYPE MemoryType
+ )
+{
+ EFI_PEI_HOB_POINTERS Hob;
+ EFI_PHYSICAL_ADDRESS Offset;
+ EFI_HOB_HANDOFF_INFO_TABLE *HobTable;
+
+ Hob.Raw = GetHobList ();
+ HobTable = Hob.HandoffInformationTable;
+
+ if (Pages == 0) {
+ return NULL;
+ }
+
+ // Make sure allocation address is page alligned.
+ Offset = HobTable->EfiFreeMemoryTop & EFI_PAGE_MASK;
+ if (Offset != 0) {
+ HobTable->EfiFreeMemoryTop -= Offset;
+ }
+
+ //
+ // Check available memory for the allocation
+ //
+ if (HobTable->EfiFreeMemoryTop - ((Pages * EFI_PAGE_SIZE) + sizeof (EFI_HOB_MEMORY_ALLOCATION)) < HobTable->EfiFreeMemoryBottom) {
+ return NULL;
+ }
+
+ HobTable->EfiFreeMemoryTop -= Pages * EFI_PAGE_SIZE;
+ BuildMemoryAllocationHob (HobTable->EfiFreeMemoryTop, Pages * EFI_PAGE_SIZE, MemoryType);
+
+ return (VOID *)(UINTN)HobTable->EfiFreeMemoryTop;
+}
+
/**
Allocates one or more pages of type EfiBootServicesData.
diff --git a/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c b/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
index b63e93c07ec2..153d1b00f637 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
@@ -169,13 +169,13 @@ PrintMemoryAllocationHob (
}
/**
- Print the information in Resource Discriptor Hob.
+ Print the information in Resource Descriptor Hob.
@param[in] HobStart A pointer to HOB of type EFI_HOB_TYPE_RESOURCE_DESCRIPTOR.
@param[in] HobLength The Length in bytes of HOB of type EFI_HOB_TYPE_RESOURCE_DESCRIPTOR.
@retval EFI_SUCCESS If it completed successfully.
**/
EFI_STATUS
-PrintResourceDiscriptorHob (
+PrintResourceDescriptorHob (
IN VOID *HobStart,
IN UINT16 HobLength
)
@@ -620,7 +620,7 @@ PrintFv3Hob (
HOB_PRINT_HANDLER_TABLE mHobHandles[] = {
{ EFI_HOB_TYPE_HANDOFF, "EFI_HOB_TYPE_HANDOFF", PrintHandOffHob },
{ EFI_HOB_TYPE_MEMORY_ALLOCATION, "EFI_HOB_TYPE_MEMORY_ALLOCATION", PrintMemoryAllocationHob },
- { EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, "EFI_HOB_TYPE_RESOURCE_DESCRIPTOR", PrintResourceDiscriptorHob },
+ { EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, "EFI_HOB_TYPE_RESOURCE_DESCRIPTOR", PrintResourceDescriptorHob },
{ EFI_HOB_TYPE_GUID_EXTENSION, "EFI_HOB_TYPE_GUID_EXTENSION", PrintGuidHob },
{ EFI_HOB_TYPE_FV, "EFI_HOB_TYPE_FV", PrintFvHob },
{ EFI_HOB_TYPE_CPU, "EFI_HOB_TYPE_CPU", PrintCpuHob },
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
index f37c00fad774..5b864eeefe10 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
@@ -486,12 +486,6 @@ _ModuleEntryPoint (
Status = UniversalLoadDxeCore (DxeFv, &DxeCoreEntryPoint);
ASSERT_EFI_ERROR (Status);
- //
- // Mask off all legacy 8259 interrupt sources
- //
- IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
- IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
-
Hob.HandoffInformationTable = (EFI_HOB_HANDOFF_INFO_TABLE *)GetFirstHob (EFI_HOB_TYPE_HANDOFF);
HandOffToDxeCore (DxeCoreEntryPoint, Hob);
diff --git a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
index 346e3feb0459..6c3603f12098 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
@@ -13,10 +13,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h>
#include <Library/HobLib.h>
+#include <Library/FdtLib.h>
#include "X64/VirtualMemory.h"
#include "UefiPayloadEntry.h"
#define STACK_SIZE 0x20000
+extern VOID *mHobList;
+
/**
Transfers control to DxeCore.
@@ -40,6 +43,15 @@ HandOffToDxeCore (
VOID *GhcbBase;
UINTN GhcbSize;
+ // Initialize floating point operating environment to be compliant with UEFI spec.
+ InitializeFloatingPointUnits ();
+
+ //
+ // Mask off all legacy 8259 interrupt sources
+ //
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
//
// Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
//
diff --git a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
similarity index 74%
copy from UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
copy to UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
index 346e3feb0459..35b52a911df3 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
@@ -1,8 +1,8 @@
/** @file
x64-specifc functionality for DxeLoad.
-Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
+ Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -13,10 +13,14 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h>
#include <Library/HobLib.h>
+#include <Library/FdtLib.h>
+#include <Library/PcdLib.h>
#include "X64/VirtualMemory.h"
#include "UefiPayloadEntry.h"
#define STACK_SIZE 0x20000
+extern VOID *mHobList;
+
/**
Transfers control to DxeCore.
@@ -40,6 +44,15 @@ HandOffToDxeCore (
VOID *GhcbBase;
UINTN GhcbSize;
+ // Initialize floating point operating environment to be compliant with UEFI spec.
+ InitializeFloatingPointUnits ();
+
+ //
+ // Mask off all legacy 8259 interrupt sources
+ //
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
//
// Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
//
@@ -106,3 +119,17 @@ HandOffToDxeCore (
TopOfStack
);
}
+
+/**
+ Entry point to the C language phase of UEFI payload.
+ @param[in] BootloaderParameter The starting address of bootloader parameter block.
+ @retval It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+_ModuleEntryPoint (
+ IN UINTN BootloaderParameter
+ )
+{
+ return FitUplEntryPoint (BootloaderParameter);
+}
diff --git a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
index b87a0989eee3..c87e674f7cbd 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
+++ b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
@@ -30,13 +30,13 @@
[Sources.Ia32]
X64/VirtualMemory.h
X64/VirtualMemory.c
- Ia32/DxeLoadFunc.c
+ Ia32/DxeLoadFuncFit.c
Ia32/IdtVectorAsm.nasm
[Sources.X64]
X64/VirtualMemory.h
X64/VirtualMemory.c
- X64/DxeLoadFunc.c
+ X64/DxeLoadFuncFit.c
[Packages]
MdePkg/MdePkg.dec
@@ -54,6 +54,8 @@
PeCoffLib
CpuLib
FdtLib
+ CustomFdtNodeParserLib
+ PcdLib
[Guids]
gEfiMemoryTypeInformationGuid
@@ -71,6 +73,7 @@
gUniversalPayloadAcpiTableGuid
gUniversalPayloadPciRootBridgeInfoGuid
gUniversalPayloadSmbios3TableGuid
+ gUniversalPayloadDeviceTreeGuid
[FeaturePcd.IA32]
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ## CONSUMES
@@ -78,7 +81,6 @@
[FeaturePcd.X64]
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables ## CONSUMES
-
[Pcd.IA32,Pcd.X64]
gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile
gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable ## SOMETIMES_CONSUMES
@@ -88,11 +90,19 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbBase ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbSize ## CONSUMES
-
gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemBase
gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemSize
gUefiPayloadPkgTokenSpaceGuid.PcdSystemMemoryUefiRegionSize
-
gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy ## SOMETIMES_CONSUMES
+ gUefiPayloadPkgTokenSpaceGuid.PcdHandOffFdtEnable
+ gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiACPIMemoryNVS
+ gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiACPIReclaimMemory
+ gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiReservedMemoryType
+ gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesData
+ gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesCode
+
+[BuildOptions]
+ MSFT:*_*_*_CC_FLAGS = /wd4244 /wd4305
+ GCC:*_*_*_CC_FLAGS = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
index 80ccc5072c55..09fce8dbcf35 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
+++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
@@ -35,6 +35,7 @@
#include <UniversalPayload/UniversalPayload.h>
#include <UniversalPayload/ExtraData.h>
#include <UniversalPayload/SerialPortInfo.h>
+#include <UniversalPayload/DeviceTree.h>
#include <Guid/PcdDataBaseSignatureGuid.h>
#define LEGACY_8259_MASK_REGISTER_MASTER 0x21
@@ -134,6 +135,31 @@ UniversalLoadDxeCore (
OUT PHYSICAL_ADDRESS *DxeCoreEntryPoint
);
+/**
+ It will Parse FDT -node based on information.
+ @param[in] FdtBase The starting memory address of FdtBase
+ @retval HobList The base address of Hoblist.
+
+**/
+UINT64
+EFIAPI
+FdtNodeParser (
+ IN VOID *FdtBase
+ );
+
+/**
+ It will Parse FDT -custom node based on information.
+ @param[in] FdtBase The starting memory address of FdtBase
+ @param[in] HostList The starting memory address of New Hob list.
+
+**/
+UINTN
+EFIAPI
+CustomFdtNodeParser (
+ IN VOID *FdtBase,
+ IN VOID *HostList
+ );
+
/**
Transfers control to DxeCore.
@@ -206,4 +232,46 @@ BuildHobFromAcpi (
IN UINT64 AcpiTableBase
);
+/**
+ Allocates one or more pages .
+
+ Allocates the number of pages of MemoryType and returns a pointer to the
+ allocated buffer. The buffer returned is aligned on a 4KB boundary.
+ If Pages is 0, then NULL is returned.
+ If there is not enough memory availble to satisfy the request, then NULL
+ is returned.
+
+ @param Pages The number of 4 KB pages to allocate.
+ @param MemoryType The Memorytype
+ @return A pointer to the allocated buffer or NULL if allocation fails.
+**/
+VOID *
+EFIAPI
+PayloadAllocatePages (
+ IN UINTN Pages,
+ IN EFI_MEMORY_TYPE MemoryType
+ );
+
+/**
+ Entry point to the C language phase of UEFI payload.
+ @param[in] FdtPrt The starting address of FDT .
+ @retval It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+FitUplEntryPoint (
+ IN UINTN BootloaderParameter
+ );
+
+/**
+ Entry point to the C language phase of UEFI payload.
+ @param[in] BootloaderParameter The starting address of bootloader parameter block.
+ @retval It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+UplEntryPoint (
+ IN UINTN BootloaderParameter
+ );
+
#endif
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
index a62da5c7059d..be91f7be2819 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
+++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
@@ -6,44 +6,37 @@
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
##
-
[Defines]
INF_VERSION = 1.30
BASE_NAME = UniversalPayloadEntry
FILE_GUID = D4F0F269-1209-4A66-8039-C4D5A700EA4E
MODULE_TYPE = SEC
VERSION_STRING = 1.0
-
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64
#
-
[Sources]
UniversalPayloadEntry.c
LoadDxeCore.c
MemoryAllocation.c
PrintHob.c
AcpiTable.c
-
[Sources.Ia32]
X64/VirtualMemory.h
X64/VirtualMemory.c
Ia32/DxeLoadFunc.c
Ia32/IdtVectorAsm.nasm
-
[Sources.X64]
X64/VirtualMemory.h
X64/VirtualMemory.c
X64/DxeLoadFunc.c
-
[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
UefiCpuPkg/UefiCpuPkg.dec
UefiPayloadPkg/UefiPayloadPkg.dec
-
[LibraryClasses]
BaseMemoryLib
DebugLib
@@ -69,14 +62,12 @@
gUniversalPayloadAcpiTableGuid
gUniversalPayloadPciRootBridgeInfoGuid
gUniversalPayloadSmbios3TableGuid
-
+ gUniversalPayloadBaseGuid
+ gUniversalPayloadDeviceTreeGuid
[FeaturePcd.IA32]
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ## CONSUMES
-
[FeaturePcd.X64]
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables ## CONSUMES
-
-
[Pcd.IA32,Pcd.X64]
gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile
gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable ## SOMETIMES_CONSUMES
@@ -86,12 +77,9 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbBase ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbSize ## CONSUMES
-
gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemBase
gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemSize
gUefiPayloadPkgTokenSpaceGuid.PcdSystemMemoryUefiRegionSize
-
gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy ## SOMETIMES_CONSUMES
-
diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc
index 2860a659f6a7..779f74da7171 100644
--- a/UefiPayloadPkg/UefiPayloadPkg.dsc
+++ b/UefiPayloadPkg/UefiPayloadPkg.dsc
@@ -55,7 +55,7 @@
# ELF: Build UniversalPayload file as UniversalPayload.elf
# FIT: Build UniversalPayload file as UniversalPayload.fit
#
- DEFINE UNIVERSAL_PAYLOAD = FALSE
+ DEFINE UNIVERSAL_PAYLOAD = TRUE
DEFINE UNIVERSAL_PAYLOAD_FORMAT = ELF
#
@@ -226,6 +226,7 @@
OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
RngLib|MdePkg/Library/BaseRngLib/BaseRngLib.inf
HobLib|UefiPayloadPkg/Library/DxeHobLib/DxeHobLib.inf
+ CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserNullLib/CustomFdtNodeParserNullLib.inf
#
# UEFI & PI
@@ -470,6 +471,8 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress|0x0
gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory|FALSE
gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable|TRUE
+ gUefiPayloadPkgTokenSpaceGuid.PcdHandOffFdtEnable|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 }
@@ -513,7 +516,15 @@
!endif
!endif
+
[PcdsPatchableInModule.X64]
+ #
+ # The following parameters are set by Library/PlatformHookLib
+ #
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio|FALSE
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase|0x3F8
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialBaudRate|$(BAUD_RATE)
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterStride|1
!if $(NETWORK_DRIVER_ENABLE) == TRUE
gEfiNetworkPkgTokenSpaceGuid.PcdAllowHttpConnections|TRUE
!endif
@@ -635,7 +646,13 @@
!if $(UNIVERSAL_PAYLOAD_FORMAT) == "ELF"
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
!elseif $(UNIVERSAL_PAYLOAD_FORMAT) == "FIT"
- UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
+ UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf {
+ <LibraryClasses>
+ FdtLib|MdePkg/Library/BaseFdtLib/BaseFdtLib.inf
+ CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserLib/CustomFdtNodeParserLib.inf
+ NULL|UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf
+ NULL|UefiPayloadPkg/Library/HobParseLib/HobParseLib.inf
+ }
!else
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
!endif
@@ -648,7 +665,13 @@
!if $(UNIVERSAL_PAYLOAD_FORMAT) == "ELF"
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
!elseif $(UNIVERSAL_PAYLOAD_FORMAT) == "FIT"
- UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
+ UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf {
+ <LibraryClasses>
+ FdtLib|MdePkg/Library/BaseFdtLib/BaseFdtLib.inf
+ CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserLib/CustomFdtNodeParserLib.inf
+ NULL|UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf
+ NULL|UefiPayloadPkg/Library/HobParseLib/HobParseLib.inf
+ }
!else
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
!endif
--
2.39.2.windows.1
--
Thanks!
=D
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#119453): https://edk2.groups.io/g/devel/message/119453
Mute This Topic: https://groups.io/mt/106455168/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
[-- Attachment #2: Type: text/html, Size: 68799 bytes --]
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [edk2-devel] FW: [PATCH v4 6/6] UefiPayloadPkg: Update UefiPayload driver for FDT support.
2024-06-04 23:10 ` Chiu, Chasel
@ 2024-06-05 1:34 ` Linus Liu
0 siblings, 0 replies; 6+ messages in thread
From: Linus Liu @ 2024-06-05 1:34 UTC (permalink / raw)
To: Dhaval Sharma, Chiu, Chasel
Cc: devel@edk2.groups.io, Lin, Benny, Guo, Gua, Lu, James
[-- Attachment #1: Type: text/plain, Size: 44400 bytes --]
Hi Chasel and Dhaval
Reply inline.
Thanks
From: Chiu, Chasel <chasel.chiu@intel.com>
Sent: Wednesday, June 5, 2024 7:11 AM
To: Dhaval Sharma <dhaval@rivosinc.com>; Liu, Linus <linus.liu@intel.com>
Cc: devel@edk2.groups.io; Lin, Benny <benny.lin@intel.com>; Guo, Gua <gua.guo@intel.com>; Lu, James <james.lu@intel.com>
Subject: RE: [PATCH v4 6/6] UefiPayloadPkg: Update UefiPayload driver for FDT support.
Hi Dhaval,
Thanks for good catch! I just copied your feedbacks to the PR, let’s discuss there which will be easier than mail thread.
Thanks,
Chasel
https://github.com/tianocore/edk2/pull/5669/files#r1626731653
From: Dhaval Sharma <dhaval@rivosinc.com<mailto:dhaval@rivosinc.com>>
Sent: Monday, June 3, 2024 4:28 AM
To: Liu, Linus <linus.liu@intel.com<mailto:linus.liu@intel.com>>
Cc: devel@edk2.groups.io<mailto:devel@edk2.groups.io>; Lin, Benny <benny.lin@intel.com<mailto:benny.lin@intel.com>>; Guo, Gua <gua.guo@intel.com<mailto:gua.guo@intel.com>>; Chiu, Chasel <chasel.chiu@intel.com<mailto:chasel.chiu@intel.com>>; Lu, James <james.lu@intel.com<mailto:james.lu@intel.com>>
Subject: Re: [PATCH v4 6/6] UefiPayloadPkg: Update UefiPayload driver for FDT support.
BuildFitLoadablesFvHob:
* Fdt variable is not initialized.
[Linus] , will update the patch soon.
* It ONLY gets initialized if GuidHob is found. What if it is not found?
[Linus] , if the payload base wasn’t found the system will assert in HandoffDxe..
* FdtCheckHeader still evaluating it?
[Linus] , Yes , we can evaluating the payload image format with FdtCheckHeader.
On Mon, Jun 3, 2024 at 7:49 AM Linus Liu <linus.liu@intel.com<mailto:linus.liu@intel.com>> wrote:
Add FDT detection and comsume FDT when needed.
Move some x86 specific function in the x86 folder.
Create HandOffHob via FDT memory node.
Cc: Benny Lin <benny.lin@intel.com<mailto:benny.lin@intel.com>>
Cc: Gua Guo <gua.guo@intel.com<mailto:gua.guo@intel.com>>
Cc: Chasel Chiu <chasel.chiu@intel.com<mailto:chasel.chiu@intel.com>>
Cc: James Lu <james.lu@intel.com<mailto:james.lu@intel.com>>
Cc: Dhaval Sharma <dhaval@rivosinc.com<mailto:dhaval@rivosinc.com>>
Signed-off-by: Linus Liu <linus.liu@intel.com<mailto:linus.liu@intel.com>>
---
UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c | 428 +++++++++-----------
UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c | 12 +
UefiPayloadPkg/UefiPayloadEntry/Ia32/{DxeLoadFunc.c => DxeLoadFuncFit.c} | 32 +-
UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c | 50 +++
UefiPayloadPkg/UefiPayloadEntry/PrintHob.c | 6 +-
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c | 6 -
UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c | 12 +
UefiPayloadPkg/UefiPayloadEntry/X64/{DxeLoadFunc.c => DxeLoadFuncFit.c} | 31 +-
UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf | 20 +-
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h | 68 ++++
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf | 16 +-
UefiPayloadPkg/UefiPayloadPkg.dsc | 29 +-
12 files changed, 443 insertions(+), 267 deletions(-)
diff --git a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
index eb0b325369a0..813d656950d1 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
@@ -6,6 +6,8 @@
#include "UefiPayloadEntry.h"
#include <Library/FdtLib.h>
#include <Guid/UniversalPayloadBase.h>
+#include <Guid/MemoryTypeInformation.h>
+#include <Library/FdtParserLib.h>
#define MEMORY_ATTRIBUTE_MASK (EFI_RESOURCE_ATTRIBUTE_PRESENT | \
EFI_RESOURCE_ATTRIBUTE_INITIALIZED | \
@@ -23,6 +25,15 @@
EFI_RESOURCE_ATTRIBUTE_INITIALIZED | \
EFI_RESOURCE_ATTRIBUTE_TESTED )
+EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {
+ { EfiACPIReclaimMemory, FixedPcdGet32 (PcdMemoryTypeEfiACPIReclaimMemory) },
+ { EfiACPIMemoryNVS, FixedPcdGet32 (PcdMemoryTypeEfiACPIMemoryNVS) },
+ { EfiReservedMemoryType, FixedPcdGet32 (PcdMemoryTypeEfiReservedMemoryType) },
+ { EfiRuntimeServicesData, FixedPcdGet32 (PcdMemoryTypeEfiRuntimeServicesData) },
+ { EfiRuntimeServicesCode, FixedPcdGet32 (PcdMemoryTypeEfiRuntimeServicesCode) },
+ { EfiMaxMemoryType, 0 }
+};
+
extern VOID *mHobList;
CHAR8 *mLineBuffer = NULL;
@@ -36,6 +47,78 @@ PrintHob (
IN CONST VOID *HobStart
);
+/**
+ Add HOB into HOB list
+ @param[in] Hob The HOB to be added into the HOB list.
+**/
+VOID
+AddNewHob (
+ IN EFI_PEI_HOB_POINTERS *Hob
+ );
+
+/**
+ Found the Resource Descriptor HOB that contains a range (Base, Top)
+ @param[in] HobList Hob start address
+ @param[in] Base Memory start address
+ @param[in] Top Memory end address.
+ @retval The pointer to the Resource Descriptor HOB.
+**/
+EFI_HOB_RESOURCE_DESCRIPTOR *
+FindResourceDescriptorByRange (
+ IN VOID *HobList,
+ IN EFI_PHYSICAL_ADDRESS Base,
+ IN EFI_PHYSICAL_ADDRESS Top
+ );
+
+/**
+ Find the highest below 4G memory resource descriptor, except the input Resource Descriptor.
+ @param[in] HobList Hob start address
+ @param[in] MinimalNeededSize Minimal needed size.
+ @param[in] ExceptResourceHob Ignore this Resource Descriptor.
+ @retval The pointer to the Resource Descriptor HOB.
+**/
+EFI_HOB_RESOURCE_DESCRIPTOR *
+FindAnotherHighestBelow4GResourceDescriptor (
+ IN VOID *HobList,
+ IN UINTN MinimalNeededSize,
+ IN EFI_HOB_RESOURCE_DESCRIPTOR *ExceptResourceHob
+ );
+
+/**
+ Check the HOB and decide if it is need inside Payload
+ Payload maintainer may make decision which HOB is need or needn't
+ Then add the check logic in the function.
+ @param[in] Hob The HOB to check
+ @retval TRUE If HOB is need inside Payload
+ @retval FALSE If HOB is needn't inside Payload
+**/
+BOOLEAN
+FitIsHobNeed (
+ EFI_PEI_HOB_POINTERS Hob
+ );
+
+/**
+ Check the HOB and decide if it is need inside Payload
+
+ Payload maintainer may make decision which HOB is need or needn't
+ Then add the check logic in the function.
+
+ @param[in] Hob The HOB to check
+
+ @retval TRUE If HOB is need inside Payload
+ @retval FALSE If HOB is needn't inside Payload
+**/
+BOOLEAN
+IsHobNeed (
+ EFI_PEI_HOB_POINTERS Hob
+ );
+
+VOID
+EFIAPI
+ProcessLibraryConstructorList (
+ VOID
+ );
+
/**
Find the first substring.
@param String Point to the string where to find the substring.
@@ -191,187 +274,6 @@ FixUpPcdDatabase (
return EFI_SUCCESS;
}
-/**
- Add HOB into HOB list
- @param[in] Hob The HOB to be added into the HOB list.
-**/
-VOID
-AddNewHob (
- IN EFI_PEI_HOB_POINTERS *Hob
- )
-{
- EFI_PEI_HOB_POINTERS NewHob;
-
- if (Hob->Raw == NULL) {
- return;
- }
-
- NewHob.Header = CreateHob (Hob->Header->HobType, Hob->Header->HobLength);
- ASSERT (NewHob.Header != NULL);
- if (NewHob.Header == NULL) {
- return;
- }
-
- CopyMem (NewHob.Header + 1, Hob->Header + 1, Hob->Header->HobLength - sizeof (EFI_HOB_GENERIC_HEADER));
-}
-
-/**
- Found the Resource Descriptor HOB that contains a range (Base, Top)
- @param[in] HobList Hob start address
- @param[in] Base Memory start address
- @param[in] Top Memory end address.
- @retval The pointer to the Resource Descriptor HOB.
-**/
-EFI_HOB_RESOURCE_DESCRIPTOR *
-FindResourceDescriptorByRange (
- IN VOID *HobList,
- IN EFI_PHYSICAL_ADDRESS Base,
- IN EFI_PHYSICAL_ADDRESS Top
- )
-{
- EFI_PEI_HOB_POINTERS Hob;
- EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
-
- for (Hob.Raw = (UINT8 *)HobList; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
- //
- // Skip all HOBs except Resource Descriptor HOBs
- //
- if (GET_HOB_TYPE (Hob) != EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
- continue;
- }
-
- //
- // Skip Resource Descriptor HOBs that do not describe tested system memory
- //
- ResourceHob = Hob.ResourceDescriptor;
- if (ResourceHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY) {
- continue;
- }
-
- if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) != TESTED_MEMORY_ATTRIBUTES) {
- continue;
- }
-
- //
- // Skip Resource Descriptor HOBs that do not contain the PHIT range EfiFreeMemoryBottom..EfiFreeMemoryTop
- //
- if (Base < ResourceHob->PhysicalStart) {
- continue;
- }
-
- if (Top > (ResourceHob->PhysicalStart + ResourceHob->ResourceLength)) {
- continue;
- }
-
- return ResourceHob;
- }
-
- return NULL;
-}
-
-/**
- Find the highest below 4G memory resource descriptor, except the input Resource Descriptor.
- @param[in] HobList Hob start address
- @param[in] MinimalNeededSize Minimal needed size.
- @param[in] ExceptResourceHob Ignore this Resource Descriptor.
- @retval The pointer to the Resource Descriptor HOB.
-**/
-EFI_HOB_RESOURCE_DESCRIPTOR *
-FindAnotherHighestBelow4GResourceDescriptor (
- IN VOID *HobList,
- IN UINTN MinimalNeededSize,
- IN EFI_HOB_RESOURCE_DESCRIPTOR *ExceptResourceHob
- )
-{
- EFI_PEI_HOB_POINTERS Hob;
- EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
- EFI_HOB_RESOURCE_DESCRIPTOR *ReturnResourceHob;
-
- ReturnResourceHob = NULL;
-
- for (Hob.Raw = (UINT8 *)HobList; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
- //
- // Skip all HOBs except Resource Descriptor HOBs
- //
- if (GET_HOB_TYPE (Hob) != EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
- continue;
- }
-
- //
- // Skip Resource Descriptor HOBs that do not describe tested system memory
- //
- ResourceHob = Hob.ResourceDescriptor;
- if (ResourceHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY) {
- continue;
- }
-
- if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) != TESTED_MEMORY_ATTRIBUTES) {
- continue;
- }
-
- //
- // Skip if the Resource Descriptor HOB equals to ExceptResourceHob
- //
- if (ResourceHob == ExceptResourceHob) {
- continue;
- }
-
- //
- // Skip Resource Descriptor HOBs that are beyond 4G
- //
- if ((ResourceHob->PhysicalStart + ResourceHob->ResourceLength) > BASE_4GB) {
- continue;
- }
-
- //
- // Skip Resource Descriptor HOBs that are too small
- //
- if (ResourceHob->ResourceLength < MinimalNeededSize) {
- continue;
- }
-
- //
- // Return the topest Resource Descriptor
- //
- if (ReturnResourceHob == NULL) {
- ReturnResourceHob = ResourceHob;
- } else {
- if (ReturnResourceHob->PhysicalStart < ResourceHob->PhysicalStart) {
- ReturnResourceHob = ResourceHob;
- }
- }
- }
-
- return ReturnResourceHob;
-}
-
-/**
- Check the HOB and decide if it is need inside Payload
- Payload maintainer may make decision which HOB is need or needn't
- Then add the check logic in the function.
- @param[in] Hob The HOB to check
- @retval TRUE If HOB is need inside Payload
- @retval FALSE If HOB is needn't inside Payload
-**/
-BOOLEAN
-IsHobNeed (
- EFI_PEI_HOB_POINTERS Hob
- )
-{
- if (Hob.Header->HobType == EFI_HOB_TYPE_HANDOFF) {
- return FALSE;
- }
-
- if (Hob.Header->HobType == EFI_HOB_TYPE_MEMORY_ALLOCATION) {
- if (CompareGuid (&Hob.MemoryAllocationModule->MemoryAllocationHeader.Name, &gEfiHobMemoryAllocModuleGuid)) {
- return FALSE;
- }
- }
-
- // Arrive here mean the HOB is need
- return TRUE;
-}
-
/**
It will build Fv HOBs based on information from bootloaders.
@param[out] DxeFv The pointer to the DXE FV in memory.
@@ -409,21 +311,25 @@ BuildFitLoadablesFvHob (
Status = FdtCheckHeader (Fdt);
if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_INFO, "FdtCheckHeader UPSUPPORTED\n"));
return EFI_UNSUPPORTED;
}
ConfigNode = FdtSubnodeOffsetNameLen (Fdt, 0, "configurations", (INT32)AsciiStrLen ("configurations"));
if (ConfigNode <= 0) {
+ DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob configurations EFI_NOT_FOUND\n"));
return EFI_NOT_FOUND;
}
Config1Node = FdtSubnodeOffsetNameLen (Fdt, ConfigNode, "conf-1", (INT32)AsciiStrLen ("conf-1"));
if (Config1Node <= 0) {
+ DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob conf-1 EFI_NOT_FOUND\n"));
return EFI_NOT_FOUND;
}
ImageNode = FdtSubnodeOffsetNameLen (Fdt, 0, "images", (INT32)AsciiStrLen ("images"));
if (ImageNode <= 0) {
+ DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob images EFI_NOT_FOUND\n"));
return EFI_NOT_FOUND;
}
@@ -467,31 +373,25 @@ BuildFitLoadablesFvHob (
}
/**
- It will build HOBs based on information from bootloaders.
- @param[in] BootloaderParameter The starting memory address of bootloader parameter block.
- @param[out] DxeFv The pointer to the DXE FV in memory.
- @retval EFI_SUCCESS If it completed successfully.
- @retval Others If it failed to build required HOBs.
+ *
+ Create new HOB for new HOB list
+
+ @param[in] BootloaderParameter The HOB to be added into the HOB list.
**/
-EFI_STATUS
-BuildHobs (
- IN UINTN BootloaderParameter,
- OUT EFI_FIRMWARE_VOLUME_HEADER **DxeFv
+VOID
+CreatNewHobForHoblist (
+ IN UINTN BootloaderParameter
)
{
- EFI_PEI_HOB_POINTERS Hob;
- UINTN MinimalNeededSize;
- EFI_PHYSICAL_ADDRESS FreeMemoryBottom;
- EFI_PHYSICAL_ADDRESS FreeMemoryTop;
- EFI_PHYSICAL_ADDRESS MemoryBottom;
- EFI_PHYSICAL_ADDRESS MemoryTop;
- EFI_HOB_RESOURCE_DESCRIPTOR *PhitResourceHob;
- EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
- UINT8 *GuidHob;
- EFI_HOB_FIRMWARE_VOLUME *FvHob;
- UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTable;
- ACPI_BOARD_INFO *AcpiBoardInfo;
- EFI_HOB_HANDOFF_INFO_TABLE *HobInfo;
+ EFI_PEI_HOB_POINTERS Hob;
+ UINTN MinimalNeededSize;
+ EFI_PHYSICAL_ADDRESS FreeMemoryBottom;
+ EFI_PHYSICAL_ADDRESS FreeMemoryTop;
+ EFI_PHYSICAL_ADDRESS MemoryBottom;
+ EFI_PHYSICAL_ADDRESS MemoryTop;
+ EFI_HOB_RESOURCE_DESCRIPTOR *PhitResourceHob;
+ EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
+ EFI_HOB_HANDOFF_INFO_TABLE *HobInfo;
Hob.Raw = (UINT8 *)BootloaderParameter;
MinimalNeededSize = FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);
@@ -512,7 +412,7 @@ BuildHobs (
//
ResourceHob = FindAnotherHighestBelow4GResourceDescriptor (Hob.Raw, MinimalNeededSize, NULL);
if (ResourceHob == NULL) {
- return EFI_NOT_FOUND;
+ return;
}
MemoryBottom = ResourceHob->PhysicalStart + ResourceHob->ResourceLength - MinimalNeededSize;
@@ -542,7 +442,7 @@ BuildHobs (
//
ResourceHob = FindAnotherHighestBelow4GResourceDescriptor (Hob.Raw, MinimalNeededSize, PhitResourceHob);
if (ResourceHob == NULL) {
- return EFI_NOT_FOUND;
+ return;
}
MemoryBottom = ResourceHob->PhysicalStart + ResourceHob->ResourceLength - MinimalNeededSize;
@@ -553,14 +453,7 @@ BuildHobs (
HobInfo = HobConstructor ((VOID *)(UINTN)MemoryBottom, (VOID *)(UINTN)MemoryTop, (VOID *)(UINTN)FreeMemoryBottom, (VOID *)(UINTN)FreeMemoryTop);
HobInfo->BootMode = Hob.HandoffInformationTable->BootMode;
- //
- // 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.
//
@@ -573,7 +466,57 @@ BuildHobs (
Hob.Raw = GET_NEXT_HOB (Hob);
}
- BuildFitLoadablesFvHob (DxeFv);
+ return;
+}
+
+/**
+ It will build HOBs based on information from bootloaders.
+ @param[in] NewFdtBase The pointer to New FdtBase.
+ @param[out] DxeFv The pointer to the DXE FV in memory.
+ @retval EFI_SUCCESS If it completed successfully.
+ @retval Others If it failed to build required HOBs.
+**/
+EFI_STATUS
+FitBuildHobs (
+ IN UINTN NewFdtBase,
+ OUT EFI_FIRMWARE_VOLUME_HEADER **DxeFv
+ )
+{
+ UINT8 *GuidHob;
+ UINT32 FdtSize;
+ EFI_HOB_FIRMWARE_VOLUME *FvHob;
+ UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTable;
+ ACPI_BOARD_INFO *AcpiBoardInfo;
+ UNIVERSAL_PAYLOAD_DEVICE_TREE *Fdt;
+
+ if (FixedPcdGetBool (PcdHandOffFdtEnable)) {
+ //
+ // Back up FDT in Reserved memory region
+ //
+
+ GuidHob = GetFirstGuidHob (&gUniversalPayloadDeviceTreeGuid);
+ if (GuidHob != NULL) {
+ Fdt = (UNIVERSAL_PAYLOAD_DEVICE_TREE *)GET_GUID_HOB_DATA (GuidHob);
+ if (Fdt != NULL) {
+ DEBUG ((DEBUG_INFO, "Update FDT base to reserved memory\n"));
+ FdtSize = 4 * EFI_PAGE_SIZE;
+ CopyMem ((VOID *)NewFdtBase, (VOID *)(Fdt->DeviceTreeAddress), FdtSize);
+ Fdt->DeviceTreeAddress = NewFdtBase;
+ }
+ }
+ }
+
+ //
+ // To create Memory Type Information HOB
+ //
+ GuidHob = GetFirstGuidHob (&gEfiMemoryTypeInformationGuid);
+ if (GuidHob == NULL) {
+ BuildGuidDataHob (
+ &gEfiMemoryTypeInformationGuid,
+ mDefaultMemoryTypeInformation,
+ sizeof (mDefaultMemoryTypeInformation)
+ );
+ }
//
// Create guid hob for acpi board information
@@ -588,6 +531,12 @@ BuildHobs (
}
}
+ //
+ // Create an empty FvHob for the DXE FV that contains DXE core.
+ //
+ BuildFvHob ((EFI_PHYSICAL_ADDRESS)0, 0);
+
+ BuildFitLoadablesFvHob (DxeFv);
//
// Update DXE FV information to first fv hob in the hob list, which
// is the empty FvHob created before.
@@ -600,12 +549,12 @@ BuildHobs (
/**
Entry point to the C language phase of UEFI payload.
- @param[in] BootloaderParameter The starting address of bootloader parameter block.
+ @param[in] BootloaderParameter The starting address of FDT .
@retval It will not return if SUCCESS, and return error when passing bootloader parameter.
**/
EFI_STATUS
EFIAPI
-_ModuleEntryPoint (
+FitUplEntryPoint (
IN UINTN BootloaderParameter
)
{
@@ -613,14 +562,46 @@ _ModuleEntryPoint (
PHYSICAL_ADDRESS DxeCoreEntryPoint;
EFI_PEI_HOB_POINTERS Hob;
EFI_FIRMWARE_VOLUME_HEADER *DxeFv;
+ PHYSICAL_ADDRESS HobListPtr;
+ VOID *FdtBase;
+ VOID *FdtBaseResvd;
- mHobList = (VOID *)BootloaderParameter;
- DxeFv = NULL;
+ if (FixedPcdGetBool (PcdHandOffFdtEnable)) {
+ mHobList = (VOID *)NULL;
+ } else {
+ mHobList = (VOID *)BootloaderParameter;
+ }
+
+ DxeFv = NULL;
// Call constructor for all libraries
ProcessLibraryConstructorList ();
DEBUG ((DEBUG_INFO, "Entering Universal Payload...\n"));
DEBUG ((DEBUG_INFO, "sizeof(UINTN) = 0x%x\n", sizeof (UINTN)));
+ DEBUG ((DEBUG_INFO, "BootloaderParameter = 0x%x\n", BootloaderParameter));
+
+ DEBUG ((DEBUG_INFO, "Start init Hobs...\n"));
+ HobListPtr = UplInitHob ((VOID *)BootloaderParameter);
+
+ //
+ // Found hob list node
+ //
+ if (HobListPtr != 0) {
+ FdtBase = (VOID *)BootloaderParameter;
+ if (FdtCheckHeader (FdtBase) == 0) {
+ CustomFdtNodeParser ((VOID *)FdtBase, (VOID *)HobListPtr);
+ } else {
+ CreatNewHobForHoblist (BootloaderParameter);
+ }
+
+ FdtBaseResvd = PayloadAllocatePages (4, EfiReservedMemoryType);
+
+ // Build HOB based on information from Bootloader
+ Status = FitBuildHobs ((UINTN)FdtBaseResvd, &DxeFv);
+ }
+
+ // Call constructor for all libraries again since hobs were built
+ ProcessLibraryConstructorList ();
DEBUG_CODE (
//
@@ -629,23 +610,10 @@ _ModuleEntryPoint (
PrintHob (mHobList);
);
- // Initialize floating point operating environment to be compliant with UEFI spec.
- InitializeFloatingPointUnits ();
-
- // Build HOB based on information from Bootloader
- Status = BuildHobs (BootloaderParameter, &DxeFv);
- ASSERT_EFI_ERROR (Status);
-
FixUpPcdDatabase (DxeFv);
Status = UniversalLoadDxeCore (DxeFv, &DxeCoreEntryPoint);
ASSERT_EFI_ERROR (Status);
- //
- // Mask off all legacy 8259 interrupt sources
- //
- IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
- IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
-
Hob.HandoffInformationTable = (EFI_HOB_HANDOFF_INFO_TABLE *)GetFirstHob (EFI_HOB_TYPE_HANDOFF);
HandOffToDxeCore (DxeCoreEntryPoint, Hob);
diff --git a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
index 61a9f01ec9e7..cf9c03a9a8e9 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
@@ -15,12 +15,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h>
#include <Library/HobLib.h>
+#include <Library/FdtLib.h>
#include "VirtualMemory.h"
#include "UefiPayloadEntry.h"
#define STACK_SIZE 0x20000
#define IDT_ENTRY_COUNT 32
+extern VOID *mHobList;
+
typedef struct _X64_IDT_TABLE {
//
// Reserved 4 bytes preceding PeiService and IdtTable,
@@ -268,6 +271,15 @@ HandOffToDxeCore (
UINT32 Index;
X64_IDT_TABLE *IdtTableForX64;
+ // Initialize floating point operating environment to be compliant with UEFI spec.
+ InitializeFloatingPointUnits ();
+
+ //
+ // Mask off all legacy 8259 interrupt sources
+ //
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
//
// Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
//
diff --git a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
similarity index 90%
copy from UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
copy to UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
index 61a9f01ec9e7..439d5bee0b8c 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
@@ -1,10 +1,8 @@
/** @file
Ia32-specific functionality for DxeLoad.
-Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>
-Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
-
-SPDX-License-Identifier: BSD-2-Clause-Patent
+ Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -15,12 +13,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h>
#include <Library/HobLib.h>
+#include <Library/FdtLib.h>
#include "VirtualMemory.h"
#include "UefiPayloadEntry.h"
#define STACK_SIZE 0x20000
#define IDT_ENTRY_COUNT 32
+extern VOID *mHobList;
+
typedef struct _X64_IDT_TABLE {
//
// Reserved 4 bytes preceding PeiService and IdtTable,
@@ -268,6 +269,15 @@ HandOffToDxeCore (
UINT32 Index;
X64_IDT_TABLE *IdtTableForX64;
+ // Initialize floating point operating environment to be compliant with UEFI spec.
+ InitializeFloatingPointUnits ();
+
+ //
+ // Mask off all legacy 8259 interrupt sources
+ //
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
//
// Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
//
@@ -379,3 +389,17 @@ HandOffToDxeCore (
CpuDeadLoop ();
}
}
+
+/**
+ Entry point to the C language phase of UEFI payload.
+ @param[in] BootloaderParameter The starting address of bootloader parameter block.
+ @retval It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+_ModuleEntryPoint (
+ IN UINTN BootloaderParameter
+ )
+{
+ return FitUplEntryPoint (BootloaderParameter);
+}
diff --git a/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c b/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
index 83936ae26e68..36edca81f997 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
@@ -10,6 +10,56 @@
#include "UefiPayloadEntry.h"
+/**
+ Allocates one or more pages of type EfiBootServicesData.
+
+ Allocates the number of pages of MemoryType and returns a pointer to the
+ allocated buffer. The buffer returned is aligned on a 4KB boundary.
+ If Pages is 0, then NULL is returned.
+ If there is not enough memory availble to satisfy the request, then NULL
+ is returned.
+
+ @param Pages The number of 4 KB pages to allocate.
+ @param MemoryType The MemoryType
+ @return A pointer to the allocated buffer or NULL if allocation fails.
+**/
+VOID *
+EFIAPI
+PayloadAllocatePages (
+ IN UINTN Pages,
+ IN EFI_MEMORY_TYPE MemoryType
+ )
+{
+ EFI_PEI_HOB_POINTERS Hob;
+ EFI_PHYSICAL_ADDRESS Offset;
+ EFI_HOB_HANDOFF_INFO_TABLE *HobTable;
+
+ Hob.Raw = GetHobList ();
+ HobTable = Hob.HandoffInformationTable;
+
+ if (Pages == 0) {
+ return NULL;
+ }
+
+ // Make sure allocation address is page alligned.
+ Offset = HobTable->EfiFreeMemoryTop & EFI_PAGE_MASK;
+ if (Offset != 0) {
+ HobTable->EfiFreeMemoryTop -= Offset;
+ }
+
+ //
+ // Check available memory for the allocation
+ //
+ if (HobTable->EfiFreeMemoryTop - ((Pages * EFI_PAGE_SIZE) + sizeof (EFI_HOB_MEMORY_ALLOCATION)) < HobTable->EfiFreeMemoryBottom) {
+ return NULL;
+ }
+
+ HobTable->EfiFreeMemoryTop -= Pages * EFI_PAGE_SIZE;
+ BuildMemoryAllocationHob (HobTable->EfiFreeMemoryTop, Pages * EFI_PAGE_SIZE, MemoryType);
+
+ return (VOID *)(UINTN)HobTable->EfiFreeMemoryTop;
+}
+
/**
Allocates one or more pages of type EfiBootServicesData.
diff --git a/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c b/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
index b63e93c07ec2..153d1b00f637 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
@@ -169,13 +169,13 @@ PrintMemoryAllocationHob (
}
/**
- Print the information in Resource Discriptor Hob.
+ Print the information in Resource Descriptor Hob.
@param[in] HobStart A pointer to HOB of type EFI_HOB_TYPE_RESOURCE_DESCRIPTOR.
@param[in] HobLength The Length in bytes of HOB of type EFI_HOB_TYPE_RESOURCE_DESCRIPTOR.
@retval EFI_SUCCESS If it completed successfully.
**/
EFI_STATUS
-PrintResourceDiscriptorHob (
+PrintResourceDescriptorHob (
IN VOID *HobStart,
IN UINT16 HobLength
)
@@ -620,7 +620,7 @@ PrintFv3Hob (
HOB_PRINT_HANDLER_TABLE mHobHandles[] = {
{ EFI_HOB_TYPE_HANDOFF, "EFI_HOB_TYPE_HANDOFF", PrintHandOffHob },
{ EFI_HOB_TYPE_MEMORY_ALLOCATION, "EFI_HOB_TYPE_MEMORY_ALLOCATION", PrintMemoryAllocationHob },
- { EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, "EFI_HOB_TYPE_RESOURCE_DESCRIPTOR", PrintResourceDiscriptorHob },
+ { EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, "EFI_HOB_TYPE_RESOURCE_DESCRIPTOR", PrintResourceDescriptorHob },
{ EFI_HOB_TYPE_GUID_EXTENSION, "EFI_HOB_TYPE_GUID_EXTENSION", PrintGuidHob },
{ EFI_HOB_TYPE_FV, "EFI_HOB_TYPE_FV", PrintFvHob },
{ EFI_HOB_TYPE_CPU, "EFI_HOB_TYPE_CPU", PrintCpuHob },
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
index f37c00fad774..5b864eeefe10 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
@@ -486,12 +486,6 @@ _ModuleEntryPoint (
Status = UniversalLoadDxeCore (DxeFv, &DxeCoreEntryPoint);
ASSERT_EFI_ERROR (Status);
- //
- // Mask off all legacy 8259 interrupt sources
- //
- IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
- IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
-
Hob.HandoffInformationTable = (EFI_HOB_HANDOFF_INFO_TABLE *)GetFirstHob (EFI_HOB_TYPE_HANDOFF);
HandOffToDxeCore (DxeCoreEntryPoint, Hob);
diff --git a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
index 346e3feb0459..6c3603f12098 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
@@ -13,10 +13,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h>
#include <Library/HobLib.h>
+#include <Library/FdtLib.h>
#include "X64/VirtualMemory.h"
#include "UefiPayloadEntry.h"
#define STACK_SIZE 0x20000
+extern VOID *mHobList;
+
/**
Transfers control to DxeCore.
@@ -40,6 +43,15 @@ HandOffToDxeCore (
VOID *GhcbBase;
UINTN GhcbSize;
+ // Initialize floating point operating environment to be compliant with UEFI spec.
+ InitializeFloatingPointUnits ();
+
+ //
+ // Mask off all legacy 8259 interrupt sources
+ //
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
//
// Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
//
diff --git a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
similarity index 74%
copy from UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
copy to UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
index 346e3feb0459..35b52a911df3 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
@@ -1,8 +1,8 @@
/** @file
x64-specifc functionality for DxeLoad.
-Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
+ Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -13,10 +13,14 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h>
#include <Library/HobLib.h>
+#include <Library/FdtLib.h>
+#include <Library/PcdLib.h>
#include "X64/VirtualMemory.h"
#include "UefiPayloadEntry.h"
#define STACK_SIZE 0x20000
+extern VOID *mHobList;
+
/**
Transfers control to DxeCore.
@@ -40,6 +44,15 @@ HandOffToDxeCore (
VOID *GhcbBase;
UINTN GhcbSize;
+ // Initialize floating point operating environment to be compliant with UEFI spec.
+ InitializeFloatingPointUnits ();
+
+ //
+ // Mask off all legacy 8259 interrupt sources
+ //
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
//
// Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
//
@@ -106,3 +119,17 @@ HandOffToDxeCore (
TopOfStack
);
}
+
+/**
+ Entry point to the C language phase of UEFI payload.
+ @param[in] BootloaderParameter The starting address of bootloader parameter block.
+ @retval It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+_ModuleEntryPoint (
+ IN UINTN BootloaderParameter
+ )
+{
+ return FitUplEntryPoint (BootloaderParameter);
+}
diff --git a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
index b87a0989eee3..c87e674f7cbd 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
+++ b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
@@ -30,13 +30,13 @@
[Sources.Ia32]
X64/VirtualMemory.h
X64/VirtualMemory.c
- Ia32/DxeLoadFunc.c
+ Ia32/DxeLoadFuncFit.c
Ia32/IdtVectorAsm.nasm
[Sources.X64]
X64/VirtualMemory.h
X64/VirtualMemory.c
- X64/DxeLoadFunc.c
+ X64/DxeLoadFuncFit.c
[Packages]
MdePkg/MdePkg.dec
@@ -54,6 +54,8 @@
PeCoffLib
CpuLib
FdtLib
+ CustomFdtNodeParserLib
+ PcdLib
[Guids]
gEfiMemoryTypeInformationGuid
@@ -71,6 +73,7 @@
gUniversalPayloadAcpiTableGuid
gUniversalPayloadPciRootBridgeInfoGuid
gUniversalPayloadSmbios3TableGuid
+ gUniversalPayloadDeviceTreeGuid
[FeaturePcd.IA32]
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ## CONSUMES
@@ -78,7 +81,6 @@
[FeaturePcd.X64]
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables ## CONSUMES
-
[Pcd.IA32,Pcd.X64]
gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile
gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable ## SOMETIMES_CONSUMES
@@ -88,11 +90,19 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbBase ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbSize ## CONSUMES
-
gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemBase
gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemSize
gUefiPayloadPkgTokenSpaceGuid.PcdSystemMemoryUefiRegionSize
-
gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy ## SOMETIMES_CONSUMES
+ gUefiPayloadPkgTokenSpaceGuid.PcdHandOffFdtEnable
+ gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiACPIMemoryNVS
+ gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiACPIReclaimMemory
+ gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiReservedMemoryType
+ gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesData
+ gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesCode
+
+[BuildOptions]
+ MSFT:*_*_*_CC_FLAGS = /wd4244 /wd4305
+ GCC:*_*_*_CC_FLAGS = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
index 80ccc5072c55..09fce8dbcf35 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
+++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
@@ -35,6 +35,7 @@
#include <UniversalPayload/UniversalPayload.h>
#include <UniversalPayload/ExtraData.h>
#include <UniversalPayload/SerialPortInfo.h>
+#include <UniversalPayload/DeviceTree.h>
#include <Guid/PcdDataBaseSignatureGuid.h>
#define LEGACY_8259_MASK_REGISTER_MASTER 0x21
@@ -134,6 +135,31 @@ UniversalLoadDxeCore (
OUT PHYSICAL_ADDRESS *DxeCoreEntryPoint
);
+/**
+ It will Parse FDT -node based on information.
+ @param[in] FdtBase The starting memory address of FdtBase
+ @retval HobList The base address of Hoblist.
+
+**/
+UINT64
+EFIAPI
+FdtNodeParser (
+ IN VOID *FdtBase
+ );
+
+/**
+ It will Parse FDT -custom node based on information.
+ @param[in] FdtBase The starting memory address of FdtBase
+ @param[in] HostList The starting memory address of New Hob list.
+
+**/
+UINTN
+EFIAPI
+CustomFdtNodeParser (
+ IN VOID *FdtBase,
+ IN VOID *HostList
+ );
+
/**
Transfers control to DxeCore.
@@ -206,4 +232,46 @@ BuildHobFromAcpi (
IN UINT64 AcpiTableBase
);
+/**
+ Allocates one or more pages .
+
+ Allocates the number of pages of MemoryType and returns a pointer to the
+ allocated buffer. The buffer returned is aligned on a 4KB boundary.
+ If Pages is 0, then NULL is returned.
+ If there is not enough memory availble to satisfy the request, then NULL
+ is returned.
+
+ @param Pages The number of 4 KB pages to allocate.
+ @param MemoryType The Memorytype
+ @return A pointer to the allocated buffer or NULL if allocation fails.
+**/
+VOID *
+EFIAPI
+PayloadAllocatePages (
+ IN UINTN Pages,
+ IN EFI_MEMORY_TYPE MemoryType
+ );
+
+/**
+ Entry point to the C language phase of UEFI payload.
+ @param[in] FdtPrt The starting address of FDT .
+ @retval It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+FitUplEntryPoint (
+ IN UINTN BootloaderParameter
+ );
+
+/**
+ Entry point to the C language phase of UEFI payload.
+ @param[in] BootloaderParameter The starting address of bootloader parameter block.
+ @retval It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+UplEntryPoint (
+ IN UINTN BootloaderParameter
+ );
+
#endif
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
index a62da5c7059d..be91f7be2819 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
+++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
@@ -6,44 +6,37 @@
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
##
-
[Defines]
INF_VERSION = 1.30
BASE_NAME = UniversalPayloadEntry
FILE_GUID = D4F0F269-1209-4A66-8039-C4D5A700EA4E
MODULE_TYPE = SEC
VERSION_STRING = 1.0
-
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64
#
-
[Sources]
UniversalPayloadEntry.c
LoadDxeCore.c
MemoryAllocation.c
PrintHob.c
AcpiTable.c
-
[Sources.Ia32]
X64/VirtualMemory.h
X64/VirtualMemory.c
Ia32/DxeLoadFunc.c
Ia32/IdtVectorAsm.nasm
-
[Sources.X64]
X64/VirtualMemory.h
X64/VirtualMemory.c
X64/DxeLoadFunc.c
-
[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
UefiCpuPkg/UefiCpuPkg.dec
UefiPayloadPkg/UefiPayloadPkg.dec
-
[LibraryClasses]
BaseMemoryLib
DebugLib
@@ -69,14 +62,12 @@
gUniversalPayloadAcpiTableGuid
gUniversalPayloadPciRootBridgeInfoGuid
gUniversalPayloadSmbios3TableGuid
-
+ gUniversalPayloadBaseGuid
+ gUniversalPayloadDeviceTreeGuid
[FeaturePcd.IA32]
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ## CONSUMES
-
[FeaturePcd.X64]
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables ## CONSUMES
-
-
[Pcd.IA32,Pcd.X64]
gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile
gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable ## SOMETIMES_CONSUMES
@@ -86,12 +77,9 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbBase ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbSize ## CONSUMES
-
gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemBase
gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemSize
gUefiPayloadPkgTokenSpaceGuid.PcdSystemMemoryUefiRegionSize
-
gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy ## SOMETIMES_CONSUMES
-
diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc
index 2860a659f6a7..779f74da7171 100644
--- a/UefiPayloadPkg/UefiPayloadPkg.dsc
+++ b/UefiPayloadPkg/UefiPayloadPkg.dsc
@@ -55,7 +55,7 @@
# ELF: Build UniversalPayload file as UniversalPayload.elf
# FIT: Build UniversalPayload file as UniversalPayload.fit
#
- DEFINE UNIVERSAL_PAYLOAD = FALSE
+ DEFINE UNIVERSAL_PAYLOAD = TRUE
DEFINE UNIVERSAL_PAYLOAD_FORMAT = ELF
#
@@ -226,6 +226,7 @@
OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
RngLib|MdePkg/Library/BaseRngLib/BaseRngLib.inf
HobLib|UefiPayloadPkg/Library/DxeHobLib/DxeHobLib.inf
+ CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserNullLib/CustomFdtNodeParserNullLib.inf
#
# UEFI & PI
@@ -470,6 +471,8 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress|0x0
gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory|FALSE
gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable|TRUE
+ gUefiPayloadPkgTokenSpaceGuid.PcdHandOffFdtEnable|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 }
@@ -513,7 +516,15 @@
!endif
!endif
+
[PcdsPatchableInModule.X64]
+ #
+ # The following parameters are set by Library/PlatformHookLib
+ #
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio|FALSE
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase|0x3F8
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialBaudRate|$(BAUD_RATE)
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterStride|1
!if $(NETWORK_DRIVER_ENABLE) == TRUE
gEfiNetworkPkgTokenSpaceGuid.PcdAllowHttpConnections|TRUE
!endif
@@ -635,7 +646,13 @@
!if $(UNIVERSAL_PAYLOAD_FORMAT) == "ELF"
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
!elseif $(UNIVERSAL_PAYLOAD_FORMAT) == "FIT"
- UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
+ UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf {
+ <LibraryClasses>
+ FdtLib|MdePkg/Library/BaseFdtLib/BaseFdtLib.inf
+ CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserLib/CustomFdtNodeParserLib.inf
+ NULL|UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf
+ NULL|UefiPayloadPkg/Library/HobParseLib/HobParseLib.inf
+ }
!else
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
!endif
@@ -648,7 +665,13 @@
!if $(UNIVERSAL_PAYLOAD_FORMAT) == "ELF"
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
!elseif $(UNIVERSAL_PAYLOAD_FORMAT) == "FIT"
- UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
+ UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf {
+ <LibraryClasses>
+ FdtLib|MdePkg/Library/BaseFdtLib/BaseFdtLib.inf
+ CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserLib/CustomFdtNodeParserLib.inf
+ NULL|UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf
+ NULL|UefiPayloadPkg/Library/HobParseLib/HobParseLib.inf
+ }
!else
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
!endif
--
2.39.2.windows.1
--
Thanks!
=D
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#119457): https://edk2.groups.io/g/devel/message/119457
Mute This Topic: https://groups.io/mt/106495599/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
[-- Attachment #2: Type: text/html, Size: 73688 bytes --]
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [edk2-devel] [PATCH v4 6/6] UefiPayloadPkg: Update UefiPayload driver for FDT support.
2024-06-04 17:18 ` Dhaval Sharma
@ 2024-06-05 3:47 ` Linus Liu
0 siblings, 0 replies; 6+ messages in thread
From: Linus Liu @ 2024-06-05 3:47 UTC (permalink / raw)
To: Dhaval Sharma
Cc: devel@edk2.groups.io, Lin, Benny, Guo, Gua, Chiu, Chasel,
Lu, James
[-- Attachment #1: Type: text/plain, Size: 43692 bytes --]
Hi Dhaval
Yes , all checks have been passed.
Please refer to the PR-
https://github.com/tianocore/edk2/pull/5669
Thanks
From: Dhaval Sharma <dhaval@rivosinc.com>
Sent: Wednesday, June 5, 2024 1:18 AM
To: Liu, Linus <linus.liu@intel.com>
Cc: devel@edk2.groups.io; Lin, Benny <benny.lin@intel.com>; Guo, Gua <gua.guo@intel.com>; Chiu, Chasel <chasel.chiu@intel.com>; Lu, James <james.lu@intel.com>
Subject: Re: [PATCH v4 6/6] UefiPayloadPkg: Update UefiPayload driver for FDT support.
I also believe this code needs to go through crustify etc to ensure it follows all edk2 standards?
On Mon, Jun 3, 2024 at 4:57 PM Dhaval Sharma <dhaval@rivosinc.com<mailto:dhaval@rivosinc.com>> wrote:
BuildFitLoadablesFvHob:
* Fdt variable is not initialized.
* It ONLY gets initialized if GuidHob is found. What if it is not found?
* FdtCheckHeader still evaluating it?
On Mon, Jun 3, 2024 at 7:49 AM Linus Liu <linus.liu@intel.com<mailto:linus.liu@intel.com>> wrote:
Add FDT detection and comsume FDT when needed.
Move some x86 specific function in the x86 folder.
Create HandOffHob via FDT memory node.
Cc: Benny Lin <benny.lin@intel.com<mailto:benny.lin@intel.com>>
Cc: Gua Guo <gua.guo@intel.com<mailto:gua.guo@intel.com>>
Cc: Chasel Chiu <chasel.chiu@intel.com<mailto:chasel.chiu@intel.com>>
Cc: James Lu <james.lu@intel.com<mailto:james.lu@intel.com>>
Cc: Dhaval Sharma <dhaval@rivosinc.com<mailto:dhaval@rivosinc.com>>
Signed-off-by: Linus Liu <linus.liu@intel.com<mailto:linus.liu@intel.com>>
---
UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c | 428 +++++++++-----------
UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c | 12 +
UefiPayloadPkg/UefiPayloadEntry/Ia32/{DxeLoadFunc.c => DxeLoadFuncFit.c} | 32 +-
UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c | 50 +++
UefiPayloadPkg/UefiPayloadEntry/PrintHob.c | 6 +-
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c | 6 -
UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c | 12 +
UefiPayloadPkg/UefiPayloadEntry/X64/{DxeLoadFunc.c => DxeLoadFuncFit.c} | 31 +-
UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf | 20 +-
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h | 68 ++++
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf | 16 +-
UefiPayloadPkg/UefiPayloadPkg.dsc | 29 +-
12 files changed, 443 insertions(+), 267 deletions(-)
diff --git a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
index eb0b325369a0..813d656950d1 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.c
@@ -6,6 +6,8 @@
#include "UefiPayloadEntry.h"
#include <Library/FdtLib.h>
#include <Guid/UniversalPayloadBase.h>
+#include <Guid/MemoryTypeInformation.h>
+#include <Library/FdtParserLib.h>
#define MEMORY_ATTRIBUTE_MASK (EFI_RESOURCE_ATTRIBUTE_PRESENT | \
EFI_RESOURCE_ATTRIBUTE_INITIALIZED | \
@@ -23,6 +25,15 @@
EFI_RESOURCE_ATTRIBUTE_INITIALIZED | \
EFI_RESOURCE_ATTRIBUTE_TESTED )
+EFI_MEMORY_TYPE_INFORMATION mDefaultMemoryTypeInformation[] = {
+ { EfiACPIReclaimMemory, FixedPcdGet32 (PcdMemoryTypeEfiACPIReclaimMemory) },
+ { EfiACPIMemoryNVS, FixedPcdGet32 (PcdMemoryTypeEfiACPIMemoryNVS) },
+ { EfiReservedMemoryType, FixedPcdGet32 (PcdMemoryTypeEfiReservedMemoryType) },
+ { EfiRuntimeServicesData, FixedPcdGet32 (PcdMemoryTypeEfiRuntimeServicesData) },
+ { EfiRuntimeServicesCode, FixedPcdGet32 (PcdMemoryTypeEfiRuntimeServicesCode) },
+ { EfiMaxMemoryType, 0 }
+};
+
extern VOID *mHobList;
CHAR8 *mLineBuffer = NULL;
@@ -36,6 +47,78 @@ PrintHob (
IN CONST VOID *HobStart
);
+/**
+ Add HOB into HOB list
+ @param[in] Hob The HOB to be added into the HOB list.
+**/
+VOID
+AddNewHob (
+ IN EFI_PEI_HOB_POINTERS *Hob
+ );
+
+/**
+ Found the Resource Descriptor HOB that contains a range (Base, Top)
+ @param[in] HobList Hob start address
+ @param[in] Base Memory start address
+ @param[in] Top Memory end address.
+ @retval The pointer to the Resource Descriptor HOB.
+**/
+EFI_HOB_RESOURCE_DESCRIPTOR *
+FindResourceDescriptorByRange (
+ IN VOID *HobList,
+ IN EFI_PHYSICAL_ADDRESS Base,
+ IN EFI_PHYSICAL_ADDRESS Top
+ );
+
+/**
+ Find the highest below 4G memory resource descriptor, except the input Resource Descriptor.
+ @param[in] HobList Hob start address
+ @param[in] MinimalNeededSize Minimal needed size.
+ @param[in] ExceptResourceHob Ignore this Resource Descriptor.
+ @retval The pointer to the Resource Descriptor HOB.
+**/
+EFI_HOB_RESOURCE_DESCRIPTOR *
+FindAnotherHighestBelow4GResourceDescriptor (
+ IN VOID *HobList,
+ IN UINTN MinimalNeededSize,
+ IN EFI_HOB_RESOURCE_DESCRIPTOR *ExceptResourceHob
+ );
+
+/**
+ Check the HOB and decide if it is need inside Payload
+ Payload maintainer may make decision which HOB is need or needn't
+ Then add the check logic in the function.
+ @param[in] Hob The HOB to check
+ @retval TRUE If HOB is need inside Payload
+ @retval FALSE If HOB is needn't inside Payload
+**/
+BOOLEAN
+FitIsHobNeed (
+ EFI_PEI_HOB_POINTERS Hob
+ );
+
+/**
+ Check the HOB and decide if it is need inside Payload
+
+ Payload maintainer may make decision which HOB is need or needn't
+ Then add the check logic in the function.
+
+ @param[in] Hob The HOB to check
+
+ @retval TRUE If HOB is need inside Payload
+ @retval FALSE If HOB is needn't inside Payload
+**/
+BOOLEAN
+IsHobNeed (
+ EFI_PEI_HOB_POINTERS Hob
+ );
+
+VOID
+EFIAPI
+ProcessLibraryConstructorList (
+ VOID
+ );
+
/**
Find the first substring.
@param String Point to the string where to find the substring.
@@ -191,187 +274,6 @@ FixUpPcdDatabase (
return EFI_SUCCESS;
}
-/**
- Add HOB into HOB list
- @param[in] Hob The HOB to be added into the HOB list.
-**/
-VOID
-AddNewHob (
- IN EFI_PEI_HOB_POINTERS *Hob
- )
-{
- EFI_PEI_HOB_POINTERS NewHob;
-
- if (Hob->Raw == NULL) {
- return;
- }
-
- NewHob.Header = CreateHob (Hob->Header->HobType, Hob->Header->HobLength);
- ASSERT (NewHob.Header != NULL);
- if (NewHob.Header == NULL) {
- return;
- }
-
- CopyMem (NewHob.Header + 1, Hob->Header + 1, Hob->Header->HobLength - sizeof (EFI_HOB_GENERIC_HEADER));
-}
-
-/**
- Found the Resource Descriptor HOB that contains a range (Base, Top)
- @param[in] HobList Hob start address
- @param[in] Base Memory start address
- @param[in] Top Memory end address.
- @retval The pointer to the Resource Descriptor HOB.
-**/
-EFI_HOB_RESOURCE_DESCRIPTOR *
-FindResourceDescriptorByRange (
- IN VOID *HobList,
- IN EFI_PHYSICAL_ADDRESS Base,
- IN EFI_PHYSICAL_ADDRESS Top
- )
-{
- EFI_PEI_HOB_POINTERS Hob;
- EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
-
- for (Hob.Raw = (UINT8 *)HobList; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
- //
- // Skip all HOBs except Resource Descriptor HOBs
- //
- if (GET_HOB_TYPE (Hob) != EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
- continue;
- }
-
- //
- // Skip Resource Descriptor HOBs that do not describe tested system memory
- //
- ResourceHob = Hob.ResourceDescriptor;
- if (ResourceHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY) {
- continue;
- }
-
- if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) != TESTED_MEMORY_ATTRIBUTES) {
- continue;
- }
-
- //
- // Skip Resource Descriptor HOBs that do not contain the PHIT range EfiFreeMemoryBottom..EfiFreeMemoryTop
- //
- if (Base < ResourceHob->PhysicalStart) {
- continue;
- }
-
- if (Top > (ResourceHob->PhysicalStart + ResourceHob->ResourceLength)) {
- continue;
- }
-
- return ResourceHob;
- }
-
- return NULL;
-}
-
-/**
- Find the highest below 4G memory resource descriptor, except the input Resource Descriptor.
- @param[in] HobList Hob start address
- @param[in] MinimalNeededSize Minimal needed size.
- @param[in] ExceptResourceHob Ignore this Resource Descriptor.
- @retval The pointer to the Resource Descriptor HOB.
-**/
-EFI_HOB_RESOURCE_DESCRIPTOR *
-FindAnotherHighestBelow4GResourceDescriptor (
- IN VOID *HobList,
- IN UINTN MinimalNeededSize,
- IN EFI_HOB_RESOURCE_DESCRIPTOR *ExceptResourceHob
- )
-{
- EFI_PEI_HOB_POINTERS Hob;
- EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
- EFI_HOB_RESOURCE_DESCRIPTOR *ReturnResourceHob;
-
- ReturnResourceHob = NULL;
-
- for (Hob.Raw = (UINT8 *)HobList; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
- //
- // Skip all HOBs except Resource Descriptor HOBs
- //
- if (GET_HOB_TYPE (Hob) != EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
- continue;
- }
-
- //
- // Skip Resource Descriptor HOBs that do not describe tested system memory
- //
- ResourceHob = Hob.ResourceDescriptor;
- if (ResourceHob->ResourceType != EFI_RESOURCE_SYSTEM_MEMORY) {
- continue;
- }
-
- if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) != TESTED_MEMORY_ATTRIBUTES) {
- continue;
- }
-
- //
- // Skip if the Resource Descriptor HOB equals to ExceptResourceHob
- //
- if (ResourceHob == ExceptResourceHob) {
- continue;
- }
-
- //
- // Skip Resource Descriptor HOBs that are beyond 4G
- //
- if ((ResourceHob->PhysicalStart + ResourceHob->ResourceLength) > BASE_4GB) {
- continue;
- }
-
- //
- // Skip Resource Descriptor HOBs that are too small
- //
- if (ResourceHob->ResourceLength < MinimalNeededSize) {
- continue;
- }
-
- //
- // Return the topest Resource Descriptor
- //
- if (ReturnResourceHob == NULL) {
- ReturnResourceHob = ResourceHob;
- } else {
- if (ReturnResourceHob->PhysicalStart < ResourceHob->PhysicalStart) {
- ReturnResourceHob = ResourceHob;
- }
- }
- }
-
- return ReturnResourceHob;
-}
-
-/**
- Check the HOB and decide if it is need inside Payload
- Payload maintainer may make decision which HOB is need or needn't
- Then add the check logic in the function.
- @param[in] Hob The HOB to check
- @retval TRUE If HOB is need inside Payload
- @retval FALSE If HOB is needn't inside Payload
-**/
-BOOLEAN
-IsHobNeed (
- EFI_PEI_HOB_POINTERS Hob
- )
-{
- if (Hob.Header->HobType == EFI_HOB_TYPE_HANDOFF) {
- return FALSE;
- }
-
- if (Hob.Header->HobType == EFI_HOB_TYPE_MEMORY_ALLOCATION) {
- if (CompareGuid (&Hob.MemoryAllocationModule->MemoryAllocationHeader.Name, &gEfiHobMemoryAllocModuleGuid)) {
- return FALSE;
- }
- }
-
- // Arrive here mean the HOB is need
- return TRUE;
-}
-
/**
It will build Fv HOBs based on information from bootloaders.
@param[out] DxeFv The pointer to the DXE FV in memory.
@@ -409,21 +311,25 @@ BuildFitLoadablesFvHob (
Status = FdtCheckHeader (Fdt);
if (EFI_ERROR (Status)) {
+ DEBUG ((DEBUG_INFO, "FdtCheckHeader UPSUPPORTED\n"));
return EFI_UNSUPPORTED;
}
ConfigNode = FdtSubnodeOffsetNameLen (Fdt, 0, "configurations", (INT32)AsciiStrLen ("configurations"));
if (ConfigNode <= 0) {
+ DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob configurations EFI_NOT_FOUND\n"));
return EFI_NOT_FOUND;
}
Config1Node = FdtSubnodeOffsetNameLen (Fdt, ConfigNode, "conf-1", (INT32)AsciiStrLen ("conf-1"));
if (Config1Node <= 0) {
+ DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob conf-1 EFI_NOT_FOUND\n"));
return EFI_NOT_FOUND;
}
ImageNode = FdtSubnodeOffsetNameLen (Fdt, 0, "images", (INT32)AsciiStrLen ("images"));
if (ImageNode <= 0) {
+ DEBUG ((DEBUG_INFO, "BuildFitLoadablesFvHob images EFI_NOT_FOUND\n"));
return EFI_NOT_FOUND;
}
@@ -467,31 +373,25 @@ BuildFitLoadablesFvHob (
}
/**
- It will build HOBs based on information from bootloaders.
- @param[in] BootloaderParameter The starting memory address of bootloader parameter block.
- @param[out] DxeFv The pointer to the DXE FV in memory.
- @retval EFI_SUCCESS If it completed successfully.
- @retval Others If it failed to build required HOBs.
+ *
+ Create new HOB for new HOB list
+
+ @param[in] BootloaderParameter The HOB to be added into the HOB list.
**/
-EFI_STATUS
-BuildHobs (
- IN UINTN BootloaderParameter,
- OUT EFI_FIRMWARE_VOLUME_HEADER **DxeFv
+VOID
+CreatNewHobForHoblist (
+ IN UINTN BootloaderParameter
)
{
- EFI_PEI_HOB_POINTERS Hob;
- UINTN MinimalNeededSize;
- EFI_PHYSICAL_ADDRESS FreeMemoryBottom;
- EFI_PHYSICAL_ADDRESS FreeMemoryTop;
- EFI_PHYSICAL_ADDRESS MemoryBottom;
- EFI_PHYSICAL_ADDRESS MemoryTop;
- EFI_HOB_RESOURCE_DESCRIPTOR *PhitResourceHob;
- EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
- UINT8 *GuidHob;
- EFI_HOB_FIRMWARE_VOLUME *FvHob;
- UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTable;
- ACPI_BOARD_INFO *AcpiBoardInfo;
- EFI_HOB_HANDOFF_INFO_TABLE *HobInfo;
+ EFI_PEI_HOB_POINTERS Hob;
+ UINTN MinimalNeededSize;
+ EFI_PHYSICAL_ADDRESS FreeMemoryBottom;
+ EFI_PHYSICAL_ADDRESS FreeMemoryTop;
+ EFI_PHYSICAL_ADDRESS MemoryBottom;
+ EFI_PHYSICAL_ADDRESS MemoryTop;
+ EFI_HOB_RESOURCE_DESCRIPTOR *PhitResourceHob;
+ EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
+ EFI_HOB_HANDOFF_INFO_TABLE *HobInfo;
Hob.Raw = (UINT8 *)BootloaderParameter;
MinimalNeededSize = FixedPcdGet32 (PcdSystemMemoryUefiRegionSize);
@@ -512,7 +412,7 @@ BuildHobs (
//
ResourceHob = FindAnotherHighestBelow4GResourceDescriptor (Hob.Raw, MinimalNeededSize, NULL);
if (ResourceHob == NULL) {
- return EFI_NOT_FOUND;
+ return;
}
MemoryBottom = ResourceHob->PhysicalStart + ResourceHob->ResourceLength - MinimalNeededSize;
@@ -542,7 +442,7 @@ BuildHobs (
//
ResourceHob = FindAnotherHighestBelow4GResourceDescriptor (Hob.Raw, MinimalNeededSize, PhitResourceHob);
if (ResourceHob == NULL) {
- return EFI_NOT_FOUND;
+ return;
}
MemoryBottom = ResourceHob->PhysicalStart + ResourceHob->ResourceLength - MinimalNeededSize;
@@ -553,14 +453,7 @@ BuildHobs (
HobInfo = HobConstructor ((VOID *)(UINTN)MemoryBottom, (VOID *)(UINTN)MemoryTop, (VOID *)(UINTN)FreeMemoryBottom, (VOID *)(UINTN)FreeMemoryTop);
HobInfo->BootMode = Hob.HandoffInformationTable->BootMode;
- //
- // 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.
//
@@ -573,7 +466,57 @@ BuildHobs (
Hob.Raw = GET_NEXT_HOB (Hob);
}
- BuildFitLoadablesFvHob (DxeFv);
+ return;
+}
+
+/**
+ It will build HOBs based on information from bootloaders.
+ @param[in] NewFdtBase The pointer to New FdtBase.
+ @param[out] DxeFv The pointer to the DXE FV in memory.
+ @retval EFI_SUCCESS If it completed successfully.
+ @retval Others If it failed to build required HOBs.
+**/
+EFI_STATUS
+FitBuildHobs (
+ IN UINTN NewFdtBase,
+ OUT EFI_FIRMWARE_VOLUME_HEADER **DxeFv
+ )
+{
+ UINT8 *GuidHob;
+ UINT32 FdtSize;
+ EFI_HOB_FIRMWARE_VOLUME *FvHob;
+ UNIVERSAL_PAYLOAD_ACPI_TABLE *AcpiTable;
+ ACPI_BOARD_INFO *AcpiBoardInfo;
+ UNIVERSAL_PAYLOAD_DEVICE_TREE *Fdt;
+
+ if (FixedPcdGetBool (PcdHandOffFdtEnable)) {
+ //
+ // Back up FDT in Reserved memory region
+ //
+
+ GuidHob = GetFirstGuidHob (&gUniversalPayloadDeviceTreeGuid);
+ if (GuidHob != NULL) {
+ Fdt = (UNIVERSAL_PAYLOAD_DEVICE_TREE *)GET_GUID_HOB_DATA (GuidHob);
+ if (Fdt != NULL) {
+ DEBUG ((DEBUG_INFO, "Update FDT base to reserved memory\n"));
+ FdtSize = 4 * EFI_PAGE_SIZE;
+ CopyMem ((VOID *)NewFdtBase, (VOID *)(Fdt->DeviceTreeAddress), FdtSize);
+ Fdt->DeviceTreeAddress = NewFdtBase;
+ }
+ }
+ }
+
+ //
+ // To create Memory Type Information HOB
+ //
+ GuidHob = GetFirstGuidHob (&gEfiMemoryTypeInformationGuid);
+ if (GuidHob == NULL) {
+ BuildGuidDataHob (
+ &gEfiMemoryTypeInformationGuid,
+ mDefaultMemoryTypeInformation,
+ sizeof (mDefaultMemoryTypeInformation)
+ );
+ }
//
// Create guid hob for acpi board information
@@ -588,6 +531,12 @@ BuildHobs (
}
}
+ //
+ // Create an empty FvHob for the DXE FV that contains DXE core.
+ //
+ BuildFvHob ((EFI_PHYSICAL_ADDRESS)0, 0);
+
+ BuildFitLoadablesFvHob (DxeFv);
//
// Update DXE FV information to first fv hob in the hob list, which
// is the empty FvHob created before.
@@ -600,12 +549,12 @@ BuildHobs (
/**
Entry point to the C language phase of UEFI payload.
- @param[in] BootloaderParameter The starting address of bootloader parameter block.
+ @param[in] BootloaderParameter The starting address of FDT .
@retval It will not return if SUCCESS, and return error when passing bootloader parameter.
**/
EFI_STATUS
EFIAPI
-_ModuleEntryPoint (
+FitUplEntryPoint (
IN UINTN BootloaderParameter
)
{
@@ -613,14 +562,46 @@ _ModuleEntryPoint (
PHYSICAL_ADDRESS DxeCoreEntryPoint;
EFI_PEI_HOB_POINTERS Hob;
EFI_FIRMWARE_VOLUME_HEADER *DxeFv;
+ PHYSICAL_ADDRESS HobListPtr;
+ VOID *FdtBase;
+ VOID *FdtBaseResvd;
- mHobList = (VOID *)BootloaderParameter;
- DxeFv = NULL;
+ if (FixedPcdGetBool (PcdHandOffFdtEnable)) {
+ mHobList = (VOID *)NULL;
+ } else {
+ mHobList = (VOID *)BootloaderParameter;
+ }
+
+ DxeFv = NULL;
// Call constructor for all libraries
ProcessLibraryConstructorList ();
DEBUG ((DEBUG_INFO, "Entering Universal Payload...\n"));
DEBUG ((DEBUG_INFO, "sizeof(UINTN) = 0x%x\n", sizeof (UINTN)));
+ DEBUG ((DEBUG_INFO, "BootloaderParameter = 0x%x\n", BootloaderParameter));
+
+ DEBUG ((DEBUG_INFO, "Start init Hobs...\n"));
+ HobListPtr = UplInitHob ((VOID *)BootloaderParameter);
+
+ //
+ // Found hob list node
+ //
+ if (HobListPtr != 0) {
+ FdtBase = (VOID *)BootloaderParameter;
+ if (FdtCheckHeader (FdtBase) == 0) {
+ CustomFdtNodeParser ((VOID *)FdtBase, (VOID *)HobListPtr);
+ } else {
+ CreatNewHobForHoblist (BootloaderParameter);
+ }
+
+ FdtBaseResvd = PayloadAllocatePages (4, EfiReservedMemoryType);
+
+ // Build HOB based on information from Bootloader
+ Status = FitBuildHobs ((UINTN)FdtBaseResvd, &DxeFv);
+ }
+
+ // Call constructor for all libraries again since hobs were built
+ ProcessLibraryConstructorList ();
DEBUG_CODE (
//
@@ -629,23 +610,10 @@ _ModuleEntryPoint (
PrintHob (mHobList);
);
- // Initialize floating point operating environment to be compliant with UEFI spec.
- InitializeFloatingPointUnits ();
-
- // Build HOB based on information from Bootloader
- Status = BuildHobs (BootloaderParameter, &DxeFv);
- ASSERT_EFI_ERROR (Status);
-
FixUpPcdDatabase (DxeFv);
Status = UniversalLoadDxeCore (DxeFv, &DxeCoreEntryPoint);
ASSERT_EFI_ERROR (Status);
- //
- // Mask off all legacy 8259 interrupt sources
- //
- IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
- IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
-
Hob.HandoffInformationTable = (EFI_HOB_HANDOFF_INFO_TABLE *)GetFirstHob (EFI_HOB_TYPE_HANDOFF);
HandOffToDxeCore (DxeCoreEntryPoint, Hob);
diff --git a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
index 61a9f01ec9e7..cf9c03a9a8e9 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
@@ -15,12 +15,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h>
#include <Library/HobLib.h>
+#include <Library/FdtLib.h>
#include "VirtualMemory.h"
#include "UefiPayloadEntry.h"
#define STACK_SIZE 0x20000
#define IDT_ENTRY_COUNT 32
+extern VOID *mHobList;
+
typedef struct _X64_IDT_TABLE {
//
// Reserved 4 bytes preceding PeiService and IdtTable,
@@ -268,6 +271,15 @@ HandOffToDxeCore (
UINT32 Index;
X64_IDT_TABLE *IdtTableForX64;
+ // Initialize floating point operating environment to be compliant with UEFI spec.
+ InitializeFloatingPointUnits ();
+
+ //
+ // Mask off all legacy 8259 interrupt sources
+ //
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
//
// Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
//
diff --git a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
similarity index 90%
copy from UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
copy to UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
index 61a9f01ec9e7..439d5bee0b8c 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/Ia32/DxeLoadFuncFit.c
@@ -1,10 +1,8 @@
/** @file
Ia32-specific functionality for DxeLoad.
-Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>
-Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
-
-SPDX-License-Identifier: BSD-2-Clause-Patent
+ Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -15,12 +13,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h>
#include <Library/HobLib.h>
+#include <Library/FdtLib.h>
#include "VirtualMemory.h"
#include "UefiPayloadEntry.h"
#define STACK_SIZE 0x20000
#define IDT_ENTRY_COUNT 32
+extern VOID *mHobList;
+
typedef struct _X64_IDT_TABLE {
//
// Reserved 4 bytes preceding PeiService and IdtTable,
@@ -268,6 +269,15 @@ HandOffToDxeCore (
UINT32 Index;
X64_IDT_TABLE *IdtTableForX64;
+ // Initialize floating point operating environment to be compliant with UEFI spec.
+ InitializeFloatingPointUnits ();
+
+ //
+ // Mask off all legacy 8259 interrupt sources
+ //
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
//
// Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
//
@@ -379,3 +389,17 @@ HandOffToDxeCore (
CpuDeadLoop ();
}
}
+
+/**
+ Entry point to the C language phase of UEFI payload.
+ @param[in] BootloaderParameter The starting address of bootloader parameter block.
+ @retval It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+_ModuleEntryPoint (
+ IN UINTN BootloaderParameter
+ )
+{
+ return FitUplEntryPoint (BootloaderParameter);
+}
diff --git a/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c b/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
index 83936ae26e68..36edca81f997 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/MemoryAllocation.c
@@ -10,6 +10,56 @@
#include "UefiPayloadEntry.h"
+/**
+ Allocates one or more pages of type EfiBootServicesData.
+
+ Allocates the number of pages of MemoryType and returns a pointer to the
+ allocated buffer. The buffer returned is aligned on a 4KB boundary.
+ If Pages is 0, then NULL is returned.
+ If there is not enough memory availble to satisfy the request, then NULL
+ is returned.
+
+ @param Pages The number of 4 KB pages to allocate.
+ @param MemoryType The MemoryType
+ @return A pointer to the allocated buffer or NULL if allocation fails.
+**/
+VOID *
+EFIAPI
+PayloadAllocatePages (
+ IN UINTN Pages,
+ IN EFI_MEMORY_TYPE MemoryType
+ )
+{
+ EFI_PEI_HOB_POINTERS Hob;
+ EFI_PHYSICAL_ADDRESS Offset;
+ EFI_HOB_HANDOFF_INFO_TABLE *HobTable;
+
+ Hob.Raw = GetHobList ();
+ HobTable = Hob.HandoffInformationTable;
+
+ if (Pages == 0) {
+ return NULL;
+ }
+
+ // Make sure allocation address is page alligned.
+ Offset = HobTable->EfiFreeMemoryTop & EFI_PAGE_MASK;
+ if (Offset != 0) {
+ HobTable->EfiFreeMemoryTop -= Offset;
+ }
+
+ //
+ // Check available memory for the allocation
+ //
+ if (HobTable->EfiFreeMemoryTop - ((Pages * EFI_PAGE_SIZE) + sizeof (EFI_HOB_MEMORY_ALLOCATION)) < HobTable->EfiFreeMemoryBottom) {
+ return NULL;
+ }
+
+ HobTable->EfiFreeMemoryTop -= Pages * EFI_PAGE_SIZE;
+ BuildMemoryAllocationHob (HobTable->EfiFreeMemoryTop, Pages * EFI_PAGE_SIZE, MemoryType);
+
+ return (VOID *)(UINTN)HobTable->EfiFreeMemoryTop;
+}
+
/**
Allocates one or more pages of type EfiBootServicesData.
diff --git a/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c b/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
index b63e93c07ec2..153d1b00f637 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/PrintHob.c
@@ -169,13 +169,13 @@ PrintMemoryAllocationHob (
}
/**
- Print the information in Resource Discriptor Hob.
+ Print the information in Resource Descriptor Hob.
@param[in] HobStart A pointer to HOB of type EFI_HOB_TYPE_RESOURCE_DESCRIPTOR.
@param[in] HobLength The Length in bytes of HOB of type EFI_HOB_TYPE_RESOURCE_DESCRIPTOR.
@retval EFI_SUCCESS If it completed successfully.
**/
EFI_STATUS
-PrintResourceDiscriptorHob (
+PrintResourceDescriptorHob (
IN VOID *HobStart,
IN UINT16 HobLength
)
@@ -620,7 +620,7 @@ PrintFv3Hob (
HOB_PRINT_HANDLER_TABLE mHobHandles[] = {
{ EFI_HOB_TYPE_HANDOFF, "EFI_HOB_TYPE_HANDOFF", PrintHandOffHob },
{ EFI_HOB_TYPE_MEMORY_ALLOCATION, "EFI_HOB_TYPE_MEMORY_ALLOCATION", PrintMemoryAllocationHob },
- { EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, "EFI_HOB_TYPE_RESOURCE_DESCRIPTOR", PrintResourceDiscriptorHob },
+ { EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, "EFI_HOB_TYPE_RESOURCE_DESCRIPTOR", PrintResourceDescriptorHob },
{ EFI_HOB_TYPE_GUID_EXTENSION, "EFI_HOB_TYPE_GUID_EXTENSION", PrintGuidHob },
{ EFI_HOB_TYPE_FV, "EFI_HOB_TYPE_FV", PrintFvHob },
{ EFI_HOB_TYPE_CPU, "EFI_HOB_TYPE_CPU", PrintCpuHob },
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
index f37c00fad774..5b864eeefe10 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.c
@@ -486,12 +486,6 @@ _ModuleEntryPoint (
Status = UniversalLoadDxeCore (DxeFv, &DxeCoreEntryPoint);
ASSERT_EFI_ERROR (Status);
- //
- // Mask off all legacy 8259 interrupt sources
- //
- IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
- IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
-
Hob.HandoffInformationTable = (EFI_HOB_HANDOFF_INFO_TABLE *)GetFirstHob (EFI_HOB_TYPE_HANDOFF);
HandOffToDxeCore (DxeCoreEntryPoint, Hob);
diff --git a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
index 346e3feb0459..6c3603f12098 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
@@ -13,10 +13,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h>
#include <Library/HobLib.h>
+#include <Library/FdtLib.h>
#include "X64/VirtualMemory.h"
#include "UefiPayloadEntry.h"
#define STACK_SIZE 0x20000
+extern VOID *mHobList;
+
/**
Transfers control to DxeCore.
@@ -40,6 +43,15 @@ HandOffToDxeCore (
VOID *GhcbBase;
UINTN GhcbSize;
+ // Initialize floating point operating environment to be compliant with UEFI spec.
+ InitializeFloatingPointUnits ();
+
+ //
+ // Mask off all legacy 8259 interrupt sources
+ //
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
//
// Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
//
diff --git a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
similarity index 74%
copy from UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
copy to UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
index 346e3feb0459..35b52a911df3 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFunc.c
+++ b/UefiPayloadPkg/UefiPayloadEntry/X64/DxeLoadFuncFit.c
@@ -1,8 +1,8 @@
/** @file
x64-specifc functionality for DxeLoad.
-Copyright (c) 2006 - 2020, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
+ Copyright (c) 2024, Intel Corporation. All rights reserved.<BR>
+ SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -13,10 +13,14 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h>
#include <Library/HobLib.h>
+#include <Library/FdtLib.h>
+#include <Library/PcdLib.h>
#include "X64/VirtualMemory.h"
#include "UefiPayloadEntry.h"
#define STACK_SIZE 0x20000
+extern VOID *mHobList;
+
/**
Transfers control to DxeCore.
@@ -40,6 +44,15 @@ HandOffToDxeCore (
VOID *GhcbBase;
UINTN GhcbSize;
+ // Initialize floating point operating environment to be compliant with UEFI spec.
+ InitializeFloatingPointUnits ();
+
+ //
+ // Mask off all legacy 8259 interrupt sources
+ //
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_MASTER, 0xFF);
+ IoWrite8 (LEGACY_8259_MASK_REGISTER_SLAVE, 0xFF);
+
//
// Clear page 0 and mark it as allocated if NULL pointer detection is enabled.
//
@@ -106,3 +119,17 @@ HandOffToDxeCore (
TopOfStack
);
}
+
+/**
+ Entry point to the C language phase of UEFI payload.
+ @param[in] BootloaderParameter The starting address of bootloader parameter block.
+ @retval It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+_ModuleEntryPoint (
+ IN UINTN BootloaderParameter
+ )
+{
+ return FitUplEntryPoint (BootloaderParameter);
+}
diff --git a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
index b87a0989eee3..c87e674f7cbd 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
+++ b/UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
@@ -30,13 +30,13 @@
[Sources.Ia32]
X64/VirtualMemory.h
X64/VirtualMemory.c
- Ia32/DxeLoadFunc.c
+ Ia32/DxeLoadFuncFit.c
Ia32/IdtVectorAsm.nasm
[Sources.X64]
X64/VirtualMemory.h
X64/VirtualMemory.c
- X64/DxeLoadFunc.c
+ X64/DxeLoadFuncFit.c
[Packages]
MdePkg/MdePkg.dec
@@ -54,6 +54,8 @@
PeCoffLib
CpuLib
FdtLib
+ CustomFdtNodeParserLib
+ PcdLib
[Guids]
gEfiMemoryTypeInformationGuid
@@ -71,6 +73,7 @@
gUniversalPayloadAcpiTableGuid
gUniversalPayloadPciRootBridgeInfoGuid
gUniversalPayloadSmbios3TableGuid
+ gUniversalPayloadDeviceTreeGuid
[FeaturePcd.IA32]
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ## CONSUMES
@@ -78,7 +81,6 @@
[FeaturePcd.X64]
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables ## CONSUMES
-
[Pcd.IA32,Pcd.X64]
gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile
gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable ## SOMETIMES_CONSUMES
@@ -88,11 +90,19 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbBase ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbSize ## CONSUMES
-
gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemBase
gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemSize
gUefiPayloadPkgTokenSpaceGuid.PcdSystemMemoryUefiRegionSize
-
gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy ## SOMETIMES_CONSUMES
+ gUefiPayloadPkgTokenSpaceGuid.PcdHandOffFdtEnable
+ gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiACPIMemoryNVS
+ gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiACPIReclaimMemory
+ gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiReservedMemoryType
+ gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesData
+ gUefiPayloadPkgTokenSpaceGuid.PcdMemoryTypeEfiRuntimeServicesCode
+
+[BuildOptions]
+ MSFT:*_*_*_CC_FLAGS = /wd4244 /wd4305
+ GCC:*_*_*_CC_FLAGS = -Wno-error=pointer-to-int-cast -Wno-error=int-to-pointer-cast
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
index 80ccc5072c55..09fce8dbcf35 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
+++ b/UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.h
@@ -35,6 +35,7 @@
#include <UniversalPayload/UniversalPayload.h>
#include <UniversalPayload/ExtraData.h>
#include <UniversalPayload/SerialPortInfo.h>
+#include <UniversalPayload/DeviceTree.h>
#include <Guid/PcdDataBaseSignatureGuid.h>
#define LEGACY_8259_MASK_REGISTER_MASTER 0x21
@@ -134,6 +135,31 @@ UniversalLoadDxeCore (
OUT PHYSICAL_ADDRESS *DxeCoreEntryPoint
);
+/**
+ It will Parse FDT -node based on information.
+ @param[in] FdtBase The starting memory address of FdtBase
+ @retval HobList The base address of Hoblist.
+
+**/
+UINT64
+EFIAPI
+FdtNodeParser (
+ IN VOID *FdtBase
+ );
+
+/**
+ It will Parse FDT -custom node based on information.
+ @param[in] FdtBase The starting memory address of FdtBase
+ @param[in] HostList The starting memory address of New Hob list.
+
+**/
+UINTN
+EFIAPI
+CustomFdtNodeParser (
+ IN VOID *FdtBase,
+ IN VOID *HostList
+ );
+
/**
Transfers control to DxeCore.
@@ -206,4 +232,46 @@ BuildHobFromAcpi (
IN UINT64 AcpiTableBase
);
+/**
+ Allocates one or more pages .
+
+ Allocates the number of pages of MemoryType and returns a pointer to the
+ allocated buffer. The buffer returned is aligned on a 4KB boundary.
+ If Pages is 0, then NULL is returned.
+ If there is not enough memory availble to satisfy the request, then NULL
+ is returned.
+
+ @param Pages The number of 4 KB pages to allocate.
+ @param MemoryType The Memorytype
+ @return A pointer to the allocated buffer or NULL if allocation fails.
+**/
+VOID *
+EFIAPI
+PayloadAllocatePages (
+ IN UINTN Pages,
+ IN EFI_MEMORY_TYPE MemoryType
+ );
+
+/**
+ Entry point to the C language phase of UEFI payload.
+ @param[in] FdtPrt The starting address of FDT .
+ @retval It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+FitUplEntryPoint (
+ IN UINTN BootloaderParameter
+ );
+
+/**
+ Entry point to the C language phase of UEFI payload.
+ @param[in] BootloaderParameter The starting address of bootloader parameter block.
+ @retval It will not return if SUCCESS, and return error when passing bootloader parameter.
+**/
+EFI_STATUS
+EFIAPI
+UplEntryPoint (
+ IN UINTN BootloaderParameter
+ );
+
#endif
diff --git a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
index a62da5c7059d..be91f7be2819 100644
--- a/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
+++ b/UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
@@ -6,44 +6,37 @@
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
##
-
[Defines]
INF_VERSION = 1.30
BASE_NAME = UniversalPayloadEntry
FILE_GUID = D4F0F269-1209-4A66-8039-C4D5A700EA4E
MODULE_TYPE = SEC
VERSION_STRING = 1.0
-
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32 X64
#
-
[Sources]
UniversalPayloadEntry.c
LoadDxeCore.c
MemoryAllocation.c
PrintHob.c
AcpiTable.c
-
[Sources.Ia32]
X64/VirtualMemory.h
X64/VirtualMemory.c
Ia32/DxeLoadFunc.c
Ia32/IdtVectorAsm.nasm
-
[Sources.X64]
X64/VirtualMemory.h
X64/VirtualMemory.c
X64/DxeLoadFunc.c
-
[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
UefiCpuPkg/UefiCpuPkg.dec
UefiPayloadPkg/UefiPayloadPkg.dec
-
[LibraryClasses]
BaseMemoryLib
DebugLib
@@ -69,14 +62,12 @@
gUniversalPayloadAcpiTableGuid
gUniversalPayloadPciRootBridgeInfoGuid
gUniversalPayloadSmbios3TableGuid
-
+ gUniversalPayloadBaseGuid
+ gUniversalPayloadDeviceTreeGuid
[FeaturePcd.IA32]
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplSwitchToLongMode ## CONSUMES
-
[FeaturePcd.X64]
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeIplBuildPageTables ## CONSUMES
-
-
[Pcd.IA32,Pcd.X64]
gUefiPayloadPkgTokenSpaceGuid.PcdPcdDriverFile
gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable ## SOMETIMES_CONSUMES
@@ -86,12 +77,9 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbBase ## CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdGhcbSize ## CONSUMES
-
gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemBase
gUefiPayloadPkgTokenSpaceGuid.PcdPayloadFdMemSize
gUefiPayloadPkgTokenSpaceGuid.PcdSystemMemoryUefiRegionSize
-
gEfiMdeModulePkgTokenSpaceGuid.PcdSetNxForStack ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdDxeNxMemoryProtectionPolicy ## SOMETIMES_CONSUMES
gEfiMdeModulePkgTokenSpaceGuid.PcdImageProtectionPolicy ## SOMETIMES_CONSUMES
-
diff --git a/UefiPayloadPkg/UefiPayloadPkg.dsc b/UefiPayloadPkg/UefiPayloadPkg.dsc
index 2860a659f6a7..779f74da7171 100644
--- a/UefiPayloadPkg/UefiPayloadPkg.dsc
+++ b/UefiPayloadPkg/UefiPayloadPkg.dsc
@@ -55,7 +55,7 @@
# ELF: Build UniversalPayload file as UniversalPayload.elf
# FIT: Build UniversalPayload file as UniversalPayload.fit
#
- DEFINE UNIVERSAL_PAYLOAD = FALSE
+ DEFINE UNIVERSAL_PAYLOAD = TRUE
DEFINE UNIVERSAL_PAYLOAD_FORMAT = ELF
#
@@ -226,6 +226,7 @@
OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
RngLib|MdePkg/Library/BaseRngLib/BaseRngLib.inf
HobLib|UefiPayloadPkg/Library/DxeHobLib/DxeHobLib.inf
+ CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserNullLib/CustomFdtNodeParserNullLib.inf
#
# UEFI & PI
@@ -470,6 +471,8 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress|0x0
gEfiMdeModulePkgTokenSpaceGuid.PcdStatusCodeUseMemory|FALSE
gEfiMdeModulePkgTokenSpaceGuid.PcdUse1GPageTable|TRUE
+ gUefiPayloadPkgTokenSpaceGuid.PcdHandOffFdtEnable|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 }
@@ -513,7 +516,15 @@
!endif
!endif
+
[PcdsPatchableInModule.X64]
+ #
+ # The following parameters are set by Library/PlatformHookLib
+ #
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialUseMmio|FALSE
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterBase|0x3F8
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialBaudRate|$(BAUD_RATE)
+ gEfiMdeModulePkgTokenSpaceGuid.PcdSerialRegisterStride|1
!if $(NETWORK_DRIVER_ENABLE) == TRUE
gEfiNetworkPkgTokenSpaceGuid.PcdAllowHttpConnections|TRUE
!endif
@@ -635,7 +646,13 @@
!if $(UNIVERSAL_PAYLOAD_FORMAT) == "ELF"
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
!elseif $(UNIVERSAL_PAYLOAD_FORMAT) == "FIT"
- UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
+ UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf {
+ <LibraryClasses>
+ FdtLib|MdePkg/Library/BaseFdtLib/BaseFdtLib.inf
+ CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserLib/CustomFdtNodeParserLib.inf
+ NULL|UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf
+ NULL|UefiPayloadPkg/Library/HobParseLib/HobParseLib.inf
+ }
!else
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
!endif
@@ -648,7 +665,13 @@
!if $(UNIVERSAL_PAYLOAD_FORMAT) == "ELF"
UefiPayloadPkg/UefiPayloadEntry/UniversalPayloadEntry.inf
!elseif $(UNIVERSAL_PAYLOAD_FORMAT) == "FIT"
- UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf
+ UefiPayloadPkg/UefiPayloadEntry/FitUniversalPayloadEntry.inf {
+ <LibraryClasses>
+ FdtLib|MdePkg/Library/BaseFdtLib/BaseFdtLib.inf
+ CustomFdtNodeParserLib|UefiPayloadPkg/Library/CustomFdtNodeParserLib/CustomFdtNodeParserLib.inf
+ NULL|UefiPayloadPkg/Library/FdtParserLib/FdtParseLib.inf
+ NULL|UefiPayloadPkg/Library/HobParseLib/HobParseLib.inf
+ }
!else
UefiPayloadPkg/UefiPayloadEntry/UefiPayloadEntry.inf
!endif
--
2.39.2.windows.1
--
Thanks!
=D
--
Thanks!
=D
-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#119464): https://edk2.groups.io/g/devel/message/119464
Mute This Topic: https://groups.io/mt/106455168/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
[-- Attachment #2: Type: text/html, Size: 69320 bytes --]
^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2024-06-05 3:47 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-06-03 2:19 [edk2-devel] [PATCH v4 6/6] UefiPayloadPkg: Update UefiPayload driver for FDT support Linus Liu
2024-06-03 11:27 ` Dhaval Sharma
2024-06-04 17:18 ` Dhaval Sharma
2024-06-05 3:47 ` Linus Liu
2024-06-04 23:10 ` Chiu, Chasel
2024-06-05 1:34 ` [edk2-devel] FW: " Linus Liu
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox