mirror of https://github.com/acidanthera/audk.git
604 lines
18 KiB
C
604 lines
18 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 = 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<EFBFBD><EFBFBD>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;
|
|||
|
}
|