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 Sent: Monday, June 3, 2024 4:28 AM To: Liu, Linus Cc: devel@edk2.groups.io; Lin, Benny ; Guo, Gua ; Chiu, Chasel ; Lu, James 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 > 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 > Cc: Gua Guo > Cc: Chasel Chiu > Cc: James Lu > Cc: Dhaval Sharma > Signed-off-by: Linus Liu > --- 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 #include +#include +#include #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 #include #include +#include #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.
-Copyright (c) 2017, AMD Incorporated. All rights reserved.
- -SPDX-License-Identifier: BSD-2-Clause-Patent + Copyright (c) 2024, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -15,12 +13,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include +#include #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 #include #include +#include #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.
-SPDX-License-Identifier: BSD-2-Clause-Patent + Copyright (c) 2024, Intel Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -13,10 +13,14 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include #include +#include +#include #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 #include #include +#include #include #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 { + + 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 { + + 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] -=-=-=-=-=-=-=-=-=-=-=-