peihoblib.c
来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 545 行 · 第 1/2 页
C
545 行
/*++
Copyright (c) 2004, 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;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?