Add in the 1st version of ECP.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2832 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
603
EdkCompatibilityPkg/Foundation/Library/Pei/Hob/PeiHobLib.c
Normal file
603
EdkCompatibilityPkg/Foundation/Library/Pei/Hob/PeiHobLib.c
Normal file
@@ -0,0 +1,603 @@
|
||||
|
||||
/*++
|
||||
|
||||
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 = EfiConventionalMemory;
|
||||
|
||||
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;
|
||||
}
|
Reference in New Issue
Block a user