summaryrefslogtreecommitdiff
path: root/EDK/Foundation/Library/Pei/Hob/PeiHobLib.c
diff options
context:
space:
mode:
Diffstat (limited to 'EDK/Foundation/Library/Pei/Hob/PeiHobLib.c')
-rw-r--r--EDK/Foundation/Library/Pei/Hob/PeiHobLib.c721
1 files changed, 721 insertions, 0 deletions
diff --git a/EDK/Foundation/Library/Pei/Hob/PeiHobLib.c b/EDK/Foundation/Library/Pei/Hob/PeiHobLib.c
new file mode 100644
index 0000000..15421df
--- /dev/null
+++ b/EDK/Foundation/Library/Pei/Hob/PeiHobLib.c
@@ -0,0 +1,721 @@
+
+/*++
+
+Copyright (c) 2004 - 2007, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+MemoryAllocationModule Name:
+
+ Peihoblib.c
+
+Abstract:
+
+ PEI Library Functions
+
+--*/
+
+#include "Tiano.h"
+#include "PeiHob.h"
+#include "peihoblib.h"
+#include "peilib.h"
+#include EFI_GUID_DEFINITION(MemoryAllocationHob)
+
+
+EFI_PEI_HOB_POINTERS
+BuildHobEndOfHobList (
+ IN VOID *HobStart
+ )
+/*++
+
+Routine Description:
+
+ Builds an end of HOB list HOB
+
+Arguments:
+
+ HobStart - The HOB to build
+
+Returns:
+
+ A pointer to the next HOB
+
+--*/
+{
+ EFI_PEI_HOB_POINTERS Hob;
+
+ Hob.Raw = HobStart;
+
+ Hob.Header->HobType = EFI_HOB_TYPE_END_OF_HOB_LIST;
+ Hob.Header->HobLength = sizeof(EFI_HOB_GENERIC_HEADER);
+
+ Hob.Header++;
+ return Hob;
+}
+
+EFI_STATUS
+BuildHobHandoffInfoTable (
+ IN VOID *HobStart,
+ IN UINT16 Version,
+ IN EFI_BOOT_MODE BootMode,
+ IN EFI_PHYSICAL_ADDRESS EfiMemoryTop,
+ IN EFI_PHYSICAL_ADDRESS EfiMemoryBottom,
+ IN EFI_PHYSICAL_ADDRESS EfiFreeMemoryTop,
+ IN EFI_PHYSICAL_ADDRESS EfiFreeMemoryBottom
+ )
+/*++
+
+Routine Description:
+
+ Builds a HandoffInformationTable Information Table HOB
+
+Arguments:
+
+ HobStart - Start pointer of hob list
+ Version - The version number pertaining to the PHIT HOB definition.
+ BootMode - The system boot mode as determined during the HOB producer phase.
+ EfiMemoryTop - The highest address location of memory that is allocated for use by the HOB
+ producer phase.
+ EfiMemoryBottom - The lowest address location of memory that is allocated for use by the HOB
+ producer phase.
+ EfiFreeMemoryTop - The highest address location of free memory that is currently available for use
+ by the HOB producer phase.
+ EfiFreeMemoryBottom - The lowest address location of free memory that is available for
+ use by the HOB producer phase.
+
+Returns:
+
+ EFI_SUCCESS
+
+--*/
+{
+ EFI_PEI_HOB_POINTERS HandOffHob;
+ EFI_PEI_HOB_POINTERS Hob;
+ EFI_PEI_HOB_POINTERS HobEnd;
+
+
+ HandOffHob.Raw = HobStart;
+ Hob.Raw = HobStart;
+ Hob.Header->HobType = EFI_HOB_TYPE_HANDOFF;
+ Hob.Header->HobLength = sizeof(EFI_HOB_HANDOFF_INFO_TABLE);
+
+ Hob.HandoffInformationTable->Version = Version;
+ Hob.HandoffInformationTable->BootMode = BootMode;
+
+ Hob.HandoffInformationTable->EfiMemoryTop = EfiMemoryTop;
+ Hob.HandoffInformationTable->EfiMemoryBottom = EfiMemoryBottom;
+ Hob.HandoffInformationTable->EfiFreeMemoryTop = EfiFreeMemoryTop;
+ Hob.HandoffInformationTable->EfiFreeMemoryBottom = EfiFreeMemoryBottom;
+
+ HobEnd.Raw = (VOID*)(Hob.HandoffInformationTable + 1);
+ Hob.HandoffInformationTable->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS) (UINTN) HobEnd.Raw;
+ Hob = BuildHobEndOfHobList (HobEnd.Raw);
+ HandOffHob.HandoffInformationTable->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN) Hob.Raw;
+ return EFI_SUCCESS;
+}
+
+
+
+EFI_STATUS
+BuildHobModule (
+ IN VOID *HobStart,
+ IN EFI_GUID *ModuleName,
+ IN EFI_PHYSICAL_ADDRESS MemoryAllocationModule,
+ IN UINT64 ModuleLength,
+ IN EFI_PHYSICAL_ADDRESS EntryPoint
+ )
+/*++
+
+Routine Description:
+
+ Builds a HOB for a loaded PE32 module
+
+Arguments:
+
+ HobStart - Start pointer of hob list
+
+ ModuleName - The GUID File Name of the HON from the Firmware Volume
+
+ MemoryAllocationModule - The 64 bit physical address of the module
+
+ ModuleLength - The length of the module in bytes
+
+ EntryPoint - The 64 bit physical address of the entry point to the module
+
+Returns:
+
+ EFI_SUCCESS
+ EFI_NOT_AVAILABLE_YET
+
+--*/
+{
+ EFI_PEI_HOB_POINTERS Hob;
+ EFI_PEI_HOB_POINTERS HandOffHob;
+
+ HandOffHob.Raw = HobStart;
+ Hob.Raw = (VOID*)(UINTN)(HandOffHob.HandoffInformationTable->EfiEndOfHobList);
+
+ Hob.Header->HobType = EFI_HOB_TYPE_MEMORY_ALLOCATION;
+ Hob.Header->HobLength = sizeof(EFI_HOB_MEMORY_ALLOCATION_MODULE);
+
+ CopyMem(&(Hob.MemoryAllocationModule->ModuleName), ModuleName, sizeof(EFI_GUID));
+ CopyMem(&(Hob.MemoryAllocationModule->MemoryAllocationHeader.Name), &gEfiHobMemeryAllocModuleGuid, sizeof(EFI_GUID));
+ Hob.MemoryAllocationModule->MemoryAllocationHeader.MemoryBaseAddress = MemoryAllocationModule;
+ Hob.MemoryAllocationModule->MemoryAllocationHeader.MemoryLength = ModuleLength;
+ Hob.MemoryAllocationModule->MemoryAllocationHeader.MemoryType = EfiConventionalMemory;
+
+ Hob.MemoryAllocationModule->EntryPoint = EntryPoint;
+
+ Hob.MemoryAllocationModule++;
+ HandOffHob.HandoffInformationTable->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS) (UINTN) Hob.Raw;
+ Hob = BuildHobEndOfHobList(Hob.Raw);
+ HandOffHob.HandoffInformationTable->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN) Hob.Raw;
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+BuildHobResourceDescriptor (
+ IN VOID * HobStart,
+ IN EFI_RESOURCE_TYPE ResourceType,
+ IN EFI_RESOURCE_ATTRIBUTE_TYPE ResourceAttribute,
+ IN EFI_PHYSICAL_ADDRESS PhysicalStart,
+ IN UINT64 NumberOfBytes
+ )
+/*++
+
+Routine Description:
+
+ Builds a HOB that describes a chunck of system memory
+
+Arguments:
+
+ HobStart - Start pointer of hob list
+
+ ResourceType - The type of memory described by this HOB
+
+ ResourceAttribute - The memory attributes of the memory described by this HOB
+
+ PhysicalStart - The 64 bit physical address of memory described by this HOB
+
+ NumberOfBytes - The length of the memoty described by this HOB in bytes
+
+Returns:
+
+ EFI_SUCCESS
+ EFI_NOT_AVAILABLE_YET
+
+--*/
+{
+ EFI_PEI_HOB_POINTERS Hob;
+ EFI_PEI_HOB_POINTERS HandOffHob;
+
+ HandOffHob.Raw = HobStart;
+ Hob.Raw = (VOID *)(UINTN)(HandOffHob.HandoffInformationTable->EfiEndOfHobList);
+
+ Hob.Header->HobType = EFI_HOB_TYPE_RESOURCE_DESCRIPTOR;
+ Hob.Header->HobLength = sizeof(EFI_HOB_RESOURCE_DESCRIPTOR);
+
+ Hob.ResourceDescriptor->ResourceType = ResourceType;
+ Hob.ResourceDescriptor->ResourceAttribute = ResourceAttribute;
+ Hob.ResourceDescriptor->PhysicalStart = PhysicalStart;
+ Hob.ResourceDescriptor->ResourceLength = NumberOfBytes;
+
+ Hob.ResourceDescriptor++;
+ HandOffHob.HandoffInformationTable->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS) (UINTN) Hob.Raw;
+ Hob = BuildHobEndOfHobList(Hob.Raw);
+ HandOffHob.HandoffInformationTable->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN) Hob.Raw;
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+BuildHobGuidType (
+ IN VOID *HobStart,
+ IN EFI_GUID *Guid,
+ IN VOID *Buffer,
+ IN UINTN BufferSize
+ )
+/*++
+
+Routine Description:
+
+ Builds a custom HOB that is tagged with a GUID for identification
+
+Arguments:
+
+ HobStart - Start pointer of hob list
+
+ Guid - The GUID of the custome HOB type
+
+ Buffer - A pointer to the data for the custom HOB type
+
+ BufferSize - The size in byte of BufferSize
+
+Returns:
+
+ EFI_SUCCESS
+ EFI_NOT_AVAILABLE_YET
+
+--*/
+{
+ EFI_PEI_HOB_POINTERS Hob;
+ EFI_PEI_HOB_POINTERS HandOffHob;
+ UINTN Length;
+
+
+ HandOffHob.Raw = HobStart;
+ Hob.Raw = (VOID *)(UINTN)HandOffHob.HandoffInformationTable->EfiEndOfHobList;
+
+
+ Hob.Header->HobType = EFI_HOB_TYPE_GUID_EXTENSION;
+ Length = sizeof(EFI_HOB_GUID_TYPE) + BufferSize;
+ Hob.Header->HobLength = (UINT16)Length;
+ CopyMem(&Hob.Guid->Name, Guid, sizeof(EFI_GUID));
+ CopyMem(Hob.Raw + sizeof(EFI_HOB_GUID_TYPE), Buffer, BufferSize);
+ Hob.Raw += Length;
+
+ HandOffHob.HandoffInformationTable->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS) (UINTN) Hob.Raw;
+ Hob = BuildHobEndOfHobList(Hob.Raw);
+ HandOffHob.HandoffInformationTable->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN) Hob.Raw;
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+BuildHobFvDescriptor (
+ IN VOID *HobStart,
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,
+ IN UINT64 Length
+ )
+/*++
+
+Routine Description:
+
+ Builds a Firmware Volume HOB
+
+Arguments:
+
+ HobStart - Start pointer of hob list
+
+ BaseAddress - The base address of the Firmware Volume
+
+ Length - The size of the Firmware Volume in bytes
+
+Returns:
+
+ EFI_SUCCESS
+ EFI_NOT_AVAILABLE_YET
+
+--*/
+{
+ EFI_PEI_HOB_POINTERS Hob;
+ EFI_PEI_HOB_POINTERS HandOffHob;
+
+ HandOffHob.Raw = HobStart;
+ Hob.Raw = (VOID*)(UINTN)(HandOffHob.HandoffInformationTable->EfiEndOfHobList);
+
+ Hob.Header->HobType = EFI_HOB_TYPE_FV;
+ Hob.Header->HobLength = sizeof(EFI_HOB_FIRMWARE_VOLUME);
+
+ Hob.FirmwareVolume->BaseAddress = BaseAddress;
+ Hob.FirmwareVolume->Length = Length;
+
+ Hob.FirmwareVolume++;
+
+ HandOffHob.HandoffInformationTable->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS) (UINTN) Hob.Raw;
+ Hob = BuildHobEndOfHobList(Hob.Raw);
+ HandOffHob.HandoffInformationTable->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN) Hob.Raw;
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+BuildHobCpu (
+ IN VOID *HobStart,
+ IN UINT8 SizeOfMemorySpace,
+ IN UINT8 SizeOfIoSpace
+ )
+/*++
+
+Routine Description:
+
+ Builds a HOB for the CPU
+
+Arguments:
+
+ HobStart - Start pointer of hob list
+
+ SizeOfMemorySpace - Identifies the maximum
+ physical memory addressibility of the processor.
+
+ SizeOfIoSpace - Identifies the maximum physical I/O addressibility
+ of the processor.
+
+Returns:
+
+ EFI_SUCCESS
+ EFI_NOT_AVAILABLE_YET
+
+--*/
+{
+ EFI_PEI_HOB_POINTERS Hob;
+ EFI_PEI_HOB_POINTERS HandOffHob;
+
+ HandOffHob.Raw = HobStart;
+ Hob.Raw = (VOID*)(UINTN)HandOffHob.HandoffInformationTable->EfiEndOfHobList;
+
+ Hob.Header->HobType = EFI_HOB_TYPE_CPU;
+ Hob.Header->HobLength = sizeof(EFI_HOB_CPU);
+
+ Hob.Cpu->SizeOfMemorySpace = SizeOfMemorySpace;
+ Hob.Cpu->SizeOfIoSpace = SizeOfIoSpace;
+
+ Hob.Cpu++;
+ HandOffHob.HandoffInformationTable->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS) (UINTN) Hob.Raw;
+ Hob = BuildHobEndOfHobList(Hob.Raw);
+ HandOffHob.HandoffInformationTable->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN) Hob.Raw;
+ return EFI_SUCCESS;
+}
+
+
+
+EFI_STATUS
+BuildHobStack (
+ IN VOID *HobStart,
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,
+ IN UINT64 Length
+ )
+/*++
+
+Routine Description:
+
+ Builds a HOB for the Stack
+
+Arguments:
+
+ HobStart - Start pointer of hob list
+
+ BaseAddress - The 64 bit physical address of the Stack
+
+ Length - The length of the stack in bytes
+
+Returns:
+
+ EFI_SUCCESS
+ EFI_NOT_AVAILABLE_YET
+
+--*/
+{
+ EFI_PEI_HOB_POINTERS Hob;
+ EFI_PEI_HOB_POINTERS HandOffHob;
+
+ HandOffHob.Raw = HobStart;
+ Hob.Raw = (VOID*)(UINTN)HandOffHob.HandoffInformationTable->EfiEndOfHobList;
+
+ Hob.Header->HobType = EFI_HOB_TYPE_MEMORY_ALLOCATION;
+ Hob.Header->HobLength = sizeof(EFI_HOB_MEMORY_ALLOCATION_STACK);
+
+ CopyMem(&(Hob.MemoryAllocationStack->AllocDescriptor.Name), &gEfiHobMemeryAllocStackGuid, sizeof(EFI_GUID));
+ (Hob.MemoryAllocationStack->AllocDescriptor).MemoryBaseAddress = BaseAddress;
+ (Hob.MemoryAllocationStack->AllocDescriptor).MemoryLength = Length;
+ (Hob.MemoryAllocationStack->AllocDescriptor).MemoryType = EfiBootServicesData;
+
+ Hob.MemoryAllocationStack++;
+ HandOffHob.HandoffInformationTable->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS) (UINTN) Hob.Raw;
+ Hob = BuildHobEndOfHobList(Hob.Raw);
+ HandOffHob.HandoffInformationTable->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN) Hob.Raw;
+ return EFI_SUCCESS;
+}
+
+
+
+EFI_STATUS
+BuildHobBspStore (
+ IN VOID *HobStart,
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,
+ IN UINT64 Length,
+ IN EFI_MEMORY_TYPE MemoryType
+ )
+/*++
+
+Routine Description:
+
+ Builds a HOB for the bsp store
+
+Arguments:
+
+ HobStart - Start pointer of hob list
+
+ BaseAddress - The 64 bit physical address of bsp store
+
+ Length - The length of the bsp store in bytes
+
+ MemoryType - Memory type of the bsp store
+
+Returns:
+
+ EFI_SUCCESS
+ EFI_NOT_AVAILABLE_YET
+
+--*/
+{
+ EFI_PEI_HOB_POINTERS Hob;
+ EFI_PEI_HOB_POINTERS HandOffHob;
+
+ HandOffHob.Raw = HobStart;
+ Hob.Raw = (VOID *)(UINTN)HandOffHob.HandoffInformationTable->EfiEndOfHobList;
+ Hob.Header->HobType = EFI_HOB_TYPE_MEMORY_ALLOCATION;
+ Hob.Header->HobLength = sizeof(EFI_HOB_MEMORY_ALLOCATION_BSP_STORE);
+
+ (Hob.MemoryAllocationBspStore->AllocDescriptor).MemoryBaseAddress = BaseAddress;
+ (Hob.MemoryAllocationBspStore->AllocDescriptor).MemoryLength = Length;
+ (Hob.MemoryAllocationBspStore->AllocDescriptor).MemoryType = MemoryType;
+ CopyMem(&(Hob.MemoryAllocationBspStore->AllocDescriptor).Name, &gEfiHobMemeryAllocBspStoreGuid, sizeof(EFI_GUID));
+ Hob.MemoryAllocationBspStore++;
+
+ HandOffHob.HandoffInformationTable->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS) (UINTN) Hob.Raw;
+ Hob = BuildHobEndOfHobList(Hob.Raw);
+ HandOffHob.HandoffInformationTable->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN) Hob.Raw;
+ return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+BuildMemoryAllocationHob (
+ IN VOID *HobStart,
+ IN EFI_PHYSICAL_ADDRESS BaseAddress,
+ IN UINT64 Length,
+ IN EFI_GUID *Name,
+ IN EFI_MEMORY_TYPE MemoryType
+ )
+/*++
+
+Routine Description:
+
+ Builds a HOB for memory allocation
+
+Arguments:
+
+ HobStart - Start pointer of hob list
+
+ BaseAddress - The base address of memory allocated by this HOB.
+
+ Length - The length in bytes of memory allocated by this HOB.
+
+ Name - A GUID that defines the memory allocation region¡¯s type and purpose,
+ as well as other fields within the memory allocation HOB.
+
+ MemoryType - Defines the type of memory allocated by this HOB.
+
+Returns:
+
+ EFI_SUCCESS
+ EFI_NOT_AVAILABLE_YET
+
+--*/
+{
+ EFI_PEI_HOB_POINTERS Hob;
+ EFI_PEI_HOB_POINTERS HandOffHob;
+
+
+ HandOffHob.Raw = HobStart;
+ Hob.Raw = (VOID*)(UINTN)HandOffHob.HandoffInformationTable->EfiEndOfHobList;
+
+ Hob.Header->HobType = EFI_HOB_TYPE_MEMORY_ALLOCATION;
+ Hob.Header->HobLength = sizeof(EFI_HOB_MEMORY_ALLOCATION);
+
+ if (Name != NULL) {
+ CopyMem(&(Hob.MemoryAllocation->AllocDescriptor.Name), &Name, sizeof(EFI_GUID));
+ } else {
+ ZeroMem(&Hob.MemoryAllocation->AllocDescriptor.Name, sizeof(EFI_GUID));
+ }
+
+ (Hob.MemoryAllocation->AllocDescriptor).MemoryBaseAddress = BaseAddress;
+ (Hob.MemoryAllocation->AllocDescriptor).MemoryLength = Length;
+ (Hob.MemoryAllocation->AllocDescriptor).MemoryType = MemoryType;
+
+ Hob.MemoryAllocation++;
+ HandOffHob.HandoffInformationTable->EfiEndOfHobList = (EFI_PHYSICAL_ADDRESS) (UINTN) Hob.Raw;
+ Hob = BuildHobEndOfHobList(Hob.Raw);
+ HandOffHob.HandoffInformationTable->EfiFreeMemoryBottom = (EFI_PHYSICAL_ADDRESS) (UINTN) Hob.Raw;
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+GetFirstGuidHob (
+ IN VOID **HobStart,
+ IN EFI_GUID *Guid,
+ OUT VOID **Buffer,
+ OUT UINTN *BufferSize OPTIONAL
+ )
+/*++
+
+Routine Description:
+
+ This function searches the first instance of a HOB among the whole HOB list.
+
+Arguments:
+
+ HobStart - A pointer to the start pointer of hob list.
+
+ Guid - A pointer to the GUID to match with in the HOB list.
+
+ Buffer - A pointer to the pointer to the data for the custom HOB type.
+
+ BufferSize - A Pointer to the size in byte of BufferSize.
+
+Returns:
+ EFI_SUCCESS
+ The first instance of the matched GUID HOB among the whole HOB list
+
+--*/
+{
+ EFI_STATUS Status;
+ EFI_PEI_HOB_POINTERS GuidHob;
+
+ GuidHob.Raw = *HobStart;
+
+ for (Status = EFI_NOT_FOUND; EFI_ERROR (Status); ) {
+
+ if (END_OF_HOB_LIST (GuidHob)) {
+ return EFI_NOT_FOUND;
+ }
+
+ if (GuidHob.Header->HobType == EFI_HOB_TYPE_GUID_EXTENSION) {
+ if ( ((INT32 *)Guid)[0] == ((INT32 *)&GuidHob.Guid->Name)[0] &&
+ ((INT32 *)Guid)[1] == ((INT32 *)&GuidHob.Guid->Name)[1] &&
+ ((INT32 *)Guid)[2] == ((INT32 *)&GuidHob.Guid->Name)[2] &&
+ ((INT32 *)Guid)[3] == ((INT32 *)&GuidHob.Guid->Name)[3] ) {
+ Status = EFI_SUCCESS;
+ *Buffer = (VOID *)((UINT8 *)(&GuidHob.Guid->Name) + sizeof (EFI_GUID));
+ if (BufferSize) {
+ *BufferSize = GuidHob.Header->HobLength - sizeof (EFI_HOB_GUID_TYPE);
+ }
+ }
+ }
+
+ GuidHob.Raw = GET_NEXT_HOB (GuidHob);
+ }
+
+ return Status;
+}
+
+VOID *
+GetHob (
+ IN UINT16 Type,
+ IN VOID *HobStart
+ )
+/*++
+
+Routine Description:
+
+ This function returns the first instance of a HOB type in a HOB list.
+
+Arguments:
+
+ Type The HOB type to return.
+ HobStart The first HOB in the HOB list.
+
+Returns:
+
+ HobStart There were no HOBs found with the requested type.
+ else Returns the first HOB with the matching type.
+
+--*/
+{
+ EFI_PEI_HOB_POINTERS Hob;
+
+ Hob.Raw = HobStart;
+ //
+ // Return input if not found
+ //
+ if (HobStart == NULL) {
+ return HobStart;
+ }
+
+ //
+ // Parse the HOB list, stop if end of list or matching type found.
+ //
+ while (!END_OF_HOB_LIST (Hob)) {
+
+ if (Hob.Header->HobType == Type) {
+ break;
+ }
+
+ Hob.Raw = GET_NEXT_HOB (Hob);
+ }
+
+ //
+ // Return input if not found
+ //
+ if (END_OF_HOB_LIST (Hob)) {
+ return HobStart;
+ }
+
+ return (VOID *) (Hob.Raw);
+}
+
+EFI_STATUS
+GetNextGuidHob (
+ IN OUT VOID **HobStart,
+ IN EFI_GUID * Guid,
+ OUT VOID **Buffer,
+ OUT UINTN *BufferSize OPTIONAL
+ )
+/*++
+
+Routine Description:
+ Get the next guid hob.
+
+Arguments:
+ HobStart A pointer to the start hob.
+ Guid A pointer to a guid.
+ Buffer A pointer to the buffer.
+ BufferSize Buffer size.
+
+Returns:
+ Status code.
+
+ EFI_NOT_FOUND - Next Guid hob not found
+
+ EFI_SUCCESS - Next Guid hob found and data for this Guid got
+
+ EFI_INVALID_PARAMETER - invalid parameter
+
+--*/
+{
+ EFI_STATUS Status;
+ EFI_PEI_HOB_POINTERS GuidHob;
+
+ if (Buffer == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ for (Status = EFI_NOT_FOUND; EFI_ERROR (Status);) {
+
+ GuidHob.Raw = *HobStart;
+ if (END_OF_HOB_LIST (GuidHob)) {
+ return EFI_NOT_FOUND;
+ }
+
+ GuidHob.Raw = GetHob (EFI_HOB_TYPE_GUID_EXTENSION, *HobStart);
+ if (GuidHob.Header->HobType == EFI_HOB_TYPE_GUID_EXTENSION) {
+ if ( ((INT32 *)Guid)[0] == ((INT32 *)&GuidHob.Guid->Name)[0] &&
+ ((INT32 *)Guid)[1] == ((INT32 *)&GuidHob.Guid->Name)[1] &&
+ ((INT32 *)Guid)[2] == ((INT32 *)&GuidHob.Guid->Name)[2] &&
+ ((INT32 *)Guid)[3] == ((INT32 *)&GuidHob.Guid->Name)[3] ) {
+ Status = EFI_SUCCESS;
+ *Buffer = (VOID *) ((UINT8 *) (&GuidHob.Guid->Name) + sizeof (EFI_GUID));
+ if (BufferSize != NULL) {
+ *BufferSize = GuidHob.Header->HobLength - sizeof (EFI_HOB_GUID_TYPE);
+ }
+ }
+ }
+
+ *HobStart = GET_NEXT_HOB (GuidHob);
+ }
+
+ return Status;
+}