mirror of https://github.com/acidanthera/audk.git
723 lines
20 KiB
C
723 lines
20 KiB
C
|
|
/*++
|
|
|
|
Copyright (c) 2004 - 2007, Intel Corporation. All rights reserved.<BR>
|
|
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 = (UINT16) 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 = (UINT16) 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 = (UINT16) 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 = (UINT16) 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;
|
|
Length = (Length + 0x7) & (~0x7);
|
|
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 = (UINT16) 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 = (UINT16) 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 = (UINT16) 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 = (UINT16) 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 = (UINT16) 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;
|
|
}
|