diff options
Diffstat (limited to 'EDK/Foundation/Library/Pei/Hob/PeiHobLib.c')
-rw-r--r-- | EDK/Foundation/Library/Pei/Hob/PeiHobLib.c | 721 |
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; +} |