mirror of https://github.com/acidanthera/audk.git
722 lines
20 KiB
C
722 lines
20 KiB
C
|
||
/*++
|
||
|
||
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<6F><6E>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;
|
||
}
|