mirror of https://github.com/acidanthera/audk.git
7962 lines
258 KiB
C
7962 lines
258 KiB
C
/** @file
|
|
Provides string functions, linked list functions, math functions, synchronization
|
|
functions, file path functions, and CPU architecture-specific functions.
|
|
|
|
Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>
|
|
Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
|
Copyright (c) Microsoft Corporation.<BR>
|
|
Portions Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>
|
|
Portions Copyright (c) 2022, Loongson Technology Corporation Limited. All rights reserved.<BR>
|
|
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#ifndef __BASE_LIB__
|
|
#define __BASE_LIB__
|
|
|
|
//
|
|
// Definitions for architecture-specific types
|
|
//
|
|
#if defined (MDE_CPU_IA32)
|
|
///
|
|
/// The IA-32 architecture context buffer used by SetJump() and LongJump().
|
|
///
|
|
typedef struct {
|
|
UINT32 Ebx;
|
|
UINT32 Esi;
|
|
UINT32 Edi;
|
|
UINT32 Ebp;
|
|
UINT32 Esp;
|
|
UINT32 Eip;
|
|
UINT32 Ssp;
|
|
} BASE_LIBRARY_JUMP_BUFFER;
|
|
|
|
#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 4
|
|
|
|
#endif // defined (MDE_CPU_IA32)
|
|
|
|
#if defined (MDE_CPU_X64)
|
|
///
|
|
/// The x64 architecture context buffer used by SetJump() and LongJump().
|
|
///
|
|
typedef struct {
|
|
UINT64 Rbx;
|
|
UINT64 Rsp;
|
|
UINT64 Rbp;
|
|
UINT64 Rdi;
|
|
UINT64 Rsi;
|
|
UINT64 R12;
|
|
UINT64 R13;
|
|
UINT64 R14;
|
|
UINT64 R15;
|
|
UINT64 Rip;
|
|
UINT64 MxCsr;
|
|
UINT8 XmmBuffer[160]; ///< XMM6-XMM15.
|
|
UINT64 Ssp;
|
|
} BASE_LIBRARY_JUMP_BUFFER;
|
|
|
|
#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8
|
|
|
|
#endif // defined (MDE_CPU_X64)
|
|
|
|
#if defined (MDE_CPU_EBC)
|
|
///
|
|
/// The EBC context buffer used by SetJump() and LongJump().
|
|
///
|
|
typedef struct {
|
|
UINT64 R0;
|
|
UINT64 R1;
|
|
UINT64 R2;
|
|
UINT64 R3;
|
|
UINT64 IP;
|
|
} BASE_LIBRARY_JUMP_BUFFER;
|
|
|
|
#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8
|
|
|
|
#endif // defined (MDE_CPU_EBC)
|
|
|
|
#if defined (MDE_CPU_ARM)
|
|
|
|
typedef struct {
|
|
UINT32 R3; ///< A copy of R13.
|
|
UINT32 R4;
|
|
UINT32 R5;
|
|
UINT32 R6;
|
|
UINT32 R7;
|
|
UINT32 R8;
|
|
UINT32 R9;
|
|
UINT32 R10;
|
|
UINT32 R11;
|
|
UINT32 R12;
|
|
UINT32 R14;
|
|
} BASE_LIBRARY_JUMP_BUFFER;
|
|
|
|
#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 4
|
|
|
|
#endif // defined (MDE_CPU_ARM)
|
|
|
|
#if defined (MDE_CPU_AARCH64)
|
|
typedef struct {
|
|
// GP regs
|
|
UINT64 X19;
|
|
UINT64 X20;
|
|
UINT64 X21;
|
|
UINT64 X22;
|
|
UINT64 X23;
|
|
UINT64 X24;
|
|
UINT64 X25;
|
|
UINT64 X26;
|
|
UINT64 X27;
|
|
UINT64 X28;
|
|
UINT64 FP;
|
|
UINT64 LR;
|
|
UINT64 IP0;
|
|
|
|
// FP regs
|
|
UINT64 D8;
|
|
UINT64 D9;
|
|
UINT64 D10;
|
|
UINT64 D11;
|
|
UINT64 D12;
|
|
UINT64 D13;
|
|
UINT64 D14;
|
|
UINT64 D15;
|
|
} BASE_LIBRARY_JUMP_BUFFER;
|
|
|
|
#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8
|
|
|
|
#endif // defined (MDE_CPU_AARCH64)
|
|
|
|
#if defined (MDE_CPU_RISCV64)
|
|
///
|
|
/// The RISC-V architecture context buffer used by SetJump() and LongJump().
|
|
///
|
|
typedef struct {
|
|
UINT64 RA;
|
|
UINT64 S0;
|
|
UINT64 S1;
|
|
UINT64 S2;
|
|
UINT64 S3;
|
|
UINT64 S4;
|
|
UINT64 S5;
|
|
UINT64 S6;
|
|
UINT64 S7;
|
|
UINT64 S8;
|
|
UINT64 S9;
|
|
UINT64 S10;
|
|
UINT64 S11;
|
|
UINT64 SP;
|
|
} BASE_LIBRARY_JUMP_BUFFER;
|
|
|
|
#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8
|
|
|
|
VOID
|
|
RiscVSetSupervisorScratch (
|
|
IN UINT64
|
|
);
|
|
|
|
UINT64
|
|
RiscVGetSupervisorScratch (
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
RiscVSetSupervisorStvec (
|
|
IN UINT64
|
|
);
|
|
|
|
UINT64
|
|
RiscVGetSupervisorStvec (
|
|
VOID
|
|
);
|
|
|
|
UINT64
|
|
RiscVGetSupervisorTrapCause (
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
RiscVSetSupervisorAddressTranslationRegister (
|
|
IN UINT64
|
|
);
|
|
|
|
UINT64
|
|
RiscVGetSupervisorAddressTranslationRegister (
|
|
VOID
|
|
);
|
|
|
|
UINT64
|
|
RiscVReadTimer (
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
RiscVSetSupervisorTimeCompareRegister (
|
|
IN UINT64
|
|
);
|
|
|
|
VOID
|
|
RiscVEnableTimerInterrupt (
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
RiscVDisableTimerInterrupt (
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
RiscVClearPendingTimerInterrupt (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
RISC-V invalidate instruction cache.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
RiscVInvalidateInstCacheFenceAsm (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
RISC-V invalidate data cache.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
RiscVInvalidateDataCacheFenceAsm (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
RISC-V flush cache block. Atomically perform a clean operation
|
|
followed by an invalidate operation
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
RiscVCpuCacheFlushCmoAsm (
|
|
IN UINTN
|
|
);
|
|
|
|
/**
|
|
Perform a write transfer to another cache or to memory if the
|
|
data in the copy of the cache block have been modified by a store
|
|
operation
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
RiscVCpuCacheCleanCmoAsm (
|
|
IN UINTN
|
|
);
|
|
|
|
/**
|
|
Deallocate the copy of the cache block
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
RiscVCpuCacheInvalCmoAsm (
|
|
IN UINTN
|
|
);
|
|
|
|
#endif // defined (MDE_CPU_RISCV64)
|
|
|
|
#if defined (MDE_CPU_LOONGARCH64)
|
|
///
|
|
/// The LoongArch architecture context buffer used by SetJump() and LongJump()
|
|
///
|
|
typedef struct {
|
|
UINT64 S0;
|
|
UINT64 S1;
|
|
UINT64 S2;
|
|
UINT64 S3;
|
|
UINT64 S4;
|
|
UINT64 S5;
|
|
UINT64 S6;
|
|
UINT64 S7;
|
|
UINT64 S8;
|
|
UINT64 SP;
|
|
UINT64 FP;
|
|
UINT64 RA;
|
|
} BASE_LIBRARY_JUMP_BUFFER;
|
|
|
|
#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8
|
|
|
|
/*
|
|
* Set the exception base address for LoongArch.
|
|
*
|
|
* @param ExceptionBaseAddress The exception base address, must be aligned greater than or qeual to 4K .
|
|
*/
|
|
VOID
|
|
SetExceptionBaseAddress (
|
|
IN UINT64
|
|
);
|
|
|
|
/*
|
|
* Set the TlbRebase address for LoongArch.
|
|
*
|
|
* @param TlbRebaseAddress The TlbRebase address, must be aligned greater than or qeual to 4K .
|
|
*/
|
|
VOID
|
|
SetTlbRebaseAddress (
|
|
IN UINT64
|
|
);
|
|
|
|
/**
|
|
Enables local CPU interrupts.
|
|
|
|
@param Needs to enable local interrupt bit.
|
|
**/
|
|
VOID
|
|
EnableLocalInterrupts (
|
|
IN UINT16
|
|
);
|
|
|
|
/**
|
|
Disables local CPU interrupts.
|
|
|
|
@param Needs to disable local interrupt bit.
|
|
**/
|
|
VOID
|
|
DisableLocalInterrupts (
|
|
IN UINT16
|
|
);
|
|
|
|
/**
|
|
Read CPUCFG register.
|
|
|
|
@param Index Specifies the register number of the CPUCFG to read the data.
|
|
@param Data A pointer to the variable used to store the CPUCFG register value.
|
|
**/
|
|
VOID
|
|
AsmCpucfg (
|
|
IN UINT32 Index,
|
|
OUT UINT32 *Data
|
|
);
|
|
|
|
/**
|
|
Gets the timer count value.
|
|
|
|
@param[] VOID
|
|
@retval timer count value.
|
|
|
|
**/
|
|
UINTN
|
|
AsmReadStableCounter (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
CSR read operation.
|
|
|
|
@param[in] Select CSR read instruction select values.
|
|
|
|
@return The return value of csrrd instruction, return -1 means no CSR instruction
|
|
is found.
|
|
**/
|
|
UINTN
|
|
CsrRead (
|
|
IN UINT16 Select
|
|
);
|
|
|
|
/**
|
|
CSR write operation.
|
|
|
|
@param[in] Select CSR write instruction select values.
|
|
@param[in] Value The csrwr will write the value.
|
|
|
|
@return The return value of csrwr instruction, that is, store the old value of
|
|
the register, return -1 means no CSR instruction is found.
|
|
**/
|
|
UINTN
|
|
CsrWrite (
|
|
IN UINT16 Select,
|
|
IN UINTN Value
|
|
);
|
|
|
|
/**
|
|
CSR exchange operation.
|
|
|
|
@param[in] Select CSR exchange instruction select values.
|
|
@param[in] Value The csrxchg will write the value.
|
|
@param[in] Mask The csrxchg mask value.
|
|
|
|
@return The return value of csrxchg instruction, that is, store the old value of
|
|
the register, return -1 means no CSR instruction is found.
|
|
**/
|
|
UINTN
|
|
CsrXChg (
|
|
IN UINT16 Select,
|
|
IN UINTN Value,
|
|
IN UINTN Mask
|
|
);
|
|
|
|
/**
|
|
IO CSR read byte operation.
|
|
|
|
@param[in] Select IO CSR read instruction select values.
|
|
|
|
@return The return value of iocsrrd.b instruction.
|
|
|
|
**/
|
|
UINT8
|
|
IoCsrRead8 (
|
|
IN UINTN Select
|
|
);
|
|
|
|
/**
|
|
IO CSR read half word operation.
|
|
|
|
@param[in] Select IO CSR read instruction select values.
|
|
|
|
@return The return value of iocsrrd.h instruction.
|
|
|
|
**/
|
|
UINT16
|
|
IoCsrRead16 (
|
|
IN UINTN Select
|
|
);
|
|
|
|
/**
|
|
IO CSR read word operation.
|
|
|
|
@param[in] Select IO CSR read instruction select values.
|
|
|
|
@return The return value of iocsrrd.w instruction.
|
|
|
|
**/
|
|
UINT32
|
|
IoCsrRead32 (
|
|
IN UINTN Select
|
|
);
|
|
|
|
/**
|
|
IO CSR read double word operation. Only for LoongArch64.
|
|
|
|
@param[in] Select IO CSR read instruction select values.
|
|
|
|
@return The return value of iocsrrd.d instruction.
|
|
|
|
**/
|
|
UINT64
|
|
IoCsrRead64 (
|
|
IN UINTN Select
|
|
);
|
|
|
|
/**
|
|
IO CSR write byte operation.
|
|
|
|
@param[in] Select IO CSR write instruction select values.
|
|
@param[in] Value The iocsrwr.b will write the value.
|
|
|
|
@return VOID.
|
|
|
|
**/
|
|
VOID
|
|
IoCsrWrite8 (
|
|
IN UINTN Select,
|
|
IN UINT8 Value
|
|
);
|
|
|
|
/**
|
|
IO CSR write half word operation.
|
|
|
|
@param[in] Select IO CSR write instruction select values.
|
|
@param[in] Value The iocsrwr.h will write the value.
|
|
|
|
@return VOID.
|
|
|
|
**/
|
|
VOID
|
|
IoCsrWrite16 (
|
|
IN UINTN Select,
|
|
IN UINT16 Value
|
|
);
|
|
|
|
/**
|
|
IO CSR write word operation.
|
|
|
|
@param[in] Select IO CSR write instruction select values.
|
|
@param[in] Value The iocsrwr.w will write the value.
|
|
|
|
@return VOID.
|
|
|
|
**/
|
|
VOID
|
|
IoCsrWrite32 (
|
|
IN UINTN Select,
|
|
IN UINT32 Value
|
|
);
|
|
|
|
/**
|
|
IO CSR write double word operation. Only for LoongArch64.
|
|
|
|
@param[in] Select IO CSR write instruction select values.
|
|
@param[in] Value The iocsrwr.d will write the value.
|
|
|
|
@return VOID.
|
|
|
|
**/
|
|
VOID
|
|
IoCsrWrite64 (
|
|
IN UINTN Select,
|
|
IN UINT64 Value
|
|
);
|
|
|
|
#endif // defined (MDE_CPU_LOONGARCH64)
|
|
|
|
//
|
|
// String Services
|
|
//
|
|
|
|
/**
|
|
Returns the length of a Null-terminated Unicode string.
|
|
|
|
This function is similar as strlen_s defined in C11.
|
|
|
|
If String is not aligned on a 16-bit boundary, then ASSERT().
|
|
|
|
@param String A pointer to a Null-terminated Unicode string.
|
|
@param MaxSize The maximum number of Destination Unicode
|
|
char, including terminating null char.
|
|
|
|
@retval 0 If String is NULL.
|
|
@retval MaxSize If there is no null character in the first MaxSize characters of String.
|
|
@return The number of characters that percede the terminating null character.
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
StrnLenS (
|
|
IN CONST CHAR16 *String,
|
|
IN UINTN MaxSize
|
|
);
|
|
|
|
/**
|
|
Returns the size of a Null-terminated Unicode string in bytes, including the
|
|
Null terminator.
|
|
|
|
This function returns the size of the Null-terminated Unicode string
|
|
specified by String in bytes, including the Null terminator.
|
|
|
|
If String is not aligned on a 16-bit boundary, then ASSERT().
|
|
|
|
@param String A pointer to a Null-terminated Unicode string.
|
|
@param MaxSize The maximum number of Destination Unicode
|
|
char, including the Null terminator.
|
|
|
|
@retval 0 If String is NULL.
|
|
@retval (sizeof (CHAR16) * (MaxSize + 1))
|
|
If there is no Null terminator in the first MaxSize characters of
|
|
String.
|
|
@return The size of the Null-terminated Unicode string in bytes, including
|
|
the Null terminator.
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
StrnSizeS (
|
|
IN CONST CHAR16 *String,
|
|
IN UINTN MaxSize
|
|
);
|
|
|
|
/**
|
|
Copies the string pointed to by Source (including the terminating null char)
|
|
to the array pointed to by Destination.
|
|
|
|
This function is similar as strcpy_s defined in C11.
|
|
|
|
If Destination is not aligned on a 16-bit boundary, then ASSERT().
|
|
If Source is not aligned on a 16-bit boundary, then ASSERT().
|
|
|
|
If an error is returned, then the Destination is unmodified.
|
|
|
|
@param Destination A pointer to a Null-terminated Unicode string.
|
|
@param DestMax The maximum number of Destination Unicode
|
|
char, including terminating null char.
|
|
@param Source A pointer to a Null-terminated Unicode string.
|
|
|
|
@retval RETURN_SUCCESS String is copied.
|
|
@retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than StrLen(Source).
|
|
@retval RETURN_INVALID_PARAMETER If Destination is NULL.
|
|
If Source is NULL.
|
|
If PcdMaximumUnicodeStringLength is not zero,
|
|
and DestMax is greater than
|
|
PcdMaximumUnicodeStringLength.
|
|
If DestMax is 0.
|
|
@retval RETURN_ACCESS_DENIED If Source and Destination overlap.
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
StrCpyS (
|
|
OUT CHAR16 *Destination,
|
|
IN UINTN DestMax,
|
|
IN CONST CHAR16 *Source
|
|
);
|
|
|
|
/**
|
|
Copies not more than Length successive char from the string pointed to by
|
|
Source to the array pointed to by Destination. If no null char is copied from
|
|
Source, then Destination[Length] is always set to null.
|
|
|
|
This function is similar as strncpy_s defined in C11.
|
|
|
|
If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().
|
|
If Length > 0 and Source is not aligned on a 16-bit boundary, then ASSERT().
|
|
|
|
If an error is returned, then the Destination is unmodified.
|
|
|
|
@param Destination A pointer to a Null-terminated Unicode string.
|
|
@param DestMax The maximum number of Destination Unicode
|
|
char, including terminating null char.
|
|
@param Source A pointer to a Null-terminated Unicode string.
|
|
@param Length The maximum number of Unicode characters to copy.
|
|
|
|
@retval RETURN_SUCCESS String is copied.
|
|
@retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than
|
|
MIN(StrLen(Source), Length).
|
|
@retval RETURN_INVALID_PARAMETER If Destination is NULL.
|
|
If Source is NULL.
|
|
If PcdMaximumUnicodeStringLength is not zero,
|
|
and DestMax is greater than
|
|
PcdMaximumUnicodeStringLength.
|
|
If DestMax is 0.
|
|
@retval RETURN_ACCESS_DENIED If Source and Destination overlap.
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
StrnCpyS (
|
|
OUT CHAR16 *Destination,
|
|
IN UINTN DestMax,
|
|
IN CONST CHAR16 *Source,
|
|
IN UINTN Length
|
|
);
|
|
|
|
/**
|
|
Appends a copy of the string pointed to by Source (including the terminating
|
|
null char) to the end of the string pointed to by Destination.
|
|
|
|
This function is similar as strcat_s defined in C11.
|
|
|
|
If Destination is not aligned on a 16-bit boundary, then ASSERT().
|
|
If Source is not aligned on a 16-bit boundary, then ASSERT().
|
|
|
|
If an error is returned, then the Destination is unmodified.
|
|
|
|
@param Destination A pointer to a Null-terminated Unicode string.
|
|
@param DestMax The maximum number of Destination Unicode
|
|
char, including terminating null char.
|
|
@param Source A pointer to a Null-terminated Unicode string.
|
|
|
|
@retval RETURN_SUCCESS String is appended.
|
|
@retval RETURN_BAD_BUFFER_SIZE If DestMax is NOT greater than
|
|
StrLen(Destination).
|
|
@retval RETURN_BUFFER_TOO_SMALL If (DestMax - StrLen(Destination)) is NOT
|
|
greater than StrLen(Source).
|
|
@retval RETURN_INVALID_PARAMETER If Destination is NULL.
|
|
If Source is NULL.
|
|
If PcdMaximumUnicodeStringLength is not zero,
|
|
and DestMax is greater than
|
|
PcdMaximumUnicodeStringLength.
|
|
If DestMax is 0.
|
|
@retval RETURN_ACCESS_DENIED If Source and Destination overlap.
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
StrCatS (
|
|
IN OUT CHAR16 *Destination,
|
|
IN UINTN DestMax,
|
|
IN CONST CHAR16 *Source
|
|
);
|
|
|
|
/**
|
|
Appends not more than Length successive char from the string pointed to by
|
|
Source to the end of the string pointed to by Destination. If no null char is
|
|
copied from Source, then Destination[StrLen(Destination) + Length] is always
|
|
set to null.
|
|
|
|
This function is similar as strncat_s defined in C11.
|
|
|
|
If Destination is not aligned on a 16-bit boundary, then ASSERT().
|
|
If Source is not aligned on a 16-bit boundary, then ASSERT().
|
|
|
|
If an error is returned, then the Destination is unmodified.
|
|
|
|
@param Destination A pointer to a Null-terminated Unicode string.
|
|
@param DestMax The maximum number of Destination Unicode
|
|
char, including terminating null char.
|
|
@param Source A pointer to a Null-terminated Unicode string.
|
|
@param Length The maximum number of Unicode characters to copy.
|
|
|
|
@retval RETURN_SUCCESS String is appended.
|
|
@retval RETURN_BAD_BUFFER_SIZE If DestMax is NOT greater than
|
|
StrLen(Destination).
|
|
@retval RETURN_BUFFER_TOO_SMALL If (DestMax - StrLen(Destination)) is NOT
|
|
greater than MIN(StrLen(Source), Length).
|
|
@retval RETURN_INVALID_PARAMETER If Destination is NULL.
|
|
If Source is NULL.
|
|
If PcdMaximumUnicodeStringLength is not zero,
|
|
and DestMax is greater than
|
|
PcdMaximumUnicodeStringLength.
|
|
If DestMax is 0.
|
|
@retval RETURN_ACCESS_DENIED If Source and Destination overlap.
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
StrnCatS (
|
|
IN OUT CHAR16 *Destination,
|
|
IN UINTN DestMax,
|
|
IN CONST CHAR16 *Source,
|
|
IN UINTN Length
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated Unicode decimal string to a value of type UINTN.
|
|
|
|
This function outputs a value of type UINTN by interpreting the contents of
|
|
the Unicode string specified by String as a decimal number. The format of the
|
|
input Unicode string String is:
|
|
|
|
[spaces] [decimal digits].
|
|
|
|
The valid decimal digit character is in the range [0-9]. The function will
|
|
ignore the pad space, which includes spaces or tab characters, before
|
|
[decimal digits]. The running zero in the beginning of [decimal digits] will
|
|
be ignored. Then, the function stops at the first character that is a not a
|
|
valid decimal character or a Null-terminator, whichever one comes first.
|
|
|
|
If String is not aligned in a 16-bit boundary, then ASSERT().
|
|
|
|
If String has no valid decimal digits in the above format, then 0 is stored
|
|
at the location pointed to by Data.
|
|
If the number represented by String exceeds the range defined by UINTN, then
|
|
MAX_UINTN is stored at the location pointed to by Data.
|
|
|
|
If EndPointer is not NULL, a pointer to the character that stopped the scan
|
|
is stored at the location pointed to by EndPointer. If String has no valid
|
|
decimal digits right after the optional pad spaces, the value of String is
|
|
stored at the location pointed to by EndPointer.
|
|
|
|
@param String Pointer to a Null-terminated Unicode string.
|
|
@param EndPointer Pointer to character that stops scan.
|
|
@param Data Pointer to the converted value.
|
|
|
|
@retval RETURN_SUCCESS Value is translated from String.
|
|
@retval RETURN_INVALID_PARAMETER If String is NULL.
|
|
If Data is NULL.
|
|
If PcdMaximumUnicodeStringLength is not
|
|
zero, and String contains more than
|
|
PcdMaximumUnicodeStringLength Unicode
|
|
characters, not including the
|
|
Null-terminator.
|
|
@retval RETURN_UNSUPPORTED If the number represented by String exceeds
|
|
the range defined by UINTN.
|
|
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
StrDecimalToUintnS (
|
|
IN CONST CHAR16 *String,
|
|
OUT CHAR16 **EndPointer OPTIONAL,
|
|
OUT UINTN *Data
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated Unicode decimal string to a value of type UINT64.
|
|
|
|
This function outputs a value of type UINT64 by interpreting the contents of
|
|
the Unicode string specified by String as a decimal number. The format of the
|
|
input Unicode string String is:
|
|
|
|
[spaces] [decimal digits].
|
|
|
|
The valid decimal digit character is in the range [0-9]. The function will
|
|
ignore the pad space, which includes spaces or tab characters, before
|
|
[decimal digits]. The running zero in the beginning of [decimal digits] will
|
|
be ignored. Then, the function stops at the first character that is a not a
|
|
valid decimal character or a Null-terminator, whichever one comes first.
|
|
|
|
If String is not aligned in a 16-bit boundary, then ASSERT().
|
|
|
|
If String has no valid decimal digits in the above format, then 0 is stored
|
|
at the location pointed to by Data.
|
|
If the number represented by String exceeds the range defined by UINT64, then
|
|
MAX_UINT64 is stored at the location pointed to by Data.
|
|
|
|
If EndPointer is not NULL, a pointer to the character that stopped the scan
|
|
is stored at the location pointed to by EndPointer. If String has no valid
|
|
decimal digits right after the optional pad spaces, the value of String is
|
|
stored at the location pointed to by EndPointer.
|
|
|
|
@param String Pointer to a Null-terminated Unicode string.
|
|
@param EndPointer Pointer to character that stops scan.
|
|
@param Data Pointer to the converted value.
|
|
|
|
@retval RETURN_SUCCESS Value is translated from String.
|
|
@retval RETURN_INVALID_PARAMETER If String is NULL.
|
|
If Data is NULL.
|
|
If PcdMaximumUnicodeStringLength is not
|
|
zero, and String contains more than
|
|
PcdMaximumUnicodeStringLength Unicode
|
|
characters, not including the
|
|
Null-terminator.
|
|
@retval RETURN_UNSUPPORTED If the number represented by String exceeds
|
|
the range defined by UINT64.
|
|
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
StrDecimalToUint64S (
|
|
IN CONST CHAR16 *String,
|
|
OUT CHAR16 **EndPointer OPTIONAL,
|
|
OUT UINT64 *Data
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated Unicode hexadecimal string to a value of type
|
|
UINTN.
|
|
|
|
This function outputs a value of type UINTN by interpreting the contents of
|
|
the Unicode string specified by String as a hexadecimal number. The format of
|
|
the input Unicode string String is:
|
|
|
|
[spaces][zeros][x][hexadecimal digits].
|
|
|
|
The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
|
|
The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.
|
|
If "x" appears in the input string, it must be prefixed with at least one 0.
|
|
The function will ignore the pad space, which includes spaces or tab
|
|
characters, before [zeros], [x] or [hexadecimal digit]. The running zero
|
|
before [x] or [hexadecimal digit] will be ignored. Then, the decoding starts
|
|
after [x] or the first valid hexadecimal digit. Then, the function stops at
|
|
the first character that is a not a valid hexadecimal character or NULL,
|
|
whichever one comes first.
|
|
|
|
If String is not aligned in a 16-bit boundary, then ASSERT().
|
|
|
|
If String has no valid hexadecimal digits in the above format, then 0 is
|
|
stored at the location pointed to by Data.
|
|
If the number represented by String exceeds the range defined by UINTN, then
|
|
MAX_UINTN is stored at the location pointed to by Data.
|
|
|
|
If EndPointer is not NULL, a pointer to the character that stopped the scan
|
|
is stored at the location pointed to by EndPointer. If String has no valid
|
|
hexadecimal digits right after the optional pad spaces, the value of String
|
|
is stored at the location pointed to by EndPointer.
|
|
|
|
@param String Pointer to a Null-terminated Unicode string.
|
|
@param EndPointer Pointer to character that stops scan.
|
|
@param Data Pointer to the converted value.
|
|
|
|
@retval RETURN_SUCCESS Value is translated from String.
|
|
@retval RETURN_INVALID_PARAMETER If String is NULL.
|
|
If Data is NULL.
|
|
If PcdMaximumUnicodeStringLength is not
|
|
zero, and String contains more than
|
|
PcdMaximumUnicodeStringLength Unicode
|
|
characters, not including the
|
|
Null-terminator.
|
|
@retval RETURN_UNSUPPORTED If the number represented by String exceeds
|
|
the range defined by UINTN.
|
|
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
StrHexToUintnS (
|
|
IN CONST CHAR16 *String,
|
|
OUT CHAR16 **EndPointer OPTIONAL,
|
|
OUT UINTN *Data
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated Unicode hexadecimal string to a value of type
|
|
UINT64.
|
|
|
|
This function outputs a value of type UINT64 by interpreting the contents of
|
|
the Unicode string specified by String as a hexadecimal number. The format of
|
|
the input Unicode string String is:
|
|
|
|
[spaces][zeros][x][hexadecimal digits].
|
|
|
|
The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
|
|
The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.
|
|
If "x" appears in the input string, it must be prefixed with at least one 0.
|
|
The function will ignore the pad space, which includes spaces or tab
|
|
characters, before [zeros], [x] or [hexadecimal digit]. The running zero
|
|
before [x] or [hexadecimal digit] will be ignored. Then, the decoding starts
|
|
after [x] or the first valid hexadecimal digit. Then, the function stops at
|
|
the first character that is a not a valid hexadecimal character or NULL,
|
|
whichever one comes first.
|
|
|
|
If String is not aligned in a 16-bit boundary, then ASSERT().
|
|
|
|
If String has no valid hexadecimal digits in the above format, then 0 is
|
|
stored at the location pointed to by Data.
|
|
If the number represented by String exceeds the range defined by UINT64, then
|
|
MAX_UINT64 is stored at the location pointed to by Data.
|
|
|
|
If EndPointer is not NULL, a pointer to the character that stopped the scan
|
|
is stored at the location pointed to by EndPointer. If String has no valid
|
|
hexadecimal digits right after the optional pad spaces, the value of String
|
|
is stored at the location pointed to by EndPointer.
|
|
|
|
@param String Pointer to a Null-terminated Unicode string.
|
|
@param EndPointer Pointer to character that stops scan.
|
|
@param Data Pointer to the converted value.
|
|
|
|
@retval RETURN_SUCCESS Value is translated from String.
|
|
@retval RETURN_INVALID_PARAMETER If String is NULL.
|
|
If Data is NULL.
|
|
If PcdMaximumUnicodeStringLength is not
|
|
zero, and String contains more than
|
|
PcdMaximumUnicodeStringLength Unicode
|
|
characters, not including the
|
|
Null-terminator.
|
|
@retval RETURN_UNSUPPORTED If the number represented by String exceeds
|
|
the range defined by UINT64.
|
|
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
StrHexToUint64S (
|
|
IN CONST CHAR16 *String,
|
|
OUT CHAR16 **EndPointer OPTIONAL,
|
|
OUT UINT64 *Data
|
|
);
|
|
|
|
/**
|
|
Returns the length of a Null-terminated Ascii string.
|
|
|
|
This function is similar as strlen_s defined in C11.
|
|
|
|
@param String A pointer to a Null-terminated Ascii string.
|
|
@param MaxSize The maximum number of Destination Ascii
|
|
char, including terminating null char.
|
|
|
|
@retval 0 If String is NULL.
|
|
@retval MaxSize If there is no null character in the first MaxSize characters of String.
|
|
@return The number of characters that percede the terminating null character.
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsciiStrnLenS (
|
|
IN CONST CHAR8 *String,
|
|
IN UINTN MaxSize
|
|
);
|
|
|
|
/**
|
|
Returns the size of a Null-terminated Ascii string in bytes, including the
|
|
Null terminator.
|
|
|
|
This function returns the size of the Null-terminated Ascii string specified
|
|
by String in bytes, including the Null terminator.
|
|
|
|
@param String A pointer to a Null-terminated Ascii string.
|
|
@param MaxSize The maximum number of Destination Ascii
|
|
char, including the Null terminator.
|
|
|
|
@retval 0 If String is NULL.
|
|
@retval (sizeof (CHAR8) * (MaxSize + 1))
|
|
If there is no Null terminator in the first MaxSize characters of
|
|
String.
|
|
@return The size of the Null-terminated Ascii string in bytes, including the
|
|
Null terminator.
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsciiStrnSizeS (
|
|
IN CONST CHAR8 *String,
|
|
IN UINTN MaxSize
|
|
);
|
|
|
|
/**
|
|
Copies the string pointed to by Source (including the terminating null char)
|
|
to the array pointed to by Destination.
|
|
|
|
This function is similar as strcpy_s defined in C11.
|
|
|
|
If an error is returned, then the Destination is unmodified.
|
|
|
|
@param Destination A pointer to a Null-terminated Ascii string.
|
|
@param DestMax The maximum number of Destination Ascii
|
|
char, including terminating null char.
|
|
@param Source A pointer to a Null-terminated Ascii string.
|
|
|
|
@retval RETURN_SUCCESS String is copied.
|
|
@retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than StrLen(Source).
|
|
@retval RETURN_INVALID_PARAMETER If Destination is NULL.
|
|
If Source is NULL.
|
|
If PcdMaximumAsciiStringLength is not zero,
|
|
and DestMax is greater than
|
|
PcdMaximumAsciiStringLength.
|
|
If DestMax is 0.
|
|
@retval RETURN_ACCESS_DENIED If Source and Destination overlap.
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
AsciiStrCpyS (
|
|
OUT CHAR8 *Destination,
|
|
IN UINTN DestMax,
|
|
IN CONST CHAR8 *Source
|
|
);
|
|
|
|
/**
|
|
Copies not more than Length successive char from the string pointed to by
|
|
Source to the array pointed to by Destination. If no null char is copied from
|
|
Source, then Destination[Length] is always set to null.
|
|
|
|
This function is similar as strncpy_s defined in C11.
|
|
|
|
If an error is returned, then the Destination is unmodified.
|
|
|
|
@param Destination A pointer to a Null-terminated Ascii string.
|
|
@param DestMax The maximum number of Destination Ascii
|
|
char, including terminating null char.
|
|
@param Source A pointer to a Null-terminated Ascii string.
|
|
@param Length The maximum number of Ascii characters to copy.
|
|
|
|
@retval RETURN_SUCCESS String is copied.
|
|
@retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than
|
|
MIN(StrLen(Source), Length).
|
|
@retval RETURN_INVALID_PARAMETER If Destination is NULL.
|
|
If Source is NULL.
|
|
If PcdMaximumAsciiStringLength is not zero,
|
|
and DestMax is greater than
|
|
PcdMaximumAsciiStringLength.
|
|
If DestMax is 0.
|
|
@retval RETURN_ACCESS_DENIED If Source and Destination overlap.
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
AsciiStrnCpyS (
|
|
OUT CHAR8 *Destination,
|
|
IN UINTN DestMax,
|
|
IN CONST CHAR8 *Source,
|
|
IN UINTN Length
|
|
);
|
|
|
|
/**
|
|
Appends a copy of the string pointed to by Source (including the terminating
|
|
null char) to the end of the string pointed to by Destination.
|
|
|
|
This function is similar as strcat_s defined in C11.
|
|
|
|
If an error is returned, then the Destination is unmodified.
|
|
|
|
@param Destination A pointer to a Null-terminated Ascii string.
|
|
@param DestMax The maximum number of Destination Ascii
|
|
char, including terminating null char.
|
|
@param Source A pointer to a Null-terminated Ascii string.
|
|
|
|
@retval RETURN_SUCCESS String is appended.
|
|
@retval RETURN_BAD_BUFFER_SIZE If DestMax is NOT greater than
|
|
StrLen(Destination).
|
|
@retval RETURN_BUFFER_TOO_SMALL If (DestMax - StrLen(Destination)) is NOT
|
|
greater than StrLen(Source).
|
|
@retval RETURN_INVALID_PARAMETER If Destination is NULL.
|
|
If Source is NULL.
|
|
If PcdMaximumAsciiStringLength is not zero,
|
|
and DestMax is greater than
|
|
PcdMaximumAsciiStringLength.
|
|
If DestMax is 0.
|
|
@retval RETURN_ACCESS_DENIED If Source and Destination overlap.
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
AsciiStrCatS (
|
|
IN OUT CHAR8 *Destination,
|
|
IN UINTN DestMax,
|
|
IN CONST CHAR8 *Source
|
|
);
|
|
|
|
/**
|
|
Appends not more than Length successive char from the string pointed to by
|
|
Source to the end of the string pointed to by Destination. If no null char is
|
|
copied from Source, then Destination[StrLen(Destination) + Length] is always
|
|
set to null.
|
|
|
|
This function is similar as strncat_s defined in C11.
|
|
|
|
If an error is returned, then the Destination is unmodified.
|
|
|
|
@param Destination A pointer to a Null-terminated Ascii string.
|
|
@param DestMax The maximum number of Destination Ascii
|
|
char, including terminating null char.
|
|
@param Source A pointer to a Null-terminated Ascii string.
|
|
@param Length The maximum number of Ascii characters to copy.
|
|
|
|
@retval RETURN_SUCCESS String is appended.
|
|
@retval RETURN_BAD_BUFFER_SIZE If DestMax is NOT greater than
|
|
StrLen(Destination).
|
|
@retval RETURN_BUFFER_TOO_SMALL If (DestMax - StrLen(Destination)) is NOT
|
|
greater than MIN(StrLen(Source), Length).
|
|
@retval RETURN_INVALID_PARAMETER If Destination is NULL.
|
|
If Source is NULL.
|
|
If PcdMaximumAsciiStringLength is not zero,
|
|
and DestMax is greater than
|
|
PcdMaximumAsciiStringLength.
|
|
If DestMax is 0.
|
|
@retval RETURN_ACCESS_DENIED If Source and Destination overlap.
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
AsciiStrnCatS (
|
|
IN OUT CHAR8 *Destination,
|
|
IN UINTN DestMax,
|
|
IN CONST CHAR8 *Source,
|
|
IN UINTN Length
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated Ascii decimal string to a value of type UINTN.
|
|
|
|
This function outputs a value of type UINTN by interpreting the contents of
|
|
the Ascii string specified by String as a decimal number. The format of the
|
|
input Ascii string String is:
|
|
|
|
[spaces] [decimal digits].
|
|
|
|
The valid decimal digit character is in the range [0-9]. The function will
|
|
ignore the pad space, which includes spaces or tab characters, before
|
|
[decimal digits]. The running zero in the beginning of [decimal digits] will
|
|
be ignored. Then, the function stops at the first character that is a not a
|
|
valid decimal character or a Null-terminator, whichever one comes first.
|
|
|
|
If String has no valid decimal digits in the above format, then 0 is stored
|
|
at the location pointed to by Data.
|
|
If the number represented by String exceeds the range defined by UINTN, then
|
|
MAX_UINTN is stored at the location pointed to by Data.
|
|
|
|
If EndPointer is not NULL, a pointer to the character that stopped the scan
|
|
is stored at the location pointed to by EndPointer. If String has no valid
|
|
decimal digits right after the optional pad spaces, the value of String is
|
|
stored at the location pointed to by EndPointer.
|
|
|
|
@param String Pointer to a Null-terminated Ascii string.
|
|
@param EndPointer Pointer to character that stops scan.
|
|
@param Data Pointer to the converted value.
|
|
|
|
@retval RETURN_SUCCESS Value is translated from String.
|
|
@retval RETURN_INVALID_PARAMETER If String is NULL.
|
|
If Data is NULL.
|
|
If PcdMaximumAsciiStringLength is not zero,
|
|
and String contains more than
|
|
PcdMaximumAsciiStringLength Ascii
|
|
characters, not including the
|
|
Null-terminator.
|
|
@retval RETURN_UNSUPPORTED If the number represented by String exceeds
|
|
the range defined by UINTN.
|
|
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
AsciiStrDecimalToUintnS (
|
|
IN CONST CHAR8 *String,
|
|
OUT CHAR8 **EndPointer OPTIONAL,
|
|
OUT UINTN *Data
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated Ascii decimal string to a value of type UINT64.
|
|
|
|
This function outputs a value of type UINT64 by interpreting the contents of
|
|
the Ascii string specified by String as a decimal number. The format of the
|
|
input Ascii string String is:
|
|
|
|
[spaces] [decimal digits].
|
|
|
|
The valid decimal digit character is in the range [0-9]. The function will
|
|
ignore the pad space, which includes spaces or tab characters, before
|
|
[decimal digits]. The running zero in the beginning of [decimal digits] will
|
|
be ignored. Then, the function stops at the first character that is a not a
|
|
valid decimal character or a Null-terminator, whichever one comes first.
|
|
|
|
If String has no valid decimal digits in the above format, then 0 is stored
|
|
at the location pointed to by Data.
|
|
If the number represented by String exceeds the range defined by UINT64, then
|
|
MAX_UINT64 is stored at the location pointed to by Data.
|
|
|
|
If EndPointer is not NULL, a pointer to the character that stopped the scan
|
|
is stored at the location pointed to by EndPointer. If String has no valid
|
|
decimal digits right after the optional pad spaces, the value of String is
|
|
stored at the location pointed to by EndPointer.
|
|
|
|
@param String Pointer to a Null-terminated Ascii string.
|
|
@param EndPointer Pointer to character that stops scan.
|
|
@param Data Pointer to the converted value.
|
|
|
|
@retval RETURN_SUCCESS Value is translated from String.
|
|
@retval RETURN_INVALID_PARAMETER If String is NULL.
|
|
If Data is NULL.
|
|
If PcdMaximumAsciiStringLength is not zero,
|
|
and String contains more than
|
|
PcdMaximumAsciiStringLength Ascii
|
|
characters, not including the
|
|
Null-terminator.
|
|
@retval RETURN_UNSUPPORTED If the number represented by String exceeds
|
|
the range defined by UINT64.
|
|
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
AsciiStrDecimalToUint64S (
|
|
IN CONST CHAR8 *String,
|
|
OUT CHAR8 **EndPointer OPTIONAL,
|
|
OUT UINT64 *Data
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated Ascii hexadecimal string to a value of type UINTN.
|
|
|
|
This function outputs a value of type UINTN by interpreting the contents of
|
|
the Ascii string specified by String as a hexadecimal number. The format of
|
|
the input Ascii string String is:
|
|
|
|
[spaces][zeros][x][hexadecimal digits].
|
|
|
|
The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
|
|
The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If
|
|
"x" appears in the input string, it must be prefixed with at least one 0. The
|
|
function will ignore the pad space, which includes spaces or tab characters,
|
|
before [zeros], [x] or [hexadecimal digits]. The running zero before [x] or
|
|
[hexadecimal digits] will be ignored. Then, the decoding starts after [x] or
|
|
the first valid hexadecimal digit. Then, the function stops at the first
|
|
character that is a not a valid hexadecimal character or Null-terminator,
|
|
whichever on comes first.
|
|
|
|
If String has no valid hexadecimal digits in the above format, then 0 is
|
|
stored at the location pointed to by Data.
|
|
If the number represented by String exceeds the range defined by UINTN, then
|
|
MAX_UINTN is stored at the location pointed to by Data.
|
|
|
|
If EndPointer is not NULL, a pointer to the character that stopped the scan
|
|
is stored at the location pointed to by EndPointer. If String has no valid
|
|
hexadecimal digits right after the optional pad spaces, the value of String
|
|
is stored at the location pointed to by EndPointer.
|
|
|
|
@param String Pointer to a Null-terminated Ascii string.
|
|
@param EndPointer Pointer to character that stops scan.
|
|
@param Data Pointer to the converted value.
|
|
|
|
@retval RETURN_SUCCESS Value is translated from String.
|
|
@retval RETURN_INVALID_PARAMETER If String is NULL.
|
|
If Data is NULL.
|
|
If PcdMaximumAsciiStringLength is not zero,
|
|
and String contains more than
|
|
PcdMaximumAsciiStringLength Ascii
|
|
characters, not including the
|
|
Null-terminator.
|
|
@retval RETURN_UNSUPPORTED If the number represented by String exceeds
|
|
the range defined by UINTN.
|
|
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
AsciiStrHexToUintnS (
|
|
IN CONST CHAR8 *String,
|
|
OUT CHAR8 **EndPointer OPTIONAL,
|
|
OUT UINTN *Data
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated Ascii hexadecimal string to a value of type UINT64.
|
|
|
|
This function outputs a value of type UINT64 by interpreting the contents of
|
|
the Ascii string specified by String as a hexadecimal number. The format of
|
|
the input Ascii string String is:
|
|
|
|
[spaces][zeros][x][hexadecimal digits].
|
|
|
|
The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
|
|
The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If
|
|
"x" appears in the input string, it must be prefixed with at least one 0. The
|
|
function will ignore the pad space, which includes spaces or tab characters,
|
|
before [zeros], [x] or [hexadecimal digits]. The running zero before [x] or
|
|
[hexadecimal digits] will be ignored. Then, the decoding starts after [x] or
|
|
the first valid hexadecimal digit. Then, the function stops at the first
|
|
character that is a not a valid hexadecimal character or Null-terminator,
|
|
whichever on comes first.
|
|
|
|
If String has no valid hexadecimal digits in the above format, then 0 is
|
|
stored at the location pointed to by Data.
|
|
If the number represented by String exceeds the range defined by UINT64, then
|
|
MAX_UINT64 is stored at the location pointed to by Data.
|
|
|
|
If EndPointer is not NULL, a pointer to the character that stopped the scan
|
|
is stored at the location pointed to by EndPointer. If String has no valid
|
|
hexadecimal digits right after the optional pad spaces, the value of String
|
|
is stored at the location pointed to by EndPointer.
|
|
|
|
@param String Pointer to a Null-terminated Ascii string.
|
|
@param EndPointer Pointer to character that stops scan.
|
|
@param Data Pointer to the converted value.
|
|
|
|
@retval RETURN_SUCCESS Value is translated from String.
|
|
@retval RETURN_INVALID_PARAMETER If String is NULL.
|
|
If Data is NULL.
|
|
If PcdMaximumAsciiStringLength is not zero,
|
|
and String contains more than
|
|
PcdMaximumAsciiStringLength Ascii
|
|
characters, not including the
|
|
Null-terminator.
|
|
@retval RETURN_UNSUPPORTED If the number represented by String exceeds
|
|
the range defined by UINT64.
|
|
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
AsciiStrHexToUint64S (
|
|
IN CONST CHAR8 *String,
|
|
OUT CHAR8 **EndPointer OPTIONAL,
|
|
OUT UINT64 *Data
|
|
);
|
|
|
|
/**
|
|
Returns the length of a Null-terminated Unicode string.
|
|
|
|
This function returns the number of Unicode characters in the Null-terminated
|
|
Unicode string specified by String.
|
|
|
|
If String is NULL, then ASSERT().
|
|
If String is not aligned on a 16-bit boundary, then ASSERT().
|
|
If PcdMaximumUnicodeStringLength is not zero, and String contains more than
|
|
PcdMaximumUnicodeStringLength Unicode characters not including the
|
|
Null-terminator, then ASSERT().
|
|
|
|
@param String Pointer to a Null-terminated Unicode string.
|
|
|
|
@return The length of String.
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
StrLen (
|
|
IN CONST CHAR16 *String
|
|
);
|
|
|
|
/**
|
|
Returns the size of a Null-terminated Unicode string in bytes, including the
|
|
Null terminator.
|
|
|
|
This function returns the size, in bytes, of the Null-terminated Unicode string
|
|
specified by String.
|
|
|
|
If String is NULL, then ASSERT().
|
|
If String is not aligned on a 16-bit boundary, then ASSERT().
|
|
If PcdMaximumUnicodeStringLength is not zero, and String contains more than
|
|
PcdMaximumUnicodeStringLength Unicode characters not including the
|
|
Null-terminator, then ASSERT().
|
|
|
|
@param String The pointer to a Null-terminated Unicode string.
|
|
|
|
@return The size of String.
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
StrSize (
|
|
IN CONST CHAR16 *String
|
|
);
|
|
|
|
/**
|
|
Compares two Null-terminated Unicode strings, and returns the difference
|
|
between the first mismatched Unicode characters.
|
|
|
|
This function compares the Null-terminated Unicode string FirstString to the
|
|
Null-terminated Unicode string SecondString. If FirstString is identical to
|
|
SecondString, then 0 is returned. Otherwise, the value returned is the first
|
|
mismatched Unicode character in SecondString subtracted from the first
|
|
mismatched Unicode character in FirstString.
|
|
|
|
If FirstString is NULL, then ASSERT().
|
|
If FirstString is not aligned on a 16-bit boundary, then ASSERT().
|
|
If SecondString is NULL, then ASSERT().
|
|
If SecondString is not aligned on a 16-bit boundary, then ASSERT().
|
|
If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more
|
|
than PcdMaximumUnicodeStringLength Unicode characters not including the
|
|
Null-terminator, then ASSERT().
|
|
If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more
|
|
than PcdMaximumUnicodeStringLength Unicode characters, not including the
|
|
Null-terminator, then ASSERT().
|
|
|
|
@param FirstString The pointer to a Null-terminated Unicode string.
|
|
@param SecondString The pointer to a Null-terminated Unicode string.
|
|
|
|
@retval 0 FirstString is identical to SecondString.
|
|
@return others FirstString is not identical to SecondString.
|
|
|
|
**/
|
|
INTN
|
|
EFIAPI
|
|
StrCmp (
|
|
IN CONST CHAR16 *FirstString,
|
|
IN CONST CHAR16 *SecondString
|
|
);
|
|
|
|
/**
|
|
Compares up to a specified length the contents of two Null-terminated Unicode strings,
|
|
and returns the difference between the first mismatched Unicode characters.
|
|
|
|
This function compares the Null-terminated Unicode string FirstString to the
|
|
Null-terminated Unicode string SecondString. At most, Length Unicode
|
|
characters will be compared. If Length is 0, then 0 is returned. If
|
|
FirstString is identical to SecondString, then 0 is returned. Otherwise, the
|
|
value returned is the first mismatched Unicode character in SecondString
|
|
subtracted from the first mismatched Unicode character in FirstString.
|
|
|
|
If Length > 0 and FirstString is NULL, then ASSERT().
|
|
If Length > 0 and FirstString is not aligned on a 16-bit boundary, then ASSERT().
|
|
If Length > 0 and SecondString is NULL, then ASSERT().
|
|
If Length > 0 and SecondString is not aligned on a 16-bit boundary, then ASSERT().
|
|
If PcdMaximumUnicodeStringLength is not zero, and Length is greater than
|
|
PcdMaximumUnicodeStringLength, then ASSERT().
|
|
If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more than
|
|
PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator,
|
|
then ASSERT().
|
|
If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more than
|
|
PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator,
|
|
then ASSERT().
|
|
|
|
@param FirstString The pointer to a Null-terminated Unicode string.
|
|
@param SecondString The pointer to a Null-terminated Unicode string.
|
|
@param Length The maximum number of Unicode characters to compare.
|
|
|
|
@retval 0 FirstString is identical to SecondString.
|
|
@return others FirstString is not identical to SecondString.
|
|
|
|
**/
|
|
INTN
|
|
EFIAPI
|
|
StrnCmp (
|
|
IN CONST CHAR16 *FirstString,
|
|
IN CONST CHAR16 *SecondString,
|
|
IN UINTN Length
|
|
);
|
|
|
|
/**
|
|
Returns the first occurrence of a Null-terminated Unicode sub-string
|
|
in a Null-terminated Unicode string.
|
|
|
|
This function scans the contents of the Null-terminated Unicode string
|
|
specified by String and returns the first occurrence of SearchString.
|
|
If SearchString is not found in String, then NULL is returned. If
|
|
the length of SearchString is zero, then String is returned.
|
|
|
|
If String is NULL, then ASSERT().
|
|
If String is not aligned on a 16-bit boundary, then ASSERT().
|
|
If SearchString is NULL, then ASSERT().
|
|
If SearchString is not aligned on a 16-bit boundary, then ASSERT().
|
|
|
|
If PcdMaximumUnicodeStringLength is not zero, and SearchString
|
|
or String contains more than PcdMaximumUnicodeStringLength Unicode
|
|
characters, not including the Null-terminator, then ASSERT().
|
|
|
|
@param String The pointer to a Null-terminated Unicode string.
|
|
@param SearchString The pointer to a Null-terminated Unicode string to search for.
|
|
|
|
@retval NULL If the SearchString does not appear in String.
|
|
@return others If there is a match.
|
|
|
|
**/
|
|
CHAR16 *
|
|
EFIAPI
|
|
StrStr (
|
|
IN CONST CHAR16 *String,
|
|
IN CONST CHAR16 *SearchString
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated Unicode decimal string to a value of
|
|
type UINTN.
|
|
|
|
This function returns a value of type UINTN by interpreting the contents
|
|
of the Unicode string specified by String as a decimal number. The format
|
|
of the input Unicode string String is:
|
|
|
|
[spaces] [decimal digits].
|
|
|
|
The valid decimal digit character is in the range [0-9]. The
|
|
function will ignore the pad space, which includes spaces or
|
|
tab characters, before [decimal digits]. The running zero in the
|
|
beginning of [decimal digits] will be ignored. Then, the function
|
|
stops at the first character that is a not a valid decimal character
|
|
or a Null-terminator, whichever one comes first.
|
|
|
|
If String is NULL, then ASSERT().
|
|
If String is not aligned in a 16-bit boundary, then ASSERT().
|
|
If String has only pad spaces, then 0 is returned.
|
|
If String has no pad spaces or valid decimal digits,
|
|
then 0 is returned.
|
|
If the number represented by String overflows according
|
|
to the range defined by UINTN, then MAX_UINTN is returned.
|
|
|
|
If PcdMaximumUnicodeStringLength is not zero, and String contains
|
|
more than PcdMaximumUnicodeStringLength Unicode characters not including
|
|
the Null-terminator, then ASSERT().
|
|
|
|
@param String The pointer to a Null-terminated Unicode string.
|
|
|
|
@retval Value translated from String.
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
StrDecimalToUintn (
|
|
IN CONST CHAR16 *String
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated Unicode decimal string to a value of
|
|
type UINT64.
|
|
|
|
This function returns a value of type UINT64 by interpreting the contents
|
|
of the Unicode string specified by String as a decimal number. The format
|
|
of the input Unicode string String is:
|
|
|
|
[spaces] [decimal digits].
|
|
|
|
The valid decimal digit character is in the range [0-9]. The
|
|
function will ignore the pad space, which includes spaces or
|
|
tab characters, before [decimal digits]. The running zero in the
|
|
beginning of [decimal digits] will be ignored. Then, the function
|
|
stops at the first character that is a not a valid decimal character
|
|
or a Null-terminator, whichever one comes first.
|
|
|
|
If String is NULL, then ASSERT().
|
|
If String is not aligned in a 16-bit boundary, then ASSERT().
|
|
If String has only pad spaces, then 0 is returned.
|
|
If String has no pad spaces or valid decimal digits,
|
|
then 0 is returned.
|
|
If the number represented by String overflows according
|
|
to the range defined by UINT64, then MAX_UINT64 is returned.
|
|
|
|
If PcdMaximumUnicodeStringLength is not zero, and String contains
|
|
more than PcdMaximumUnicodeStringLength Unicode characters not including
|
|
the Null-terminator, then ASSERT().
|
|
|
|
@param String The pointer to a Null-terminated Unicode string.
|
|
|
|
@retval Value translated from String.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
StrDecimalToUint64 (
|
|
IN CONST CHAR16 *String
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated Unicode hexadecimal string to a value of type UINTN.
|
|
|
|
This function returns a value of type UINTN by interpreting the contents
|
|
of the Unicode string specified by String as a hexadecimal number.
|
|
The format of the input Unicode string String is:
|
|
|
|
[spaces][zeros][x][hexadecimal digits].
|
|
|
|
The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
|
|
The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.
|
|
If "x" appears in the input string, it must be prefixed with at least one 0.
|
|
The function will ignore the pad space, which includes spaces or tab characters,
|
|
before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or
|
|
[hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the
|
|
first valid hexadecimal digit. Then, the function stops at the first character
|
|
that is a not a valid hexadecimal character or NULL, whichever one comes first.
|
|
|
|
If String is NULL, then ASSERT().
|
|
If String is not aligned in a 16-bit boundary, then ASSERT().
|
|
If String has only pad spaces, then zero is returned.
|
|
If String has no leading pad spaces, leading zeros or valid hexadecimal digits,
|
|
then zero is returned.
|
|
If the number represented by String overflows according to the range defined by
|
|
UINTN, then MAX_UINTN is returned.
|
|
|
|
If PcdMaximumUnicodeStringLength is not zero, and String contains more than
|
|
PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator,
|
|
then ASSERT().
|
|
|
|
@param String The pointer to a Null-terminated Unicode string.
|
|
|
|
@retval Value translated from String.
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
StrHexToUintn (
|
|
IN CONST CHAR16 *String
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated Unicode hexadecimal string to a value of type UINT64.
|
|
|
|
This function returns a value of type UINT64 by interpreting the contents
|
|
of the Unicode string specified by String as a hexadecimal number.
|
|
The format of the input Unicode string String is
|
|
|
|
[spaces][zeros][x][hexadecimal digits].
|
|
|
|
The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
|
|
The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.
|
|
If "x" appears in the input string, it must be prefixed with at least one 0.
|
|
The function will ignore the pad space, which includes spaces or tab characters,
|
|
before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or
|
|
[hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the
|
|
first valid hexadecimal digit. Then, the function stops at the first character that is
|
|
a not a valid hexadecimal character or NULL, whichever one comes first.
|
|
|
|
If String is NULL, then ASSERT().
|
|
If String is not aligned in a 16-bit boundary, then ASSERT().
|
|
If String has only pad spaces, then zero is returned.
|
|
If String has no leading pad spaces, leading zeros or valid hexadecimal digits,
|
|
then zero is returned.
|
|
If the number represented by String overflows according to the range defined by
|
|
UINT64, then MAX_UINT64 is returned.
|
|
|
|
If PcdMaximumUnicodeStringLength is not zero, and String contains more than
|
|
PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator,
|
|
then ASSERT().
|
|
|
|
@param String The pointer to a Null-terminated Unicode string.
|
|
|
|
@retval Value translated from String.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
StrHexToUint64 (
|
|
IN CONST CHAR16 *String
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated Unicode string to IPv6 address and prefix length.
|
|
|
|
This function outputs a value of type IPv6_ADDRESS and may output a value
|
|
of type UINT8 by interpreting the contents of the Unicode string specified
|
|
by String. The format of the input Unicode string String is as follows:
|
|
|
|
X:X:X:X:X:X:X:X[/P]
|
|
|
|
X contains one to four hexadecimal digit characters in the range [0-9], [a-f] and
|
|
[A-F]. X is converted to a value of type UINT16, whose low byte is stored in low
|
|
memory address and high byte is stored in high memory address. P contains decimal
|
|
digit characters in the range [0-9]. The running zero in the beginning of P will
|
|
be ignored. /P is optional.
|
|
|
|
When /P is not in the String, the function stops at the first character that is
|
|
not a valid hexadecimal digit character after eight X's are converted.
|
|
|
|
When /P is in the String, the function stops at the first character that is not
|
|
a valid decimal digit character after P is converted.
|
|
|
|
"::" can be used to compress one or more groups of X when X contains only 0.
|
|
The "::" can only appear once in the String.
|
|
|
|
If String is not aligned in a 16-bit boundary, then ASSERT().
|
|
|
|
If EndPointer is not NULL and Address is translated from String, a pointer
|
|
to the character that stopped the scan is stored at the location pointed to
|
|
by EndPointer.
|
|
|
|
@param String Pointer to a Null-terminated Unicode string.
|
|
@param EndPointer Pointer to character that stops scan.
|
|
@param Address Pointer to the converted IPv6 address.
|
|
@param PrefixLength Pointer to the converted IPv6 address prefix
|
|
length. MAX_UINT8 is returned when /P is
|
|
not in the String.
|
|
|
|
@retval RETURN_SUCCESS Address is translated from String.
|
|
@retval RETURN_INVALID_PARAMETER If String is NULL.
|
|
If Data is NULL.
|
|
@retval RETURN_UNSUPPORTED If X contains more than four hexadecimal
|
|
digit characters.
|
|
If String contains "::" and number of X
|
|
is not less than 8.
|
|
If P starts with character that is not a
|
|
valid decimal digit character.
|
|
If the decimal number converted from P
|
|
exceeds 128.
|
|
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
StrToIpv6Address (
|
|
IN CONST CHAR16 *String,
|
|
OUT CHAR16 **EndPointer OPTIONAL,
|
|
OUT IPv6_ADDRESS *Address,
|
|
OUT UINT8 *PrefixLength OPTIONAL
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated Unicode string to IPv4 address and prefix length.
|
|
|
|
This function outputs a value of type IPv4_ADDRESS and may output a value
|
|
of type UINT8 by interpreting the contents of the Unicode string specified
|
|
by String. The format of the input Unicode string String is as follows:
|
|
|
|
D.D.D.D[/P]
|
|
|
|
D and P are decimal digit characters in the range [0-9]. The running zero in
|
|
the beginning of D and P will be ignored. /P is optional.
|
|
|
|
When /P is not in the String, the function stops at the first character that is
|
|
not a valid decimal digit character after four D's are converted.
|
|
|
|
When /P is in the String, the function stops at the first character that is not
|
|
a valid decimal digit character after P is converted.
|
|
|
|
If String is not aligned in a 16-bit boundary, then ASSERT().
|
|
|
|
If EndPointer is not NULL and Address is translated from String, a pointer
|
|
to the character that stopped the scan is stored at the location pointed to
|
|
by EndPointer.
|
|
|
|
@param String Pointer to a Null-terminated Unicode string.
|
|
@param EndPointer Pointer to character that stops scan.
|
|
@param Address Pointer to the converted IPv4 address.
|
|
@param PrefixLength Pointer to the converted IPv4 address prefix
|
|
length. MAX_UINT8 is returned when /P is
|
|
not in the String.
|
|
|
|
@retval RETURN_SUCCESS Address is translated from String.
|
|
@retval RETURN_INVALID_PARAMETER If String is NULL.
|
|
If Data is NULL.
|
|
@retval RETURN_UNSUPPORTED If String is not in the correct format.
|
|
If any decimal number converted from D
|
|
exceeds 255.
|
|
If the decimal number converted from P
|
|
exceeds 32.
|
|
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
StrToIpv4Address (
|
|
IN CONST CHAR16 *String,
|
|
OUT CHAR16 **EndPointer OPTIONAL,
|
|
OUT IPv4_ADDRESS *Address,
|
|
OUT UINT8 *PrefixLength OPTIONAL
|
|
);
|
|
|
|
#define GUID_STRING_LENGTH 36
|
|
|
|
/**
|
|
Convert a Null-terminated Unicode GUID string to a value of type
|
|
EFI_GUID.
|
|
|
|
This function outputs a GUID value by interpreting the contents of
|
|
the Unicode string specified by String. The format of the input
|
|
Unicode string String consists of 36 characters, as follows:
|
|
|
|
aabbccdd-eeff-gghh-iijj-kkllmmnnoopp
|
|
|
|
The pairs aa - pp are two characters in the range [0-9], [a-f] and
|
|
[A-F], with each pair representing a single byte hexadecimal value.
|
|
|
|
The mapping between String and the EFI_GUID structure is as follows:
|
|
aa Data1[24:31]
|
|
bb Data1[16:23]
|
|
cc Data1[8:15]
|
|
dd Data1[0:7]
|
|
ee Data2[8:15]
|
|
ff Data2[0:7]
|
|
gg Data3[8:15]
|
|
hh Data3[0:7]
|
|
ii Data4[0:7]
|
|
jj Data4[8:15]
|
|
kk Data4[16:23]
|
|
ll Data4[24:31]
|
|
mm Data4[32:39]
|
|
nn Data4[40:47]
|
|
oo Data4[48:55]
|
|
pp Data4[56:63]
|
|
|
|
If String is not aligned in a 16-bit boundary, then ASSERT().
|
|
|
|
@param String Pointer to a Null-terminated Unicode string.
|
|
@param Guid Pointer to the converted GUID.
|
|
|
|
@retval RETURN_SUCCESS Guid is translated from String.
|
|
@retval RETURN_INVALID_PARAMETER If String is NULL.
|
|
If Data is NULL.
|
|
@retval RETURN_UNSUPPORTED If String is not as the above format.
|
|
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
StrToGuid (
|
|
IN CONST CHAR16 *String,
|
|
OUT GUID *Guid
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated Unicode hexadecimal string to a byte array.
|
|
|
|
This function outputs a byte array by interpreting the contents of
|
|
the Unicode string specified by String in hexadecimal format. The format of
|
|
the input Unicode string String is:
|
|
|
|
[XX]*
|
|
|
|
X is a hexadecimal digit character in the range [0-9], [a-f] and [A-F].
|
|
The function decodes every two hexadecimal digit characters as one byte. The
|
|
decoding stops after Length of characters and outputs Buffer containing
|
|
(Length / 2) bytes.
|
|
|
|
If String is not aligned in a 16-bit boundary, then ASSERT().
|
|
|
|
@param String Pointer to a Null-terminated Unicode string.
|
|
@param Length The number of Unicode characters to decode.
|
|
@param Buffer Pointer to the converted bytes array.
|
|
@param MaxBufferSize The maximum size of Buffer.
|
|
|
|
@retval RETURN_SUCCESS Buffer is translated from String.
|
|
@retval RETURN_INVALID_PARAMETER If String is NULL.
|
|
If Data is NULL.
|
|
If Length is not multiple of 2.
|
|
If PcdMaximumUnicodeStringLength is not zero,
|
|
and Length is greater than
|
|
PcdMaximumUnicodeStringLength.
|
|
@retval RETURN_UNSUPPORTED If Length of characters from String contain
|
|
a character that is not valid hexadecimal
|
|
digit characters, or a Null-terminator.
|
|
@retval RETURN_BUFFER_TOO_SMALL If MaxBufferSize is less than (Length / 2).
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
StrHexToBytes (
|
|
IN CONST CHAR16 *String,
|
|
IN UINTN Length,
|
|
OUT UINT8 *Buffer,
|
|
IN UINTN MaxBufferSize
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated Unicode string to a Null-terminated
|
|
ASCII string.
|
|
|
|
This function is similar to AsciiStrCpyS.
|
|
|
|
This function converts the content of the Unicode string Source
|
|
to the ASCII string Destination by copying the lower 8 bits of
|
|
each Unicode character. The function terminates the ASCII string
|
|
Destination by appending a Null-terminator character at the end.
|
|
|
|
The caller is responsible to make sure Destination points to a buffer with size
|
|
equal or greater than ((StrLen (Source) + 1) * sizeof (CHAR8)) in bytes.
|
|
|
|
If any Unicode characters in Source contain non-zero value in
|
|
the upper 8 bits, then ASSERT().
|
|
|
|
If Source is not aligned on a 16-bit boundary, then ASSERT().
|
|
|
|
If an error is returned, then the Destination is unmodified.
|
|
|
|
@param Source The pointer to a Null-terminated Unicode string.
|
|
@param Destination The pointer to a Null-terminated ASCII string.
|
|
@param DestMax The maximum number of Destination Ascii
|
|
char, including terminating null char.
|
|
|
|
@retval RETURN_SUCCESS String is converted.
|
|
@retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than StrLen(Source).
|
|
@retval RETURN_INVALID_PARAMETER If Destination is NULL.
|
|
If Source is NULL.
|
|
If PcdMaximumAsciiStringLength is not zero,
|
|
and DestMax is greater than
|
|
PcdMaximumAsciiStringLength.
|
|
If PcdMaximumUnicodeStringLength is not zero,
|
|
and DestMax is greater than
|
|
PcdMaximumUnicodeStringLength.
|
|
If DestMax is 0.
|
|
@retval RETURN_ACCESS_DENIED If Source and Destination overlap.
|
|
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
UnicodeStrToAsciiStrS (
|
|
IN CONST CHAR16 *Source,
|
|
OUT CHAR8 *Destination,
|
|
IN UINTN DestMax
|
|
);
|
|
|
|
/**
|
|
Convert not more than Length successive characters from a Null-terminated
|
|
Unicode string to a Null-terminated Ascii string. If no null char is copied
|
|
from Source, then Destination[Length] is always set to null.
|
|
|
|
This function converts not more than Length successive characters from the
|
|
Unicode string Source to the Ascii string Destination by copying the lower 8
|
|
bits of each Unicode character. The function terminates the Ascii string
|
|
Destination by appending a Null-terminator character at the end.
|
|
|
|
The caller is responsible to make sure Destination points to a buffer with size
|
|
equal or greater than ((StrLen (Source) + 1) * sizeof (CHAR8)) in bytes.
|
|
|
|
If any Unicode characters in Source contain non-zero value in the upper 8
|
|
bits, then ASSERT().
|
|
If Source is not aligned on a 16-bit boundary, then ASSERT().
|
|
|
|
If an error is returned, then the Destination is unmodified.
|
|
|
|
@param Source The pointer to a Null-terminated Unicode string.
|
|
@param Length The maximum number of Unicode characters to
|
|
convert.
|
|
@param Destination The pointer to a Null-terminated Ascii string.
|
|
@param DestMax The maximum number of Destination Ascii
|
|
char, including terminating null char.
|
|
@param DestinationLength The number of Unicode characters converted.
|
|
|
|
@retval RETURN_SUCCESS String is converted.
|
|
@retval RETURN_INVALID_PARAMETER If Destination is NULL.
|
|
If Source is NULL.
|
|
If DestinationLength is NULL.
|
|
If PcdMaximumAsciiStringLength is not zero,
|
|
and Length or DestMax is greater than
|
|
PcdMaximumAsciiStringLength.
|
|
If PcdMaximumUnicodeStringLength is not
|
|
zero, and Length or DestMax is greater than
|
|
PcdMaximumUnicodeStringLength.
|
|
If DestMax is 0.
|
|
@retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than
|
|
MIN(StrLen(Source), Length).
|
|
@retval RETURN_ACCESS_DENIED If Source and Destination overlap.
|
|
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
UnicodeStrnToAsciiStrS (
|
|
IN CONST CHAR16 *Source,
|
|
IN UINTN Length,
|
|
OUT CHAR8 *Destination,
|
|
IN UINTN DestMax,
|
|
OUT UINTN *DestinationLength
|
|
);
|
|
|
|
/**
|
|
Returns the length of a Null-terminated ASCII string.
|
|
|
|
This function returns the number of ASCII characters in the Null-terminated
|
|
ASCII string specified by String.
|
|
|
|
If Length > 0 and Destination is NULL, then ASSERT().
|
|
If Length > 0 and Source is NULL, then ASSERT().
|
|
If PcdMaximumAsciiStringLength is not zero and String contains more than
|
|
PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
|
|
then ASSERT().
|
|
|
|
@param String The pointer to a Null-terminated ASCII string.
|
|
|
|
@return The length of String.
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsciiStrLen (
|
|
IN CONST CHAR8 *String
|
|
);
|
|
|
|
/**
|
|
Returns the size of a Null-terminated ASCII string in bytes, including the
|
|
Null terminator.
|
|
|
|
This function returns the size, in bytes, of the Null-terminated ASCII string
|
|
specified by String.
|
|
|
|
If String is NULL, then ASSERT().
|
|
If PcdMaximumAsciiStringLength is not zero and String contains more than
|
|
PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
|
|
then ASSERT().
|
|
|
|
@param String The pointer to a Null-terminated ASCII string.
|
|
|
|
@return The size of String.
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsciiStrSize (
|
|
IN CONST CHAR8 *String
|
|
);
|
|
|
|
/**
|
|
Compares two Null-terminated ASCII strings, and returns the difference
|
|
between the first mismatched ASCII characters.
|
|
|
|
This function compares the Null-terminated ASCII string FirstString to the
|
|
Null-terminated ASCII string SecondString. If FirstString is identical to
|
|
SecondString, then 0 is returned. Otherwise, the value returned is the first
|
|
mismatched ASCII character in SecondString subtracted from the first
|
|
mismatched ASCII character in FirstString.
|
|
|
|
If FirstString is NULL, then ASSERT().
|
|
If SecondString is NULL, then ASSERT().
|
|
If PcdMaximumAsciiStringLength is not zero and FirstString contains more than
|
|
PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
|
|
then ASSERT().
|
|
If PcdMaximumAsciiStringLength is not zero and SecondString contains more
|
|
than PcdMaximumAsciiStringLength ASCII characters not including the
|
|
Null-terminator, then ASSERT().
|
|
|
|
@param FirstString The pointer to a Null-terminated ASCII string.
|
|
@param SecondString The pointer to a Null-terminated ASCII string.
|
|
|
|
@retval ==0 FirstString is identical to SecondString.
|
|
@retval !=0 FirstString is not identical to SecondString.
|
|
|
|
**/
|
|
INTN
|
|
EFIAPI
|
|
AsciiStrCmp (
|
|
IN CONST CHAR8 *FirstString,
|
|
IN CONST CHAR8 *SecondString
|
|
);
|
|
|
|
/**
|
|
Performs a case insensitive comparison of two Null-terminated ASCII strings,
|
|
and returns the difference between the first mismatched ASCII characters.
|
|
|
|
This function performs a case insensitive comparison of the Null-terminated
|
|
ASCII string FirstString to the Null-terminated ASCII string SecondString. If
|
|
FirstString is identical to SecondString, then 0 is returned. Otherwise, the
|
|
value returned is the first mismatched lower case ASCII character in
|
|
SecondString subtracted from the first mismatched lower case ASCII character
|
|
in FirstString.
|
|
|
|
If FirstString is NULL, then ASSERT().
|
|
If SecondString is NULL, then ASSERT().
|
|
If PcdMaximumAsciiStringLength is not zero and FirstString contains more than
|
|
PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
|
|
then ASSERT().
|
|
If PcdMaximumAsciiStringLength is not zero and SecondString contains more
|
|
than PcdMaximumAsciiStringLength ASCII characters not including the
|
|
Null-terminator, then ASSERT().
|
|
|
|
@param FirstString The pointer to a Null-terminated ASCII string.
|
|
@param SecondString The pointer to a Null-terminated ASCII string.
|
|
|
|
@retval ==0 FirstString is identical to SecondString using case insensitive
|
|
comparisons.
|
|
@retval !=0 FirstString is not identical to SecondString using case
|
|
insensitive comparisons.
|
|
|
|
**/
|
|
INTN
|
|
EFIAPI
|
|
AsciiStriCmp (
|
|
IN CONST CHAR8 *FirstString,
|
|
IN CONST CHAR8 *SecondString
|
|
);
|
|
|
|
/**
|
|
Compares two Null-terminated ASCII strings with maximum lengths, and returns
|
|
the difference between the first mismatched ASCII characters.
|
|
|
|
This function compares the Null-terminated ASCII string FirstString to the
|
|
Null-terminated ASCII string SecondString. At most, Length ASCII characters
|
|
will be compared. If Length is 0, then 0 is returned. If FirstString is
|
|
identical to SecondString, then 0 is returned. Otherwise, the value returned
|
|
is the first mismatched ASCII character in SecondString subtracted from the
|
|
first mismatched ASCII character in FirstString.
|
|
|
|
If Length > 0 and FirstString is NULL, then ASSERT().
|
|
If Length > 0 and SecondString is NULL, then ASSERT().
|
|
If PcdMaximumAsciiStringLength is not zero, and Length is greater than
|
|
PcdMaximumAsciiStringLength, then ASSERT().
|
|
If PcdMaximumAsciiStringLength is not zero, and FirstString contains more than
|
|
PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,
|
|
then ASSERT().
|
|
If PcdMaximumAsciiStringLength is not zero, and SecondString contains more than
|
|
PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,
|
|
then ASSERT().
|
|
|
|
@param FirstString The pointer to a Null-terminated ASCII string.
|
|
@param SecondString The pointer to a Null-terminated ASCII string.
|
|
@param Length The maximum number of ASCII characters for compare.
|
|
|
|
@retval ==0 FirstString is identical to SecondString.
|
|
@retval !=0 FirstString is not identical to SecondString.
|
|
|
|
**/
|
|
INTN
|
|
EFIAPI
|
|
AsciiStrnCmp (
|
|
IN CONST CHAR8 *FirstString,
|
|
IN CONST CHAR8 *SecondString,
|
|
IN UINTN Length
|
|
);
|
|
|
|
/**
|
|
Returns the first occurrence of a Null-terminated ASCII sub-string
|
|
in a Null-terminated ASCII string.
|
|
|
|
This function scans the contents of the ASCII string specified by String
|
|
and returns the first occurrence of SearchString. If SearchString is not
|
|
found in String, then NULL is returned. If the length of SearchString is zero,
|
|
then String is returned.
|
|
|
|
If String is NULL, then ASSERT().
|
|
If SearchString is NULL, then ASSERT().
|
|
|
|
If PcdMaximumAsciiStringLength is not zero, and SearchString or
|
|
String contains more than PcdMaximumAsciiStringLength Unicode characters
|
|
not including the Null-terminator, then ASSERT().
|
|
|
|
@param String The pointer to a Null-terminated ASCII string.
|
|
@param SearchString The pointer to a Null-terminated ASCII string to search for.
|
|
|
|
@retval NULL If the SearchString does not appear in String.
|
|
@retval others If there is a match return the first occurrence of SearchingString.
|
|
If the length of SearchString is zero,return String.
|
|
|
|
**/
|
|
CHAR8 *
|
|
EFIAPI
|
|
AsciiStrStr (
|
|
IN CONST CHAR8 *String,
|
|
IN CONST CHAR8 *SearchString
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated ASCII decimal string to a value of type
|
|
UINTN.
|
|
|
|
This function returns a value of type UINTN by interpreting the contents
|
|
of the ASCII string String as a decimal number. The format of the input
|
|
ASCII string String is:
|
|
|
|
[spaces] [decimal digits].
|
|
|
|
The valid decimal digit character is in the range [0-9]. The function will
|
|
ignore the pad space, which includes spaces or tab characters, before the digits.
|
|
The running zero in the beginning of [decimal digits] will be ignored. Then, the
|
|
function stops at the first character that is a not a valid decimal character or
|
|
Null-terminator, whichever on comes first.
|
|
|
|
If String has only pad spaces, then 0 is returned.
|
|
If String has no pad spaces or valid decimal digits, then 0 is returned.
|
|
If the number represented by String overflows according to the range defined by
|
|
UINTN, then MAX_UINTN is returned.
|
|
If String is NULL, then ASSERT().
|
|
If PcdMaximumAsciiStringLength is not zero, and String contains more than
|
|
PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
|
|
then ASSERT().
|
|
|
|
@param String The pointer to a Null-terminated ASCII string.
|
|
|
|
@retval The value translated from String.
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsciiStrDecimalToUintn (
|
|
IN CONST CHAR8 *String
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated ASCII decimal string to a value of type
|
|
UINT64.
|
|
|
|
This function returns a value of type UINT64 by interpreting the contents
|
|
of the ASCII string String as a decimal number. The format of the input
|
|
ASCII string String is:
|
|
|
|
[spaces] [decimal digits].
|
|
|
|
The valid decimal digit character is in the range [0-9]. The function will
|
|
ignore the pad space, which includes spaces or tab characters, before the digits.
|
|
The running zero in the beginning of [decimal digits] will be ignored. Then, the
|
|
function stops at the first character that is a not a valid decimal character or
|
|
Null-terminator, whichever on comes first.
|
|
|
|
If String has only pad spaces, then 0 is returned.
|
|
If String has no pad spaces or valid decimal digits, then 0 is returned.
|
|
If the number represented by String overflows according to the range defined by
|
|
UINT64, then MAX_UINT64 is returned.
|
|
If String is NULL, then ASSERT().
|
|
If PcdMaximumAsciiStringLength is not zero, and String contains more than
|
|
PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
|
|
then ASSERT().
|
|
|
|
@param String The pointer to a Null-terminated ASCII string.
|
|
|
|
@retval Value translated from String.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsciiStrDecimalToUint64 (
|
|
IN CONST CHAR8 *String
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated ASCII hexadecimal string to a value of type UINTN.
|
|
|
|
This function returns a value of type UINTN by interpreting the contents of
|
|
the ASCII string String as a hexadecimal number. The format of the input ASCII
|
|
string String is:
|
|
|
|
[spaces][zeros][x][hexadecimal digits].
|
|
|
|
The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
|
|
The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x"
|
|
appears in the input string, it must be prefixed with at least one 0. The function
|
|
will ignore the pad space, which includes spaces or tab characters, before [zeros],
|
|
[x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits]
|
|
will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal
|
|
digit. Then, the function stops at the first character that is a not a valid
|
|
hexadecimal character or Null-terminator, whichever on comes first.
|
|
|
|
If String has only pad spaces, then 0 is returned.
|
|
If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then
|
|
0 is returned.
|
|
|
|
If the number represented by String overflows according to the range defined by UINTN,
|
|
then MAX_UINTN is returned.
|
|
If String is NULL, then ASSERT().
|
|
If PcdMaximumAsciiStringLength is not zero,
|
|
and String contains more than PcdMaximumAsciiStringLength ASCII characters not including
|
|
the Null-terminator, then ASSERT().
|
|
|
|
@param String The pointer to a Null-terminated ASCII string.
|
|
|
|
@retval Value translated from String.
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsciiStrHexToUintn (
|
|
IN CONST CHAR8 *String
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated ASCII hexadecimal string to a value of type UINT64.
|
|
|
|
This function returns a value of type UINT64 by interpreting the contents of
|
|
the ASCII string String as a hexadecimal number. The format of the input ASCII
|
|
string String is:
|
|
|
|
[spaces][zeros][x][hexadecimal digits].
|
|
|
|
The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
|
|
The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x"
|
|
appears in the input string, it must be prefixed with at least one 0. The function
|
|
will ignore the pad space, which includes spaces or tab characters, before [zeros],
|
|
[x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits]
|
|
will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal
|
|
digit. Then, the function stops at the first character that is a not a valid
|
|
hexadecimal character or Null-terminator, whichever on comes first.
|
|
|
|
If String has only pad spaces, then 0 is returned.
|
|
If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then
|
|
0 is returned.
|
|
|
|
If the number represented by String overflows according to the range defined by UINT64,
|
|
then MAX_UINT64 is returned.
|
|
If String is NULL, then ASSERT().
|
|
If PcdMaximumAsciiStringLength is not zero,
|
|
and String contains more than PcdMaximumAsciiStringLength ASCII characters not including
|
|
the Null-terminator, then ASSERT().
|
|
|
|
@param String The pointer to a Null-terminated ASCII string.
|
|
|
|
@retval Value translated from String.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsciiStrHexToUint64 (
|
|
IN CONST CHAR8 *String
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated ASCII string to IPv6 address and prefix length.
|
|
|
|
This function outputs a value of type IPv6_ADDRESS and may output a value
|
|
of type UINT8 by interpreting the contents of the ASCII string specified
|
|
by String. The format of the input ASCII string String is as follows:
|
|
|
|
X:X:X:X:X:X:X:X[/P]
|
|
|
|
X contains one to four hexadecimal digit characters in the range [0-9], [a-f] and
|
|
[A-F]. X is converted to a value of type UINT16, whose low byte is stored in low
|
|
memory address and high byte is stored in high memory address. P contains decimal
|
|
digit characters in the range [0-9]. The running zero in the beginning of P will
|
|
be ignored. /P is optional.
|
|
|
|
When /P is not in the String, the function stops at the first character that is
|
|
not a valid hexadecimal digit character after eight X's are converted.
|
|
|
|
When /P is in the String, the function stops at the first character that is not
|
|
a valid decimal digit character after P is converted.
|
|
|
|
"::" can be used to compress one or more groups of X when X contains only 0.
|
|
The "::" can only appear once in the String.
|
|
|
|
If EndPointer is not NULL and Address is translated from String, a pointer
|
|
to the character that stopped the scan is stored at the location pointed to
|
|
by EndPointer.
|
|
|
|
@param String Pointer to a Null-terminated ASCII string.
|
|
@param EndPointer Pointer to character that stops scan.
|
|
@param Address Pointer to the converted IPv6 address.
|
|
@param PrefixLength Pointer to the converted IPv6 address prefix
|
|
length. MAX_UINT8 is returned when /P is
|
|
not in the String.
|
|
|
|
@retval RETURN_SUCCESS Address is translated from String.
|
|
@retval RETURN_INVALID_PARAMETER If String is NULL.
|
|
If Data is NULL.
|
|
@retval RETURN_UNSUPPORTED If X contains more than four hexadecimal
|
|
digit characters.
|
|
If String contains "::" and number of X
|
|
is not less than 8.
|
|
If P starts with character that is not a
|
|
valid decimal digit character.
|
|
If the decimal number converted from P
|
|
exceeds 128.
|
|
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
AsciiStrToIpv6Address (
|
|
IN CONST CHAR8 *String,
|
|
OUT CHAR8 **EndPointer OPTIONAL,
|
|
OUT IPv6_ADDRESS *Address,
|
|
OUT UINT8 *PrefixLength OPTIONAL
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated ASCII string to IPv4 address and prefix length.
|
|
|
|
This function outputs a value of type IPv4_ADDRESS and may output a value
|
|
of type UINT8 by interpreting the contents of the ASCII string specified
|
|
by String. The format of the input ASCII string String is as follows:
|
|
|
|
D.D.D.D[/P]
|
|
|
|
D and P are decimal digit characters in the range [0-9]. The running zero in
|
|
the beginning of D and P will be ignored. /P is optional.
|
|
|
|
When /P is not in the String, the function stops at the first character that is
|
|
not a valid decimal digit character after four D's are converted.
|
|
|
|
When /P is in the String, the function stops at the first character that is not
|
|
a valid decimal digit character after P is converted.
|
|
|
|
If EndPointer is not NULL and Address is translated from String, a pointer
|
|
to the character that stopped the scan is stored at the location pointed to
|
|
by EndPointer.
|
|
|
|
@param String Pointer to a Null-terminated ASCII string.
|
|
@param EndPointer Pointer to character that stops scan.
|
|
@param Address Pointer to the converted IPv4 address.
|
|
@param PrefixLength Pointer to the converted IPv4 address prefix
|
|
length. MAX_UINT8 is returned when /P is
|
|
not in the String.
|
|
|
|
@retval RETURN_SUCCESS Address is translated from String.
|
|
@retval RETURN_INVALID_PARAMETER If String is NULL.
|
|
If Data is NULL.
|
|
@retval RETURN_UNSUPPORTED If String is not in the correct format.
|
|
If any decimal number converted from D
|
|
exceeds 255.
|
|
If the decimal number converted from P
|
|
exceeds 32.
|
|
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
AsciiStrToIpv4Address (
|
|
IN CONST CHAR8 *String,
|
|
OUT CHAR8 **EndPointer OPTIONAL,
|
|
OUT IPv4_ADDRESS *Address,
|
|
OUT UINT8 *PrefixLength OPTIONAL
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated ASCII GUID string to a value of type
|
|
EFI_GUID.
|
|
|
|
This function outputs a GUID value by interpreting the contents of
|
|
the ASCII string specified by String. The format of the input
|
|
ASCII string String consists of 36 characters, as follows:
|
|
|
|
aabbccdd-eeff-gghh-iijj-kkllmmnnoopp
|
|
|
|
The pairs aa - pp are two characters in the range [0-9], [a-f] and
|
|
[A-F], with each pair representing a single byte hexadecimal value.
|
|
|
|
The mapping between String and the EFI_GUID structure is as follows:
|
|
aa Data1[24:31]
|
|
bb Data1[16:23]
|
|
cc Data1[8:15]
|
|
dd Data1[0:7]
|
|
ee Data2[8:15]
|
|
ff Data2[0:7]
|
|
gg Data3[8:15]
|
|
hh Data3[0:7]
|
|
ii Data4[0:7]
|
|
jj Data4[8:15]
|
|
kk Data4[16:23]
|
|
ll Data4[24:31]
|
|
mm Data4[32:39]
|
|
nn Data4[40:47]
|
|
oo Data4[48:55]
|
|
pp Data4[56:63]
|
|
|
|
@param String Pointer to a Null-terminated ASCII string.
|
|
@param Guid Pointer to the converted GUID.
|
|
|
|
@retval RETURN_SUCCESS Guid is translated from String.
|
|
@retval RETURN_INVALID_PARAMETER If String is NULL.
|
|
If Data is NULL.
|
|
@retval RETURN_UNSUPPORTED If String is not as the above format.
|
|
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
AsciiStrToGuid (
|
|
IN CONST CHAR8 *String,
|
|
OUT GUID *Guid
|
|
);
|
|
|
|
/**
|
|
Convert a Null-terminated ASCII hexadecimal string to a byte array.
|
|
|
|
This function outputs a byte array by interpreting the contents of
|
|
the ASCII string specified by String in hexadecimal format. The format of
|
|
the input ASCII string String is:
|
|
|
|
[XX]*
|
|
|
|
X is a hexadecimal digit character in the range [0-9], [a-f] and [A-F].
|
|
The function decodes every two hexadecimal digit characters as one byte. The
|
|
decoding stops after Length of characters and outputs Buffer containing
|
|
(Length / 2) bytes.
|
|
|
|
@param String Pointer to a Null-terminated ASCII string.
|
|
@param Length The number of ASCII characters to decode.
|
|
@param Buffer Pointer to the converted bytes array.
|
|
@param MaxBufferSize The maximum size of Buffer.
|
|
|
|
@retval RETURN_SUCCESS Buffer is translated from String.
|
|
@retval RETURN_INVALID_PARAMETER If String is NULL.
|
|
If Data is NULL.
|
|
If Length is not multiple of 2.
|
|
If PcdMaximumAsciiStringLength is not zero,
|
|
and Length is greater than
|
|
PcdMaximumAsciiStringLength.
|
|
@retval RETURN_UNSUPPORTED If Length of characters from String contain
|
|
a character that is not valid hexadecimal
|
|
digit characters, or a Null-terminator.
|
|
@retval RETURN_BUFFER_TOO_SMALL If MaxBufferSize is less than (Length / 2).
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
AsciiStrHexToBytes (
|
|
IN CONST CHAR8 *String,
|
|
IN UINTN Length,
|
|
OUT UINT8 *Buffer,
|
|
IN UINTN MaxBufferSize
|
|
);
|
|
|
|
/**
|
|
Convert one Null-terminated ASCII string to a Null-terminated
|
|
Unicode string.
|
|
|
|
This function is similar to StrCpyS.
|
|
|
|
This function converts the contents of the ASCII string Source to the Unicode
|
|
string Destination. The function terminates the Unicode string Destination by
|
|
appending a Null-terminator character at the end.
|
|
|
|
The caller is responsible to make sure Destination points to a buffer with size
|
|
equal or greater than ((AsciiStrLen (Source) + 1) * sizeof (CHAR16)) in bytes.
|
|
|
|
If Destination is not aligned on a 16-bit boundary, then ASSERT().
|
|
|
|
If an error is returned, then the Destination is unmodified.
|
|
|
|
@param Source The pointer to a Null-terminated ASCII string.
|
|
@param Destination The pointer to a Null-terminated Unicode string.
|
|
@param DestMax The maximum number of Destination Unicode
|
|
char, including terminating null char.
|
|
|
|
@retval RETURN_SUCCESS String is converted.
|
|
@retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than StrLen(Source).
|
|
@retval RETURN_INVALID_PARAMETER If Destination is NULL.
|
|
If Source is NULL.
|
|
If PcdMaximumUnicodeStringLength is not zero,
|
|
and DestMax is greater than
|
|
PcdMaximumUnicodeStringLength.
|
|
If PcdMaximumAsciiStringLength is not zero,
|
|
and DestMax is greater than
|
|
PcdMaximumAsciiStringLength.
|
|
If DestMax is 0.
|
|
@retval RETURN_ACCESS_DENIED If Source and Destination overlap.
|
|
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
AsciiStrToUnicodeStrS (
|
|
IN CONST CHAR8 *Source,
|
|
OUT CHAR16 *Destination,
|
|
IN UINTN DestMax
|
|
);
|
|
|
|
/**
|
|
Convert not more than Length successive characters from a Null-terminated
|
|
Ascii string to a Null-terminated Unicode string. If no null char is copied
|
|
from Source, then Destination[Length] is always set to null.
|
|
|
|
This function converts not more than Length successive characters from the
|
|
Ascii string Source to the Unicode string Destination. The function
|
|
terminates the Unicode string Destination by appending a Null-terminator
|
|
character at the end.
|
|
|
|
The caller is responsible to make sure Destination points to a buffer with
|
|
size not smaller than
|
|
((MIN(AsciiStrLen(Source), Length) + 1) * sizeof (CHAR8)) in bytes.
|
|
|
|
If Destination is not aligned on a 16-bit boundary, then ASSERT().
|
|
|
|
If an error is returned, then Destination and DestinationLength are
|
|
unmodified.
|
|
|
|
@param Source The pointer to a Null-terminated Ascii string.
|
|
@param Length The maximum number of Ascii characters to convert.
|
|
@param Destination The pointer to a Null-terminated Unicode string.
|
|
@param DestMax The maximum number of Destination Unicode char,
|
|
including terminating null char.
|
|
@param DestinationLength The number of Ascii characters converted.
|
|
|
|
@retval RETURN_SUCCESS String is converted.
|
|
@retval RETURN_INVALID_PARAMETER If Destination is NULL.
|
|
If Source is NULL.
|
|
If DestinationLength is NULL.
|
|
If PcdMaximumUnicodeStringLength is not
|
|
zero, and Length or DestMax is greater than
|
|
PcdMaximumUnicodeStringLength.
|
|
If PcdMaximumAsciiStringLength is not zero,
|
|
and Length or DestMax is greater than
|
|
PcdMaximumAsciiStringLength.
|
|
If DestMax is 0.
|
|
@retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than
|
|
MIN(AsciiStrLen(Source), Length).
|
|
@retval RETURN_ACCESS_DENIED If Source and Destination overlap.
|
|
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
AsciiStrnToUnicodeStrS (
|
|
IN CONST CHAR8 *Source,
|
|
IN UINTN Length,
|
|
OUT CHAR16 *Destination,
|
|
IN UINTN DestMax,
|
|
OUT UINTN *DestinationLength
|
|
);
|
|
|
|
/**
|
|
Convert a Unicode character to upper case only if
|
|
it maps to a valid small-case ASCII character.
|
|
|
|
This internal function only deal with Unicode character
|
|
which maps to a valid small-case ASCII character, i.e.
|
|
L'a' to L'z'. For other Unicode character, the input character
|
|
is returned directly.
|
|
|
|
@param Char The character to convert.
|
|
|
|
@retval LowerCharacter If the Char is with range L'a' to L'z'.
|
|
@retval Unchanged Otherwise.
|
|
|
|
**/
|
|
CHAR16
|
|
EFIAPI
|
|
CharToUpper (
|
|
IN CHAR16 Char
|
|
);
|
|
|
|
/**
|
|
Converts a lowercase Ascii character to upper one.
|
|
|
|
If Chr is lowercase Ascii character, then converts it to upper one.
|
|
|
|
If Value >= 0xA0, then ASSERT().
|
|
If (Value & 0x0F) >= 0x0A, then ASSERT().
|
|
|
|
@param Chr one Ascii character
|
|
|
|
@return The uppercase value of Ascii character
|
|
|
|
**/
|
|
CHAR8
|
|
EFIAPI
|
|
AsciiCharToUpper (
|
|
IN CHAR8 Chr
|
|
);
|
|
|
|
/**
|
|
Convert binary data to a Base64 encoded ascii string based on RFC4648.
|
|
|
|
Produce a Null-terminated Ascii string in the output buffer specified by Destination and DestinationSize.
|
|
The Ascii string is produced by converting the data string specified by Source and SourceLength.
|
|
|
|
@param Source Input UINT8 data
|
|
@param SourceLength Number of UINT8 bytes of data
|
|
@param Destination Pointer to output string buffer
|
|
@param DestinationSize Size of ascii buffer. Set to 0 to get the size needed.
|
|
Caller is responsible for passing in buffer of DestinationSize
|
|
|
|
@retval RETURN_SUCCESS When ascii buffer is filled in.
|
|
@retval RETURN_INVALID_PARAMETER If Source is NULL or DestinationSize is NULL.
|
|
@retval RETURN_INVALID_PARAMETER If SourceLength or DestinationSize is bigger than (MAX_ADDRESS - (UINTN)Destination).
|
|
@retval RETURN_BUFFER_TOO_SMALL If SourceLength is 0 and DestinationSize is <1.
|
|
@retval RETURN_BUFFER_TOO_SMALL If Destination is NULL or DestinationSize is smaller than required buffersize.
|
|
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
Base64Encode (
|
|
IN CONST UINT8 *Source,
|
|
IN UINTN SourceLength,
|
|
OUT CHAR8 *Destination OPTIONAL,
|
|
IN OUT UINTN *DestinationSize
|
|
);
|
|
|
|
/**
|
|
Decode Base64 ASCII encoded data to 8-bit binary representation, based on
|
|
RFC4648.
|
|
|
|
Decoding occurs according to "Table 1: The Base 64 Alphabet" in RFC4648.
|
|
|
|
Whitespace is ignored at all positions:
|
|
- 0x09 ('\t') horizontal tab
|
|
- 0x0A ('\n') new line
|
|
- 0x0B ('\v') vertical tab
|
|
- 0x0C ('\f') form feed
|
|
- 0x0D ('\r') carriage return
|
|
- 0x20 (' ') space
|
|
|
|
The minimum amount of required padding (with ASCII 0x3D, '=') is tolerated
|
|
and enforced at the end of the Base64 ASCII encoded data, and only there.
|
|
|
|
Other characters outside of the encoding alphabet cause the function to
|
|
reject the Base64 ASCII encoded data.
|
|
|
|
@param[in] Source Array of CHAR8 elements containing the Base64
|
|
ASCII encoding. May be NULL if SourceSize is
|
|
zero.
|
|
|
|
@param[in] SourceSize Number of CHAR8 elements in Source.
|
|
|
|
@param[out] Destination Array of UINT8 elements receiving the decoded
|
|
8-bit binary representation. Allocated by the
|
|
caller. May be NULL if DestinationSize is
|
|
zero on input. If NULL, decoding is
|
|
performed, but the 8-bit binary
|
|
representation is not stored. If non-NULL and
|
|
the function returns an error, the contents
|
|
of Destination are indeterminate.
|
|
|
|
@param[in,out] DestinationSize On input, the number of UINT8 elements that
|
|
the caller allocated for Destination. On
|
|
output, if the function returns
|
|
RETURN_SUCCESS or RETURN_BUFFER_TOO_SMALL,
|
|
the number of UINT8 elements that are
|
|
required for decoding the Base64 ASCII
|
|
representation. If the function returns a
|
|
value different from both RETURN_SUCCESS and
|
|
RETURN_BUFFER_TOO_SMALL, then DestinationSize
|
|
is indeterminate on output.
|
|
|
|
@retval RETURN_SUCCESS SourceSize CHAR8 elements at Source have
|
|
been decoded to on-output DestinationSize
|
|
UINT8 elements at Destination. Note that
|
|
RETURN_SUCCESS covers the case when
|
|
DestinationSize is zero on input, and
|
|
Source decodes to zero bytes (due to
|
|
containing at most ignored whitespace).
|
|
|
|
@retval RETURN_BUFFER_TOO_SMALL The input value of DestinationSize is not
|
|
large enough for decoding SourceSize CHAR8
|
|
elements at Source. The required number of
|
|
UINT8 elements has been stored to
|
|
DestinationSize.
|
|
|
|
@retval RETURN_INVALID_PARAMETER DestinationSize is NULL.
|
|
|
|
@retval RETURN_INVALID_PARAMETER Source is NULL, but SourceSize is not zero.
|
|
|
|
@retval RETURN_INVALID_PARAMETER Destination is NULL, but DestinationSize is
|
|
not zero on input.
|
|
|
|
@retval RETURN_INVALID_PARAMETER Source is non-NULL, and (Source +
|
|
SourceSize) would wrap around MAX_ADDRESS.
|
|
|
|
@retval RETURN_INVALID_PARAMETER Destination is non-NULL, and (Destination +
|
|
DestinationSize) would wrap around
|
|
MAX_ADDRESS, as specified on input.
|
|
|
|
@retval RETURN_INVALID_PARAMETER None of Source and Destination are NULL,
|
|
and CHAR8[SourceSize] at Source overlaps
|
|
UINT8[DestinationSize] at Destination, as
|
|
specified on input.
|
|
|
|
@retval RETURN_INVALID_PARAMETER Invalid CHAR8 element encountered in
|
|
Source.
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
Base64Decode (
|
|
IN CONST CHAR8 *Source OPTIONAL,
|
|
IN UINTN SourceSize,
|
|
OUT UINT8 *Destination OPTIONAL,
|
|
IN OUT UINTN *DestinationSize
|
|
);
|
|
|
|
/**
|
|
Converts an 8-bit value to an 8-bit BCD value.
|
|
|
|
Converts the 8-bit value specified by Value to BCD. The BCD value is
|
|
returned.
|
|
|
|
If Value >= 100, then ASSERT().
|
|
|
|
@param Value The 8-bit value to convert to BCD. Range 0..99.
|
|
|
|
@return The BCD value.
|
|
|
|
**/
|
|
UINT8
|
|
EFIAPI
|
|
DecimalToBcd8 (
|
|
IN UINT8 Value
|
|
);
|
|
|
|
/**
|
|
Converts an 8-bit BCD value to an 8-bit value.
|
|
|
|
Converts the 8-bit BCD value specified by Value to an 8-bit value. The 8-bit
|
|
value is returned.
|
|
|
|
If Value >= 0xA0, then ASSERT().
|
|
If (Value & 0x0F) >= 0x0A, then ASSERT().
|
|
|
|
@param Value The 8-bit BCD value to convert to an 8-bit value.
|
|
|
|
@return The 8-bit value is returned.
|
|
|
|
**/
|
|
UINT8
|
|
EFIAPI
|
|
BcdToDecimal8 (
|
|
IN UINT8 Value
|
|
);
|
|
|
|
//
|
|
// File Path Manipulation Functions
|
|
//
|
|
|
|
/**
|
|
Removes the last directory or file entry in a path.
|
|
|
|
@param[in, out] Path The pointer to the path to modify.
|
|
|
|
@retval FALSE Nothing was found to remove.
|
|
@retval TRUE A directory or file was removed.
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
PathRemoveLastItem (
|
|
IN OUT CHAR16 *Path
|
|
);
|
|
|
|
/**
|
|
Function to clean up paths.
|
|
- Single periods in the path are removed.
|
|
- Double periods in the path are removed along with a single parent directory.
|
|
- Forward slashes L'/' are converted to backward slashes L'\'.
|
|
|
|
This will be done inline and the existing buffer may be larger than required
|
|
upon completion.
|
|
|
|
@param[in] Path The pointer to the string containing the path.
|
|
|
|
@return Returns Path, otherwise returns NULL to indicate that an error has occurred.
|
|
**/
|
|
CHAR16 *
|
|
EFIAPI
|
|
PathCleanUpDirectories (
|
|
IN CHAR16 *Path
|
|
);
|
|
|
|
//
|
|
// Linked List Functions and Macros
|
|
//
|
|
|
|
/**
|
|
Initializes the head node of a doubly linked list that is declared as a
|
|
global variable in a module.
|
|
|
|
Initializes the forward and backward links of a new linked list. After
|
|
initializing a linked list with this macro, the other linked list functions
|
|
may be used to add and remove nodes from the linked list. This macro results
|
|
in smaller executables by initializing the linked list in the data section,
|
|
instead if calling the InitializeListHead() function to perform the
|
|
equivalent operation.
|
|
|
|
@param ListHead The head note of a list to initialize.
|
|
|
|
**/
|
|
#define INITIALIZE_LIST_HEAD_VARIABLE(ListHead) {&(ListHead), &(ListHead)}
|
|
|
|
/**
|
|
Iterates over each node in a doubly linked list using each node's forward link.
|
|
|
|
@param Entry A pointer to a list node used as a loop cursor during iteration
|
|
@param ListHead The head node of the doubly linked list
|
|
|
|
**/
|
|
#define BASE_LIST_FOR_EACH(Entry, ListHead) \
|
|
for(Entry = (ListHead)->ForwardLink; Entry != (ListHead); Entry = Entry->ForwardLink)
|
|
|
|
/**
|
|
Iterates over each node in a doubly linked list using each node's forward link
|
|
with safety against node removal.
|
|
|
|
This macro uses NextEntry to temporarily store the next list node so the node
|
|
pointed to by Entry may be deleted in the current loop iteration step and
|
|
iteration can continue from the node pointed to by NextEntry.
|
|
|
|
@param Entry A pointer to a list node used as a loop cursor during iteration
|
|
@param NextEntry A pointer to a list node used to temporarily store the next node
|
|
@param ListHead The head node of the doubly linked list
|
|
|
|
**/
|
|
#define BASE_LIST_FOR_EACH_SAFE(Entry, NextEntry, ListHead) \
|
|
for(Entry = (ListHead)->ForwardLink, NextEntry = Entry->ForwardLink;\
|
|
Entry != (ListHead); Entry = NextEntry, NextEntry = Entry->ForwardLink)
|
|
|
|
/**
|
|
Checks whether FirstEntry and SecondEntry are part of the same doubly-linked
|
|
list.
|
|
|
|
If FirstEntry is NULL, then ASSERT().
|
|
If FirstEntry->ForwardLink is NULL, then ASSERT().
|
|
If FirstEntry->BackLink is NULL, then ASSERT().
|
|
If SecondEntry is NULL, then ASSERT();
|
|
If PcdMaximumLinkedListLength is not zero, and List contains more than
|
|
PcdMaximumLinkedListLength nodes, then ASSERT().
|
|
|
|
@param FirstEntry A pointer to a node in a linked list.
|
|
@param SecondEntry A pointer to the node to locate.
|
|
|
|
@retval TRUE SecondEntry is in the same doubly-linked list as FirstEntry.
|
|
@retval FALSE SecondEntry isn't in the same doubly-linked list as FirstEntry,
|
|
or FirstEntry is invalid.
|
|
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
IsNodeInList (
|
|
IN CONST LIST_ENTRY *FirstEntry,
|
|
IN CONST LIST_ENTRY *SecondEntry
|
|
);
|
|
|
|
/**
|
|
Initializes the head node of a doubly linked list, and returns the pointer to
|
|
the head node of the doubly linked list.
|
|
|
|
Initializes the forward and backward links of a new linked list. After
|
|
initializing a linked list with this function, the other linked list
|
|
functions may be used to add and remove nodes from the linked list. It is up
|
|
to the caller of this function to allocate the memory for ListHead.
|
|
|
|
If ListHead is NULL, then ASSERT().
|
|
|
|
@param ListHead A pointer to the head node of a new doubly linked list.
|
|
|
|
@return ListHead
|
|
|
|
**/
|
|
LIST_ENTRY *
|
|
EFIAPI
|
|
InitializeListHead (
|
|
IN OUT LIST_ENTRY *ListHead
|
|
);
|
|
|
|
/**
|
|
Adds a node to the beginning of a doubly linked list, and returns the pointer
|
|
to the head node of the doubly linked list.
|
|
|
|
Adds the node Entry at the beginning of the doubly linked list denoted by
|
|
ListHead, and returns ListHead.
|
|
|
|
If ListHead is NULL, then ASSERT().
|
|
If Entry is NULL, then ASSERT().
|
|
If ListHead was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or
|
|
InitializeListHead(), then ASSERT().
|
|
If PcdMaximumLinkedListLength is not zero, and prior to insertion the number
|
|
of nodes in ListHead, including the ListHead node, is greater than or
|
|
equal to PcdMaximumLinkedListLength, then ASSERT().
|
|
|
|
@param ListHead A pointer to the head node of a doubly linked list.
|
|
@param Entry A pointer to a node that is to be inserted at the beginning
|
|
of a doubly linked list.
|
|
|
|
@return ListHead
|
|
|
|
**/
|
|
LIST_ENTRY *
|
|
EFIAPI
|
|
InsertHeadList (
|
|
IN OUT LIST_ENTRY *ListHead,
|
|
IN OUT LIST_ENTRY *Entry
|
|
);
|
|
|
|
/**
|
|
Adds a node to the end of a doubly linked list, and returns the pointer to
|
|
the head node of the doubly linked list.
|
|
|
|
Adds the node Entry to the end of the doubly linked list denoted by ListHead,
|
|
and returns ListHead.
|
|
|
|
If ListHead is NULL, then ASSERT().
|
|
If Entry is NULL, then ASSERT().
|
|
If ListHead was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or
|
|
InitializeListHead(), then ASSERT().
|
|
If PcdMaximumLinkedListLength is not zero, and prior to insertion the number
|
|
of nodes in ListHead, including the ListHead node, is greater than or
|
|
equal to PcdMaximumLinkedListLength, then ASSERT().
|
|
|
|
@param ListHead A pointer to the head node of a doubly linked list.
|
|
@param Entry A pointer to a node that is to be added at the end of the
|
|
doubly linked list.
|
|
|
|
@return ListHead
|
|
|
|
**/
|
|
LIST_ENTRY *
|
|
EFIAPI
|
|
InsertTailList (
|
|
IN OUT LIST_ENTRY *ListHead,
|
|
IN OUT LIST_ENTRY *Entry
|
|
);
|
|
|
|
/**
|
|
Retrieves the first node of a doubly linked list.
|
|
|
|
Returns the first node of a doubly linked list. List must have been
|
|
initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead().
|
|
If List is empty, then List is returned.
|
|
|
|
If List is NULL, then ASSERT().
|
|
If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or
|
|
InitializeListHead(), then ASSERT().
|
|
If PcdMaximumLinkedListLength is not zero, and the number of nodes
|
|
in List, including the List node, is greater than or equal to
|
|
PcdMaximumLinkedListLength, then ASSERT().
|
|
|
|
@param List A pointer to the head node of a doubly linked list.
|
|
|
|
@return The first node of a doubly linked list.
|
|
@retval List The list is empty.
|
|
|
|
**/
|
|
LIST_ENTRY *
|
|
EFIAPI
|
|
GetFirstNode (
|
|
IN CONST LIST_ENTRY *List
|
|
);
|
|
|
|
/**
|
|
Retrieves the next node of a doubly linked list.
|
|
|
|
Returns the node of a doubly linked list that follows Node.
|
|
List must have been initialized with INTIALIZE_LIST_HEAD_VARIABLE()
|
|
or InitializeListHead(). If List is empty, then List is returned.
|
|
|
|
If List is NULL, then ASSERT().
|
|
If Node is NULL, then ASSERT().
|
|
If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or
|
|
InitializeListHead(), then ASSERT().
|
|
If PcdMaximumLinkedListLength is not zero, and List contains more than
|
|
PcdMaximumLinkedListLength nodes, then ASSERT().
|
|
If PcdVerifyNodeInList is TRUE and Node is not a node in List, then ASSERT().
|
|
|
|
@param List A pointer to the head node of a doubly linked list.
|
|
@param Node A pointer to a node in the doubly linked list.
|
|
|
|
@return The pointer to the next node if one exists. Otherwise List is returned.
|
|
|
|
**/
|
|
LIST_ENTRY *
|
|
EFIAPI
|
|
GetNextNode (
|
|
IN CONST LIST_ENTRY *List,
|
|
IN CONST LIST_ENTRY *Node
|
|
);
|
|
|
|
/**
|
|
Retrieves the previous node of a doubly linked list.
|
|
|
|
Returns the node of a doubly linked list that precedes Node.
|
|
List must have been initialized with INTIALIZE_LIST_HEAD_VARIABLE()
|
|
or InitializeListHead(). If List is empty, then List is returned.
|
|
|
|
If List is NULL, then ASSERT().
|
|
If Node is NULL, then ASSERT().
|
|
If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or
|
|
InitializeListHead(), then ASSERT().
|
|
If PcdMaximumLinkedListLength is not zero, and List contains more than
|
|
PcdMaximumLinkedListLength nodes, then ASSERT().
|
|
If PcdVerifyNodeInList is TRUE and Node is not a node in List, then ASSERT().
|
|
|
|
@param List A pointer to the head node of a doubly linked list.
|
|
@param Node A pointer to a node in the doubly linked list.
|
|
|
|
@return The pointer to the previous node if one exists. Otherwise List is returned.
|
|
|
|
**/
|
|
LIST_ENTRY *
|
|
EFIAPI
|
|
GetPreviousNode (
|
|
IN CONST LIST_ENTRY *List,
|
|
IN CONST LIST_ENTRY *Node
|
|
);
|
|
|
|
/**
|
|
Checks to see if a doubly linked list is empty or not.
|
|
|
|
Checks to see if the doubly linked list is empty. If the linked list contains
|
|
zero nodes, this function returns TRUE. Otherwise, it returns FALSE.
|
|
|
|
If ListHead is NULL, then ASSERT().
|
|
If ListHead was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or
|
|
InitializeListHead(), then ASSERT().
|
|
If PcdMaximumLinkedListLength is not zero, and the number of nodes
|
|
in List, including the List node, is greater than or equal to
|
|
PcdMaximumLinkedListLength, then ASSERT().
|
|
|
|
@param ListHead A pointer to the head node of a doubly linked list.
|
|
|
|
@retval TRUE The linked list is empty.
|
|
@retval FALSE The linked list is not empty.
|
|
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
IsListEmpty (
|
|
IN CONST LIST_ENTRY *ListHead
|
|
);
|
|
|
|
/**
|
|
Determines if a node in a doubly linked list is the head node of a the same
|
|
doubly linked list. This function is typically used to terminate a loop that
|
|
traverses all the nodes in a doubly linked list starting with the head node.
|
|
|
|
Returns TRUE if Node is equal to List. Returns FALSE if Node is one of the
|
|
nodes in the doubly linked list specified by List. List must have been
|
|
initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead().
|
|
|
|
If List is NULL, then ASSERT().
|
|
If Node is NULL, then ASSERT().
|
|
If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(),
|
|
then ASSERT().
|
|
If PcdMaximumLinkedListLength is not zero, and the number of nodes
|
|
in List, including the List node, is greater than or equal to
|
|
PcdMaximumLinkedListLength, then ASSERT().
|
|
If PcdVerifyNodeInList is TRUE and Node is not a node in List the and Node is not equal
|
|
to List, then ASSERT().
|
|
|
|
@param List A pointer to the head node of a doubly linked list.
|
|
@param Node A pointer to a node in the doubly linked list.
|
|
|
|
@retval TRUE Node is the head of the doubly-linked list pointed by List.
|
|
@retval FALSE Node is not the head of the doubly-linked list pointed by List.
|
|
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
IsNull (
|
|
IN CONST LIST_ENTRY *List,
|
|
IN CONST LIST_ENTRY *Node
|
|
);
|
|
|
|
/**
|
|
Determines if a node the last node in a doubly linked list.
|
|
|
|
Returns TRUE if Node is the last node in the doubly linked list specified by
|
|
List. Otherwise, FALSE is returned. List must have been initialized with
|
|
INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead().
|
|
|
|
If List is NULL, then ASSERT().
|
|
If Node is NULL, then ASSERT().
|
|
If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or
|
|
InitializeListHead(), then ASSERT().
|
|
If PcdMaximumLinkedListLength is not zero, and the number of nodes
|
|
in List, including the List node, is greater than or equal to
|
|
PcdMaximumLinkedListLength, then ASSERT().
|
|
If PcdVerifyNodeInList is TRUE and Node is not a node in List, then ASSERT().
|
|
|
|
@param List A pointer to the head node of a doubly linked list.
|
|
@param Node A pointer to a node in the doubly linked list.
|
|
|
|
@retval TRUE Node is the last node in the linked list.
|
|
@retval FALSE Node is not the last node in the linked list.
|
|
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
IsNodeAtEnd (
|
|
IN CONST LIST_ENTRY *List,
|
|
IN CONST LIST_ENTRY *Node
|
|
);
|
|
|
|
/**
|
|
Swaps the location of two nodes in a doubly linked list, and returns the
|
|
first node after the swap.
|
|
|
|
If FirstEntry is identical to SecondEntry, then SecondEntry is returned.
|
|
Otherwise, the location of the FirstEntry node is swapped with the location
|
|
of the SecondEntry node in a doubly linked list. SecondEntry must be in the
|
|
same double linked list as FirstEntry and that double linked list must have
|
|
been initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead().
|
|
SecondEntry is returned after the nodes are swapped.
|
|
|
|
If FirstEntry is NULL, then ASSERT().
|
|
If SecondEntry is NULL, then ASSERT().
|
|
If PcdVerifyNodeInList is TRUE and SecondEntry and FirstEntry are not in the
|
|
same linked list, then ASSERT().
|
|
If PcdMaximumLinkedListLength is not zero, and the number of nodes in the
|
|
linked list containing the FirstEntry and SecondEntry nodes, including
|
|
the FirstEntry and SecondEntry nodes, is greater than or equal to
|
|
PcdMaximumLinkedListLength, then ASSERT().
|
|
|
|
@param FirstEntry A pointer to a node in a linked list.
|
|
@param SecondEntry A pointer to another node in the same linked list.
|
|
|
|
@return SecondEntry.
|
|
|
|
**/
|
|
LIST_ENTRY *
|
|
EFIAPI
|
|
SwapListEntries (
|
|
IN OUT LIST_ENTRY *FirstEntry,
|
|
IN OUT LIST_ENTRY *SecondEntry
|
|
);
|
|
|
|
/**
|
|
Removes a node from a doubly linked list, and returns the node that follows
|
|
the removed node.
|
|
|
|
Removes the node Entry from a doubly linked list. It is up to the caller of
|
|
this function to release the memory used by this node if that is required. On
|
|
exit, the node following Entry in the doubly linked list is returned. If
|
|
Entry is the only node in the linked list, then the head node of the linked
|
|
list is returned.
|
|
|
|
If Entry is NULL, then ASSERT().
|
|
If Entry is the head node of an empty list, then ASSERT().
|
|
If PcdMaximumLinkedListLength is not zero, and the number of nodes in the
|
|
linked list containing Entry, including the Entry node, is greater than
|
|
or equal to PcdMaximumLinkedListLength, then ASSERT().
|
|
|
|
@param Entry A pointer to a node in a linked list.
|
|
|
|
@return Entry.
|
|
|
|
**/
|
|
LIST_ENTRY *
|
|
EFIAPI
|
|
RemoveEntryList (
|
|
IN CONST LIST_ENTRY *Entry
|
|
);
|
|
|
|
//
|
|
// Math Services
|
|
//
|
|
|
|
/**
|
|
Prototype for comparison function for any two element types.
|
|
|
|
@param[in] Buffer1 The pointer to first buffer.
|
|
@param[in] Buffer2 The pointer to second buffer.
|
|
|
|
@retval 0 Buffer1 equal to Buffer2.
|
|
@return <0 Buffer1 is less than Buffer2.
|
|
@return >0 Buffer1 is greater than Buffer2.
|
|
**/
|
|
typedef
|
|
INTN
|
|
(EFIAPI *BASE_SORT_COMPARE)(
|
|
IN CONST VOID *Buffer1,
|
|
IN CONST VOID *Buffer2
|
|
);
|
|
|
|
/**
|
|
This function is identical to perform QuickSort,
|
|
except that is uses the pre-allocated buffer so the in place sorting does not need to
|
|
allocate and free buffers constantly.
|
|
|
|
Each element must be equal sized.
|
|
|
|
if BufferToSort is NULL, then ASSERT.
|
|
if CompareFunction is NULL, then ASSERT.
|
|
if BufferOneElement is NULL, then ASSERT.
|
|
if ElementSize is < 1, then ASSERT.
|
|
|
|
if Count is < 2 then perform no action.
|
|
|
|
@param[in, out] BufferToSort on call a Buffer of (possibly sorted) elements
|
|
on return a buffer of sorted elements
|
|
@param[in] Count the number of elements in the buffer to sort
|
|
@param[in] ElementSize Size of an element in bytes
|
|
@param[in] CompareFunction The function to call to perform the comparison
|
|
of any 2 elements
|
|
@param[out] BufferOneElement Caller provided buffer whose size equals to ElementSize.
|
|
It's used by QuickSort() for swapping in sorting.
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
QuickSort (
|
|
IN OUT VOID *BufferToSort,
|
|
IN CONST UINTN Count,
|
|
IN CONST UINTN ElementSize,
|
|
IN BASE_SORT_COMPARE CompareFunction,
|
|
OUT VOID *BufferOneElement
|
|
);
|
|
|
|
/**
|
|
Shifts a 64-bit integer left between 0 and 63 bits. The low bits are filled
|
|
with zeros. The shifted value is returned.
|
|
|
|
This function shifts the 64-bit value Operand to the left by Count bits. The
|
|
low Count bits are set to zero. The shifted value is returned.
|
|
|
|
If Count is greater than 63, then ASSERT().
|
|
|
|
@param Operand The 64-bit operand to shift left.
|
|
@param Count The number of bits to shift left.
|
|
|
|
@return Operand << Count.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
LShiftU64 (
|
|
IN UINT64 Operand,
|
|
IN UINTN Count
|
|
);
|
|
|
|
/**
|
|
Shifts a 64-bit integer right between 0 and 63 bits. This high bits are
|
|
filled with zeros. The shifted value is returned.
|
|
|
|
This function shifts the 64-bit value Operand to the right by Count bits. The
|
|
high Count bits are set to zero. The shifted value is returned.
|
|
|
|
If Count is greater than 63, then ASSERT().
|
|
|
|
@param Operand The 64-bit operand to shift right.
|
|
@param Count The number of bits to shift right.
|
|
|
|
@return Operand >> Count
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
RShiftU64 (
|
|
IN UINT64 Operand,
|
|
IN UINTN Count
|
|
);
|
|
|
|
/**
|
|
Shifts a 64-bit integer right between 0 and 63 bits. The high bits are filled
|
|
with original integer's bit 63. The shifted value is returned.
|
|
|
|
This function shifts the 64-bit value Operand to the right by Count bits. The
|
|
high Count bits are set to bit 63 of Operand. The shifted value is returned.
|
|
|
|
If Count is greater than 63, then ASSERT().
|
|
|
|
@param Operand The 64-bit operand to shift right.
|
|
@param Count The number of bits to shift right.
|
|
|
|
@return Operand >> Count
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
ARShiftU64 (
|
|
IN UINT64 Operand,
|
|
IN UINTN Count
|
|
);
|
|
|
|
/**
|
|
Rotates a 32-bit integer left between 0 and 31 bits, filling the low bits
|
|
with the high bits that were rotated.
|
|
|
|
This function rotates the 32-bit value Operand to the left by Count bits. The
|
|
low Count bits are fill with the high Count bits of Operand. The rotated
|
|
value is returned.
|
|
|
|
If Count is greater than 31, then ASSERT().
|
|
|
|
@param Operand The 32-bit operand to rotate left.
|
|
@param Count The number of bits to rotate left.
|
|
|
|
@return Operand << Count
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
LRotU32 (
|
|
IN UINT32 Operand,
|
|
IN UINTN Count
|
|
);
|
|
|
|
/**
|
|
Rotates a 32-bit integer right between 0 and 31 bits, filling the high bits
|
|
with the low bits that were rotated.
|
|
|
|
This function rotates the 32-bit value Operand to the right by Count bits.
|
|
The high Count bits are fill with the low Count bits of Operand. The rotated
|
|
value is returned.
|
|
|
|
If Count is greater than 31, then ASSERT().
|
|
|
|
@param Operand The 32-bit operand to rotate right.
|
|
@param Count The number of bits to rotate right.
|
|
|
|
@return Operand >> Count
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
RRotU32 (
|
|
IN UINT32 Operand,
|
|
IN UINTN Count
|
|
);
|
|
|
|
/**
|
|
Rotates a 64-bit integer left between 0 and 63 bits, filling the low bits
|
|
with the high bits that were rotated.
|
|
|
|
This function rotates the 64-bit value Operand to the left by Count bits. The
|
|
low Count bits are fill with the high Count bits of Operand. The rotated
|
|
value is returned.
|
|
|
|
If Count is greater than 63, then ASSERT().
|
|
|
|
@param Operand The 64-bit operand to rotate left.
|
|
@param Count The number of bits to rotate left.
|
|
|
|
@return Operand << Count
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
LRotU64 (
|
|
IN UINT64 Operand,
|
|
IN UINTN Count
|
|
);
|
|
|
|
/**
|
|
Rotates a 64-bit integer right between 0 and 63 bits, filling the high bits
|
|
with the high low bits that were rotated.
|
|
|
|
This function rotates the 64-bit value Operand to the right by Count bits.
|
|
The high Count bits are fill with the low Count bits of Operand. The rotated
|
|
value is returned.
|
|
|
|
If Count is greater than 63, then ASSERT().
|
|
|
|
@param Operand The 64-bit operand to rotate right.
|
|
@param Count The number of bits to rotate right.
|
|
|
|
@return Operand >> Count
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
RRotU64 (
|
|
IN UINT64 Operand,
|
|
IN UINTN Count
|
|
);
|
|
|
|
/**
|
|
Returns the bit position of the lowest bit set in a 32-bit value.
|
|
|
|
This function computes the bit position of the lowest bit set in the 32-bit
|
|
value specified by Operand. If Operand is zero, then -1 is returned.
|
|
Otherwise, a value between 0 and 31 is returned.
|
|
|
|
@param Operand The 32-bit operand to evaluate.
|
|
|
|
@retval 0..31 The lowest bit set in Operand was found.
|
|
@retval -1 Operand is zero.
|
|
|
|
**/
|
|
INTN
|
|
EFIAPI
|
|
LowBitSet32 (
|
|
IN UINT32 Operand
|
|
);
|
|
|
|
/**
|
|
Returns the bit position of the lowest bit set in a 64-bit value.
|
|
|
|
This function computes the bit position of the lowest bit set in the 64-bit
|
|
value specified by Operand. If Operand is zero, then -1 is returned.
|
|
Otherwise, a value between 0 and 63 is returned.
|
|
|
|
@param Operand The 64-bit operand to evaluate.
|
|
|
|
@retval 0..63 The lowest bit set in Operand was found.
|
|
@retval -1 Operand is zero.
|
|
|
|
|
|
**/
|
|
INTN
|
|
EFIAPI
|
|
LowBitSet64 (
|
|
IN UINT64 Operand
|
|
);
|
|
|
|
/**
|
|
Returns the bit position of the highest bit set in a 32-bit value. Equivalent
|
|
to log2(x).
|
|
|
|
This function computes the bit position of the highest bit set in the 32-bit
|
|
value specified by Operand. If Operand is zero, then -1 is returned.
|
|
Otherwise, a value between 0 and 31 is returned.
|
|
|
|
@param Operand The 32-bit operand to evaluate.
|
|
|
|
@retval 0..31 Position of the highest bit set in Operand if found.
|
|
@retval -1 Operand is zero.
|
|
|
|
**/
|
|
INTN
|
|
EFIAPI
|
|
HighBitSet32 (
|
|
IN UINT32 Operand
|
|
);
|
|
|
|
/**
|
|
Returns the bit position of the highest bit set in a 64-bit value. Equivalent
|
|
to log2(x).
|
|
|
|
This function computes the bit position of the highest bit set in the 64-bit
|
|
value specified by Operand. If Operand is zero, then -1 is returned.
|
|
Otherwise, a value between 0 and 63 is returned.
|
|
|
|
@param Operand The 64-bit operand to evaluate.
|
|
|
|
@retval 0..63 Position of the highest bit set in Operand if found.
|
|
@retval -1 Operand is zero.
|
|
|
|
**/
|
|
INTN
|
|
EFIAPI
|
|
HighBitSet64 (
|
|
IN UINT64 Operand
|
|
);
|
|
|
|
/**
|
|
Returns the value of the highest bit set in a 32-bit value. Equivalent to
|
|
1 << log2(x).
|
|
|
|
This function computes the value of the highest bit set in the 32-bit value
|
|
specified by Operand. If Operand is zero, then zero is returned.
|
|
|
|
@param Operand The 32-bit operand to evaluate.
|
|
|
|
@return 1 << HighBitSet32(Operand)
|
|
@retval 0 Operand is zero.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
GetPowerOfTwo32 (
|
|
IN UINT32 Operand
|
|
);
|
|
|
|
/**
|
|
Returns the value of the highest bit set in a 64-bit value. Equivalent to
|
|
1 << log2(x).
|
|
|
|
This function computes the value of the highest bit set in the 64-bit value
|
|
specified by Operand. If Operand is zero, then zero is returned.
|
|
|
|
@param Operand The 64-bit operand to evaluate.
|
|
|
|
@return 1 << HighBitSet64(Operand)
|
|
@retval 0 Operand is zero.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
GetPowerOfTwo64 (
|
|
IN UINT64 Operand
|
|
);
|
|
|
|
/**
|
|
Switches the endianness of a 16-bit integer.
|
|
|
|
This function swaps the bytes in a 16-bit unsigned value to switch the value
|
|
from little endian to big endian or vice versa. The byte swapped value is
|
|
returned.
|
|
|
|
@param Value A 16-bit unsigned value.
|
|
|
|
@return The byte swapped Value.
|
|
|
|
**/
|
|
UINT16
|
|
EFIAPI
|
|
SwapBytes16 (
|
|
IN UINT16 Value
|
|
);
|
|
|
|
/**
|
|
Switches the endianness of a 32-bit integer.
|
|
|
|
This function swaps the bytes in a 32-bit unsigned value to switch the value
|
|
from little endian to big endian or vice versa. The byte swapped value is
|
|
returned.
|
|
|
|
@param Value A 32-bit unsigned value.
|
|
|
|
@return The byte swapped Value.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
SwapBytes32 (
|
|
IN UINT32 Value
|
|
);
|
|
|
|
/**
|
|
Switches the endianness of a 64-bit integer.
|
|
|
|
This function swaps the bytes in a 64-bit unsigned value to switch the value
|
|
from little endian to big endian or vice versa. The byte swapped value is
|
|
returned.
|
|
|
|
@param Value A 64-bit unsigned value.
|
|
|
|
@return The byte swapped Value.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
SwapBytes64 (
|
|
IN UINT64 Value
|
|
);
|
|
|
|
/**
|
|
Multiples a 64-bit unsigned integer by a 32-bit unsigned integer and
|
|
generates a 64-bit unsigned result.
|
|
|
|
This function multiples the 64-bit unsigned value Multiplicand by the 32-bit
|
|
unsigned value Multiplier and generates a 64-bit unsigned result. This 64-
|
|
bit unsigned result is returned.
|
|
|
|
@param Multiplicand A 64-bit unsigned value.
|
|
@param Multiplier A 32-bit unsigned value.
|
|
|
|
@return Multiplicand * Multiplier
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
MultU64x32 (
|
|
IN UINT64 Multiplicand,
|
|
IN UINT32 Multiplier
|
|
);
|
|
|
|
/**
|
|
Multiples a 64-bit unsigned integer by a 64-bit unsigned integer and
|
|
generates a 64-bit unsigned result.
|
|
|
|
This function multiples the 64-bit unsigned value Multiplicand by the 64-bit
|
|
unsigned value Multiplier and generates a 64-bit unsigned result. This 64-
|
|
bit unsigned result is returned.
|
|
|
|
@param Multiplicand A 64-bit unsigned value.
|
|
@param Multiplier A 64-bit unsigned value.
|
|
|
|
@return Multiplicand * Multiplier.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
MultU64x64 (
|
|
IN UINT64 Multiplicand,
|
|
IN UINT64 Multiplier
|
|
);
|
|
|
|
/**
|
|
Multiples a 64-bit signed integer by a 64-bit signed integer and generates a
|
|
64-bit signed result.
|
|
|
|
This function multiples the 64-bit signed value Multiplicand by the 64-bit
|
|
signed value Multiplier and generates a 64-bit signed result. This 64-bit
|
|
signed result is returned.
|
|
|
|
@param Multiplicand A 64-bit signed value.
|
|
@param Multiplier A 64-bit signed value.
|
|
|
|
@return Multiplicand * Multiplier
|
|
|
|
**/
|
|
INT64
|
|
EFIAPI
|
|
MultS64x64 (
|
|
IN INT64 Multiplicand,
|
|
IN INT64 Multiplier
|
|
);
|
|
|
|
/**
|
|
Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates
|
|
a 64-bit unsigned result.
|
|
|
|
This function divides the 64-bit unsigned value Dividend by the 32-bit
|
|
unsigned value Divisor and generates a 64-bit unsigned quotient. This
|
|
function returns the 64-bit unsigned quotient.
|
|
|
|
If Divisor is 0, then ASSERT().
|
|
|
|
@param Dividend A 64-bit unsigned value.
|
|
@param Divisor A 32-bit unsigned value.
|
|
|
|
@return Dividend / Divisor.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
DivU64x32 (
|
|
IN UINT64 Dividend,
|
|
IN UINT32 Divisor
|
|
);
|
|
|
|
/**
|
|
Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates
|
|
a 32-bit unsigned remainder.
|
|
|
|
This function divides the 64-bit unsigned value Dividend by the 32-bit
|
|
unsigned value Divisor and generates a 32-bit remainder. This function
|
|
returns the 32-bit unsigned remainder.
|
|
|
|
If Divisor is 0, then ASSERT().
|
|
|
|
@param Dividend A 64-bit unsigned value.
|
|
@param Divisor A 32-bit unsigned value.
|
|
|
|
@return Dividend % Divisor.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
ModU64x32 (
|
|
IN UINT64 Dividend,
|
|
IN UINT32 Divisor
|
|
);
|
|
|
|
/**
|
|
Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates
|
|
a 64-bit unsigned result and an optional 32-bit unsigned remainder.
|
|
|
|
This function divides the 64-bit unsigned value Dividend by the 32-bit
|
|
unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder
|
|
is not NULL, then the 32-bit unsigned remainder is returned in Remainder.
|
|
This function returns the 64-bit unsigned quotient.
|
|
|
|
If Divisor is 0, then ASSERT().
|
|
|
|
@param Dividend A 64-bit unsigned value.
|
|
@param Divisor A 32-bit unsigned value.
|
|
@param Remainder A pointer to a 32-bit unsigned value. This parameter is
|
|
optional and may be NULL.
|
|
|
|
@return Dividend / Divisor.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
DivU64x32Remainder (
|
|
IN UINT64 Dividend,
|
|
IN UINT32 Divisor,
|
|
OUT UINT32 *Remainder OPTIONAL
|
|
);
|
|
|
|
/**
|
|
Divides a 64-bit unsigned integer by a 64-bit unsigned integer and generates
|
|
a 64-bit unsigned result and an optional 64-bit unsigned remainder.
|
|
|
|
This function divides the 64-bit unsigned value Dividend by the 64-bit
|
|
unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder
|
|
is not NULL, then the 64-bit unsigned remainder is returned in Remainder.
|
|
This function returns the 64-bit unsigned quotient.
|
|
|
|
If Divisor is 0, then ASSERT().
|
|
|
|
@param Dividend A 64-bit unsigned value.
|
|
@param Divisor A 64-bit unsigned value.
|
|
@param Remainder A pointer to a 64-bit unsigned value. This parameter is
|
|
optional and may be NULL.
|
|
|
|
@return Dividend / Divisor.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
DivU64x64Remainder (
|
|
IN UINT64 Dividend,
|
|
IN UINT64 Divisor,
|
|
OUT UINT64 *Remainder OPTIONAL
|
|
);
|
|
|
|
/**
|
|
Divides a 64-bit signed integer by a 64-bit signed integer and generates a
|
|
64-bit signed result and a optional 64-bit signed remainder.
|
|
|
|
This function divides the 64-bit signed value Dividend by the 64-bit signed
|
|
value Divisor and generates a 64-bit signed quotient. If Remainder is not
|
|
NULL, then the 64-bit signed remainder is returned in Remainder. This
|
|
function returns the 64-bit signed quotient.
|
|
|
|
It is the caller's responsibility to not call this function with a Divisor of 0.
|
|
If Divisor is 0, then the quotient and remainder should be assumed to be
|
|
the largest negative integer.
|
|
|
|
If Divisor is 0, then ASSERT().
|
|
|
|
@param Dividend A 64-bit signed value.
|
|
@param Divisor A 64-bit signed value.
|
|
@param Remainder A pointer to a 64-bit signed value. This parameter is
|
|
optional and may be NULL.
|
|
|
|
@return Dividend / Divisor.
|
|
|
|
**/
|
|
INT64
|
|
EFIAPI
|
|
DivS64x64Remainder (
|
|
IN INT64 Dividend,
|
|
IN INT64 Divisor,
|
|
OUT INT64 *Remainder OPTIONAL
|
|
);
|
|
|
|
/**
|
|
Reads a 16-bit value from memory that may be unaligned.
|
|
|
|
This function returns the 16-bit value pointed to by Buffer. The function
|
|
guarantees that the read operation does not produce an alignment fault.
|
|
|
|
If the Buffer is NULL, then ASSERT().
|
|
|
|
@param Buffer The pointer to a 16-bit value that may be unaligned.
|
|
|
|
@return The 16-bit value read from Buffer.
|
|
|
|
**/
|
|
UINT16
|
|
EFIAPI
|
|
ReadUnaligned16 (
|
|
IN CONST UINT16 *Buffer
|
|
);
|
|
|
|
/**
|
|
Writes a 16-bit value to memory that may be unaligned.
|
|
|
|
This function writes the 16-bit value specified by Value to Buffer. Value is
|
|
returned. The function guarantees that the write operation does not produce
|
|
an alignment fault.
|
|
|
|
If the Buffer is NULL, then ASSERT().
|
|
|
|
@param Buffer The pointer to a 16-bit value that may be unaligned.
|
|
@param Value 16-bit value to write to Buffer.
|
|
|
|
@return The 16-bit value to write to Buffer.
|
|
|
|
**/
|
|
UINT16
|
|
EFIAPI
|
|
WriteUnaligned16 (
|
|
OUT UINT16 *Buffer,
|
|
IN UINT16 Value
|
|
);
|
|
|
|
/**
|
|
Reads a 24-bit value from memory that may be unaligned.
|
|
|
|
This function returns the 24-bit value pointed to by Buffer. The function
|
|
guarantees that the read operation does not produce an alignment fault.
|
|
|
|
If the Buffer is NULL, then ASSERT().
|
|
|
|
@param Buffer The pointer to a 24-bit value that may be unaligned.
|
|
|
|
@return The 24-bit value read from Buffer.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
ReadUnaligned24 (
|
|
IN CONST UINT32 *Buffer
|
|
);
|
|
|
|
/**
|
|
Writes a 24-bit value to memory that may be unaligned.
|
|
|
|
This function writes the 24-bit value specified by Value to Buffer. Value is
|
|
returned. The function guarantees that the write operation does not produce
|
|
an alignment fault.
|
|
|
|
If the Buffer is NULL, then ASSERT().
|
|
|
|
@param Buffer The pointer to a 24-bit value that may be unaligned.
|
|
@param Value 24-bit value to write to Buffer.
|
|
|
|
@return The 24-bit value to write to Buffer.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
WriteUnaligned24 (
|
|
OUT UINT32 *Buffer,
|
|
IN UINT32 Value
|
|
);
|
|
|
|
/**
|
|
Reads a 32-bit value from memory that may be unaligned.
|
|
|
|
This function returns the 32-bit value pointed to by Buffer. The function
|
|
guarantees that the read operation does not produce an alignment fault.
|
|
|
|
If the Buffer is NULL, then ASSERT().
|
|
|
|
@param Buffer The pointer to a 32-bit value that may be unaligned.
|
|
|
|
@return The 32-bit value read from Buffer.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
ReadUnaligned32 (
|
|
IN CONST UINT32 *Buffer
|
|
);
|
|
|
|
/**
|
|
Writes a 32-bit value to memory that may be unaligned.
|
|
|
|
This function writes the 32-bit value specified by Value to Buffer. Value is
|
|
returned. The function guarantees that the write operation does not produce
|
|
an alignment fault.
|
|
|
|
If the Buffer is NULL, then ASSERT().
|
|
|
|
@param Buffer The pointer to a 32-bit value that may be unaligned.
|
|
@param Value 32-bit value to write to Buffer.
|
|
|
|
@return The 32-bit value to write to Buffer.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
WriteUnaligned32 (
|
|
OUT UINT32 *Buffer,
|
|
IN UINT32 Value
|
|
);
|
|
|
|
/**
|
|
Reads a 64-bit value from memory that may be unaligned.
|
|
|
|
This function returns the 64-bit value pointed to by Buffer. The function
|
|
guarantees that the read operation does not produce an alignment fault.
|
|
|
|
If the Buffer is NULL, then ASSERT().
|
|
|
|
@param Buffer The pointer to a 64-bit value that may be unaligned.
|
|
|
|
@return The 64-bit value read from Buffer.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
ReadUnaligned64 (
|
|
IN CONST UINT64 *Buffer
|
|
);
|
|
|
|
/**
|
|
Writes a 64-bit value to memory that may be unaligned.
|
|
|
|
This function writes the 64-bit value specified by Value to Buffer. Value is
|
|
returned. The function guarantees that the write operation does not produce
|
|
an alignment fault.
|
|
|
|
If the Buffer is NULL, then ASSERT().
|
|
|
|
@param Buffer The pointer to a 64-bit value that may be unaligned.
|
|
@param Value 64-bit value to write to Buffer.
|
|
|
|
@return The 64-bit value to write to Buffer.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
WriteUnaligned64 (
|
|
OUT UINT64 *Buffer,
|
|
IN UINT64 Value
|
|
);
|
|
|
|
//
|
|
// Bit Field Functions
|
|
//
|
|
|
|
/**
|
|
Returns a bit field from an 8-bit value.
|
|
|
|
Returns the bitfield specified by the StartBit and the EndBit from Operand.
|
|
|
|
If 8-bit operations are not supported, then ASSERT().
|
|
If StartBit is greater than 7, then ASSERT().
|
|
If EndBit is greater than 7, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
|
|
@param Operand Operand on which to perform the bitfield operation.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..7.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..7.
|
|
|
|
@return The bit field read.
|
|
|
|
**/
|
|
UINT8
|
|
EFIAPI
|
|
BitFieldRead8 (
|
|
IN UINT8 Operand,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit
|
|
);
|
|
|
|
/**
|
|
Writes a bit field to an 8-bit value, and returns the result.
|
|
|
|
Writes Value to the bit field specified by the StartBit and the EndBit in
|
|
Operand. All other bits in Operand are preserved. The new 8-bit value is
|
|
returned.
|
|
|
|
If 8-bit operations are not supported, then ASSERT().
|
|
If StartBit is greater than 7, then ASSERT().
|
|
If EndBit is greater than 7, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Operand Operand on which to perform the bitfield operation.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..7.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..7.
|
|
@param Value New value of the bit field.
|
|
|
|
@return The new 8-bit value.
|
|
|
|
**/
|
|
UINT8
|
|
EFIAPI
|
|
BitFieldWrite8 (
|
|
IN UINT8 Operand,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT8 Value
|
|
);
|
|
|
|
/**
|
|
Reads a bit field from an 8-bit value, performs a bitwise OR, and returns the
|
|
result.
|
|
|
|
Performs a bitwise OR between the bit field specified by StartBit
|
|
and EndBit in Operand and the value specified by OrData. All other bits in
|
|
Operand are preserved. The new 8-bit value is returned.
|
|
|
|
If 8-bit operations are not supported, then ASSERT().
|
|
If StartBit is greater than 7, then ASSERT().
|
|
If EndBit is greater than 7, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Operand Operand on which to perform the bitfield operation.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..7.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..7.
|
|
@param OrData The value to OR with the read value from the value
|
|
|
|
@return The new 8-bit value.
|
|
|
|
**/
|
|
UINT8
|
|
EFIAPI
|
|
BitFieldOr8 (
|
|
IN UINT8 Operand,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT8 OrData
|
|
);
|
|
|
|
/**
|
|
Reads a bit field from an 8-bit value, performs a bitwise AND, and returns
|
|
the result.
|
|
|
|
Performs a bitwise AND between the bit field specified by StartBit and EndBit
|
|
in Operand and the value specified by AndData. All other bits in Operand are
|
|
preserved. The new 8-bit value is returned.
|
|
|
|
If 8-bit operations are not supported, then ASSERT().
|
|
If StartBit is greater than 7, then ASSERT().
|
|
If EndBit is greater than 7, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Operand Operand on which to perform the bitfield operation.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..7.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..7.
|
|
@param AndData The value to AND with the read value from the value.
|
|
|
|
@return The new 8-bit value.
|
|
|
|
**/
|
|
UINT8
|
|
EFIAPI
|
|
BitFieldAnd8 (
|
|
IN UINT8 Operand,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT8 AndData
|
|
);
|
|
|
|
/**
|
|
Reads a bit field from an 8-bit value, performs a bitwise AND followed by a
|
|
bitwise OR, and returns the result.
|
|
|
|
Performs a bitwise AND between the bit field specified by StartBit and EndBit
|
|
in Operand and the value specified by AndData, followed by a bitwise
|
|
OR with value specified by OrData. All other bits in Operand are
|
|
preserved. The new 8-bit value is returned.
|
|
|
|
If 8-bit operations are not supported, then ASSERT().
|
|
If StartBit is greater than 7, then ASSERT().
|
|
If EndBit is greater than 7, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Operand Operand on which to perform the bitfield operation.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..7.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..7.
|
|
@param AndData The value to AND with the read value from the value.
|
|
@param OrData The value to OR with the result of the AND operation.
|
|
|
|
@return The new 8-bit value.
|
|
|
|
**/
|
|
UINT8
|
|
EFIAPI
|
|
BitFieldAndThenOr8 (
|
|
IN UINT8 Operand,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT8 AndData,
|
|
IN UINT8 OrData
|
|
);
|
|
|
|
/**
|
|
Returns a bit field from a 16-bit value.
|
|
|
|
Returns the bitfield specified by the StartBit and the EndBit from Operand.
|
|
|
|
If 16-bit operations are not supported, then ASSERT().
|
|
If StartBit is greater than 15, then ASSERT().
|
|
If EndBit is greater than 15, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
|
|
@param Operand Operand on which to perform the bitfield operation.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..15.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..15.
|
|
|
|
@return The bit field read.
|
|
|
|
**/
|
|
UINT16
|
|
EFIAPI
|
|
BitFieldRead16 (
|
|
IN UINT16 Operand,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit
|
|
);
|
|
|
|
/**
|
|
Writes a bit field to a 16-bit value, and returns the result.
|
|
|
|
Writes Value to the bit field specified by the StartBit and the EndBit in
|
|
Operand. All other bits in Operand are preserved. The new 16-bit value is
|
|
returned.
|
|
|
|
If 16-bit operations are not supported, then ASSERT().
|
|
If StartBit is greater than 15, then ASSERT().
|
|
If EndBit is greater than 15, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Operand Operand on which to perform the bitfield operation.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..15.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..15.
|
|
@param Value New value of the bit field.
|
|
|
|
@return The new 16-bit value.
|
|
|
|
**/
|
|
UINT16
|
|
EFIAPI
|
|
BitFieldWrite16 (
|
|
IN UINT16 Operand,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT16 Value
|
|
);
|
|
|
|
/**
|
|
Reads a bit field from a 16-bit value, performs a bitwise OR, and returns the
|
|
result.
|
|
|
|
Performs a bitwise OR between the bit field specified by StartBit
|
|
and EndBit in Operand and the value specified by OrData. All other bits in
|
|
Operand are preserved. The new 16-bit value is returned.
|
|
|
|
If 16-bit operations are not supported, then ASSERT().
|
|
If StartBit is greater than 15, then ASSERT().
|
|
If EndBit is greater than 15, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Operand Operand on which to perform the bitfield operation.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..15.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..15.
|
|
@param OrData The value to OR with the read value from the value
|
|
|
|
@return The new 16-bit value.
|
|
|
|
**/
|
|
UINT16
|
|
EFIAPI
|
|
BitFieldOr16 (
|
|
IN UINT16 Operand,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT16 OrData
|
|
);
|
|
|
|
/**
|
|
Reads a bit field from a 16-bit value, performs a bitwise AND, and returns
|
|
the result.
|
|
|
|
Performs a bitwise AND between the bit field specified by StartBit and EndBit
|
|
in Operand and the value specified by AndData. All other bits in Operand are
|
|
preserved. The new 16-bit value is returned.
|
|
|
|
If 16-bit operations are not supported, then ASSERT().
|
|
If StartBit is greater than 15, then ASSERT().
|
|
If EndBit is greater than 15, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Operand Operand on which to perform the bitfield operation.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..15.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..15.
|
|
@param AndData The value to AND with the read value from the value
|
|
|
|
@return The new 16-bit value.
|
|
|
|
**/
|
|
UINT16
|
|
EFIAPI
|
|
BitFieldAnd16 (
|
|
IN UINT16 Operand,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT16 AndData
|
|
);
|
|
|
|
/**
|
|
Reads a bit field from a 16-bit value, performs a bitwise AND followed by a
|
|
bitwise OR, and returns the result.
|
|
|
|
Performs a bitwise AND between the bit field specified by StartBit and EndBit
|
|
in Operand and the value specified by AndData, followed by a bitwise
|
|
OR with value specified by OrData. All other bits in Operand are
|
|
preserved. The new 16-bit value is returned.
|
|
|
|
If 16-bit operations are not supported, then ASSERT().
|
|
If StartBit is greater than 15, then ASSERT().
|
|
If EndBit is greater than 15, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Operand Operand on which to perform the bitfield operation.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..15.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..15.
|
|
@param AndData The value to AND with the read value from the value.
|
|
@param OrData The value to OR with the result of the AND operation.
|
|
|
|
@return The new 16-bit value.
|
|
|
|
**/
|
|
UINT16
|
|
EFIAPI
|
|
BitFieldAndThenOr16 (
|
|
IN UINT16 Operand,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT16 AndData,
|
|
IN UINT16 OrData
|
|
);
|
|
|
|
/**
|
|
Returns a bit field from a 32-bit value.
|
|
|
|
Returns the bitfield specified by the StartBit and the EndBit from Operand.
|
|
|
|
If 32-bit operations are not supported, then ASSERT().
|
|
If StartBit is greater than 31, then ASSERT().
|
|
If EndBit is greater than 31, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
|
|
@param Operand Operand on which to perform the bitfield operation.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..31.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..31.
|
|
|
|
@return The bit field read.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
BitFieldRead32 (
|
|
IN UINT32 Operand,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit
|
|
);
|
|
|
|
/**
|
|
Writes a bit field to a 32-bit value, and returns the result.
|
|
|
|
Writes Value to the bit field specified by the StartBit and the EndBit in
|
|
Operand. All other bits in Operand are preserved. The new 32-bit value is
|
|
returned.
|
|
|
|
If 32-bit operations are not supported, then ASSERT().
|
|
If StartBit is greater than 31, then ASSERT().
|
|
If EndBit is greater than 31, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Operand Operand on which to perform the bitfield operation.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..31.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..31.
|
|
@param Value New value of the bit field.
|
|
|
|
@return The new 32-bit value.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
BitFieldWrite32 (
|
|
IN UINT32 Operand,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT32 Value
|
|
);
|
|
|
|
/**
|
|
Reads a bit field from a 32-bit value, performs a bitwise OR, and returns the
|
|
result.
|
|
|
|
Performs a bitwise OR between the bit field specified by StartBit
|
|
and EndBit in Operand and the value specified by OrData. All other bits in
|
|
Operand are preserved. The new 32-bit value is returned.
|
|
|
|
If 32-bit operations are not supported, then ASSERT().
|
|
If StartBit is greater than 31, then ASSERT().
|
|
If EndBit is greater than 31, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Operand Operand on which to perform the bitfield operation.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..31.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..31.
|
|
@param OrData The value to OR with the read value from the value.
|
|
|
|
@return The new 32-bit value.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
BitFieldOr32 (
|
|
IN UINT32 Operand,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT32 OrData
|
|
);
|
|
|
|
/**
|
|
Reads a bit field from a 32-bit value, performs a bitwise AND, and returns
|
|
the result.
|
|
|
|
Performs a bitwise AND between the bit field specified by StartBit and EndBit
|
|
in Operand and the value specified by AndData. All other bits in Operand are
|
|
preserved. The new 32-bit value is returned.
|
|
|
|
If 32-bit operations are not supported, then ASSERT().
|
|
If StartBit is greater than 31, then ASSERT().
|
|
If EndBit is greater than 31, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Operand Operand on which to perform the bitfield operation.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..31.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..31.
|
|
@param AndData The value to AND with the read value from the value
|
|
|
|
@return The new 32-bit value.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
BitFieldAnd32 (
|
|
IN UINT32 Operand,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT32 AndData
|
|
);
|
|
|
|
/**
|
|
Reads a bit field from a 32-bit value, performs a bitwise AND followed by a
|
|
bitwise OR, and returns the result.
|
|
|
|
Performs a bitwise AND between the bit field specified by StartBit and EndBit
|
|
in Operand and the value specified by AndData, followed by a bitwise
|
|
OR with value specified by OrData. All other bits in Operand are
|
|
preserved. The new 32-bit value is returned.
|
|
|
|
If 32-bit operations are not supported, then ASSERT().
|
|
If StartBit is greater than 31, then ASSERT().
|
|
If EndBit is greater than 31, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Operand Operand on which to perform the bitfield operation.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..31.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..31.
|
|
@param AndData The value to AND with the read value from the value.
|
|
@param OrData The value to OR with the result of the AND operation.
|
|
|
|
@return The new 32-bit value.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
BitFieldAndThenOr32 (
|
|
IN UINT32 Operand,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT32 AndData,
|
|
IN UINT32 OrData
|
|
);
|
|
|
|
/**
|
|
Returns a bit field from a 64-bit value.
|
|
|
|
Returns the bitfield specified by the StartBit and the EndBit from Operand.
|
|
|
|
If 64-bit operations are not supported, then ASSERT().
|
|
If StartBit is greater than 63, then ASSERT().
|
|
If EndBit is greater than 63, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
|
|
@param Operand Operand on which to perform the bitfield operation.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..63.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..63.
|
|
|
|
@return The bit field read.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
BitFieldRead64 (
|
|
IN UINT64 Operand,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit
|
|
);
|
|
|
|
/**
|
|
Writes a bit field to a 64-bit value, and returns the result.
|
|
|
|
Writes Value to the bit field specified by the StartBit and the EndBit in
|
|
Operand. All other bits in Operand are preserved. The new 64-bit value is
|
|
returned.
|
|
|
|
If 64-bit operations are not supported, then ASSERT().
|
|
If StartBit is greater than 63, then ASSERT().
|
|
If EndBit is greater than 63, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Operand Operand on which to perform the bitfield operation.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..63.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..63.
|
|
@param Value New value of the bit field.
|
|
|
|
@return The new 64-bit value.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
BitFieldWrite64 (
|
|
IN UINT64 Operand,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT64 Value
|
|
);
|
|
|
|
/**
|
|
Reads a bit field from a 64-bit value, performs a bitwise OR, and returns the
|
|
result.
|
|
|
|
Performs a bitwise OR between the bit field specified by StartBit
|
|
and EndBit in Operand and the value specified by OrData. All other bits in
|
|
Operand are preserved. The new 64-bit value is returned.
|
|
|
|
If 64-bit operations are not supported, then ASSERT().
|
|
If StartBit is greater than 63, then ASSERT().
|
|
If EndBit is greater than 63, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Operand Operand on which to perform the bitfield operation.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..63.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..63.
|
|
@param OrData The value to OR with the read value from the value
|
|
|
|
@return The new 64-bit value.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
BitFieldOr64 (
|
|
IN UINT64 Operand,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT64 OrData
|
|
);
|
|
|
|
/**
|
|
Reads a bit field from a 64-bit value, performs a bitwise AND, and returns
|
|
the result.
|
|
|
|
Performs a bitwise AND between the bit field specified by StartBit and EndBit
|
|
in Operand and the value specified by AndData. All other bits in Operand are
|
|
preserved. The new 64-bit value is returned.
|
|
|
|
If 64-bit operations are not supported, then ASSERT().
|
|
If StartBit is greater than 63, then ASSERT().
|
|
If EndBit is greater than 63, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Operand Operand on which to perform the bitfield operation.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..63.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..63.
|
|
@param AndData The value to AND with the read value from the value
|
|
|
|
@return The new 64-bit value.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
BitFieldAnd64 (
|
|
IN UINT64 Operand,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT64 AndData
|
|
);
|
|
|
|
/**
|
|
Reads a bit field from a 64-bit value, performs a bitwise AND followed by a
|
|
bitwise OR, and returns the result.
|
|
|
|
Performs a bitwise AND between the bit field specified by StartBit and EndBit
|
|
in Operand and the value specified by AndData, followed by a bitwise
|
|
OR with value specified by OrData. All other bits in Operand are
|
|
preserved. The new 64-bit value is returned.
|
|
|
|
If 64-bit operations are not supported, then ASSERT().
|
|
If StartBit is greater than 63, then ASSERT().
|
|
If EndBit is greater than 63, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Operand Operand on which to perform the bitfield operation.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..63.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..63.
|
|
@param AndData The value to AND with the read value from the value.
|
|
@param OrData The value to OR with the result of the AND operation.
|
|
|
|
@return The new 64-bit value.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
BitFieldAndThenOr64 (
|
|
IN UINT64 Operand,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT64 AndData,
|
|
IN UINT64 OrData
|
|
);
|
|
|
|
/**
|
|
Reads a bit field from a 32-bit value, counts and returns
|
|
the number of set bits.
|
|
|
|
Counts the number of set bits in the bit field specified by
|
|
StartBit and EndBit in Operand. The count is returned.
|
|
|
|
If StartBit is greater than 31, then ASSERT().
|
|
If EndBit is greater than 31, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
|
|
@param Operand Operand on which to perform the bitfield operation.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..31.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..31.
|
|
|
|
@return The number of bits set between StartBit and EndBit.
|
|
|
|
**/
|
|
UINT8
|
|
EFIAPI
|
|
BitFieldCountOnes32 (
|
|
IN UINT32 Operand,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit
|
|
);
|
|
|
|
/**
|
|
Reads a bit field from a 64-bit value, counts and returns
|
|
the number of set bits.
|
|
|
|
Counts the number of set bits in the bit field specified by
|
|
StartBit and EndBit in Operand. The count is returned.
|
|
|
|
If StartBit is greater than 63, then ASSERT().
|
|
If EndBit is greater than 63, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
|
|
@param Operand Operand on which to perform the bitfield operation.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..63.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..63.
|
|
|
|
@return The number of bits set between StartBit and EndBit.
|
|
|
|
**/
|
|
UINT8
|
|
EFIAPI
|
|
BitFieldCountOnes64 (
|
|
IN UINT64 Operand,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit
|
|
);
|
|
|
|
//
|
|
// Base Library Checksum Functions
|
|
//
|
|
|
|
/**
|
|
Returns the sum of all elements in a buffer in unit of UINT8.
|
|
During calculation, the carry bits are dropped.
|
|
|
|
This function calculates the sum of all elements in a buffer
|
|
in unit of UINT8. The carry bits in result of addition are dropped.
|
|
The result is returned as UINT8. If Length is Zero, then Zero is
|
|
returned.
|
|
|
|
If Buffer is NULL, then ASSERT().
|
|
If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
|
|
|
|
@param Buffer The pointer to the buffer to carry out the sum operation.
|
|
@param Length The size, in bytes, of Buffer.
|
|
|
|
@return Sum The sum of Buffer with carry bits dropped during additions.
|
|
|
|
**/
|
|
UINT8
|
|
EFIAPI
|
|
CalculateSum8 (
|
|
IN CONST UINT8 *Buffer,
|
|
IN UINTN Length
|
|
);
|
|
|
|
/**
|
|
Returns the two's complement checksum of all elements in a buffer
|
|
of 8-bit values.
|
|
|
|
This function first calculates the sum of the 8-bit values in the
|
|
buffer specified by Buffer and Length. The carry bits in the result
|
|
of addition are dropped. Then, the two's complement of the sum is
|
|
returned. If Length is 0, then 0 is returned.
|
|
|
|
If Buffer is NULL, then ASSERT().
|
|
If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
|
|
|
|
@param Buffer The pointer to the buffer to carry out the checksum operation.
|
|
@param Length The size, in bytes, of Buffer.
|
|
|
|
@return Checksum The two's complement checksum of Buffer.
|
|
|
|
**/
|
|
UINT8
|
|
EFIAPI
|
|
CalculateCheckSum8 (
|
|
IN CONST UINT8 *Buffer,
|
|
IN UINTN Length
|
|
);
|
|
|
|
/**
|
|
Returns the sum of all elements in a buffer of 16-bit values. During
|
|
calculation, the carry bits are dropped.
|
|
|
|
This function calculates the sum of the 16-bit values in the buffer
|
|
specified by Buffer and Length. The carry bits in result of addition are dropped.
|
|
The 16-bit result is returned. If Length is 0, then 0 is returned.
|
|
|
|
If Buffer is NULL, then ASSERT().
|
|
If Buffer is not aligned on a 16-bit boundary, then ASSERT().
|
|
If Length is not aligned on a 16-bit boundary, then ASSERT().
|
|
If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
|
|
|
|
@param Buffer The pointer to the buffer to carry out the sum operation.
|
|
@param Length The size, in bytes, of Buffer.
|
|
|
|
@return Sum The sum of Buffer with carry bits dropped during additions.
|
|
|
|
**/
|
|
UINT16
|
|
EFIAPI
|
|
CalculateSum16 (
|
|
IN CONST UINT16 *Buffer,
|
|
IN UINTN Length
|
|
);
|
|
|
|
/**
|
|
Returns the two's complement checksum of all elements in a buffer of
|
|
16-bit values.
|
|
|
|
This function first calculates the sum of the 16-bit values in the buffer
|
|
specified by Buffer and Length. The carry bits in the result of addition
|
|
are dropped. Then, the two's complement of the sum is returned. If Length
|
|
is 0, then 0 is returned.
|
|
|
|
If Buffer is NULL, then ASSERT().
|
|
If Buffer is not aligned on a 16-bit boundary, then ASSERT().
|
|
If Length is not aligned on a 16-bit boundary, then ASSERT().
|
|
If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
|
|
|
|
@param Buffer The pointer to the buffer to carry out the checksum operation.
|
|
@param Length The size, in bytes, of Buffer.
|
|
|
|
@return Checksum The two's complement checksum of Buffer.
|
|
|
|
**/
|
|
UINT16
|
|
EFIAPI
|
|
CalculateCheckSum16 (
|
|
IN CONST UINT16 *Buffer,
|
|
IN UINTN Length
|
|
);
|
|
|
|
/**
|
|
Returns the sum of all elements in a buffer of 32-bit values. During
|
|
calculation, the carry bits are dropped.
|
|
|
|
This function calculates the sum of the 32-bit values in the buffer
|
|
specified by Buffer and Length. The carry bits in result of addition are dropped.
|
|
The 32-bit result is returned. If Length is 0, then 0 is returned.
|
|
|
|
If Buffer is NULL, then ASSERT().
|
|
If Buffer is not aligned on a 32-bit boundary, then ASSERT().
|
|
If Length is not aligned on a 32-bit boundary, then ASSERT().
|
|
If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
|
|
|
|
@param Buffer The pointer to the buffer to carry out the sum operation.
|
|
@param Length The size, in bytes, of Buffer.
|
|
|
|
@return Sum The sum of Buffer with carry bits dropped during additions.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
CalculateSum32 (
|
|
IN CONST UINT32 *Buffer,
|
|
IN UINTN Length
|
|
);
|
|
|
|
/**
|
|
Returns the two's complement checksum of all elements in a buffer of
|
|
32-bit values.
|
|
|
|
This function first calculates the sum of the 32-bit values in the buffer
|
|
specified by Buffer and Length. The carry bits in the result of addition
|
|
are dropped. Then, the two's complement of the sum is returned. If Length
|
|
is 0, then 0 is returned.
|
|
|
|
If Buffer is NULL, then ASSERT().
|
|
If Buffer is not aligned on a 32-bit boundary, then ASSERT().
|
|
If Length is not aligned on a 32-bit boundary, then ASSERT().
|
|
If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
|
|
|
|
@param Buffer The pointer to the buffer to carry out the checksum operation.
|
|
@param Length The size, in bytes, of Buffer.
|
|
|
|
@return Checksum The two's complement checksum of Buffer.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
CalculateCheckSum32 (
|
|
IN CONST UINT32 *Buffer,
|
|
IN UINTN Length
|
|
);
|
|
|
|
/**
|
|
Returns the sum of all elements in a buffer of 64-bit values. During
|
|
calculation, the carry bits are dropped.
|
|
|
|
This function calculates the sum of the 64-bit values in the buffer
|
|
specified by Buffer and Length. The carry bits in result of addition are dropped.
|
|
The 64-bit result is returned. If Length is 0, then 0 is returned.
|
|
|
|
If Buffer is NULL, then ASSERT().
|
|
If Buffer is not aligned on a 64-bit boundary, then ASSERT().
|
|
If Length is not aligned on a 64-bit boundary, then ASSERT().
|
|
If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
|
|
|
|
@param Buffer The pointer to the buffer to carry out the sum operation.
|
|
@param Length The size, in bytes, of Buffer.
|
|
|
|
@return Sum The sum of Buffer with carry bits dropped during additions.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
CalculateSum64 (
|
|
IN CONST UINT64 *Buffer,
|
|
IN UINTN Length
|
|
);
|
|
|
|
/**
|
|
Returns the two's complement checksum of all elements in a buffer of
|
|
64-bit values.
|
|
|
|
This function first calculates the sum of the 64-bit values in the buffer
|
|
specified by Buffer and Length. The carry bits in the result of addition
|
|
are dropped. Then, the two's complement of the sum is returned. If Length
|
|
is 0, then 0 is returned.
|
|
|
|
If Buffer is NULL, then ASSERT().
|
|
If Buffer is not aligned on a 64-bit boundary, then ASSERT().
|
|
If Length is not aligned on a 64-bit boundary, then ASSERT().
|
|
If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
|
|
|
|
@param Buffer The pointer to the buffer to carry out the checksum operation.
|
|
@param Length The size, in bytes, of Buffer.
|
|
|
|
@return Checksum The two's complement checksum of Buffer.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
CalculateCheckSum64 (
|
|
IN CONST UINT64 *Buffer,
|
|
IN UINTN Length
|
|
);
|
|
|
|
/**
|
|
Computes and returns a 32-bit CRC for a data buffer.
|
|
CRC32 value bases on ITU-T V.42.
|
|
|
|
If Buffer is NULL, then ASSERT().
|
|
If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
|
|
|
|
@param[in] Buffer A pointer to the buffer on which the 32-bit CRC is to be computed.
|
|
@param[in] Length The number of bytes in the buffer Data.
|
|
|
|
@retval Crc32 The 32-bit CRC was computed for the data buffer.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
CalculateCrc32 (
|
|
IN VOID *Buffer,
|
|
IN UINTN Length
|
|
);
|
|
|
|
/**
|
|
Calculates the CRC16-ANSI checksum of the given buffer.
|
|
|
|
@param[in] Buffer Pointer to the buffer.
|
|
@param[in] Length Length of the buffer, in bytes.
|
|
@param[in] InitialValue Initial value of the CRC.
|
|
|
|
@return The CRC16-ANSI checksum.
|
|
**/
|
|
UINT16
|
|
EFIAPI
|
|
CalculateCrc16Ansi (
|
|
IN CONST VOID *Buffer,
|
|
IN UINTN Length,
|
|
IN UINT16 InitialValue
|
|
);
|
|
|
|
//
|
|
// Initial value for the CRC16-ANSI algorithm, when no prior checksum has been calculated.
|
|
//
|
|
#define CRC16ANSI_INIT 0xffff
|
|
|
|
/**
|
|
Calculates the CRC32c checksum of the given buffer.
|
|
|
|
@param[in] Buffer Pointer to the buffer.
|
|
@param[in] Length Length of the buffer, in bytes.
|
|
@param[in] InitialValue Initial value of the CRC.
|
|
|
|
@return The CRC32c checksum.
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
CalculateCrc32c (
|
|
IN CONST VOID *Buffer,
|
|
IN UINTN Length,
|
|
IN UINT32 InitialValue
|
|
);
|
|
|
|
//
|
|
// Base Library CPU Functions
|
|
//
|
|
|
|
/**
|
|
Function entry point used when a stack switch is requested with SwitchStack()
|
|
|
|
@param Context1 Context1 parameter passed into SwitchStack().
|
|
@param Context2 Context2 parameter passed into SwitchStack().
|
|
**/
|
|
typedef
|
|
VOID
|
|
(EFIAPI *SWITCH_STACK_ENTRY_POINT)(
|
|
IN VOID *Context1 OPTIONAL,
|
|
IN VOID *Context2 OPTIONAL
|
|
);
|
|
|
|
/**
|
|
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.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
MemoryFence (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Saves the current CPU context that can be restored with a call to LongJump()
|
|
and returns 0.
|
|
|
|
Saves the current CPU context in the buffer specified by JumpBuffer and
|
|
returns 0. The initial call to SetJump() must always return 0. Subsequent
|
|
calls to LongJump() cause a non-zero value to be returned by SetJump().
|
|
|
|
If JumpBuffer is NULL, then ASSERT().
|
|
For Itanium processors, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().
|
|
|
|
NOTE: The structure BASE_LIBRARY_JUMP_BUFFER is CPU architecture specific.
|
|
The same structure must never be used for more than one CPU architecture context.
|
|
For example, a BASE_LIBRARY_JUMP_BUFFER allocated by an IA-32 module must never be used from an x64 module.
|
|
SetJump()/LongJump() is not currently supported for the EBC processor type.
|
|
|
|
@param JumpBuffer A pointer to CPU context buffer.
|
|
|
|
@retval 0 Indicates a return from SetJump().
|
|
|
|
**/
|
|
RETURNS_TWICE
|
|
UINTN
|
|
EFIAPI
|
|
SetJump (
|
|
OUT BASE_LIBRARY_JUMP_BUFFER *JumpBuffer
|
|
);
|
|
|
|
/**
|
|
Restores the CPU context that was saved with SetJump().
|
|
|
|
Restores the CPU context from the buffer specified by JumpBuffer. This
|
|
function never returns to the caller. Instead is resumes execution based on
|
|
the state of JumpBuffer.
|
|
|
|
If JumpBuffer is NULL, then ASSERT().
|
|
For Itanium processors, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().
|
|
If Value is 0, then ASSERT().
|
|
|
|
@param JumpBuffer A pointer to CPU context buffer.
|
|
@param Value The value to return when the SetJump() context is
|
|
restored and must be non-zero.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
LongJump (
|
|
IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer,
|
|
IN UINTN Value
|
|
);
|
|
|
|
/**
|
|
Enables CPU interrupts.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
EnableInterrupts (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Disables CPU interrupts.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
DisableInterrupts (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Disables CPU interrupts and returns the interrupt state prior to the disable
|
|
operation.
|
|
|
|
@retval TRUE CPU interrupts were enabled on entry to this call.
|
|
@retval FALSE CPU interrupts were disabled on entry to this call.
|
|
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
SaveAndDisableInterrupts (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Enables CPU interrupts for the smallest window required to capture any
|
|
pending interrupts.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
EnableDisableInterrupts (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Retrieves the current CPU interrupt state.
|
|
|
|
Returns TRUE if interrupts are currently enabled. Otherwise
|
|
returns FALSE.
|
|
|
|
@retval TRUE CPU interrupts are enabled.
|
|
@retval FALSE CPU interrupts are disabled.
|
|
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
GetInterruptState (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Set the current CPU interrupt state.
|
|
|
|
Sets the current CPU interrupt state to the state specified by
|
|
InterruptState. If InterruptState is TRUE, then interrupts are enabled. If
|
|
InterruptState is FALSE, then interrupts are disabled. InterruptState is
|
|
returned.
|
|
|
|
@param InterruptState TRUE if interrupts should enabled. FALSE if
|
|
interrupts should be disabled.
|
|
|
|
@return InterruptState
|
|
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
SetInterruptState (
|
|
IN BOOLEAN InterruptState
|
|
);
|
|
|
|
/**
|
|
Requests CPU to pause for a short period of time.
|
|
|
|
Requests CPU to pause for a short period of time. Typically used in MP
|
|
systems to prevent memory starvation while waiting for a spin lock.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
CpuPause (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Transfers control to a function starting with a new stack.
|
|
|
|
Transfers control to the function specified by EntryPoint using the
|
|
new stack specified by NewStack and passing in the parameters specified
|
|
by Context1 and Context2. Context1 and Context2 are optional and may
|
|
be NULL. The function EntryPoint must never return. This function
|
|
supports a variable number of arguments following the NewStack parameter.
|
|
These additional arguments are ignored on IA-32, x64, and EBC architectures.
|
|
Itanium processors expect one additional parameter of type VOID * that specifies
|
|
the new backing store pointer.
|
|
|
|
If EntryPoint is NULL, then ASSERT().
|
|
If NewStack is NULL, then ASSERT().
|
|
|
|
@param EntryPoint A pointer to function to call with the new stack.
|
|
@param Context1 A pointer to the context to pass into the EntryPoint
|
|
function.
|
|
@param Context2 A pointer to the context to pass into the EntryPoint
|
|
function.
|
|
@param NewStack A pointer to the new stack to use for the EntryPoint
|
|
function.
|
|
@param ... This variable argument list is ignored for IA-32, x64, and
|
|
EBC architectures. For Itanium processors, this variable
|
|
argument list is expected to contain a single parameter of
|
|
type VOID * that specifies the new backing store pointer.
|
|
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
SwitchStack (
|
|
IN SWITCH_STACK_ENTRY_POINT EntryPoint,
|
|
IN VOID *Context1 OPTIONAL,
|
|
IN VOID *Context2 OPTIONAL,
|
|
IN VOID *NewStack,
|
|
...
|
|
);
|
|
|
|
/**
|
|
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.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
CpuBreakpoint (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Executes an infinite loop.
|
|
|
|
Forces the CPU to execute an infinite loop. A debugger may be used to skip
|
|
past the loop and the code that follows the loop must execute properly. This
|
|
implies that the infinite loop must not cause the code that follow it to be
|
|
optimized away.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
CpuDeadLoop (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Uses as a barrier to stop speculative execution.
|
|
|
|
Ensures that no later instruction will execute speculatively, until all prior
|
|
instructions have completed.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
SpeculationBarrier (
|
|
VOID
|
|
);
|
|
|
|
#if defined (MDE_CPU_X64) || defined (MDE_CPU_IA32)
|
|
|
|
/**
|
|
The TDCALL instruction causes a VM exit to the Intel TDX module. It is
|
|
used to call guest-side Intel TDX functions, either local or a TD exit
|
|
to the host VMM, as selected by Leaf.
|
|
|
|
@param[in] Leaf Leaf number of TDCALL instruction
|
|
@param[in] Arg1 Arg1
|
|
@param[in] Arg2 Arg2
|
|
@param[in] Arg3 Arg3
|
|
@param[in,out] Results Returned result of the Leaf function
|
|
|
|
@return 0 A successful call
|
|
@return Other See individual leaf functions
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
TdCall (
|
|
IN UINT64 Leaf,
|
|
IN UINT64 Arg1,
|
|
IN UINT64 Arg2,
|
|
IN UINT64 Arg3,
|
|
IN OUT VOID *Results
|
|
);
|
|
|
|
/**
|
|
TDVMALL is a leaf function 0 for TDCALL. It helps invoke services from the
|
|
host VMM to pass/receive information.
|
|
|
|
@param[in] Leaf Number of sub-functions
|
|
@param[in] Arg1 Arg1
|
|
@param[in] Arg2 Arg2
|
|
@param[in] Arg3 Arg3
|
|
@param[in] Arg4 Arg4
|
|
@param[in,out] Results Returned result of the sub-function
|
|
|
|
@return 0 A successful call
|
|
@return Other See individual sub-functions
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
TdVmCall (
|
|
IN UINT64 Leaf,
|
|
IN UINT64 Arg1,
|
|
IN UINT64 Arg2,
|
|
IN UINT64 Arg3,
|
|
IN UINT64 Arg4,
|
|
IN OUT VOID *Results
|
|
);
|
|
|
|
/**
|
|
Probe if TD is enabled.
|
|
|
|
@return TRUE TD is enabled.
|
|
@return FALSE TD is not enabled.
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
TdIsEnabled (
|
|
VOID
|
|
);
|
|
|
|
#endif
|
|
|
|
#if defined (MDE_CPU_X64)
|
|
//
|
|
// The page size for the PVALIDATE instruction
|
|
//
|
|
typedef enum {
|
|
PvalidatePageSize4K = 0,
|
|
PvalidatePageSize2MB,
|
|
} PVALIDATE_PAGE_SIZE;
|
|
|
|
//
|
|
// PVALIDATE Return Code.
|
|
//
|
|
#define PVALIDATE_RET_SUCCESS 0
|
|
#define PVALIDATE_RET_FAIL_INPUT 1
|
|
#define PVALIDATE_RET_SIZE_MISMATCH 6
|
|
|
|
//
|
|
// The PVALIDATE instruction did not make any changes to the RMP entry.
|
|
//
|
|
#define PVALIDATE_RET_NO_RMPUPDATE 255
|
|
|
|
/**
|
|
Execute a PVALIDATE instruction to validate or to rescinds validation of a guest
|
|
page's RMP entry.
|
|
|
|
The instruction is available only when CPUID Fn8000_001F_EAX[SNP]=1.
|
|
|
|
The function is available on X64.
|
|
|
|
@param[in] PageSize The page size to use.
|
|
@param[in] Validate If TRUE, validate the guest virtual address
|
|
otherwise invalidate the guest virtual address.
|
|
@param[in] Address The guest virtual address.
|
|
|
|
@retval PVALIDATE_RET_SUCCESS The PVALIDATE instruction succeeded, and
|
|
updated the RMP entry.
|
|
@retval PVALIDATE_RET_NO_RMPUPDATE The PVALIDATE instruction succeeded, but
|
|
did not update the RMP entry.
|
|
@return Failure code from the PVALIDATE
|
|
instruction.
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
AsmPvalidate (
|
|
IN PVALIDATE_PAGE_SIZE PageSize,
|
|
IN BOOLEAN Validate,
|
|
IN PHYSICAL_ADDRESS Address
|
|
);
|
|
|
|
//
|
|
// RDX settings for RMPADJUST
|
|
//
|
|
#define RMPADJUST_VMPL_MAX 3
|
|
#define RMPADJUST_VMPL_MASK 0xFF
|
|
#define RMPADJUST_VMPL_SHIFT 0
|
|
#define RMPADJUST_PERMISSION_MASK_MASK 0xFF
|
|
#define RMPADJUST_PERMISSION_MASK_SHIFT 8
|
|
#define RMPADJUST_VMSA_PAGE_BIT BIT16
|
|
|
|
/**
|
|
Adjusts the permissions of an SEV-SNP guest page.
|
|
|
|
Executes a RMPADJUST instruction with the register state specified by Rax,
|
|
Rcx, and Rdx. Returns Eax. This function is only available on X64.
|
|
|
|
The instruction is available only when CPUID Fn8000_001F_EAX[SNP]=1.
|
|
|
|
@param[in] Rax The value to load into RAX before executing the RMPADJUST
|
|
instruction.
|
|
@param[in] Rcx The value to load into RCX before executing the RMPADJUST
|
|
instruction.
|
|
@param[in] Rdx The value to load into RDX before executing the RMPADJUST
|
|
instruction.
|
|
|
|
@return Eax
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
AsmRmpAdjust (
|
|
IN UINT64 Rax,
|
|
IN UINT64 Rcx,
|
|
IN UINT64 Rdx
|
|
);
|
|
|
|
#endif
|
|
|
|
#if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)
|
|
///
|
|
/// IA32 and x64 Specific Functions.
|
|
/// Byte packed structure for 16-bit Real Mode EFLAGS.
|
|
///
|
|
typedef union {
|
|
struct {
|
|
UINT32 CF : 1; ///< Carry Flag.
|
|
UINT32 Reserved_0 : 1; ///< Reserved.
|
|
UINT32 PF : 1; ///< Parity Flag.
|
|
UINT32 Reserved_1 : 1; ///< Reserved.
|
|
UINT32 AF : 1; ///< Auxiliary Carry Flag.
|
|
UINT32 Reserved_2 : 1; ///< Reserved.
|
|
UINT32 ZF : 1; ///< Zero Flag.
|
|
UINT32 SF : 1; ///< Sign Flag.
|
|
UINT32 TF : 1; ///< Trap Flag.
|
|
UINT32 IF : 1; ///< Interrupt Enable Flag.
|
|
UINT32 DF : 1; ///< Direction Flag.
|
|
UINT32 OF : 1; ///< Overflow Flag.
|
|
UINT32 IOPL : 2; ///< I/O Privilege Level.
|
|
UINT32 NT : 1; ///< Nested Task.
|
|
UINT32 Reserved_3 : 1; ///< Reserved.
|
|
} Bits;
|
|
UINT16 Uint16;
|
|
} IA32_FLAGS16;
|
|
|
|
///
|
|
/// Byte packed structure for EFLAGS/RFLAGS.
|
|
/// 32-bits on IA-32.
|
|
/// 64-bits on x64. The upper 32-bits on x64 are reserved.
|
|
///
|
|
typedef union {
|
|
struct {
|
|
UINT32 CF : 1; ///< Carry Flag.
|
|
UINT32 Reserved_0 : 1; ///< Reserved.
|
|
UINT32 PF : 1; ///< Parity Flag.
|
|
UINT32 Reserved_1 : 1; ///< Reserved.
|
|
UINT32 AF : 1; ///< Auxiliary Carry Flag.
|
|
UINT32 Reserved_2 : 1; ///< Reserved.
|
|
UINT32 ZF : 1; ///< Zero Flag.
|
|
UINT32 SF : 1; ///< Sign Flag.
|
|
UINT32 TF : 1; ///< Trap Flag.
|
|
UINT32 IF : 1; ///< Interrupt Enable Flag.
|
|
UINT32 DF : 1; ///< Direction Flag.
|
|
UINT32 OF : 1; ///< Overflow Flag.
|
|
UINT32 IOPL : 2; ///< I/O Privilege Level.
|
|
UINT32 NT : 1; ///< Nested Task.
|
|
UINT32 Reserved_3 : 1; ///< Reserved.
|
|
UINT32 RF : 1; ///< Resume Flag.
|
|
UINT32 VM : 1; ///< Virtual 8086 Mode.
|
|
UINT32 AC : 1; ///< Alignment Check.
|
|
UINT32 VIF : 1; ///< Virtual Interrupt Flag.
|
|
UINT32 VIP : 1; ///< Virtual Interrupt Pending.
|
|
UINT32 ID : 1; ///< ID Flag.
|
|
UINT32 Reserved_4 : 10; ///< Reserved.
|
|
} Bits;
|
|
UINTN UintN;
|
|
} IA32_EFLAGS32;
|
|
|
|
///
|
|
/// Byte packed structure for Control Register 0 (CR0).
|
|
/// 32-bits on IA-32.
|
|
/// 64-bits on x64. The upper 32-bits on x64 are reserved.
|
|
///
|
|
typedef union {
|
|
struct {
|
|
UINT32 PE : 1; ///< Protection Enable.
|
|
UINT32 MP : 1; ///< Monitor Coprocessor.
|
|
UINT32 EM : 1; ///< Emulation.
|
|
UINT32 TS : 1; ///< Task Switched.
|
|
UINT32 ET : 1; ///< Extension Type.
|
|
UINT32 NE : 1; ///< Numeric Error.
|
|
UINT32 Reserved_0 : 10; ///< Reserved.
|
|
UINT32 WP : 1; ///< Write Protect.
|
|
UINT32 Reserved_1 : 1; ///< Reserved.
|
|
UINT32 AM : 1; ///< Alignment Mask.
|
|
UINT32 Reserved_2 : 10; ///< Reserved.
|
|
UINT32 NW : 1; ///< Mot Write-through.
|
|
UINT32 CD : 1; ///< Cache Disable.
|
|
UINT32 PG : 1; ///< Paging.
|
|
} Bits;
|
|
UINTN UintN;
|
|
} IA32_CR0;
|
|
|
|
///
|
|
/// Byte packed structure for Control Register 4 (CR4).
|
|
/// 32-bits on IA-32.
|
|
/// 64-bits on x64. The upper 32-bits on x64 are reserved.
|
|
///
|
|
typedef union {
|
|
struct {
|
|
UINT32 VME : 1; ///< Virtual-8086 Mode Extensions.
|
|
UINT32 PVI : 1; ///< Protected-Mode Virtual Interrupts.
|
|
UINT32 TSD : 1; ///< Time Stamp Disable.
|
|
UINT32 DE : 1; ///< Debugging Extensions.
|
|
UINT32 PSE : 1; ///< Page Size Extensions.
|
|
UINT32 PAE : 1; ///< Physical Address Extension.
|
|
UINT32 MCE : 1; ///< Machine Check Enable.
|
|
UINT32 PGE : 1; ///< Page Global Enable.
|
|
UINT32 PCE : 1; ///< Performance Monitoring Counter
|
|
///< Enable.
|
|
UINT32 OSFXSR : 1; ///< Operating System Support for
|
|
///< FXSAVE and FXRSTOR instructions
|
|
UINT32 OSXMMEXCPT : 1; ///< Operating System Support for
|
|
///< Unmasked SIMD Floating Point
|
|
///< Exceptions.
|
|
UINT32 UMIP : 1; ///< User-Mode Instruction Prevention.
|
|
UINT32 LA57 : 1; ///< Linear Address 57bit.
|
|
UINT32 VMXE : 1; ///< VMX Enable.
|
|
UINT32 SMXE : 1; ///< SMX Enable.
|
|
UINT32 Reserved_3 : 1; ///< Reserved.
|
|
UINT32 FSGSBASE : 1; ///< FSGSBASE Enable.
|
|
UINT32 PCIDE : 1; ///< PCID Enable.
|
|
UINT32 OSXSAVE : 1; ///< XSAVE and Processor Extended States Enable.
|
|
UINT32 Reserved_4 : 1; ///< Reserved.
|
|
UINT32 SMEP : 1; ///< SMEP Enable.
|
|
UINT32 SMAP : 1; ///< SMAP Enable.
|
|
UINT32 PKE : 1; ///< Protection-Key Enable.
|
|
UINT32 Reserved_5 : 9; ///< Reserved.
|
|
} Bits;
|
|
UINTN UintN;
|
|
} IA32_CR4;
|
|
|
|
///
|
|
/// Byte packed structure for a segment descriptor in a GDT/LDT.
|
|
///
|
|
typedef union {
|
|
struct {
|
|
UINT32 LimitLow : 16;
|
|
UINT32 BaseLow : 16;
|
|
UINT32 BaseMid : 8;
|
|
UINT32 Type : 4;
|
|
UINT32 S : 1;
|
|
UINT32 DPL : 2;
|
|
UINT32 P : 1;
|
|
UINT32 LimitHigh : 4;
|
|
UINT32 AVL : 1;
|
|
UINT32 L : 1;
|
|
UINT32 DB : 1;
|
|
UINT32 G : 1;
|
|
UINT32 BaseHigh : 8;
|
|
} Bits;
|
|
UINT64 Uint64;
|
|
} IA32_SEGMENT_DESCRIPTOR;
|
|
|
|
///
|
|
/// Byte packed structure for an IDTR, GDTR, LDTR descriptor.
|
|
///
|
|
#pragma pack (1)
|
|
typedef struct {
|
|
UINT16 Limit;
|
|
UINTN Base;
|
|
} IA32_DESCRIPTOR;
|
|
#pragma pack ()
|
|
|
|
#define IA32_IDT_GATE_TYPE_TASK 0x85
|
|
#define IA32_IDT_GATE_TYPE_INTERRUPT_16 0x86
|
|
#define IA32_IDT_GATE_TYPE_TRAP_16 0x87
|
|
#define IA32_IDT_GATE_TYPE_INTERRUPT_32 0x8E
|
|
#define IA32_IDT_GATE_TYPE_TRAP_32 0x8F
|
|
|
|
#define IA32_GDT_TYPE_TSS 0x9
|
|
#define IA32_GDT_ALIGNMENT 8
|
|
|
|
#if defined (MDE_CPU_IA32)
|
|
///
|
|
/// Byte packed structure for an IA-32 Interrupt Gate Descriptor.
|
|
///
|
|
typedef union {
|
|
struct {
|
|
UINT32 OffsetLow : 16; ///< Offset bits 15..0.
|
|
UINT32 Selector : 16; ///< Selector.
|
|
UINT32 Reserved_0 : 8; ///< Reserved.
|
|
UINT32 GateType : 8; ///< Gate Type. See #defines above.
|
|
UINT32 OffsetHigh : 16; ///< Offset bits 31..16.
|
|
} Bits;
|
|
UINT64 Uint64;
|
|
} IA32_IDT_GATE_DESCRIPTOR;
|
|
|
|
#pragma pack (1)
|
|
//
|
|
// IA32 Task-State Segment Definition
|
|
//
|
|
typedef struct {
|
|
UINT16 PreviousTaskLink;
|
|
UINT16 Reserved_2;
|
|
UINT32 ESP0;
|
|
UINT16 SS0;
|
|
UINT16 Reserved_10;
|
|
UINT32 ESP1;
|
|
UINT16 SS1;
|
|
UINT16 Reserved_18;
|
|
UINT32 ESP2;
|
|
UINT16 SS2;
|
|
UINT16 Reserved_26;
|
|
UINT32 CR3;
|
|
UINT32 EIP;
|
|
UINT32 EFLAGS;
|
|
UINT32 EAX;
|
|
UINT32 ECX;
|
|
UINT32 EDX;
|
|
UINT32 EBX;
|
|
UINT32 ESP;
|
|
UINT32 EBP;
|
|
UINT32 ESI;
|
|
UINT32 EDI;
|
|
UINT16 ES;
|
|
UINT16 Reserved_74;
|
|
UINT16 CS;
|
|
UINT16 Reserved_78;
|
|
UINT16 SS;
|
|
UINT16 Reserved_82;
|
|
UINT16 DS;
|
|
UINT16 Reserved_86;
|
|
UINT16 FS;
|
|
UINT16 Reserved_90;
|
|
UINT16 GS;
|
|
UINT16 Reserved_94;
|
|
UINT16 LDTSegmentSelector;
|
|
UINT16 Reserved_98;
|
|
UINT16 T;
|
|
UINT16 IOMapBaseAddress;
|
|
} IA32_TASK_STATE_SEGMENT;
|
|
|
|
typedef union {
|
|
struct {
|
|
UINT32 LimitLow : 16; ///< Segment Limit 15..00
|
|
UINT32 BaseLow : 16; ///< Base Address 15..00
|
|
UINT32 BaseMid : 8; ///< Base Address 23..16
|
|
UINT32 Type : 4; ///< Type (1 0 B 1)
|
|
UINT32 Reserved_43 : 1; ///< 0
|
|
UINT32 DPL : 2; ///< Descriptor Privilege Level
|
|
UINT32 P : 1; ///< Segment Present
|
|
UINT32 LimitHigh : 4; ///< Segment Limit 19..16
|
|
UINT32 AVL : 1; ///< Available for use by system software
|
|
UINT32 Reserved_52 : 2; ///< 0 0
|
|
UINT32 G : 1; ///< Granularity
|
|
UINT32 BaseHigh : 8; ///< Base Address 31..24
|
|
} Bits;
|
|
UINT64 Uint64;
|
|
} IA32_TSS_DESCRIPTOR;
|
|
#pragma pack ()
|
|
|
|
#endif // defined (MDE_CPU_IA32)
|
|
|
|
#if defined (MDE_CPU_X64)
|
|
///
|
|
/// Byte packed structure for an x64 Interrupt Gate Descriptor.
|
|
///
|
|
typedef union {
|
|
struct {
|
|
UINT32 OffsetLow : 16; ///< Offset bits 15..0.
|
|
UINT32 Selector : 16; ///< Selector.
|
|
UINT32 Reserved_0 : 8; ///< Reserved.
|
|
UINT32 GateType : 8; ///< Gate Type. See #defines above.
|
|
UINT32 OffsetHigh : 16; ///< Offset bits 31..16.
|
|
UINT32 OffsetUpper : 32; ///< Offset bits 63..32.
|
|
UINT32 Reserved_1 : 32; ///< Reserved.
|
|
} Bits;
|
|
struct {
|
|
UINT64 Uint64;
|
|
UINT64 Uint64_1;
|
|
} Uint128;
|
|
} IA32_IDT_GATE_DESCRIPTOR;
|
|
|
|
#pragma pack (1)
|
|
//
|
|
// IA32 Task-State Segment Definition
|
|
//
|
|
typedef struct {
|
|
UINT32 Reserved_0;
|
|
UINT64 RSP0;
|
|
UINT64 RSP1;
|
|
UINT64 RSP2;
|
|
UINT64 Reserved_28;
|
|
UINT64 IST[7];
|
|
UINT64 Reserved_92;
|
|
UINT16 Reserved_100;
|
|
UINT16 IOMapBaseAddress;
|
|
} IA32_TASK_STATE_SEGMENT;
|
|
|
|
typedef union {
|
|
struct {
|
|
UINT32 LimitLow : 16; ///< Segment Limit 15..00
|
|
UINT32 BaseLow : 16; ///< Base Address 15..00
|
|
UINT32 BaseMidl : 8; ///< Base Address 23..16
|
|
UINT32 Type : 4; ///< Type (1 0 B 1)
|
|
UINT32 Reserved_43 : 1; ///< 0
|
|
UINT32 DPL : 2; ///< Descriptor Privilege Level
|
|
UINT32 P : 1; ///< Segment Present
|
|
UINT32 LimitHigh : 4; ///< Segment Limit 19..16
|
|
UINT32 AVL : 1; ///< Available for use by system software
|
|
UINT32 Reserved_52 : 2; ///< 0 0
|
|
UINT32 G : 1; ///< Granularity
|
|
UINT32 BaseMidh : 8; ///< Base Address 31..24
|
|
UINT32 BaseHigh : 32; ///< Base Address 63..32
|
|
UINT32 Reserved_96 : 32; ///< Reserved
|
|
} Bits;
|
|
struct {
|
|
UINT64 Uint64;
|
|
UINT64 Uint64_1;
|
|
} Uint128;
|
|
} IA32_TSS_DESCRIPTOR;
|
|
#pragma pack ()
|
|
|
|
#endif // defined (MDE_CPU_X64)
|
|
|
|
///
|
|
/// Byte packed structure for an FP/SSE/SSE2 context.
|
|
///
|
|
typedef struct {
|
|
UINT8 Buffer[512];
|
|
} IA32_FX_BUFFER;
|
|
|
|
///
|
|
/// Structures for the 16-bit real mode thunks.
|
|
///
|
|
typedef struct {
|
|
UINT32 Reserved1;
|
|
UINT32 Reserved2;
|
|
UINT32 Reserved3;
|
|
UINT32 Reserved4;
|
|
UINT8 BL;
|
|
UINT8 BH;
|
|
UINT16 Reserved5;
|
|
UINT8 DL;
|
|
UINT8 DH;
|
|
UINT16 Reserved6;
|
|
UINT8 CL;
|
|
UINT8 CH;
|
|
UINT16 Reserved7;
|
|
UINT8 AL;
|
|
UINT8 AH;
|
|
UINT16 Reserved8;
|
|
} IA32_BYTE_REGS;
|
|
|
|
typedef struct {
|
|
UINT16 DI;
|
|
UINT16 Reserved1;
|
|
UINT16 SI;
|
|
UINT16 Reserved2;
|
|
UINT16 BP;
|
|
UINT16 Reserved3;
|
|
UINT16 SP;
|
|
UINT16 Reserved4;
|
|
UINT16 BX;
|
|
UINT16 Reserved5;
|
|
UINT16 DX;
|
|
UINT16 Reserved6;
|
|
UINT16 CX;
|
|
UINT16 Reserved7;
|
|
UINT16 AX;
|
|
UINT16 Reserved8;
|
|
} IA32_WORD_REGS;
|
|
|
|
typedef struct {
|
|
UINT32 EDI;
|
|
UINT32 ESI;
|
|
UINT32 EBP;
|
|
UINT32 ESP;
|
|
UINT32 EBX;
|
|
UINT32 EDX;
|
|
UINT32 ECX;
|
|
UINT32 EAX;
|
|
UINT16 DS;
|
|
UINT16 ES;
|
|
UINT16 FS;
|
|
UINT16 GS;
|
|
IA32_EFLAGS32 EFLAGS;
|
|
UINT32 Eip;
|
|
UINT16 CS;
|
|
UINT16 SS;
|
|
} IA32_DWORD_REGS;
|
|
|
|
typedef union {
|
|
IA32_DWORD_REGS E;
|
|
IA32_WORD_REGS X;
|
|
IA32_BYTE_REGS H;
|
|
} IA32_REGISTER_SET;
|
|
|
|
///
|
|
/// Byte packed structure for an 16-bit real mode thunks.
|
|
///
|
|
typedef struct {
|
|
IA32_REGISTER_SET *RealModeState;
|
|
VOID *RealModeBuffer;
|
|
UINT32 RealModeBufferSize;
|
|
UINT32 ThunkAttributes;
|
|
} THUNK_CONTEXT;
|
|
|
|
#define THUNK_ATTRIBUTE_BIG_REAL_MODE 0x00000001
|
|
#define THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15 0x00000002
|
|
#define THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL 0x00000004
|
|
|
|
///
|
|
/// Type definition for representing labels in NASM source code that allow for
|
|
/// the patching of immediate operands of IA32 and X64 instructions.
|
|
///
|
|
/// While the type is technically defined as a function type (note: not a
|
|
/// pointer-to-function type), such labels in NASM source code never stand for
|
|
/// actual functions, and identifiers declared with this function type should
|
|
/// never be called. This is also why the EFIAPI calling convention specifier
|
|
/// is missing from the typedef, and why the typedef does not follow the usual
|
|
/// edk2 coding style for function (or pointer-to-function) typedefs. The VOID
|
|
/// return type and the VOID argument list are merely artifacts.
|
|
///
|
|
typedef VOID (X86_ASSEMBLY_PATCH_LABEL) (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Retrieves CPUID information.
|
|
|
|
Executes the CPUID instruction with EAX set to the value specified by Index.
|
|
This function always returns Index.
|
|
If Eax is not NULL, then the value of EAX after CPUID is returned in Eax.
|
|
If Ebx is not NULL, then the value of EBX after CPUID is returned in Ebx.
|
|
If Ecx is not NULL, then the value of ECX after CPUID is returned in Ecx.
|
|
If Edx is not NULL, then the value of EDX after CPUID is returned in Edx.
|
|
This function is only available on IA-32 and x64.
|
|
|
|
@param Index The 32-bit value to load into EAX prior to invoking the CPUID
|
|
instruction.
|
|
@param Eax The pointer to the 32-bit EAX value returned by the CPUID
|
|
instruction. This is an optional parameter that may be NULL.
|
|
@param Ebx The pointer to the 32-bit EBX value returned by the CPUID
|
|
instruction. This is an optional parameter that may be NULL.
|
|
@param Ecx The pointer to the 32-bit ECX value returned by the CPUID
|
|
instruction. This is an optional parameter that may be NULL.
|
|
@param Edx The pointer to the 32-bit EDX value returned by the CPUID
|
|
instruction. This is an optional parameter that may be NULL.
|
|
|
|
@return Index.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
AsmCpuid (
|
|
IN UINT32 Index,
|
|
OUT UINT32 *Eax OPTIONAL,
|
|
OUT UINT32 *Ebx OPTIONAL,
|
|
OUT UINT32 *Ecx OPTIONAL,
|
|
OUT UINT32 *Edx OPTIONAL
|
|
);
|
|
|
|
/**
|
|
Retrieves CPUID information using an extended leaf identifier.
|
|
|
|
Executes the CPUID instruction with EAX set to the value specified by Index
|
|
and ECX set to the value specified by SubIndex. This function always returns
|
|
Index. This function is only available on IA-32 and x64.
|
|
|
|
If Eax is not NULL, then the value of EAX after CPUID is returned in Eax.
|
|
If Ebx is not NULL, then the value of EBX after CPUID is returned in Ebx.
|
|
If Ecx is not NULL, then the value of ECX after CPUID is returned in Ecx.
|
|
If Edx is not NULL, then the value of EDX after CPUID is returned in Edx.
|
|
|
|
@param Index The 32-bit value to load into EAX prior to invoking the
|
|
CPUID instruction.
|
|
@param SubIndex The 32-bit value to load into ECX prior to invoking the
|
|
CPUID instruction.
|
|
@param Eax The pointer to the 32-bit EAX value returned by the CPUID
|
|
instruction. This is an optional parameter that may be
|
|
NULL.
|
|
@param Ebx The pointer to the 32-bit EBX value returned by the CPUID
|
|
instruction. This is an optional parameter that may be
|
|
NULL.
|
|
@param Ecx The pointer to the 32-bit ECX value returned by the CPUID
|
|
instruction. This is an optional parameter that may be
|
|
NULL.
|
|
@param Edx The pointer to the 32-bit EDX value returned by the CPUID
|
|
instruction. This is an optional parameter that may be
|
|
NULL.
|
|
|
|
@return Index.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
AsmCpuidEx (
|
|
IN UINT32 Index,
|
|
IN UINT32 SubIndex,
|
|
OUT UINT32 *Eax OPTIONAL,
|
|
OUT UINT32 *Ebx OPTIONAL,
|
|
OUT UINT32 *Ecx OPTIONAL,
|
|
OUT UINT32 *Edx OPTIONAL
|
|
);
|
|
|
|
/**
|
|
Set CD bit and clear NW bit of CR0 followed by a WBINVD.
|
|
|
|
Disables the caches by setting the CD bit of CR0 to 1, clearing the NW bit of CR0 to 0,
|
|
and executing a WBINVD instruction. This function is only available on IA-32 and x64.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmDisableCache (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Perform a WBINVD and clear both the CD and NW bits of CR0.
|
|
|
|
Enables the caches by executing a WBINVD instruction and then clear both the CD and NW
|
|
bits of CR0 to 0. This function is only available on IA-32 and x64.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmEnableCache (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Returns the lower 32-bits of a Machine Specific Register(MSR).
|
|
|
|
Reads and returns the lower 32-bits of the MSR specified by Index.
|
|
No parameter checking is performed on Index, and some Index values may cause
|
|
CPU exceptions. The caller must either guarantee that Index is valid, or the
|
|
caller must set up exception handlers to catch the exceptions. This function
|
|
is only available on IA-32 and x64.
|
|
|
|
@param Index The 32-bit MSR index to read.
|
|
|
|
@return The lower 32 bits of the MSR identified by Index.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
AsmReadMsr32 (
|
|
IN UINT32 Index
|
|
);
|
|
|
|
/**
|
|
Writes a 32-bit value to a Machine Specific Register(MSR), and returns the value.
|
|
The upper 32-bits of the MSR are set to zero.
|
|
|
|
Writes the 32-bit value specified by Value to the MSR specified by Index. The
|
|
upper 32-bits of the MSR write are set to zero. The 32-bit value written to
|
|
the MSR is returned. No parameter checking is performed on Index or Value,
|
|
and some of these may cause CPU exceptions. The caller must either guarantee
|
|
that Index and Value are valid, or the caller must establish proper exception
|
|
handlers. This function is only available on IA-32 and x64.
|
|
|
|
@param Index The 32-bit MSR index to write.
|
|
@param Value The 32-bit value to write to the MSR.
|
|
|
|
@return Value
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
AsmWriteMsr32 (
|
|
IN UINT32 Index,
|
|
IN UINT32 Value
|
|
);
|
|
|
|
/**
|
|
Reads a 64-bit MSR, performs a bitwise OR on the lower 32-bits, and
|
|
writes the result back to the 64-bit MSR.
|
|
|
|
Reads the 64-bit MSR specified by Index, performs a bitwise OR
|
|
between the lower 32-bits of the read result and the value specified by
|
|
OrData, and writes the result to the 64-bit MSR specified by Index. The lower
|
|
32-bits of the value written to the MSR is returned. No parameter checking is
|
|
performed on Index or OrData, and some of these may cause CPU exceptions. The
|
|
caller must either guarantee that Index and OrData are valid, or the caller
|
|
must establish proper exception handlers. This function is only available on
|
|
IA-32 and x64.
|
|
|
|
@param Index The 32-bit MSR index to write.
|
|
@param OrData The value to OR with the read value from the MSR.
|
|
|
|
@return The lower 32-bit value written to the MSR.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
AsmMsrOr32 (
|
|
IN UINT32 Index,
|
|
IN UINT32 OrData
|
|
);
|
|
|
|
/**
|
|
Reads a 64-bit MSR, performs a bitwise AND on the lower 32-bits, and writes
|
|
the result back to the 64-bit MSR.
|
|
|
|
Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
|
|
lower 32-bits of the read result and the value specified by AndData, and
|
|
writes the result to the 64-bit MSR specified by Index. The lower 32-bits of
|
|
the value written to the MSR is returned. No parameter checking is performed
|
|
on Index or AndData, and some of these may cause CPU exceptions. The caller
|
|
must either guarantee that Index and AndData are valid, or the caller must
|
|
establish proper exception handlers. This function is only available on IA-32
|
|
and x64.
|
|
|
|
@param Index The 32-bit MSR index to write.
|
|
@param AndData The value to AND with the read value from the MSR.
|
|
|
|
@return The lower 32-bit value written to the MSR.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
AsmMsrAnd32 (
|
|
IN UINT32 Index,
|
|
IN UINT32 AndData
|
|
);
|
|
|
|
/**
|
|
Reads a 64-bit MSR, performs a bitwise AND followed by a bitwise OR
|
|
on the lower 32-bits, and writes the result back to the 64-bit MSR.
|
|
|
|
Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
|
|
lower 32-bits of the read result and the value specified by AndData
|
|
preserving the upper 32-bits, performs a bitwise OR between the
|
|
result of the AND operation and the value specified by OrData, and writes the
|
|
result to the 64-bit MSR specified by Address. The lower 32-bits of the value
|
|
written to the MSR is returned. No parameter checking is performed on Index,
|
|
AndData, or OrData, and some of these may cause CPU exceptions. The caller
|
|
must either guarantee that Index, AndData, and OrData are valid, or the
|
|
caller must establish proper exception handlers. This function is only
|
|
available on IA-32 and x64.
|
|
|
|
@param Index The 32-bit MSR index to write.
|
|
@param AndData The value to AND with the read value from the MSR.
|
|
@param OrData The value to OR with the result of the AND operation.
|
|
|
|
@return The lower 32-bit value written to the MSR.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
AsmMsrAndThenOr32 (
|
|
IN UINT32 Index,
|
|
IN UINT32 AndData,
|
|
IN UINT32 OrData
|
|
);
|
|
|
|
/**
|
|
Reads a bit field of an MSR.
|
|
|
|
Reads the bit field in the lower 32-bits of a 64-bit MSR. The bit field is
|
|
specified by the StartBit and the EndBit. The value of the bit field is
|
|
returned. The caller must either guarantee that Index is valid, or the caller
|
|
must set up exception handlers to catch the exceptions. This function is only
|
|
available on IA-32 and x64.
|
|
|
|
If StartBit is greater than 31, then ASSERT().
|
|
If EndBit is greater than 31, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
|
|
@param Index The 32-bit MSR index to read.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..31.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..31.
|
|
|
|
@return The bit field read from the MSR.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
AsmMsrBitFieldRead32 (
|
|
IN UINT32 Index,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit
|
|
);
|
|
|
|
/**
|
|
Writes a bit field to an MSR.
|
|
|
|
Writes Value to a bit field in the lower 32-bits of a 64-bit MSR. The bit
|
|
field is specified by the StartBit and the EndBit. All other bits in the
|
|
destination MSR are preserved. The lower 32-bits of the MSR written is
|
|
returned. The caller must either guarantee that Index and the data written
|
|
is valid, or the caller must set up exception handlers to catch the exceptions.
|
|
This function is only available on IA-32 and x64.
|
|
|
|
If StartBit is greater than 31, then ASSERT().
|
|
If EndBit is greater than 31, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Index The 32-bit MSR index to write.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..31.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..31.
|
|
@param Value New value of the bit field.
|
|
|
|
@return The lower 32-bit of the value written to the MSR.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
AsmMsrBitFieldWrite32 (
|
|
IN UINT32 Index,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT32 Value
|
|
);
|
|
|
|
/**
|
|
Reads a bit field in a 64-bit MSR, performs a bitwise OR, and writes the
|
|
result back to the bit field in the 64-bit MSR.
|
|
|
|
Reads the 64-bit MSR specified by Index, performs a bitwise OR
|
|
between the read result and the value specified by OrData, and writes the
|
|
result to the 64-bit MSR specified by Index. The lower 32-bits of the value
|
|
written to the MSR are returned. Extra left bits in OrData are stripped. The
|
|
caller must either guarantee that Index and the data written is valid, or
|
|
the caller must set up exception handlers to catch the exceptions. This
|
|
function is only available on IA-32 and x64.
|
|
|
|
If StartBit is greater than 31, then ASSERT().
|
|
If EndBit is greater than 31, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Index The 32-bit MSR index to write.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..31.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..31.
|
|
@param OrData The value to OR with the read value from the MSR.
|
|
|
|
@return The lower 32-bit of the value written to the MSR.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
AsmMsrBitFieldOr32 (
|
|
IN UINT32 Index,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT32 OrData
|
|
);
|
|
|
|
/**
|
|
Reads a bit field in a 64-bit MSR, performs a bitwise AND, and writes the
|
|
result back to the bit field in the 64-bit MSR.
|
|
|
|
Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
|
|
read result and the value specified by AndData, and writes the result to the
|
|
64-bit MSR specified by Index. The lower 32-bits of the value written to the
|
|
MSR are returned. Extra left bits in AndData are stripped. The caller must
|
|
either guarantee that Index and the data written is valid, or the caller must
|
|
set up exception handlers to catch the exceptions. This function is only
|
|
available on IA-32 and x64.
|
|
|
|
If StartBit is greater than 31, then ASSERT().
|
|
If EndBit is greater than 31, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Index The 32-bit MSR index to write.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..31.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..31.
|
|
@param AndData The value to AND with the read value from the MSR.
|
|
|
|
@return The lower 32-bit of the value written to the MSR.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
AsmMsrBitFieldAnd32 (
|
|
IN UINT32 Index,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT32 AndData
|
|
);
|
|
|
|
/**
|
|
Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a
|
|
bitwise OR, and writes the result back to the bit field in the
|
|
64-bit MSR.
|
|
|
|
Reads the 64-bit MSR specified by Index, performs a bitwise AND followed by a
|
|
bitwise OR between the read result and the value specified by
|
|
AndData, and writes the result to the 64-bit MSR specified by Index. The
|
|
lower 32-bits of the value written to the MSR are returned. Extra left bits
|
|
in both AndData and OrData are stripped. The caller must either guarantee
|
|
that Index and the data written is valid, or the caller must set up exception
|
|
handlers to catch the exceptions. This function is only available on IA-32
|
|
and x64.
|
|
|
|
If StartBit is greater than 31, then ASSERT().
|
|
If EndBit is greater than 31, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Index The 32-bit MSR index to write.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..31.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..31.
|
|
@param AndData The value to AND with the read value from the MSR.
|
|
@param OrData The value to OR with the result of the AND operation.
|
|
|
|
@return The lower 32-bit of the value written to the MSR.
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
AsmMsrBitFieldAndThenOr32 (
|
|
IN UINT32 Index,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT32 AndData,
|
|
IN UINT32 OrData
|
|
);
|
|
|
|
/**
|
|
Returns a 64-bit Machine Specific Register(MSR).
|
|
|
|
Reads and returns the 64-bit MSR specified by Index. No parameter checking is
|
|
performed on Index, and some Index values may cause CPU exceptions. The
|
|
caller must either guarantee that Index is valid, or the caller must set up
|
|
exception handlers to catch the exceptions. This function is only available
|
|
on IA-32 and x64.
|
|
|
|
@param Index The 32-bit MSR index to read.
|
|
|
|
@return The value of the MSR identified by Index.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsmReadMsr64 (
|
|
IN UINT32 Index
|
|
);
|
|
|
|
/**
|
|
Writes a 64-bit value to a Machine Specific Register(MSR), and returns the
|
|
value.
|
|
|
|
Writes the 64-bit value specified by Value to the MSR specified by Index. The
|
|
64-bit value written to the MSR is returned. No parameter checking is
|
|
performed on Index or Value, and some of these may cause CPU exceptions. The
|
|
caller must either guarantee that Index and Value are valid, or the caller
|
|
must establish proper exception handlers. This function is only available on
|
|
IA-32 and x64.
|
|
|
|
@param Index The 32-bit MSR index to write.
|
|
@param Value The 64-bit value to write to the MSR.
|
|
|
|
@return Value
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsmWriteMsr64 (
|
|
IN UINT32 Index,
|
|
IN UINT64 Value
|
|
);
|
|
|
|
/**
|
|
Reads a 64-bit MSR, performs a bitwise OR, and writes the result
|
|
back to the 64-bit MSR.
|
|
|
|
Reads the 64-bit MSR specified by Index, performs a bitwise OR
|
|
between the read result and the value specified by OrData, and writes the
|
|
result to the 64-bit MSR specified by Index. The value written to the MSR is
|
|
returned. No parameter checking is performed on Index or OrData, and some of
|
|
these may cause CPU exceptions. The caller must either guarantee that Index
|
|
and OrData are valid, or the caller must establish proper exception handlers.
|
|
This function is only available on IA-32 and x64.
|
|
|
|
@param Index The 32-bit MSR index to write.
|
|
@param OrData The value to OR with the read value from the MSR.
|
|
|
|
@return The value written back to the MSR.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsmMsrOr64 (
|
|
IN UINT32 Index,
|
|
IN UINT64 OrData
|
|
);
|
|
|
|
/**
|
|
Reads a 64-bit MSR, performs a bitwise AND, and writes the result back to the
|
|
64-bit MSR.
|
|
|
|
Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
|
|
read result and the value specified by OrData, and writes the result to the
|
|
64-bit MSR specified by Index. The value written to the MSR is returned. No
|
|
parameter checking is performed on Index or OrData, and some of these may
|
|
cause CPU exceptions. The caller must either guarantee that Index and OrData
|
|
are valid, or the caller must establish proper exception handlers. This
|
|
function is only available on IA-32 and x64.
|
|
|
|
@param Index The 32-bit MSR index to write.
|
|
@param AndData The value to AND with the read value from the MSR.
|
|
|
|
@return The value written back to the MSR.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsmMsrAnd64 (
|
|
IN UINT32 Index,
|
|
IN UINT64 AndData
|
|
);
|
|
|
|
/**
|
|
Reads a 64-bit MSR, performs a bitwise AND followed by a bitwise
|
|
OR, and writes the result back to the 64-bit MSR.
|
|
|
|
Reads the 64-bit MSR specified by Index, performs a bitwise AND between read
|
|
result and the value specified by AndData, performs a bitwise OR
|
|
between the result of the AND operation and the value specified by OrData,
|
|
and writes the result to the 64-bit MSR specified by Index. The value written
|
|
to the MSR is returned. No parameter checking is performed on Index, AndData,
|
|
or OrData, and some of these may cause CPU exceptions. The caller must either
|
|
guarantee that Index, AndData, and OrData are valid, or the caller must
|
|
establish proper exception handlers. This function is only available on IA-32
|
|
and x64.
|
|
|
|
@param Index The 32-bit MSR index to write.
|
|
@param AndData The value to AND with the read value from the MSR.
|
|
@param OrData The value to OR with the result of the AND operation.
|
|
|
|
@return The value written back to the MSR.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsmMsrAndThenOr64 (
|
|
IN UINT32 Index,
|
|
IN UINT64 AndData,
|
|
IN UINT64 OrData
|
|
);
|
|
|
|
/**
|
|
Reads a bit field of an MSR.
|
|
|
|
Reads the bit field in the 64-bit MSR. The bit field is specified by the
|
|
StartBit and the EndBit. The value of the bit field is returned. The caller
|
|
must either guarantee that Index is valid, or the caller must set up
|
|
exception handlers to catch the exceptions. This function is only available
|
|
on IA-32 and x64.
|
|
|
|
If StartBit is greater than 63, then ASSERT().
|
|
If EndBit is greater than 63, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
|
|
@param Index The 32-bit MSR index to read.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..63.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..63.
|
|
|
|
@return The value read from the MSR.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsmMsrBitFieldRead64 (
|
|
IN UINT32 Index,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit
|
|
);
|
|
|
|
/**
|
|
Writes a bit field to an MSR.
|
|
|
|
Writes Value to a bit field in a 64-bit MSR. The bit field is specified by
|
|
the StartBit and the EndBit. All other bits in the destination MSR are
|
|
preserved. The MSR written is returned. The caller must either guarantee
|
|
that Index and the data written is valid, or the caller must set up exception
|
|
handlers to catch the exceptions. This function is only available on IA-32 and x64.
|
|
|
|
If StartBit is greater than 63, then ASSERT().
|
|
If EndBit is greater than 63, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Index The 32-bit MSR index to write.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..63.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..63.
|
|
@param Value New value of the bit field.
|
|
|
|
@return The value written back to the MSR.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsmMsrBitFieldWrite64 (
|
|
IN UINT32 Index,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT64 Value
|
|
);
|
|
|
|
/**
|
|
Reads a bit field in a 64-bit MSR, performs a bitwise OR, and
|
|
writes the result back to the bit field in the 64-bit MSR.
|
|
|
|
Reads the 64-bit MSR specified by Index, performs a bitwise OR
|
|
between the read result and the value specified by OrData, and writes the
|
|
result to the 64-bit MSR specified by Index. The value written to the MSR is
|
|
returned. Extra left bits in OrData are stripped. The caller must either
|
|
guarantee that Index and the data written is valid, or the caller must set up
|
|
exception handlers to catch the exceptions. This function is only available
|
|
on IA-32 and x64.
|
|
|
|
If StartBit is greater than 63, then ASSERT().
|
|
If EndBit is greater than 63, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Index The 32-bit MSR index to write.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..63.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..63.
|
|
@param OrData The value to OR with the read value from the bit field.
|
|
|
|
@return The value written back to the MSR.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsmMsrBitFieldOr64 (
|
|
IN UINT32 Index,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT64 OrData
|
|
);
|
|
|
|
/**
|
|
Reads a bit field in a 64-bit MSR, performs a bitwise AND, and writes the
|
|
result back to the bit field in the 64-bit MSR.
|
|
|
|
Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
|
|
read result and the value specified by AndData, and writes the result to the
|
|
64-bit MSR specified by Index. The value written to the MSR is returned.
|
|
Extra left bits in AndData are stripped. The caller must either guarantee
|
|
that Index and the data written is valid, or the caller must set up exception
|
|
handlers to catch the exceptions. This function is only available on IA-32
|
|
and x64.
|
|
|
|
If StartBit is greater than 63, then ASSERT().
|
|
If EndBit is greater than 63, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Index The 32-bit MSR index to write.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..63.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..63.
|
|
@param AndData The value to AND with the read value from the bit field.
|
|
|
|
@return The value written back to the MSR.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsmMsrBitFieldAnd64 (
|
|
IN UINT32 Index,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT64 AndData
|
|
);
|
|
|
|
/**
|
|
Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a
|
|
bitwise OR, and writes the result back to the bit field in the
|
|
64-bit MSR.
|
|
|
|
Reads the 64-bit MSR specified by Index, performs a bitwise AND followed by
|
|
a bitwise OR between the read result and the value specified by
|
|
AndData, and writes the result to the 64-bit MSR specified by Index. The
|
|
value written to the MSR is returned. Extra left bits in both AndData and
|
|
OrData are stripped. The caller must either guarantee that Index and the data
|
|
written is valid, or the caller must set up exception handlers to catch the
|
|
exceptions. This function is only available on IA-32 and x64.
|
|
|
|
If StartBit is greater than 63, then ASSERT().
|
|
If EndBit is greater than 63, then ASSERT().
|
|
If EndBit is less than StartBit, then ASSERT().
|
|
If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().
|
|
|
|
@param Index The 32-bit MSR index to write.
|
|
@param StartBit The ordinal of the least significant bit in the bit field.
|
|
Range 0..63.
|
|
@param EndBit The ordinal of the most significant bit in the bit field.
|
|
Range 0..63.
|
|
@param AndData The value to AND with the read value from the bit field.
|
|
@param OrData The value to OR with the result of the AND operation.
|
|
|
|
@return The value written back to the MSR.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsmMsrBitFieldAndThenOr64 (
|
|
IN UINT32 Index,
|
|
IN UINTN StartBit,
|
|
IN UINTN EndBit,
|
|
IN UINT64 AndData,
|
|
IN UINT64 OrData
|
|
);
|
|
|
|
/**
|
|
Reads the current value of the EFLAGS register.
|
|
|
|
Reads and returns the current value of the EFLAGS register. This function is
|
|
only available on IA-32 and x64. This returns a 32-bit value on IA-32 and a
|
|
64-bit value on x64.
|
|
|
|
@return EFLAGS on IA-32 or RFLAGS on x64.
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmReadEflags (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of the Control Register 0 (CR0).
|
|
|
|
Reads and returns the current value of CR0. This function is only available
|
|
on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
|
|
x64.
|
|
|
|
@return The value of the Control Register 0 (CR0).
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmReadCr0 (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of the Control Register 2 (CR2).
|
|
|
|
Reads and returns the current value of CR2. This function is only available
|
|
on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
|
|
x64.
|
|
|
|
@return The value of the Control Register 2 (CR2).
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmReadCr2 (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of the Control Register 3 (CR3).
|
|
|
|
Reads and returns the current value of CR3. This function is only available
|
|
on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
|
|
x64.
|
|
|
|
@return The value of the Control Register 3 (CR3).
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmReadCr3 (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of the Control Register 4 (CR4).
|
|
|
|
Reads and returns the current value of CR4. This function is only available
|
|
on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
|
|
x64.
|
|
|
|
@return The value of the Control Register 4 (CR4).
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmReadCr4 (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Writes a value to Control Register 0 (CR0).
|
|
|
|
Writes and returns a new value to CR0. This function is only available on
|
|
IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
|
|
|
|
@param Cr0 The value to write to CR0.
|
|
|
|
@return The value written to CR0.
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmWriteCr0 (
|
|
UINTN Cr0
|
|
);
|
|
|
|
/**
|
|
Writes a value to Control Register 2 (CR2).
|
|
|
|
Writes and returns a new value to CR2. This function is only available on
|
|
IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
|
|
|
|
@param Cr2 The value to write to CR2.
|
|
|
|
@return The value written to CR2.
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmWriteCr2 (
|
|
UINTN Cr2
|
|
);
|
|
|
|
/**
|
|
Writes a value to Control Register 3 (CR3).
|
|
|
|
Writes and returns a new value to CR3. This function is only available on
|
|
IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
|
|
|
|
@param Cr3 The value to write to CR3.
|
|
|
|
@return The value written to CR3.
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmWriteCr3 (
|
|
UINTN Cr3
|
|
);
|
|
|
|
/**
|
|
Writes a value to Control Register 4 (CR4).
|
|
|
|
Writes and returns a new value to CR4. This function is only available on
|
|
IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
|
|
|
|
@param Cr4 The value to write to CR4.
|
|
|
|
@return The value written to CR4.
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmWriteCr4 (
|
|
UINTN Cr4
|
|
);
|
|
|
|
/**
|
|
Reads the current value of Debug Register 0 (DR0).
|
|
|
|
Reads and returns the current value of DR0. This function is only available
|
|
on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
|
|
x64.
|
|
|
|
@return The value of Debug Register 0 (DR0).
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmReadDr0 (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of Debug Register 1 (DR1).
|
|
|
|
Reads and returns the current value of DR1. This function is only available
|
|
on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
|
|
x64.
|
|
|
|
@return The value of Debug Register 1 (DR1).
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmReadDr1 (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of Debug Register 2 (DR2).
|
|
|
|
Reads and returns the current value of DR2. This function is only available
|
|
on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
|
|
x64.
|
|
|
|
@return The value of Debug Register 2 (DR2).
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmReadDr2 (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of Debug Register 3 (DR3).
|
|
|
|
Reads and returns the current value of DR3. This function is only available
|
|
on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
|
|
x64.
|
|
|
|
@return The value of Debug Register 3 (DR3).
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmReadDr3 (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of Debug Register 4 (DR4).
|
|
|
|
Reads and returns the current value of DR4. This function is only available
|
|
on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
|
|
x64.
|
|
|
|
@return The value of Debug Register 4 (DR4).
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmReadDr4 (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of Debug Register 5 (DR5).
|
|
|
|
Reads and returns the current value of DR5. This function is only available
|
|
on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
|
|
x64.
|
|
|
|
@return The value of Debug Register 5 (DR5).
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmReadDr5 (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of Debug Register 6 (DR6).
|
|
|
|
Reads and returns the current value of DR6. This function is only available
|
|
on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
|
|
x64.
|
|
|
|
@return The value of Debug Register 6 (DR6).
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmReadDr6 (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of Debug Register 7 (DR7).
|
|
|
|
Reads and returns the current value of DR7. This function is only available
|
|
on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on
|
|
x64.
|
|
|
|
@return The value of Debug Register 7 (DR7).
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmReadDr7 (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Writes a value to Debug Register 0 (DR0).
|
|
|
|
Writes and returns a new value to DR0. This function is only available on
|
|
IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
|
|
|
|
@param Dr0 The value to write to Dr0.
|
|
|
|
@return The value written to Debug Register 0 (DR0).
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmWriteDr0 (
|
|
UINTN Dr0
|
|
);
|
|
|
|
/**
|
|
Writes a value to Debug Register 1 (DR1).
|
|
|
|
Writes and returns a new value to DR1. This function is only available on
|
|
IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
|
|
|
|
@param Dr1 The value to write to Dr1.
|
|
|
|
@return The value written to Debug Register 1 (DR1).
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmWriteDr1 (
|
|
UINTN Dr1
|
|
);
|
|
|
|
/**
|
|
Writes a value to Debug Register 2 (DR2).
|
|
|
|
Writes and returns a new value to DR2. This function is only available on
|
|
IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
|
|
|
|
@param Dr2 The value to write to Dr2.
|
|
|
|
@return The value written to Debug Register 2 (DR2).
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmWriteDr2 (
|
|
UINTN Dr2
|
|
);
|
|
|
|
/**
|
|
Writes a value to Debug Register 3 (DR3).
|
|
|
|
Writes and returns a new value to DR3. This function is only available on
|
|
IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
|
|
|
|
@param Dr3 The value to write to Dr3.
|
|
|
|
@return The value written to Debug Register 3 (DR3).
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmWriteDr3 (
|
|
UINTN Dr3
|
|
);
|
|
|
|
/**
|
|
Writes a value to Debug Register 4 (DR4).
|
|
|
|
Writes and returns a new value to DR4. This function is only available on
|
|
IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
|
|
|
|
@param Dr4 The value to write to Dr4.
|
|
|
|
@return The value written to Debug Register 4 (DR4).
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmWriteDr4 (
|
|
UINTN Dr4
|
|
);
|
|
|
|
/**
|
|
Writes a value to Debug Register 5 (DR5).
|
|
|
|
Writes and returns a new value to DR5. This function is only available on
|
|
IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
|
|
|
|
@param Dr5 The value to write to Dr5.
|
|
|
|
@return The value written to Debug Register 5 (DR5).
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmWriteDr5 (
|
|
UINTN Dr5
|
|
);
|
|
|
|
/**
|
|
Writes a value to Debug Register 6 (DR6).
|
|
|
|
Writes and returns a new value to DR6. This function is only available on
|
|
IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
|
|
|
|
@param Dr6 The value to write to Dr6.
|
|
|
|
@return The value written to Debug Register 6 (DR6).
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmWriteDr6 (
|
|
UINTN Dr6
|
|
);
|
|
|
|
/**
|
|
Writes a value to Debug Register 7 (DR7).
|
|
|
|
Writes and returns a new value to DR7. This function is only available on
|
|
IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.
|
|
|
|
@param Dr7 The value to write to Dr7.
|
|
|
|
@return The value written to Debug Register 7 (DR7).
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmWriteDr7 (
|
|
UINTN Dr7
|
|
);
|
|
|
|
/**
|
|
Reads the current value of Code Segment Register (CS).
|
|
|
|
Reads and returns the current value of CS. This function is only available on
|
|
IA-32 and x64.
|
|
|
|
@return The current value of CS.
|
|
|
|
**/
|
|
UINT16
|
|
EFIAPI
|
|
AsmReadCs (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of Data Segment Register (DS).
|
|
|
|
Reads and returns the current value of DS. This function is only available on
|
|
IA-32 and x64.
|
|
|
|
@return The current value of DS.
|
|
|
|
**/
|
|
UINT16
|
|
EFIAPI
|
|
AsmReadDs (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of Extra Segment Register (ES).
|
|
|
|
Reads and returns the current value of ES. This function is only available on
|
|
IA-32 and x64.
|
|
|
|
@return The current value of ES.
|
|
|
|
**/
|
|
UINT16
|
|
EFIAPI
|
|
AsmReadEs (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of FS Data Segment Register (FS).
|
|
|
|
Reads and returns the current value of FS. This function is only available on
|
|
IA-32 and x64.
|
|
|
|
@return The current value of FS.
|
|
|
|
**/
|
|
UINT16
|
|
EFIAPI
|
|
AsmReadFs (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of GS Data Segment Register (GS).
|
|
|
|
Reads and returns the current value of GS. This function is only available on
|
|
IA-32 and x64.
|
|
|
|
@return The current value of GS.
|
|
|
|
**/
|
|
UINT16
|
|
EFIAPI
|
|
AsmReadGs (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of Stack Segment Register (SS).
|
|
|
|
Reads and returns the current value of SS. This function is only available on
|
|
IA-32 and x64.
|
|
|
|
@return The current value of SS.
|
|
|
|
**/
|
|
UINT16
|
|
EFIAPI
|
|
AsmReadSs (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of Task Register (TR).
|
|
|
|
Reads and returns the current value of TR. This function is only available on
|
|
IA-32 and x64.
|
|
|
|
@return The current value of TR.
|
|
|
|
**/
|
|
UINT16
|
|
EFIAPI
|
|
AsmReadTr (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current Global Descriptor Table Register(GDTR) descriptor.
|
|
|
|
Reads and returns the current GDTR descriptor and returns it in Gdtr. This
|
|
function is only available on IA-32 and x64.
|
|
|
|
If Gdtr is NULL, then ASSERT().
|
|
|
|
@param Gdtr The pointer to a GDTR descriptor.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmReadGdtr (
|
|
OUT IA32_DESCRIPTOR *Gdtr
|
|
);
|
|
|
|
/**
|
|
Writes the current Global Descriptor Table Register (GDTR) descriptor.
|
|
|
|
Writes and the current GDTR descriptor specified by Gdtr. This function is
|
|
only available on IA-32 and x64.
|
|
|
|
If Gdtr is NULL, then ASSERT().
|
|
|
|
@param Gdtr The pointer to a GDTR descriptor.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmWriteGdtr (
|
|
IN CONST IA32_DESCRIPTOR *Gdtr
|
|
);
|
|
|
|
/**
|
|
Reads the current Interrupt Descriptor Table Register(IDTR) descriptor.
|
|
|
|
Reads and returns the current IDTR descriptor and returns it in Idtr. This
|
|
function is only available on IA-32 and x64.
|
|
|
|
If Idtr is NULL, then ASSERT().
|
|
|
|
@param Idtr The pointer to a IDTR descriptor.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmReadIdtr (
|
|
OUT IA32_DESCRIPTOR *Idtr
|
|
);
|
|
|
|
/**
|
|
Writes the current Interrupt Descriptor Table Register(IDTR) descriptor.
|
|
|
|
Writes the current IDTR descriptor and returns it in Idtr. This function is
|
|
only available on IA-32 and x64.
|
|
|
|
If Idtr is NULL, then ASSERT().
|
|
|
|
@param Idtr The pointer to a IDTR descriptor.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmWriteIdtr (
|
|
IN CONST IA32_DESCRIPTOR *Idtr
|
|
);
|
|
|
|
/**
|
|
Reads the current Local Descriptor Table Register(LDTR) selector.
|
|
|
|
Reads and returns the current 16-bit LDTR descriptor value. This function is
|
|
only available on IA-32 and x64.
|
|
|
|
@return The current selector of LDT.
|
|
|
|
**/
|
|
UINT16
|
|
EFIAPI
|
|
AsmReadLdtr (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Writes the current Local Descriptor Table Register (LDTR) selector.
|
|
|
|
Writes and the current LDTR descriptor specified by Ldtr. This function is
|
|
only available on IA-32 and x64.
|
|
|
|
@param Ldtr 16-bit LDTR selector value.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmWriteLdtr (
|
|
IN UINT16 Ldtr
|
|
);
|
|
|
|
/**
|
|
Save the current floating point/SSE/SSE2 context to a buffer.
|
|
|
|
Saves the current floating point/SSE/SSE2 state to the buffer specified by
|
|
Buffer. Buffer must be aligned on a 16-byte boundary. This function is only
|
|
available on IA-32 and x64.
|
|
|
|
If Buffer is NULL, then ASSERT().
|
|
If Buffer is not aligned on a 16-byte boundary, then ASSERT().
|
|
|
|
@param Buffer The pointer to a buffer to save the floating point/SSE/SSE2 context.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmFxSave (
|
|
OUT IA32_FX_BUFFER *Buffer
|
|
);
|
|
|
|
/**
|
|
Restores the current floating point/SSE/SSE2 context from a buffer.
|
|
|
|
Restores the current floating point/SSE/SSE2 state from the buffer specified
|
|
by Buffer. Buffer must be aligned on a 16-byte boundary. This function is
|
|
only available on IA-32 and x64.
|
|
|
|
If Buffer is NULL, then ASSERT().
|
|
If Buffer is not aligned on a 16-byte boundary, then ASSERT().
|
|
If Buffer was not saved with AsmFxSave(), then ASSERT().
|
|
|
|
@param Buffer The pointer to a buffer to save the floating point/SSE/SSE2 context.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmFxRestore (
|
|
IN CONST IA32_FX_BUFFER *Buffer
|
|
);
|
|
|
|
/**
|
|
Reads the current value of 64-bit MMX Register #0 (MM0).
|
|
|
|
Reads and returns the current value of MM0. This function is only available
|
|
on IA-32 and x64.
|
|
|
|
@return The current value of MM0.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsmReadMm0 (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of 64-bit MMX Register #1 (MM1).
|
|
|
|
Reads and returns the current value of MM1. This function is only available
|
|
on IA-32 and x64.
|
|
|
|
@return The current value of MM1.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsmReadMm1 (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of 64-bit MMX Register #2 (MM2).
|
|
|
|
Reads and returns the current value of MM2. This function is only available
|
|
on IA-32 and x64.
|
|
|
|
@return The current value of MM2.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsmReadMm2 (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of 64-bit MMX Register #3 (MM3).
|
|
|
|
Reads and returns the current value of MM3. This function is only available
|
|
on IA-32 and x64.
|
|
|
|
@return The current value of MM3.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsmReadMm3 (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of 64-bit MMX Register #4 (MM4).
|
|
|
|
Reads and returns the current value of MM4. This function is only available
|
|
on IA-32 and x64.
|
|
|
|
@return The current value of MM4.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsmReadMm4 (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of 64-bit MMX Register #5 (MM5).
|
|
|
|
Reads and returns the current value of MM5. This function is only available
|
|
on IA-32 and x64.
|
|
|
|
@return The current value of MM5.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsmReadMm5 (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of 64-bit MMX Register #6 (MM6).
|
|
|
|
Reads and returns the current value of MM6. This function is only available
|
|
on IA-32 and x64.
|
|
|
|
@return The current value of MM6.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsmReadMm6 (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of 64-bit MMX Register #7 (MM7).
|
|
|
|
Reads and returns the current value of MM7. This function is only available
|
|
on IA-32 and x64.
|
|
|
|
@return The current value of MM7.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsmReadMm7 (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Writes the current value of 64-bit MMX Register #0 (MM0).
|
|
|
|
Writes the current value of MM0. This function is only available on IA32 and
|
|
x64.
|
|
|
|
@param Value The 64-bit value to write to MM0.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmWriteMm0 (
|
|
IN UINT64 Value
|
|
);
|
|
|
|
/**
|
|
Writes the current value of 64-bit MMX Register #1 (MM1).
|
|
|
|
Writes the current value of MM1. This function is only available on IA32 and
|
|
x64.
|
|
|
|
@param Value The 64-bit value to write to MM1.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmWriteMm1 (
|
|
IN UINT64 Value
|
|
);
|
|
|
|
/**
|
|
Writes the current value of 64-bit MMX Register #2 (MM2).
|
|
|
|
Writes the current value of MM2. This function is only available on IA32 and
|
|
x64.
|
|
|
|
@param Value The 64-bit value to write to MM2.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmWriteMm2 (
|
|
IN UINT64 Value
|
|
);
|
|
|
|
/**
|
|
Writes the current value of 64-bit MMX Register #3 (MM3).
|
|
|
|
Writes the current value of MM3. This function is only available on IA32 and
|
|
x64.
|
|
|
|
@param Value The 64-bit value to write to MM3.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmWriteMm3 (
|
|
IN UINT64 Value
|
|
);
|
|
|
|
/**
|
|
Writes the current value of 64-bit MMX Register #4 (MM4).
|
|
|
|
Writes the current value of MM4. This function is only available on IA32 and
|
|
x64.
|
|
|
|
@param Value The 64-bit value to write to MM4.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmWriteMm4 (
|
|
IN UINT64 Value
|
|
);
|
|
|
|
/**
|
|
Writes the current value of 64-bit MMX Register #5 (MM5).
|
|
|
|
Writes the current value of MM5. This function is only available on IA32 and
|
|
x64.
|
|
|
|
@param Value The 64-bit value to write to MM5.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmWriteMm5 (
|
|
IN UINT64 Value
|
|
);
|
|
|
|
/**
|
|
Writes the current value of 64-bit MMX Register #6 (MM6).
|
|
|
|
Writes the current value of MM6. This function is only available on IA32 and
|
|
x64.
|
|
|
|
@param Value The 64-bit value to write to MM6.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmWriteMm6 (
|
|
IN UINT64 Value
|
|
);
|
|
|
|
/**
|
|
Writes the current value of 64-bit MMX Register #7 (MM7).
|
|
|
|
Writes the current value of MM7. This function is only available on IA32 and
|
|
x64.
|
|
|
|
@param Value The 64-bit value to write to MM7.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmWriteMm7 (
|
|
IN UINT64 Value
|
|
);
|
|
|
|
/**
|
|
Reads the current value of Time Stamp Counter (TSC).
|
|
|
|
Reads and returns the current value of TSC. This function is only available
|
|
on IA-32 and x64.
|
|
|
|
@return The current value of TSC
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsmReadTsc (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Reads the current value of a Performance Counter (PMC).
|
|
|
|
Reads and returns the current value of performance counter specified by
|
|
Index. This function is only available on IA-32 and x64.
|
|
|
|
@param Index The 32-bit Performance Counter index to read.
|
|
|
|
@return The value of the PMC specified by Index.
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsmReadPmc (
|
|
IN UINT32 Index
|
|
);
|
|
|
|
/**
|
|
Sets up a monitor buffer that is used by AsmMwait().
|
|
|
|
Executes a MONITOR instruction with the register state specified by Eax, Ecx
|
|
and Edx. Returns Eax. This function is only available on IA-32 and x64.
|
|
|
|
@param Eax The value to load into EAX or RAX before executing the MONITOR
|
|
instruction.
|
|
@param Ecx The value to load into ECX or RCX before executing the MONITOR
|
|
instruction.
|
|
@param Edx The value to load into EDX or RDX before executing the MONITOR
|
|
instruction.
|
|
|
|
@return Eax
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmMonitor (
|
|
IN UINTN Eax,
|
|
IN UINTN Ecx,
|
|
IN UINTN Edx
|
|
);
|
|
|
|
/**
|
|
Executes an MWAIT instruction.
|
|
|
|
Executes an MWAIT instruction with the register state specified by Eax and
|
|
Ecx. Returns Eax. This function is only available on IA-32 and x64.
|
|
|
|
@param Eax The value to load into EAX or RAX before executing the MONITOR
|
|
instruction.
|
|
@param Ecx The value to load into ECX or RCX before executing the MONITOR
|
|
instruction.
|
|
|
|
@return Eax
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
AsmMwait (
|
|
IN UINTN Eax,
|
|
IN UINTN Ecx
|
|
);
|
|
|
|
/**
|
|
Executes a WBINVD instruction.
|
|
|
|
Executes a WBINVD instruction. This function is only available on IA-32 and
|
|
x64.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmWbinvd (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Executes a INVD instruction.
|
|
|
|
Executes a INVD instruction. This function is only available on IA-32 and
|
|
x64.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmInvd (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Flushes a cache line from all the instruction and data caches within the
|
|
coherency domain of the CPU.
|
|
|
|
Flushed the cache line specified by LinearAddress, and returns LinearAddress.
|
|
This function is only available on IA-32 and x64.
|
|
|
|
@param LinearAddress The address of the cache line to flush. If the CPU is
|
|
in a physical addressing mode, then LinearAddress is a
|
|
physical address. If the CPU is in a virtual
|
|
addressing mode, then LinearAddress is a virtual
|
|
address.
|
|
|
|
@return LinearAddress.
|
|
**/
|
|
VOID *
|
|
EFIAPI
|
|
AsmFlushCacheLine (
|
|
IN VOID *LinearAddress
|
|
);
|
|
|
|
/**
|
|
Enables the 32-bit paging mode on the CPU.
|
|
|
|
Enables the 32-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables
|
|
must be properly initialized prior to calling this service. This function
|
|
assumes the current execution mode is 32-bit protected mode. This function is
|
|
only available on IA-32. After the 32-bit paging mode is enabled, control is
|
|
transferred to the function specified by EntryPoint using the new stack
|
|
specified by NewStack and passing in the parameters specified by Context1 and
|
|
Context2. Context1 and Context2 are optional and may be NULL. The function
|
|
EntryPoint must never return.
|
|
|
|
If the current execution mode is not 32-bit protected mode, then ASSERT().
|
|
If EntryPoint is NULL, then ASSERT().
|
|
If NewStack is NULL, then ASSERT().
|
|
|
|
There are a number of constraints that must be followed before calling this
|
|
function:
|
|
1) Interrupts must be disabled.
|
|
2) The caller must be in 32-bit protected mode with flat descriptors. This
|
|
means all descriptors must have a base of 0 and a limit of 4GB.
|
|
3) CR0 and CR4 must be compatible with 32-bit protected mode with flat
|
|
descriptors.
|
|
4) CR3 must point to valid page tables that will be used once the transition
|
|
is complete, and those page tables must guarantee that the pages for this
|
|
function and the stack are identity mapped.
|
|
|
|
@param EntryPoint A pointer to function to call with the new stack after
|
|
paging is enabled.
|
|
@param Context1 A pointer to the context to pass into the EntryPoint
|
|
function as the first parameter after paging is enabled.
|
|
@param Context2 A pointer to the context to pass into the EntryPoint
|
|
function as the second parameter after paging is enabled.
|
|
@param NewStack A pointer to the new stack to use for the EntryPoint
|
|
function after paging is enabled.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmEnablePaging32 (
|
|
IN SWITCH_STACK_ENTRY_POINT EntryPoint,
|
|
IN VOID *Context1 OPTIONAL,
|
|
IN VOID *Context2 OPTIONAL,
|
|
IN VOID *NewStack
|
|
);
|
|
|
|
/**
|
|
Disables the 32-bit paging mode on the CPU.
|
|
|
|
Disables the 32-bit paging mode on the CPU and returns to 32-bit protected
|
|
mode. This function assumes the current execution mode is 32-paged protected
|
|
mode. This function is only available on IA-32. After the 32-bit paging mode
|
|
is disabled, control is transferred to the function specified by EntryPoint
|
|
using the new stack specified by NewStack and passing in the parameters
|
|
specified by Context1 and Context2. Context1 and Context2 are optional and
|
|
may be NULL. The function EntryPoint must never return.
|
|
|
|
If the current execution mode is not 32-bit paged mode, then ASSERT().
|
|
If EntryPoint is NULL, then ASSERT().
|
|
If NewStack is NULL, then ASSERT().
|
|
|
|
There are a number of constraints that must be followed before calling this
|
|
function:
|
|
1) Interrupts must be disabled.
|
|
2) The caller must be in 32-bit paged mode.
|
|
3) CR0, CR3, and CR4 must be compatible with 32-bit paged mode.
|
|
4) CR3 must point to valid page tables that guarantee that the pages for
|
|
this function and the stack are identity mapped.
|
|
|
|
@param EntryPoint A pointer to function to call with the new stack after
|
|
paging is disabled.
|
|
@param Context1 A pointer to the context to pass into the EntryPoint
|
|
function as the first parameter after paging is disabled.
|
|
@param Context2 A pointer to the context to pass into the EntryPoint
|
|
function as the second parameter after paging is
|
|
disabled.
|
|
@param NewStack A pointer to the new stack to use for the EntryPoint
|
|
function after paging is disabled.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmDisablePaging32 (
|
|
IN SWITCH_STACK_ENTRY_POINT EntryPoint,
|
|
IN VOID *Context1 OPTIONAL,
|
|
IN VOID *Context2 OPTIONAL,
|
|
IN VOID *NewStack
|
|
);
|
|
|
|
/**
|
|
Enables the 64-bit paging mode on the CPU.
|
|
|
|
Enables the 64-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables
|
|
must be properly initialized prior to calling this service. This function
|
|
assumes the current execution mode is 32-bit protected mode with flat
|
|
descriptors. This function is only available on IA-32. After the 64-bit
|
|
paging mode is enabled, control is transferred to the function specified by
|
|
EntryPoint using the new stack specified by NewStack and passing in the
|
|
parameters specified by Context1 and Context2. Context1 and Context2 are
|
|
optional and may be 0. The function EntryPoint must never return.
|
|
|
|
If the current execution mode is not 32-bit protected mode with flat
|
|
descriptors, then ASSERT().
|
|
If EntryPoint is 0, then ASSERT().
|
|
If NewStack is 0, then ASSERT().
|
|
|
|
@param Cs The 16-bit selector to load in the CS before EntryPoint
|
|
is called. The descriptor in the GDT that this selector
|
|
references must be setup for long mode.
|
|
@param EntryPoint The 64-bit virtual address of the function to call with
|
|
the new stack after paging is enabled.
|
|
@param Context1 The 64-bit virtual address of the context to pass into
|
|
the EntryPoint function as the first parameter after
|
|
paging is enabled.
|
|
@param Context2 The 64-bit virtual address of the context to pass into
|
|
the EntryPoint function as the second parameter after
|
|
paging is enabled.
|
|
@param NewStack The 64-bit virtual address of the new stack to use for
|
|
the EntryPoint function after paging is enabled.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmEnablePaging64 (
|
|
IN UINT16 Cs,
|
|
IN UINT64 EntryPoint,
|
|
IN UINT64 Context1 OPTIONAL,
|
|
IN UINT64 Context2 OPTIONAL,
|
|
IN UINT64 NewStack
|
|
);
|
|
|
|
/**
|
|
Disables the 64-bit paging mode on the CPU.
|
|
|
|
Disables the 64-bit paging mode on the CPU and returns to 32-bit protected
|
|
mode. This function assumes the current execution mode is 64-paging mode.
|
|
This function is only available on x64. After the 64-bit paging mode is
|
|
disabled, control is transferred to the function specified by EntryPoint
|
|
using the new stack specified by NewStack and passing in the parameters
|
|
specified by Context1 and Context2. Context1 and Context2 are optional and
|
|
may be 0. The function EntryPoint must never return.
|
|
|
|
If the current execution mode is not 64-bit paged mode, then ASSERT().
|
|
If EntryPoint is 0, then ASSERT().
|
|
If NewStack is 0, then ASSERT().
|
|
|
|
@param Cs The 16-bit selector to load in the CS before EntryPoint
|
|
is called. The descriptor in the GDT that this selector
|
|
references must be setup for 32-bit protected mode.
|
|
@param EntryPoint The 64-bit virtual address of the function to call with
|
|
the new stack after paging is disabled.
|
|
@param Context1 The 64-bit virtual address of the context to pass into
|
|
the EntryPoint function as the first parameter after
|
|
paging is disabled.
|
|
@param Context2 The 64-bit virtual address of the context to pass into
|
|
the EntryPoint function as the second parameter after
|
|
paging is disabled.
|
|
@param NewStack The 64-bit virtual address of the new stack to use for
|
|
the EntryPoint function after paging is disabled.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmDisablePaging64 (
|
|
IN UINT16 Cs,
|
|
IN UINT32 EntryPoint,
|
|
IN UINT32 Context1 OPTIONAL,
|
|
IN UINT32 Context2 OPTIONAL,
|
|
IN UINT32 NewStack
|
|
);
|
|
|
|
//
|
|
// 16-bit thunking services
|
|
//
|
|
|
|
/**
|
|
Retrieves the properties for 16-bit thunk functions.
|
|
|
|
Computes the size of the buffer and stack below 1MB required to use the
|
|
AsmPrepareThunk16(), AsmThunk16() and AsmPrepareAndThunk16() functions. This
|
|
buffer size is returned in RealModeBufferSize, and the stack size is returned
|
|
in ExtraStackSize. If parameters are passed to the 16-bit real mode code,
|
|
then the actual minimum stack size is ExtraStackSize plus the maximum number
|
|
of bytes that need to be passed to the 16-bit real mode code.
|
|
|
|
If RealModeBufferSize is NULL, then ASSERT().
|
|
If ExtraStackSize is NULL, then ASSERT().
|
|
|
|
@param RealModeBufferSize A pointer to the size of the buffer below 1MB
|
|
required to use the 16-bit thunk functions.
|
|
@param ExtraStackSize A pointer to the extra size of stack below 1MB
|
|
that the 16-bit thunk functions require for
|
|
temporary storage in the transition to and from
|
|
16-bit real mode.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmGetThunk16Properties (
|
|
OUT UINT32 *RealModeBufferSize,
|
|
OUT UINT32 *ExtraStackSize
|
|
);
|
|
|
|
/**
|
|
Prepares all structures a code required to use AsmThunk16().
|
|
|
|
Prepares all structures and code required to use AsmThunk16().
|
|
|
|
This interface is limited to be used in either physical mode or virtual modes with paging enabled where the
|
|
virtual to physical mappings for ThunkContext.RealModeBuffer is mapped 1:1.
|
|
|
|
If ThunkContext is NULL, then ASSERT().
|
|
|
|
@param ThunkContext A pointer to the context structure that describes the
|
|
16-bit real mode code to call.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmPrepareThunk16 (
|
|
IN OUT THUNK_CONTEXT *ThunkContext
|
|
);
|
|
|
|
/**
|
|
Transfers control to a 16-bit real mode entry point and returns the results.
|
|
|
|
Transfers control to a 16-bit real mode entry point and returns the results.
|
|
AsmPrepareThunk16() must be called with ThunkContext before this function is used.
|
|
This function must be called with interrupts disabled.
|
|
|
|
The register state from the RealModeState field of ThunkContext is restored just prior
|
|
to calling the 16-bit real mode entry point. This includes the EFLAGS field of RealModeState,
|
|
which is used to set the interrupt state when a 16-bit real mode entry point is called.
|
|
Control is transferred to the 16-bit real mode entry point specified by the CS and Eip fields of RealModeState.
|
|
The stack is initialized to the SS and ESP fields of RealModeState. Any parameters passed to
|
|
the 16-bit real mode code must be populated by the caller at SS:ESP prior to calling this function.
|
|
The 16-bit real mode entry point is invoked with a 16-bit CALL FAR instruction,
|
|
so when accessing stack contents, the 16-bit real mode code must account for the 16-bit segment
|
|
and 16-bit offset of the return address that were pushed onto the stack. The 16-bit real mode entry
|
|
point must exit with a RETF instruction. The register state is captured into RealModeState immediately
|
|
after the RETF instruction is executed.
|
|
|
|
If EFLAGS specifies interrupts enabled, or any of the 16-bit real mode code enables interrupts,
|
|
or any of the 16-bit real mode code makes a SW interrupt, then the caller is responsible for making sure
|
|
the IDT at address 0 is initialized to handle any HW or SW interrupts that may occur while in 16-bit real mode.
|
|
|
|
If EFLAGS specifies interrupts enabled, or any of the 16-bit real mode code enables interrupts,
|
|
then the caller is responsible for making sure the 8259 PIC is in a state compatible with 16-bit real mode.
|
|
This includes the base vectors, the interrupt masks, and the edge/level trigger mode.
|
|
|
|
If THUNK_ATTRIBUTE_BIG_REAL_MODE is set in the ThunkAttributes field of ThunkContext, then the user code
|
|
is invoked in big real mode. Otherwise, the user code is invoked in 16-bit real mode with 64KB segment limits.
|
|
|
|
If neither THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15 nor THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL are set in
|
|
ThunkAttributes, then it is assumed that the user code did not enable the A20 mask, and no attempt is made to
|
|
disable the A20 mask.
|
|
|
|
If THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15 is set and THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL is clear in
|
|
ThunkAttributes, then attempt to use the INT 15 service to disable the A20 mask. If this INT 15 call fails,
|
|
then attempt to disable the A20 mask by directly accessing the 8042 keyboard controller I/O ports.
|
|
|
|
If THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15 is clear and THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL is set in
|
|
ThunkAttributes, then attempt to disable the A20 mask by directly accessing the 8042 keyboard controller I/O ports.
|
|
|
|
If ThunkContext is NULL, then ASSERT().
|
|
If AsmPrepareThunk16() was not previously called with ThunkContext, then ASSERT().
|
|
If both THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15 and THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL are set in
|
|
ThunkAttributes, then ASSERT().
|
|
|
|
This interface is limited to be used in either physical mode or virtual modes with paging enabled where the
|
|
virtual to physical mappings for ThunkContext.RealModeBuffer are mapped 1:1.
|
|
|
|
@param ThunkContext A pointer to the context structure that describes the
|
|
16-bit real mode code to call.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmThunk16 (
|
|
IN OUT THUNK_CONTEXT *ThunkContext
|
|
);
|
|
|
|
/**
|
|
Prepares all structures and code for a 16-bit real mode thunk, transfers
|
|
control to a 16-bit real mode entry point, and returns the results.
|
|
|
|
Prepares all structures and code for a 16-bit real mode thunk, transfers
|
|
control to a 16-bit real mode entry point, and returns the results. If the
|
|
caller only need to perform a single 16-bit real mode thunk, then this
|
|
service should be used. If the caller intends to make more than one 16-bit
|
|
real mode thunk, then it is more efficient if AsmPrepareThunk16() is called
|
|
once and AsmThunk16() can be called for each 16-bit real mode thunk.
|
|
|
|
This interface is limited to be used in either physical mode or virtual modes with paging enabled where the
|
|
virtual to physical mappings for ThunkContext.RealModeBuffer is mapped 1:1.
|
|
|
|
See AsmPrepareThunk16() and AsmThunk16() for the detailed description and ASSERT() conditions.
|
|
|
|
@param ThunkContext A pointer to the context structure that describes the
|
|
16-bit real mode code to call.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmPrepareAndThunk16 (
|
|
IN OUT THUNK_CONTEXT *ThunkContext
|
|
);
|
|
|
|
/**
|
|
Generates a 16-bit random number through RDRAND instruction.
|
|
|
|
if Rand is NULL, then ASSERT().
|
|
|
|
@param[out] Rand Buffer pointer to store the random result.
|
|
|
|
@retval TRUE RDRAND call was successful.
|
|
@retval FALSE Failed attempts to call RDRAND.
|
|
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
AsmRdRand16 (
|
|
OUT UINT16 *Rand
|
|
);
|
|
|
|
/**
|
|
Generates a 32-bit random number through RDRAND instruction.
|
|
|
|
if Rand is NULL, then ASSERT().
|
|
|
|
@param[out] Rand Buffer pointer to store the random result.
|
|
|
|
@retval TRUE RDRAND call was successful.
|
|
@retval FALSE Failed attempts to call RDRAND.
|
|
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
AsmRdRand32 (
|
|
OUT UINT32 *Rand
|
|
);
|
|
|
|
/**
|
|
Generates a 64-bit random number through RDRAND instruction.
|
|
|
|
if Rand is NULL, then ASSERT().
|
|
|
|
@param[out] Rand Buffer pointer to store the random result.
|
|
|
|
@retval TRUE RDRAND call was successful.
|
|
@retval FALSE Failed attempts to call RDRAND.
|
|
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
AsmRdRand64 (
|
|
OUT UINT64 *Rand
|
|
);
|
|
|
|
/**
|
|
Load given selector into TR register.
|
|
|
|
@param[in] Selector Task segment selector
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmWriteTr (
|
|
IN UINT16 Selector
|
|
);
|
|
|
|
/**
|
|
Performs a serializing operation on all load-from-memory instructions that
|
|
were issued prior the AsmLfence function.
|
|
|
|
Executes a LFENCE instruction. This function is only available on IA-32 and x64.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmLfence (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Executes a XGETBV instruction
|
|
|
|
Executes a XGETBV instruction. This function is only available on IA-32 and
|
|
x64.
|
|
|
|
@param[in] Index Extended control register index
|
|
|
|
@return The current value of the extended control register
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsmXGetBv (
|
|
IN UINT32 Index
|
|
);
|
|
|
|
/**
|
|
Executes a XSETBV instruction to write a 64-bit value to a Extended Control
|
|
Register(XCR), and returns the value.
|
|
|
|
Writes the 64-bit value specified by Value to the XCR specified by Index. The
|
|
64-bit value written to the XCR is returned. No parameter checking is
|
|
performed on Index or Value, and some of these may cause CPU exceptions. The
|
|
caller must either guarantee that Index and Value are valid, or the caller
|
|
must establish proper exception handlers. This function is only available on
|
|
IA-32 and x64.
|
|
|
|
@param Index The 32-bit XCR index to write.
|
|
@param Value The 64-bit value to write to the XCR.
|
|
|
|
@return Value
|
|
|
|
**/
|
|
UINT64
|
|
EFIAPI
|
|
AsmXSetBv (
|
|
IN UINT32 Index,
|
|
IN UINT64 Value
|
|
);
|
|
|
|
/**
|
|
Executes a VMGEXIT instruction (VMMCALL with a REP prefix)
|
|
|
|
Executes a VMGEXIT instruction. This function is only available on IA-32 and
|
|
x64.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
AsmVmgExit (
|
|
VOID
|
|
);
|
|
|
|
///
|
|
/// The structure used to supply and return data to and from the SVSM.
|
|
///
|
|
typedef struct {
|
|
VOID *Caa;
|
|
UINT64 RaxIn;
|
|
UINT64 RcxIn;
|
|
UINT64 RdxIn;
|
|
UINT64 R8In;
|
|
UINT64 R9In;
|
|
UINT64 RaxOut;
|
|
UINT64 RcxOut;
|
|
UINT64 RdxOut;
|
|
UINT64 R8Out;
|
|
UINT64 R9Out;
|
|
UINT8 *CallPending;
|
|
} SVSM_CALL_DATA;
|
|
|
|
/**
|
|
Executes a VMGEXIT instruction (VMMCALL with a REP prefix) with arguments
|
|
and return code
|
|
|
|
Executes a VMGEXIT instruction placing the specified arguments in the
|
|
corresponding registers before invocation. Upon return an XCHG is done to
|
|
atomically clear and retrieve the SVSM call pending value. The returned RAX
|
|
register value becomes the function return code. This function is intended
|
|
for use with an SVSM. This function is only available on IA-32 and x64.
|
|
|
|
@param[in,out] SvsmCallPending Pointer to the location of the SVSM call data
|
|
|
|
@return Value of the RAX register on return
|
|
|
|
**/
|
|
UINT32
|
|
EFIAPI
|
|
AsmVmgExitSvsm (
|
|
IN OUT SVSM_CALL_DATA *SvsmCallData
|
|
);
|
|
|
|
/**
|
|
Patch the immediate operand of an IA32 or X64 instruction such that the byte,
|
|
word, dword or qword operand is encoded at the end of the instruction's
|
|
binary representation.
|
|
|
|
This function should be used to update object code that was compiled with
|
|
NASM from assembly source code. Example:
|
|
|
|
NASM source code:
|
|
|
|
mov eax, strict dword 0 ; the imm32 zero operand will be patched
|
|
ASM_PFX(gPatchCr3):
|
|
mov cr3, eax
|
|
|
|
C source code:
|
|
|
|
X86_ASSEMBLY_PATCH_LABEL gPatchCr3;
|
|
PatchInstructionX86 (gPatchCr3, AsmReadCr3 (), 4);
|
|
|
|
@param[out] InstructionEnd Pointer right past the instruction to patch. The
|
|
immediate operand to patch is expected to
|
|
comprise the trailing bytes of the instruction.
|
|
If InstructionEnd is closer to address 0 than
|
|
ValueSize permits, then ASSERT().
|
|
|
|
@param[in] PatchValue The constant to write to the immediate operand.
|
|
The caller is responsible for ensuring that
|
|
PatchValue can be represented in the byte, word,
|
|
dword or qword operand (as indicated through
|
|
ValueSize); otherwise ASSERT().
|
|
|
|
@param[in] ValueSize The size of the operand in bytes; must be 1, 2,
|
|
4, or 8. ASSERT() otherwise.
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
PatchInstructionX86 (
|
|
OUT X86_ASSEMBLY_PATCH_LABEL *InstructionEnd,
|
|
IN UINT64 PatchValue,
|
|
IN UINTN ValueSize
|
|
);
|
|
|
|
#endif // defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)
|
|
#endif // !defined (__BASE_LIB__)
|