--- /dev/null
+/** @file\r
+ Provides a service to retrieve a pointer to the start of HOB list.\r
+ Only available to DXE module types.\r
+\r
+ This library does not contain any functions or macros. It simply exports a global\r
+ pointer to the start of HOB list as defined in the Platform Initialization Driver\r
+ Execution Environment Core Interface Specification. The library constructor must\r
+ initialize this global pointer to the start of HOB list, so it is available at the\r
+ module's entry point. Since there is overhead in looking up the pointer to the start\r
+ of HOB list, only those modules that actually require access to the HOB list\r
+ should use this library.\r
+\r
+Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#ifndef __DXE_HOB_LIST_LIB_H__\r
+#define __DXE_HOB_LIST_LIB_H__\r
+\r
+///\r
+/// Cache copy of the start of HOB list\r
+///\r
+extern VOID *gHobList;\r
+\r
+#endif\r
+\r
--- /dev/null
+## @file\r
+# HOB Library implementation for Payload Phase.\r
+#\r
+# Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>\r
+#\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
+#\r
+#\r
+##\r
+\r
+[Defines]\r
+ INF_VERSION = 0x00010005\r
+ BASE_NAME = DxeHobLib\r
+ MODULE_UNI_FILE = DxeHobLib.uni\r
+ FILE_GUID = 1a15b8b3-3e8a-4698-87b9-65aad9993b52\r
+ MODULE_TYPE = DXE_DRIVER\r
+ VERSION_STRING = 1.0\r
+ LIBRARY_CLASS = HobLib|DXE_DRIVER DXE_RUNTIME_DRIVER SMM_CORE DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER\r
+\r
+#\r
+# VALID_ARCHITECTURES = IA32 X64 EBC\r
+#\r
+\r
+[Sources]\r
+ HobLib.c\r
+\r
+\r
+[Packages]\r
+ MdePkg/MdePkg.dec\r
+ UefiPayloadPkg/UefiPayloadPkg.dec\r
+\r
+\r
+[LibraryClasses]\r
+ BaseMemoryLib\r
+ DebugLib\r
+ DxeHobListLib\r
--- /dev/null
+// /** @file\r
+// HOB Library implementation for Payload Phase.\r
+//\r
+// The Hoblist will be set by DxeHobListLib or other modules.\r
+//\r
+// Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>\r
+//\r
+// SPDX-License-Identifier: BSD-2-Clause-Patent\r
+//\r
+// **/\r
+\r
+\r
+#string STR_MODULE_ABSTRACT #language en-US "HOB Library implementation for Payload Phase."\r
+\r
+#string STR_MODULE_DESCRIPTION #language en-US "The HOB Library implementation for Payload Phase that doesn't contain HobLibConstructor"\r
+\r
--- /dev/null
+/** @file\r
+ HOB Library implementation for Payload Phase.\r
+\r
+Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#include <PiDxe.h>\r
+\r
+#include <Library/HobLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/DxeHobListLib.h>\r
+\r
+/**\r
+ Returns the pointer to the HOB list.\r
+\r
+ This function returns the pointer to first HOB in the list.\r
+ For PEI phase, the PEI service GetHobList() can be used to retrieve the pointer\r
+ to the HOB list. For the DXE phase, the HOB list pointer can be retrieved through\r
+ the EFI System Table by looking up theHOB list GUID in the System Configuration Table.\r
+ Since the System Configuration Table does not exist that the time the DXE Core is\r
+ launched, the DXE Core uses a global variable from the DXE Core Entry Point Library\r
+ to manage the pointer to the HOB list.\r
+\r
+ If the pointer to the HOB list is NULL, then ASSERT().\r
+\r
+ @return The pointer to the HOB list.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetHobList (\r
+ VOID\r
+ )\r
+{\r
+ ASSERT (gHobList != NULL);\r
+ return gHobList;\r
+}\r
+\r
+/**\r
+ Returns the next instance of a HOB type from the starting HOB.\r
+\r
+ This function searches the first instance of a HOB type from the starting HOB pointer.\r
+ If there does not exist such HOB type from the starting HOB pointer, it will return NULL.\r
+ In contrast with macro GET_NEXT_HOB(), this function does not skip the starting HOB pointer\r
+ unconditionally: it returns HobStart back if HobStart itself meets the requirement;\r
+ caller is required to use GET_NEXT_HOB() if it wishes to skip current HobStart.\r
+\r
+ If HobStart is NULL, then ASSERT().\r
+\r
+ @param Type The HOB type to return.\r
+ @param HobStart The starting HOB pointer to search from.\r
+\r
+ @return The next instance of a HOB type from the starting HOB.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetNextHob (\r
+ IN UINT16 Type,\r
+ IN CONST VOID *HobStart\r
+ )\r
+{\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+\r
+ ASSERT (HobStart != NULL);\r
+\r
+ Hob.Raw = (UINT8 *) HobStart;\r
+ //\r
+ // Parse the HOB list until end of list or matching type is found.\r
+ //\r
+ while (!END_OF_HOB_LIST (Hob)) {\r
+ if (Hob.Header->HobType == Type) {\r
+ return Hob.Raw;\r
+ }\r
+ Hob.Raw = GET_NEXT_HOB (Hob);\r
+ }\r
+ return NULL;\r
+}\r
+\r
+/**\r
+ Returns the first instance of a HOB type among the whole HOB list.\r
+\r
+ This function searches the first instance of a HOB type among the whole HOB list.\r
+ If there does not exist such HOB type in the HOB list, it will return NULL.\r
+\r
+ If the pointer to the HOB list is NULL, then ASSERT().\r
+\r
+ @param Type The HOB type to return.\r
+\r
+ @return The next instance of a HOB type from the starting HOB.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetFirstHob (\r
+ IN UINT16 Type\r
+ )\r
+{\r
+ VOID *HobList;\r
+\r
+ HobList = GetHobList ();\r
+ return GetNextHob (Type, HobList);\r
+}\r
+\r
+/**\r
+ Returns the next instance of the matched GUID HOB from the starting HOB.\r
+\r
+ This function searches the first instance of a HOB from the starting HOB pointer.\r
+ Such HOB should satisfy two conditions:\r
+ its HOB type is EFI_HOB_TYPE_GUID_EXTENSION and its GUID Name equals to the input Guid.\r
+ If there does not exist such HOB from the starting HOB pointer, it will return NULL.\r
+ Caller is required to apply GET_GUID_HOB_DATA () and GET_GUID_HOB_DATA_SIZE ()\r
+ to extract the data section and its size information, respectively.\r
+ In contrast with macro GET_NEXT_HOB(), this function does not skip the starting HOB pointer\r
+ unconditionally: it returns HobStart back if HobStart itself meets the requirement;\r
+ caller is required to use GET_NEXT_HOB() if it wishes to skip current HobStart.\r
+\r
+ If Guid is NULL, then ASSERT().\r
+ If HobStart is NULL, then ASSERT().\r
+\r
+ @param Guid The GUID to match with in the HOB list.\r
+ @param HobStart A pointer to a Guid.\r
+\r
+ @return The next instance of the matched GUID HOB from the starting HOB.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetNextGuidHob (\r
+ IN CONST EFI_GUID *Guid,\r
+ IN CONST VOID *HobStart\r
+ )\r
+{\r
+ EFI_PEI_HOB_POINTERS GuidHob;\r
+\r
+ GuidHob.Raw = (UINT8 *) HobStart;\r
+ while ((GuidHob.Raw = GetNextHob (EFI_HOB_TYPE_GUID_EXTENSION, GuidHob.Raw)) != NULL) {\r
+ if (CompareGuid (Guid, &GuidHob.Guid->Name)) {\r
+ break;\r
+ }\r
+ GuidHob.Raw = GET_NEXT_HOB (GuidHob);\r
+ }\r
+ return GuidHob.Raw;\r
+}\r
+\r
+/**\r
+ Returns the first instance of the matched GUID HOB among the whole HOB list.\r
+\r
+ This function searches the first instance of a HOB among the whole HOB list.\r
+ Such HOB should satisfy two conditions:\r
+ its HOB type is EFI_HOB_TYPE_GUID_EXTENSION and its GUID Name equals to the input Guid.\r
+ If there does not exist such HOB from the starting HOB pointer, it will return NULL.\r
+ Caller is required to apply GET_GUID_HOB_DATA () and GET_GUID_HOB_DATA_SIZE ()\r
+ to extract the data section and its size information, respectively.\r
+\r
+ If the pointer to the HOB list is NULL, then ASSERT().\r
+ If Guid is NULL, then ASSERT().\r
+\r
+ @param Guid The GUID to match with in the HOB list.\r
+\r
+ @return The first instance of the matched GUID HOB among the whole HOB list.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetFirstGuidHob (\r
+ IN CONST EFI_GUID *Guid\r
+ )\r
+{\r
+ VOID *HobList;\r
+\r
+ HobList = GetHobList ();\r
+ return GetNextGuidHob (Guid, HobList);\r
+}\r
+\r
+/**\r
+ Get the system boot mode from the HOB list.\r
+\r
+ This function returns the system boot mode information from the\r
+ PHIT HOB in HOB list.\r
+\r
+ If the pointer to the HOB list is NULL, then ASSERT().\r
+\r
+ @param VOID\r
+\r
+ @return The Boot Mode.\r
+\r
+**/\r
+EFI_BOOT_MODE\r
+EFIAPI\r
+GetBootModeHob (\r
+ VOID\r
+ )\r
+{\r
+ EFI_HOB_HANDOFF_INFO_TABLE *HandOffHob;\r
+\r
+ HandOffHob = (EFI_HOB_HANDOFF_INFO_TABLE *) GetHobList ();\r
+\r
+ return HandOffHob->BootMode;\r
+}\r
+\r
+/**\r
+ Builds a HOB for a loaded PE32 module.\r
+\r
+ This function builds a HOB for a loaded PE32 module.\r
+ It can only be invoked during PEI phase;\r
+ for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+\r
+ If ModuleName is NULL, then ASSERT().\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+\r
+ @param ModuleName The GUID File Name of the module.\r
+ @param MemoryAllocationModule The 64 bit physical address of the module.\r
+ @param ModuleLength The length of the module in bytes.\r
+ @param EntryPoint The 64 bit physical address of the module entry point.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BuildModuleHob (\r
+ IN CONST EFI_GUID *ModuleName,\r
+ IN EFI_PHYSICAL_ADDRESS MemoryAllocationModule,\r
+ IN UINT64 ModuleLength,\r
+ IN EFI_PHYSICAL_ADDRESS EntryPoint\r
+ )\r
+{\r
+ //\r
+ // PEI HOB is read only for DXE phase\r
+ //\r
+ ASSERT (FALSE);\r
+}\r
+\r
+/**\r
+ Builds a HOB that describes a chunk of system memory with Owner GUID.\r
+\r
+ This function builds a HOB that describes a chunk of system memory.\r
+ It can only be invoked during PEI phase;\r
+ for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+\r
+ @param ResourceType The type of resource described by this HOB.\r
+ @param ResourceAttribute The resource attributes of the memory described by this HOB.\r
+ @param PhysicalStart The 64 bit physical address of memory described by this HOB.\r
+ @param NumberOfBytes The length of the memory described by this HOB in bytes.\r
+ @param OwnerGUID GUID for the owner of this resource.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BuildResourceDescriptorWithOwnerHob (\r
+ IN EFI_RESOURCE_TYPE ResourceType,\r
+ IN EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute,\r
+ IN EFI_PHYSICAL_ADDRESS PhysicalStart,\r
+ IN UINT64 NumberOfBytes,\r
+ IN EFI_GUID *OwnerGUID\r
+ )\r
+{\r
+ //\r
+ // PEI HOB is read only for DXE phase\r
+ //\r
+ ASSERT (FALSE);\r
+}\r
+\r
+/**\r
+ Builds a HOB that describes a chunk of system memory.\r
+\r
+ This function builds a HOB that describes a chunk of system memory.\r
+ It can only be invoked during PEI phase;\r
+ for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+\r
+ @param ResourceType The type of resource described by this HOB.\r
+ @param ResourceAttribute The resource attributes of the memory described by this HOB.\r
+ @param PhysicalStart The 64 bit physical address of memory described by this HOB.\r
+ @param NumberOfBytes The length of the memory described by this HOB in bytes.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BuildResourceDescriptorHob (\r
+ IN EFI_RESOURCE_TYPE ResourceType,\r
+ IN EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute,\r
+ IN EFI_PHYSICAL_ADDRESS PhysicalStart,\r
+ IN UINT64 NumberOfBytes\r
+ )\r
+{\r
+ //\r
+ // PEI HOB is read only for DXE phase\r
+ //\r
+ ASSERT (FALSE);\r
+}\r
+\r
+/**\r
+ Builds a customized HOB tagged with a GUID for identification and returns\r
+ the start address of GUID HOB data.\r
+\r
+ This function builds a customized HOB tagged with a GUID for identification\r
+ and returns the start address of GUID HOB data so that caller can fill the customized data.\r
+ The HOB Header and Name field is already stripped.\r
+ It can only be invoked during PEI phase;\r
+ for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+\r
+ If Guid is NULL, then ASSERT().\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+ If DataLength > (0xFFF8 - sizeof (EFI_HOB_GUID_TYPE)), then ASSERT().\r
+ HobLength is UINT16 and multiples of 8 bytes, so the max HobLength is 0xFFF8.\r
+\r
+ @param Guid The GUID to tag the customized HOB.\r
+ @param DataLength The size of the data payload for the GUID HOB.\r
+\r
+ @retval NULL The GUID HOB could not be allocated.\r
+ @retval others The start address of GUID HOB data.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+BuildGuidHob (\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINTN DataLength\r
+ )\r
+{\r
+ //\r
+ // PEI HOB is read only for DXE phase\r
+ //\r
+ ASSERT (FALSE);\r
+ return NULL;\r
+}\r
+\r
+/**\r
+ Builds a customized HOB tagged with a GUID for identification, copies the input data to the HOB\r
+ data field, and returns the start address of the GUID HOB data.\r
+\r
+ This function builds a customized HOB tagged with a GUID for identification and copies the input\r
+ data to the HOB data field and returns the start address of the GUID HOB data. It can only be\r
+ invoked during PEI phase; for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+ The HOB Header and Name field is already stripped.\r
+ It can only be invoked during PEI phase;\r
+ for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+\r
+ If Guid is NULL, then ASSERT().\r
+ If Data is NULL and DataLength > 0, then ASSERT().\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+ If DataLength > (0xFFF8 - sizeof (EFI_HOB_GUID_TYPE)), then ASSERT().\r
+ HobLength is UINT16 and multiples of 8 bytes, so the max HobLength is 0xFFF8.\r
+\r
+ @param Guid The GUID to tag the customized HOB.\r
+ @param Data The data to be copied into the data field of the GUID HOB.\r
+ @param DataLength The size of the data payload for the GUID HOB.\r
+\r
+ @retval NULL The GUID HOB could not be allocated.\r
+ @retval others The start address of GUID HOB data.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+BuildGuidDataHob (\r
+ IN CONST EFI_GUID *Guid,\r
+ IN VOID *Data,\r
+ IN UINTN DataLength\r
+ )\r
+{\r
+ //\r
+ // PEI HOB is read only for DXE phase\r
+ //\r
+ ASSERT (FALSE);\r
+ return NULL;\r
+}\r
+\r
+/**\r
+ Builds a Firmware Volume HOB.\r
+\r
+ This function builds a Firmware Volume HOB.\r
+ It can only be invoked during PEI phase;\r
+ for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+ If the FvImage buffer is not at its required alignment, then ASSERT().\r
+\r
+ @param BaseAddress The base address of the Firmware Volume.\r
+ @param Length The size of the Firmware Volume in bytes.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BuildFvHob (\r
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
+ IN UINT64 Length\r
+ )\r
+{\r
+ //\r
+ // PEI HOB is read only for DXE phase\r
+ //\r
+ ASSERT (FALSE);\r
+}\r
+\r
+/**\r
+ Builds a EFI_HOB_TYPE_FV2 HOB.\r
+\r
+ This function builds a EFI_HOB_TYPE_FV2 HOB.\r
+ It can only be invoked during PEI phase;\r
+ for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+ If the FvImage buffer is not at its required alignment, then ASSERT().\r
+\r
+ @param BaseAddress The base address of the Firmware Volume.\r
+ @param Length The size of the Firmware Volume in bytes.\r
+ @param FvName The name of the Firmware Volume.\r
+ @param FileName The name of the file.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BuildFv2Hob (\r
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
+ IN UINT64 Length,\r
+ IN CONST EFI_GUID *FvName,\r
+ IN CONST EFI_GUID *FileName\r
+ )\r
+{\r
+ ASSERT (FALSE);\r
+}\r
+\r
+/**\r
+ Builds a EFI_HOB_TYPE_FV3 HOB.\r
+\r
+ This function builds a EFI_HOB_TYPE_FV3 HOB.\r
+ It can only be invoked during PEI phase;\r
+ for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+ If the FvImage buffer is not at its required alignment, then ASSERT().\r
+\r
+ @param BaseAddress The base address of the Firmware Volume.\r
+ @param Length The size of the Firmware Volume in bytes.\r
+ @param AuthenticationStatus The authentication status.\r
+ @param ExtractedFv TRUE if the FV was extracted as a file within\r
+ another firmware volume. FALSE otherwise.\r
+ @param FvName The name of the Firmware Volume.\r
+ Valid only if IsExtractedFv is TRUE.\r
+ @param FileName The name of the file.\r
+ Valid only if IsExtractedFv is TRUE.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BuildFv3Hob (\r
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
+ IN UINT64 Length,\r
+ IN UINT32 AuthenticationStatus,\r
+ IN BOOLEAN ExtractedFv,\r
+ IN CONST EFI_GUID *FvName, OPTIONAL\r
+ IN CONST EFI_GUID *FileName OPTIONAL\r
+ )\r
+{\r
+ ASSERT (FALSE);\r
+}\r
+\r
+/**\r
+ Builds a Capsule Volume HOB.\r
+\r
+ This function builds a Capsule Volume HOB.\r
+ It can only be invoked during PEI phase;\r
+ for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+\r
+ If the platform does not support Capsule Volume HOBs, then ASSERT().\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+\r
+ @param BaseAddress The base address of the Capsule Volume.\r
+ @param Length The size of the Capsule Volume in bytes.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BuildCvHob (\r
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
+ IN UINT64 Length\r
+ )\r
+{\r
+ //\r
+ // PEI HOB is read only for DXE phase\r
+ //\r
+ ASSERT (FALSE);\r
+}\r
+\r
+/**\r
+ Builds a HOB for the CPU.\r
+\r
+ This function builds a HOB for the CPU.\r
+ It can only be invoked during PEI phase;\r
+ for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+\r
+ @param SizeOfMemorySpace The maximum physical memory addressability of the processor.\r
+ @param SizeOfIoSpace The maximum physical I/O addressability of the processor.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BuildCpuHob (\r
+ IN UINT8 SizeOfMemorySpace,\r
+ IN UINT8 SizeOfIoSpace\r
+ )\r
+{\r
+ //\r
+ // PEI HOB is read only for DXE phase\r
+ //\r
+ ASSERT (FALSE);\r
+}\r
+\r
+/**\r
+ Builds a HOB for the Stack.\r
+\r
+ This function builds a HOB for the stack.\r
+ It can only be invoked during PEI phase;\r
+ for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+\r
+ @param BaseAddress The 64 bit physical address of the Stack.\r
+ @param Length The length of the stack in bytes.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BuildStackHob (\r
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
+ IN UINT64 Length\r
+ )\r
+{\r
+ //\r
+ // PEI HOB is read only for DXE phase\r
+ //\r
+ ASSERT (FALSE);\r
+}\r
+\r
+/**\r
+ Builds a HOB for the BSP store.\r
+\r
+ This function builds a HOB for BSP store.\r
+ It can only be invoked during PEI phase;\r
+ for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+\r
+ @param BaseAddress The 64 bit physical address of the BSP.\r
+ @param Length The length of the BSP store in bytes.\r
+ @param MemoryType Type of memory allocated by this HOB.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BuildBspStoreHob (\r
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
+ IN UINT64 Length,\r
+ IN EFI_MEMORY_TYPE MemoryType\r
+ )\r
+{\r
+ //\r
+ // PEI HOB is read only for DXE phase\r
+ //\r
+ ASSERT (FALSE);\r
+}\r
+\r
+/**\r
+ Builds a HOB for the memory allocation.\r
+\r
+ This function builds a HOB for the memory allocation.\r
+ It can only be invoked during PEI phase;\r
+ for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+\r
+ @param BaseAddress The 64 bit physical address of the memory.\r
+ @param Length The length of the memory allocation in bytes.\r
+ @param MemoryType Type of memory allocated by this HOB.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BuildMemoryAllocationHob (\r
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
+ IN UINT64 Length,\r
+ IN EFI_MEMORY_TYPE MemoryType\r
+ )\r
+{\r
+ //\r
+ // PEI HOB is read only for DXE phase\r
+ //\r
+ ASSERT (FALSE);\r
+}\r
--- /dev/null
+/** @file\r
+ This library retrieve the EFI_BOOT_SERVICES pointer from EFI system table in\r
+ library's constructor.\r
+\r
+ Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+\r
+#include <Uefi.h>\r
+\r
+VOID *gHobList = NULL;\r
+\r
+/**\r
+ Local implementation of GUID comparasion that doesn't depend on DebugLib::ASSERT().\r
+\r
+ This function compares Guid1 to Guid2. If the GUIDs are identical then TRUE is returned.\r
+ If there are any bit differences in the two GUIDs, then FALSE is returned.\r
+\r
+ @param Guid1 A pointer to a 128 bit GUID.\r
+ @param Guid2 A pointer to a 128 bit GUID.\r
+\r
+ @retval TRUE Guid1 and Guid2 are identical.\r
+ @retval FALSE Guid1 and Guid2 are not identical.\r
+**/\r
+BOOLEAN\r
+LocalCompareGuid (\r
+ IN CONST GUID *Guid1,\r
+ IN CONST GUID *Guid2\r
+ )\r
+{\r
+ UINT64 *Left;\r
+ UINT64 *Right;\r
+\r
+ Left = (UINT64 *) Guid1;\r
+ Right = (UINT64 *) Guid2;\r
+\r
+ return (BOOLEAN) (Left[0] == Right[0] && Left[1] == Right[1]);\r
+}\r
+\r
+/**\r
+ @param ImageHandle The firmware allocated handle for the EFI image.\r
+ @param SystemTable A pointer to the EFI System Table.\r
+\r
+ @retval EFI_SUCCESS The constructor always returns EFI_SUCCESS.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DxeHobListLibConstructor (\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN EFI_SYSTEM_TABLE *SystemTable\r
+ )\r
+{\r
+ UINTN Index;\r
+\r
+ for (Index = 0; Index < SystemTable->NumberOfTableEntries; Index++) {\r
+ if (LocalCompareGuid (&gEfiHobListGuid, &SystemTable->ConfigurationTable[Index].VendorGuid)) {\r
+ gHobList = SystemTable->ConfigurationTable[Index].VendorTable;\r
+ return EFI_SUCCESS;\r
+ }\r
+ }\r
+\r
+ return EFI_NOT_FOUND;\r
+}\r
--- /dev/null
+## @file\r
+# UEFI Boot Services Table Library implementation.\r
+#\r
+# Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>\r
+#\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
+#\r
+#\r
+##\r
+\r
+[Defines]\r
+ INF_VERSION = 0x00010005\r
+ BASE_NAME = UefiPayloadInitHobLib\r
+ FILE_GUID = ff5c7a21-ab7a-4366-8616-11c6e53247b6\r
+ MODULE_TYPE = UEFI_DRIVER\r
+ VERSION_STRING = 1.0\r
+ LIBRARY_CLASS = DxeHobListLib|DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER SMM_CORE\r
+\r
+ CONSTRUCTOR = DxeHobListLibConstructor\r
+\r
+#\r
+# VALID_ARCHITECTURES = IA32 X64 EBC\r
+#\r
+\r
+[Sources]\r
+ DxeHobListLib.c\r
+\r
+[Packages]\r
+ MdePkg/MdePkg.dec\r
+ UefiPayloadPkg/UefiPayloadPkg.dec\r
+\r
+[Guids]\r
+ gEfiHobListGuid ## CONSUMES\r
+\r
+\r
--- /dev/null
+/** @file\r
+ This library retrieve the EFI_BOOT_SERVICES pointer from EFI system table in\r
+ library's constructor.\r
+\r
+ Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+\r
+#include <Uefi.h>\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+DxeHobListLibNullConstructor (\r
+ VOID\r
+ )\r
+{\r
+ return EFI_SUCCESS;\r
+}\r
--- /dev/null
+## @file\r
+# UEFI Boot Services Table Library implementation.\r
+#\r
+# Copyright (c) 2021, Intel Corporation. All rights reserved.<BR>\r
+#\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
+#\r
+#\r
+##\r
+\r
+[Defines]\r
+ INF_VERSION = 0x00010005\r
+ BASE_NAME = DxeHobListLibNull\r
+ MODULE_TYPE = BASE\r
+ FILE_GUID = 060876c2-0e4e-4c63-8996-6af3710cfa64\r
+ VERSION_STRING = 1.0\r
+ LIBRARY_CLASS = DxeHobListLib\r
+ CONSTRUCTOR = DxeHobListLibNullConstructor\r
+\r
+#\r
+# VALID_ARCHITECTURES = IA32 X64 EBC\r
+#\r
+\r
+[Packages]\r
+ MdePkg/MdePkg.dec\r
+\r
+[Sources]\r
+ DxeHobListLibNull.c\r
+++ /dev/null
-/** @file\r
-\r
- Copyright (c) 2010, Apple Inc. All rights reserved.<BR>\r
- Copyright (c) 2017 - 2020, Intel Corporation. All rights reserved.<BR>\r
-\r
- SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-**/\r
-\r
-#include <PiPei.h>\r
-\r
-#include <Library/BaseLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/DebugLib.h>\r
-#include <Library/HobLib.h>\r
-#include <Library/PcdLib.h>\r
-\r
-VOID *mHobList;\r
-\r
-/**\r
- Returns the pointer to the HOB list.\r
-\r
- This function returns the pointer to first HOB in the list.\r
-\r
- @return The pointer to the HOB list.\r
-\r
-**/\r
-VOID *\r
-EFIAPI\r
-GetHobList (\r
- VOID\r
- )\r
-{\r
- ASSERT (mHobList != NULL);\r
- return mHobList;\r
-}\r
-\r
-\r
-/**\r
- Build a Handoff Information Table HOB\r
-\r
- This function initialize a HOB region from EfiMemoryBegin with length\r
- EfiMemoryLength. And EfiFreeMemoryBottom and EfiFreeMemoryTop should\r
- be inside the HOB region.\r
-\r
- @param[in] EfiMemoryBegin Total memory start address\r
- @param[in] EfiMemoryLength Total memory length reported in handoff HOB.\r
- @param[in] EfiFreeMemoryBottom Free memory start address\r
- @param[in] EfiFreeMemoryTop Free memory end address.\r
-\r
- @return The pointer to the handoff HOB table.\r
-\r
-**/\r
-EFI_HOB_HANDOFF_INFO_TABLE*\r
-EFIAPI\r
-HobConstructor (\r
- IN VOID *EfiMemoryBegin,\r
- IN UINTN EfiMemoryLength,\r
- IN VOID *EfiFreeMemoryBottom,\r
- IN VOID *EfiFreeMemoryTop\r
- )\r
-{\r
- EFI_HOB_HANDOFF_INFO_TABLE *Hob;\r
- EFI_HOB_GENERIC_HEADER *HobEnd;\r
-\r
- Hob = EfiFreeMemoryBottom;\r
- HobEnd = (EFI_HOB_GENERIC_HEADER *)(Hob+1);\r
-\r
- Hob->Header.HobType = EFI_HOB_TYPE_HANDOFF;\r
- Hob->Header.HobLength = sizeof(EFI_HOB_HANDOFF_INFO_TABLE);\r
- Hob->Header.Reserved = 0;\r
-\r
- HobEnd->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST;\r
- HobEnd->HobLength = sizeof(EFI_HOB_GENERIC_HEADER);\r
- HobEnd->Reserved = 0;\r
-\r
- Hob->Version = EFI_HOB_HANDOFF_TABLE_VERSION;\r
- Hob->BootMode = BOOT_WITH_FULL_CONFIGURATION;\r
-\r
- Hob->EfiMemoryTop = (UINTN)EfiMemoryBegin + EfiMemoryLength;\r
- Hob->EfiMemoryBottom = (UINTN)EfiMemoryBegin;\r
- Hob->EfiFreeMemoryTop = (UINTN)EfiFreeMemoryTop;\r
- Hob->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS)(UINTN)(HobEnd+1);\r
- Hob->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS)(UINTN)HobEnd;\r
-\r
- mHobList = Hob;\r
- return Hob;\r
-}\r
-\r
-/**\r
- Add a new HOB to the HOB List.\r
-\r
- @param HobType Type of the new HOB.\r
- @param HobLength Length of the new HOB to allocate.\r
-\r
- @return NULL if there is no space to create a hob.\r
- @return The address point to the new created hob.\r
-\r
-**/\r
-VOID *\r
-EFIAPI\r
-CreateHob (\r
- IN UINT16 HobType,\r
- IN UINT16 HobLength\r
- )\r
-{\r
- EFI_HOB_HANDOFF_INFO_TABLE *HandOffHob;\r
- EFI_HOB_GENERIC_HEADER *HobEnd;\r
- EFI_PHYSICAL_ADDRESS FreeMemory;\r
- VOID *Hob;\r
-\r
- HandOffHob = GetHobList ();\r
-\r
- HobLength = (UINT16)((HobLength + 0x7) & (~0x7));\r
-\r
- FreeMemory = HandOffHob->EfiFreeMemoryTop - HandOffHob->EfiFreeMemoryBottom;\r
-\r
- if (FreeMemory < HobLength) {\r
- return NULL;\r
- }\r
-\r
- Hob = (VOID*) (UINTN) HandOffHob->EfiEndOfHobList;\r
- ((EFI_HOB_GENERIC_HEADER*) Hob)->HobType = HobType;\r
- ((EFI_HOB_GENERIC_HEADER*) Hob)->HobLength = HobLength;\r
- ((EFI_HOB_GENERIC_HEADER*) Hob)->Reserved = 0;\r
-\r
- HobEnd = (EFI_HOB_GENERIC_HEADER*) ((UINTN)Hob + HobLength);\r
- HandOffHob->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS) (UINTN) HobEnd;\r
-\r
- HobEnd->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST;\r
- HobEnd->HobLength = sizeof(EFI_HOB_GENERIC_HEADER);\r
- HobEnd->Reserved = 0;\r
- HobEnd++;\r
- HandOffHob->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN) HobEnd;\r
-\r
- return Hob;\r
-}\r
-\r
-/**\r
- Builds a HOB that describes a chunk of system memory.\r
-\r
- This function builds a HOB that describes a chunk of system memory.\r
- If there is no additional space for HOB creation, then ASSERT().\r
-\r
- @param ResourceType The type of resource described by this HOB.\r
- @param ResourceAttribute The resource attributes of the memory described by this HOB.\r
- @param PhysicalStart The 64 bit physical address of memory described by this HOB.\r
- @param NumberOfBytes The length of the memory described by this HOB in bytes.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-BuildResourceDescriptorHob (\r
- IN EFI_RESOURCE_TYPE ResourceType,\r
- IN EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute,\r
- IN EFI_PHYSICAL_ADDRESS PhysicalStart,\r
- IN UINT64 NumberOfBytes\r
- )\r
-{\r
- EFI_HOB_RESOURCE_DESCRIPTOR *Hob;\r
-\r
- Hob = CreateHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, sizeof (EFI_HOB_RESOURCE_DESCRIPTOR));\r
- ASSERT(Hob != NULL);\r
-\r
- Hob->ResourceType = ResourceType;\r
- Hob->ResourceAttribute = ResourceAttribute;\r
- Hob->PhysicalStart = PhysicalStart;\r
- Hob->ResourceLength = NumberOfBytes;\r
-}\r
-\r
-VOID\r
-EFIAPI\r
-BuildFvHobs (\r
- IN EFI_PHYSICAL_ADDRESS PhysicalStart,\r
- IN UINT64 NumberOfBytes,\r
- IN EFI_RESOURCE_ATTRIBUTE_TYPE *ResourceAttribute\r
- )\r
-{\r
-\r
- EFI_RESOURCE_ATTRIBUTE_TYPE Resource;\r
-\r
- BuildFvHob (PhysicalStart, NumberOfBytes);\r
-\r
- if (ResourceAttribute == NULL) {\r
- Resource = (EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
- EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
- EFI_RESOURCE_ATTRIBUTE_TESTED |\r
- EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE);\r
- } else {\r
- Resource = *ResourceAttribute;\r
- }\r
-\r
- BuildResourceDescriptorHob (EFI_RESOURCE_FIRMWARE_DEVICE, Resource, PhysicalStart, NumberOfBytes);\r
-}\r
-\r
-/**\r
- Returns the next instance of a HOB type from the starting HOB.\r
-\r
- This function searches the first instance of a HOB type from the starting HOB pointer.\r
- If there does not exist such HOB type from the starting HOB pointer, it will return NULL.\r
- In contrast with macro GET_NEXT_HOB(), this function does not skip the starting HOB pointer\r
- unconditionally: it returns HobStart back if HobStart itself meets the requirement;\r
- caller is required to use GET_NEXT_HOB() if it wishes to skip current HobStart.\r
- If HobStart is NULL, then ASSERT().\r
-\r
- @param Type The HOB type to return.\r
- @param HobStart The starting HOB pointer to search from.\r
-\r
- @return The next instance of a HOB type from the starting HOB.\r
-\r
-**/\r
-VOID *\r
-EFIAPI\r
-GetNextHob (\r
- IN UINT16 Type,\r
- IN CONST VOID *HobStart\r
- )\r
-{\r
- EFI_PEI_HOB_POINTERS Hob;\r
-\r
- ASSERT (HobStart != NULL);\r
-\r
- Hob.Raw = (UINT8 *) HobStart;\r
- //\r
- // Parse the HOB list until end of list or matching type is found.\r
- //\r
- while (!END_OF_HOB_LIST (Hob)) {\r
- if (Hob.Header->HobType == Type) {\r
- return Hob.Raw;\r
- }\r
- Hob.Raw = GET_NEXT_HOB (Hob);\r
- }\r
- return NULL;\r
-}\r
-\r
-\r
-\r
-/**\r
- Returns the first instance of a HOB type among the whole HOB list.\r
-\r
- This function searches the first instance of a HOB type among the whole HOB list.\r
- If there does not exist such HOB type in the HOB list, it will return NULL.\r
-\r
- @param Type The HOB type to return.\r
-\r
- @return The next instance of a HOB type from the starting HOB.\r
-\r
-**/\r
-VOID *\r
-EFIAPI\r
-GetFirstHob (\r
- IN UINT16 Type\r
- )\r
-{\r
- VOID *HobList;\r
-\r
- HobList = GetHobList ();\r
- return GetNextHob (Type, HobList);\r
-}\r
-\r
-\r
-/**\r
- This function searches the first instance of a HOB from the starting HOB pointer.\r
- Such HOB should satisfy two conditions:\r
- its HOB type is EFI_HOB_TYPE_GUID_EXTENSION and its GUID Name equals to the input Guid.\r
- If there does not exist such HOB from the starting HOB pointer, it will return NULL.\r
- Caller is required to apply GET_GUID_HOB_DATA () and GET_GUID_HOB_DATA_SIZE ()\r
- to extract the data section and its size info respectively.\r
- In contrast with macro GET_NEXT_HOB(), this function does not skip the starting HOB pointer\r
- unconditionally: it returns HobStart back if HobStart itself meets the requirement;\r
- caller is required to use GET_NEXT_HOB() if it wishes to skip current HobStart.\r
- If Guid is NULL, then ASSERT().\r
- If HobStart is NULL, then ASSERT().\r
-\r
- @param Guid The GUID to match with in the HOB list.\r
- @param HobStart A pointer to a Guid.\r
-\r
- @return The next instance of the matched GUID HOB from the starting HOB.\r
-\r
-**/\r
-VOID *\r
-EFIAPI\r
-GetNextGuidHob (\r
- IN CONST EFI_GUID *Guid,\r
- IN CONST VOID *HobStart\r
- ){\r
- EFI_PEI_HOB_POINTERS GuidHob;\r
-\r
- GuidHob.Raw = (UINT8 *) HobStart;\r
- while ((GuidHob.Raw = GetNextHob (EFI_HOB_TYPE_GUID_EXTENSION, GuidHob.Raw)) != NULL) {\r
- if (CompareGuid (Guid, &GuidHob.Guid->Name)) {\r
- break;\r
- }\r
- GuidHob.Raw = GET_NEXT_HOB (GuidHob);\r
- }\r
- return GuidHob.Raw;\r
-}\r
-\r
-\r
-/**\r
- This function searches the first instance of a HOB among the whole HOB list.\r
- Such HOB should satisfy two conditions:\r
- its HOB type is EFI_HOB_TYPE_GUID_EXTENSION and its GUID Name equals to the input Guid.\r
- If there does not exist such HOB from the starting HOB pointer, it will return NULL.\r
- Caller is required to apply GET_GUID_HOB_DATA () and GET_GUID_HOB_DATA_SIZE ()\r
- to extract the data section and its size info respectively.\r
- If Guid is NULL, then ASSERT().\r
-\r
- @param Guid The GUID to match with in the HOB list.\r
-\r
- @return The first instance of the matched GUID HOB among the whole HOB list.\r
-\r
-**/\r
-VOID *\r
-EFIAPI\r
-GetFirstGuidHob (\r
- IN CONST EFI_GUID *Guid\r
- )\r
-{\r
- VOID *HobList;\r
-\r
- HobList = GetHobList ();\r
- return GetNextGuidHob (Guid, HobList);\r
-}\r
-\r
-\r
-\r
-\r
-/**\r
- Builds a HOB for a loaded PE32 module.\r
-\r
- This function builds a HOB for a loaded PE32 module.\r
- It can only be invoked during PEI phase;\r
- for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
- If ModuleName is NULL, then ASSERT().\r
- If there is no additional space for HOB creation, then ASSERT().\r
-\r
- @param ModuleName The GUID File Name of the module.\r
- @param MemoryAllocationModule The 64 bit physical address of the module.\r
- @param ModuleLength The length of the module in bytes.\r
- @param EntryPoint The 64 bit physical address of the module entry point.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-BuildModuleHob (\r
- IN CONST EFI_GUID *ModuleName,\r
- IN EFI_PHYSICAL_ADDRESS MemoryAllocationModule,\r
- IN UINT64 ModuleLength,\r
- IN EFI_PHYSICAL_ADDRESS EntryPoint\r
- )\r
-{\r
- EFI_HOB_MEMORY_ALLOCATION_MODULE *Hob;\r
-\r
- ASSERT (((MemoryAllocationModule & (EFI_PAGE_SIZE - 1)) == 0) &&\r
- ((ModuleLength & (EFI_PAGE_SIZE - 1)) == 0));\r
-\r
- Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION_MODULE));\r
-\r
- CopyGuid (&(Hob->MemoryAllocationHeader.Name), &gEfiHobMemoryAllocModuleGuid);\r
- Hob->MemoryAllocationHeader.MemoryBaseAddress = MemoryAllocationModule;\r
- Hob->MemoryAllocationHeader.MemoryLength = ModuleLength;\r
- Hob->MemoryAllocationHeader.MemoryType = EfiBootServicesCode;\r
-\r
- //\r
- // Zero the reserved space to match HOB spec\r
- //\r
- ZeroMem (Hob->MemoryAllocationHeader.Reserved, sizeof (Hob->MemoryAllocationHeader.Reserved));\r
-\r
- CopyGuid (&Hob->ModuleName, ModuleName);\r
- Hob->EntryPoint = EntryPoint;\r
-}\r
-\r
-/**\r
- Builds a GUID HOB with a certain data length.\r
-\r
- This function builds a customized HOB tagged with a GUID for identification\r
- and returns the start address of GUID HOB data so that caller can fill the customized data.\r
- The HOB Header and Name field is already stripped.\r
- It can only be invoked during PEI phase;\r
- for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
- If Guid is NULL, then ASSERT().\r
- If there is no additional space for HOB creation, then ASSERT().\r
- If DataLength >= (0x10000 - sizeof (EFI_HOB_GUID_TYPE)), then ASSERT().\r
-\r
- @param Guid The GUID to tag the customized HOB.\r
- @param DataLength The size of the data payload for the GUID HOB.\r
-\r
- @return The start address of GUID HOB data.\r
-\r
-**/\r
-VOID *\r
-EFIAPI\r
-BuildGuidHob (\r
- IN CONST EFI_GUID *Guid,\r
- IN UINTN DataLength\r
- )\r
-{\r
- EFI_HOB_GUID_TYPE *Hob;\r
-\r
- //\r
- // Make sure that data length is not too long.\r
- //\r
- ASSERT (DataLength <= (0xffff - sizeof (EFI_HOB_GUID_TYPE)));\r
-\r
- Hob = CreateHob (EFI_HOB_TYPE_GUID_EXTENSION, (UINT16) (sizeof (EFI_HOB_GUID_TYPE) + DataLength));\r
- CopyGuid (&Hob->Name, Guid);\r
- return Hob + 1;\r
-}\r
-\r
-\r
-/**\r
- Copies a data buffer to a newly-built HOB.\r
-\r
- This function builds a customized HOB tagged with a GUID for identification,\r
- copies the input data to the HOB data field and returns the start address of the GUID HOB data.\r
- The HOB Header and Name field is already stripped.\r
- It can only be invoked during PEI phase;\r
- for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
- If Guid is NULL, then ASSERT().\r
- If Data is NULL and DataLength > 0, then ASSERT().\r
- If there is no additional space for HOB creation, then ASSERT().\r
- If DataLength >= (0x10000 - sizeof (EFI_HOB_GUID_TYPE)), then ASSERT().\r
-\r
- @param Guid The GUID to tag the customized HOB.\r
- @param Data The data to be copied into the data field of the GUID HOB.\r
- @param DataLength The size of the data payload for the GUID HOB.\r
-\r
- @return The start address of GUID HOB data.\r
-\r
-**/\r
-VOID *\r
-EFIAPI\r
-BuildGuidDataHob (\r
- IN CONST EFI_GUID *Guid,\r
- IN VOID *Data,\r
- IN UINTN DataLength\r
- )\r
-{\r
- VOID *HobData;\r
-\r
- ASSERT (Data != NULL || DataLength == 0);\r
-\r
- HobData = BuildGuidHob (Guid, DataLength);\r
-\r
- return CopyMem (HobData, Data, DataLength);\r
-}\r
-\r
-\r
-/**\r
- Builds a Firmware Volume HOB.\r
-\r
- This function builds a Firmware Volume HOB.\r
- It can only be invoked during PEI phase;\r
- for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
- If there is no additional space for HOB creation, then ASSERT().\r
-\r
- @param BaseAddress The base address of the Firmware Volume.\r
- @param Length The size of the Firmware Volume in bytes.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-BuildFvHob (\r
- IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
- IN UINT64 Length\r
- )\r
-{\r
- EFI_HOB_FIRMWARE_VOLUME *Hob;\r
-\r
- Hob = CreateHob (EFI_HOB_TYPE_FV, sizeof (EFI_HOB_FIRMWARE_VOLUME));\r
-\r
- Hob->BaseAddress = BaseAddress;\r
- Hob->Length = Length;\r
-}\r
-\r
-\r
-/**\r
- Builds a EFI_HOB_TYPE_FV2 HOB.\r
-\r
- This function builds a EFI_HOB_TYPE_FV2 HOB.\r
- It can only be invoked during PEI phase;\r
- for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
- If there is no additional space for HOB creation, then ASSERT().\r
-\r
- @param BaseAddress The base address of the Firmware Volume.\r
- @param Length The size of the Firmware Volume in bytes.\r
- @param FvName The name of the Firmware Volume.\r
- @param FileName The name of the file.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-BuildFv2Hob (\r
- IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
- IN UINT64 Length,\r
- IN CONST EFI_GUID *FvName,\r
- IN CONST EFI_GUID *FileName\r
- )\r
-{\r
- EFI_HOB_FIRMWARE_VOLUME2 *Hob;\r
-\r
- Hob = CreateHob (EFI_HOB_TYPE_FV2, sizeof (EFI_HOB_FIRMWARE_VOLUME2));\r
-\r
- Hob->BaseAddress = BaseAddress;\r
- Hob->Length = Length;\r
- CopyGuid (&Hob->FvName, FvName);\r
- CopyGuid (&Hob->FileName, FileName);\r
-}\r
-\r
-/**\r
- Builds a EFI_HOB_TYPE_FV3 HOB.\r
-\r
- This function builds a EFI_HOB_TYPE_FV3 HOB.\r
- It can only be invoked during PEI phase;\r
- for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
-\r
- If there is no additional space for HOB creation, then ASSERT().\r
-\r
- @param BaseAddress The base address of the Firmware Volume.\r
- @param Length The size of the Firmware Volume in bytes.\r
- @param AuthenticationStatus The authentication status.\r
- @param ExtractedFv TRUE if the FV was extracted as a file within\r
- another firmware volume. FALSE otherwise.\r
- @param FvName The name of the Firmware Volume.\r
- Valid only if IsExtractedFv is TRUE.\r
- @param FileName The name of the file.\r
- Valid only if IsExtractedFv is TRUE.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-BuildFv3Hob (\r
- IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
- IN UINT64 Length,\r
- IN UINT32 AuthenticationStatus,\r
- IN BOOLEAN ExtractedFv,\r
- IN CONST EFI_GUID *FvName, OPTIONAL\r
- IN CONST EFI_GUID *FileName OPTIONAL\r
- )\r
-{\r
- EFI_HOB_FIRMWARE_VOLUME3 *Hob;\r
-\r
- Hob = CreateHob (EFI_HOB_TYPE_FV3, sizeof (EFI_HOB_FIRMWARE_VOLUME3));\r
-\r
- Hob->BaseAddress = BaseAddress;\r
- Hob->Length = Length;\r
- Hob->AuthenticationStatus = AuthenticationStatus;\r
- Hob->ExtractedFv = ExtractedFv;\r
- if (ExtractedFv) {\r
- CopyGuid (&Hob->FvName, FvName);\r
- CopyGuid (&Hob->FileName, FileName);\r
- }\r
-}\r
-\r
-\r
-/**\r
- Builds a HOB for the CPU.\r
-\r
- This function builds a HOB for the CPU.\r
- It can only be invoked during PEI phase;\r
- for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
- If there is no additional space for HOB creation, then ASSERT().\r
-\r
- @param SizeOfMemorySpace The maximum physical memory addressability of the processor.\r
- @param SizeOfIoSpace The maximum physical I/O addressability of the processor.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-BuildCpuHob (\r
- IN UINT8 SizeOfMemorySpace,\r
- IN UINT8 SizeOfIoSpace\r
- )\r
-{\r
- EFI_HOB_CPU *Hob;\r
-\r
- Hob = CreateHob (EFI_HOB_TYPE_CPU, sizeof (EFI_HOB_CPU));\r
-\r
- Hob->SizeOfMemorySpace = SizeOfMemorySpace;\r
- Hob->SizeOfIoSpace = SizeOfIoSpace;\r
-\r
- //\r
- // Zero the reserved space to match HOB spec\r
- //\r
- ZeroMem (Hob->Reserved, sizeof (Hob->Reserved));\r
-}\r
-\r
-\r
-/**\r
- Builds a HOB for the Stack.\r
-\r
- This function builds a HOB for the stack.\r
- It can only be invoked during PEI phase;\r
- for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
- If there is no additional space for HOB creation, then ASSERT().\r
-\r
- @param BaseAddress The 64 bit physical address of the Stack.\r
- @param Length The length of the stack in bytes.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-BuildStackHob (\r
- IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
- IN UINT64 Length\r
- )\r
-{\r
- EFI_HOB_MEMORY_ALLOCATION_STACK *Hob;\r
-\r
- ASSERT (((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&\r
- ((Length & (EFI_PAGE_SIZE - 1)) == 0));\r
-\r
- Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION_STACK));\r
-\r
- CopyGuid (&(Hob->AllocDescriptor.Name), &gEfiHobMemoryAllocStackGuid);\r
- Hob->AllocDescriptor.MemoryBaseAddress = BaseAddress;\r
- Hob->AllocDescriptor.MemoryLength = Length;\r
- Hob->AllocDescriptor.MemoryType = EfiBootServicesData;\r
-\r
- //\r
- // Zero the reserved space to match HOB spec\r
- //\r
- ZeroMem (Hob->AllocDescriptor.Reserved, sizeof (Hob->AllocDescriptor.Reserved));\r
-}\r
-\r
-\r
-/**\r
- Update the Stack Hob if the stack has been moved\r
-\r
- @param BaseAddress The 64 bit physical address of the Stack.\r
- @param Length The length of the stack in bytes.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-UpdateStackHob (\r
- IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
- IN UINT64 Length\r
- )\r
-{\r
- EFI_PEI_HOB_POINTERS Hob;\r
-\r
- Hob.Raw = GetHobList ();\r
- while ((Hob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, Hob.Raw)) != NULL) {\r
- if (CompareGuid (&gEfiHobMemoryAllocStackGuid, &(Hob.MemoryAllocationStack->AllocDescriptor.Name))) {\r
- //\r
- // Build a new memory allocation HOB with old stack info with EfiConventionalMemory type\r
- // to be reclaimed by DXE core.\r
- //\r
- BuildMemoryAllocationHob (\r
- Hob.MemoryAllocationStack->AllocDescriptor.MemoryBaseAddress,\r
- Hob.MemoryAllocationStack->AllocDescriptor.MemoryLength,\r
- EfiConventionalMemory\r
- );\r
- //\r
- // Update the BSP Stack Hob to reflect the new stack info.\r
- //\r
- Hob.MemoryAllocationStack->AllocDescriptor.MemoryBaseAddress = BaseAddress;\r
- Hob.MemoryAllocationStack->AllocDescriptor.MemoryLength = Length;\r
- break;\r
- }\r
- Hob.Raw = GET_NEXT_HOB (Hob);\r
- }\r
-}\r
-\r
-\r
-\r
-/**\r
- Builds a HOB for the memory allocation.\r
-\r
- This function builds a HOB for the memory allocation.\r
- It can only be invoked during PEI phase;\r
- for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
- If there is no additional space for HOB creation, then ASSERT().\r
-\r
- @param BaseAddress The 64 bit physical address of the memory.\r
- @param Length The length of the memory allocation in bytes.\r
- @param MemoryType Type of memory allocated by this HOB.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-BuildMemoryAllocationHob (\r
- IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
- IN UINT64 Length,\r
- IN EFI_MEMORY_TYPE MemoryType\r
- )\r
-{\r
- EFI_HOB_MEMORY_ALLOCATION *Hob;\r
-\r
- ASSERT (((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&\r
- ((Length & (EFI_PAGE_SIZE - 1)) == 0));\r
-\r
- Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION));\r
-\r
- ZeroMem (&(Hob->AllocDescriptor.Name), sizeof (EFI_GUID));\r
- Hob->AllocDescriptor.MemoryBaseAddress = BaseAddress;\r
- Hob->AllocDescriptor.MemoryLength = Length;\r
- Hob->AllocDescriptor.MemoryType = MemoryType;\r
- //\r
- // Zero the reserved space to match HOB spec\r
- //\r
- ZeroMem (Hob->AllocDescriptor.Reserved, sizeof (Hob->AllocDescriptor.Reserved));\r
-}\r
-\r
+++ /dev/null
-#/** @file\r
-#\r
-# Copyright (c) 2018 - 2020, Intel Corporation. All rights reserved.<BR>\r
-# Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>\r
-#\r
-# SPDX-License-Identifier: BSD-2-Clause-Patent\r
-#\r
-#\r
-#**/\r
-\r
-[Defines]\r
- INF_VERSION = 0x00010005\r
- BASE_NAME = HobLib\r
- FILE_GUID = AD6B4D55-8DBE-48C8-88E3-CFDBB6E9D193\r
- MODULE_TYPE = BASE\r
- VERSION_STRING = 1.0\r
- LIBRARY_CLASS = HobLib\r
-\r
-#\r
-# VALID_ARCHITECTURES = IA32 X64 EBC\r
-#\r
-\r
-[Sources.common]\r
- Hob.c\r
-\r
-[Packages]\r
- MdePkg/MdePkg.dec\r
- MdeModulePkg/MdeModulePkg.dec\r
- UefiPayloadPkg/UefiPayloadPkg.dec\r
-\r
-[LibraryClasses]\r
- BaseLib\r
- BaseMemoryLib\r
- DebugLib\r
-\r
-[Guids]\r
- gEfiHobMemoryAllocModuleGuid\r
- gEfiHobMemoryAllocStackGuid\r
-\r
--- /dev/null
+/** @file\r
+\r
+ Copyright (c) 2010, Apple Inc. All rights reserved.<BR>\r
+ Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.<BR>\r
+\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#include <PiPei.h>\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/HobLib.h>\r
+#include <Library/PcdLib.h>\r
+\r
+VOID *mHobList;\r
+\r
+/**\r
+ Returns the pointer to the HOB list.\r
+\r
+ This function returns the pointer to first HOB in the list.\r
+\r
+ @return The pointer to the HOB list.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetHobList (\r
+ VOID\r
+ )\r
+{\r
+ ASSERT (mHobList != NULL);\r
+ return mHobList;\r
+}\r
+\r
+\r
+/**\r
+ Build a Handoff Information Table HOB\r
+\r
+ This function initialize a HOB region from EfiMemoryBegin with length\r
+ EfiMemoryLength. And EfiFreeMemoryBottom and EfiFreeMemoryTop should\r
+ be inside the HOB region.\r
+\r
+ @param[in] EfiMemoryBegin Total memory start address\r
+ @param[in] EfiMemoryLength Total memory length reported in handoff HOB.\r
+ @param[in] EfiFreeMemoryBottom Free memory start address\r
+ @param[in] EfiFreeMemoryTop Free memory end address.\r
+\r
+ @return The pointer to the handoff HOB table.\r
+\r
+**/\r
+EFI_HOB_HANDOFF_INFO_TABLE*\r
+EFIAPI\r
+HobConstructor (\r
+ IN VOID *EfiMemoryBegin,\r
+ IN UINTN EfiMemoryLength,\r
+ IN VOID *EfiFreeMemoryBottom,\r
+ IN VOID *EfiFreeMemoryTop\r
+ )\r
+{\r
+ EFI_HOB_HANDOFF_INFO_TABLE *Hob;\r
+ EFI_HOB_GENERIC_HEADER *HobEnd;\r
+\r
+ Hob = EfiFreeMemoryBottom;\r
+ HobEnd = (EFI_HOB_GENERIC_HEADER *)(Hob+1);\r
+\r
+ Hob->Header.HobType = EFI_HOB_TYPE_HANDOFF;\r
+ Hob->Header.HobLength = sizeof(EFI_HOB_HANDOFF_INFO_TABLE);\r
+ Hob->Header.Reserved = 0;\r
+\r
+ HobEnd->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST;\r
+ HobEnd->HobLength = sizeof(EFI_HOB_GENERIC_HEADER);\r
+ HobEnd->Reserved = 0;\r
+\r
+ Hob->Version = EFI_HOB_HANDOFF_TABLE_VERSION;\r
+ Hob->BootMode = BOOT_WITH_FULL_CONFIGURATION;\r
+\r
+ Hob->EfiMemoryTop = (UINTN)EfiMemoryBegin + EfiMemoryLength;\r
+ Hob->EfiMemoryBottom = (UINTN)EfiMemoryBegin;\r
+ Hob->EfiFreeMemoryTop = (UINTN)EfiFreeMemoryTop;\r
+ Hob->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS)(UINTN)(HobEnd+1);\r
+ Hob->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS)(UINTN)HobEnd;\r
+\r
+ mHobList = Hob;\r
+ return Hob;\r
+}\r
+\r
+/**\r
+ Add a new HOB to the HOB List.\r
+\r
+ @param HobType Type of the new HOB.\r
+ @param HobLength Length of the new HOB to allocate.\r
+\r
+ @return NULL if there is no space to create a hob.\r
+ @return The address point to the new created hob.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+CreateHob (\r
+ IN UINT16 HobType,\r
+ IN UINT16 HobLength\r
+ )\r
+{\r
+ EFI_HOB_HANDOFF_INFO_TABLE *HandOffHob;\r
+ EFI_HOB_GENERIC_HEADER *HobEnd;\r
+ EFI_PHYSICAL_ADDRESS FreeMemory;\r
+ VOID *Hob;\r
+\r
+ HandOffHob = GetHobList ();\r
+\r
+ HobLength = (UINT16)((HobLength + 0x7) & (~0x7));\r
+\r
+ FreeMemory = HandOffHob->EfiFreeMemoryTop - HandOffHob->EfiFreeMemoryBottom;\r
+\r
+ if (FreeMemory < HobLength) {\r
+ return NULL;\r
+ }\r
+\r
+ Hob = (VOID*) (UINTN) HandOffHob->EfiEndOfHobList;\r
+ ((EFI_HOB_GENERIC_HEADER*) Hob)->HobType = HobType;\r
+ ((EFI_HOB_GENERIC_HEADER*) Hob)->HobLength = HobLength;\r
+ ((EFI_HOB_GENERIC_HEADER*) Hob)->Reserved = 0;\r
+\r
+ HobEnd = (EFI_HOB_GENERIC_HEADER*) ((UINTN)Hob + HobLength);\r
+ HandOffHob->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS) (UINTN) HobEnd;\r
+\r
+ HobEnd->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST;\r
+ HobEnd->HobLength = sizeof(EFI_HOB_GENERIC_HEADER);\r
+ HobEnd->Reserved = 0;\r
+ HobEnd++;\r
+ HandOffHob->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN) HobEnd;\r
+\r
+ return Hob;\r
+}\r
+\r
+/**\r
+ Builds a HOB that describes a chunk of system memory.\r
+\r
+ This function builds a HOB that describes a chunk of system memory.\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+\r
+ @param ResourceType The type of resource described by this HOB.\r
+ @param ResourceAttribute The resource attributes of the memory described by this HOB.\r
+ @param PhysicalStart The 64 bit physical address of memory described by this HOB.\r
+ @param NumberOfBytes The length of the memory described by this HOB in bytes.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BuildResourceDescriptorHob (\r
+ IN EFI_RESOURCE_TYPE ResourceType,\r
+ IN EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute,\r
+ IN EFI_PHYSICAL_ADDRESS PhysicalStart,\r
+ IN UINT64 NumberOfBytes\r
+ )\r
+{\r
+ EFI_HOB_RESOURCE_DESCRIPTOR *Hob;\r
+\r
+ Hob = CreateHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, sizeof (EFI_HOB_RESOURCE_DESCRIPTOR));\r
+ ASSERT(Hob != NULL);\r
+\r
+ Hob->ResourceType = ResourceType;\r
+ Hob->ResourceAttribute = ResourceAttribute;\r
+ Hob->PhysicalStart = PhysicalStart;\r
+ Hob->ResourceLength = NumberOfBytes;\r
+}\r
+\r
+VOID\r
+EFIAPI\r
+BuildFvHobs (\r
+ IN EFI_PHYSICAL_ADDRESS PhysicalStart,\r
+ IN UINT64 NumberOfBytes,\r
+ IN EFI_RESOURCE_ATTRIBUTE_TYPE *ResourceAttribute\r
+ )\r
+{\r
+\r
+ EFI_RESOURCE_ATTRIBUTE_TYPE Resource;\r
+\r
+ BuildFvHob (PhysicalStart, NumberOfBytes);\r
+\r
+ if (ResourceAttribute == NULL) {\r
+ Resource = (EFI_RESOURCE_ATTRIBUTE_PRESENT |\r
+ EFI_RESOURCE_ATTRIBUTE_INITIALIZED |\r
+ EFI_RESOURCE_ATTRIBUTE_TESTED |\r
+ EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE);\r
+ } else {\r
+ Resource = *ResourceAttribute;\r
+ }\r
+\r
+ BuildResourceDescriptorHob (EFI_RESOURCE_FIRMWARE_DEVICE, Resource, PhysicalStart, NumberOfBytes);\r
+}\r
+\r
+/**\r
+ Returns the next instance of a HOB type from the starting HOB.\r
+\r
+ This function searches the first instance of a HOB type from the starting HOB pointer.\r
+ If there does not exist such HOB type from the starting HOB pointer, it will return NULL.\r
+ In contrast with macro GET_NEXT_HOB(), this function does not skip the starting HOB pointer\r
+ unconditionally: it returns HobStart back if HobStart itself meets the requirement;\r
+ caller is required to use GET_NEXT_HOB() if it wishes to skip current HobStart.\r
+ If HobStart is NULL, then ASSERT().\r
+\r
+ @param Type The HOB type to return.\r
+ @param HobStart The starting HOB pointer to search from.\r
+\r
+ @return The next instance of a HOB type from the starting HOB.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetNextHob (\r
+ IN UINT16 Type,\r
+ IN CONST VOID *HobStart\r
+ )\r
+{\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+\r
+ ASSERT (HobStart != NULL);\r
+\r
+ Hob.Raw = (UINT8 *) HobStart;\r
+ //\r
+ // Parse the HOB list until end of list or matching type is found.\r
+ //\r
+ while (!END_OF_HOB_LIST (Hob)) {\r
+ if (Hob.Header->HobType == Type) {\r
+ return Hob.Raw;\r
+ }\r
+ Hob.Raw = GET_NEXT_HOB (Hob);\r
+ }\r
+ return NULL;\r
+}\r
+\r
+\r
+\r
+/**\r
+ Returns the first instance of a HOB type among the whole HOB list.\r
+\r
+ This function searches the first instance of a HOB type among the whole HOB list.\r
+ If there does not exist such HOB type in the HOB list, it will return NULL.\r
+\r
+ @param Type The HOB type to return.\r
+\r
+ @return The next instance of a HOB type from the starting HOB.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetFirstHob (\r
+ IN UINT16 Type\r
+ )\r
+{\r
+ VOID *HobList;\r
+\r
+ HobList = GetHobList ();\r
+ return GetNextHob (Type, HobList);\r
+}\r
+\r
+\r
+/**\r
+ This function searches the first instance of a HOB from the starting HOB pointer.\r
+ Such HOB should satisfy two conditions:\r
+ its HOB type is EFI_HOB_TYPE_GUID_EXTENSION and its GUID Name equals to the input Guid.\r
+ If there does not exist such HOB from the starting HOB pointer, it will return NULL.\r
+ Caller is required to apply GET_GUID_HOB_DATA () and GET_GUID_HOB_DATA_SIZE ()\r
+ to extract the data section and its size info respectively.\r
+ In contrast with macro GET_NEXT_HOB(), this function does not skip the starting HOB pointer\r
+ unconditionally: it returns HobStart back if HobStart itself meets the requirement;\r
+ caller is required to use GET_NEXT_HOB() if it wishes to skip current HobStart.\r
+ If Guid is NULL, then ASSERT().\r
+ If HobStart is NULL, then ASSERT().\r
+\r
+ @param Guid The GUID to match with in the HOB list.\r
+ @param HobStart A pointer to a Guid.\r
+\r
+ @return The next instance of the matched GUID HOB from the starting HOB.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetNextGuidHob (\r
+ IN CONST EFI_GUID *Guid,\r
+ IN CONST VOID *HobStart\r
+ ){\r
+ EFI_PEI_HOB_POINTERS GuidHob;\r
+\r
+ GuidHob.Raw = (UINT8 *) HobStart;\r
+ while ((GuidHob.Raw = GetNextHob (EFI_HOB_TYPE_GUID_EXTENSION, GuidHob.Raw)) != NULL) {\r
+ if (CompareGuid (Guid, &GuidHob.Guid->Name)) {\r
+ break;\r
+ }\r
+ GuidHob.Raw = GET_NEXT_HOB (GuidHob);\r
+ }\r
+ return GuidHob.Raw;\r
+}\r
+\r
+\r
+/**\r
+ This function searches the first instance of a HOB among the whole HOB list.\r
+ Such HOB should satisfy two conditions:\r
+ its HOB type is EFI_HOB_TYPE_GUID_EXTENSION and its GUID Name equals to the input Guid.\r
+ If there does not exist such HOB from the starting HOB pointer, it will return NULL.\r
+ Caller is required to apply GET_GUID_HOB_DATA () and GET_GUID_HOB_DATA_SIZE ()\r
+ to extract the data section and its size info respectively.\r
+ If Guid is NULL, then ASSERT().\r
+\r
+ @param Guid The GUID to match with in the HOB list.\r
+\r
+ @return The first instance of the matched GUID HOB among the whole HOB list.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+GetFirstGuidHob (\r
+ IN CONST EFI_GUID *Guid\r
+ )\r
+{\r
+ VOID *HobList;\r
+\r
+ HobList = GetHobList ();\r
+ return GetNextGuidHob (Guid, HobList);\r
+}\r
+\r
+\r
+\r
+\r
+/**\r
+ Builds a HOB for a loaded PE32 module.\r
+\r
+ This function builds a HOB for a loaded PE32 module.\r
+ It can only be invoked during PEI phase;\r
+ for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+ If ModuleName is NULL, then ASSERT().\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+\r
+ @param ModuleName The GUID File Name of the module.\r
+ @param MemoryAllocationModule The 64 bit physical address of the module.\r
+ @param ModuleLength The length of the module in bytes.\r
+ @param EntryPoint The 64 bit physical address of the module entry point.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BuildModuleHob (\r
+ IN CONST EFI_GUID *ModuleName,\r
+ IN EFI_PHYSICAL_ADDRESS MemoryAllocationModule,\r
+ IN UINT64 ModuleLength,\r
+ IN EFI_PHYSICAL_ADDRESS EntryPoint\r
+ )\r
+{\r
+ EFI_HOB_MEMORY_ALLOCATION_MODULE *Hob;\r
+\r
+ ASSERT (((MemoryAllocationModule & (EFI_PAGE_SIZE - 1)) == 0) &&\r
+ ((ModuleLength & (EFI_PAGE_SIZE - 1)) == 0));\r
+\r
+ Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION_MODULE));\r
+\r
+ CopyGuid (&(Hob->MemoryAllocationHeader.Name), &gEfiHobMemoryAllocModuleGuid);\r
+ Hob->MemoryAllocationHeader.MemoryBaseAddress = MemoryAllocationModule;\r
+ Hob->MemoryAllocationHeader.MemoryLength = ModuleLength;\r
+ Hob->MemoryAllocationHeader.MemoryType = EfiBootServicesCode;\r
+\r
+ //\r
+ // Zero the reserved space to match HOB spec\r
+ //\r
+ ZeroMem (Hob->MemoryAllocationHeader.Reserved, sizeof (Hob->MemoryAllocationHeader.Reserved));\r
+\r
+ CopyGuid (&Hob->ModuleName, ModuleName);\r
+ Hob->EntryPoint = EntryPoint;\r
+}\r
+\r
+/**\r
+ Builds a GUID HOB with a certain data length.\r
+\r
+ This function builds a customized HOB tagged with a GUID for identification\r
+ and returns the start address of GUID HOB data so that caller can fill the customized data.\r
+ The HOB Header and Name field is already stripped.\r
+ It can only be invoked during PEI phase;\r
+ for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+ If Guid is NULL, then ASSERT().\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+ If DataLength >= (0x10000 - sizeof (EFI_HOB_GUID_TYPE)), then ASSERT().\r
+\r
+ @param Guid The GUID to tag the customized HOB.\r
+ @param DataLength The size of the data payload for the GUID HOB.\r
+\r
+ @return The start address of GUID HOB data.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+BuildGuidHob (\r
+ IN CONST EFI_GUID *Guid,\r
+ IN UINTN DataLength\r
+ )\r
+{\r
+ EFI_HOB_GUID_TYPE *Hob;\r
+\r
+ //\r
+ // Make sure that data length is not too long.\r
+ //\r
+ ASSERT (DataLength <= (0xffff - sizeof (EFI_HOB_GUID_TYPE)));\r
+\r
+ Hob = CreateHob (EFI_HOB_TYPE_GUID_EXTENSION, (UINT16) (sizeof (EFI_HOB_GUID_TYPE) + DataLength));\r
+ CopyGuid (&Hob->Name, Guid);\r
+ return Hob + 1;\r
+}\r
+\r
+\r
+/**\r
+ Copies a data buffer to a newly-built HOB.\r
+\r
+ This function builds a customized HOB tagged with a GUID for identification,\r
+ copies the input data to the HOB data field and returns the start address of the GUID HOB data.\r
+ The HOB Header and Name field is already stripped.\r
+ It can only be invoked during PEI phase;\r
+ for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+ If Guid is NULL, then ASSERT().\r
+ If Data is NULL and DataLength > 0, then ASSERT().\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+ If DataLength >= (0x10000 - sizeof (EFI_HOB_GUID_TYPE)), then ASSERT().\r
+\r
+ @param Guid The GUID to tag the customized HOB.\r
+ @param Data The data to be copied into the data field of the GUID HOB.\r
+ @param DataLength The size of the data payload for the GUID HOB.\r
+\r
+ @return The start address of GUID HOB data.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+BuildGuidDataHob (\r
+ IN CONST EFI_GUID *Guid,\r
+ IN VOID *Data,\r
+ IN UINTN DataLength\r
+ )\r
+{\r
+ VOID *HobData;\r
+\r
+ ASSERT (Data != NULL || DataLength == 0);\r
+\r
+ HobData = BuildGuidHob (Guid, DataLength);\r
+\r
+ return CopyMem (HobData, Data, DataLength);\r
+}\r
+\r
+\r
+/**\r
+ Builds a Firmware Volume HOB.\r
+\r
+ This function builds a Firmware Volume HOB.\r
+ It can only be invoked during PEI phase;\r
+ for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+\r
+ @param BaseAddress The base address of the Firmware Volume.\r
+ @param Length The size of the Firmware Volume in bytes.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BuildFvHob (\r
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
+ IN UINT64 Length\r
+ )\r
+{\r
+ EFI_HOB_FIRMWARE_VOLUME *Hob;\r
+\r
+ Hob = CreateHob (EFI_HOB_TYPE_FV, sizeof (EFI_HOB_FIRMWARE_VOLUME));\r
+\r
+ Hob->BaseAddress = BaseAddress;\r
+ Hob->Length = Length;\r
+}\r
+\r
+\r
+/**\r
+ Builds a EFI_HOB_TYPE_FV2 HOB.\r
+\r
+ This function builds a EFI_HOB_TYPE_FV2 HOB.\r
+ It can only be invoked during PEI phase;\r
+ for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+\r
+ @param BaseAddress The base address of the Firmware Volume.\r
+ @param Length The size of the Firmware Volume in bytes.\r
+ @param FvName The name of the Firmware Volume.\r
+ @param FileName The name of the file.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BuildFv2Hob (\r
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
+ IN UINT64 Length,\r
+ IN CONST EFI_GUID *FvName,\r
+ IN CONST EFI_GUID *FileName\r
+ )\r
+{\r
+ EFI_HOB_FIRMWARE_VOLUME2 *Hob;\r
+\r
+ Hob = CreateHob (EFI_HOB_TYPE_FV2, sizeof (EFI_HOB_FIRMWARE_VOLUME2));\r
+\r
+ Hob->BaseAddress = BaseAddress;\r
+ Hob->Length = Length;\r
+ CopyGuid (&Hob->FvName, FvName);\r
+ CopyGuid (&Hob->FileName, FileName);\r
+}\r
+\r
+/**\r
+ Builds a EFI_HOB_TYPE_FV3 HOB.\r
+\r
+ This function builds a EFI_HOB_TYPE_FV3 HOB.\r
+ It can only be invoked during PEI phase;\r
+ for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+\r
+ @param BaseAddress The base address of the Firmware Volume.\r
+ @param Length The size of the Firmware Volume in bytes.\r
+ @param AuthenticationStatus The authentication status.\r
+ @param ExtractedFv TRUE if the FV was extracted as a file within\r
+ another firmware volume. FALSE otherwise.\r
+ @param FvName The name of the Firmware Volume.\r
+ Valid only if IsExtractedFv is TRUE.\r
+ @param FileName The name of the file.\r
+ Valid only if IsExtractedFv is TRUE.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BuildFv3Hob (\r
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
+ IN UINT64 Length,\r
+ IN UINT32 AuthenticationStatus,\r
+ IN BOOLEAN ExtractedFv,\r
+ IN CONST EFI_GUID *FvName, OPTIONAL\r
+ IN CONST EFI_GUID *FileName OPTIONAL\r
+ )\r
+{\r
+ EFI_HOB_FIRMWARE_VOLUME3 *Hob;\r
+\r
+ Hob = CreateHob (EFI_HOB_TYPE_FV3, sizeof (EFI_HOB_FIRMWARE_VOLUME3));\r
+\r
+ Hob->BaseAddress = BaseAddress;\r
+ Hob->Length = Length;\r
+ Hob->AuthenticationStatus = AuthenticationStatus;\r
+ Hob->ExtractedFv = ExtractedFv;\r
+ if (ExtractedFv) {\r
+ CopyGuid (&Hob->FvName, FvName);\r
+ CopyGuid (&Hob->FileName, FileName);\r
+ }\r
+}\r
+\r
+\r
+/**\r
+ Builds a HOB for the CPU.\r
+\r
+ This function builds a HOB for the CPU.\r
+ It can only be invoked during PEI phase;\r
+ for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+\r
+ @param SizeOfMemorySpace The maximum physical memory addressability of the processor.\r
+ @param SizeOfIoSpace The maximum physical I/O addressability of the processor.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BuildCpuHob (\r
+ IN UINT8 SizeOfMemorySpace,\r
+ IN UINT8 SizeOfIoSpace\r
+ )\r
+{\r
+ EFI_HOB_CPU *Hob;\r
+\r
+ Hob = CreateHob (EFI_HOB_TYPE_CPU, sizeof (EFI_HOB_CPU));\r
+\r
+ Hob->SizeOfMemorySpace = SizeOfMemorySpace;\r
+ Hob->SizeOfIoSpace = SizeOfIoSpace;\r
+\r
+ //\r
+ // Zero the reserved space to match HOB spec\r
+ //\r
+ ZeroMem (Hob->Reserved, sizeof (Hob->Reserved));\r
+}\r
+\r
+\r
+/**\r
+ Builds a HOB for the Stack.\r
+\r
+ This function builds a HOB for the stack.\r
+ It can only be invoked during PEI phase;\r
+ for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+\r
+ @param BaseAddress The 64 bit physical address of the Stack.\r
+ @param Length The length of the stack in bytes.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BuildStackHob (\r
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
+ IN UINT64 Length\r
+ )\r
+{\r
+ EFI_HOB_MEMORY_ALLOCATION_STACK *Hob;\r
+\r
+ ASSERT (((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&\r
+ ((Length & (EFI_PAGE_SIZE - 1)) == 0));\r
+\r
+ Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION_STACK));\r
+\r
+ CopyGuid (&(Hob->AllocDescriptor.Name), &gEfiHobMemoryAllocStackGuid);\r
+ Hob->AllocDescriptor.MemoryBaseAddress = BaseAddress;\r
+ Hob->AllocDescriptor.MemoryLength = Length;\r
+ Hob->AllocDescriptor.MemoryType = EfiBootServicesData;\r
+\r
+ //\r
+ // Zero the reserved space to match HOB spec\r
+ //\r
+ ZeroMem (Hob->AllocDescriptor.Reserved, sizeof (Hob->AllocDescriptor.Reserved));\r
+}\r
+\r
+\r
+/**\r
+ Update the Stack Hob if the stack has been moved\r
+\r
+ @param BaseAddress The 64 bit physical address of the Stack.\r
+ @param Length The length of the stack in bytes.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+UpdateStackHob (\r
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
+ IN UINT64 Length\r
+ )\r
+{\r
+ EFI_PEI_HOB_POINTERS Hob;\r
+\r
+ Hob.Raw = GetHobList ();\r
+ while ((Hob.Raw = GetNextHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, Hob.Raw)) != NULL) {\r
+ if (CompareGuid (&gEfiHobMemoryAllocStackGuid, &(Hob.MemoryAllocationStack->AllocDescriptor.Name))) {\r
+ //\r
+ // Build a new memory allocation HOB with old stack info with EfiConventionalMemory type\r
+ // to be reclaimed by DXE core.\r
+ //\r
+ BuildMemoryAllocationHob (\r
+ Hob.MemoryAllocationStack->AllocDescriptor.MemoryBaseAddress,\r
+ Hob.MemoryAllocationStack->AllocDescriptor.MemoryLength,\r
+ EfiConventionalMemory\r
+ );\r
+ //\r
+ // Update the BSP Stack Hob to reflect the new stack info.\r
+ //\r
+ Hob.MemoryAllocationStack->AllocDescriptor.MemoryBaseAddress = BaseAddress;\r
+ Hob.MemoryAllocationStack->AllocDescriptor.MemoryLength = Length;\r
+ break;\r
+ }\r
+ Hob.Raw = GET_NEXT_HOB (Hob);\r
+ }\r
+}\r
+\r
+\r
+\r
+/**\r
+ Builds a HOB for the memory allocation.\r
+\r
+ This function builds a HOB for the memory allocation.\r
+ It can only be invoked during PEI phase;\r
+ for DXE phase, it will ASSERT() since PEI HOB is read-only for DXE phase.\r
+ If there is no additional space for HOB creation, then ASSERT().\r
+\r
+ @param BaseAddress The 64 bit physical address of the memory.\r
+ @param Length The length of the memory allocation in bytes.\r
+ @param MemoryType Type of memory allocated by this HOB.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+BuildMemoryAllocationHob (\r
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,\r
+ IN UINT64 Length,\r
+ IN EFI_MEMORY_TYPE MemoryType\r
+ )\r
+{\r
+ EFI_HOB_MEMORY_ALLOCATION *Hob;\r
+\r
+ ASSERT (((BaseAddress & (EFI_PAGE_SIZE - 1)) == 0) &&\r
+ ((Length & (EFI_PAGE_SIZE - 1)) == 0));\r
+\r
+ Hob = CreateHob (EFI_HOB_TYPE_MEMORY_ALLOCATION, sizeof (EFI_HOB_MEMORY_ALLOCATION));\r
+\r
+ ZeroMem (&(Hob->AllocDescriptor.Name), sizeof (EFI_GUID));\r
+ Hob->AllocDescriptor.MemoryBaseAddress = BaseAddress;\r
+ Hob->AllocDescriptor.MemoryLength = Length;\r
+ Hob->AllocDescriptor.MemoryType = MemoryType;\r
+ //\r
+ // Zero the reserved space to match HOB spec\r
+ //\r
+ ZeroMem (Hob->AllocDescriptor.Reserved, sizeof (Hob->AllocDescriptor.Reserved));\r
+}\r
+\r
--- /dev/null
+#/** @file\r
+#\r
+# Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR>\r
+# Copyright (c) 2008 - 2010, Apple Inc. All rights reserved.<BR>\r
+#\r
+# SPDX-License-Identifier: BSD-2-Clause-Patent\r
+#\r
+#\r
+#**/\r
+\r
+[Defines]\r
+ INF_VERSION = 0x00010005\r
+ BASE_NAME = HobLib\r
+ FILE_GUID = AD6B4D55-8DBE-48C8-88E3-CFDBB6E9D193\r
+ MODULE_TYPE = BASE\r
+ VERSION_STRING = 1.0\r
+ LIBRARY_CLASS = HobLib\r
+\r
+#\r
+# VALID_ARCHITECTURES = IA32 X64 EBC\r
+#\r
+\r
+[Sources.common]\r
+ Hob.c\r
+\r
+[Packages]\r
+ MdePkg/MdePkg.dec\r
+ MdeModulePkg/MdeModulePkg.dec\r
+ UefiPayloadPkg/UefiPayloadPkg.dec\r
+\r
+[LibraryClasses]\r
+ BaseLib\r
+ BaseMemoryLib\r
+ DebugLib\r
+\r
+[Guids]\r
+ gEfiHobMemoryAllocModuleGuid\r
+ gEfiHobMemoryAllocStackGuid\r
+\r
\r
DEFINE SOURCE_DEBUG_ENABLE = FALSE\r
DEFINE PS2_KEYBOARD_ENABLE = FALSE\r
+ DEFINE UNIVERSAL_PAYLOAD = FALSE\r
\r
#\r
# SBL: UEFI payload for Slim Bootloader\r
PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf\r
CacheMaintenanceLib|MdePkg/Library/BaseCacheMaintenanceLib/BaseCacheMaintenanceLib.inf\r
SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf\r
+ DxeHobListLib|UefiPayloadPkg/Library/DxeHobListLib/DxeHobListLib.inf\r
+\r
+!if $(UNIVERSAL_PAYLOAD) == TRUE\r
+ HobLib|UefiPayloadPkg/Library/DxeHobLib/DxeHobLib.inf\r
+!else\r
+ HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf\r
+!endif\r
\r
#\r
# UEFI & PI\r
VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/VariablePolicyHelperLib.inf\r
\r
[LibraryClasses.common.SEC]\r
- HobLib|UefiPayloadPkg/Library/HobLib/HobLib.inf\r
+ HobLib|UefiPayloadPkg/Library/PayloadEntryHobLib/HobLib.inf\r
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf\r
+ DxeHobListLib|UefiPayloadPkg/Library/DxeHobListLibNull/DxeHobListLibNull.inf\r
\r
[LibraryClasses.common.DXE_CORE]\r
+ DxeHobListLib|UefiPayloadPkg/Library/DxeHobListLibNull/DxeHobListLibNull.inf\r
PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf\r
HobLib|MdePkg/Library/DxeCoreHobLib/DxeCoreHobLib.inf\r
MemoryAllocationLib|MdeModulePkg/Library/DxeCoreMemoryAllocationLib/DxeCoreMemoryAllocationLib.inf\r
\r
[LibraryClasses.common.DXE_DRIVER]\r
PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf\r
- HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf\r
MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf\r
ExtractGuidedSectionLib|MdePkg/Library/DxeExtractGuidedSectionLib/DxeExtractGuidedSectionLib.inf\r
ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf\r
\r
[LibraryClasses.common.DXE_RUNTIME_DRIVER]\r
PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf\r
- HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf\r
MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf\r
ReportStatusCodeLib|MdeModulePkg/Library/RuntimeDxeReportStatusCodeLib/RuntimeDxeReportStatusCodeLib.inf\r
VariablePolicyLib|MdeModulePkg/Library/VariablePolicyLib/VariablePolicyLibRuntimeDxe.inf\r
PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf\r
MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf\r
ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf\r
- HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf\r
\r
################################################################################\r
#\r