mirror of https://github.com/acidanthera/audk.git
1434 lines
28 KiB
C
1434 lines
28 KiB
C
/*++
|
|
|
|
Copyright (c) 2004 - 2010, 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.
|
|
|
|
Module Name:
|
|
|
|
PeiLib.h
|
|
|
|
Abstract:
|
|
|
|
PEI Library Functions
|
|
|
|
--*/
|
|
|
|
#ifndef _PEI_LIB_H_
|
|
#define _PEI_LIB_H_
|
|
|
|
#include "Tiano.h"
|
|
#include "Pei.h"
|
|
#include "PeiHobLib.h"
|
|
#include "PeiPerf.h"
|
|
#include EFI_PROTOCOL_DEFINITION (Decompress)
|
|
#include EFI_PROTOCOL_DEFINITION (TianoDecompress)
|
|
#include EFI_GUID_DEFINITION (PeiPeCoffLoader)
|
|
#include EFI_PPI_DEFINITION (FindFv)
|
|
|
|
#if defined(__GNUC__) && defined(ECP_CPU_IPF)
|
|
|
|
VOID
|
|
EFIAPI
|
|
EcpEfiBreakPoint (
|
|
VOID
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Generates a breakpoint on the CPU.
|
|
|
|
Generates a breakpoint on the CPU. The breakpoint must be implemented such
|
|
that code can resume normal execution after the breakpoint.
|
|
|
|
Arguments:
|
|
|
|
VOID
|
|
|
|
Returns:
|
|
|
|
VOID
|
|
|
|
--*/
|
|
;
|
|
|
|
VOID
|
|
EFIAPI
|
|
EcpMemoryFence (
|
|
VOID
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Used to serialize load and store operations.
|
|
|
|
All loads and stores that proceed calls to this function are guaranteed to be
|
|
globally visible when this function returns.
|
|
|
|
Arguments:
|
|
|
|
VOID
|
|
|
|
Returns:
|
|
|
|
VOID
|
|
|
|
--*/
|
|
;
|
|
|
|
#endif
|
|
|
|
|
|
#if (PI_SPECIFICATION_VERSION >= 0x00010000)
|
|
|
|
typedef struct {
|
|
UINT32 PeiServiceTable;
|
|
} PEI_IDT_TABLE;
|
|
|
|
|
|
VOID *
|
|
EFIAPI
|
|
ScanGuid (
|
|
IN VOID *Buffer,
|
|
IN UINTN Length,
|
|
IN EFI_GUID *Guid
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Scans a target buffer for a GUID, and returns a pointer to the matching GUID
|
|
in the target buffer.
|
|
|
|
This function searches target the buffer specified by Buffer and Length from
|
|
the lowest address to the highest address at 128-bit increments for the 128-bit
|
|
GUID value that matches Guid. If a match is found, then a pointer to the matching
|
|
GUID in the target buffer is returned. If no match is found, then NULL is returned.
|
|
If Length is 0, then NULL is returned.
|
|
If Length > 0 and Buffer is NULL, then ASSERT().
|
|
If Buffer is not aligned on a 32-bit boundary, then ASSERT().
|
|
If Length is not aligned on a 128-bit boundary, then ASSERT().
|
|
If Length is greater than (EFI_MAX_ADDRESS ?Buffer + 1), then ASSERT().
|
|
|
|
Arguments:
|
|
|
|
Buffer - Pointer to the target buffer to scan.
|
|
Length - Number of bytes in Buffer to scan.
|
|
Guid - Value to search for in the target buffer.
|
|
|
|
Returns:
|
|
A pointer to the matching Guid in the target buffer or NULL otherwise.
|
|
|
|
--*/
|
|
;
|
|
|
|
VOID *
|
|
EFIAPI
|
|
InvalidateInstructionCacheRange (
|
|
IN VOID *Address,
|
|
IN UINTN Length
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Invalidates a range of instruction cache lines in the cache coherency domain
|
|
of the calling CPU.
|
|
|
|
Invalidates the instruction cache lines specified by Address and Length. If
|
|
Address is not aligned on a cache line boundary, then entire instruction
|
|
cache line containing Address is invalidated. If Address + Length is not
|
|
aligned on a cache line boundary, then the entire instruction cache line
|
|
containing Address + Length -1 is invalidated. This function may choose to
|
|
invalidate the entire instruction cache if that is more efficient than
|
|
invalidating the specified range. If Length is 0, the no instruction cache
|
|
lines are invalidated. Address is returned.
|
|
|
|
If Length is greater than (EFI_MAX_ADDRESS - Address + 1), then ASSERT().
|
|
|
|
Arguments:
|
|
|
|
Address - The base address of the instruction cache lines to
|
|
invalidate. If the CPU is in a physical addressing mode, then
|
|
Address is a physical address. If the CPU is in a virtual
|
|
addressing mode, then Address is a virtual address.
|
|
|
|
Length - The number of bytes to invalidate from the instruction cache.
|
|
|
|
Returns:
|
|
Address
|
|
|
|
**/
|
|
;
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
PeiLibFfsFindNextVolume (
|
|
IN UINTN Instance,
|
|
IN OUT EFI_PEI_FV_HANDLE *VolumeHandle
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
The wrapper of Pei Core Service function FfsFindNextVolume.
|
|
|
|
Arguments:
|
|
|
|
Instance - The Fv Volume Instance.
|
|
VolumeHandle - Pointer to the current Fv Volume to search.
|
|
|
|
Returns:
|
|
EFI_STATUS
|
|
|
|
--*/
|
|
;
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
PeiLibFfsFindNextFile (
|
|
IN EFI_FV_FILETYPE SearchType,
|
|
IN EFI_PEI_FV_HANDLE FvHandle,
|
|
IN OUT EFI_PEI_FILE_HANDLE *FileHandle
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
The wrapper of Pei Core Service function FfsFindNextFile.
|
|
|
|
Arguments:
|
|
|
|
SearchType - Filter to find only file of this type.
|
|
FvHandle - Pointer to the current FV to search.
|
|
FileHandle - Pointer to the file matching SearchType in FwVolHeader.
|
|
- NULL if file not found
|
|
|
|
Returns:
|
|
EFI_STATUS
|
|
|
|
--*/
|
|
;
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
PeiLibFfsFindFileByName (
|
|
IN EFI_GUID *FileName,
|
|
IN EFI_PEI_FV_HANDLE VolumeHandle,
|
|
OUT EFI_PEI_FILE_HANDLE *FileHandle
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
The wrapper of Pei Core Service function FfsFindFileByName.
|
|
|
|
Arguments:
|
|
|
|
FileName - File name to search.
|
|
VolumeHandle - The current FV to search.
|
|
FileHandle - Pointer to the file matching name in VolumeHandle.
|
|
- NULL if file not found
|
|
|
|
Returns:
|
|
EFI_STATUS
|
|
|
|
--*/
|
|
;
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
PeiLibFfsFindSectionData (
|
|
IN EFI_SECTION_TYPE SectionType,
|
|
IN EFI_FFS_FILE_HEADER *FfsFileHeader,
|
|
IN OUT VOID **SectionData
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
The wrapper of Pei Core Service function FfsFindSectionData.
|
|
|
|
Arguments:
|
|
|
|
SearchType - Filter to find only sections of this type.
|
|
FileHandle - Pointer to the current file to search.
|
|
SectionData - Pointer to the Section matching SectionType in FfsFileHeader.
|
|
- NULL if section not found
|
|
|
|
Returns:
|
|
EFI_STATUS
|
|
--*/
|
|
;
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
PeiLibFfsGetVolumeInfo (
|
|
IN EFI_PEI_FV_HANDLE VolumeHandle,
|
|
OUT EFI_FV_INFO *VolumeInfo
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
The wrapper of Pei Core Service function FfsGetVolumeInfo.
|
|
|
|
Arguments:
|
|
|
|
VolumeHandle - The handle to Fv Volume.
|
|
VolumeInfo - The pointer to volume information.
|
|
|
|
Returns:
|
|
EFI_STATUS
|
|
--*/
|
|
;
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
PeiServicesLocatePpi (
|
|
IN EFI_GUID *Guid,
|
|
IN UINTN Instance,
|
|
IN OUT EFI_PEI_PPI_DESCRIPTOR **PpiDescriptor,
|
|
IN OUT VOID **Ppi
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
The wrapper of Pei Core Service function LocatePpi.
|
|
|
|
Arguments:
|
|
|
|
Guid - Pointer to GUID of the PPI.
|
|
Instance - Instance Number to discover.
|
|
PpiDescriptor - Pointer to reference the found descriptor. If not NULL,
|
|
returns a pointer to the descriptor (includes flags, etc)
|
|
Ppi - Pointer to reference the found PPI
|
|
|
|
Returns:
|
|
|
|
Status - EFI_SUCCESS if the PPI is in the database
|
|
EFI_NOT_FOUND if the PPI is not in the database
|
|
--*/
|
|
;
|
|
|
|
VOID
|
|
EFIAPI
|
|
BuildFvHob (
|
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
|
IN UINT64 Length
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Build FvHob.
|
|
|
|
Arguments:
|
|
|
|
BaseAddress - Fv base address.
|
|
Length - Fv Length.
|
|
|
|
Returns:
|
|
NONE.
|
|
|
|
--*/
|
|
;
|
|
|
|
VOID
|
|
EFIAPI
|
|
BuildFvHob2 (
|
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
|
IN UINT64 Length,
|
|
IN EFI_GUID *FvNameGuid,
|
|
IN EFI_GUID *FileNameGuid
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Build FvHob2.
|
|
|
|
Arguments:
|
|
|
|
BaseAddress - Fv base address.
|
|
Length - Fv length.
|
|
FvNameGuid - Fv name.
|
|
FileNameGuid - File name which contians encapsulated Fv.
|
|
|
|
Returns:
|
|
NONE.
|
|
--*/
|
|
;
|
|
|
|
|
|
VOID
|
|
EFIAPI
|
|
BuildGuidDataHob (
|
|
IN EFI_GUID *Guid,
|
|
IN VOID *Data,
|
|
IN UINTN DataLength
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Build Guid data Hob.
|
|
|
|
Arguments:
|
|
|
|
Guid - guid to build data hob.
|
|
Data - data to build data hob.
|
|
DataLength - the length of data.
|
|
|
|
Returns:
|
|
NONE
|
|
|
|
--*/
|
|
;
|
|
|
|
VOID *
|
|
EFIAPI
|
|
AllocatePages (
|
|
IN UINTN Pages
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Allocate Memory.
|
|
|
|
Arguments:
|
|
|
|
Pages - Pages to allocate.
|
|
|
|
Returns:
|
|
Address if successful to allocate memory.
|
|
NULL if fail to allocate memory.
|
|
|
|
--*/
|
|
;
|
|
|
|
VOID
|
|
SetPeiServicesTablePointer (
|
|
IN EFI_PEI_SERVICES **PeiServices
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Save PeiService pointer so that it can be retrieved anywhere.
|
|
|
|
Arguments:
|
|
|
|
PeiServices - The direct pointer to PeiServiceTable.
|
|
|
|
Returns:
|
|
NONE
|
|
|
|
--*/
|
|
;
|
|
|
|
EFI_PEI_SERVICES **
|
|
GetPeiServicesTablePointer (
|
|
VOID
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Get PeiService pointer.
|
|
|
|
Arguments:
|
|
|
|
NONE.
|
|
|
|
Returns:
|
|
The direct pointer to PeiServiceTable.
|
|
|
|
--*/
|
|
;
|
|
|
|
VOID
|
|
MigrateIdtTable (
|
|
IN EFI_PEI_SERVICES **PeiServices
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Migrate IDT from CAR to real memory where preceded with 4 bytes for
|
|
storing PeiService pointer.
|
|
|
|
Arguments:
|
|
|
|
PeiServices - The direct pointer to PeiServiceTable.
|
|
|
|
Returns:
|
|
|
|
NONE.
|
|
|
|
--*/
|
|
;
|
|
|
|
|
|
UINTN
|
|
ReadIdtBase (
|
|
VOID
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Read IDT Register BaseAddress.
|
|
|
|
Arguments:
|
|
|
|
NONE
|
|
|
|
Returns:
|
|
IDT Register BaseAddress.
|
|
|
|
--*/
|
|
;
|
|
|
|
|
|
UINT16
|
|
ReadIdtLimit (
|
|
VOID
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Read IDT Register Limit.
|
|
|
|
Arguments:
|
|
|
|
NONE
|
|
|
|
Returns:
|
|
IDT Register Limit.
|
|
|
|
--*/
|
|
;
|
|
|
|
|
|
VOID
|
|
SetIdtBase (
|
|
UINT32 IdtBase,
|
|
UINT16 IdtLimit
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Set IDT Register BaseAddress.
|
|
|
|
Arguments:
|
|
|
|
IdtBase - IDT.BaseAddress
|
|
IdtLimit - IDT.Limit
|
|
|
|
Returns:
|
|
NONE
|
|
--*/
|
|
;
|
|
|
|
VOID
|
|
AsmWriteKr7 (
|
|
UINT64 Address
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Write 64 bit into Kernel Register7 on IPF.
|
|
|
|
Arguments:
|
|
|
|
Address - Data to write into kr7.
|
|
|
|
Returns:
|
|
NONE
|
|
|
|
--*/
|
|
;
|
|
|
|
|
|
UINT64
|
|
AsmReadKr7 (
|
|
VOID
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Read 64 bit from Kernel Register7 on IPF.
|
|
|
|
Arguments:
|
|
|
|
NONE
|
|
|
|
Returns:
|
|
Data in kr7.
|
|
|
|
--*/
|
|
;
|
|
|
|
#endif
|
|
|
|
VOID
|
|
PeiCopyMem (
|
|
IN VOID *Destination,
|
|
IN VOID *Source,
|
|
IN UINTN Length
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Copy Length bytes from Source to Destination.
|
|
|
|
Arguments:
|
|
|
|
Destination - Target of copy
|
|
|
|
Source - Place to copy from
|
|
|
|
Length - Number of bytes to copy
|
|
|
|
Returns:
|
|
|
|
None
|
|
|
|
--*/
|
|
;
|
|
|
|
VOID
|
|
ZeroMem (
|
|
IN VOID *Buffer,
|
|
IN UINTN Size
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Set Buffer to zero for Size bytes.
|
|
|
|
Arguments:
|
|
|
|
Buffer - Memory to set.
|
|
|
|
Size - Number of bytes to set
|
|
|
|
Returns:
|
|
|
|
None
|
|
|
|
--*/
|
|
;
|
|
|
|
VOID
|
|
CopyMem (
|
|
IN VOID *Destination,
|
|
IN VOID *Source,
|
|
IN UINTN Length
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Copy Length bytes from Source to Destination.
|
|
|
|
Arguments:
|
|
|
|
Destination - Target of copy
|
|
|
|
Source - Place to copy from
|
|
|
|
Length - Number of bytes to copy
|
|
|
|
Returns:
|
|
|
|
None
|
|
|
|
--*/
|
|
;
|
|
|
|
BOOLEAN
|
|
CompareGuid (
|
|
IN EFI_GUID *Guid1,
|
|
IN EFI_GUID *Guid2
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Compares two GUIDs
|
|
|
|
Arguments:
|
|
|
|
Guid1 - guid to compare
|
|
Guid2 - guid to compare
|
|
|
|
Returns:
|
|
= TRUE if Guid1 == Guid2
|
|
= FALSE if Guid1 != Guid2
|
|
|
|
--*/
|
|
;
|
|
|
|
EFI_STATUS
|
|
InstallEfiPeiPeCoffLoader (
|
|
IN EFI_PEI_SERVICES **PeiServices,
|
|
IN EFI_PEI_PE_COFF_LOADER_PROTOCOL **This,
|
|
IN EFI_PEI_PPI_DESCRIPTOR *ThisPpi
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Install EFI Pei PE coff loader protocol.
|
|
|
|
Arguments:
|
|
|
|
PeiServices - The PEI core services table.
|
|
|
|
This - Pointer to get Pei PE coff loader protocol as output
|
|
|
|
ThisPpi - Passed in as EFI_NT_LOAD_AS_DLL_PPI on NT_EMULATOR platform
|
|
|
|
Returns:
|
|
|
|
EFI_SUCCESS
|
|
|
|
--*/
|
|
;
|
|
|
|
EFI_STATUS
|
|
InstallEfiPeiPeCoffLoader64 (
|
|
IN EFI_PEI_SERVICES **PeiServices,
|
|
IN OUT EFI_PEI_PE_COFF_LOADER_PROTOCOL **This,
|
|
IN EFI_PEI_PPI_DESCRIPTOR *ThisPpi
|
|
);
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
InstallEfiDecompress (
|
|
EFI_DECOMPRESS_PROTOCOL **This
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Install EFI decompress protocol.
|
|
|
|
Arguments:
|
|
|
|
This - Pointer to get decompress protocol as output
|
|
|
|
Returns:
|
|
|
|
EFI_SUCCESS - EFI decompress protocol successfully installed.
|
|
|
|
--*/
|
|
;
|
|
|
|
EFI_STATUS
|
|
InstallTianoDecompress (
|
|
EFI_TIANO_DECOMPRESS_PROTOCOL **This
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Install Tiano decompress protocol.
|
|
|
|
Arguments:
|
|
|
|
This - Pointer to get decompress protocol as output
|
|
|
|
Returns:
|
|
|
|
EFI_SUCCESS - Tiano decompress protocol successfully installed.
|
|
|
|
--*/
|
|
;
|
|
|
|
EFI_STATUS
|
|
GetTimerValue (
|
|
OUT UINT64 *TimerValue
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Get timer value.
|
|
|
|
Arguments:
|
|
|
|
TimerValue - Pointer to the returned timer value
|
|
|
|
Returns:
|
|
|
|
EFI_SUCCESS - Successfully got timer value
|
|
|
|
--*/
|
|
;
|
|
|
|
#ifdef EFI_NT_EMULATOR
|
|
EFI_STATUS
|
|
PeCoffLoaderWinNtLoadAsDll (
|
|
IN CHAR8 *PdbFileName,
|
|
IN VOID **ImageEntryPoint,
|
|
OUT VOID **ModHandle
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Loads the .DLL file is present when a PE/COFF file is loaded. This provides source level
|
|
debugging for drivers that have cooresponding .DLL files on the local system.
|
|
|
|
Arguments:
|
|
|
|
PdbFileName - The name of the .PDB file. This was found from the PE/COFF
|
|
file's debug directory entry.
|
|
|
|
ImageEntryPoint - A pointer to the DLL entry point of the .DLL file was loaded.
|
|
|
|
ModHandle - Pointer to loaded library.
|
|
|
|
Returns:
|
|
|
|
EFI_SUCCESS - The .DLL file was loaded, and the DLL entry point is returned in ImageEntryPoint
|
|
|
|
EFI_NOT_FOUND - The .DLL file could not be found
|
|
|
|
EFI_UNSUPPORTED - The .DLL file was loaded, but the entry point to the .DLL file could not
|
|
determined.
|
|
|
|
--*/
|
|
;
|
|
|
|
#endif
|
|
//
|
|
// hob.c
|
|
//
|
|
EFI_STATUS
|
|
PeiBuildHobModule (
|
|
IN EFI_PEI_SERVICES **PeiServices,
|
|
IN EFI_GUID *ModuleName,
|
|
IN EFI_PHYSICAL_ADDRESS Module,
|
|
IN UINT64 ModuleLength,
|
|
IN EFI_PHYSICAL_ADDRESS EntryPoint
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Builds a HOB for a loaded PE32 module
|
|
|
|
Arguments:
|
|
|
|
PeiServices - The PEI core services table.
|
|
ModuleName - The GUID File Name of the module
|
|
Memory - 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 - Hob is successfully built.
|
|
Others - Errors occur while creating new Hob
|
|
|
|
--*/
|
|
;
|
|
|
|
EFI_STATUS
|
|
PeiBuildHobResourceDescriptor (
|
|
IN EFI_PEI_SERVICES **PeiServices,
|
|
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:
|
|
|
|
PeiServices - The PEI core services table.
|
|
|
|
ResourceType - The type of resource described by this HOB
|
|
|
|
ResourceAttribute - The resource 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 - Hob is successfully built.
|
|
Others - Errors occur while creating new Hob
|
|
|
|
--*/
|
|
;
|
|
|
|
EFI_STATUS
|
|
PeiBuildHobGuid (
|
|
IN EFI_PEI_SERVICES **PeiServices,
|
|
IN EFI_GUID *Guid,
|
|
IN UINTN DataLength,
|
|
IN OUT VOID **Hob
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Builds a custom HOB that is tagged with a GUID for identification
|
|
|
|
Arguments:
|
|
|
|
PeiServices - The PEI core services table.
|
|
|
|
Guid - The GUID of the custome HOB type
|
|
|
|
DataLength - The size of the data payload for the GUIDed HOB
|
|
|
|
Hob - Pointer to the Hob
|
|
|
|
Returns:
|
|
|
|
EFI_SUCCESS - Hob is successfully built.
|
|
Others - Errors occur while creating new Hob
|
|
|
|
--*/
|
|
;
|
|
|
|
EFI_STATUS
|
|
PeiBuildHobGuidData (
|
|
IN EFI_PEI_SERVICES **PeiServices,
|
|
IN EFI_GUID *Guid,
|
|
IN VOID *Data,
|
|
IN UINTN DataLength
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Builds a custom HOB that is tagged with a GUID for identification
|
|
|
|
Arguments:
|
|
|
|
PeiServices - The PEI core services table.
|
|
|
|
Guid - The GUID of the custome HOB type
|
|
|
|
Data - The data to be copied into the GUIDed HOB data field.
|
|
|
|
DataLength - The data field length.
|
|
|
|
Returns:
|
|
|
|
EFI_SUCCESS - Hob is successfully built.
|
|
Others - Errors occur while creating new Hob
|
|
|
|
--*/
|
|
;
|
|
|
|
EFI_STATUS
|
|
PeiBuildHobFv (
|
|
IN EFI_PEI_SERVICES **PeiServices,
|
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
|
IN UINT64 Length
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Builds a Firmware Volume HOB
|
|
|
|
Arguments:
|
|
|
|
PeiServices - The PEI core services table.
|
|
|
|
BaseAddress - The base address of the Firmware Volume
|
|
|
|
Length - The size of the Firmware Volume in bytes
|
|
|
|
Returns:
|
|
|
|
EFI_SUCCESS - Hob is successfully built.
|
|
Others - Errors occur while creating new Hob
|
|
|
|
--*/
|
|
;
|
|
|
|
EFI_STATUS
|
|
PeiBuildHobCpu (
|
|
IN EFI_PEI_SERVICES **PeiServices,
|
|
IN UINT8 SizeOfMemorySpace,
|
|
IN UINT8 SizeOfIoSpace
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Builds a HOB for the CPU
|
|
|
|
Arguments:
|
|
|
|
PeiServices - The PEI core services table.
|
|
|
|
SizeOfMemorySpace - Identifies the maximum
|
|
physical memory addressibility of the processor.
|
|
|
|
SizeOfIoSpace - Identifies the maximum physical I/O addressibility
|
|
of the processor.
|
|
|
|
Returns:
|
|
|
|
EFI_SUCCESS - Hob is successfully built.
|
|
Others - Errors occur while creating new Hob
|
|
|
|
--*/
|
|
;
|
|
|
|
EFI_STATUS
|
|
PeiBuildHobStack (
|
|
IN EFI_PEI_SERVICES **PeiServices,
|
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
|
IN UINT64 Length
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Builds a HOB for the Stack
|
|
|
|
Arguments:
|
|
|
|
PeiServices - The PEI core services table.
|
|
|
|
BaseAddress - The 64 bit physical address of the Stack
|
|
|
|
Length - The length of the stack in bytes
|
|
|
|
Returns:
|
|
|
|
EFI_SUCCESS - Hob is successfully built.
|
|
Others - Errors occur while creating new Hob
|
|
|
|
--*/
|
|
;
|
|
|
|
EFI_STATUS
|
|
PeiBuildHobBspStore (
|
|
IN EFI_PEI_SERVICES **PeiServices,
|
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
|
IN UINT64 Length,
|
|
IN EFI_MEMORY_TYPE MemoryType
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Builds a HOB for the bsp store
|
|
|
|
Arguments:
|
|
|
|
PeiServices - The PEI core services table.
|
|
|
|
BaseAddress - The 64 bit physical address of the bsp store
|
|
|
|
Length - The length of the bsp store in bytes
|
|
|
|
MemoryType - Memory type
|
|
|
|
Returns:
|
|
|
|
EFI_SUCCESS - Hob is successfully built.
|
|
Others - Errors occur while creating new Hob
|
|
|
|
--*/
|
|
;
|
|
|
|
EFI_STATUS
|
|
PeiBuildHobMemoryAllocation (
|
|
IN EFI_PEI_SERVICES **PeiServices,
|
|
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
|
IN UINT64 Length,
|
|
IN EFI_GUID *Name,
|
|
IN EFI_MEMORY_TYPE MemoryType
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Builds a HOB for the memory allocation
|
|
|
|
Arguments:
|
|
|
|
PeiServices - The PEI core services table.
|
|
|
|
BaseAddress - The 64 bit physical address of the memory
|
|
|
|
Length - The length of the memory allocation in bytes
|
|
|
|
Name - Name for Hob
|
|
|
|
MemoryType - Memory type
|
|
|
|
Returns:
|
|
|
|
EFI_SUCCESS - Hob is successfully built.
|
|
Others - Errors occur while creating new Hob
|
|
|
|
--*/
|
|
;
|
|
|
|
//
|
|
// print.c
|
|
//
|
|
UINTN
|
|
AvSPrint (
|
|
OUT CHAR8 *StartOfBuffer,
|
|
IN UINTN StrSize,
|
|
IN CONST CHAR8 *Format,
|
|
IN VA_LIST Marker
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
AvSPrint function to process format and place the results in Buffer. Since a
|
|
VA_LIST is used this rountine allows the nesting of Vararg routines. Thus
|
|
this is the main print working routine
|
|
|
|
Arguments:
|
|
|
|
StartOfBuffer - Ascii buffer to print the results of the parsing of Format into.
|
|
|
|
StrSize - Maximum number of characters to put into buffer. Zero means
|
|
no limit.
|
|
|
|
FormatString - Ascii format string see file header for more details.
|
|
|
|
Marker - Vararg list consumed by processing Format.
|
|
|
|
Returns:
|
|
|
|
Number of characters printed.
|
|
|
|
--*/
|
|
;
|
|
|
|
UINTN
|
|
ASPrint (
|
|
OUT CHAR8 *Buffer,
|
|
IN UINTN BufferSize,
|
|
IN CONST CHAR8 *Format,
|
|
...
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
ASPrint function to process format and place the results in Buffer.
|
|
|
|
Arguments:
|
|
|
|
Buffer - Ascii buffer to print the results of the parsing of Format into.
|
|
|
|
BufferSize - Maximum number of characters to put into buffer. Zero means no
|
|
limit.
|
|
|
|
Format - Ascii format string see file header for more details.
|
|
|
|
... - Vararg list consumed by processing Format.
|
|
|
|
Returns:
|
|
|
|
Number of characters printed.
|
|
|
|
--*/
|
|
;
|
|
|
|
//
|
|
// math.c
|
|
//
|
|
UINT64
|
|
MultU64x32 (
|
|
IN UINT64 Multiplicand,
|
|
IN UINTN Multiplier
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine allows a 64 bit value to be multiplied with a 32 bit
|
|
value returns 64bit result.
|
|
No checking if the result is greater than 64bits
|
|
|
|
Arguments:
|
|
|
|
Multiplicand - multiplicand
|
|
Multiplier - multiplier
|
|
|
|
Returns:
|
|
|
|
Multiplicand * Multiplier
|
|
|
|
--*/
|
|
;
|
|
|
|
UINT64
|
|
DivU64x32 (
|
|
IN UINT64 Dividend,
|
|
IN UINTN Divisor,
|
|
OUT UINTN *Remainder OPTIONAL
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine allows a 64 bit value to be divided with a 32 bit value returns
|
|
64bit result and the Remainder.
|
|
N.B. only works for 31bit divisors!!
|
|
|
|
Arguments:
|
|
|
|
Dividend - dividend
|
|
Divisor - divisor
|
|
Remainder - buffer for remainder
|
|
|
|
Returns:
|
|
|
|
Dividend / Divisor
|
|
Remainder = Dividend mod Divisor
|
|
|
|
--*/
|
|
;
|
|
|
|
UINT64
|
|
RShiftU64 (
|
|
IN UINT64 Operand,
|
|
IN UINTN Count
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine allows a 64 bit value to be right shifted by 32 bits and returns the
|
|
shifted value.
|
|
Count is valid up 63. (Only Bits 0-5 is valid for Count)
|
|
|
|
Arguments:
|
|
|
|
Operand - Value to be shifted
|
|
Count - Number of times to shift right.
|
|
|
|
Returns:
|
|
|
|
Value shifted right identified by the Count.
|
|
|
|
--*/
|
|
;
|
|
|
|
UINT64
|
|
LShiftU64 (
|
|
IN UINT64 Operand,
|
|
IN UINTN Count
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
This routine allows a 64 bit value to be left shifted by 32 bits and
|
|
returns the shifted value.
|
|
Count is valid up 63. (Only Bits 0-5 is valid for Count)
|
|
|
|
Arguments:
|
|
|
|
Operand - Value to be shifted
|
|
Count - Number of times to shift left.
|
|
|
|
Returns:
|
|
|
|
Value shifted left identified by the Count.
|
|
|
|
--*/
|
|
;
|
|
|
|
VOID
|
|
RegisterNativeCpuIo (
|
|
IN EFI_PEI_SERVICES **PeiServices,
|
|
IN VOID *CpuIo
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Register a native Cpu IO
|
|
|
|
Arguments:
|
|
|
|
PeiServices - Calling context
|
|
CpuIo - CpuIo instance to register
|
|
|
|
Returns:
|
|
|
|
None
|
|
|
|
--*/
|
|
;
|
|
|
|
VOID
|
|
GetNativeCpuIo (
|
|
IN EFI_PEI_SERVICES **PeiServices,
|
|
OUT VOID **CpuIo
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Get registered Cpu IO.
|
|
|
|
Arguments:
|
|
|
|
PeiServices - Calling context
|
|
CpuIo - CpuIo instance registered before
|
|
|
|
Returns:
|
|
|
|
None
|
|
|
|
--*/
|
|
;
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FindFv (
|
|
IN EFI_FIND_FV_PPI *This,
|
|
IN EFI_PEI_SERVICES **PeiServices,
|
|
IN OUT UINT8 *FvNumber,
|
|
IN OUT EFI_FIRMWARE_VOLUME_HEADER **FVAddress
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Search Fv in Hob.
|
|
|
|
Arguments:
|
|
|
|
This - Interface pointer that implement the Find Fv PPI
|
|
|
|
PeiServices - Pointer to the PEI Service Table
|
|
|
|
FvNumber - On input, the number of the fireware volume which supports FFS to locate
|
|
On output, the next FV number which supports FFS.
|
|
|
|
FVAddress - The address of the volume which supports FFS to discover
|
|
|
|
Returns:
|
|
|
|
EFI_SUCCESS - An addtional FV which supports FFS found
|
|
EFI_OUT_OF_RESOURCES - There are no fireware volume which supports FFS for given fvnumber
|
|
EFI_INVALID_PARAMETER - FvAddress is NULL
|
|
|
|
--*/
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
EFIAPI
|
|
PeiLibPciCfgModify (
|
|
IN EFI_PEI_SERVICES **PeiServices,
|
|
IN PEI_PCI_CFG_PPI *PciCfg,
|
|
IN PEI_PCI_CFG_PPI_WIDTH Width,
|
|
IN UINT64 Address,
|
|
IN UINTN SetBits,
|
|
IN UINTN ClearBits
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
PCI read-modify-write operations.
|
|
|
|
PIWG's PI specification replaces Inte's EFI Specification 1.10.
|
|
EFI_PEI_PCI_CFG_PPI defined in Inte's EFI Specification 1.10 is replaced by
|
|
EFI_PEI_PCI_CFG2_PPI in PI 1.0. "Modify" function in these two PPI are not
|
|
compatibile with each other.
|
|
|
|
|
|
For Framework code that make the following call:
|
|
|
|
PciCfg->Modify (
|
|
PeiServices,
|
|
PciCfg,
|
|
Width,
|
|
Address,
|
|
SetBits,
|
|
ClearBits
|
|
);
|
|
it will be updated to the following code which call this library API:
|
|
PeiLibPciCfgModify (
|
|
PeiServices,
|
|
PciCfg,
|
|
Width,
|
|
Address,
|
|
SetBits,
|
|
ClearBits
|
|
);
|
|
|
|
The
|
|
|
|
Arguments:
|
|
|
|
PeiServices An indirect pointer to the PEI Services Table
|
|
published by the PEI Foundation.
|
|
PciCfg A pointer to the this pointer of EFI_PEI_PCI_CFG_PPI.
|
|
This parameter is unused as a place holder to make
|
|
the parameter list identical to PEI_PCI_CFG_PPI_RW.
|
|
Width The width of the access. Enumerated in bytes. Type
|
|
EFI_PEI_PCI_CFG_PPI_WIDTH is defined in Read().
|
|
|
|
Address The physical address of the access.
|
|
|
|
SetBits Points to value to bitwise-OR with the read configuration value.
|
|
|
|
The size of the value is determined by Width.
|
|
|
|
ClearBits Points to the value to negate and bitwise-AND with the read configuration value.
|
|
The size of the value is determined by Width.
|
|
|
|
|
|
Returns:
|
|
|
|
EFI_SUCCESS The function completed successfully.
|
|
|
|
EFI_DEVICE_ERROR There was a problem with the transaction.
|
|
|
|
--*/
|
|
;
|
|
|
|
#endif
|