1*1370a723SSascha Wildner /** @file 2*1370a723SSascha Wildner Provides string functions, linked list functions, math functions, synchronization 3*1370a723SSascha Wildner functions, file path functions, and CPU architecture-specific functions. 4*1370a723SSascha Wildner 5*1370a723SSascha Wildner Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR> 6*1370a723SSascha Wildner Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR> 7*1370a723SSascha Wildner Copyright (c) Microsoft Corporation.<BR> 8*1370a723SSascha Wildner Portions Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR> 9*1370a723SSascha Wildner Portions Copyright (c) 2022, Loongson Technology Corporation Limited. All rights reserved.<BR> 10*1370a723SSascha Wildner 11*1370a723SSascha Wildner SPDX-License-Identifier: BSD-2-Clause-Patent 12*1370a723SSascha Wildner 13*1370a723SSascha Wildner **/ 14*1370a723SSascha Wildner 15*1370a723SSascha Wildner #ifndef __BASE_LIB__ 16*1370a723SSascha Wildner #define __BASE_LIB__ 17*1370a723SSascha Wildner 18*1370a723SSascha Wildner // 19*1370a723SSascha Wildner // Definitions for architecture-specific types 20*1370a723SSascha Wildner // 21*1370a723SSascha Wildner #if defined (MDE_CPU_IA32) 22*1370a723SSascha Wildner /// 23*1370a723SSascha Wildner /// The IA-32 architecture context buffer used by SetJump() and LongJump(). 24*1370a723SSascha Wildner /// 25*1370a723SSascha Wildner typedef struct { 26*1370a723SSascha Wildner UINT32 Ebx; 27*1370a723SSascha Wildner UINT32 Esi; 28*1370a723SSascha Wildner UINT32 Edi; 29*1370a723SSascha Wildner UINT32 Ebp; 30*1370a723SSascha Wildner UINT32 Esp; 31*1370a723SSascha Wildner UINT32 Eip; 32*1370a723SSascha Wildner UINT32 Ssp; 33*1370a723SSascha Wildner } BASE_LIBRARY_JUMP_BUFFER; 34*1370a723SSascha Wildner 35*1370a723SSascha Wildner #define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 4 36*1370a723SSascha Wildner 37*1370a723SSascha Wildner #endif // defined (MDE_CPU_IA32) 38*1370a723SSascha Wildner 39*1370a723SSascha Wildner #if defined (MDE_CPU_X64) 40*1370a723SSascha Wildner /// 41*1370a723SSascha Wildner /// The x64 architecture context buffer used by SetJump() and LongJump(). 42*1370a723SSascha Wildner /// 43*1370a723SSascha Wildner typedef struct { 44*1370a723SSascha Wildner UINT64 Rbx; 45*1370a723SSascha Wildner UINT64 Rsp; 46*1370a723SSascha Wildner UINT64 Rbp; 47*1370a723SSascha Wildner UINT64 Rdi; 48*1370a723SSascha Wildner UINT64 Rsi; 49*1370a723SSascha Wildner UINT64 R12; 50*1370a723SSascha Wildner UINT64 R13; 51*1370a723SSascha Wildner UINT64 R14; 52*1370a723SSascha Wildner UINT64 R15; 53*1370a723SSascha Wildner UINT64 Rip; 54*1370a723SSascha Wildner UINT64 MxCsr; 55*1370a723SSascha Wildner UINT8 XmmBuffer[160]; ///< XMM6-XMM15. 56*1370a723SSascha Wildner UINT64 Ssp; 57*1370a723SSascha Wildner } BASE_LIBRARY_JUMP_BUFFER; 58*1370a723SSascha Wildner 59*1370a723SSascha Wildner #define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8 60*1370a723SSascha Wildner 61*1370a723SSascha Wildner #endif // defined (MDE_CPU_X64) 62*1370a723SSascha Wildner 63*1370a723SSascha Wildner #if defined (MDE_CPU_EBC) 64*1370a723SSascha Wildner /// 65*1370a723SSascha Wildner /// The EBC context buffer used by SetJump() and LongJump(). 66*1370a723SSascha Wildner /// 67*1370a723SSascha Wildner typedef struct { 68*1370a723SSascha Wildner UINT64 R0; 69*1370a723SSascha Wildner UINT64 R1; 70*1370a723SSascha Wildner UINT64 R2; 71*1370a723SSascha Wildner UINT64 R3; 72*1370a723SSascha Wildner UINT64 IP; 73*1370a723SSascha Wildner } BASE_LIBRARY_JUMP_BUFFER; 74*1370a723SSascha Wildner 75*1370a723SSascha Wildner #define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8 76*1370a723SSascha Wildner 77*1370a723SSascha Wildner #endif // defined (MDE_CPU_EBC) 78*1370a723SSascha Wildner 79*1370a723SSascha Wildner #if defined (MDE_CPU_ARM) 80*1370a723SSascha Wildner 81*1370a723SSascha Wildner typedef struct { 82*1370a723SSascha Wildner UINT32 R3; ///< A copy of R13. 83*1370a723SSascha Wildner UINT32 R4; 84*1370a723SSascha Wildner UINT32 R5; 85*1370a723SSascha Wildner UINT32 R6; 86*1370a723SSascha Wildner UINT32 R7; 87*1370a723SSascha Wildner UINT32 R8; 88*1370a723SSascha Wildner UINT32 R9; 89*1370a723SSascha Wildner UINT32 R10; 90*1370a723SSascha Wildner UINT32 R11; 91*1370a723SSascha Wildner UINT32 R12; 92*1370a723SSascha Wildner UINT32 R14; 93*1370a723SSascha Wildner } BASE_LIBRARY_JUMP_BUFFER; 94*1370a723SSascha Wildner 95*1370a723SSascha Wildner #define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 4 96*1370a723SSascha Wildner 97*1370a723SSascha Wildner #endif // defined (MDE_CPU_ARM) 98*1370a723SSascha Wildner 99*1370a723SSascha Wildner #if defined (MDE_CPU_AARCH64) 100*1370a723SSascha Wildner typedef struct { 101*1370a723SSascha Wildner // GP regs 102*1370a723SSascha Wildner UINT64 X19; 103*1370a723SSascha Wildner UINT64 X20; 104*1370a723SSascha Wildner UINT64 X21; 105*1370a723SSascha Wildner UINT64 X22; 106*1370a723SSascha Wildner UINT64 X23; 107*1370a723SSascha Wildner UINT64 X24; 108*1370a723SSascha Wildner UINT64 X25; 109*1370a723SSascha Wildner UINT64 X26; 110*1370a723SSascha Wildner UINT64 X27; 111*1370a723SSascha Wildner UINT64 X28; 112*1370a723SSascha Wildner UINT64 FP; 113*1370a723SSascha Wildner UINT64 LR; 114*1370a723SSascha Wildner UINT64 IP0; 115*1370a723SSascha Wildner 116*1370a723SSascha Wildner // FP regs 117*1370a723SSascha Wildner UINT64 D8; 118*1370a723SSascha Wildner UINT64 D9; 119*1370a723SSascha Wildner UINT64 D10; 120*1370a723SSascha Wildner UINT64 D11; 121*1370a723SSascha Wildner UINT64 D12; 122*1370a723SSascha Wildner UINT64 D13; 123*1370a723SSascha Wildner UINT64 D14; 124*1370a723SSascha Wildner UINT64 D15; 125*1370a723SSascha Wildner } BASE_LIBRARY_JUMP_BUFFER; 126*1370a723SSascha Wildner 127*1370a723SSascha Wildner #define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8 128*1370a723SSascha Wildner 129*1370a723SSascha Wildner #endif // defined (MDE_CPU_AARCH64) 130*1370a723SSascha Wildner 131*1370a723SSascha Wildner #if defined (MDE_CPU_RISCV64) 132*1370a723SSascha Wildner /// 133*1370a723SSascha Wildner /// The RISC-V architecture context buffer used by SetJump() and LongJump(). 134*1370a723SSascha Wildner /// 135*1370a723SSascha Wildner typedef struct { 136*1370a723SSascha Wildner UINT64 RA; 137*1370a723SSascha Wildner UINT64 S0; 138*1370a723SSascha Wildner UINT64 S1; 139*1370a723SSascha Wildner UINT64 S2; 140*1370a723SSascha Wildner UINT64 S3; 141*1370a723SSascha Wildner UINT64 S4; 142*1370a723SSascha Wildner UINT64 S5; 143*1370a723SSascha Wildner UINT64 S6; 144*1370a723SSascha Wildner UINT64 S7; 145*1370a723SSascha Wildner UINT64 S8; 146*1370a723SSascha Wildner UINT64 S9; 147*1370a723SSascha Wildner UINT64 S10; 148*1370a723SSascha Wildner UINT64 S11; 149*1370a723SSascha Wildner UINT64 SP; 150*1370a723SSascha Wildner } BASE_LIBRARY_JUMP_BUFFER; 151*1370a723SSascha Wildner 152*1370a723SSascha Wildner #define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8 153*1370a723SSascha Wildner 154*1370a723SSascha Wildner VOID 155*1370a723SSascha Wildner RiscVSetSupervisorScratch ( 156*1370a723SSascha Wildner IN UINT64 157*1370a723SSascha Wildner ); 158*1370a723SSascha Wildner 159*1370a723SSascha Wildner UINT64 160*1370a723SSascha Wildner RiscVGetSupervisorScratch ( 161*1370a723SSascha Wildner VOID 162*1370a723SSascha Wildner ); 163*1370a723SSascha Wildner 164*1370a723SSascha Wildner VOID 165*1370a723SSascha Wildner RiscVSetSupervisorStvec ( 166*1370a723SSascha Wildner IN UINT64 167*1370a723SSascha Wildner ); 168*1370a723SSascha Wildner 169*1370a723SSascha Wildner UINT64 170*1370a723SSascha Wildner RiscVGetSupervisorStvec ( 171*1370a723SSascha Wildner VOID 172*1370a723SSascha Wildner ); 173*1370a723SSascha Wildner 174*1370a723SSascha Wildner UINT64 175*1370a723SSascha Wildner RiscVGetSupervisorTrapCause ( 176*1370a723SSascha Wildner VOID 177*1370a723SSascha Wildner ); 178*1370a723SSascha Wildner 179*1370a723SSascha Wildner VOID 180*1370a723SSascha Wildner RiscVSetSupervisorAddressTranslationRegister ( 181*1370a723SSascha Wildner IN UINT64 182*1370a723SSascha Wildner ); 183*1370a723SSascha Wildner 184*1370a723SSascha Wildner UINT64 185*1370a723SSascha Wildner RiscVReadTimer ( 186*1370a723SSascha Wildner VOID 187*1370a723SSascha Wildner ); 188*1370a723SSascha Wildner 189*1370a723SSascha Wildner VOID 190*1370a723SSascha Wildner RiscVEnableTimerInterrupt ( 191*1370a723SSascha Wildner VOID 192*1370a723SSascha Wildner ); 193*1370a723SSascha Wildner 194*1370a723SSascha Wildner VOID 195*1370a723SSascha Wildner RiscVDisableTimerInterrupt ( 196*1370a723SSascha Wildner VOID 197*1370a723SSascha Wildner ); 198*1370a723SSascha Wildner 199*1370a723SSascha Wildner VOID 200*1370a723SSascha Wildner RiscVClearPendingTimerInterrupt ( 201*1370a723SSascha Wildner VOID 202*1370a723SSascha Wildner ); 203*1370a723SSascha Wildner 204*1370a723SSascha Wildner #endif // defined (MDE_CPU_RISCV64) 205*1370a723SSascha Wildner 206*1370a723SSascha Wildner #if defined (MDE_CPU_LOONGARCH64) 207*1370a723SSascha Wildner /// 208*1370a723SSascha Wildner /// The LoongArch architecture context buffer used by SetJump() and LongJump() 209*1370a723SSascha Wildner /// 210*1370a723SSascha Wildner typedef struct { 211*1370a723SSascha Wildner UINT64 S0; 212*1370a723SSascha Wildner UINT64 S1; 213*1370a723SSascha Wildner UINT64 S2; 214*1370a723SSascha Wildner UINT64 S3; 215*1370a723SSascha Wildner UINT64 S4; 216*1370a723SSascha Wildner UINT64 S5; 217*1370a723SSascha Wildner UINT64 S6; 218*1370a723SSascha Wildner UINT64 S7; 219*1370a723SSascha Wildner UINT64 S8; 220*1370a723SSascha Wildner UINT64 SP; 221*1370a723SSascha Wildner UINT64 FP; 222*1370a723SSascha Wildner UINT64 RA; 223*1370a723SSascha Wildner } BASE_LIBRARY_JUMP_BUFFER; 224*1370a723SSascha Wildner 225*1370a723SSascha Wildner #define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8 226*1370a723SSascha Wildner 227*1370a723SSascha Wildner #endif // defined (MDE_CPU_LOONGARCH64) 228*1370a723SSascha Wildner 229*1370a723SSascha Wildner // 230*1370a723SSascha Wildner // String Services 231*1370a723SSascha Wildner // 232*1370a723SSascha Wildner 233*1370a723SSascha Wildner /** 234*1370a723SSascha Wildner Returns the length of a Null-terminated Unicode string. 235*1370a723SSascha Wildner 236*1370a723SSascha Wildner This function is similar as strlen_s defined in C11. 237*1370a723SSascha Wildner 238*1370a723SSascha Wildner If String is not aligned on a 16-bit boundary, then ASSERT(). 239*1370a723SSascha Wildner 240*1370a723SSascha Wildner @param String A pointer to a Null-terminated Unicode string. 241*1370a723SSascha Wildner @param MaxSize The maximum number of Destination Unicode 242*1370a723SSascha Wildner char, including terminating null char. 243*1370a723SSascha Wildner 244*1370a723SSascha Wildner @retval 0 If String is NULL. 245*1370a723SSascha Wildner @retval MaxSize If there is no null character in the first MaxSize characters of String. 246*1370a723SSascha Wildner @return The number of characters that percede the terminating null character. 247*1370a723SSascha Wildner 248*1370a723SSascha Wildner **/ 249*1370a723SSascha Wildner UINTN 250*1370a723SSascha Wildner EFIAPI 251*1370a723SSascha Wildner StrnLenS ( 252*1370a723SSascha Wildner IN CONST CHAR16 *String, 253*1370a723SSascha Wildner IN UINTN MaxSize 254*1370a723SSascha Wildner ); 255*1370a723SSascha Wildner 256*1370a723SSascha Wildner /** 257*1370a723SSascha Wildner Returns the size of a Null-terminated Unicode string in bytes, including the 258*1370a723SSascha Wildner Null terminator. 259*1370a723SSascha Wildner 260*1370a723SSascha Wildner This function returns the size of the Null-terminated Unicode string 261*1370a723SSascha Wildner specified by String in bytes, including the Null terminator. 262*1370a723SSascha Wildner 263*1370a723SSascha Wildner If String is not aligned on a 16-bit boundary, then ASSERT(). 264*1370a723SSascha Wildner 265*1370a723SSascha Wildner @param String A pointer to a Null-terminated Unicode string. 266*1370a723SSascha Wildner @param MaxSize The maximum number of Destination Unicode 267*1370a723SSascha Wildner char, including the Null terminator. 268*1370a723SSascha Wildner 269*1370a723SSascha Wildner @retval 0 If String is NULL. 270*1370a723SSascha Wildner @retval (sizeof (CHAR16) * (MaxSize + 1)) 271*1370a723SSascha Wildner If there is no Null terminator in the first MaxSize characters of 272*1370a723SSascha Wildner String. 273*1370a723SSascha Wildner @return The size of the Null-terminated Unicode string in bytes, including 274*1370a723SSascha Wildner the Null terminator. 275*1370a723SSascha Wildner 276*1370a723SSascha Wildner **/ 277*1370a723SSascha Wildner UINTN 278*1370a723SSascha Wildner EFIAPI 279*1370a723SSascha Wildner StrnSizeS ( 280*1370a723SSascha Wildner IN CONST CHAR16 *String, 281*1370a723SSascha Wildner IN UINTN MaxSize 282*1370a723SSascha Wildner ); 283*1370a723SSascha Wildner 284*1370a723SSascha Wildner /** 285*1370a723SSascha Wildner Copies the string pointed to by Source (including the terminating null char) 286*1370a723SSascha Wildner to the array pointed to by Destination. 287*1370a723SSascha Wildner 288*1370a723SSascha Wildner This function is similar as strcpy_s defined in C11. 289*1370a723SSascha Wildner 290*1370a723SSascha Wildner If Destination is not aligned on a 16-bit boundary, then ASSERT(). 291*1370a723SSascha Wildner If Source is not aligned on a 16-bit boundary, then ASSERT(). 292*1370a723SSascha Wildner 293*1370a723SSascha Wildner If an error is returned, then the Destination is unmodified. 294*1370a723SSascha Wildner 295*1370a723SSascha Wildner @param Destination A pointer to a Null-terminated Unicode string. 296*1370a723SSascha Wildner @param DestMax The maximum number of Destination Unicode 297*1370a723SSascha Wildner char, including terminating null char. 298*1370a723SSascha Wildner @param Source A pointer to a Null-terminated Unicode string. 299*1370a723SSascha Wildner 300*1370a723SSascha Wildner @retval RETURN_SUCCESS String is copied. 301*1370a723SSascha Wildner @retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than StrLen(Source). 302*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If Destination is NULL. 303*1370a723SSascha Wildner If Source is NULL. 304*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not zero, 305*1370a723SSascha Wildner and DestMax is greater than 306*1370a723SSascha Wildner PcdMaximumUnicodeStringLength. 307*1370a723SSascha Wildner If DestMax is 0. 308*1370a723SSascha Wildner @retval RETURN_ACCESS_DENIED If Source and Destination overlap. 309*1370a723SSascha Wildner **/ 310*1370a723SSascha Wildner RETURN_STATUS 311*1370a723SSascha Wildner EFIAPI 312*1370a723SSascha Wildner StrCpyS ( 313*1370a723SSascha Wildner OUT CHAR16 *Destination, 314*1370a723SSascha Wildner IN UINTN DestMax, 315*1370a723SSascha Wildner IN CONST CHAR16 *Source 316*1370a723SSascha Wildner ); 317*1370a723SSascha Wildner 318*1370a723SSascha Wildner /** 319*1370a723SSascha Wildner Copies not more than Length successive char from the string pointed to by 320*1370a723SSascha Wildner Source to the array pointed to by Destination. If no null char is copied from 321*1370a723SSascha Wildner Source, then Destination[Length] is always set to null. 322*1370a723SSascha Wildner 323*1370a723SSascha Wildner This function is similar as strncpy_s defined in C11. 324*1370a723SSascha Wildner 325*1370a723SSascha Wildner If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT(). 326*1370a723SSascha Wildner If Length > 0 and Source is not aligned on a 16-bit boundary, then ASSERT(). 327*1370a723SSascha Wildner 328*1370a723SSascha Wildner If an error is returned, then the Destination is unmodified. 329*1370a723SSascha Wildner 330*1370a723SSascha Wildner @param Destination A pointer to a Null-terminated Unicode string. 331*1370a723SSascha Wildner @param DestMax The maximum number of Destination Unicode 332*1370a723SSascha Wildner char, including terminating null char. 333*1370a723SSascha Wildner @param Source A pointer to a Null-terminated Unicode string. 334*1370a723SSascha Wildner @param Length The maximum number of Unicode characters to copy. 335*1370a723SSascha Wildner 336*1370a723SSascha Wildner @retval RETURN_SUCCESS String is copied. 337*1370a723SSascha Wildner @retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than 338*1370a723SSascha Wildner MIN(StrLen(Source), Length). 339*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If Destination is NULL. 340*1370a723SSascha Wildner If Source is NULL. 341*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not zero, 342*1370a723SSascha Wildner and DestMax is greater than 343*1370a723SSascha Wildner PcdMaximumUnicodeStringLength. 344*1370a723SSascha Wildner If DestMax is 0. 345*1370a723SSascha Wildner @retval RETURN_ACCESS_DENIED If Source and Destination overlap. 346*1370a723SSascha Wildner **/ 347*1370a723SSascha Wildner RETURN_STATUS 348*1370a723SSascha Wildner EFIAPI 349*1370a723SSascha Wildner StrnCpyS ( 350*1370a723SSascha Wildner OUT CHAR16 *Destination, 351*1370a723SSascha Wildner IN UINTN DestMax, 352*1370a723SSascha Wildner IN CONST CHAR16 *Source, 353*1370a723SSascha Wildner IN UINTN Length 354*1370a723SSascha Wildner ); 355*1370a723SSascha Wildner 356*1370a723SSascha Wildner /** 357*1370a723SSascha Wildner Appends a copy of the string pointed to by Source (including the terminating 358*1370a723SSascha Wildner null char) to the end of the string pointed to by Destination. 359*1370a723SSascha Wildner 360*1370a723SSascha Wildner This function is similar as strcat_s defined in C11. 361*1370a723SSascha Wildner 362*1370a723SSascha Wildner If Destination is not aligned on a 16-bit boundary, then ASSERT(). 363*1370a723SSascha Wildner If Source is not aligned on a 16-bit boundary, then ASSERT(). 364*1370a723SSascha Wildner 365*1370a723SSascha Wildner If an error is returned, then the Destination is unmodified. 366*1370a723SSascha Wildner 367*1370a723SSascha Wildner @param Destination A pointer to a Null-terminated Unicode string. 368*1370a723SSascha Wildner @param DestMax The maximum number of Destination Unicode 369*1370a723SSascha Wildner char, including terminating null char. 370*1370a723SSascha Wildner @param Source A pointer to a Null-terminated Unicode string. 371*1370a723SSascha Wildner 372*1370a723SSascha Wildner @retval RETURN_SUCCESS String is appended. 373*1370a723SSascha Wildner @retval RETURN_BAD_BUFFER_SIZE If DestMax is NOT greater than 374*1370a723SSascha Wildner StrLen(Destination). 375*1370a723SSascha Wildner @retval RETURN_BUFFER_TOO_SMALL If (DestMax - StrLen(Destination)) is NOT 376*1370a723SSascha Wildner greater than StrLen(Source). 377*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If Destination is NULL. 378*1370a723SSascha Wildner If Source is NULL. 379*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not zero, 380*1370a723SSascha Wildner and DestMax is greater than 381*1370a723SSascha Wildner PcdMaximumUnicodeStringLength. 382*1370a723SSascha Wildner If DestMax is 0. 383*1370a723SSascha Wildner @retval RETURN_ACCESS_DENIED If Source and Destination overlap. 384*1370a723SSascha Wildner **/ 385*1370a723SSascha Wildner RETURN_STATUS 386*1370a723SSascha Wildner EFIAPI 387*1370a723SSascha Wildner StrCatS ( 388*1370a723SSascha Wildner IN OUT CHAR16 *Destination, 389*1370a723SSascha Wildner IN UINTN DestMax, 390*1370a723SSascha Wildner IN CONST CHAR16 *Source 391*1370a723SSascha Wildner ); 392*1370a723SSascha Wildner 393*1370a723SSascha Wildner /** 394*1370a723SSascha Wildner Appends not more than Length successive char from the string pointed to by 395*1370a723SSascha Wildner Source to the end of the string pointed to by Destination. If no null char is 396*1370a723SSascha Wildner copied from Source, then Destination[StrLen(Destination) + Length] is always 397*1370a723SSascha Wildner set to null. 398*1370a723SSascha Wildner 399*1370a723SSascha Wildner This function is similar as strncat_s defined in C11. 400*1370a723SSascha Wildner 401*1370a723SSascha Wildner If Destination is not aligned on a 16-bit boundary, then ASSERT(). 402*1370a723SSascha Wildner If Source is not aligned on a 16-bit boundary, then ASSERT(). 403*1370a723SSascha Wildner 404*1370a723SSascha Wildner If an error is returned, then the Destination is unmodified. 405*1370a723SSascha Wildner 406*1370a723SSascha Wildner @param Destination A pointer to a Null-terminated Unicode string. 407*1370a723SSascha Wildner @param DestMax The maximum number of Destination Unicode 408*1370a723SSascha Wildner char, including terminating null char. 409*1370a723SSascha Wildner @param Source A pointer to a Null-terminated Unicode string. 410*1370a723SSascha Wildner @param Length The maximum number of Unicode characters to copy. 411*1370a723SSascha Wildner 412*1370a723SSascha Wildner @retval RETURN_SUCCESS String is appended. 413*1370a723SSascha Wildner @retval RETURN_BAD_BUFFER_SIZE If DestMax is NOT greater than 414*1370a723SSascha Wildner StrLen(Destination). 415*1370a723SSascha Wildner @retval RETURN_BUFFER_TOO_SMALL If (DestMax - StrLen(Destination)) is NOT 416*1370a723SSascha Wildner greater than MIN(StrLen(Source), Length). 417*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If Destination is NULL. 418*1370a723SSascha Wildner If Source is NULL. 419*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not zero, 420*1370a723SSascha Wildner and DestMax is greater than 421*1370a723SSascha Wildner PcdMaximumUnicodeStringLength. 422*1370a723SSascha Wildner If DestMax is 0. 423*1370a723SSascha Wildner @retval RETURN_ACCESS_DENIED If Source and Destination overlap. 424*1370a723SSascha Wildner **/ 425*1370a723SSascha Wildner RETURN_STATUS 426*1370a723SSascha Wildner EFIAPI 427*1370a723SSascha Wildner StrnCatS ( 428*1370a723SSascha Wildner IN OUT CHAR16 *Destination, 429*1370a723SSascha Wildner IN UINTN DestMax, 430*1370a723SSascha Wildner IN CONST CHAR16 *Source, 431*1370a723SSascha Wildner IN UINTN Length 432*1370a723SSascha Wildner ); 433*1370a723SSascha Wildner 434*1370a723SSascha Wildner /** 435*1370a723SSascha Wildner Convert a Null-terminated Unicode decimal string to a value of type UINTN. 436*1370a723SSascha Wildner 437*1370a723SSascha Wildner This function outputs a value of type UINTN by interpreting the contents of 438*1370a723SSascha Wildner the Unicode string specified by String as a decimal number. The format of the 439*1370a723SSascha Wildner input Unicode string String is: 440*1370a723SSascha Wildner 441*1370a723SSascha Wildner [spaces] [decimal digits]. 442*1370a723SSascha Wildner 443*1370a723SSascha Wildner The valid decimal digit character is in the range [0-9]. The function will 444*1370a723SSascha Wildner ignore the pad space, which includes spaces or tab characters, before 445*1370a723SSascha Wildner [decimal digits]. The running zero in the beginning of [decimal digits] will 446*1370a723SSascha Wildner be ignored. Then, the function stops at the first character that is a not a 447*1370a723SSascha Wildner valid decimal character or a Null-terminator, whichever one comes first. 448*1370a723SSascha Wildner 449*1370a723SSascha Wildner If String is not aligned in a 16-bit boundary, then ASSERT(). 450*1370a723SSascha Wildner 451*1370a723SSascha Wildner If String has no valid decimal digits in the above format, then 0 is stored 452*1370a723SSascha Wildner at the location pointed to by Data. 453*1370a723SSascha Wildner If the number represented by String exceeds the range defined by UINTN, then 454*1370a723SSascha Wildner MAX_UINTN is stored at the location pointed to by Data. 455*1370a723SSascha Wildner 456*1370a723SSascha Wildner If EndPointer is not NULL, a pointer to the character that stopped the scan 457*1370a723SSascha Wildner is stored at the location pointed to by EndPointer. If String has no valid 458*1370a723SSascha Wildner decimal digits right after the optional pad spaces, the value of String is 459*1370a723SSascha Wildner stored at the location pointed to by EndPointer. 460*1370a723SSascha Wildner 461*1370a723SSascha Wildner @param String Pointer to a Null-terminated Unicode string. 462*1370a723SSascha Wildner @param EndPointer Pointer to character that stops scan. 463*1370a723SSascha Wildner @param Data Pointer to the converted value. 464*1370a723SSascha Wildner 465*1370a723SSascha Wildner @retval RETURN_SUCCESS Value is translated from String. 466*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If String is NULL. 467*1370a723SSascha Wildner If Data is NULL. 468*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not 469*1370a723SSascha Wildner zero, and String contains more than 470*1370a723SSascha Wildner PcdMaximumUnicodeStringLength Unicode 471*1370a723SSascha Wildner characters, not including the 472*1370a723SSascha Wildner Null-terminator. 473*1370a723SSascha Wildner @retval RETURN_UNSUPPORTED If the number represented by String exceeds 474*1370a723SSascha Wildner the range defined by UINTN. 475*1370a723SSascha Wildner 476*1370a723SSascha Wildner **/ 477*1370a723SSascha Wildner RETURN_STATUS 478*1370a723SSascha Wildner EFIAPI 479*1370a723SSascha Wildner StrDecimalToUintnS ( 480*1370a723SSascha Wildner IN CONST CHAR16 *String, 481*1370a723SSascha Wildner OUT CHAR16 **EndPointer OPTIONAL, 482*1370a723SSascha Wildner OUT UINTN *Data 483*1370a723SSascha Wildner ); 484*1370a723SSascha Wildner 485*1370a723SSascha Wildner /** 486*1370a723SSascha Wildner Convert a Null-terminated Unicode decimal string to a value of type UINT64. 487*1370a723SSascha Wildner 488*1370a723SSascha Wildner This function outputs a value of type UINT64 by interpreting the contents of 489*1370a723SSascha Wildner the Unicode string specified by String as a decimal number. The format of the 490*1370a723SSascha Wildner input Unicode string String is: 491*1370a723SSascha Wildner 492*1370a723SSascha Wildner [spaces] [decimal digits]. 493*1370a723SSascha Wildner 494*1370a723SSascha Wildner The valid decimal digit character is in the range [0-9]. The function will 495*1370a723SSascha Wildner ignore the pad space, which includes spaces or tab characters, before 496*1370a723SSascha Wildner [decimal digits]. The running zero in the beginning of [decimal digits] will 497*1370a723SSascha Wildner be ignored. Then, the function stops at the first character that is a not a 498*1370a723SSascha Wildner valid decimal character or a Null-terminator, whichever one comes first. 499*1370a723SSascha Wildner 500*1370a723SSascha Wildner If String is not aligned in a 16-bit boundary, then ASSERT(). 501*1370a723SSascha Wildner 502*1370a723SSascha Wildner If String has no valid decimal digits in the above format, then 0 is stored 503*1370a723SSascha Wildner at the location pointed to by Data. 504*1370a723SSascha Wildner If the number represented by String exceeds the range defined by UINT64, then 505*1370a723SSascha Wildner MAX_UINT64 is stored at the location pointed to by Data. 506*1370a723SSascha Wildner 507*1370a723SSascha Wildner If EndPointer is not NULL, a pointer to the character that stopped the scan 508*1370a723SSascha Wildner is stored at the location pointed to by EndPointer. If String has no valid 509*1370a723SSascha Wildner decimal digits right after the optional pad spaces, the value of String is 510*1370a723SSascha Wildner stored at the location pointed to by EndPointer. 511*1370a723SSascha Wildner 512*1370a723SSascha Wildner @param String Pointer to a Null-terminated Unicode string. 513*1370a723SSascha Wildner @param EndPointer Pointer to character that stops scan. 514*1370a723SSascha Wildner @param Data Pointer to the converted value. 515*1370a723SSascha Wildner 516*1370a723SSascha Wildner @retval RETURN_SUCCESS Value is translated from String. 517*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If String is NULL. 518*1370a723SSascha Wildner If Data is NULL. 519*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not 520*1370a723SSascha Wildner zero, and String contains more than 521*1370a723SSascha Wildner PcdMaximumUnicodeStringLength Unicode 522*1370a723SSascha Wildner characters, not including the 523*1370a723SSascha Wildner Null-terminator. 524*1370a723SSascha Wildner @retval RETURN_UNSUPPORTED If the number represented by String exceeds 525*1370a723SSascha Wildner the range defined by UINT64. 526*1370a723SSascha Wildner 527*1370a723SSascha Wildner **/ 528*1370a723SSascha Wildner RETURN_STATUS 529*1370a723SSascha Wildner EFIAPI 530*1370a723SSascha Wildner StrDecimalToUint64S ( 531*1370a723SSascha Wildner IN CONST CHAR16 *String, 532*1370a723SSascha Wildner OUT CHAR16 **EndPointer OPTIONAL, 533*1370a723SSascha Wildner OUT UINT64 *Data 534*1370a723SSascha Wildner ); 535*1370a723SSascha Wildner 536*1370a723SSascha Wildner /** 537*1370a723SSascha Wildner Convert a Null-terminated Unicode hexadecimal string to a value of type 538*1370a723SSascha Wildner UINTN. 539*1370a723SSascha Wildner 540*1370a723SSascha Wildner This function outputs a value of type UINTN by interpreting the contents of 541*1370a723SSascha Wildner the Unicode string specified by String as a hexadecimal number. The format of 542*1370a723SSascha Wildner the input Unicode string String is: 543*1370a723SSascha Wildner 544*1370a723SSascha Wildner [spaces][zeros][x][hexadecimal digits]. 545*1370a723SSascha Wildner 546*1370a723SSascha Wildner The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. 547*1370a723SSascha Wildner The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. 548*1370a723SSascha Wildner If "x" appears in the input string, it must be prefixed with at least one 0. 549*1370a723SSascha Wildner The function will ignore the pad space, which includes spaces or tab 550*1370a723SSascha Wildner characters, before [zeros], [x] or [hexadecimal digit]. The running zero 551*1370a723SSascha Wildner before [x] or [hexadecimal digit] will be ignored. Then, the decoding starts 552*1370a723SSascha Wildner after [x] or the first valid hexadecimal digit. Then, the function stops at 553*1370a723SSascha Wildner the first character that is a not a valid hexadecimal character or NULL, 554*1370a723SSascha Wildner whichever one comes first. 555*1370a723SSascha Wildner 556*1370a723SSascha Wildner If String is not aligned in a 16-bit boundary, then ASSERT(). 557*1370a723SSascha Wildner 558*1370a723SSascha Wildner If String has no valid hexadecimal digits in the above format, then 0 is 559*1370a723SSascha Wildner stored at the location pointed to by Data. 560*1370a723SSascha Wildner If the number represented by String exceeds the range defined by UINTN, then 561*1370a723SSascha Wildner MAX_UINTN is stored at the location pointed to by Data. 562*1370a723SSascha Wildner 563*1370a723SSascha Wildner If EndPointer is not NULL, a pointer to the character that stopped the scan 564*1370a723SSascha Wildner is stored at the location pointed to by EndPointer. If String has no valid 565*1370a723SSascha Wildner hexadecimal digits right after the optional pad spaces, the value of String 566*1370a723SSascha Wildner is stored at the location pointed to by EndPointer. 567*1370a723SSascha Wildner 568*1370a723SSascha Wildner @param String Pointer to a Null-terminated Unicode string. 569*1370a723SSascha Wildner @param EndPointer Pointer to character that stops scan. 570*1370a723SSascha Wildner @param Data Pointer to the converted value. 571*1370a723SSascha Wildner 572*1370a723SSascha Wildner @retval RETURN_SUCCESS Value is translated from String. 573*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If String is NULL. 574*1370a723SSascha Wildner If Data is NULL. 575*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not 576*1370a723SSascha Wildner zero, and String contains more than 577*1370a723SSascha Wildner PcdMaximumUnicodeStringLength Unicode 578*1370a723SSascha Wildner characters, not including the 579*1370a723SSascha Wildner Null-terminator. 580*1370a723SSascha Wildner @retval RETURN_UNSUPPORTED If the number represented by String exceeds 581*1370a723SSascha Wildner the range defined by UINTN. 582*1370a723SSascha Wildner 583*1370a723SSascha Wildner **/ 584*1370a723SSascha Wildner RETURN_STATUS 585*1370a723SSascha Wildner EFIAPI 586*1370a723SSascha Wildner StrHexToUintnS ( 587*1370a723SSascha Wildner IN CONST CHAR16 *String, 588*1370a723SSascha Wildner OUT CHAR16 **EndPointer OPTIONAL, 589*1370a723SSascha Wildner OUT UINTN *Data 590*1370a723SSascha Wildner ); 591*1370a723SSascha Wildner 592*1370a723SSascha Wildner /** 593*1370a723SSascha Wildner Convert a Null-terminated Unicode hexadecimal string to a value of type 594*1370a723SSascha Wildner UINT64. 595*1370a723SSascha Wildner 596*1370a723SSascha Wildner This function outputs a value of type UINT64 by interpreting the contents of 597*1370a723SSascha Wildner the Unicode string specified by String as a hexadecimal number. The format of 598*1370a723SSascha Wildner the input Unicode string String is: 599*1370a723SSascha Wildner 600*1370a723SSascha Wildner [spaces][zeros][x][hexadecimal digits]. 601*1370a723SSascha Wildner 602*1370a723SSascha Wildner The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. 603*1370a723SSascha Wildner The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. 604*1370a723SSascha Wildner If "x" appears in the input string, it must be prefixed with at least one 0. 605*1370a723SSascha Wildner The function will ignore the pad space, which includes spaces or tab 606*1370a723SSascha Wildner characters, before [zeros], [x] or [hexadecimal digit]. The running zero 607*1370a723SSascha Wildner before [x] or [hexadecimal digit] will be ignored. Then, the decoding starts 608*1370a723SSascha Wildner after [x] or the first valid hexadecimal digit. Then, the function stops at 609*1370a723SSascha Wildner the first character that is a not a valid hexadecimal character or NULL, 610*1370a723SSascha Wildner whichever one comes first. 611*1370a723SSascha Wildner 612*1370a723SSascha Wildner If String is not aligned in a 16-bit boundary, then ASSERT(). 613*1370a723SSascha Wildner 614*1370a723SSascha Wildner If String has no valid hexadecimal digits in the above format, then 0 is 615*1370a723SSascha Wildner stored at the location pointed to by Data. 616*1370a723SSascha Wildner If the number represented by String exceeds the range defined by UINT64, then 617*1370a723SSascha Wildner MAX_UINT64 is stored at the location pointed to by Data. 618*1370a723SSascha Wildner 619*1370a723SSascha Wildner If EndPointer is not NULL, a pointer to the character that stopped the scan 620*1370a723SSascha Wildner is stored at the location pointed to by EndPointer. If String has no valid 621*1370a723SSascha Wildner hexadecimal digits right after the optional pad spaces, the value of String 622*1370a723SSascha Wildner is stored at the location pointed to by EndPointer. 623*1370a723SSascha Wildner 624*1370a723SSascha Wildner @param String Pointer to a Null-terminated Unicode string. 625*1370a723SSascha Wildner @param EndPointer Pointer to character that stops scan. 626*1370a723SSascha Wildner @param Data Pointer to the converted value. 627*1370a723SSascha Wildner 628*1370a723SSascha Wildner @retval RETURN_SUCCESS Value is translated from String. 629*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If String is NULL. 630*1370a723SSascha Wildner If Data is NULL. 631*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not 632*1370a723SSascha Wildner zero, and String contains more than 633*1370a723SSascha Wildner PcdMaximumUnicodeStringLength Unicode 634*1370a723SSascha Wildner characters, not including the 635*1370a723SSascha Wildner Null-terminator. 636*1370a723SSascha Wildner @retval RETURN_UNSUPPORTED If the number represented by String exceeds 637*1370a723SSascha Wildner the range defined by UINT64. 638*1370a723SSascha Wildner 639*1370a723SSascha Wildner **/ 640*1370a723SSascha Wildner RETURN_STATUS 641*1370a723SSascha Wildner EFIAPI 642*1370a723SSascha Wildner StrHexToUint64S ( 643*1370a723SSascha Wildner IN CONST CHAR16 *String, 644*1370a723SSascha Wildner OUT CHAR16 **EndPointer OPTIONAL, 645*1370a723SSascha Wildner OUT UINT64 *Data 646*1370a723SSascha Wildner ); 647*1370a723SSascha Wildner 648*1370a723SSascha Wildner /** 649*1370a723SSascha Wildner Returns the length of a Null-terminated Ascii string. 650*1370a723SSascha Wildner 651*1370a723SSascha Wildner This function is similar as strlen_s defined in C11. 652*1370a723SSascha Wildner 653*1370a723SSascha Wildner @param String A pointer to a Null-terminated Ascii string. 654*1370a723SSascha Wildner @param MaxSize The maximum number of Destination Ascii 655*1370a723SSascha Wildner char, including terminating null char. 656*1370a723SSascha Wildner 657*1370a723SSascha Wildner @retval 0 If String is NULL. 658*1370a723SSascha Wildner @retval MaxSize If there is no null character in the first MaxSize characters of String. 659*1370a723SSascha Wildner @return The number of characters that percede the terminating null character. 660*1370a723SSascha Wildner 661*1370a723SSascha Wildner **/ 662*1370a723SSascha Wildner UINTN 663*1370a723SSascha Wildner EFIAPI 664*1370a723SSascha Wildner AsciiStrnLenS ( 665*1370a723SSascha Wildner IN CONST CHAR8 *String, 666*1370a723SSascha Wildner IN UINTN MaxSize 667*1370a723SSascha Wildner ); 668*1370a723SSascha Wildner 669*1370a723SSascha Wildner /** 670*1370a723SSascha Wildner Returns the size of a Null-terminated Ascii string in bytes, including the 671*1370a723SSascha Wildner Null terminator. 672*1370a723SSascha Wildner 673*1370a723SSascha Wildner This function returns the size of the Null-terminated Ascii string specified 674*1370a723SSascha Wildner by String in bytes, including the Null terminator. 675*1370a723SSascha Wildner 676*1370a723SSascha Wildner @param String A pointer to a Null-terminated Ascii string. 677*1370a723SSascha Wildner @param MaxSize The maximum number of Destination Ascii 678*1370a723SSascha Wildner char, including the Null terminator. 679*1370a723SSascha Wildner 680*1370a723SSascha Wildner @retval 0 If String is NULL. 681*1370a723SSascha Wildner @retval (sizeof (CHAR8) * (MaxSize + 1)) 682*1370a723SSascha Wildner If there is no Null terminator in the first MaxSize characters of 683*1370a723SSascha Wildner String. 684*1370a723SSascha Wildner @return The size of the Null-terminated Ascii string in bytes, including the 685*1370a723SSascha Wildner Null terminator. 686*1370a723SSascha Wildner 687*1370a723SSascha Wildner **/ 688*1370a723SSascha Wildner UINTN 689*1370a723SSascha Wildner EFIAPI 690*1370a723SSascha Wildner AsciiStrnSizeS ( 691*1370a723SSascha Wildner IN CONST CHAR8 *String, 692*1370a723SSascha Wildner IN UINTN MaxSize 693*1370a723SSascha Wildner ); 694*1370a723SSascha Wildner 695*1370a723SSascha Wildner /** 696*1370a723SSascha Wildner Copies the string pointed to by Source (including the terminating null char) 697*1370a723SSascha Wildner to the array pointed to by Destination. 698*1370a723SSascha Wildner 699*1370a723SSascha Wildner This function is similar as strcpy_s defined in C11. 700*1370a723SSascha Wildner 701*1370a723SSascha Wildner If an error is returned, then the Destination is unmodified. 702*1370a723SSascha Wildner 703*1370a723SSascha Wildner @param Destination A pointer to a Null-terminated Ascii string. 704*1370a723SSascha Wildner @param DestMax The maximum number of Destination Ascii 705*1370a723SSascha Wildner char, including terminating null char. 706*1370a723SSascha Wildner @param Source A pointer to a Null-terminated Ascii string. 707*1370a723SSascha Wildner 708*1370a723SSascha Wildner @retval RETURN_SUCCESS String is copied. 709*1370a723SSascha Wildner @retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than StrLen(Source). 710*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If Destination is NULL. 711*1370a723SSascha Wildner If Source is NULL. 712*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero, 713*1370a723SSascha Wildner and DestMax is greater than 714*1370a723SSascha Wildner PcdMaximumAsciiStringLength. 715*1370a723SSascha Wildner If DestMax is 0. 716*1370a723SSascha Wildner @retval RETURN_ACCESS_DENIED If Source and Destination overlap. 717*1370a723SSascha Wildner **/ 718*1370a723SSascha Wildner RETURN_STATUS 719*1370a723SSascha Wildner EFIAPI 720*1370a723SSascha Wildner AsciiStrCpyS ( 721*1370a723SSascha Wildner OUT CHAR8 *Destination, 722*1370a723SSascha Wildner IN UINTN DestMax, 723*1370a723SSascha Wildner IN CONST CHAR8 *Source 724*1370a723SSascha Wildner ); 725*1370a723SSascha Wildner 726*1370a723SSascha Wildner /** 727*1370a723SSascha Wildner Copies not more than Length successive char from the string pointed to by 728*1370a723SSascha Wildner Source to the array pointed to by Destination. If no null char is copied from 729*1370a723SSascha Wildner Source, then Destination[Length] is always set to null. 730*1370a723SSascha Wildner 731*1370a723SSascha Wildner This function is similar as strncpy_s defined in C11. 732*1370a723SSascha Wildner 733*1370a723SSascha Wildner If an error is returned, then the Destination is unmodified. 734*1370a723SSascha Wildner 735*1370a723SSascha Wildner @param Destination A pointer to a Null-terminated Ascii string. 736*1370a723SSascha Wildner @param DestMax The maximum number of Destination Ascii 737*1370a723SSascha Wildner char, including terminating null char. 738*1370a723SSascha Wildner @param Source A pointer to a Null-terminated Ascii string. 739*1370a723SSascha Wildner @param Length The maximum number of Ascii characters to copy. 740*1370a723SSascha Wildner 741*1370a723SSascha Wildner @retval RETURN_SUCCESS String is copied. 742*1370a723SSascha Wildner @retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than 743*1370a723SSascha Wildner MIN(StrLen(Source), Length). 744*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If Destination is NULL. 745*1370a723SSascha Wildner If Source is NULL. 746*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero, 747*1370a723SSascha Wildner and DestMax is greater than 748*1370a723SSascha Wildner PcdMaximumAsciiStringLength. 749*1370a723SSascha Wildner If DestMax is 0. 750*1370a723SSascha Wildner @retval RETURN_ACCESS_DENIED If Source and Destination overlap. 751*1370a723SSascha Wildner **/ 752*1370a723SSascha Wildner RETURN_STATUS 753*1370a723SSascha Wildner EFIAPI 754*1370a723SSascha Wildner AsciiStrnCpyS ( 755*1370a723SSascha Wildner OUT CHAR8 *Destination, 756*1370a723SSascha Wildner IN UINTN DestMax, 757*1370a723SSascha Wildner IN CONST CHAR8 *Source, 758*1370a723SSascha Wildner IN UINTN Length 759*1370a723SSascha Wildner ); 760*1370a723SSascha Wildner 761*1370a723SSascha Wildner /** 762*1370a723SSascha Wildner Appends a copy of the string pointed to by Source (including the terminating 763*1370a723SSascha Wildner null char) to the end of the string pointed to by Destination. 764*1370a723SSascha Wildner 765*1370a723SSascha Wildner This function is similar as strcat_s defined in C11. 766*1370a723SSascha Wildner 767*1370a723SSascha Wildner If an error is returned, then the Destination is unmodified. 768*1370a723SSascha Wildner 769*1370a723SSascha Wildner @param Destination A pointer to a Null-terminated Ascii string. 770*1370a723SSascha Wildner @param DestMax The maximum number of Destination Ascii 771*1370a723SSascha Wildner char, including terminating null char. 772*1370a723SSascha Wildner @param Source A pointer to a Null-terminated Ascii string. 773*1370a723SSascha Wildner 774*1370a723SSascha Wildner @retval RETURN_SUCCESS String is appended. 775*1370a723SSascha Wildner @retval RETURN_BAD_BUFFER_SIZE If DestMax is NOT greater than 776*1370a723SSascha Wildner StrLen(Destination). 777*1370a723SSascha Wildner @retval RETURN_BUFFER_TOO_SMALL If (DestMax - StrLen(Destination)) is NOT 778*1370a723SSascha Wildner greater than StrLen(Source). 779*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If Destination is NULL. 780*1370a723SSascha Wildner If Source is NULL. 781*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero, 782*1370a723SSascha Wildner and DestMax is greater than 783*1370a723SSascha Wildner PcdMaximumAsciiStringLength. 784*1370a723SSascha Wildner If DestMax is 0. 785*1370a723SSascha Wildner @retval RETURN_ACCESS_DENIED If Source and Destination overlap. 786*1370a723SSascha Wildner **/ 787*1370a723SSascha Wildner RETURN_STATUS 788*1370a723SSascha Wildner EFIAPI 789*1370a723SSascha Wildner AsciiStrCatS ( 790*1370a723SSascha Wildner IN OUT CHAR8 *Destination, 791*1370a723SSascha Wildner IN UINTN DestMax, 792*1370a723SSascha Wildner IN CONST CHAR8 *Source 793*1370a723SSascha Wildner ); 794*1370a723SSascha Wildner 795*1370a723SSascha Wildner /** 796*1370a723SSascha Wildner Appends not more than Length successive char from the string pointed to by 797*1370a723SSascha Wildner Source to the end of the string pointed to by Destination. If no null char is 798*1370a723SSascha Wildner copied from Source, then Destination[StrLen(Destination) + Length] is always 799*1370a723SSascha Wildner set to null. 800*1370a723SSascha Wildner 801*1370a723SSascha Wildner This function is similar as strncat_s defined in C11. 802*1370a723SSascha Wildner 803*1370a723SSascha Wildner If an error is returned, then the Destination is unmodified. 804*1370a723SSascha Wildner 805*1370a723SSascha Wildner @param Destination A pointer to a Null-terminated Ascii string. 806*1370a723SSascha Wildner @param DestMax The maximum number of Destination Ascii 807*1370a723SSascha Wildner char, including terminating null char. 808*1370a723SSascha Wildner @param Source A pointer to a Null-terminated Ascii string. 809*1370a723SSascha Wildner @param Length The maximum number of Ascii characters to copy. 810*1370a723SSascha Wildner 811*1370a723SSascha Wildner @retval RETURN_SUCCESS String is appended. 812*1370a723SSascha Wildner @retval RETURN_BAD_BUFFER_SIZE If DestMax is NOT greater than 813*1370a723SSascha Wildner StrLen(Destination). 814*1370a723SSascha Wildner @retval RETURN_BUFFER_TOO_SMALL If (DestMax - StrLen(Destination)) is NOT 815*1370a723SSascha Wildner greater than MIN(StrLen(Source), Length). 816*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If Destination is NULL. 817*1370a723SSascha Wildner If Source is NULL. 818*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero, 819*1370a723SSascha Wildner and DestMax is greater than 820*1370a723SSascha Wildner PcdMaximumAsciiStringLength. 821*1370a723SSascha Wildner If DestMax is 0. 822*1370a723SSascha Wildner @retval RETURN_ACCESS_DENIED If Source and Destination overlap. 823*1370a723SSascha Wildner **/ 824*1370a723SSascha Wildner RETURN_STATUS 825*1370a723SSascha Wildner EFIAPI 826*1370a723SSascha Wildner AsciiStrnCatS ( 827*1370a723SSascha Wildner IN OUT CHAR8 *Destination, 828*1370a723SSascha Wildner IN UINTN DestMax, 829*1370a723SSascha Wildner IN CONST CHAR8 *Source, 830*1370a723SSascha Wildner IN UINTN Length 831*1370a723SSascha Wildner ); 832*1370a723SSascha Wildner 833*1370a723SSascha Wildner /** 834*1370a723SSascha Wildner Convert a Null-terminated Ascii decimal string to a value of type UINTN. 835*1370a723SSascha Wildner 836*1370a723SSascha Wildner This function outputs a value of type UINTN by interpreting the contents of 837*1370a723SSascha Wildner the Ascii string specified by String as a decimal number. The format of the 838*1370a723SSascha Wildner input Ascii string String is: 839*1370a723SSascha Wildner 840*1370a723SSascha Wildner [spaces] [decimal digits]. 841*1370a723SSascha Wildner 842*1370a723SSascha Wildner The valid decimal digit character is in the range [0-9]. The function will 843*1370a723SSascha Wildner ignore the pad space, which includes spaces or tab characters, before 844*1370a723SSascha Wildner [decimal digits]. The running zero in the beginning of [decimal digits] will 845*1370a723SSascha Wildner be ignored. Then, the function stops at the first character that is a not a 846*1370a723SSascha Wildner valid decimal character or a Null-terminator, whichever one comes first. 847*1370a723SSascha Wildner 848*1370a723SSascha Wildner If String has no valid decimal digits in the above format, then 0 is stored 849*1370a723SSascha Wildner at the location pointed to by Data. 850*1370a723SSascha Wildner If the number represented by String exceeds the range defined by UINTN, then 851*1370a723SSascha Wildner MAX_UINTN is stored at the location pointed to by Data. 852*1370a723SSascha Wildner 853*1370a723SSascha Wildner If EndPointer is not NULL, a pointer to the character that stopped the scan 854*1370a723SSascha Wildner is stored at the location pointed to by EndPointer. If String has no valid 855*1370a723SSascha Wildner decimal digits right after the optional pad spaces, the value of String is 856*1370a723SSascha Wildner stored at the location pointed to by EndPointer. 857*1370a723SSascha Wildner 858*1370a723SSascha Wildner @param String Pointer to a Null-terminated Ascii string. 859*1370a723SSascha Wildner @param EndPointer Pointer to character that stops scan. 860*1370a723SSascha Wildner @param Data Pointer to the converted value. 861*1370a723SSascha Wildner 862*1370a723SSascha Wildner @retval RETURN_SUCCESS Value is translated from String. 863*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If String is NULL. 864*1370a723SSascha Wildner If Data is NULL. 865*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero, 866*1370a723SSascha Wildner and String contains more than 867*1370a723SSascha Wildner PcdMaximumAsciiStringLength Ascii 868*1370a723SSascha Wildner characters, not including the 869*1370a723SSascha Wildner Null-terminator. 870*1370a723SSascha Wildner @retval RETURN_UNSUPPORTED If the number represented by String exceeds 871*1370a723SSascha Wildner the range defined by UINTN. 872*1370a723SSascha Wildner 873*1370a723SSascha Wildner **/ 874*1370a723SSascha Wildner RETURN_STATUS 875*1370a723SSascha Wildner EFIAPI 876*1370a723SSascha Wildner AsciiStrDecimalToUintnS ( 877*1370a723SSascha Wildner IN CONST CHAR8 *String, 878*1370a723SSascha Wildner OUT CHAR8 **EndPointer OPTIONAL, 879*1370a723SSascha Wildner OUT UINTN *Data 880*1370a723SSascha Wildner ); 881*1370a723SSascha Wildner 882*1370a723SSascha Wildner /** 883*1370a723SSascha Wildner Convert a Null-terminated Ascii decimal string to a value of type UINT64. 884*1370a723SSascha Wildner 885*1370a723SSascha Wildner This function outputs a value of type UINT64 by interpreting the contents of 886*1370a723SSascha Wildner the Ascii string specified by String as a decimal number. The format of the 887*1370a723SSascha Wildner input Ascii string String is: 888*1370a723SSascha Wildner 889*1370a723SSascha Wildner [spaces] [decimal digits]. 890*1370a723SSascha Wildner 891*1370a723SSascha Wildner The valid decimal digit character is in the range [0-9]. The function will 892*1370a723SSascha Wildner ignore the pad space, which includes spaces or tab characters, before 893*1370a723SSascha Wildner [decimal digits]. The running zero in the beginning of [decimal digits] will 894*1370a723SSascha Wildner be ignored. Then, the function stops at the first character that is a not a 895*1370a723SSascha Wildner valid decimal character or a Null-terminator, whichever one comes first. 896*1370a723SSascha Wildner 897*1370a723SSascha Wildner If String has no valid decimal digits in the above format, then 0 is stored 898*1370a723SSascha Wildner at the location pointed to by Data. 899*1370a723SSascha Wildner If the number represented by String exceeds the range defined by UINT64, then 900*1370a723SSascha Wildner MAX_UINT64 is stored at the location pointed to by Data. 901*1370a723SSascha Wildner 902*1370a723SSascha Wildner If EndPointer is not NULL, a pointer to the character that stopped the scan 903*1370a723SSascha Wildner is stored at the location pointed to by EndPointer. If String has no valid 904*1370a723SSascha Wildner decimal digits right after the optional pad spaces, the value of String is 905*1370a723SSascha Wildner stored at the location pointed to by EndPointer. 906*1370a723SSascha Wildner 907*1370a723SSascha Wildner @param String Pointer to a Null-terminated Ascii string. 908*1370a723SSascha Wildner @param EndPointer Pointer to character that stops scan. 909*1370a723SSascha Wildner @param Data Pointer to the converted value. 910*1370a723SSascha Wildner 911*1370a723SSascha Wildner @retval RETURN_SUCCESS Value is translated from String. 912*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If String is NULL. 913*1370a723SSascha Wildner If Data is NULL. 914*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero, 915*1370a723SSascha Wildner and String contains more than 916*1370a723SSascha Wildner PcdMaximumAsciiStringLength Ascii 917*1370a723SSascha Wildner characters, not including the 918*1370a723SSascha Wildner Null-terminator. 919*1370a723SSascha Wildner @retval RETURN_UNSUPPORTED If the number represented by String exceeds 920*1370a723SSascha Wildner the range defined by UINT64. 921*1370a723SSascha Wildner 922*1370a723SSascha Wildner **/ 923*1370a723SSascha Wildner RETURN_STATUS 924*1370a723SSascha Wildner EFIAPI 925*1370a723SSascha Wildner AsciiStrDecimalToUint64S ( 926*1370a723SSascha Wildner IN CONST CHAR8 *String, 927*1370a723SSascha Wildner OUT CHAR8 **EndPointer OPTIONAL, 928*1370a723SSascha Wildner OUT UINT64 *Data 929*1370a723SSascha Wildner ); 930*1370a723SSascha Wildner 931*1370a723SSascha Wildner /** 932*1370a723SSascha Wildner Convert a Null-terminated Ascii hexadecimal string to a value of type UINTN. 933*1370a723SSascha Wildner 934*1370a723SSascha Wildner This function outputs a value of type UINTN by interpreting the contents of 935*1370a723SSascha Wildner the Ascii string specified by String as a hexadecimal number. The format of 936*1370a723SSascha Wildner the input Ascii string String is: 937*1370a723SSascha Wildner 938*1370a723SSascha Wildner [spaces][zeros][x][hexadecimal digits]. 939*1370a723SSascha Wildner 940*1370a723SSascha Wildner The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. 941*1370a723SSascha Wildner The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If 942*1370a723SSascha Wildner "x" appears in the input string, it must be prefixed with at least one 0. The 943*1370a723SSascha Wildner function will ignore the pad space, which includes spaces or tab characters, 944*1370a723SSascha Wildner before [zeros], [x] or [hexadecimal digits]. The running zero before [x] or 945*1370a723SSascha Wildner [hexadecimal digits] will be ignored. Then, the decoding starts after [x] or 946*1370a723SSascha Wildner the first valid hexadecimal digit. Then, the function stops at the first 947*1370a723SSascha Wildner character that is a not a valid hexadecimal character or Null-terminator, 948*1370a723SSascha Wildner whichever on comes first. 949*1370a723SSascha Wildner 950*1370a723SSascha Wildner If String has no valid hexadecimal digits in the above format, then 0 is 951*1370a723SSascha Wildner stored at the location pointed to by Data. 952*1370a723SSascha Wildner If the number represented by String exceeds the range defined by UINTN, then 953*1370a723SSascha Wildner MAX_UINTN is stored at the location pointed to by Data. 954*1370a723SSascha Wildner 955*1370a723SSascha Wildner If EndPointer is not NULL, a pointer to the character that stopped the scan 956*1370a723SSascha Wildner is stored at the location pointed to by EndPointer. If String has no valid 957*1370a723SSascha Wildner hexadecimal digits right after the optional pad spaces, the value of String 958*1370a723SSascha Wildner is stored at the location pointed to by EndPointer. 959*1370a723SSascha Wildner 960*1370a723SSascha Wildner @param String Pointer to a Null-terminated Ascii string. 961*1370a723SSascha Wildner @param EndPointer Pointer to character that stops scan. 962*1370a723SSascha Wildner @param Data Pointer to the converted value. 963*1370a723SSascha Wildner 964*1370a723SSascha Wildner @retval RETURN_SUCCESS Value is translated from String. 965*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If String is NULL. 966*1370a723SSascha Wildner If Data is NULL. 967*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero, 968*1370a723SSascha Wildner and String contains more than 969*1370a723SSascha Wildner PcdMaximumAsciiStringLength Ascii 970*1370a723SSascha Wildner characters, not including the 971*1370a723SSascha Wildner Null-terminator. 972*1370a723SSascha Wildner @retval RETURN_UNSUPPORTED If the number represented by String exceeds 973*1370a723SSascha Wildner the range defined by UINTN. 974*1370a723SSascha Wildner 975*1370a723SSascha Wildner **/ 976*1370a723SSascha Wildner RETURN_STATUS 977*1370a723SSascha Wildner EFIAPI 978*1370a723SSascha Wildner AsciiStrHexToUintnS ( 979*1370a723SSascha Wildner IN CONST CHAR8 *String, 980*1370a723SSascha Wildner OUT CHAR8 **EndPointer OPTIONAL, 981*1370a723SSascha Wildner OUT UINTN *Data 982*1370a723SSascha Wildner ); 983*1370a723SSascha Wildner 984*1370a723SSascha Wildner /** 985*1370a723SSascha Wildner Convert a Null-terminated Ascii hexadecimal string to a value of type UINT64. 986*1370a723SSascha Wildner 987*1370a723SSascha Wildner This function outputs a value of type UINT64 by interpreting the contents of 988*1370a723SSascha Wildner the Ascii string specified by String as a hexadecimal number. The format of 989*1370a723SSascha Wildner the input Ascii string String is: 990*1370a723SSascha Wildner 991*1370a723SSascha Wildner [spaces][zeros][x][hexadecimal digits]. 992*1370a723SSascha Wildner 993*1370a723SSascha Wildner The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. 994*1370a723SSascha Wildner The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If 995*1370a723SSascha Wildner "x" appears in the input string, it must be prefixed with at least one 0. The 996*1370a723SSascha Wildner function will ignore the pad space, which includes spaces or tab characters, 997*1370a723SSascha Wildner before [zeros], [x] or [hexadecimal digits]. The running zero before [x] or 998*1370a723SSascha Wildner [hexadecimal digits] will be ignored. Then, the decoding starts after [x] or 999*1370a723SSascha Wildner the first valid hexadecimal digit. Then, the function stops at the first 1000*1370a723SSascha Wildner character that is a not a valid hexadecimal character or Null-terminator, 1001*1370a723SSascha Wildner whichever on comes first. 1002*1370a723SSascha Wildner 1003*1370a723SSascha Wildner If String has no valid hexadecimal digits in the above format, then 0 is 1004*1370a723SSascha Wildner stored at the location pointed to by Data. 1005*1370a723SSascha Wildner If the number represented by String exceeds the range defined by UINT64, then 1006*1370a723SSascha Wildner MAX_UINT64 is stored at the location pointed to by Data. 1007*1370a723SSascha Wildner 1008*1370a723SSascha Wildner If EndPointer is not NULL, a pointer to the character that stopped the scan 1009*1370a723SSascha Wildner is stored at the location pointed to by EndPointer. If String has no valid 1010*1370a723SSascha Wildner hexadecimal digits right after the optional pad spaces, the value of String 1011*1370a723SSascha Wildner is stored at the location pointed to by EndPointer. 1012*1370a723SSascha Wildner 1013*1370a723SSascha Wildner @param String Pointer to a Null-terminated Ascii string. 1014*1370a723SSascha Wildner @param EndPointer Pointer to character that stops scan. 1015*1370a723SSascha Wildner @param Data Pointer to the converted value. 1016*1370a723SSascha Wildner 1017*1370a723SSascha Wildner @retval RETURN_SUCCESS Value is translated from String. 1018*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If String is NULL. 1019*1370a723SSascha Wildner If Data is NULL. 1020*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero, 1021*1370a723SSascha Wildner and String contains more than 1022*1370a723SSascha Wildner PcdMaximumAsciiStringLength Ascii 1023*1370a723SSascha Wildner characters, not including the 1024*1370a723SSascha Wildner Null-terminator. 1025*1370a723SSascha Wildner @retval RETURN_UNSUPPORTED If the number represented by String exceeds 1026*1370a723SSascha Wildner the range defined by UINT64. 1027*1370a723SSascha Wildner 1028*1370a723SSascha Wildner **/ 1029*1370a723SSascha Wildner RETURN_STATUS 1030*1370a723SSascha Wildner EFIAPI 1031*1370a723SSascha Wildner AsciiStrHexToUint64S ( 1032*1370a723SSascha Wildner IN CONST CHAR8 *String, 1033*1370a723SSascha Wildner OUT CHAR8 **EndPointer OPTIONAL, 1034*1370a723SSascha Wildner OUT UINT64 *Data 1035*1370a723SSascha Wildner ); 1036*1370a723SSascha Wildner 1037*1370a723SSascha Wildner /** 1038*1370a723SSascha Wildner Returns the length of a Null-terminated Unicode string. 1039*1370a723SSascha Wildner 1040*1370a723SSascha Wildner This function returns the number of Unicode characters in the Null-terminated 1041*1370a723SSascha Wildner Unicode string specified by String. 1042*1370a723SSascha Wildner 1043*1370a723SSascha Wildner If String is NULL, then ASSERT(). 1044*1370a723SSascha Wildner If String is not aligned on a 16-bit boundary, then ASSERT(). 1045*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not zero, and String contains more than 1046*1370a723SSascha Wildner PcdMaximumUnicodeStringLength Unicode characters not including the 1047*1370a723SSascha Wildner Null-terminator, then ASSERT(). 1048*1370a723SSascha Wildner 1049*1370a723SSascha Wildner @param String Pointer to a Null-terminated Unicode string. 1050*1370a723SSascha Wildner 1051*1370a723SSascha Wildner @return The length of String. 1052*1370a723SSascha Wildner 1053*1370a723SSascha Wildner **/ 1054*1370a723SSascha Wildner UINTN 1055*1370a723SSascha Wildner EFIAPI 1056*1370a723SSascha Wildner StrLen ( 1057*1370a723SSascha Wildner IN CONST CHAR16 *String 1058*1370a723SSascha Wildner ); 1059*1370a723SSascha Wildner 1060*1370a723SSascha Wildner /** 1061*1370a723SSascha Wildner Returns the size of a Null-terminated Unicode string in bytes, including the 1062*1370a723SSascha Wildner Null terminator. 1063*1370a723SSascha Wildner 1064*1370a723SSascha Wildner This function returns the size, in bytes, of the Null-terminated Unicode string 1065*1370a723SSascha Wildner specified by String. 1066*1370a723SSascha Wildner 1067*1370a723SSascha Wildner If String is NULL, then ASSERT(). 1068*1370a723SSascha Wildner If String is not aligned on a 16-bit boundary, then ASSERT(). 1069*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not zero, and String contains more than 1070*1370a723SSascha Wildner PcdMaximumUnicodeStringLength Unicode characters not including the 1071*1370a723SSascha Wildner Null-terminator, then ASSERT(). 1072*1370a723SSascha Wildner 1073*1370a723SSascha Wildner @param String The pointer to a Null-terminated Unicode string. 1074*1370a723SSascha Wildner 1075*1370a723SSascha Wildner @return The size of String. 1076*1370a723SSascha Wildner 1077*1370a723SSascha Wildner **/ 1078*1370a723SSascha Wildner UINTN 1079*1370a723SSascha Wildner EFIAPI 1080*1370a723SSascha Wildner StrSize ( 1081*1370a723SSascha Wildner IN CONST CHAR16 *String 1082*1370a723SSascha Wildner ); 1083*1370a723SSascha Wildner 1084*1370a723SSascha Wildner /** 1085*1370a723SSascha Wildner Compares two Null-terminated Unicode strings, and returns the difference 1086*1370a723SSascha Wildner between the first mismatched Unicode characters. 1087*1370a723SSascha Wildner 1088*1370a723SSascha Wildner This function compares the Null-terminated Unicode string FirstString to the 1089*1370a723SSascha Wildner Null-terminated Unicode string SecondString. If FirstString is identical to 1090*1370a723SSascha Wildner SecondString, then 0 is returned. Otherwise, the value returned is the first 1091*1370a723SSascha Wildner mismatched Unicode character in SecondString subtracted from the first 1092*1370a723SSascha Wildner mismatched Unicode character in FirstString. 1093*1370a723SSascha Wildner 1094*1370a723SSascha Wildner If FirstString is NULL, then ASSERT(). 1095*1370a723SSascha Wildner If FirstString is not aligned on a 16-bit boundary, then ASSERT(). 1096*1370a723SSascha Wildner If SecondString is NULL, then ASSERT(). 1097*1370a723SSascha Wildner If SecondString is not aligned on a 16-bit boundary, then ASSERT(). 1098*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more 1099*1370a723SSascha Wildner than PcdMaximumUnicodeStringLength Unicode characters not including the 1100*1370a723SSascha Wildner Null-terminator, then ASSERT(). 1101*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more 1102*1370a723SSascha Wildner than PcdMaximumUnicodeStringLength Unicode characters, not including the 1103*1370a723SSascha Wildner Null-terminator, then ASSERT(). 1104*1370a723SSascha Wildner 1105*1370a723SSascha Wildner @param FirstString The pointer to a Null-terminated Unicode string. 1106*1370a723SSascha Wildner @param SecondString The pointer to a Null-terminated Unicode string. 1107*1370a723SSascha Wildner 1108*1370a723SSascha Wildner @retval 0 FirstString is identical to SecondString. 1109*1370a723SSascha Wildner @return others FirstString is not identical to SecondString. 1110*1370a723SSascha Wildner 1111*1370a723SSascha Wildner **/ 1112*1370a723SSascha Wildner INTN 1113*1370a723SSascha Wildner EFIAPI 1114*1370a723SSascha Wildner StrCmp ( 1115*1370a723SSascha Wildner IN CONST CHAR16 *FirstString, 1116*1370a723SSascha Wildner IN CONST CHAR16 *SecondString 1117*1370a723SSascha Wildner ); 1118*1370a723SSascha Wildner 1119*1370a723SSascha Wildner /** 1120*1370a723SSascha Wildner Compares up to a specified length the contents of two Null-terminated Unicode strings, 1121*1370a723SSascha Wildner and returns the difference between the first mismatched Unicode characters. 1122*1370a723SSascha Wildner 1123*1370a723SSascha Wildner This function compares the Null-terminated Unicode string FirstString to the 1124*1370a723SSascha Wildner Null-terminated Unicode string SecondString. At most, Length Unicode 1125*1370a723SSascha Wildner characters will be compared. If Length is 0, then 0 is returned. If 1126*1370a723SSascha Wildner FirstString is identical to SecondString, then 0 is returned. Otherwise, the 1127*1370a723SSascha Wildner value returned is the first mismatched Unicode character in SecondString 1128*1370a723SSascha Wildner subtracted from the first mismatched Unicode character in FirstString. 1129*1370a723SSascha Wildner 1130*1370a723SSascha Wildner If Length > 0 and FirstString is NULL, then ASSERT(). 1131*1370a723SSascha Wildner If Length > 0 and FirstString is not aligned on a 16-bit boundary, then ASSERT(). 1132*1370a723SSascha Wildner If Length > 0 and SecondString is NULL, then ASSERT(). 1133*1370a723SSascha Wildner If Length > 0 and SecondString is not aligned on a 16-bit boundary, then ASSERT(). 1134*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not zero, and Length is greater than 1135*1370a723SSascha Wildner PcdMaximumUnicodeStringLength, then ASSERT(). 1136*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more than 1137*1370a723SSascha Wildner PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator, 1138*1370a723SSascha Wildner then ASSERT(). 1139*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more than 1140*1370a723SSascha Wildner PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator, 1141*1370a723SSascha Wildner then ASSERT(). 1142*1370a723SSascha Wildner 1143*1370a723SSascha Wildner @param FirstString The pointer to a Null-terminated Unicode string. 1144*1370a723SSascha Wildner @param SecondString The pointer to a Null-terminated Unicode string. 1145*1370a723SSascha Wildner @param Length The maximum number of Unicode characters to compare. 1146*1370a723SSascha Wildner 1147*1370a723SSascha Wildner @retval 0 FirstString is identical to SecondString. 1148*1370a723SSascha Wildner @return others FirstString is not identical to SecondString. 1149*1370a723SSascha Wildner 1150*1370a723SSascha Wildner **/ 1151*1370a723SSascha Wildner INTN 1152*1370a723SSascha Wildner EFIAPI 1153*1370a723SSascha Wildner StrnCmp ( 1154*1370a723SSascha Wildner IN CONST CHAR16 *FirstString, 1155*1370a723SSascha Wildner IN CONST CHAR16 *SecondString, 1156*1370a723SSascha Wildner IN UINTN Length 1157*1370a723SSascha Wildner ); 1158*1370a723SSascha Wildner 1159*1370a723SSascha Wildner /** 1160*1370a723SSascha Wildner Returns the first occurrence of a Null-terminated Unicode sub-string 1161*1370a723SSascha Wildner in a Null-terminated Unicode string. 1162*1370a723SSascha Wildner 1163*1370a723SSascha Wildner This function scans the contents of the Null-terminated Unicode string 1164*1370a723SSascha Wildner specified by String and returns the first occurrence of SearchString. 1165*1370a723SSascha Wildner If SearchString is not found in String, then NULL is returned. If 1166*1370a723SSascha Wildner the length of SearchString is zero, then String is returned. 1167*1370a723SSascha Wildner 1168*1370a723SSascha Wildner If String is NULL, then ASSERT(). 1169*1370a723SSascha Wildner If String is not aligned on a 16-bit boundary, then ASSERT(). 1170*1370a723SSascha Wildner If SearchString is NULL, then ASSERT(). 1171*1370a723SSascha Wildner If SearchString is not aligned on a 16-bit boundary, then ASSERT(). 1172*1370a723SSascha Wildner 1173*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not zero, and SearchString 1174*1370a723SSascha Wildner or String contains more than PcdMaximumUnicodeStringLength Unicode 1175*1370a723SSascha Wildner characters, not including the Null-terminator, then ASSERT(). 1176*1370a723SSascha Wildner 1177*1370a723SSascha Wildner @param String The pointer to a Null-terminated Unicode string. 1178*1370a723SSascha Wildner @param SearchString The pointer to a Null-terminated Unicode string to search for. 1179*1370a723SSascha Wildner 1180*1370a723SSascha Wildner @retval NULL If the SearchString does not appear in String. 1181*1370a723SSascha Wildner @return others If there is a match. 1182*1370a723SSascha Wildner 1183*1370a723SSascha Wildner **/ 1184*1370a723SSascha Wildner CHAR16 * 1185*1370a723SSascha Wildner EFIAPI 1186*1370a723SSascha Wildner StrStr ( 1187*1370a723SSascha Wildner IN CONST CHAR16 *String, 1188*1370a723SSascha Wildner IN CONST CHAR16 *SearchString 1189*1370a723SSascha Wildner ); 1190*1370a723SSascha Wildner 1191*1370a723SSascha Wildner /** 1192*1370a723SSascha Wildner Convert a Null-terminated Unicode decimal string to a value of 1193*1370a723SSascha Wildner type UINTN. 1194*1370a723SSascha Wildner 1195*1370a723SSascha Wildner This function returns a value of type UINTN by interpreting the contents 1196*1370a723SSascha Wildner of the Unicode string specified by String as a decimal number. The format 1197*1370a723SSascha Wildner of the input Unicode string String is: 1198*1370a723SSascha Wildner 1199*1370a723SSascha Wildner [spaces] [decimal digits]. 1200*1370a723SSascha Wildner 1201*1370a723SSascha Wildner The valid decimal digit character is in the range [0-9]. The 1202*1370a723SSascha Wildner function will ignore the pad space, which includes spaces or 1203*1370a723SSascha Wildner tab characters, before [decimal digits]. The running zero in the 1204*1370a723SSascha Wildner beginning of [decimal digits] will be ignored. Then, the function 1205*1370a723SSascha Wildner stops at the first character that is a not a valid decimal character 1206*1370a723SSascha Wildner or a Null-terminator, whichever one comes first. 1207*1370a723SSascha Wildner 1208*1370a723SSascha Wildner If String is NULL, then ASSERT(). 1209*1370a723SSascha Wildner If String is not aligned in a 16-bit boundary, then ASSERT(). 1210*1370a723SSascha Wildner If String has only pad spaces, then 0 is returned. 1211*1370a723SSascha Wildner If String has no pad spaces or valid decimal digits, 1212*1370a723SSascha Wildner then 0 is returned. 1213*1370a723SSascha Wildner If the number represented by String overflows according 1214*1370a723SSascha Wildner to the range defined by UINTN, then MAX_UINTN is returned. 1215*1370a723SSascha Wildner 1216*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not zero, and String contains 1217*1370a723SSascha Wildner more than PcdMaximumUnicodeStringLength Unicode characters not including 1218*1370a723SSascha Wildner the Null-terminator, then ASSERT(). 1219*1370a723SSascha Wildner 1220*1370a723SSascha Wildner @param String The pointer to a Null-terminated Unicode string. 1221*1370a723SSascha Wildner 1222*1370a723SSascha Wildner @retval Value translated from String. 1223*1370a723SSascha Wildner 1224*1370a723SSascha Wildner **/ 1225*1370a723SSascha Wildner UINTN 1226*1370a723SSascha Wildner EFIAPI 1227*1370a723SSascha Wildner StrDecimalToUintn ( 1228*1370a723SSascha Wildner IN CONST CHAR16 *String 1229*1370a723SSascha Wildner ); 1230*1370a723SSascha Wildner 1231*1370a723SSascha Wildner /** 1232*1370a723SSascha Wildner Convert a Null-terminated Unicode decimal string to a value of 1233*1370a723SSascha Wildner type UINT64. 1234*1370a723SSascha Wildner 1235*1370a723SSascha Wildner This function returns a value of type UINT64 by interpreting the contents 1236*1370a723SSascha Wildner of the Unicode string specified by String as a decimal number. The format 1237*1370a723SSascha Wildner of the input Unicode string String is: 1238*1370a723SSascha Wildner 1239*1370a723SSascha Wildner [spaces] [decimal digits]. 1240*1370a723SSascha Wildner 1241*1370a723SSascha Wildner The valid decimal digit character is in the range [0-9]. The 1242*1370a723SSascha Wildner function will ignore the pad space, which includes spaces or 1243*1370a723SSascha Wildner tab characters, before [decimal digits]. The running zero in the 1244*1370a723SSascha Wildner beginning of [decimal digits] will be ignored. Then, the function 1245*1370a723SSascha Wildner stops at the first character that is a not a valid decimal character 1246*1370a723SSascha Wildner or a Null-terminator, whichever one comes first. 1247*1370a723SSascha Wildner 1248*1370a723SSascha Wildner If String is NULL, then ASSERT(). 1249*1370a723SSascha Wildner If String is not aligned in a 16-bit boundary, then ASSERT(). 1250*1370a723SSascha Wildner If String has only pad spaces, then 0 is returned. 1251*1370a723SSascha Wildner If String has no pad spaces or valid decimal digits, 1252*1370a723SSascha Wildner then 0 is returned. 1253*1370a723SSascha Wildner If the number represented by String overflows according 1254*1370a723SSascha Wildner to the range defined by UINT64, then MAX_UINT64 is returned. 1255*1370a723SSascha Wildner 1256*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not zero, and String contains 1257*1370a723SSascha Wildner more than PcdMaximumUnicodeStringLength Unicode characters not including 1258*1370a723SSascha Wildner the Null-terminator, then ASSERT(). 1259*1370a723SSascha Wildner 1260*1370a723SSascha Wildner @param String The pointer to a Null-terminated Unicode string. 1261*1370a723SSascha Wildner 1262*1370a723SSascha Wildner @retval Value translated from String. 1263*1370a723SSascha Wildner 1264*1370a723SSascha Wildner **/ 1265*1370a723SSascha Wildner UINT64 1266*1370a723SSascha Wildner EFIAPI 1267*1370a723SSascha Wildner StrDecimalToUint64 ( 1268*1370a723SSascha Wildner IN CONST CHAR16 *String 1269*1370a723SSascha Wildner ); 1270*1370a723SSascha Wildner 1271*1370a723SSascha Wildner /** 1272*1370a723SSascha Wildner Convert a Null-terminated Unicode hexadecimal string to a value of type UINTN. 1273*1370a723SSascha Wildner 1274*1370a723SSascha Wildner This function returns a value of type UINTN by interpreting the contents 1275*1370a723SSascha Wildner of the Unicode string specified by String as a hexadecimal number. 1276*1370a723SSascha Wildner The format of the input Unicode string String is: 1277*1370a723SSascha Wildner 1278*1370a723SSascha Wildner [spaces][zeros][x][hexadecimal digits]. 1279*1370a723SSascha Wildner 1280*1370a723SSascha Wildner The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. 1281*1370a723SSascha Wildner The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. 1282*1370a723SSascha Wildner If "x" appears in the input string, it must be prefixed with at least one 0. 1283*1370a723SSascha Wildner The function will ignore the pad space, which includes spaces or tab characters, 1284*1370a723SSascha Wildner before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or 1285*1370a723SSascha Wildner [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the 1286*1370a723SSascha Wildner first valid hexadecimal digit. Then, the function stops at the first character 1287*1370a723SSascha Wildner that is a not a valid hexadecimal character or NULL, whichever one comes first. 1288*1370a723SSascha Wildner 1289*1370a723SSascha Wildner If String is NULL, then ASSERT(). 1290*1370a723SSascha Wildner If String is not aligned in a 16-bit boundary, then ASSERT(). 1291*1370a723SSascha Wildner If String has only pad spaces, then zero is returned. 1292*1370a723SSascha Wildner If String has no leading pad spaces, leading zeros or valid hexadecimal digits, 1293*1370a723SSascha Wildner then zero is returned. 1294*1370a723SSascha Wildner If the number represented by String overflows according to the range defined by 1295*1370a723SSascha Wildner UINTN, then MAX_UINTN is returned. 1296*1370a723SSascha Wildner 1297*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not zero, and String contains more than 1298*1370a723SSascha Wildner PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, 1299*1370a723SSascha Wildner then ASSERT(). 1300*1370a723SSascha Wildner 1301*1370a723SSascha Wildner @param String The pointer to a Null-terminated Unicode string. 1302*1370a723SSascha Wildner 1303*1370a723SSascha Wildner @retval Value translated from String. 1304*1370a723SSascha Wildner 1305*1370a723SSascha Wildner **/ 1306*1370a723SSascha Wildner UINTN 1307*1370a723SSascha Wildner EFIAPI 1308*1370a723SSascha Wildner StrHexToUintn ( 1309*1370a723SSascha Wildner IN CONST CHAR16 *String 1310*1370a723SSascha Wildner ); 1311*1370a723SSascha Wildner 1312*1370a723SSascha Wildner /** 1313*1370a723SSascha Wildner Convert a Null-terminated Unicode hexadecimal string to a value of type UINT64. 1314*1370a723SSascha Wildner 1315*1370a723SSascha Wildner This function returns a value of type UINT64 by interpreting the contents 1316*1370a723SSascha Wildner of the Unicode string specified by String as a hexadecimal number. 1317*1370a723SSascha Wildner The format of the input Unicode string String is 1318*1370a723SSascha Wildner 1319*1370a723SSascha Wildner [spaces][zeros][x][hexadecimal digits]. 1320*1370a723SSascha Wildner 1321*1370a723SSascha Wildner The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. 1322*1370a723SSascha Wildner The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. 1323*1370a723SSascha Wildner If "x" appears in the input string, it must be prefixed with at least one 0. 1324*1370a723SSascha Wildner The function will ignore the pad space, which includes spaces or tab characters, 1325*1370a723SSascha Wildner before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or 1326*1370a723SSascha Wildner [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the 1327*1370a723SSascha Wildner first valid hexadecimal digit. Then, the function stops at the first character that is 1328*1370a723SSascha Wildner a not a valid hexadecimal character or NULL, whichever one comes first. 1329*1370a723SSascha Wildner 1330*1370a723SSascha Wildner If String is NULL, then ASSERT(). 1331*1370a723SSascha Wildner If String is not aligned in a 16-bit boundary, then ASSERT(). 1332*1370a723SSascha Wildner If String has only pad spaces, then zero is returned. 1333*1370a723SSascha Wildner If String has no leading pad spaces, leading zeros or valid hexadecimal digits, 1334*1370a723SSascha Wildner then zero is returned. 1335*1370a723SSascha Wildner If the number represented by String overflows according to the range defined by 1336*1370a723SSascha Wildner UINT64, then MAX_UINT64 is returned. 1337*1370a723SSascha Wildner 1338*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not zero, and String contains more than 1339*1370a723SSascha Wildner PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, 1340*1370a723SSascha Wildner then ASSERT(). 1341*1370a723SSascha Wildner 1342*1370a723SSascha Wildner @param String The pointer to a Null-terminated Unicode string. 1343*1370a723SSascha Wildner 1344*1370a723SSascha Wildner @retval Value translated from String. 1345*1370a723SSascha Wildner 1346*1370a723SSascha Wildner **/ 1347*1370a723SSascha Wildner UINT64 1348*1370a723SSascha Wildner EFIAPI 1349*1370a723SSascha Wildner StrHexToUint64 ( 1350*1370a723SSascha Wildner IN CONST CHAR16 *String 1351*1370a723SSascha Wildner ); 1352*1370a723SSascha Wildner 1353*1370a723SSascha Wildner /** 1354*1370a723SSascha Wildner Convert a Null-terminated Unicode string to IPv6 address and prefix length. 1355*1370a723SSascha Wildner 1356*1370a723SSascha Wildner This function outputs a value of type IPv6_ADDRESS and may output a value 1357*1370a723SSascha Wildner of type UINT8 by interpreting the contents of the Unicode string specified 1358*1370a723SSascha Wildner by String. The format of the input Unicode string String is as follows: 1359*1370a723SSascha Wildner 1360*1370a723SSascha Wildner X:X:X:X:X:X:X:X[/P] 1361*1370a723SSascha Wildner 1362*1370a723SSascha Wildner X contains one to four hexadecimal digit characters in the range [0-9], [a-f] and 1363*1370a723SSascha Wildner [A-F]. X is converted to a value of type UINT16, whose low byte is stored in low 1364*1370a723SSascha Wildner memory address and high byte is stored in high memory address. P contains decimal 1365*1370a723SSascha Wildner digit characters in the range [0-9]. The running zero in the beginning of P will 1366*1370a723SSascha Wildner be ignored. /P is optional. 1367*1370a723SSascha Wildner 1368*1370a723SSascha Wildner When /P is not in the String, the function stops at the first character that is 1369*1370a723SSascha Wildner not a valid hexadecimal digit character after eight X's are converted. 1370*1370a723SSascha Wildner 1371*1370a723SSascha Wildner When /P is in the String, the function stops at the first character that is not 1372*1370a723SSascha Wildner a valid decimal digit character after P is converted. 1373*1370a723SSascha Wildner 1374*1370a723SSascha Wildner "::" can be used to compress one or more groups of X when X contains only 0. 1375*1370a723SSascha Wildner The "::" can only appear once in the String. 1376*1370a723SSascha Wildner 1377*1370a723SSascha Wildner If String is not aligned in a 16-bit boundary, then ASSERT(). 1378*1370a723SSascha Wildner 1379*1370a723SSascha Wildner If EndPointer is not NULL and Address is translated from String, a pointer 1380*1370a723SSascha Wildner to the character that stopped the scan is stored at the location pointed to 1381*1370a723SSascha Wildner by EndPointer. 1382*1370a723SSascha Wildner 1383*1370a723SSascha Wildner @param String Pointer to a Null-terminated Unicode string. 1384*1370a723SSascha Wildner @param EndPointer Pointer to character that stops scan. 1385*1370a723SSascha Wildner @param Address Pointer to the converted IPv6 address. 1386*1370a723SSascha Wildner @param PrefixLength Pointer to the converted IPv6 address prefix 1387*1370a723SSascha Wildner length. MAX_UINT8 is returned when /P is 1388*1370a723SSascha Wildner not in the String. 1389*1370a723SSascha Wildner 1390*1370a723SSascha Wildner @retval RETURN_SUCCESS Address is translated from String. 1391*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If String is NULL. 1392*1370a723SSascha Wildner If Data is NULL. 1393*1370a723SSascha Wildner @retval RETURN_UNSUPPORTED If X contains more than four hexadecimal 1394*1370a723SSascha Wildner digit characters. 1395*1370a723SSascha Wildner If String contains "::" and number of X 1396*1370a723SSascha Wildner is not less than 8. 1397*1370a723SSascha Wildner If P starts with character that is not a 1398*1370a723SSascha Wildner valid decimal digit character. 1399*1370a723SSascha Wildner If the decimal number converted from P 1400*1370a723SSascha Wildner exceeds 128. 1401*1370a723SSascha Wildner 1402*1370a723SSascha Wildner **/ 1403*1370a723SSascha Wildner RETURN_STATUS 1404*1370a723SSascha Wildner EFIAPI 1405*1370a723SSascha Wildner StrToIpv6Address ( 1406*1370a723SSascha Wildner IN CONST CHAR16 *String, 1407*1370a723SSascha Wildner OUT CHAR16 **EndPointer OPTIONAL, 1408*1370a723SSascha Wildner OUT IPv6_ADDRESS *Address, 1409*1370a723SSascha Wildner OUT UINT8 *PrefixLength OPTIONAL 1410*1370a723SSascha Wildner ); 1411*1370a723SSascha Wildner 1412*1370a723SSascha Wildner /** 1413*1370a723SSascha Wildner Convert a Null-terminated Unicode string to IPv4 address and prefix length. 1414*1370a723SSascha Wildner 1415*1370a723SSascha Wildner This function outputs a value of type IPv4_ADDRESS and may output a value 1416*1370a723SSascha Wildner of type UINT8 by interpreting the contents of the Unicode string specified 1417*1370a723SSascha Wildner by String. The format of the input Unicode string String is as follows: 1418*1370a723SSascha Wildner 1419*1370a723SSascha Wildner D.D.D.D[/P] 1420*1370a723SSascha Wildner 1421*1370a723SSascha Wildner D and P are decimal digit characters in the range [0-9]. The running zero in 1422*1370a723SSascha Wildner the beginning of D and P will be ignored. /P is optional. 1423*1370a723SSascha Wildner 1424*1370a723SSascha Wildner When /P is not in the String, the function stops at the first character that is 1425*1370a723SSascha Wildner not a valid decimal digit character after four D's are converted. 1426*1370a723SSascha Wildner 1427*1370a723SSascha Wildner When /P is in the String, the function stops at the first character that is not 1428*1370a723SSascha Wildner a valid decimal digit character after P is converted. 1429*1370a723SSascha Wildner 1430*1370a723SSascha Wildner If String is not aligned in a 16-bit boundary, then ASSERT(). 1431*1370a723SSascha Wildner 1432*1370a723SSascha Wildner If EndPointer is not NULL and Address is translated from String, a pointer 1433*1370a723SSascha Wildner to the character that stopped the scan is stored at the location pointed to 1434*1370a723SSascha Wildner by EndPointer. 1435*1370a723SSascha Wildner 1436*1370a723SSascha Wildner @param String Pointer to a Null-terminated Unicode string. 1437*1370a723SSascha Wildner @param EndPointer Pointer to character that stops scan. 1438*1370a723SSascha Wildner @param Address Pointer to the converted IPv4 address. 1439*1370a723SSascha Wildner @param PrefixLength Pointer to the converted IPv4 address prefix 1440*1370a723SSascha Wildner length. MAX_UINT8 is returned when /P is 1441*1370a723SSascha Wildner not in the String. 1442*1370a723SSascha Wildner 1443*1370a723SSascha Wildner @retval RETURN_SUCCESS Address is translated from String. 1444*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If String is NULL. 1445*1370a723SSascha Wildner If Data is NULL. 1446*1370a723SSascha Wildner @retval RETURN_UNSUPPORTED If String is not in the correct format. 1447*1370a723SSascha Wildner If any decimal number converted from D 1448*1370a723SSascha Wildner exceeds 255. 1449*1370a723SSascha Wildner If the decimal number converted from P 1450*1370a723SSascha Wildner exceeds 32. 1451*1370a723SSascha Wildner 1452*1370a723SSascha Wildner **/ 1453*1370a723SSascha Wildner RETURN_STATUS 1454*1370a723SSascha Wildner EFIAPI 1455*1370a723SSascha Wildner StrToIpv4Address ( 1456*1370a723SSascha Wildner IN CONST CHAR16 *String, 1457*1370a723SSascha Wildner OUT CHAR16 **EndPointer OPTIONAL, 1458*1370a723SSascha Wildner OUT IPv4_ADDRESS *Address, 1459*1370a723SSascha Wildner OUT UINT8 *PrefixLength OPTIONAL 1460*1370a723SSascha Wildner ); 1461*1370a723SSascha Wildner 1462*1370a723SSascha Wildner #define GUID_STRING_LENGTH 36 1463*1370a723SSascha Wildner 1464*1370a723SSascha Wildner /** 1465*1370a723SSascha Wildner Convert a Null-terminated Unicode GUID string to a value of type 1466*1370a723SSascha Wildner EFI_GUID. 1467*1370a723SSascha Wildner 1468*1370a723SSascha Wildner This function outputs a GUID value by interpreting the contents of 1469*1370a723SSascha Wildner the Unicode string specified by String. The format of the input 1470*1370a723SSascha Wildner Unicode string String consists of 36 characters, as follows: 1471*1370a723SSascha Wildner 1472*1370a723SSascha Wildner aabbccdd-eeff-gghh-iijj-kkllmmnnoopp 1473*1370a723SSascha Wildner 1474*1370a723SSascha Wildner The pairs aa - pp are two characters in the range [0-9], [a-f] and 1475*1370a723SSascha Wildner [A-F], with each pair representing a single byte hexadecimal value. 1476*1370a723SSascha Wildner 1477*1370a723SSascha Wildner The mapping between String and the EFI_GUID structure is as follows: 1478*1370a723SSascha Wildner aa Data1[24:31] 1479*1370a723SSascha Wildner bb Data1[16:23] 1480*1370a723SSascha Wildner cc Data1[8:15] 1481*1370a723SSascha Wildner dd Data1[0:7] 1482*1370a723SSascha Wildner ee Data2[8:15] 1483*1370a723SSascha Wildner ff Data2[0:7] 1484*1370a723SSascha Wildner gg Data3[8:15] 1485*1370a723SSascha Wildner hh Data3[0:7] 1486*1370a723SSascha Wildner ii Data4[0:7] 1487*1370a723SSascha Wildner jj Data4[8:15] 1488*1370a723SSascha Wildner kk Data4[16:23] 1489*1370a723SSascha Wildner ll Data4[24:31] 1490*1370a723SSascha Wildner mm Data4[32:39] 1491*1370a723SSascha Wildner nn Data4[40:47] 1492*1370a723SSascha Wildner oo Data4[48:55] 1493*1370a723SSascha Wildner pp Data4[56:63] 1494*1370a723SSascha Wildner 1495*1370a723SSascha Wildner If String is not aligned in a 16-bit boundary, then ASSERT(). 1496*1370a723SSascha Wildner 1497*1370a723SSascha Wildner @param String Pointer to a Null-terminated Unicode string. 1498*1370a723SSascha Wildner @param Guid Pointer to the converted GUID. 1499*1370a723SSascha Wildner 1500*1370a723SSascha Wildner @retval RETURN_SUCCESS Guid is translated from String. 1501*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If String is NULL. 1502*1370a723SSascha Wildner If Data is NULL. 1503*1370a723SSascha Wildner @retval RETURN_UNSUPPORTED If String is not as the above format. 1504*1370a723SSascha Wildner 1505*1370a723SSascha Wildner **/ 1506*1370a723SSascha Wildner RETURN_STATUS 1507*1370a723SSascha Wildner EFIAPI 1508*1370a723SSascha Wildner StrToGuid ( 1509*1370a723SSascha Wildner IN CONST CHAR16 *String, 1510*1370a723SSascha Wildner OUT GUID *Guid 1511*1370a723SSascha Wildner ); 1512*1370a723SSascha Wildner 1513*1370a723SSascha Wildner /** 1514*1370a723SSascha Wildner Convert a Null-terminated Unicode hexadecimal string to a byte array. 1515*1370a723SSascha Wildner 1516*1370a723SSascha Wildner This function outputs a byte array by interpreting the contents of 1517*1370a723SSascha Wildner the Unicode string specified by String in hexadecimal format. The format of 1518*1370a723SSascha Wildner the input Unicode string String is: 1519*1370a723SSascha Wildner 1520*1370a723SSascha Wildner [XX]* 1521*1370a723SSascha Wildner 1522*1370a723SSascha Wildner X is a hexadecimal digit character in the range [0-9], [a-f] and [A-F]. 1523*1370a723SSascha Wildner The function decodes every two hexadecimal digit characters as one byte. The 1524*1370a723SSascha Wildner decoding stops after Length of characters and outputs Buffer containing 1525*1370a723SSascha Wildner (Length / 2) bytes. 1526*1370a723SSascha Wildner 1527*1370a723SSascha Wildner If String is not aligned in a 16-bit boundary, then ASSERT(). 1528*1370a723SSascha Wildner 1529*1370a723SSascha Wildner @param String Pointer to a Null-terminated Unicode string. 1530*1370a723SSascha Wildner @param Length The number of Unicode characters to decode. 1531*1370a723SSascha Wildner @param Buffer Pointer to the converted bytes array. 1532*1370a723SSascha Wildner @param MaxBufferSize The maximum size of Buffer. 1533*1370a723SSascha Wildner 1534*1370a723SSascha Wildner @retval RETURN_SUCCESS Buffer is translated from String. 1535*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If String is NULL. 1536*1370a723SSascha Wildner If Data is NULL. 1537*1370a723SSascha Wildner If Length is not multiple of 2. 1538*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not zero, 1539*1370a723SSascha Wildner and Length is greater than 1540*1370a723SSascha Wildner PcdMaximumUnicodeStringLength. 1541*1370a723SSascha Wildner @retval RETURN_UNSUPPORTED If Length of characters from String contain 1542*1370a723SSascha Wildner a character that is not valid hexadecimal 1543*1370a723SSascha Wildner digit characters, or a Null-terminator. 1544*1370a723SSascha Wildner @retval RETURN_BUFFER_TOO_SMALL If MaxBufferSize is less than (Length / 2). 1545*1370a723SSascha Wildner **/ 1546*1370a723SSascha Wildner RETURN_STATUS 1547*1370a723SSascha Wildner EFIAPI 1548*1370a723SSascha Wildner StrHexToBytes ( 1549*1370a723SSascha Wildner IN CONST CHAR16 *String, 1550*1370a723SSascha Wildner IN UINTN Length, 1551*1370a723SSascha Wildner OUT UINT8 *Buffer, 1552*1370a723SSascha Wildner IN UINTN MaxBufferSize 1553*1370a723SSascha Wildner ); 1554*1370a723SSascha Wildner 1555*1370a723SSascha Wildner /** 1556*1370a723SSascha Wildner Convert a Null-terminated Unicode string to a Null-terminated 1557*1370a723SSascha Wildner ASCII string. 1558*1370a723SSascha Wildner 1559*1370a723SSascha Wildner This function is similar to AsciiStrCpyS. 1560*1370a723SSascha Wildner 1561*1370a723SSascha Wildner This function converts the content of the Unicode string Source 1562*1370a723SSascha Wildner to the ASCII string Destination by copying the lower 8 bits of 1563*1370a723SSascha Wildner each Unicode character. The function terminates the ASCII string 1564*1370a723SSascha Wildner Destination by appending a Null-terminator character at the end. 1565*1370a723SSascha Wildner 1566*1370a723SSascha Wildner The caller is responsible to make sure Destination points to a buffer with size 1567*1370a723SSascha Wildner equal or greater than ((StrLen (Source) + 1) * sizeof (CHAR8)) in bytes. 1568*1370a723SSascha Wildner 1569*1370a723SSascha Wildner If any Unicode characters in Source contain non-zero value in 1570*1370a723SSascha Wildner the upper 8 bits, then ASSERT(). 1571*1370a723SSascha Wildner 1572*1370a723SSascha Wildner If Source is not aligned on a 16-bit boundary, then ASSERT(). 1573*1370a723SSascha Wildner 1574*1370a723SSascha Wildner If an error is returned, then the Destination is unmodified. 1575*1370a723SSascha Wildner 1576*1370a723SSascha Wildner @param Source The pointer to a Null-terminated Unicode string. 1577*1370a723SSascha Wildner @param Destination The pointer to a Null-terminated ASCII string. 1578*1370a723SSascha Wildner @param DestMax The maximum number of Destination Ascii 1579*1370a723SSascha Wildner char, including terminating null char. 1580*1370a723SSascha Wildner 1581*1370a723SSascha Wildner @retval RETURN_SUCCESS String is converted. 1582*1370a723SSascha Wildner @retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than StrLen(Source). 1583*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If Destination is NULL. 1584*1370a723SSascha Wildner If Source is NULL. 1585*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero, 1586*1370a723SSascha Wildner and DestMax is greater than 1587*1370a723SSascha Wildner PcdMaximumAsciiStringLength. 1588*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not zero, 1589*1370a723SSascha Wildner and DestMax is greater than 1590*1370a723SSascha Wildner PcdMaximumUnicodeStringLength. 1591*1370a723SSascha Wildner If DestMax is 0. 1592*1370a723SSascha Wildner @retval RETURN_ACCESS_DENIED If Source and Destination overlap. 1593*1370a723SSascha Wildner 1594*1370a723SSascha Wildner **/ 1595*1370a723SSascha Wildner RETURN_STATUS 1596*1370a723SSascha Wildner EFIAPI 1597*1370a723SSascha Wildner UnicodeStrToAsciiStrS ( 1598*1370a723SSascha Wildner IN CONST CHAR16 *Source, 1599*1370a723SSascha Wildner OUT CHAR8 *Destination, 1600*1370a723SSascha Wildner IN UINTN DestMax 1601*1370a723SSascha Wildner ); 1602*1370a723SSascha Wildner 1603*1370a723SSascha Wildner /** 1604*1370a723SSascha Wildner Convert not more than Length successive characters from a Null-terminated 1605*1370a723SSascha Wildner Unicode string to a Null-terminated Ascii string. If no null char is copied 1606*1370a723SSascha Wildner from Source, then Destination[Length] is always set to null. 1607*1370a723SSascha Wildner 1608*1370a723SSascha Wildner This function converts not more than Length successive characters from the 1609*1370a723SSascha Wildner Unicode string Source to the Ascii string Destination by copying the lower 8 1610*1370a723SSascha Wildner bits of each Unicode character. The function terminates the Ascii string 1611*1370a723SSascha Wildner Destination by appending a Null-terminator character at the end. 1612*1370a723SSascha Wildner 1613*1370a723SSascha Wildner The caller is responsible to make sure Destination points to a buffer with size 1614*1370a723SSascha Wildner equal or greater than ((StrLen (Source) + 1) * sizeof (CHAR8)) in bytes. 1615*1370a723SSascha Wildner 1616*1370a723SSascha Wildner If any Unicode characters in Source contain non-zero value in the upper 8 1617*1370a723SSascha Wildner bits, then ASSERT(). 1618*1370a723SSascha Wildner If Source is not aligned on a 16-bit boundary, then ASSERT(). 1619*1370a723SSascha Wildner 1620*1370a723SSascha Wildner If an error is returned, then the Destination is unmodified. 1621*1370a723SSascha Wildner 1622*1370a723SSascha Wildner @param Source The pointer to a Null-terminated Unicode string. 1623*1370a723SSascha Wildner @param Length The maximum number of Unicode characters to 1624*1370a723SSascha Wildner convert. 1625*1370a723SSascha Wildner @param Destination The pointer to a Null-terminated Ascii string. 1626*1370a723SSascha Wildner @param DestMax The maximum number of Destination Ascii 1627*1370a723SSascha Wildner char, including terminating null char. 1628*1370a723SSascha Wildner @param DestinationLength The number of Unicode characters converted. 1629*1370a723SSascha Wildner 1630*1370a723SSascha Wildner @retval RETURN_SUCCESS String is converted. 1631*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If Destination is NULL. 1632*1370a723SSascha Wildner If Source is NULL. 1633*1370a723SSascha Wildner If DestinationLength is NULL. 1634*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero, 1635*1370a723SSascha Wildner and Length or DestMax is greater than 1636*1370a723SSascha Wildner PcdMaximumAsciiStringLength. 1637*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not 1638*1370a723SSascha Wildner zero, and Length or DestMax is greater than 1639*1370a723SSascha Wildner PcdMaximumUnicodeStringLength. 1640*1370a723SSascha Wildner If DestMax is 0. 1641*1370a723SSascha Wildner @retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than 1642*1370a723SSascha Wildner MIN(StrLen(Source), Length). 1643*1370a723SSascha Wildner @retval RETURN_ACCESS_DENIED If Source and Destination overlap. 1644*1370a723SSascha Wildner 1645*1370a723SSascha Wildner **/ 1646*1370a723SSascha Wildner RETURN_STATUS 1647*1370a723SSascha Wildner EFIAPI 1648*1370a723SSascha Wildner UnicodeStrnToAsciiStrS ( 1649*1370a723SSascha Wildner IN CONST CHAR16 *Source, 1650*1370a723SSascha Wildner IN UINTN Length, 1651*1370a723SSascha Wildner OUT CHAR8 *Destination, 1652*1370a723SSascha Wildner IN UINTN DestMax, 1653*1370a723SSascha Wildner OUT UINTN *DestinationLength 1654*1370a723SSascha Wildner ); 1655*1370a723SSascha Wildner 1656*1370a723SSascha Wildner /** 1657*1370a723SSascha Wildner Returns the length of a Null-terminated ASCII string. 1658*1370a723SSascha Wildner 1659*1370a723SSascha Wildner This function returns the number of ASCII characters in the Null-terminated 1660*1370a723SSascha Wildner ASCII string specified by String. 1661*1370a723SSascha Wildner 1662*1370a723SSascha Wildner If Length > 0 and Destination is NULL, then ASSERT(). 1663*1370a723SSascha Wildner If Length > 0 and Source is NULL, then ASSERT(). 1664*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero and String contains more than 1665*1370a723SSascha Wildner PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, 1666*1370a723SSascha Wildner then ASSERT(). 1667*1370a723SSascha Wildner 1668*1370a723SSascha Wildner @param String The pointer to a Null-terminated ASCII string. 1669*1370a723SSascha Wildner 1670*1370a723SSascha Wildner @return The length of String. 1671*1370a723SSascha Wildner 1672*1370a723SSascha Wildner **/ 1673*1370a723SSascha Wildner UINTN 1674*1370a723SSascha Wildner EFIAPI 1675*1370a723SSascha Wildner AsciiStrLen ( 1676*1370a723SSascha Wildner IN CONST CHAR8 *String 1677*1370a723SSascha Wildner ); 1678*1370a723SSascha Wildner 1679*1370a723SSascha Wildner /** 1680*1370a723SSascha Wildner Returns the size of a Null-terminated ASCII string in bytes, including the 1681*1370a723SSascha Wildner Null terminator. 1682*1370a723SSascha Wildner 1683*1370a723SSascha Wildner This function returns the size, in bytes, of the Null-terminated ASCII string 1684*1370a723SSascha Wildner specified by String. 1685*1370a723SSascha Wildner 1686*1370a723SSascha Wildner If String is NULL, then ASSERT(). 1687*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero and String contains more than 1688*1370a723SSascha Wildner PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, 1689*1370a723SSascha Wildner then ASSERT(). 1690*1370a723SSascha Wildner 1691*1370a723SSascha Wildner @param String The pointer to a Null-terminated ASCII string. 1692*1370a723SSascha Wildner 1693*1370a723SSascha Wildner @return The size of String. 1694*1370a723SSascha Wildner 1695*1370a723SSascha Wildner **/ 1696*1370a723SSascha Wildner UINTN 1697*1370a723SSascha Wildner EFIAPI 1698*1370a723SSascha Wildner AsciiStrSize ( 1699*1370a723SSascha Wildner IN CONST CHAR8 *String 1700*1370a723SSascha Wildner ); 1701*1370a723SSascha Wildner 1702*1370a723SSascha Wildner /** 1703*1370a723SSascha Wildner Compares two Null-terminated ASCII strings, and returns the difference 1704*1370a723SSascha Wildner between the first mismatched ASCII characters. 1705*1370a723SSascha Wildner 1706*1370a723SSascha Wildner This function compares the Null-terminated ASCII string FirstString to the 1707*1370a723SSascha Wildner Null-terminated ASCII string SecondString. If FirstString is identical to 1708*1370a723SSascha Wildner SecondString, then 0 is returned. Otherwise, the value returned is the first 1709*1370a723SSascha Wildner mismatched ASCII character in SecondString subtracted from the first 1710*1370a723SSascha Wildner mismatched ASCII character in FirstString. 1711*1370a723SSascha Wildner 1712*1370a723SSascha Wildner If FirstString is NULL, then ASSERT(). 1713*1370a723SSascha Wildner If SecondString is NULL, then ASSERT(). 1714*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero and FirstString contains more than 1715*1370a723SSascha Wildner PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, 1716*1370a723SSascha Wildner then ASSERT(). 1717*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero and SecondString contains more 1718*1370a723SSascha Wildner than PcdMaximumAsciiStringLength ASCII characters not including the 1719*1370a723SSascha Wildner Null-terminator, then ASSERT(). 1720*1370a723SSascha Wildner 1721*1370a723SSascha Wildner @param FirstString The pointer to a Null-terminated ASCII string. 1722*1370a723SSascha Wildner @param SecondString The pointer to a Null-terminated ASCII string. 1723*1370a723SSascha Wildner 1724*1370a723SSascha Wildner @retval ==0 FirstString is identical to SecondString. 1725*1370a723SSascha Wildner @retval !=0 FirstString is not identical to SecondString. 1726*1370a723SSascha Wildner 1727*1370a723SSascha Wildner **/ 1728*1370a723SSascha Wildner INTN 1729*1370a723SSascha Wildner EFIAPI 1730*1370a723SSascha Wildner AsciiStrCmp ( 1731*1370a723SSascha Wildner IN CONST CHAR8 *FirstString, 1732*1370a723SSascha Wildner IN CONST CHAR8 *SecondString 1733*1370a723SSascha Wildner ); 1734*1370a723SSascha Wildner 1735*1370a723SSascha Wildner /** 1736*1370a723SSascha Wildner Performs a case insensitive comparison of two Null-terminated ASCII strings, 1737*1370a723SSascha Wildner and returns the difference between the first mismatched ASCII characters. 1738*1370a723SSascha Wildner 1739*1370a723SSascha Wildner This function performs a case insensitive comparison of the Null-terminated 1740*1370a723SSascha Wildner ASCII string FirstString to the Null-terminated ASCII string SecondString. If 1741*1370a723SSascha Wildner FirstString is identical to SecondString, then 0 is returned. Otherwise, the 1742*1370a723SSascha Wildner value returned is the first mismatched lower case ASCII character in 1743*1370a723SSascha Wildner SecondString subtracted from the first mismatched lower case ASCII character 1744*1370a723SSascha Wildner in FirstString. 1745*1370a723SSascha Wildner 1746*1370a723SSascha Wildner If FirstString is NULL, then ASSERT(). 1747*1370a723SSascha Wildner If SecondString is NULL, then ASSERT(). 1748*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero and FirstString contains more than 1749*1370a723SSascha Wildner PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, 1750*1370a723SSascha Wildner then ASSERT(). 1751*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero and SecondString contains more 1752*1370a723SSascha Wildner than PcdMaximumAsciiStringLength ASCII characters not including the 1753*1370a723SSascha Wildner Null-terminator, then ASSERT(). 1754*1370a723SSascha Wildner 1755*1370a723SSascha Wildner @param FirstString The pointer to a Null-terminated ASCII string. 1756*1370a723SSascha Wildner @param SecondString The pointer to a Null-terminated ASCII string. 1757*1370a723SSascha Wildner 1758*1370a723SSascha Wildner @retval ==0 FirstString is identical to SecondString using case insensitive 1759*1370a723SSascha Wildner comparisons. 1760*1370a723SSascha Wildner @retval !=0 FirstString is not identical to SecondString using case 1761*1370a723SSascha Wildner insensitive comparisons. 1762*1370a723SSascha Wildner 1763*1370a723SSascha Wildner **/ 1764*1370a723SSascha Wildner INTN 1765*1370a723SSascha Wildner EFIAPI 1766*1370a723SSascha Wildner AsciiStriCmp ( 1767*1370a723SSascha Wildner IN CONST CHAR8 *FirstString, 1768*1370a723SSascha Wildner IN CONST CHAR8 *SecondString 1769*1370a723SSascha Wildner ); 1770*1370a723SSascha Wildner 1771*1370a723SSascha Wildner /** 1772*1370a723SSascha Wildner Compares two Null-terminated ASCII strings with maximum lengths, and returns 1773*1370a723SSascha Wildner the difference between the first mismatched ASCII characters. 1774*1370a723SSascha Wildner 1775*1370a723SSascha Wildner This function compares the Null-terminated ASCII string FirstString to the 1776*1370a723SSascha Wildner Null-terminated ASCII string SecondString. At most, Length ASCII characters 1777*1370a723SSascha Wildner will be compared. If Length is 0, then 0 is returned. If FirstString is 1778*1370a723SSascha Wildner identical to SecondString, then 0 is returned. Otherwise, the value returned 1779*1370a723SSascha Wildner is the first mismatched ASCII character in SecondString subtracted from the 1780*1370a723SSascha Wildner first mismatched ASCII character in FirstString. 1781*1370a723SSascha Wildner 1782*1370a723SSascha Wildner If Length > 0 and FirstString is NULL, then ASSERT(). 1783*1370a723SSascha Wildner If Length > 0 and SecondString is NULL, then ASSERT(). 1784*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero, and Length is greater than 1785*1370a723SSascha Wildner PcdMaximumAsciiStringLength, then ASSERT(). 1786*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero, and FirstString contains more than 1787*1370a723SSascha Wildner PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator, 1788*1370a723SSascha Wildner then ASSERT(). 1789*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero, and SecondString contains more than 1790*1370a723SSascha Wildner PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator, 1791*1370a723SSascha Wildner then ASSERT(). 1792*1370a723SSascha Wildner 1793*1370a723SSascha Wildner @param FirstString The pointer to a Null-terminated ASCII string. 1794*1370a723SSascha Wildner @param SecondString The pointer to a Null-terminated ASCII string. 1795*1370a723SSascha Wildner @param Length The maximum number of ASCII characters for compare. 1796*1370a723SSascha Wildner 1797*1370a723SSascha Wildner @retval ==0 FirstString is identical to SecondString. 1798*1370a723SSascha Wildner @retval !=0 FirstString is not identical to SecondString. 1799*1370a723SSascha Wildner 1800*1370a723SSascha Wildner **/ 1801*1370a723SSascha Wildner INTN 1802*1370a723SSascha Wildner EFIAPI 1803*1370a723SSascha Wildner AsciiStrnCmp ( 1804*1370a723SSascha Wildner IN CONST CHAR8 *FirstString, 1805*1370a723SSascha Wildner IN CONST CHAR8 *SecondString, 1806*1370a723SSascha Wildner IN UINTN Length 1807*1370a723SSascha Wildner ); 1808*1370a723SSascha Wildner 1809*1370a723SSascha Wildner /** 1810*1370a723SSascha Wildner Returns the first occurrence of a Null-terminated ASCII sub-string 1811*1370a723SSascha Wildner in a Null-terminated ASCII string. 1812*1370a723SSascha Wildner 1813*1370a723SSascha Wildner This function scans the contents of the ASCII string specified by String 1814*1370a723SSascha Wildner and returns the first occurrence of SearchString. If SearchString is not 1815*1370a723SSascha Wildner found in String, then NULL is returned. If the length of SearchString is zero, 1816*1370a723SSascha Wildner then String is returned. 1817*1370a723SSascha Wildner 1818*1370a723SSascha Wildner If String is NULL, then ASSERT(). 1819*1370a723SSascha Wildner If SearchString is NULL, then ASSERT(). 1820*1370a723SSascha Wildner 1821*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero, and SearchString or 1822*1370a723SSascha Wildner String contains more than PcdMaximumAsciiStringLength Unicode characters 1823*1370a723SSascha Wildner not including the Null-terminator, then ASSERT(). 1824*1370a723SSascha Wildner 1825*1370a723SSascha Wildner @param String The pointer to a Null-terminated ASCII string. 1826*1370a723SSascha Wildner @param SearchString The pointer to a Null-terminated ASCII string to search for. 1827*1370a723SSascha Wildner 1828*1370a723SSascha Wildner @retval NULL If the SearchString does not appear in String. 1829*1370a723SSascha Wildner @retval others If there is a match return the first occurrence of SearchingString. 1830*1370a723SSascha Wildner If the length of SearchString is zero,return String. 1831*1370a723SSascha Wildner 1832*1370a723SSascha Wildner **/ 1833*1370a723SSascha Wildner CHAR8 * 1834*1370a723SSascha Wildner EFIAPI 1835*1370a723SSascha Wildner AsciiStrStr ( 1836*1370a723SSascha Wildner IN CONST CHAR8 *String, 1837*1370a723SSascha Wildner IN CONST CHAR8 *SearchString 1838*1370a723SSascha Wildner ); 1839*1370a723SSascha Wildner 1840*1370a723SSascha Wildner /** 1841*1370a723SSascha Wildner Convert a Null-terminated ASCII decimal string to a value of type 1842*1370a723SSascha Wildner UINTN. 1843*1370a723SSascha Wildner 1844*1370a723SSascha Wildner This function returns a value of type UINTN by interpreting the contents 1845*1370a723SSascha Wildner of the ASCII string String as a decimal number. The format of the input 1846*1370a723SSascha Wildner ASCII string String is: 1847*1370a723SSascha Wildner 1848*1370a723SSascha Wildner [spaces] [decimal digits]. 1849*1370a723SSascha Wildner 1850*1370a723SSascha Wildner The valid decimal digit character is in the range [0-9]. The function will 1851*1370a723SSascha Wildner ignore the pad space, which includes spaces or tab characters, before the digits. 1852*1370a723SSascha Wildner The running zero in the beginning of [decimal digits] will be ignored. Then, the 1853*1370a723SSascha Wildner function stops at the first character that is a not a valid decimal character or 1854*1370a723SSascha Wildner Null-terminator, whichever on comes first. 1855*1370a723SSascha Wildner 1856*1370a723SSascha Wildner If String has only pad spaces, then 0 is returned. 1857*1370a723SSascha Wildner If String has no pad spaces or valid decimal digits, then 0 is returned. 1858*1370a723SSascha Wildner If the number represented by String overflows according to the range defined by 1859*1370a723SSascha Wildner UINTN, then MAX_UINTN is returned. 1860*1370a723SSascha Wildner If String is NULL, then ASSERT(). 1861*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero, and String contains more than 1862*1370a723SSascha Wildner PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, 1863*1370a723SSascha Wildner then ASSERT(). 1864*1370a723SSascha Wildner 1865*1370a723SSascha Wildner @param String The pointer to a Null-terminated ASCII string. 1866*1370a723SSascha Wildner 1867*1370a723SSascha Wildner @retval The value translated from String. 1868*1370a723SSascha Wildner 1869*1370a723SSascha Wildner **/ 1870*1370a723SSascha Wildner UINTN 1871*1370a723SSascha Wildner EFIAPI 1872*1370a723SSascha Wildner AsciiStrDecimalToUintn ( 1873*1370a723SSascha Wildner IN CONST CHAR8 *String 1874*1370a723SSascha Wildner ); 1875*1370a723SSascha Wildner 1876*1370a723SSascha Wildner /** 1877*1370a723SSascha Wildner Convert a Null-terminated ASCII decimal string to a value of type 1878*1370a723SSascha Wildner UINT64. 1879*1370a723SSascha Wildner 1880*1370a723SSascha Wildner This function returns a value of type UINT64 by interpreting the contents 1881*1370a723SSascha Wildner of the ASCII string String as a decimal number. The format of the input 1882*1370a723SSascha Wildner ASCII string String is: 1883*1370a723SSascha Wildner 1884*1370a723SSascha Wildner [spaces] [decimal digits]. 1885*1370a723SSascha Wildner 1886*1370a723SSascha Wildner The valid decimal digit character is in the range [0-9]. The function will 1887*1370a723SSascha Wildner ignore the pad space, which includes spaces or tab characters, before the digits. 1888*1370a723SSascha Wildner The running zero in the beginning of [decimal digits] will be ignored. Then, the 1889*1370a723SSascha Wildner function stops at the first character that is a not a valid decimal character or 1890*1370a723SSascha Wildner Null-terminator, whichever on comes first. 1891*1370a723SSascha Wildner 1892*1370a723SSascha Wildner If String has only pad spaces, then 0 is returned. 1893*1370a723SSascha Wildner If String has no pad spaces or valid decimal digits, then 0 is returned. 1894*1370a723SSascha Wildner If the number represented by String overflows according to the range defined by 1895*1370a723SSascha Wildner UINT64, then MAX_UINT64 is returned. 1896*1370a723SSascha Wildner If String is NULL, then ASSERT(). 1897*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero, and String contains more than 1898*1370a723SSascha Wildner PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, 1899*1370a723SSascha Wildner then ASSERT(). 1900*1370a723SSascha Wildner 1901*1370a723SSascha Wildner @param String The pointer to a Null-terminated ASCII string. 1902*1370a723SSascha Wildner 1903*1370a723SSascha Wildner @retval Value translated from String. 1904*1370a723SSascha Wildner 1905*1370a723SSascha Wildner **/ 1906*1370a723SSascha Wildner UINT64 1907*1370a723SSascha Wildner EFIAPI 1908*1370a723SSascha Wildner AsciiStrDecimalToUint64 ( 1909*1370a723SSascha Wildner IN CONST CHAR8 *String 1910*1370a723SSascha Wildner ); 1911*1370a723SSascha Wildner 1912*1370a723SSascha Wildner /** 1913*1370a723SSascha Wildner Convert a Null-terminated ASCII hexadecimal string to a value of type UINTN. 1914*1370a723SSascha Wildner 1915*1370a723SSascha Wildner This function returns a value of type UINTN by interpreting the contents of 1916*1370a723SSascha Wildner the ASCII string String as a hexadecimal number. The format of the input ASCII 1917*1370a723SSascha Wildner string String is: 1918*1370a723SSascha Wildner 1919*1370a723SSascha Wildner [spaces][zeros][x][hexadecimal digits]. 1920*1370a723SSascha Wildner 1921*1370a723SSascha Wildner The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. 1922*1370a723SSascha Wildner The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x" 1923*1370a723SSascha Wildner appears in the input string, it must be prefixed with at least one 0. The function 1924*1370a723SSascha Wildner will ignore the pad space, which includes spaces or tab characters, before [zeros], 1925*1370a723SSascha Wildner [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits] 1926*1370a723SSascha Wildner will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal 1927*1370a723SSascha Wildner digit. Then, the function stops at the first character that is a not a valid 1928*1370a723SSascha Wildner hexadecimal character or Null-terminator, whichever on comes first. 1929*1370a723SSascha Wildner 1930*1370a723SSascha Wildner If String has only pad spaces, then 0 is returned. 1931*1370a723SSascha Wildner If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then 1932*1370a723SSascha Wildner 0 is returned. 1933*1370a723SSascha Wildner 1934*1370a723SSascha Wildner If the number represented by String overflows according to the range defined by UINTN, 1935*1370a723SSascha Wildner then MAX_UINTN is returned. 1936*1370a723SSascha Wildner If String is NULL, then ASSERT(). 1937*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero, 1938*1370a723SSascha Wildner and String contains more than PcdMaximumAsciiStringLength ASCII characters not including 1939*1370a723SSascha Wildner the Null-terminator, then ASSERT(). 1940*1370a723SSascha Wildner 1941*1370a723SSascha Wildner @param String The pointer to a Null-terminated ASCII string. 1942*1370a723SSascha Wildner 1943*1370a723SSascha Wildner @retval Value translated from String. 1944*1370a723SSascha Wildner 1945*1370a723SSascha Wildner **/ 1946*1370a723SSascha Wildner UINTN 1947*1370a723SSascha Wildner EFIAPI 1948*1370a723SSascha Wildner AsciiStrHexToUintn ( 1949*1370a723SSascha Wildner IN CONST CHAR8 *String 1950*1370a723SSascha Wildner ); 1951*1370a723SSascha Wildner 1952*1370a723SSascha Wildner /** 1953*1370a723SSascha Wildner Convert a Null-terminated ASCII hexadecimal string to a value of type UINT64. 1954*1370a723SSascha Wildner 1955*1370a723SSascha Wildner This function returns a value of type UINT64 by interpreting the contents of 1956*1370a723SSascha Wildner the ASCII string String as a hexadecimal number. The format of the input ASCII 1957*1370a723SSascha Wildner string String is: 1958*1370a723SSascha Wildner 1959*1370a723SSascha Wildner [spaces][zeros][x][hexadecimal digits]. 1960*1370a723SSascha Wildner 1961*1370a723SSascha Wildner The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. 1962*1370a723SSascha Wildner The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x" 1963*1370a723SSascha Wildner appears in the input string, it must be prefixed with at least one 0. The function 1964*1370a723SSascha Wildner will ignore the pad space, which includes spaces or tab characters, before [zeros], 1965*1370a723SSascha Wildner [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits] 1966*1370a723SSascha Wildner will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal 1967*1370a723SSascha Wildner digit. Then, the function stops at the first character that is a not a valid 1968*1370a723SSascha Wildner hexadecimal character or Null-terminator, whichever on comes first. 1969*1370a723SSascha Wildner 1970*1370a723SSascha Wildner If String has only pad spaces, then 0 is returned. 1971*1370a723SSascha Wildner If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then 1972*1370a723SSascha Wildner 0 is returned. 1973*1370a723SSascha Wildner 1974*1370a723SSascha Wildner If the number represented by String overflows according to the range defined by UINT64, 1975*1370a723SSascha Wildner then MAX_UINT64 is returned. 1976*1370a723SSascha Wildner If String is NULL, then ASSERT(). 1977*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero, 1978*1370a723SSascha Wildner and String contains more than PcdMaximumAsciiStringLength ASCII characters not including 1979*1370a723SSascha Wildner the Null-terminator, then ASSERT(). 1980*1370a723SSascha Wildner 1981*1370a723SSascha Wildner @param String The pointer to a Null-terminated ASCII string. 1982*1370a723SSascha Wildner 1983*1370a723SSascha Wildner @retval Value translated from String. 1984*1370a723SSascha Wildner 1985*1370a723SSascha Wildner **/ 1986*1370a723SSascha Wildner UINT64 1987*1370a723SSascha Wildner EFIAPI 1988*1370a723SSascha Wildner AsciiStrHexToUint64 ( 1989*1370a723SSascha Wildner IN CONST CHAR8 *String 1990*1370a723SSascha Wildner ); 1991*1370a723SSascha Wildner 1992*1370a723SSascha Wildner /** 1993*1370a723SSascha Wildner Convert a Null-terminated ASCII string to IPv6 address and prefix length. 1994*1370a723SSascha Wildner 1995*1370a723SSascha Wildner This function outputs a value of type IPv6_ADDRESS and may output a value 1996*1370a723SSascha Wildner of type UINT8 by interpreting the contents of the ASCII string specified 1997*1370a723SSascha Wildner by String. The format of the input ASCII string String is as follows: 1998*1370a723SSascha Wildner 1999*1370a723SSascha Wildner X:X:X:X:X:X:X:X[/P] 2000*1370a723SSascha Wildner 2001*1370a723SSascha Wildner X contains one to four hexadecimal digit characters in the range [0-9], [a-f] and 2002*1370a723SSascha Wildner [A-F]. X is converted to a value of type UINT16, whose low byte is stored in low 2003*1370a723SSascha Wildner memory address and high byte is stored in high memory address. P contains decimal 2004*1370a723SSascha Wildner digit characters in the range [0-9]. The running zero in the beginning of P will 2005*1370a723SSascha Wildner be ignored. /P is optional. 2006*1370a723SSascha Wildner 2007*1370a723SSascha Wildner When /P is not in the String, the function stops at the first character that is 2008*1370a723SSascha Wildner not a valid hexadecimal digit character after eight X's are converted. 2009*1370a723SSascha Wildner 2010*1370a723SSascha Wildner When /P is in the String, the function stops at the first character that is not 2011*1370a723SSascha Wildner a valid decimal digit character after P is converted. 2012*1370a723SSascha Wildner 2013*1370a723SSascha Wildner "::" can be used to compress one or more groups of X when X contains only 0. 2014*1370a723SSascha Wildner The "::" can only appear once in the String. 2015*1370a723SSascha Wildner 2016*1370a723SSascha Wildner If EndPointer is not NULL and Address is translated from String, a pointer 2017*1370a723SSascha Wildner to the character that stopped the scan is stored at the location pointed to 2018*1370a723SSascha Wildner by EndPointer. 2019*1370a723SSascha Wildner 2020*1370a723SSascha Wildner @param String Pointer to a Null-terminated ASCII string. 2021*1370a723SSascha Wildner @param EndPointer Pointer to character that stops scan. 2022*1370a723SSascha Wildner @param Address Pointer to the converted IPv6 address. 2023*1370a723SSascha Wildner @param PrefixLength Pointer to the converted IPv6 address prefix 2024*1370a723SSascha Wildner length. MAX_UINT8 is returned when /P is 2025*1370a723SSascha Wildner not in the String. 2026*1370a723SSascha Wildner 2027*1370a723SSascha Wildner @retval RETURN_SUCCESS Address is translated from String. 2028*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If String is NULL. 2029*1370a723SSascha Wildner If Data is NULL. 2030*1370a723SSascha Wildner @retval RETURN_UNSUPPORTED If X contains more than four hexadecimal 2031*1370a723SSascha Wildner digit characters. 2032*1370a723SSascha Wildner If String contains "::" and number of X 2033*1370a723SSascha Wildner is not less than 8. 2034*1370a723SSascha Wildner If P starts with character that is not a 2035*1370a723SSascha Wildner valid decimal digit character. 2036*1370a723SSascha Wildner If the decimal number converted from P 2037*1370a723SSascha Wildner exceeds 128. 2038*1370a723SSascha Wildner 2039*1370a723SSascha Wildner **/ 2040*1370a723SSascha Wildner RETURN_STATUS 2041*1370a723SSascha Wildner EFIAPI 2042*1370a723SSascha Wildner AsciiStrToIpv6Address ( 2043*1370a723SSascha Wildner IN CONST CHAR8 *String, 2044*1370a723SSascha Wildner OUT CHAR8 **EndPointer OPTIONAL, 2045*1370a723SSascha Wildner OUT IPv6_ADDRESS *Address, 2046*1370a723SSascha Wildner OUT UINT8 *PrefixLength OPTIONAL 2047*1370a723SSascha Wildner ); 2048*1370a723SSascha Wildner 2049*1370a723SSascha Wildner /** 2050*1370a723SSascha Wildner Convert a Null-terminated ASCII string to IPv4 address and prefix length. 2051*1370a723SSascha Wildner 2052*1370a723SSascha Wildner This function outputs a value of type IPv4_ADDRESS and may output a value 2053*1370a723SSascha Wildner of type UINT8 by interpreting the contents of the ASCII string specified 2054*1370a723SSascha Wildner by String. The format of the input ASCII string String is as follows: 2055*1370a723SSascha Wildner 2056*1370a723SSascha Wildner D.D.D.D[/P] 2057*1370a723SSascha Wildner 2058*1370a723SSascha Wildner D and P are decimal digit characters in the range [0-9]. The running zero in 2059*1370a723SSascha Wildner the beginning of D and P will be ignored. /P is optional. 2060*1370a723SSascha Wildner 2061*1370a723SSascha Wildner When /P is not in the String, the function stops at the first character that is 2062*1370a723SSascha Wildner not a valid decimal digit character after four D's are converted. 2063*1370a723SSascha Wildner 2064*1370a723SSascha Wildner When /P is in the String, the function stops at the first character that is not 2065*1370a723SSascha Wildner a valid decimal digit character after P is converted. 2066*1370a723SSascha Wildner 2067*1370a723SSascha Wildner If EndPointer is not NULL and Address is translated from String, a pointer 2068*1370a723SSascha Wildner to the character that stopped the scan is stored at the location pointed to 2069*1370a723SSascha Wildner by EndPointer. 2070*1370a723SSascha Wildner 2071*1370a723SSascha Wildner @param String Pointer to a Null-terminated ASCII string. 2072*1370a723SSascha Wildner @param EndPointer Pointer to character that stops scan. 2073*1370a723SSascha Wildner @param Address Pointer to the converted IPv4 address. 2074*1370a723SSascha Wildner @param PrefixLength Pointer to the converted IPv4 address prefix 2075*1370a723SSascha Wildner length. MAX_UINT8 is returned when /P is 2076*1370a723SSascha Wildner not in the String. 2077*1370a723SSascha Wildner 2078*1370a723SSascha Wildner @retval RETURN_SUCCESS Address is translated from String. 2079*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If String is NULL. 2080*1370a723SSascha Wildner If Data is NULL. 2081*1370a723SSascha Wildner @retval RETURN_UNSUPPORTED If String is not in the correct format. 2082*1370a723SSascha Wildner If any decimal number converted from D 2083*1370a723SSascha Wildner exceeds 255. 2084*1370a723SSascha Wildner If the decimal number converted from P 2085*1370a723SSascha Wildner exceeds 32. 2086*1370a723SSascha Wildner 2087*1370a723SSascha Wildner **/ 2088*1370a723SSascha Wildner RETURN_STATUS 2089*1370a723SSascha Wildner EFIAPI 2090*1370a723SSascha Wildner AsciiStrToIpv4Address ( 2091*1370a723SSascha Wildner IN CONST CHAR8 *String, 2092*1370a723SSascha Wildner OUT CHAR8 **EndPointer OPTIONAL, 2093*1370a723SSascha Wildner OUT IPv4_ADDRESS *Address, 2094*1370a723SSascha Wildner OUT UINT8 *PrefixLength OPTIONAL 2095*1370a723SSascha Wildner ); 2096*1370a723SSascha Wildner 2097*1370a723SSascha Wildner /** 2098*1370a723SSascha Wildner Convert a Null-terminated ASCII GUID string to a value of type 2099*1370a723SSascha Wildner EFI_GUID. 2100*1370a723SSascha Wildner 2101*1370a723SSascha Wildner This function outputs a GUID value by interpreting the contents of 2102*1370a723SSascha Wildner the ASCII string specified by String. The format of the input 2103*1370a723SSascha Wildner ASCII string String consists of 36 characters, as follows: 2104*1370a723SSascha Wildner 2105*1370a723SSascha Wildner aabbccdd-eeff-gghh-iijj-kkllmmnnoopp 2106*1370a723SSascha Wildner 2107*1370a723SSascha Wildner The pairs aa - pp are two characters in the range [0-9], [a-f] and 2108*1370a723SSascha Wildner [A-F], with each pair representing a single byte hexadecimal value. 2109*1370a723SSascha Wildner 2110*1370a723SSascha Wildner The mapping between String and the EFI_GUID structure is as follows: 2111*1370a723SSascha Wildner aa Data1[24:31] 2112*1370a723SSascha Wildner bb Data1[16:23] 2113*1370a723SSascha Wildner cc Data1[8:15] 2114*1370a723SSascha Wildner dd Data1[0:7] 2115*1370a723SSascha Wildner ee Data2[8:15] 2116*1370a723SSascha Wildner ff Data2[0:7] 2117*1370a723SSascha Wildner gg Data3[8:15] 2118*1370a723SSascha Wildner hh Data3[0:7] 2119*1370a723SSascha Wildner ii Data4[0:7] 2120*1370a723SSascha Wildner jj Data4[8:15] 2121*1370a723SSascha Wildner kk Data4[16:23] 2122*1370a723SSascha Wildner ll Data4[24:31] 2123*1370a723SSascha Wildner mm Data4[32:39] 2124*1370a723SSascha Wildner nn Data4[40:47] 2125*1370a723SSascha Wildner oo Data4[48:55] 2126*1370a723SSascha Wildner pp Data4[56:63] 2127*1370a723SSascha Wildner 2128*1370a723SSascha Wildner @param String Pointer to a Null-terminated ASCII string. 2129*1370a723SSascha Wildner @param Guid Pointer to the converted GUID. 2130*1370a723SSascha Wildner 2131*1370a723SSascha Wildner @retval RETURN_SUCCESS Guid is translated from String. 2132*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If String is NULL. 2133*1370a723SSascha Wildner If Data is NULL. 2134*1370a723SSascha Wildner @retval RETURN_UNSUPPORTED If String is not as the above format. 2135*1370a723SSascha Wildner 2136*1370a723SSascha Wildner **/ 2137*1370a723SSascha Wildner RETURN_STATUS 2138*1370a723SSascha Wildner EFIAPI 2139*1370a723SSascha Wildner AsciiStrToGuid ( 2140*1370a723SSascha Wildner IN CONST CHAR8 *String, 2141*1370a723SSascha Wildner OUT GUID *Guid 2142*1370a723SSascha Wildner ); 2143*1370a723SSascha Wildner 2144*1370a723SSascha Wildner /** 2145*1370a723SSascha Wildner Convert a Null-terminated ASCII hexadecimal string to a byte array. 2146*1370a723SSascha Wildner 2147*1370a723SSascha Wildner This function outputs a byte array by interpreting the contents of 2148*1370a723SSascha Wildner the ASCII string specified by String in hexadecimal format. The format of 2149*1370a723SSascha Wildner the input ASCII string String is: 2150*1370a723SSascha Wildner 2151*1370a723SSascha Wildner [XX]* 2152*1370a723SSascha Wildner 2153*1370a723SSascha Wildner X is a hexadecimal digit character in the range [0-9], [a-f] and [A-F]. 2154*1370a723SSascha Wildner The function decodes every two hexadecimal digit characters as one byte. The 2155*1370a723SSascha Wildner decoding stops after Length of characters and outputs Buffer containing 2156*1370a723SSascha Wildner (Length / 2) bytes. 2157*1370a723SSascha Wildner 2158*1370a723SSascha Wildner @param String Pointer to a Null-terminated ASCII string. 2159*1370a723SSascha Wildner @param Length The number of ASCII characters to decode. 2160*1370a723SSascha Wildner @param Buffer Pointer to the converted bytes array. 2161*1370a723SSascha Wildner @param MaxBufferSize The maximum size of Buffer. 2162*1370a723SSascha Wildner 2163*1370a723SSascha Wildner @retval RETURN_SUCCESS Buffer is translated from String. 2164*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If String is NULL. 2165*1370a723SSascha Wildner If Data is NULL. 2166*1370a723SSascha Wildner If Length is not multiple of 2. 2167*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero, 2168*1370a723SSascha Wildner and Length is greater than 2169*1370a723SSascha Wildner PcdMaximumAsciiStringLength. 2170*1370a723SSascha Wildner @retval RETURN_UNSUPPORTED If Length of characters from String contain 2171*1370a723SSascha Wildner a character that is not valid hexadecimal 2172*1370a723SSascha Wildner digit characters, or a Null-terminator. 2173*1370a723SSascha Wildner @retval RETURN_BUFFER_TOO_SMALL If MaxBufferSize is less than (Length / 2). 2174*1370a723SSascha Wildner **/ 2175*1370a723SSascha Wildner RETURN_STATUS 2176*1370a723SSascha Wildner EFIAPI 2177*1370a723SSascha Wildner AsciiStrHexToBytes ( 2178*1370a723SSascha Wildner IN CONST CHAR8 *String, 2179*1370a723SSascha Wildner IN UINTN Length, 2180*1370a723SSascha Wildner OUT UINT8 *Buffer, 2181*1370a723SSascha Wildner IN UINTN MaxBufferSize 2182*1370a723SSascha Wildner ); 2183*1370a723SSascha Wildner 2184*1370a723SSascha Wildner /** 2185*1370a723SSascha Wildner Convert one Null-terminated ASCII string to a Null-terminated 2186*1370a723SSascha Wildner Unicode string. 2187*1370a723SSascha Wildner 2188*1370a723SSascha Wildner This function is similar to StrCpyS. 2189*1370a723SSascha Wildner 2190*1370a723SSascha Wildner This function converts the contents of the ASCII string Source to the Unicode 2191*1370a723SSascha Wildner string Destination. The function terminates the Unicode string Destination by 2192*1370a723SSascha Wildner appending a Null-terminator character at the end. 2193*1370a723SSascha Wildner 2194*1370a723SSascha Wildner The caller is responsible to make sure Destination points to a buffer with size 2195*1370a723SSascha Wildner equal or greater than ((AsciiStrLen (Source) + 1) * sizeof (CHAR16)) in bytes. 2196*1370a723SSascha Wildner 2197*1370a723SSascha Wildner If Destination is not aligned on a 16-bit boundary, then ASSERT(). 2198*1370a723SSascha Wildner 2199*1370a723SSascha Wildner If an error is returned, then the Destination is unmodified. 2200*1370a723SSascha Wildner 2201*1370a723SSascha Wildner @param Source The pointer to a Null-terminated ASCII string. 2202*1370a723SSascha Wildner @param Destination The pointer to a Null-terminated Unicode string. 2203*1370a723SSascha Wildner @param DestMax The maximum number of Destination Unicode 2204*1370a723SSascha Wildner char, including terminating null char. 2205*1370a723SSascha Wildner 2206*1370a723SSascha Wildner @retval RETURN_SUCCESS String is converted. 2207*1370a723SSascha Wildner @retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than StrLen(Source). 2208*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If Destination is NULL. 2209*1370a723SSascha Wildner If Source is NULL. 2210*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not zero, 2211*1370a723SSascha Wildner and DestMax is greater than 2212*1370a723SSascha Wildner PcdMaximumUnicodeStringLength. 2213*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero, 2214*1370a723SSascha Wildner and DestMax is greater than 2215*1370a723SSascha Wildner PcdMaximumAsciiStringLength. 2216*1370a723SSascha Wildner If DestMax is 0. 2217*1370a723SSascha Wildner @retval RETURN_ACCESS_DENIED If Source and Destination overlap. 2218*1370a723SSascha Wildner 2219*1370a723SSascha Wildner **/ 2220*1370a723SSascha Wildner RETURN_STATUS 2221*1370a723SSascha Wildner EFIAPI 2222*1370a723SSascha Wildner AsciiStrToUnicodeStrS ( 2223*1370a723SSascha Wildner IN CONST CHAR8 *Source, 2224*1370a723SSascha Wildner OUT CHAR16 *Destination, 2225*1370a723SSascha Wildner IN UINTN DestMax 2226*1370a723SSascha Wildner ); 2227*1370a723SSascha Wildner 2228*1370a723SSascha Wildner /** 2229*1370a723SSascha Wildner Convert not more than Length successive characters from a Null-terminated 2230*1370a723SSascha Wildner Ascii string to a Null-terminated Unicode string. If no null char is copied 2231*1370a723SSascha Wildner from Source, then Destination[Length] is always set to null. 2232*1370a723SSascha Wildner 2233*1370a723SSascha Wildner This function converts not more than Length successive characters from the 2234*1370a723SSascha Wildner Ascii string Source to the Unicode string Destination. The function 2235*1370a723SSascha Wildner terminates the Unicode string Destination by appending a Null-terminator 2236*1370a723SSascha Wildner character at the end. 2237*1370a723SSascha Wildner 2238*1370a723SSascha Wildner The caller is responsible to make sure Destination points to a buffer with 2239*1370a723SSascha Wildner size not smaller than 2240*1370a723SSascha Wildner ((MIN(AsciiStrLen(Source), Length) + 1) * sizeof (CHAR8)) in bytes. 2241*1370a723SSascha Wildner 2242*1370a723SSascha Wildner If Destination is not aligned on a 16-bit boundary, then ASSERT(). 2243*1370a723SSascha Wildner 2244*1370a723SSascha Wildner If an error is returned, then Destination and DestinationLength are 2245*1370a723SSascha Wildner unmodified. 2246*1370a723SSascha Wildner 2247*1370a723SSascha Wildner @param Source The pointer to a Null-terminated Ascii string. 2248*1370a723SSascha Wildner @param Length The maximum number of Ascii characters to convert. 2249*1370a723SSascha Wildner @param Destination The pointer to a Null-terminated Unicode string. 2250*1370a723SSascha Wildner @param DestMax The maximum number of Destination Unicode char, 2251*1370a723SSascha Wildner including terminating null char. 2252*1370a723SSascha Wildner @param DestinationLength The number of Ascii characters converted. 2253*1370a723SSascha Wildner 2254*1370a723SSascha Wildner @retval RETURN_SUCCESS String is converted. 2255*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If Destination is NULL. 2256*1370a723SSascha Wildner If Source is NULL. 2257*1370a723SSascha Wildner If DestinationLength is NULL. 2258*1370a723SSascha Wildner If PcdMaximumUnicodeStringLength is not 2259*1370a723SSascha Wildner zero, and Length or DestMax is greater than 2260*1370a723SSascha Wildner PcdMaximumUnicodeStringLength. 2261*1370a723SSascha Wildner If PcdMaximumAsciiStringLength is not zero, 2262*1370a723SSascha Wildner and Length or DestMax is greater than 2263*1370a723SSascha Wildner PcdMaximumAsciiStringLength. 2264*1370a723SSascha Wildner If DestMax is 0. 2265*1370a723SSascha Wildner @retval RETURN_BUFFER_TOO_SMALL If DestMax is NOT greater than 2266*1370a723SSascha Wildner MIN(AsciiStrLen(Source), Length). 2267*1370a723SSascha Wildner @retval RETURN_ACCESS_DENIED If Source and Destination overlap. 2268*1370a723SSascha Wildner 2269*1370a723SSascha Wildner **/ 2270*1370a723SSascha Wildner RETURN_STATUS 2271*1370a723SSascha Wildner EFIAPI 2272*1370a723SSascha Wildner AsciiStrnToUnicodeStrS ( 2273*1370a723SSascha Wildner IN CONST CHAR8 *Source, 2274*1370a723SSascha Wildner IN UINTN Length, 2275*1370a723SSascha Wildner OUT CHAR16 *Destination, 2276*1370a723SSascha Wildner IN UINTN DestMax, 2277*1370a723SSascha Wildner OUT UINTN *DestinationLength 2278*1370a723SSascha Wildner ); 2279*1370a723SSascha Wildner 2280*1370a723SSascha Wildner /** 2281*1370a723SSascha Wildner Convert a Unicode character to upper case only if 2282*1370a723SSascha Wildner it maps to a valid small-case ASCII character. 2283*1370a723SSascha Wildner 2284*1370a723SSascha Wildner This internal function only deal with Unicode character 2285*1370a723SSascha Wildner which maps to a valid small-case ASCII character, i.e. 2286*1370a723SSascha Wildner L'a' to L'z'. For other Unicode character, the input character 2287*1370a723SSascha Wildner is returned directly. 2288*1370a723SSascha Wildner 2289*1370a723SSascha Wildner @param Char The character to convert. 2290*1370a723SSascha Wildner 2291*1370a723SSascha Wildner @retval LowerCharacter If the Char is with range L'a' to L'z'. 2292*1370a723SSascha Wildner @retval Unchanged Otherwise. 2293*1370a723SSascha Wildner 2294*1370a723SSascha Wildner **/ 2295*1370a723SSascha Wildner CHAR16 2296*1370a723SSascha Wildner EFIAPI 2297*1370a723SSascha Wildner CharToUpper ( 2298*1370a723SSascha Wildner IN CHAR16 Char 2299*1370a723SSascha Wildner ); 2300*1370a723SSascha Wildner 2301*1370a723SSascha Wildner /** 2302*1370a723SSascha Wildner Converts a lowercase Ascii character to upper one. 2303*1370a723SSascha Wildner 2304*1370a723SSascha Wildner If Chr is lowercase Ascii character, then converts it to upper one. 2305*1370a723SSascha Wildner 2306*1370a723SSascha Wildner If Value >= 0xA0, then ASSERT(). 2307*1370a723SSascha Wildner If (Value & 0x0F) >= 0x0A, then ASSERT(). 2308*1370a723SSascha Wildner 2309*1370a723SSascha Wildner @param Chr one Ascii character 2310*1370a723SSascha Wildner 2311*1370a723SSascha Wildner @return The uppercase value of Ascii character 2312*1370a723SSascha Wildner 2313*1370a723SSascha Wildner **/ 2314*1370a723SSascha Wildner CHAR8 2315*1370a723SSascha Wildner EFIAPI 2316*1370a723SSascha Wildner AsciiCharToUpper ( 2317*1370a723SSascha Wildner IN CHAR8 Chr 2318*1370a723SSascha Wildner ); 2319*1370a723SSascha Wildner 2320*1370a723SSascha Wildner /** 2321*1370a723SSascha Wildner Convert binary data to a Base64 encoded ascii string based on RFC4648. 2322*1370a723SSascha Wildner 2323*1370a723SSascha Wildner Produce a Null-terminated Ascii string in the output buffer specified by Destination and DestinationSize. 2324*1370a723SSascha Wildner The Ascii string is produced by converting the data string specified by Source and SourceLength. 2325*1370a723SSascha Wildner 2326*1370a723SSascha Wildner @param Source Input UINT8 data 2327*1370a723SSascha Wildner @param SourceLength Number of UINT8 bytes of data 2328*1370a723SSascha Wildner @param Destination Pointer to output string buffer 2329*1370a723SSascha Wildner @param DestinationSize Size of ascii buffer. Set to 0 to get the size needed. 2330*1370a723SSascha Wildner Caller is responsible for passing in buffer of DestinationSize 2331*1370a723SSascha Wildner 2332*1370a723SSascha Wildner @retval RETURN_SUCCESS When ascii buffer is filled in. 2333*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If Source is NULL or DestinationSize is NULL. 2334*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER If SourceLength or DestinationSize is bigger than (MAX_ADDRESS - (UINTN)Destination). 2335*1370a723SSascha Wildner @retval RETURN_BUFFER_TOO_SMALL If SourceLength is 0 and DestinationSize is <1. 2336*1370a723SSascha Wildner @retval RETURN_BUFFER_TOO_SMALL If Destination is NULL or DestinationSize is smaller than required buffersize. 2337*1370a723SSascha Wildner 2338*1370a723SSascha Wildner **/ 2339*1370a723SSascha Wildner RETURN_STATUS 2340*1370a723SSascha Wildner EFIAPI 2341*1370a723SSascha Wildner Base64Encode ( 2342*1370a723SSascha Wildner IN CONST UINT8 *Source, 2343*1370a723SSascha Wildner IN UINTN SourceLength, 2344*1370a723SSascha Wildner OUT CHAR8 *Destination OPTIONAL, 2345*1370a723SSascha Wildner IN OUT UINTN *DestinationSize 2346*1370a723SSascha Wildner ); 2347*1370a723SSascha Wildner 2348*1370a723SSascha Wildner /** 2349*1370a723SSascha Wildner Decode Base64 ASCII encoded data to 8-bit binary representation, based on 2350*1370a723SSascha Wildner RFC4648. 2351*1370a723SSascha Wildner 2352*1370a723SSascha Wildner Decoding occurs according to "Table 1: The Base 64 Alphabet" in RFC4648. 2353*1370a723SSascha Wildner 2354*1370a723SSascha Wildner Whitespace is ignored at all positions: 2355*1370a723SSascha Wildner - 0x09 ('\t') horizontal tab 2356*1370a723SSascha Wildner - 0x0A ('\n') new line 2357*1370a723SSascha Wildner - 0x0B ('\v') vertical tab 2358*1370a723SSascha Wildner - 0x0C ('\f') form feed 2359*1370a723SSascha Wildner - 0x0D ('\r') carriage return 2360*1370a723SSascha Wildner - 0x20 (' ') space 2361*1370a723SSascha Wildner 2362*1370a723SSascha Wildner The minimum amount of required padding (with ASCII 0x3D, '=') is tolerated 2363*1370a723SSascha Wildner and enforced at the end of the Base64 ASCII encoded data, and only there. 2364*1370a723SSascha Wildner 2365*1370a723SSascha Wildner Other characters outside of the encoding alphabet cause the function to 2366*1370a723SSascha Wildner reject the Base64 ASCII encoded data. 2367*1370a723SSascha Wildner 2368*1370a723SSascha Wildner @param[in] Source Array of CHAR8 elements containing the Base64 2369*1370a723SSascha Wildner ASCII encoding. May be NULL if SourceSize is 2370*1370a723SSascha Wildner zero. 2371*1370a723SSascha Wildner 2372*1370a723SSascha Wildner @param[in] SourceSize Number of CHAR8 elements in Source. 2373*1370a723SSascha Wildner 2374*1370a723SSascha Wildner @param[out] Destination Array of UINT8 elements receiving the decoded 2375*1370a723SSascha Wildner 8-bit binary representation. Allocated by the 2376*1370a723SSascha Wildner caller. May be NULL if DestinationSize is 2377*1370a723SSascha Wildner zero on input. If NULL, decoding is 2378*1370a723SSascha Wildner performed, but the 8-bit binary 2379*1370a723SSascha Wildner representation is not stored. If non-NULL and 2380*1370a723SSascha Wildner the function returns an error, the contents 2381*1370a723SSascha Wildner of Destination are indeterminate. 2382*1370a723SSascha Wildner 2383*1370a723SSascha Wildner @param[in,out] DestinationSize On input, the number of UINT8 elements that 2384*1370a723SSascha Wildner the caller allocated for Destination. On 2385*1370a723SSascha Wildner output, if the function returns 2386*1370a723SSascha Wildner RETURN_SUCCESS or RETURN_BUFFER_TOO_SMALL, 2387*1370a723SSascha Wildner the number of UINT8 elements that are 2388*1370a723SSascha Wildner required for decoding the Base64 ASCII 2389*1370a723SSascha Wildner representation. If the function returns a 2390*1370a723SSascha Wildner value different from both RETURN_SUCCESS and 2391*1370a723SSascha Wildner RETURN_BUFFER_TOO_SMALL, then DestinationSize 2392*1370a723SSascha Wildner is indeterminate on output. 2393*1370a723SSascha Wildner 2394*1370a723SSascha Wildner @retval RETURN_SUCCESS SourceSize CHAR8 elements at Source have 2395*1370a723SSascha Wildner been decoded to on-output DestinationSize 2396*1370a723SSascha Wildner UINT8 elements at Destination. Note that 2397*1370a723SSascha Wildner RETURN_SUCCESS covers the case when 2398*1370a723SSascha Wildner DestinationSize is zero on input, and 2399*1370a723SSascha Wildner Source decodes to zero bytes (due to 2400*1370a723SSascha Wildner containing at most ignored whitespace). 2401*1370a723SSascha Wildner 2402*1370a723SSascha Wildner @retval RETURN_BUFFER_TOO_SMALL The input value of DestinationSize is not 2403*1370a723SSascha Wildner large enough for decoding SourceSize CHAR8 2404*1370a723SSascha Wildner elements at Source. The required number of 2405*1370a723SSascha Wildner UINT8 elements has been stored to 2406*1370a723SSascha Wildner DestinationSize. 2407*1370a723SSascha Wildner 2408*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER DestinationSize is NULL. 2409*1370a723SSascha Wildner 2410*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER Source is NULL, but SourceSize is not zero. 2411*1370a723SSascha Wildner 2412*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER Destination is NULL, but DestinationSize is 2413*1370a723SSascha Wildner not zero on input. 2414*1370a723SSascha Wildner 2415*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER Source is non-NULL, and (Source + 2416*1370a723SSascha Wildner SourceSize) would wrap around MAX_ADDRESS. 2417*1370a723SSascha Wildner 2418*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER Destination is non-NULL, and (Destination + 2419*1370a723SSascha Wildner DestinationSize) would wrap around 2420*1370a723SSascha Wildner MAX_ADDRESS, as specified on input. 2421*1370a723SSascha Wildner 2422*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER None of Source and Destination are NULL, 2423*1370a723SSascha Wildner and CHAR8[SourceSize] at Source overlaps 2424*1370a723SSascha Wildner UINT8[DestinationSize] at Destination, as 2425*1370a723SSascha Wildner specified on input. 2426*1370a723SSascha Wildner 2427*1370a723SSascha Wildner @retval RETURN_INVALID_PARAMETER Invalid CHAR8 element encountered in 2428*1370a723SSascha Wildner Source. 2429*1370a723SSascha Wildner **/ 2430*1370a723SSascha Wildner RETURN_STATUS 2431*1370a723SSascha Wildner EFIAPI 2432*1370a723SSascha Wildner Base64Decode ( 2433*1370a723SSascha Wildner IN CONST CHAR8 *Source OPTIONAL, 2434*1370a723SSascha Wildner IN UINTN SourceSize, 2435*1370a723SSascha Wildner OUT UINT8 *Destination OPTIONAL, 2436*1370a723SSascha Wildner IN OUT UINTN *DestinationSize 2437*1370a723SSascha Wildner ); 2438*1370a723SSascha Wildner 2439*1370a723SSascha Wildner /** 2440*1370a723SSascha Wildner Converts an 8-bit value to an 8-bit BCD value. 2441*1370a723SSascha Wildner 2442*1370a723SSascha Wildner Converts the 8-bit value specified by Value to BCD. The BCD value is 2443*1370a723SSascha Wildner returned. 2444*1370a723SSascha Wildner 2445*1370a723SSascha Wildner If Value >= 100, then ASSERT(). 2446*1370a723SSascha Wildner 2447*1370a723SSascha Wildner @param Value The 8-bit value to convert to BCD. Range 0..99. 2448*1370a723SSascha Wildner 2449*1370a723SSascha Wildner @return The BCD value. 2450*1370a723SSascha Wildner 2451*1370a723SSascha Wildner **/ 2452*1370a723SSascha Wildner UINT8 2453*1370a723SSascha Wildner EFIAPI 2454*1370a723SSascha Wildner DecimalToBcd8 ( 2455*1370a723SSascha Wildner IN UINT8 Value 2456*1370a723SSascha Wildner ); 2457*1370a723SSascha Wildner 2458*1370a723SSascha Wildner /** 2459*1370a723SSascha Wildner Converts an 8-bit BCD value to an 8-bit value. 2460*1370a723SSascha Wildner 2461*1370a723SSascha Wildner Converts the 8-bit BCD value specified by Value to an 8-bit value. The 8-bit 2462*1370a723SSascha Wildner value is returned. 2463*1370a723SSascha Wildner 2464*1370a723SSascha Wildner If Value >= 0xA0, then ASSERT(). 2465*1370a723SSascha Wildner If (Value & 0x0F) >= 0x0A, then ASSERT(). 2466*1370a723SSascha Wildner 2467*1370a723SSascha Wildner @param Value The 8-bit BCD value to convert to an 8-bit value. 2468*1370a723SSascha Wildner 2469*1370a723SSascha Wildner @return The 8-bit value is returned. 2470*1370a723SSascha Wildner 2471*1370a723SSascha Wildner **/ 2472*1370a723SSascha Wildner UINT8 2473*1370a723SSascha Wildner EFIAPI 2474*1370a723SSascha Wildner BcdToDecimal8 ( 2475*1370a723SSascha Wildner IN UINT8 Value 2476*1370a723SSascha Wildner ); 2477*1370a723SSascha Wildner 2478*1370a723SSascha Wildner // 2479*1370a723SSascha Wildner // File Path Manipulation Functions 2480*1370a723SSascha Wildner // 2481*1370a723SSascha Wildner 2482*1370a723SSascha Wildner /** 2483*1370a723SSascha Wildner Removes the last directory or file entry in a path. 2484*1370a723SSascha Wildner 2485*1370a723SSascha Wildner @param[in, out] Path The pointer to the path to modify. 2486*1370a723SSascha Wildner 2487*1370a723SSascha Wildner @retval FALSE Nothing was found to remove. 2488*1370a723SSascha Wildner @retval TRUE A directory or file was removed. 2489*1370a723SSascha Wildner **/ 2490*1370a723SSascha Wildner BOOLEAN 2491*1370a723SSascha Wildner EFIAPI 2492*1370a723SSascha Wildner PathRemoveLastItem ( 2493*1370a723SSascha Wildner IN OUT CHAR16 *Path 2494*1370a723SSascha Wildner ); 2495*1370a723SSascha Wildner 2496*1370a723SSascha Wildner /** 2497*1370a723SSascha Wildner Function to clean up paths. 2498*1370a723SSascha Wildner - Single periods in the path are removed. 2499*1370a723SSascha Wildner - Double periods in the path are removed along with a single parent directory. 2500*1370a723SSascha Wildner - Forward slashes L'/' are converted to backward slashes L'\'. 2501*1370a723SSascha Wildner 2502*1370a723SSascha Wildner This will be done inline and the existing buffer may be larger than required 2503*1370a723SSascha Wildner upon completion. 2504*1370a723SSascha Wildner 2505*1370a723SSascha Wildner @param[in] Path The pointer to the string containing the path. 2506*1370a723SSascha Wildner 2507*1370a723SSascha Wildner @return Returns Path, otherwise returns NULL to indicate that an error has occurred. 2508*1370a723SSascha Wildner **/ 2509*1370a723SSascha Wildner CHAR16 * 2510*1370a723SSascha Wildner EFIAPI 2511*1370a723SSascha Wildner PathCleanUpDirectories ( 2512*1370a723SSascha Wildner IN CHAR16 *Path 2513*1370a723SSascha Wildner ); 2514*1370a723SSascha Wildner 2515*1370a723SSascha Wildner // 2516*1370a723SSascha Wildner // Linked List Functions and Macros 2517*1370a723SSascha Wildner // 2518*1370a723SSascha Wildner 2519*1370a723SSascha Wildner /** 2520*1370a723SSascha Wildner Initializes the head node of a doubly linked list that is declared as a 2521*1370a723SSascha Wildner global variable in a module. 2522*1370a723SSascha Wildner 2523*1370a723SSascha Wildner Initializes the forward and backward links of a new linked list. After 2524*1370a723SSascha Wildner initializing a linked list with this macro, the other linked list functions 2525*1370a723SSascha Wildner may be used to add and remove nodes from the linked list. This macro results 2526*1370a723SSascha Wildner in smaller executables by initializing the linked list in the data section, 2527*1370a723SSascha Wildner instead if calling the InitializeListHead() function to perform the 2528*1370a723SSascha Wildner equivalent operation. 2529*1370a723SSascha Wildner 2530*1370a723SSascha Wildner @param ListHead The head note of a list to initialize. 2531*1370a723SSascha Wildner 2532*1370a723SSascha Wildner **/ 2533*1370a723SSascha Wildner #define INITIALIZE_LIST_HEAD_VARIABLE(ListHead) {&(ListHead), &(ListHead)} 2534*1370a723SSascha Wildner 2535*1370a723SSascha Wildner /** 2536*1370a723SSascha Wildner Iterates over each node in a doubly linked list using each node's forward link. 2537*1370a723SSascha Wildner 2538*1370a723SSascha Wildner @param Entry A pointer to a list node used as a loop cursor during iteration 2539*1370a723SSascha Wildner @param ListHead The head node of the doubly linked list 2540*1370a723SSascha Wildner 2541*1370a723SSascha Wildner **/ 2542*1370a723SSascha Wildner #define BASE_LIST_FOR_EACH(Entry, ListHead) \ 2543*1370a723SSascha Wildner for(Entry = (ListHead)->ForwardLink; Entry != (ListHead); Entry = Entry->ForwardLink) 2544*1370a723SSascha Wildner 2545*1370a723SSascha Wildner /** 2546*1370a723SSascha Wildner Iterates over each node in a doubly linked list using each node's forward link 2547*1370a723SSascha Wildner with safety against node removal. 2548*1370a723SSascha Wildner 2549*1370a723SSascha Wildner This macro uses NextEntry to temporarily store the next list node so the node 2550*1370a723SSascha Wildner pointed to by Entry may be deleted in the current loop iteration step and 2551*1370a723SSascha Wildner iteration can continue from the node pointed to by NextEntry. 2552*1370a723SSascha Wildner 2553*1370a723SSascha Wildner @param Entry A pointer to a list node used as a loop cursor during iteration 2554*1370a723SSascha Wildner @param NextEntry A pointer to a list node used to temporarily store the next node 2555*1370a723SSascha Wildner @param ListHead The head node of the doubly linked list 2556*1370a723SSascha Wildner 2557*1370a723SSascha Wildner **/ 2558*1370a723SSascha Wildner #define BASE_LIST_FOR_EACH_SAFE(Entry, NextEntry, ListHead) \ 2559*1370a723SSascha Wildner for(Entry = (ListHead)->ForwardLink, NextEntry = Entry->ForwardLink;\ 2560*1370a723SSascha Wildner Entry != (ListHead); Entry = NextEntry, NextEntry = Entry->ForwardLink) 2561*1370a723SSascha Wildner 2562*1370a723SSascha Wildner /** 2563*1370a723SSascha Wildner Checks whether FirstEntry and SecondEntry are part of the same doubly-linked 2564*1370a723SSascha Wildner list. 2565*1370a723SSascha Wildner 2566*1370a723SSascha Wildner If FirstEntry is NULL, then ASSERT(). 2567*1370a723SSascha Wildner If FirstEntry->ForwardLink is NULL, then ASSERT(). 2568*1370a723SSascha Wildner If FirstEntry->BackLink is NULL, then ASSERT(). 2569*1370a723SSascha Wildner If SecondEntry is NULL, then ASSERT(); 2570*1370a723SSascha Wildner If PcdMaximumLinkedListLength is not zero, and List contains more than 2571*1370a723SSascha Wildner PcdMaximumLinkedListLength nodes, then ASSERT(). 2572*1370a723SSascha Wildner 2573*1370a723SSascha Wildner @param FirstEntry A pointer to a node in a linked list. 2574*1370a723SSascha Wildner @param SecondEntry A pointer to the node to locate. 2575*1370a723SSascha Wildner 2576*1370a723SSascha Wildner @retval TRUE SecondEntry is in the same doubly-linked list as FirstEntry. 2577*1370a723SSascha Wildner @retval FALSE SecondEntry isn't in the same doubly-linked list as FirstEntry, 2578*1370a723SSascha Wildner or FirstEntry is invalid. 2579*1370a723SSascha Wildner 2580*1370a723SSascha Wildner **/ 2581*1370a723SSascha Wildner BOOLEAN 2582*1370a723SSascha Wildner EFIAPI 2583*1370a723SSascha Wildner IsNodeInList ( 2584*1370a723SSascha Wildner IN CONST LIST_ENTRY *FirstEntry, 2585*1370a723SSascha Wildner IN CONST LIST_ENTRY *SecondEntry 2586*1370a723SSascha Wildner ); 2587*1370a723SSascha Wildner 2588*1370a723SSascha Wildner /** 2589*1370a723SSascha Wildner Initializes the head node of a doubly linked list, and returns the pointer to 2590*1370a723SSascha Wildner the head node of the doubly linked list. 2591*1370a723SSascha Wildner 2592*1370a723SSascha Wildner Initializes the forward and backward links of a new linked list. After 2593*1370a723SSascha Wildner initializing a linked list with this function, the other linked list 2594*1370a723SSascha Wildner functions may be used to add and remove nodes from the linked list. It is up 2595*1370a723SSascha Wildner to the caller of this function to allocate the memory for ListHead. 2596*1370a723SSascha Wildner 2597*1370a723SSascha Wildner If ListHead is NULL, then ASSERT(). 2598*1370a723SSascha Wildner 2599*1370a723SSascha Wildner @param ListHead A pointer to the head node of a new doubly linked list. 2600*1370a723SSascha Wildner 2601*1370a723SSascha Wildner @return ListHead 2602*1370a723SSascha Wildner 2603*1370a723SSascha Wildner **/ 2604*1370a723SSascha Wildner LIST_ENTRY * 2605*1370a723SSascha Wildner EFIAPI 2606*1370a723SSascha Wildner InitializeListHead ( 2607*1370a723SSascha Wildner IN OUT LIST_ENTRY *ListHead 2608*1370a723SSascha Wildner ); 2609*1370a723SSascha Wildner 2610*1370a723SSascha Wildner /** 2611*1370a723SSascha Wildner Adds a node to the beginning of a doubly linked list, and returns the pointer 2612*1370a723SSascha Wildner to the head node of the doubly linked list. 2613*1370a723SSascha Wildner 2614*1370a723SSascha Wildner Adds the node Entry at the beginning of the doubly linked list denoted by 2615*1370a723SSascha Wildner ListHead, and returns ListHead. 2616*1370a723SSascha Wildner 2617*1370a723SSascha Wildner If ListHead is NULL, then ASSERT(). 2618*1370a723SSascha Wildner If Entry is NULL, then ASSERT(). 2619*1370a723SSascha Wildner If ListHead was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or 2620*1370a723SSascha Wildner InitializeListHead(), then ASSERT(). 2621*1370a723SSascha Wildner If PcdMaximumLinkedListLength is not zero, and prior to insertion the number 2622*1370a723SSascha Wildner of nodes in ListHead, including the ListHead node, is greater than or 2623*1370a723SSascha Wildner equal to PcdMaximumLinkedListLength, then ASSERT(). 2624*1370a723SSascha Wildner 2625*1370a723SSascha Wildner @param ListHead A pointer to the head node of a doubly linked list. 2626*1370a723SSascha Wildner @param Entry A pointer to a node that is to be inserted at the beginning 2627*1370a723SSascha Wildner of a doubly linked list. 2628*1370a723SSascha Wildner 2629*1370a723SSascha Wildner @return ListHead 2630*1370a723SSascha Wildner 2631*1370a723SSascha Wildner **/ 2632*1370a723SSascha Wildner LIST_ENTRY * 2633*1370a723SSascha Wildner EFIAPI 2634*1370a723SSascha Wildner InsertHeadList ( 2635*1370a723SSascha Wildner IN OUT LIST_ENTRY *ListHead, 2636*1370a723SSascha Wildner IN OUT LIST_ENTRY *Entry 2637*1370a723SSascha Wildner ); 2638*1370a723SSascha Wildner 2639*1370a723SSascha Wildner /** 2640*1370a723SSascha Wildner Adds a node to the end of a doubly linked list, and returns the pointer to 2641*1370a723SSascha Wildner the head node of the doubly linked list. 2642*1370a723SSascha Wildner 2643*1370a723SSascha Wildner Adds the node Entry to the end of the doubly linked list denoted by ListHead, 2644*1370a723SSascha Wildner and returns ListHead. 2645*1370a723SSascha Wildner 2646*1370a723SSascha Wildner If ListHead is NULL, then ASSERT(). 2647*1370a723SSascha Wildner If Entry is NULL, then ASSERT(). 2648*1370a723SSascha Wildner If ListHead was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or 2649*1370a723SSascha Wildner InitializeListHead(), then ASSERT(). 2650*1370a723SSascha Wildner If PcdMaximumLinkedListLength is not zero, and prior to insertion the number 2651*1370a723SSascha Wildner of nodes in ListHead, including the ListHead node, is greater than or 2652*1370a723SSascha Wildner equal to PcdMaximumLinkedListLength, then ASSERT(). 2653*1370a723SSascha Wildner 2654*1370a723SSascha Wildner @param ListHead A pointer to the head node of a doubly linked list. 2655*1370a723SSascha Wildner @param Entry A pointer to a node that is to be added at the end of the 2656*1370a723SSascha Wildner doubly linked list. 2657*1370a723SSascha Wildner 2658*1370a723SSascha Wildner @return ListHead 2659*1370a723SSascha Wildner 2660*1370a723SSascha Wildner **/ 2661*1370a723SSascha Wildner LIST_ENTRY * 2662*1370a723SSascha Wildner EFIAPI 2663*1370a723SSascha Wildner InsertTailList ( 2664*1370a723SSascha Wildner IN OUT LIST_ENTRY *ListHead, 2665*1370a723SSascha Wildner IN OUT LIST_ENTRY *Entry 2666*1370a723SSascha Wildner ); 2667*1370a723SSascha Wildner 2668*1370a723SSascha Wildner /** 2669*1370a723SSascha Wildner Retrieves the first node of a doubly linked list. 2670*1370a723SSascha Wildner 2671*1370a723SSascha Wildner Returns the first node of a doubly linked list. List must have been 2672*1370a723SSascha Wildner initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). 2673*1370a723SSascha Wildner If List is empty, then List is returned. 2674*1370a723SSascha Wildner 2675*1370a723SSascha Wildner If List is NULL, then ASSERT(). 2676*1370a723SSascha Wildner If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or 2677*1370a723SSascha Wildner InitializeListHead(), then ASSERT(). 2678*1370a723SSascha Wildner If PcdMaximumLinkedListLength is not zero, and the number of nodes 2679*1370a723SSascha Wildner in List, including the List node, is greater than or equal to 2680*1370a723SSascha Wildner PcdMaximumLinkedListLength, then ASSERT(). 2681*1370a723SSascha Wildner 2682*1370a723SSascha Wildner @param List A pointer to the head node of a doubly linked list. 2683*1370a723SSascha Wildner 2684*1370a723SSascha Wildner @return The first node of a doubly linked list. 2685*1370a723SSascha Wildner @retval List The list is empty. 2686*1370a723SSascha Wildner 2687*1370a723SSascha Wildner **/ 2688*1370a723SSascha Wildner LIST_ENTRY * 2689*1370a723SSascha Wildner EFIAPI 2690*1370a723SSascha Wildner GetFirstNode ( 2691*1370a723SSascha Wildner IN CONST LIST_ENTRY *List 2692*1370a723SSascha Wildner ); 2693*1370a723SSascha Wildner 2694*1370a723SSascha Wildner /** 2695*1370a723SSascha Wildner Retrieves the next node of a doubly linked list. 2696*1370a723SSascha Wildner 2697*1370a723SSascha Wildner Returns the node of a doubly linked list that follows Node. 2698*1370a723SSascha Wildner List must have been initialized with INTIALIZE_LIST_HEAD_VARIABLE() 2699*1370a723SSascha Wildner or InitializeListHead(). If List is empty, then List is returned. 2700*1370a723SSascha Wildner 2701*1370a723SSascha Wildner If List is NULL, then ASSERT(). 2702*1370a723SSascha Wildner If Node is NULL, then ASSERT(). 2703*1370a723SSascha Wildner If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or 2704*1370a723SSascha Wildner InitializeListHead(), then ASSERT(). 2705*1370a723SSascha Wildner If PcdMaximumLinkedListLength is not zero, and List contains more than 2706*1370a723SSascha Wildner PcdMaximumLinkedListLength nodes, then ASSERT(). 2707*1370a723SSascha Wildner If PcdVerifyNodeInList is TRUE and Node is not a node in List, then ASSERT(). 2708*1370a723SSascha Wildner 2709*1370a723SSascha Wildner @param List A pointer to the head node of a doubly linked list. 2710*1370a723SSascha Wildner @param Node A pointer to a node in the doubly linked list. 2711*1370a723SSascha Wildner 2712*1370a723SSascha Wildner @return The pointer to the next node if one exists. Otherwise List is returned. 2713*1370a723SSascha Wildner 2714*1370a723SSascha Wildner **/ 2715*1370a723SSascha Wildner LIST_ENTRY * 2716*1370a723SSascha Wildner EFIAPI 2717*1370a723SSascha Wildner GetNextNode ( 2718*1370a723SSascha Wildner IN CONST LIST_ENTRY *List, 2719*1370a723SSascha Wildner IN CONST LIST_ENTRY *Node 2720*1370a723SSascha Wildner ); 2721*1370a723SSascha Wildner 2722*1370a723SSascha Wildner /** 2723*1370a723SSascha Wildner Retrieves the previous node of a doubly linked list. 2724*1370a723SSascha Wildner 2725*1370a723SSascha Wildner Returns the node of a doubly linked list that precedes Node. 2726*1370a723SSascha Wildner List must have been initialized with INTIALIZE_LIST_HEAD_VARIABLE() 2727*1370a723SSascha Wildner or InitializeListHead(). If List is empty, then List is returned. 2728*1370a723SSascha Wildner 2729*1370a723SSascha Wildner If List is NULL, then ASSERT(). 2730*1370a723SSascha Wildner If Node is NULL, then ASSERT(). 2731*1370a723SSascha Wildner If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or 2732*1370a723SSascha Wildner InitializeListHead(), then ASSERT(). 2733*1370a723SSascha Wildner If PcdMaximumLinkedListLength is not zero, and List contains more than 2734*1370a723SSascha Wildner PcdMaximumLinkedListLength nodes, then ASSERT(). 2735*1370a723SSascha Wildner If PcdVerifyNodeInList is TRUE and Node is not a node in List, then ASSERT(). 2736*1370a723SSascha Wildner 2737*1370a723SSascha Wildner @param List A pointer to the head node of a doubly linked list. 2738*1370a723SSascha Wildner @param Node A pointer to a node in the doubly linked list. 2739*1370a723SSascha Wildner 2740*1370a723SSascha Wildner @return The pointer to the previous node if one exists. Otherwise List is returned. 2741*1370a723SSascha Wildner 2742*1370a723SSascha Wildner **/ 2743*1370a723SSascha Wildner LIST_ENTRY * 2744*1370a723SSascha Wildner EFIAPI 2745*1370a723SSascha Wildner GetPreviousNode ( 2746*1370a723SSascha Wildner IN CONST LIST_ENTRY *List, 2747*1370a723SSascha Wildner IN CONST LIST_ENTRY *Node 2748*1370a723SSascha Wildner ); 2749*1370a723SSascha Wildner 2750*1370a723SSascha Wildner /** 2751*1370a723SSascha Wildner Checks to see if a doubly linked list is empty or not. 2752*1370a723SSascha Wildner 2753*1370a723SSascha Wildner Checks to see if the doubly linked list is empty. If the linked list contains 2754*1370a723SSascha Wildner zero nodes, this function returns TRUE. Otherwise, it returns FALSE. 2755*1370a723SSascha Wildner 2756*1370a723SSascha Wildner If ListHead is NULL, then ASSERT(). 2757*1370a723SSascha Wildner If ListHead was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or 2758*1370a723SSascha Wildner InitializeListHead(), then ASSERT(). 2759*1370a723SSascha Wildner If PcdMaximumLinkedListLength is not zero, and the number of nodes 2760*1370a723SSascha Wildner in List, including the List node, is greater than or equal to 2761*1370a723SSascha Wildner PcdMaximumLinkedListLength, then ASSERT(). 2762*1370a723SSascha Wildner 2763*1370a723SSascha Wildner @param ListHead A pointer to the head node of a doubly linked list. 2764*1370a723SSascha Wildner 2765*1370a723SSascha Wildner @retval TRUE The linked list is empty. 2766*1370a723SSascha Wildner @retval FALSE The linked list is not empty. 2767*1370a723SSascha Wildner 2768*1370a723SSascha Wildner **/ 2769*1370a723SSascha Wildner BOOLEAN 2770*1370a723SSascha Wildner EFIAPI 2771*1370a723SSascha Wildner IsListEmpty ( 2772*1370a723SSascha Wildner IN CONST LIST_ENTRY *ListHead 2773*1370a723SSascha Wildner ); 2774*1370a723SSascha Wildner 2775*1370a723SSascha Wildner /** 2776*1370a723SSascha Wildner Determines if a node in a doubly linked list is the head node of a the same 2777*1370a723SSascha Wildner doubly linked list. This function is typically used to terminate a loop that 2778*1370a723SSascha Wildner traverses all the nodes in a doubly linked list starting with the head node. 2779*1370a723SSascha Wildner 2780*1370a723SSascha Wildner Returns TRUE if Node is equal to List. Returns FALSE if Node is one of the 2781*1370a723SSascha Wildner nodes in the doubly linked list specified by List. List must have been 2782*1370a723SSascha Wildner initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). 2783*1370a723SSascha Wildner 2784*1370a723SSascha Wildner If List is NULL, then ASSERT(). 2785*1370a723SSascha Wildner If Node is NULL, then ASSERT(). 2786*1370a723SSascha Wildner If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(), 2787*1370a723SSascha Wildner then ASSERT(). 2788*1370a723SSascha Wildner If PcdMaximumLinkedListLength is not zero, and the number of nodes 2789*1370a723SSascha Wildner in List, including the List node, is greater than or equal to 2790*1370a723SSascha Wildner PcdMaximumLinkedListLength, then ASSERT(). 2791*1370a723SSascha Wildner If PcdVerifyNodeInList is TRUE and Node is not a node in List the and Node is not equal 2792*1370a723SSascha Wildner to List, then ASSERT(). 2793*1370a723SSascha Wildner 2794*1370a723SSascha Wildner @param List A pointer to the head node of a doubly linked list. 2795*1370a723SSascha Wildner @param Node A pointer to a node in the doubly linked list. 2796*1370a723SSascha Wildner 2797*1370a723SSascha Wildner @retval TRUE Node is the head of the doubly-linked list pointed by List. 2798*1370a723SSascha Wildner @retval FALSE Node is not the head of the doubly-linked list pointed by List. 2799*1370a723SSascha Wildner 2800*1370a723SSascha Wildner **/ 2801*1370a723SSascha Wildner BOOLEAN 2802*1370a723SSascha Wildner EFIAPI 2803*1370a723SSascha Wildner IsNull ( 2804*1370a723SSascha Wildner IN CONST LIST_ENTRY *List, 2805*1370a723SSascha Wildner IN CONST LIST_ENTRY *Node 2806*1370a723SSascha Wildner ); 2807*1370a723SSascha Wildner 2808*1370a723SSascha Wildner /** 2809*1370a723SSascha Wildner Determines if a node the last node in a doubly linked list. 2810*1370a723SSascha Wildner 2811*1370a723SSascha Wildner Returns TRUE if Node is the last node in the doubly linked list specified by 2812*1370a723SSascha Wildner List. Otherwise, FALSE is returned. List must have been initialized with 2813*1370a723SSascha Wildner INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). 2814*1370a723SSascha Wildner 2815*1370a723SSascha Wildner If List is NULL, then ASSERT(). 2816*1370a723SSascha Wildner If Node is NULL, then ASSERT(). 2817*1370a723SSascha Wildner If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or 2818*1370a723SSascha Wildner InitializeListHead(), then ASSERT(). 2819*1370a723SSascha Wildner If PcdMaximumLinkedListLength is not zero, and the number of nodes 2820*1370a723SSascha Wildner in List, including the List node, is greater than or equal to 2821*1370a723SSascha Wildner PcdMaximumLinkedListLength, then ASSERT(). 2822*1370a723SSascha Wildner If PcdVerifyNodeInList is TRUE and Node is not a node in List, then ASSERT(). 2823*1370a723SSascha Wildner 2824*1370a723SSascha Wildner @param List A pointer to the head node of a doubly linked list. 2825*1370a723SSascha Wildner @param Node A pointer to a node in the doubly linked list. 2826*1370a723SSascha Wildner 2827*1370a723SSascha Wildner @retval TRUE Node is the last node in the linked list. 2828*1370a723SSascha Wildner @retval FALSE Node is not the last node in the linked list. 2829*1370a723SSascha Wildner 2830*1370a723SSascha Wildner **/ 2831*1370a723SSascha Wildner BOOLEAN 2832*1370a723SSascha Wildner EFIAPI 2833*1370a723SSascha Wildner IsNodeAtEnd ( 2834*1370a723SSascha Wildner IN CONST LIST_ENTRY *List, 2835*1370a723SSascha Wildner IN CONST LIST_ENTRY *Node 2836*1370a723SSascha Wildner ); 2837*1370a723SSascha Wildner 2838*1370a723SSascha Wildner /** 2839*1370a723SSascha Wildner Swaps the location of two nodes in a doubly linked list, and returns the 2840*1370a723SSascha Wildner first node after the swap. 2841*1370a723SSascha Wildner 2842*1370a723SSascha Wildner If FirstEntry is identical to SecondEntry, then SecondEntry is returned. 2843*1370a723SSascha Wildner Otherwise, the location of the FirstEntry node is swapped with the location 2844*1370a723SSascha Wildner of the SecondEntry node in a doubly linked list. SecondEntry must be in the 2845*1370a723SSascha Wildner same double linked list as FirstEntry and that double linked list must have 2846*1370a723SSascha Wildner been initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(). 2847*1370a723SSascha Wildner SecondEntry is returned after the nodes are swapped. 2848*1370a723SSascha Wildner 2849*1370a723SSascha Wildner If FirstEntry is NULL, then ASSERT(). 2850*1370a723SSascha Wildner If SecondEntry is NULL, then ASSERT(). 2851*1370a723SSascha Wildner If PcdVerifyNodeInList is TRUE and SecondEntry and FirstEntry are not in the 2852*1370a723SSascha Wildner same linked list, then ASSERT(). 2853*1370a723SSascha Wildner If PcdMaximumLinkedListLength is not zero, and the number of nodes in the 2854*1370a723SSascha Wildner linked list containing the FirstEntry and SecondEntry nodes, including 2855*1370a723SSascha Wildner the FirstEntry and SecondEntry nodes, is greater than or equal to 2856*1370a723SSascha Wildner PcdMaximumLinkedListLength, then ASSERT(). 2857*1370a723SSascha Wildner 2858*1370a723SSascha Wildner @param FirstEntry A pointer to a node in a linked list. 2859*1370a723SSascha Wildner @param SecondEntry A pointer to another node in the same linked list. 2860*1370a723SSascha Wildner 2861*1370a723SSascha Wildner @return SecondEntry. 2862*1370a723SSascha Wildner 2863*1370a723SSascha Wildner **/ 2864*1370a723SSascha Wildner LIST_ENTRY * 2865*1370a723SSascha Wildner EFIAPI 2866*1370a723SSascha Wildner SwapListEntries ( 2867*1370a723SSascha Wildner IN OUT LIST_ENTRY *FirstEntry, 2868*1370a723SSascha Wildner IN OUT LIST_ENTRY *SecondEntry 2869*1370a723SSascha Wildner ); 2870*1370a723SSascha Wildner 2871*1370a723SSascha Wildner /** 2872*1370a723SSascha Wildner Removes a node from a doubly linked list, and returns the node that follows 2873*1370a723SSascha Wildner the removed node. 2874*1370a723SSascha Wildner 2875*1370a723SSascha Wildner Removes the node Entry from a doubly linked list. It is up to the caller of 2876*1370a723SSascha Wildner this function to release the memory used by this node if that is required. On 2877*1370a723SSascha Wildner exit, the node following Entry in the doubly linked list is returned. If 2878*1370a723SSascha Wildner Entry is the only node in the linked list, then the head node of the linked 2879*1370a723SSascha Wildner list is returned. 2880*1370a723SSascha Wildner 2881*1370a723SSascha Wildner If Entry is NULL, then ASSERT(). 2882*1370a723SSascha Wildner If Entry is the head node of an empty list, then ASSERT(). 2883*1370a723SSascha Wildner If PcdMaximumLinkedListLength is not zero, and the number of nodes in the 2884*1370a723SSascha Wildner linked list containing Entry, including the Entry node, is greater than 2885*1370a723SSascha Wildner or equal to PcdMaximumLinkedListLength, then ASSERT(). 2886*1370a723SSascha Wildner 2887*1370a723SSascha Wildner @param Entry A pointer to a node in a linked list. 2888*1370a723SSascha Wildner 2889*1370a723SSascha Wildner @return Entry. 2890*1370a723SSascha Wildner 2891*1370a723SSascha Wildner **/ 2892*1370a723SSascha Wildner LIST_ENTRY * 2893*1370a723SSascha Wildner EFIAPI 2894*1370a723SSascha Wildner RemoveEntryList ( 2895*1370a723SSascha Wildner IN CONST LIST_ENTRY *Entry 2896*1370a723SSascha Wildner ); 2897*1370a723SSascha Wildner 2898*1370a723SSascha Wildner // 2899*1370a723SSascha Wildner // Math Services 2900*1370a723SSascha Wildner // 2901*1370a723SSascha Wildner 2902*1370a723SSascha Wildner /** 2903*1370a723SSascha Wildner Prototype for comparison function for any two element types. 2904*1370a723SSascha Wildner 2905*1370a723SSascha Wildner @param[in] Buffer1 The pointer to first buffer. 2906*1370a723SSascha Wildner @param[in] Buffer2 The pointer to second buffer. 2907*1370a723SSascha Wildner 2908*1370a723SSascha Wildner @retval 0 Buffer1 equal to Buffer2. 2909*1370a723SSascha Wildner @return <0 Buffer1 is less than Buffer2. 2910*1370a723SSascha Wildner @return >0 Buffer1 is greater than Buffer2. 2911*1370a723SSascha Wildner **/ 2912*1370a723SSascha Wildner typedef 2913*1370a723SSascha Wildner INTN 2914*1370a723SSascha Wildner (EFIAPI *BASE_SORT_COMPARE)( 2915*1370a723SSascha Wildner IN CONST VOID *Buffer1, 2916*1370a723SSascha Wildner IN CONST VOID *Buffer2 2917*1370a723SSascha Wildner ); 2918*1370a723SSascha Wildner 2919*1370a723SSascha Wildner /** 2920*1370a723SSascha Wildner This function is identical to perform QuickSort, 2921*1370a723SSascha Wildner except that is uses the pre-allocated buffer so the in place sorting does not need to 2922*1370a723SSascha Wildner allocate and free buffers constantly. 2923*1370a723SSascha Wildner 2924*1370a723SSascha Wildner Each element must be equal sized. 2925*1370a723SSascha Wildner 2926*1370a723SSascha Wildner if BufferToSort is NULL, then ASSERT. 2927*1370a723SSascha Wildner if CompareFunction is NULL, then ASSERT. 2928*1370a723SSascha Wildner if BufferOneElement is NULL, then ASSERT. 2929*1370a723SSascha Wildner if ElementSize is < 1, then ASSERT. 2930*1370a723SSascha Wildner 2931*1370a723SSascha Wildner if Count is < 2 then perform no action. 2932*1370a723SSascha Wildner 2933*1370a723SSascha Wildner @param[in, out] BufferToSort on call a Buffer of (possibly sorted) elements 2934*1370a723SSascha Wildner on return a buffer of sorted elements 2935*1370a723SSascha Wildner @param[in] Count the number of elements in the buffer to sort 2936*1370a723SSascha Wildner @param[in] ElementSize Size of an element in bytes 2937*1370a723SSascha Wildner @param[in] CompareFunction The function to call to perform the comparison 2938*1370a723SSascha Wildner of any 2 elements 2939*1370a723SSascha Wildner @param[out] BufferOneElement Caller provided buffer whose size equals to ElementSize. 2940*1370a723SSascha Wildner It's used by QuickSort() for swapping in sorting. 2941*1370a723SSascha Wildner **/ 2942*1370a723SSascha Wildner VOID 2943*1370a723SSascha Wildner EFIAPI 2944*1370a723SSascha Wildner QuickSort ( 2945*1370a723SSascha Wildner IN OUT VOID *BufferToSort, 2946*1370a723SSascha Wildner IN CONST UINTN Count, 2947*1370a723SSascha Wildner IN CONST UINTN ElementSize, 2948*1370a723SSascha Wildner IN BASE_SORT_COMPARE CompareFunction, 2949*1370a723SSascha Wildner OUT VOID *BufferOneElement 2950*1370a723SSascha Wildner ); 2951*1370a723SSascha Wildner 2952*1370a723SSascha Wildner /** 2953*1370a723SSascha Wildner Shifts a 64-bit integer left between 0 and 63 bits. The low bits are filled 2954*1370a723SSascha Wildner with zeros. The shifted value is returned. 2955*1370a723SSascha Wildner 2956*1370a723SSascha Wildner This function shifts the 64-bit value Operand to the left by Count bits. The 2957*1370a723SSascha Wildner low Count bits are set to zero. The shifted value is returned. 2958*1370a723SSascha Wildner 2959*1370a723SSascha Wildner If Count is greater than 63, then ASSERT(). 2960*1370a723SSascha Wildner 2961*1370a723SSascha Wildner @param Operand The 64-bit operand to shift left. 2962*1370a723SSascha Wildner @param Count The number of bits to shift left. 2963*1370a723SSascha Wildner 2964*1370a723SSascha Wildner @return Operand << Count. 2965*1370a723SSascha Wildner 2966*1370a723SSascha Wildner **/ 2967*1370a723SSascha Wildner UINT64 2968*1370a723SSascha Wildner EFIAPI 2969*1370a723SSascha Wildner LShiftU64 ( 2970*1370a723SSascha Wildner IN UINT64 Operand, 2971*1370a723SSascha Wildner IN UINTN Count 2972*1370a723SSascha Wildner ); 2973*1370a723SSascha Wildner 2974*1370a723SSascha Wildner /** 2975*1370a723SSascha Wildner Shifts a 64-bit integer right between 0 and 63 bits. This high bits are 2976*1370a723SSascha Wildner filled with zeros. The shifted value is returned. 2977*1370a723SSascha Wildner 2978*1370a723SSascha Wildner This function shifts the 64-bit value Operand to the right by Count bits. The 2979*1370a723SSascha Wildner high Count bits are set to zero. The shifted value is returned. 2980*1370a723SSascha Wildner 2981*1370a723SSascha Wildner If Count is greater than 63, then ASSERT(). 2982*1370a723SSascha Wildner 2983*1370a723SSascha Wildner @param Operand The 64-bit operand to shift right. 2984*1370a723SSascha Wildner @param Count The number of bits to shift right. 2985*1370a723SSascha Wildner 2986*1370a723SSascha Wildner @return Operand >> Count 2987*1370a723SSascha Wildner 2988*1370a723SSascha Wildner **/ 2989*1370a723SSascha Wildner UINT64 2990*1370a723SSascha Wildner EFIAPI 2991*1370a723SSascha Wildner RShiftU64 ( 2992*1370a723SSascha Wildner IN UINT64 Operand, 2993*1370a723SSascha Wildner IN UINTN Count 2994*1370a723SSascha Wildner ); 2995*1370a723SSascha Wildner 2996*1370a723SSascha Wildner /** 2997*1370a723SSascha Wildner Shifts a 64-bit integer right between 0 and 63 bits. The high bits are filled 2998*1370a723SSascha Wildner with original integer's bit 63. The shifted value is returned. 2999*1370a723SSascha Wildner 3000*1370a723SSascha Wildner This function shifts the 64-bit value Operand to the right by Count bits. The 3001*1370a723SSascha Wildner high Count bits are set to bit 63 of Operand. The shifted value is returned. 3002*1370a723SSascha Wildner 3003*1370a723SSascha Wildner If Count is greater than 63, then ASSERT(). 3004*1370a723SSascha Wildner 3005*1370a723SSascha Wildner @param Operand The 64-bit operand to shift right. 3006*1370a723SSascha Wildner @param Count The number of bits to shift right. 3007*1370a723SSascha Wildner 3008*1370a723SSascha Wildner @return Operand >> Count 3009*1370a723SSascha Wildner 3010*1370a723SSascha Wildner **/ 3011*1370a723SSascha Wildner UINT64 3012*1370a723SSascha Wildner EFIAPI 3013*1370a723SSascha Wildner ARShiftU64 ( 3014*1370a723SSascha Wildner IN UINT64 Operand, 3015*1370a723SSascha Wildner IN UINTN Count 3016*1370a723SSascha Wildner ); 3017*1370a723SSascha Wildner 3018*1370a723SSascha Wildner /** 3019*1370a723SSascha Wildner Rotates a 32-bit integer left between 0 and 31 bits, filling the low bits 3020*1370a723SSascha Wildner with the high bits that were rotated. 3021*1370a723SSascha Wildner 3022*1370a723SSascha Wildner This function rotates the 32-bit value Operand to the left by Count bits. The 3023*1370a723SSascha Wildner low Count bits are fill with the high Count bits of Operand. The rotated 3024*1370a723SSascha Wildner value is returned. 3025*1370a723SSascha Wildner 3026*1370a723SSascha Wildner If Count is greater than 31, then ASSERT(). 3027*1370a723SSascha Wildner 3028*1370a723SSascha Wildner @param Operand The 32-bit operand to rotate left. 3029*1370a723SSascha Wildner @param Count The number of bits to rotate left. 3030*1370a723SSascha Wildner 3031*1370a723SSascha Wildner @return Operand << Count 3032*1370a723SSascha Wildner 3033*1370a723SSascha Wildner **/ 3034*1370a723SSascha Wildner UINT32 3035*1370a723SSascha Wildner EFIAPI 3036*1370a723SSascha Wildner LRotU32 ( 3037*1370a723SSascha Wildner IN UINT32 Operand, 3038*1370a723SSascha Wildner IN UINTN Count 3039*1370a723SSascha Wildner ); 3040*1370a723SSascha Wildner 3041*1370a723SSascha Wildner /** 3042*1370a723SSascha Wildner Rotates a 32-bit integer right between 0 and 31 bits, filling the high bits 3043*1370a723SSascha Wildner with the low bits that were rotated. 3044*1370a723SSascha Wildner 3045*1370a723SSascha Wildner This function rotates the 32-bit value Operand to the right by Count bits. 3046*1370a723SSascha Wildner The high Count bits are fill with the low Count bits of Operand. The rotated 3047*1370a723SSascha Wildner value is returned. 3048*1370a723SSascha Wildner 3049*1370a723SSascha Wildner If Count is greater than 31, then ASSERT(). 3050*1370a723SSascha Wildner 3051*1370a723SSascha Wildner @param Operand The 32-bit operand to rotate right. 3052*1370a723SSascha Wildner @param Count The number of bits to rotate right. 3053*1370a723SSascha Wildner 3054*1370a723SSascha Wildner @return Operand >> Count 3055*1370a723SSascha Wildner 3056*1370a723SSascha Wildner **/ 3057*1370a723SSascha Wildner UINT32 3058*1370a723SSascha Wildner EFIAPI 3059*1370a723SSascha Wildner RRotU32 ( 3060*1370a723SSascha Wildner IN UINT32 Operand, 3061*1370a723SSascha Wildner IN UINTN Count 3062*1370a723SSascha Wildner ); 3063*1370a723SSascha Wildner 3064*1370a723SSascha Wildner /** 3065*1370a723SSascha Wildner Rotates a 64-bit integer left between 0 and 63 bits, filling the low bits 3066*1370a723SSascha Wildner with the high bits that were rotated. 3067*1370a723SSascha Wildner 3068*1370a723SSascha Wildner This function rotates the 64-bit value Operand to the left by Count bits. The 3069*1370a723SSascha Wildner low Count bits are fill with the high Count bits of Operand. The rotated 3070*1370a723SSascha Wildner value is returned. 3071*1370a723SSascha Wildner 3072*1370a723SSascha Wildner If Count is greater than 63, then ASSERT(). 3073*1370a723SSascha Wildner 3074*1370a723SSascha Wildner @param Operand The 64-bit operand to rotate left. 3075*1370a723SSascha Wildner @param Count The number of bits to rotate left. 3076*1370a723SSascha Wildner 3077*1370a723SSascha Wildner @return Operand << Count 3078*1370a723SSascha Wildner 3079*1370a723SSascha Wildner **/ 3080*1370a723SSascha Wildner UINT64 3081*1370a723SSascha Wildner EFIAPI 3082*1370a723SSascha Wildner LRotU64 ( 3083*1370a723SSascha Wildner IN UINT64 Operand, 3084*1370a723SSascha Wildner IN UINTN Count 3085*1370a723SSascha Wildner ); 3086*1370a723SSascha Wildner 3087*1370a723SSascha Wildner /** 3088*1370a723SSascha Wildner Rotates a 64-bit integer right between 0 and 63 bits, filling the high bits 3089*1370a723SSascha Wildner with the high low bits that were rotated. 3090*1370a723SSascha Wildner 3091*1370a723SSascha Wildner This function rotates the 64-bit value Operand to the right by Count bits. 3092*1370a723SSascha Wildner The high Count bits are fill with the low Count bits of Operand. The rotated 3093*1370a723SSascha Wildner value is returned. 3094*1370a723SSascha Wildner 3095*1370a723SSascha Wildner If Count is greater than 63, then ASSERT(). 3096*1370a723SSascha Wildner 3097*1370a723SSascha Wildner @param Operand The 64-bit operand to rotate right. 3098*1370a723SSascha Wildner @param Count The number of bits to rotate right. 3099*1370a723SSascha Wildner 3100*1370a723SSascha Wildner @return Operand >> Count 3101*1370a723SSascha Wildner 3102*1370a723SSascha Wildner **/ 3103*1370a723SSascha Wildner UINT64 3104*1370a723SSascha Wildner EFIAPI 3105*1370a723SSascha Wildner RRotU64 ( 3106*1370a723SSascha Wildner IN UINT64 Operand, 3107*1370a723SSascha Wildner IN UINTN Count 3108*1370a723SSascha Wildner ); 3109*1370a723SSascha Wildner 3110*1370a723SSascha Wildner /** 3111*1370a723SSascha Wildner Returns the bit position of the lowest bit set in a 32-bit value. 3112*1370a723SSascha Wildner 3113*1370a723SSascha Wildner This function computes the bit position of the lowest bit set in the 32-bit 3114*1370a723SSascha Wildner value specified by Operand. If Operand is zero, then -1 is returned. 3115*1370a723SSascha Wildner Otherwise, a value between 0 and 31 is returned. 3116*1370a723SSascha Wildner 3117*1370a723SSascha Wildner @param Operand The 32-bit operand to evaluate. 3118*1370a723SSascha Wildner 3119*1370a723SSascha Wildner @retval 0..31 The lowest bit set in Operand was found. 3120*1370a723SSascha Wildner @retval -1 Operand is zero. 3121*1370a723SSascha Wildner 3122*1370a723SSascha Wildner **/ 3123*1370a723SSascha Wildner INTN 3124*1370a723SSascha Wildner EFIAPI 3125*1370a723SSascha Wildner LowBitSet32 ( 3126*1370a723SSascha Wildner IN UINT32 Operand 3127*1370a723SSascha Wildner ); 3128*1370a723SSascha Wildner 3129*1370a723SSascha Wildner /** 3130*1370a723SSascha Wildner Returns the bit position of the lowest bit set in a 64-bit value. 3131*1370a723SSascha Wildner 3132*1370a723SSascha Wildner This function computes the bit position of the lowest bit set in the 64-bit 3133*1370a723SSascha Wildner value specified by Operand. If Operand is zero, then -1 is returned. 3134*1370a723SSascha Wildner Otherwise, a value between 0 and 63 is returned. 3135*1370a723SSascha Wildner 3136*1370a723SSascha Wildner @param Operand The 64-bit operand to evaluate. 3137*1370a723SSascha Wildner 3138*1370a723SSascha Wildner @retval 0..63 The lowest bit set in Operand was found. 3139*1370a723SSascha Wildner @retval -1 Operand is zero. 3140*1370a723SSascha Wildner 3141*1370a723SSascha Wildner 3142*1370a723SSascha Wildner **/ 3143*1370a723SSascha Wildner INTN 3144*1370a723SSascha Wildner EFIAPI 3145*1370a723SSascha Wildner LowBitSet64 ( 3146*1370a723SSascha Wildner IN UINT64 Operand 3147*1370a723SSascha Wildner ); 3148*1370a723SSascha Wildner 3149*1370a723SSascha Wildner /** 3150*1370a723SSascha Wildner Returns the bit position of the highest bit set in a 32-bit value. Equivalent 3151*1370a723SSascha Wildner to log2(x). 3152*1370a723SSascha Wildner 3153*1370a723SSascha Wildner This function computes the bit position of the highest bit set in the 32-bit 3154*1370a723SSascha Wildner value specified by Operand. If Operand is zero, then -1 is returned. 3155*1370a723SSascha Wildner Otherwise, a value between 0 and 31 is returned. 3156*1370a723SSascha Wildner 3157*1370a723SSascha Wildner @param Operand The 32-bit operand to evaluate. 3158*1370a723SSascha Wildner 3159*1370a723SSascha Wildner @retval 0..31 Position of the highest bit set in Operand if found. 3160*1370a723SSascha Wildner @retval -1 Operand is zero. 3161*1370a723SSascha Wildner 3162*1370a723SSascha Wildner **/ 3163*1370a723SSascha Wildner INTN 3164*1370a723SSascha Wildner EFIAPI 3165*1370a723SSascha Wildner HighBitSet32 ( 3166*1370a723SSascha Wildner IN UINT32 Operand 3167*1370a723SSascha Wildner ); 3168*1370a723SSascha Wildner 3169*1370a723SSascha Wildner /** 3170*1370a723SSascha Wildner Returns the bit position of the highest bit set in a 64-bit value. Equivalent 3171*1370a723SSascha Wildner to log2(x). 3172*1370a723SSascha Wildner 3173*1370a723SSascha Wildner This function computes the bit position of the highest bit set in the 64-bit 3174*1370a723SSascha Wildner value specified by Operand. If Operand is zero, then -1 is returned. 3175*1370a723SSascha Wildner Otherwise, a value between 0 and 63 is returned. 3176*1370a723SSascha Wildner 3177*1370a723SSascha Wildner @param Operand The 64-bit operand to evaluate. 3178*1370a723SSascha Wildner 3179*1370a723SSascha Wildner @retval 0..63 Position of the highest bit set in Operand if found. 3180*1370a723SSascha Wildner @retval -1 Operand is zero. 3181*1370a723SSascha Wildner 3182*1370a723SSascha Wildner **/ 3183*1370a723SSascha Wildner INTN 3184*1370a723SSascha Wildner EFIAPI 3185*1370a723SSascha Wildner HighBitSet64 ( 3186*1370a723SSascha Wildner IN UINT64 Operand 3187*1370a723SSascha Wildner ); 3188*1370a723SSascha Wildner 3189*1370a723SSascha Wildner /** 3190*1370a723SSascha Wildner Returns the value of the highest bit set in a 32-bit value. Equivalent to 3191*1370a723SSascha Wildner 1 << log2(x). 3192*1370a723SSascha Wildner 3193*1370a723SSascha Wildner This function computes the value of the highest bit set in the 32-bit value 3194*1370a723SSascha Wildner specified by Operand. If Operand is zero, then zero is returned. 3195*1370a723SSascha Wildner 3196*1370a723SSascha Wildner @param Operand The 32-bit operand to evaluate. 3197*1370a723SSascha Wildner 3198*1370a723SSascha Wildner @return 1 << HighBitSet32(Operand) 3199*1370a723SSascha Wildner @retval 0 Operand is zero. 3200*1370a723SSascha Wildner 3201*1370a723SSascha Wildner **/ 3202*1370a723SSascha Wildner UINT32 3203*1370a723SSascha Wildner EFIAPI 3204*1370a723SSascha Wildner GetPowerOfTwo32 ( 3205*1370a723SSascha Wildner IN UINT32 Operand 3206*1370a723SSascha Wildner ); 3207*1370a723SSascha Wildner 3208*1370a723SSascha Wildner /** 3209*1370a723SSascha Wildner Returns the value of the highest bit set in a 64-bit value. Equivalent to 3210*1370a723SSascha Wildner 1 << log2(x). 3211*1370a723SSascha Wildner 3212*1370a723SSascha Wildner This function computes the value of the highest bit set in the 64-bit value 3213*1370a723SSascha Wildner specified by Operand. If Operand is zero, then zero is returned. 3214*1370a723SSascha Wildner 3215*1370a723SSascha Wildner @param Operand The 64-bit operand to evaluate. 3216*1370a723SSascha Wildner 3217*1370a723SSascha Wildner @return 1 << HighBitSet64(Operand) 3218*1370a723SSascha Wildner @retval 0 Operand is zero. 3219*1370a723SSascha Wildner 3220*1370a723SSascha Wildner **/ 3221*1370a723SSascha Wildner UINT64 3222*1370a723SSascha Wildner EFIAPI 3223*1370a723SSascha Wildner GetPowerOfTwo64 ( 3224*1370a723SSascha Wildner IN UINT64 Operand 3225*1370a723SSascha Wildner ); 3226*1370a723SSascha Wildner 3227*1370a723SSascha Wildner /** 3228*1370a723SSascha Wildner Switches the endianness of a 16-bit integer. 3229*1370a723SSascha Wildner 3230*1370a723SSascha Wildner This function swaps the bytes in a 16-bit unsigned value to switch the value 3231*1370a723SSascha Wildner from little endian to big endian or vice versa. The byte swapped value is 3232*1370a723SSascha Wildner returned. 3233*1370a723SSascha Wildner 3234*1370a723SSascha Wildner @param Value A 16-bit unsigned value. 3235*1370a723SSascha Wildner 3236*1370a723SSascha Wildner @return The byte swapped Value. 3237*1370a723SSascha Wildner 3238*1370a723SSascha Wildner **/ 3239*1370a723SSascha Wildner UINT16 3240*1370a723SSascha Wildner EFIAPI 3241*1370a723SSascha Wildner SwapBytes16 ( 3242*1370a723SSascha Wildner IN UINT16 Value 3243*1370a723SSascha Wildner ); 3244*1370a723SSascha Wildner 3245*1370a723SSascha Wildner /** 3246*1370a723SSascha Wildner Switches the endianness of a 32-bit integer. 3247*1370a723SSascha Wildner 3248*1370a723SSascha Wildner This function swaps the bytes in a 32-bit unsigned value to switch the value 3249*1370a723SSascha Wildner from little endian to big endian or vice versa. The byte swapped value is 3250*1370a723SSascha Wildner returned. 3251*1370a723SSascha Wildner 3252*1370a723SSascha Wildner @param Value A 32-bit unsigned value. 3253*1370a723SSascha Wildner 3254*1370a723SSascha Wildner @return The byte swapped Value. 3255*1370a723SSascha Wildner 3256*1370a723SSascha Wildner **/ 3257*1370a723SSascha Wildner UINT32 3258*1370a723SSascha Wildner EFIAPI 3259*1370a723SSascha Wildner SwapBytes32 ( 3260*1370a723SSascha Wildner IN UINT32 Value 3261*1370a723SSascha Wildner ); 3262*1370a723SSascha Wildner 3263*1370a723SSascha Wildner /** 3264*1370a723SSascha Wildner Switches the endianness of a 64-bit integer. 3265*1370a723SSascha Wildner 3266*1370a723SSascha Wildner This function swaps the bytes in a 64-bit unsigned value to switch the value 3267*1370a723SSascha Wildner from little endian to big endian or vice versa. The byte swapped value is 3268*1370a723SSascha Wildner returned. 3269*1370a723SSascha Wildner 3270*1370a723SSascha Wildner @param Value A 64-bit unsigned value. 3271*1370a723SSascha Wildner 3272*1370a723SSascha Wildner @return The byte swapped Value. 3273*1370a723SSascha Wildner 3274*1370a723SSascha Wildner **/ 3275*1370a723SSascha Wildner UINT64 3276*1370a723SSascha Wildner EFIAPI 3277*1370a723SSascha Wildner SwapBytes64 ( 3278*1370a723SSascha Wildner IN UINT64 Value 3279*1370a723SSascha Wildner ); 3280*1370a723SSascha Wildner 3281*1370a723SSascha Wildner /** 3282*1370a723SSascha Wildner Multiples a 64-bit unsigned integer by a 32-bit unsigned integer and 3283*1370a723SSascha Wildner generates a 64-bit unsigned result. 3284*1370a723SSascha Wildner 3285*1370a723SSascha Wildner This function multiples the 64-bit unsigned value Multiplicand by the 32-bit 3286*1370a723SSascha Wildner unsigned value Multiplier and generates a 64-bit unsigned result. This 64- 3287*1370a723SSascha Wildner bit unsigned result is returned. 3288*1370a723SSascha Wildner 3289*1370a723SSascha Wildner @param Multiplicand A 64-bit unsigned value. 3290*1370a723SSascha Wildner @param Multiplier A 32-bit unsigned value. 3291*1370a723SSascha Wildner 3292*1370a723SSascha Wildner @return Multiplicand * Multiplier 3293*1370a723SSascha Wildner 3294*1370a723SSascha Wildner **/ 3295*1370a723SSascha Wildner UINT64 3296*1370a723SSascha Wildner EFIAPI 3297*1370a723SSascha Wildner MultU64x32 ( 3298*1370a723SSascha Wildner IN UINT64 Multiplicand, 3299*1370a723SSascha Wildner IN UINT32 Multiplier 3300*1370a723SSascha Wildner ); 3301*1370a723SSascha Wildner 3302*1370a723SSascha Wildner /** 3303*1370a723SSascha Wildner Multiples a 64-bit unsigned integer by a 64-bit unsigned integer and 3304*1370a723SSascha Wildner generates a 64-bit unsigned result. 3305*1370a723SSascha Wildner 3306*1370a723SSascha Wildner This function multiples the 64-bit unsigned value Multiplicand by the 64-bit 3307*1370a723SSascha Wildner unsigned value Multiplier and generates a 64-bit unsigned result. This 64- 3308*1370a723SSascha Wildner bit unsigned result is returned. 3309*1370a723SSascha Wildner 3310*1370a723SSascha Wildner @param Multiplicand A 64-bit unsigned value. 3311*1370a723SSascha Wildner @param Multiplier A 64-bit unsigned value. 3312*1370a723SSascha Wildner 3313*1370a723SSascha Wildner @return Multiplicand * Multiplier. 3314*1370a723SSascha Wildner 3315*1370a723SSascha Wildner **/ 3316*1370a723SSascha Wildner UINT64 3317*1370a723SSascha Wildner EFIAPI 3318*1370a723SSascha Wildner MultU64x64 ( 3319*1370a723SSascha Wildner IN UINT64 Multiplicand, 3320*1370a723SSascha Wildner IN UINT64 Multiplier 3321*1370a723SSascha Wildner ); 3322*1370a723SSascha Wildner 3323*1370a723SSascha Wildner /** 3324*1370a723SSascha Wildner Multiples a 64-bit signed integer by a 64-bit signed integer and generates a 3325*1370a723SSascha Wildner 64-bit signed result. 3326*1370a723SSascha Wildner 3327*1370a723SSascha Wildner This function multiples the 64-bit signed value Multiplicand by the 64-bit 3328*1370a723SSascha Wildner signed value Multiplier and generates a 64-bit signed result. This 64-bit 3329*1370a723SSascha Wildner signed result is returned. 3330*1370a723SSascha Wildner 3331*1370a723SSascha Wildner @param Multiplicand A 64-bit signed value. 3332*1370a723SSascha Wildner @param Multiplier A 64-bit signed value. 3333*1370a723SSascha Wildner 3334*1370a723SSascha Wildner @return Multiplicand * Multiplier 3335*1370a723SSascha Wildner 3336*1370a723SSascha Wildner **/ 3337*1370a723SSascha Wildner INT64 3338*1370a723SSascha Wildner EFIAPI 3339*1370a723SSascha Wildner MultS64x64 ( 3340*1370a723SSascha Wildner IN INT64 Multiplicand, 3341*1370a723SSascha Wildner IN INT64 Multiplier 3342*1370a723SSascha Wildner ); 3343*1370a723SSascha Wildner 3344*1370a723SSascha Wildner /** 3345*1370a723SSascha Wildner Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates 3346*1370a723SSascha Wildner a 64-bit unsigned result. 3347*1370a723SSascha Wildner 3348*1370a723SSascha Wildner This function divides the 64-bit unsigned value Dividend by the 32-bit 3349*1370a723SSascha Wildner unsigned value Divisor and generates a 64-bit unsigned quotient. This 3350*1370a723SSascha Wildner function returns the 64-bit unsigned quotient. 3351*1370a723SSascha Wildner 3352*1370a723SSascha Wildner If Divisor is 0, then ASSERT(). 3353*1370a723SSascha Wildner 3354*1370a723SSascha Wildner @param Dividend A 64-bit unsigned value. 3355*1370a723SSascha Wildner @param Divisor A 32-bit unsigned value. 3356*1370a723SSascha Wildner 3357*1370a723SSascha Wildner @return Dividend / Divisor. 3358*1370a723SSascha Wildner 3359*1370a723SSascha Wildner **/ 3360*1370a723SSascha Wildner UINT64 3361*1370a723SSascha Wildner EFIAPI 3362*1370a723SSascha Wildner DivU64x32 ( 3363*1370a723SSascha Wildner IN UINT64 Dividend, 3364*1370a723SSascha Wildner IN UINT32 Divisor 3365*1370a723SSascha Wildner ); 3366*1370a723SSascha Wildner 3367*1370a723SSascha Wildner /** 3368*1370a723SSascha Wildner Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates 3369*1370a723SSascha Wildner a 32-bit unsigned remainder. 3370*1370a723SSascha Wildner 3371*1370a723SSascha Wildner This function divides the 64-bit unsigned value Dividend by the 32-bit 3372*1370a723SSascha Wildner unsigned value Divisor and generates a 32-bit remainder. This function 3373*1370a723SSascha Wildner returns the 32-bit unsigned remainder. 3374*1370a723SSascha Wildner 3375*1370a723SSascha Wildner If Divisor is 0, then ASSERT(). 3376*1370a723SSascha Wildner 3377*1370a723SSascha Wildner @param Dividend A 64-bit unsigned value. 3378*1370a723SSascha Wildner @param Divisor A 32-bit unsigned value. 3379*1370a723SSascha Wildner 3380*1370a723SSascha Wildner @return Dividend % Divisor. 3381*1370a723SSascha Wildner 3382*1370a723SSascha Wildner **/ 3383*1370a723SSascha Wildner UINT32 3384*1370a723SSascha Wildner EFIAPI 3385*1370a723SSascha Wildner ModU64x32 ( 3386*1370a723SSascha Wildner IN UINT64 Dividend, 3387*1370a723SSascha Wildner IN UINT32 Divisor 3388*1370a723SSascha Wildner ); 3389*1370a723SSascha Wildner 3390*1370a723SSascha Wildner /** 3391*1370a723SSascha Wildner Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates 3392*1370a723SSascha Wildner a 64-bit unsigned result and an optional 32-bit unsigned remainder. 3393*1370a723SSascha Wildner 3394*1370a723SSascha Wildner This function divides the 64-bit unsigned value Dividend by the 32-bit 3395*1370a723SSascha Wildner unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder 3396*1370a723SSascha Wildner is not NULL, then the 32-bit unsigned remainder is returned in Remainder. 3397*1370a723SSascha Wildner This function returns the 64-bit unsigned quotient. 3398*1370a723SSascha Wildner 3399*1370a723SSascha Wildner If Divisor is 0, then ASSERT(). 3400*1370a723SSascha Wildner 3401*1370a723SSascha Wildner @param Dividend A 64-bit unsigned value. 3402*1370a723SSascha Wildner @param Divisor A 32-bit unsigned value. 3403*1370a723SSascha Wildner @param Remainder A pointer to a 32-bit unsigned value. This parameter is 3404*1370a723SSascha Wildner optional and may be NULL. 3405*1370a723SSascha Wildner 3406*1370a723SSascha Wildner @return Dividend / Divisor. 3407*1370a723SSascha Wildner 3408*1370a723SSascha Wildner **/ 3409*1370a723SSascha Wildner UINT64 3410*1370a723SSascha Wildner EFIAPI 3411*1370a723SSascha Wildner DivU64x32Remainder ( 3412*1370a723SSascha Wildner IN UINT64 Dividend, 3413*1370a723SSascha Wildner IN UINT32 Divisor, 3414*1370a723SSascha Wildner OUT UINT32 *Remainder OPTIONAL 3415*1370a723SSascha Wildner ); 3416*1370a723SSascha Wildner 3417*1370a723SSascha Wildner /** 3418*1370a723SSascha Wildner Divides a 64-bit unsigned integer by a 64-bit unsigned integer and generates 3419*1370a723SSascha Wildner a 64-bit unsigned result and an optional 64-bit unsigned remainder. 3420*1370a723SSascha Wildner 3421*1370a723SSascha Wildner This function divides the 64-bit unsigned value Dividend by the 64-bit 3422*1370a723SSascha Wildner unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder 3423*1370a723SSascha Wildner is not NULL, then the 64-bit unsigned remainder is returned in Remainder. 3424*1370a723SSascha Wildner This function returns the 64-bit unsigned quotient. 3425*1370a723SSascha Wildner 3426*1370a723SSascha Wildner If Divisor is 0, then ASSERT(). 3427*1370a723SSascha Wildner 3428*1370a723SSascha Wildner @param Dividend A 64-bit unsigned value. 3429*1370a723SSascha Wildner @param Divisor A 64-bit unsigned value. 3430*1370a723SSascha Wildner @param Remainder A pointer to a 64-bit unsigned value. This parameter is 3431*1370a723SSascha Wildner optional and may be NULL. 3432*1370a723SSascha Wildner 3433*1370a723SSascha Wildner @return Dividend / Divisor. 3434*1370a723SSascha Wildner 3435*1370a723SSascha Wildner **/ 3436*1370a723SSascha Wildner UINT64 3437*1370a723SSascha Wildner EFIAPI 3438*1370a723SSascha Wildner DivU64x64Remainder ( 3439*1370a723SSascha Wildner IN UINT64 Dividend, 3440*1370a723SSascha Wildner IN UINT64 Divisor, 3441*1370a723SSascha Wildner OUT UINT64 *Remainder OPTIONAL 3442*1370a723SSascha Wildner ); 3443*1370a723SSascha Wildner 3444*1370a723SSascha Wildner /** 3445*1370a723SSascha Wildner Divides a 64-bit signed integer by a 64-bit signed integer and generates a 3446*1370a723SSascha Wildner 64-bit signed result and a optional 64-bit signed remainder. 3447*1370a723SSascha Wildner 3448*1370a723SSascha Wildner This function divides the 64-bit signed value Dividend by the 64-bit signed 3449*1370a723SSascha Wildner value Divisor and generates a 64-bit signed quotient. If Remainder is not 3450*1370a723SSascha Wildner NULL, then the 64-bit signed remainder is returned in Remainder. This 3451*1370a723SSascha Wildner function returns the 64-bit signed quotient. 3452*1370a723SSascha Wildner 3453*1370a723SSascha Wildner It is the caller's responsibility to not call this function with a Divisor of 0. 3454*1370a723SSascha Wildner If Divisor is 0, then the quotient and remainder should be assumed to be 3455*1370a723SSascha Wildner the largest negative integer. 3456*1370a723SSascha Wildner 3457*1370a723SSascha Wildner If Divisor is 0, then ASSERT(). 3458*1370a723SSascha Wildner 3459*1370a723SSascha Wildner @param Dividend A 64-bit signed value. 3460*1370a723SSascha Wildner @param Divisor A 64-bit signed value. 3461*1370a723SSascha Wildner @param Remainder A pointer to a 64-bit signed value. This parameter is 3462*1370a723SSascha Wildner optional and may be NULL. 3463*1370a723SSascha Wildner 3464*1370a723SSascha Wildner @return Dividend / Divisor. 3465*1370a723SSascha Wildner 3466*1370a723SSascha Wildner **/ 3467*1370a723SSascha Wildner INT64 3468*1370a723SSascha Wildner EFIAPI 3469*1370a723SSascha Wildner DivS64x64Remainder ( 3470*1370a723SSascha Wildner IN INT64 Dividend, 3471*1370a723SSascha Wildner IN INT64 Divisor, 3472*1370a723SSascha Wildner OUT INT64 *Remainder OPTIONAL 3473*1370a723SSascha Wildner ); 3474*1370a723SSascha Wildner 3475*1370a723SSascha Wildner /** 3476*1370a723SSascha Wildner Reads a 16-bit value from memory that may be unaligned. 3477*1370a723SSascha Wildner 3478*1370a723SSascha Wildner This function returns the 16-bit value pointed to by Buffer. The function 3479*1370a723SSascha Wildner guarantees that the read operation does not produce an alignment fault. 3480*1370a723SSascha Wildner 3481*1370a723SSascha Wildner If the Buffer is NULL, then ASSERT(). 3482*1370a723SSascha Wildner 3483*1370a723SSascha Wildner @param Buffer The pointer to a 16-bit value that may be unaligned. 3484*1370a723SSascha Wildner 3485*1370a723SSascha Wildner @return The 16-bit value read from Buffer. 3486*1370a723SSascha Wildner 3487*1370a723SSascha Wildner **/ 3488*1370a723SSascha Wildner UINT16 3489*1370a723SSascha Wildner EFIAPI 3490*1370a723SSascha Wildner ReadUnaligned16 ( 3491*1370a723SSascha Wildner IN CONST UINT16 *Buffer 3492*1370a723SSascha Wildner ); 3493*1370a723SSascha Wildner 3494*1370a723SSascha Wildner /** 3495*1370a723SSascha Wildner Writes a 16-bit value to memory that may be unaligned. 3496*1370a723SSascha Wildner 3497*1370a723SSascha Wildner This function writes the 16-bit value specified by Value to Buffer. Value is 3498*1370a723SSascha Wildner returned. The function guarantees that the write operation does not produce 3499*1370a723SSascha Wildner an alignment fault. 3500*1370a723SSascha Wildner 3501*1370a723SSascha Wildner If the Buffer is NULL, then ASSERT(). 3502*1370a723SSascha Wildner 3503*1370a723SSascha Wildner @param Buffer The pointer to a 16-bit value that may be unaligned. 3504*1370a723SSascha Wildner @param Value 16-bit value to write to Buffer. 3505*1370a723SSascha Wildner 3506*1370a723SSascha Wildner @return The 16-bit value to write to Buffer. 3507*1370a723SSascha Wildner 3508*1370a723SSascha Wildner **/ 3509*1370a723SSascha Wildner UINT16 3510*1370a723SSascha Wildner EFIAPI 3511*1370a723SSascha Wildner WriteUnaligned16 ( 3512*1370a723SSascha Wildner OUT UINT16 *Buffer, 3513*1370a723SSascha Wildner IN UINT16 Value 3514*1370a723SSascha Wildner ); 3515*1370a723SSascha Wildner 3516*1370a723SSascha Wildner /** 3517*1370a723SSascha Wildner Reads a 24-bit value from memory that may be unaligned. 3518*1370a723SSascha Wildner 3519*1370a723SSascha Wildner This function returns the 24-bit value pointed to by Buffer. The function 3520*1370a723SSascha Wildner guarantees that the read operation does not produce an alignment fault. 3521*1370a723SSascha Wildner 3522*1370a723SSascha Wildner If the Buffer is NULL, then ASSERT(). 3523*1370a723SSascha Wildner 3524*1370a723SSascha Wildner @param Buffer The pointer to a 24-bit value that may be unaligned. 3525*1370a723SSascha Wildner 3526*1370a723SSascha Wildner @return The 24-bit value read from Buffer. 3527*1370a723SSascha Wildner 3528*1370a723SSascha Wildner **/ 3529*1370a723SSascha Wildner UINT32 3530*1370a723SSascha Wildner EFIAPI 3531*1370a723SSascha Wildner ReadUnaligned24 ( 3532*1370a723SSascha Wildner IN CONST UINT32 *Buffer 3533*1370a723SSascha Wildner ); 3534*1370a723SSascha Wildner 3535*1370a723SSascha Wildner /** 3536*1370a723SSascha Wildner Writes a 24-bit value to memory that may be unaligned. 3537*1370a723SSascha Wildner 3538*1370a723SSascha Wildner This function writes the 24-bit value specified by Value to Buffer. Value is 3539*1370a723SSascha Wildner returned. The function guarantees that the write operation does not produce 3540*1370a723SSascha Wildner an alignment fault. 3541*1370a723SSascha Wildner 3542*1370a723SSascha Wildner If the Buffer is NULL, then ASSERT(). 3543*1370a723SSascha Wildner 3544*1370a723SSascha Wildner @param Buffer The pointer to a 24-bit value that may be unaligned. 3545*1370a723SSascha Wildner @param Value 24-bit value to write to Buffer. 3546*1370a723SSascha Wildner 3547*1370a723SSascha Wildner @return The 24-bit value to write to Buffer. 3548*1370a723SSascha Wildner 3549*1370a723SSascha Wildner **/ 3550*1370a723SSascha Wildner UINT32 3551*1370a723SSascha Wildner EFIAPI 3552*1370a723SSascha Wildner WriteUnaligned24 ( 3553*1370a723SSascha Wildner OUT UINT32 *Buffer, 3554*1370a723SSascha Wildner IN UINT32 Value 3555*1370a723SSascha Wildner ); 3556*1370a723SSascha Wildner 3557*1370a723SSascha Wildner /** 3558*1370a723SSascha Wildner Reads a 32-bit value from memory that may be unaligned. 3559*1370a723SSascha Wildner 3560*1370a723SSascha Wildner This function returns the 32-bit value pointed to by Buffer. The function 3561*1370a723SSascha Wildner guarantees that the read operation does not produce an alignment fault. 3562*1370a723SSascha Wildner 3563*1370a723SSascha Wildner If the Buffer is NULL, then ASSERT(). 3564*1370a723SSascha Wildner 3565*1370a723SSascha Wildner @param Buffer The pointer to a 32-bit value that may be unaligned. 3566*1370a723SSascha Wildner 3567*1370a723SSascha Wildner @return The 32-bit value read from Buffer. 3568*1370a723SSascha Wildner 3569*1370a723SSascha Wildner **/ 3570*1370a723SSascha Wildner UINT32 3571*1370a723SSascha Wildner EFIAPI 3572*1370a723SSascha Wildner ReadUnaligned32 ( 3573*1370a723SSascha Wildner IN CONST UINT32 *Buffer 3574*1370a723SSascha Wildner ); 3575*1370a723SSascha Wildner 3576*1370a723SSascha Wildner /** 3577*1370a723SSascha Wildner Writes a 32-bit value to memory that may be unaligned. 3578*1370a723SSascha Wildner 3579*1370a723SSascha Wildner This function writes the 32-bit value specified by Value to Buffer. Value is 3580*1370a723SSascha Wildner returned. The function guarantees that the write operation does not produce 3581*1370a723SSascha Wildner an alignment fault. 3582*1370a723SSascha Wildner 3583*1370a723SSascha Wildner If the Buffer is NULL, then ASSERT(). 3584*1370a723SSascha Wildner 3585*1370a723SSascha Wildner @param Buffer The pointer to a 32-bit value that may be unaligned. 3586*1370a723SSascha Wildner @param Value 32-bit value to write to Buffer. 3587*1370a723SSascha Wildner 3588*1370a723SSascha Wildner @return The 32-bit value to write to Buffer. 3589*1370a723SSascha Wildner 3590*1370a723SSascha Wildner **/ 3591*1370a723SSascha Wildner UINT32 3592*1370a723SSascha Wildner EFIAPI 3593*1370a723SSascha Wildner WriteUnaligned32 ( 3594*1370a723SSascha Wildner OUT UINT32 *Buffer, 3595*1370a723SSascha Wildner IN UINT32 Value 3596*1370a723SSascha Wildner ); 3597*1370a723SSascha Wildner 3598*1370a723SSascha Wildner /** 3599*1370a723SSascha Wildner Reads a 64-bit value from memory that may be unaligned. 3600*1370a723SSascha Wildner 3601*1370a723SSascha Wildner This function returns the 64-bit value pointed to by Buffer. The function 3602*1370a723SSascha Wildner guarantees that the read operation does not produce an alignment fault. 3603*1370a723SSascha Wildner 3604*1370a723SSascha Wildner If the Buffer is NULL, then ASSERT(). 3605*1370a723SSascha Wildner 3606*1370a723SSascha Wildner @param Buffer The pointer to a 64-bit value that may be unaligned. 3607*1370a723SSascha Wildner 3608*1370a723SSascha Wildner @return The 64-bit value read from Buffer. 3609*1370a723SSascha Wildner 3610*1370a723SSascha Wildner **/ 3611*1370a723SSascha Wildner UINT64 3612*1370a723SSascha Wildner EFIAPI 3613*1370a723SSascha Wildner ReadUnaligned64 ( 3614*1370a723SSascha Wildner IN CONST UINT64 *Buffer 3615*1370a723SSascha Wildner ); 3616*1370a723SSascha Wildner 3617*1370a723SSascha Wildner /** 3618*1370a723SSascha Wildner Writes a 64-bit value to memory that may be unaligned. 3619*1370a723SSascha Wildner 3620*1370a723SSascha Wildner This function writes the 64-bit value specified by Value to Buffer. Value is 3621*1370a723SSascha Wildner returned. The function guarantees that the write operation does not produce 3622*1370a723SSascha Wildner an alignment fault. 3623*1370a723SSascha Wildner 3624*1370a723SSascha Wildner If the Buffer is NULL, then ASSERT(). 3625*1370a723SSascha Wildner 3626*1370a723SSascha Wildner @param Buffer The pointer to a 64-bit value that may be unaligned. 3627*1370a723SSascha Wildner @param Value 64-bit value to write to Buffer. 3628*1370a723SSascha Wildner 3629*1370a723SSascha Wildner @return The 64-bit value to write to Buffer. 3630*1370a723SSascha Wildner 3631*1370a723SSascha Wildner **/ 3632*1370a723SSascha Wildner UINT64 3633*1370a723SSascha Wildner EFIAPI 3634*1370a723SSascha Wildner WriteUnaligned64 ( 3635*1370a723SSascha Wildner OUT UINT64 *Buffer, 3636*1370a723SSascha Wildner IN UINT64 Value 3637*1370a723SSascha Wildner ); 3638*1370a723SSascha Wildner 3639*1370a723SSascha Wildner // 3640*1370a723SSascha Wildner // Bit Field Functions 3641*1370a723SSascha Wildner // 3642*1370a723SSascha Wildner 3643*1370a723SSascha Wildner /** 3644*1370a723SSascha Wildner Returns a bit field from an 8-bit value. 3645*1370a723SSascha Wildner 3646*1370a723SSascha Wildner Returns the bitfield specified by the StartBit and the EndBit from Operand. 3647*1370a723SSascha Wildner 3648*1370a723SSascha Wildner If 8-bit operations are not supported, then ASSERT(). 3649*1370a723SSascha Wildner If StartBit is greater than 7, then ASSERT(). 3650*1370a723SSascha Wildner If EndBit is greater than 7, then ASSERT(). 3651*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 3652*1370a723SSascha Wildner 3653*1370a723SSascha Wildner @param Operand Operand on which to perform the bitfield operation. 3654*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 3655*1370a723SSascha Wildner Range 0..7. 3656*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 3657*1370a723SSascha Wildner Range 0..7. 3658*1370a723SSascha Wildner 3659*1370a723SSascha Wildner @return The bit field read. 3660*1370a723SSascha Wildner 3661*1370a723SSascha Wildner **/ 3662*1370a723SSascha Wildner UINT8 3663*1370a723SSascha Wildner EFIAPI 3664*1370a723SSascha Wildner BitFieldRead8 ( 3665*1370a723SSascha Wildner IN UINT8 Operand, 3666*1370a723SSascha Wildner IN UINTN StartBit, 3667*1370a723SSascha Wildner IN UINTN EndBit 3668*1370a723SSascha Wildner ); 3669*1370a723SSascha Wildner 3670*1370a723SSascha Wildner /** 3671*1370a723SSascha Wildner Writes a bit field to an 8-bit value, and returns the result. 3672*1370a723SSascha Wildner 3673*1370a723SSascha Wildner Writes Value to the bit field specified by the StartBit and the EndBit in 3674*1370a723SSascha Wildner Operand. All other bits in Operand are preserved. The new 8-bit value is 3675*1370a723SSascha Wildner returned. 3676*1370a723SSascha Wildner 3677*1370a723SSascha Wildner If 8-bit operations are not supported, then ASSERT(). 3678*1370a723SSascha Wildner If StartBit is greater than 7, then ASSERT(). 3679*1370a723SSascha Wildner If EndBit is greater than 7, then ASSERT(). 3680*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 3681*1370a723SSascha Wildner If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 3682*1370a723SSascha Wildner 3683*1370a723SSascha Wildner @param Operand Operand on which to perform the bitfield operation. 3684*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 3685*1370a723SSascha Wildner Range 0..7. 3686*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 3687*1370a723SSascha Wildner Range 0..7. 3688*1370a723SSascha Wildner @param Value New value of the bit field. 3689*1370a723SSascha Wildner 3690*1370a723SSascha Wildner @return The new 8-bit value. 3691*1370a723SSascha Wildner 3692*1370a723SSascha Wildner **/ 3693*1370a723SSascha Wildner UINT8 3694*1370a723SSascha Wildner EFIAPI 3695*1370a723SSascha Wildner BitFieldWrite8 ( 3696*1370a723SSascha Wildner IN UINT8 Operand, 3697*1370a723SSascha Wildner IN UINTN StartBit, 3698*1370a723SSascha Wildner IN UINTN EndBit, 3699*1370a723SSascha Wildner IN UINT8 Value 3700*1370a723SSascha Wildner ); 3701*1370a723SSascha Wildner 3702*1370a723SSascha Wildner /** 3703*1370a723SSascha Wildner Reads a bit field from an 8-bit value, performs a bitwise OR, and returns the 3704*1370a723SSascha Wildner result. 3705*1370a723SSascha Wildner 3706*1370a723SSascha Wildner Performs a bitwise OR between the bit field specified by StartBit 3707*1370a723SSascha Wildner and EndBit in Operand and the value specified by OrData. All other bits in 3708*1370a723SSascha Wildner Operand are preserved. The new 8-bit value is returned. 3709*1370a723SSascha Wildner 3710*1370a723SSascha Wildner If 8-bit operations are not supported, then ASSERT(). 3711*1370a723SSascha Wildner If StartBit is greater than 7, then ASSERT(). 3712*1370a723SSascha Wildner If EndBit is greater than 7, then ASSERT(). 3713*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 3714*1370a723SSascha Wildner If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 3715*1370a723SSascha Wildner 3716*1370a723SSascha Wildner @param Operand Operand on which to perform the bitfield operation. 3717*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 3718*1370a723SSascha Wildner Range 0..7. 3719*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 3720*1370a723SSascha Wildner Range 0..7. 3721*1370a723SSascha Wildner @param OrData The value to OR with the read value from the value 3722*1370a723SSascha Wildner 3723*1370a723SSascha Wildner @return The new 8-bit value. 3724*1370a723SSascha Wildner 3725*1370a723SSascha Wildner **/ 3726*1370a723SSascha Wildner UINT8 3727*1370a723SSascha Wildner EFIAPI 3728*1370a723SSascha Wildner BitFieldOr8 ( 3729*1370a723SSascha Wildner IN UINT8 Operand, 3730*1370a723SSascha Wildner IN UINTN StartBit, 3731*1370a723SSascha Wildner IN UINTN EndBit, 3732*1370a723SSascha Wildner IN UINT8 OrData 3733*1370a723SSascha Wildner ); 3734*1370a723SSascha Wildner 3735*1370a723SSascha Wildner /** 3736*1370a723SSascha Wildner Reads a bit field from an 8-bit value, performs a bitwise AND, and returns 3737*1370a723SSascha Wildner the result. 3738*1370a723SSascha Wildner 3739*1370a723SSascha Wildner Performs a bitwise AND between the bit field specified by StartBit and EndBit 3740*1370a723SSascha Wildner in Operand and the value specified by AndData. All other bits in Operand are 3741*1370a723SSascha Wildner preserved. The new 8-bit value is returned. 3742*1370a723SSascha Wildner 3743*1370a723SSascha Wildner If 8-bit operations are not supported, then ASSERT(). 3744*1370a723SSascha Wildner If StartBit is greater than 7, then ASSERT(). 3745*1370a723SSascha Wildner If EndBit is greater than 7, then ASSERT(). 3746*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 3747*1370a723SSascha Wildner If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 3748*1370a723SSascha Wildner 3749*1370a723SSascha Wildner @param Operand Operand on which to perform the bitfield operation. 3750*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 3751*1370a723SSascha Wildner Range 0..7. 3752*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 3753*1370a723SSascha Wildner Range 0..7. 3754*1370a723SSascha Wildner @param AndData The value to AND with the read value from the value. 3755*1370a723SSascha Wildner 3756*1370a723SSascha Wildner @return The new 8-bit value. 3757*1370a723SSascha Wildner 3758*1370a723SSascha Wildner **/ 3759*1370a723SSascha Wildner UINT8 3760*1370a723SSascha Wildner EFIAPI 3761*1370a723SSascha Wildner BitFieldAnd8 ( 3762*1370a723SSascha Wildner IN UINT8 Operand, 3763*1370a723SSascha Wildner IN UINTN StartBit, 3764*1370a723SSascha Wildner IN UINTN EndBit, 3765*1370a723SSascha Wildner IN UINT8 AndData 3766*1370a723SSascha Wildner ); 3767*1370a723SSascha Wildner 3768*1370a723SSascha Wildner /** 3769*1370a723SSascha Wildner Reads a bit field from an 8-bit value, performs a bitwise AND followed by a 3770*1370a723SSascha Wildner bitwise OR, and returns the result. 3771*1370a723SSascha Wildner 3772*1370a723SSascha Wildner Performs a bitwise AND between the bit field specified by StartBit and EndBit 3773*1370a723SSascha Wildner in Operand and the value specified by AndData, followed by a bitwise 3774*1370a723SSascha Wildner OR with value specified by OrData. All other bits in Operand are 3775*1370a723SSascha Wildner preserved. The new 8-bit value is returned. 3776*1370a723SSascha Wildner 3777*1370a723SSascha Wildner If 8-bit operations are not supported, then ASSERT(). 3778*1370a723SSascha Wildner If StartBit is greater than 7, then ASSERT(). 3779*1370a723SSascha Wildner If EndBit is greater than 7, then ASSERT(). 3780*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 3781*1370a723SSascha Wildner If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 3782*1370a723SSascha Wildner If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 3783*1370a723SSascha Wildner 3784*1370a723SSascha Wildner @param Operand Operand on which to perform the bitfield operation. 3785*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 3786*1370a723SSascha Wildner Range 0..7. 3787*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 3788*1370a723SSascha Wildner Range 0..7. 3789*1370a723SSascha Wildner @param AndData The value to AND with the read value from the value. 3790*1370a723SSascha Wildner @param OrData The value to OR with the result of the AND operation. 3791*1370a723SSascha Wildner 3792*1370a723SSascha Wildner @return The new 8-bit value. 3793*1370a723SSascha Wildner 3794*1370a723SSascha Wildner **/ 3795*1370a723SSascha Wildner UINT8 3796*1370a723SSascha Wildner EFIAPI 3797*1370a723SSascha Wildner BitFieldAndThenOr8 ( 3798*1370a723SSascha Wildner IN UINT8 Operand, 3799*1370a723SSascha Wildner IN UINTN StartBit, 3800*1370a723SSascha Wildner IN UINTN EndBit, 3801*1370a723SSascha Wildner IN UINT8 AndData, 3802*1370a723SSascha Wildner IN UINT8 OrData 3803*1370a723SSascha Wildner ); 3804*1370a723SSascha Wildner 3805*1370a723SSascha Wildner /** 3806*1370a723SSascha Wildner Returns a bit field from a 16-bit value. 3807*1370a723SSascha Wildner 3808*1370a723SSascha Wildner Returns the bitfield specified by the StartBit and the EndBit from Operand. 3809*1370a723SSascha Wildner 3810*1370a723SSascha Wildner If 16-bit operations are not supported, then ASSERT(). 3811*1370a723SSascha Wildner If StartBit is greater than 15, then ASSERT(). 3812*1370a723SSascha Wildner If EndBit is greater than 15, then ASSERT(). 3813*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 3814*1370a723SSascha Wildner 3815*1370a723SSascha Wildner @param Operand Operand on which to perform the bitfield operation. 3816*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 3817*1370a723SSascha Wildner Range 0..15. 3818*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 3819*1370a723SSascha Wildner Range 0..15. 3820*1370a723SSascha Wildner 3821*1370a723SSascha Wildner @return The bit field read. 3822*1370a723SSascha Wildner 3823*1370a723SSascha Wildner **/ 3824*1370a723SSascha Wildner UINT16 3825*1370a723SSascha Wildner EFIAPI 3826*1370a723SSascha Wildner BitFieldRead16 ( 3827*1370a723SSascha Wildner IN UINT16 Operand, 3828*1370a723SSascha Wildner IN UINTN StartBit, 3829*1370a723SSascha Wildner IN UINTN EndBit 3830*1370a723SSascha Wildner ); 3831*1370a723SSascha Wildner 3832*1370a723SSascha Wildner /** 3833*1370a723SSascha Wildner Writes a bit field to a 16-bit value, and returns the result. 3834*1370a723SSascha Wildner 3835*1370a723SSascha Wildner Writes Value to the bit field specified by the StartBit and the EndBit in 3836*1370a723SSascha Wildner Operand. All other bits in Operand are preserved. The new 16-bit value is 3837*1370a723SSascha Wildner returned. 3838*1370a723SSascha Wildner 3839*1370a723SSascha Wildner If 16-bit operations are not supported, then ASSERT(). 3840*1370a723SSascha Wildner If StartBit is greater than 15, then ASSERT(). 3841*1370a723SSascha Wildner If EndBit is greater than 15, then ASSERT(). 3842*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 3843*1370a723SSascha Wildner If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 3844*1370a723SSascha Wildner 3845*1370a723SSascha Wildner @param Operand Operand on which to perform the bitfield operation. 3846*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 3847*1370a723SSascha Wildner Range 0..15. 3848*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 3849*1370a723SSascha Wildner Range 0..15. 3850*1370a723SSascha Wildner @param Value New value of the bit field. 3851*1370a723SSascha Wildner 3852*1370a723SSascha Wildner @return The new 16-bit value. 3853*1370a723SSascha Wildner 3854*1370a723SSascha Wildner **/ 3855*1370a723SSascha Wildner UINT16 3856*1370a723SSascha Wildner EFIAPI 3857*1370a723SSascha Wildner BitFieldWrite16 ( 3858*1370a723SSascha Wildner IN UINT16 Operand, 3859*1370a723SSascha Wildner IN UINTN StartBit, 3860*1370a723SSascha Wildner IN UINTN EndBit, 3861*1370a723SSascha Wildner IN UINT16 Value 3862*1370a723SSascha Wildner ); 3863*1370a723SSascha Wildner 3864*1370a723SSascha Wildner /** 3865*1370a723SSascha Wildner Reads a bit field from a 16-bit value, performs a bitwise OR, and returns the 3866*1370a723SSascha Wildner result. 3867*1370a723SSascha Wildner 3868*1370a723SSascha Wildner Performs a bitwise OR between the bit field specified by StartBit 3869*1370a723SSascha Wildner and EndBit in Operand and the value specified by OrData. All other bits in 3870*1370a723SSascha Wildner Operand are preserved. The new 16-bit value is returned. 3871*1370a723SSascha Wildner 3872*1370a723SSascha Wildner If 16-bit operations are not supported, then ASSERT(). 3873*1370a723SSascha Wildner If StartBit is greater than 15, then ASSERT(). 3874*1370a723SSascha Wildner If EndBit is greater than 15, then ASSERT(). 3875*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 3876*1370a723SSascha Wildner If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 3877*1370a723SSascha Wildner 3878*1370a723SSascha Wildner @param Operand Operand on which to perform the bitfield operation. 3879*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 3880*1370a723SSascha Wildner Range 0..15. 3881*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 3882*1370a723SSascha Wildner Range 0..15. 3883*1370a723SSascha Wildner @param OrData The value to OR with the read value from the value 3884*1370a723SSascha Wildner 3885*1370a723SSascha Wildner @return The new 16-bit value. 3886*1370a723SSascha Wildner 3887*1370a723SSascha Wildner **/ 3888*1370a723SSascha Wildner UINT16 3889*1370a723SSascha Wildner EFIAPI 3890*1370a723SSascha Wildner BitFieldOr16 ( 3891*1370a723SSascha Wildner IN UINT16 Operand, 3892*1370a723SSascha Wildner IN UINTN StartBit, 3893*1370a723SSascha Wildner IN UINTN EndBit, 3894*1370a723SSascha Wildner IN UINT16 OrData 3895*1370a723SSascha Wildner ); 3896*1370a723SSascha Wildner 3897*1370a723SSascha Wildner /** 3898*1370a723SSascha Wildner Reads a bit field from a 16-bit value, performs a bitwise AND, and returns 3899*1370a723SSascha Wildner the result. 3900*1370a723SSascha Wildner 3901*1370a723SSascha Wildner Performs a bitwise AND between the bit field specified by StartBit and EndBit 3902*1370a723SSascha Wildner in Operand and the value specified by AndData. All other bits in Operand are 3903*1370a723SSascha Wildner preserved. The new 16-bit value is returned. 3904*1370a723SSascha Wildner 3905*1370a723SSascha Wildner If 16-bit operations are not supported, then ASSERT(). 3906*1370a723SSascha Wildner If StartBit is greater than 15, then ASSERT(). 3907*1370a723SSascha Wildner If EndBit is greater than 15, then ASSERT(). 3908*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 3909*1370a723SSascha Wildner If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 3910*1370a723SSascha Wildner 3911*1370a723SSascha Wildner @param Operand Operand on which to perform the bitfield operation. 3912*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 3913*1370a723SSascha Wildner Range 0..15. 3914*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 3915*1370a723SSascha Wildner Range 0..15. 3916*1370a723SSascha Wildner @param AndData The value to AND with the read value from the value 3917*1370a723SSascha Wildner 3918*1370a723SSascha Wildner @return The new 16-bit value. 3919*1370a723SSascha Wildner 3920*1370a723SSascha Wildner **/ 3921*1370a723SSascha Wildner UINT16 3922*1370a723SSascha Wildner EFIAPI 3923*1370a723SSascha Wildner BitFieldAnd16 ( 3924*1370a723SSascha Wildner IN UINT16 Operand, 3925*1370a723SSascha Wildner IN UINTN StartBit, 3926*1370a723SSascha Wildner IN UINTN EndBit, 3927*1370a723SSascha Wildner IN UINT16 AndData 3928*1370a723SSascha Wildner ); 3929*1370a723SSascha Wildner 3930*1370a723SSascha Wildner /** 3931*1370a723SSascha Wildner Reads a bit field from a 16-bit value, performs a bitwise AND followed by a 3932*1370a723SSascha Wildner bitwise OR, and returns the result. 3933*1370a723SSascha Wildner 3934*1370a723SSascha Wildner Performs a bitwise AND between the bit field specified by StartBit and EndBit 3935*1370a723SSascha Wildner in Operand and the value specified by AndData, followed by a bitwise 3936*1370a723SSascha Wildner OR with value specified by OrData. All other bits in Operand are 3937*1370a723SSascha Wildner preserved. The new 16-bit value is returned. 3938*1370a723SSascha Wildner 3939*1370a723SSascha Wildner If 16-bit operations are not supported, then ASSERT(). 3940*1370a723SSascha Wildner If StartBit is greater than 15, then ASSERT(). 3941*1370a723SSascha Wildner If EndBit is greater than 15, then ASSERT(). 3942*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 3943*1370a723SSascha Wildner If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 3944*1370a723SSascha Wildner If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 3945*1370a723SSascha Wildner 3946*1370a723SSascha Wildner @param Operand Operand on which to perform the bitfield operation. 3947*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 3948*1370a723SSascha Wildner Range 0..15. 3949*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 3950*1370a723SSascha Wildner Range 0..15. 3951*1370a723SSascha Wildner @param AndData The value to AND with the read value from the value. 3952*1370a723SSascha Wildner @param OrData The value to OR with the result of the AND operation. 3953*1370a723SSascha Wildner 3954*1370a723SSascha Wildner @return The new 16-bit value. 3955*1370a723SSascha Wildner 3956*1370a723SSascha Wildner **/ 3957*1370a723SSascha Wildner UINT16 3958*1370a723SSascha Wildner EFIAPI 3959*1370a723SSascha Wildner BitFieldAndThenOr16 ( 3960*1370a723SSascha Wildner IN UINT16 Operand, 3961*1370a723SSascha Wildner IN UINTN StartBit, 3962*1370a723SSascha Wildner IN UINTN EndBit, 3963*1370a723SSascha Wildner IN UINT16 AndData, 3964*1370a723SSascha Wildner IN UINT16 OrData 3965*1370a723SSascha Wildner ); 3966*1370a723SSascha Wildner 3967*1370a723SSascha Wildner /** 3968*1370a723SSascha Wildner Returns a bit field from a 32-bit value. 3969*1370a723SSascha Wildner 3970*1370a723SSascha Wildner Returns the bitfield specified by the StartBit and the EndBit from Operand. 3971*1370a723SSascha Wildner 3972*1370a723SSascha Wildner If 32-bit operations are not supported, then ASSERT(). 3973*1370a723SSascha Wildner If StartBit is greater than 31, then ASSERT(). 3974*1370a723SSascha Wildner If EndBit is greater than 31, then ASSERT(). 3975*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 3976*1370a723SSascha Wildner 3977*1370a723SSascha Wildner @param Operand Operand on which to perform the bitfield operation. 3978*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 3979*1370a723SSascha Wildner Range 0..31. 3980*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 3981*1370a723SSascha Wildner Range 0..31. 3982*1370a723SSascha Wildner 3983*1370a723SSascha Wildner @return The bit field read. 3984*1370a723SSascha Wildner 3985*1370a723SSascha Wildner **/ 3986*1370a723SSascha Wildner UINT32 3987*1370a723SSascha Wildner EFIAPI 3988*1370a723SSascha Wildner BitFieldRead32 ( 3989*1370a723SSascha Wildner IN UINT32 Operand, 3990*1370a723SSascha Wildner IN UINTN StartBit, 3991*1370a723SSascha Wildner IN UINTN EndBit 3992*1370a723SSascha Wildner ); 3993*1370a723SSascha Wildner 3994*1370a723SSascha Wildner /** 3995*1370a723SSascha Wildner Writes a bit field to a 32-bit value, and returns the result. 3996*1370a723SSascha Wildner 3997*1370a723SSascha Wildner Writes Value to the bit field specified by the StartBit and the EndBit in 3998*1370a723SSascha Wildner Operand. All other bits in Operand are preserved. The new 32-bit value is 3999*1370a723SSascha Wildner returned. 4000*1370a723SSascha Wildner 4001*1370a723SSascha Wildner If 32-bit operations are not supported, then ASSERT(). 4002*1370a723SSascha Wildner If StartBit is greater than 31, then ASSERT(). 4003*1370a723SSascha Wildner If EndBit is greater than 31, then ASSERT(). 4004*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 4005*1370a723SSascha Wildner If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 4006*1370a723SSascha Wildner 4007*1370a723SSascha Wildner @param Operand Operand on which to perform the bitfield operation. 4008*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 4009*1370a723SSascha Wildner Range 0..31. 4010*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 4011*1370a723SSascha Wildner Range 0..31. 4012*1370a723SSascha Wildner @param Value New value of the bit field. 4013*1370a723SSascha Wildner 4014*1370a723SSascha Wildner @return The new 32-bit value. 4015*1370a723SSascha Wildner 4016*1370a723SSascha Wildner **/ 4017*1370a723SSascha Wildner UINT32 4018*1370a723SSascha Wildner EFIAPI 4019*1370a723SSascha Wildner BitFieldWrite32 ( 4020*1370a723SSascha Wildner IN UINT32 Operand, 4021*1370a723SSascha Wildner IN UINTN StartBit, 4022*1370a723SSascha Wildner IN UINTN EndBit, 4023*1370a723SSascha Wildner IN UINT32 Value 4024*1370a723SSascha Wildner ); 4025*1370a723SSascha Wildner 4026*1370a723SSascha Wildner /** 4027*1370a723SSascha Wildner Reads a bit field from a 32-bit value, performs a bitwise OR, and returns the 4028*1370a723SSascha Wildner result. 4029*1370a723SSascha Wildner 4030*1370a723SSascha Wildner Performs a bitwise OR between the bit field specified by StartBit 4031*1370a723SSascha Wildner and EndBit in Operand and the value specified by OrData. All other bits in 4032*1370a723SSascha Wildner Operand are preserved. The new 32-bit value is returned. 4033*1370a723SSascha Wildner 4034*1370a723SSascha Wildner If 32-bit operations are not supported, then ASSERT(). 4035*1370a723SSascha Wildner If StartBit is greater than 31, then ASSERT(). 4036*1370a723SSascha Wildner If EndBit is greater than 31, then ASSERT(). 4037*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 4038*1370a723SSascha Wildner If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 4039*1370a723SSascha Wildner 4040*1370a723SSascha Wildner @param Operand Operand on which to perform the bitfield operation. 4041*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 4042*1370a723SSascha Wildner Range 0..31. 4043*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 4044*1370a723SSascha Wildner Range 0..31. 4045*1370a723SSascha Wildner @param OrData The value to OR with the read value from the value. 4046*1370a723SSascha Wildner 4047*1370a723SSascha Wildner @return The new 32-bit value. 4048*1370a723SSascha Wildner 4049*1370a723SSascha Wildner **/ 4050*1370a723SSascha Wildner UINT32 4051*1370a723SSascha Wildner EFIAPI 4052*1370a723SSascha Wildner BitFieldOr32 ( 4053*1370a723SSascha Wildner IN UINT32 Operand, 4054*1370a723SSascha Wildner IN UINTN StartBit, 4055*1370a723SSascha Wildner IN UINTN EndBit, 4056*1370a723SSascha Wildner IN UINT32 OrData 4057*1370a723SSascha Wildner ); 4058*1370a723SSascha Wildner 4059*1370a723SSascha Wildner /** 4060*1370a723SSascha Wildner Reads a bit field from a 32-bit value, performs a bitwise AND, and returns 4061*1370a723SSascha Wildner the result. 4062*1370a723SSascha Wildner 4063*1370a723SSascha Wildner Performs a bitwise AND between the bit field specified by StartBit and EndBit 4064*1370a723SSascha Wildner in Operand and the value specified by AndData. All other bits in Operand are 4065*1370a723SSascha Wildner preserved. The new 32-bit value is returned. 4066*1370a723SSascha Wildner 4067*1370a723SSascha Wildner If 32-bit operations are not supported, then ASSERT(). 4068*1370a723SSascha Wildner If StartBit is greater than 31, then ASSERT(). 4069*1370a723SSascha Wildner If EndBit is greater than 31, then ASSERT(). 4070*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 4071*1370a723SSascha Wildner If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 4072*1370a723SSascha Wildner 4073*1370a723SSascha Wildner @param Operand Operand on which to perform the bitfield operation. 4074*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 4075*1370a723SSascha Wildner Range 0..31. 4076*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 4077*1370a723SSascha Wildner Range 0..31. 4078*1370a723SSascha Wildner @param AndData The value to AND with the read value from the value 4079*1370a723SSascha Wildner 4080*1370a723SSascha Wildner @return The new 32-bit value. 4081*1370a723SSascha Wildner 4082*1370a723SSascha Wildner **/ 4083*1370a723SSascha Wildner UINT32 4084*1370a723SSascha Wildner EFIAPI 4085*1370a723SSascha Wildner BitFieldAnd32 ( 4086*1370a723SSascha Wildner IN UINT32 Operand, 4087*1370a723SSascha Wildner IN UINTN StartBit, 4088*1370a723SSascha Wildner IN UINTN EndBit, 4089*1370a723SSascha Wildner IN UINT32 AndData 4090*1370a723SSascha Wildner ); 4091*1370a723SSascha Wildner 4092*1370a723SSascha Wildner /** 4093*1370a723SSascha Wildner Reads a bit field from a 32-bit value, performs a bitwise AND followed by a 4094*1370a723SSascha Wildner bitwise OR, and returns the result. 4095*1370a723SSascha Wildner 4096*1370a723SSascha Wildner Performs a bitwise AND between the bit field specified by StartBit and EndBit 4097*1370a723SSascha Wildner in Operand and the value specified by AndData, followed by a bitwise 4098*1370a723SSascha Wildner OR with value specified by OrData. All other bits in Operand are 4099*1370a723SSascha Wildner preserved. The new 32-bit value is returned. 4100*1370a723SSascha Wildner 4101*1370a723SSascha Wildner If 32-bit operations are not supported, then ASSERT(). 4102*1370a723SSascha Wildner If StartBit is greater than 31, then ASSERT(). 4103*1370a723SSascha Wildner If EndBit is greater than 31, then ASSERT(). 4104*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 4105*1370a723SSascha Wildner If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 4106*1370a723SSascha Wildner If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 4107*1370a723SSascha Wildner 4108*1370a723SSascha Wildner @param Operand Operand on which to perform the bitfield operation. 4109*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 4110*1370a723SSascha Wildner Range 0..31. 4111*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 4112*1370a723SSascha Wildner Range 0..31. 4113*1370a723SSascha Wildner @param AndData The value to AND with the read value from the value. 4114*1370a723SSascha Wildner @param OrData The value to OR with the result of the AND operation. 4115*1370a723SSascha Wildner 4116*1370a723SSascha Wildner @return The new 32-bit value. 4117*1370a723SSascha Wildner 4118*1370a723SSascha Wildner **/ 4119*1370a723SSascha Wildner UINT32 4120*1370a723SSascha Wildner EFIAPI 4121*1370a723SSascha Wildner BitFieldAndThenOr32 ( 4122*1370a723SSascha Wildner IN UINT32 Operand, 4123*1370a723SSascha Wildner IN UINTN StartBit, 4124*1370a723SSascha Wildner IN UINTN EndBit, 4125*1370a723SSascha Wildner IN UINT32 AndData, 4126*1370a723SSascha Wildner IN UINT32 OrData 4127*1370a723SSascha Wildner ); 4128*1370a723SSascha Wildner 4129*1370a723SSascha Wildner /** 4130*1370a723SSascha Wildner Returns a bit field from a 64-bit value. 4131*1370a723SSascha Wildner 4132*1370a723SSascha Wildner Returns the bitfield specified by the StartBit and the EndBit from Operand. 4133*1370a723SSascha Wildner 4134*1370a723SSascha Wildner If 64-bit operations are not supported, then ASSERT(). 4135*1370a723SSascha Wildner If StartBit is greater than 63, then ASSERT(). 4136*1370a723SSascha Wildner If EndBit is greater than 63, then ASSERT(). 4137*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 4138*1370a723SSascha Wildner 4139*1370a723SSascha Wildner @param Operand Operand on which to perform the bitfield operation. 4140*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 4141*1370a723SSascha Wildner Range 0..63. 4142*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 4143*1370a723SSascha Wildner Range 0..63. 4144*1370a723SSascha Wildner 4145*1370a723SSascha Wildner @return The bit field read. 4146*1370a723SSascha Wildner 4147*1370a723SSascha Wildner **/ 4148*1370a723SSascha Wildner UINT64 4149*1370a723SSascha Wildner EFIAPI 4150*1370a723SSascha Wildner BitFieldRead64 ( 4151*1370a723SSascha Wildner IN UINT64 Operand, 4152*1370a723SSascha Wildner IN UINTN StartBit, 4153*1370a723SSascha Wildner IN UINTN EndBit 4154*1370a723SSascha Wildner ); 4155*1370a723SSascha Wildner 4156*1370a723SSascha Wildner /** 4157*1370a723SSascha Wildner Writes a bit field to a 64-bit value, and returns the result. 4158*1370a723SSascha Wildner 4159*1370a723SSascha Wildner Writes Value to the bit field specified by the StartBit and the EndBit in 4160*1370a723SSascha Wildner Operand. All other bits in Operand are preserved. The new 64-bit value is 4161*1370a723SSascha Wildner returned. 4162*1370a723SSascha Wildner 4163*1370a723SSascha Wildner If 64-bit operations are not supported, then ASSERT(). 4164*1370a723SSascha Wildner If StartBit is greater than 63, then ASSERT(). 4165*1370a723SSascha Wildner If EndBit is greater than 63, then ASSERT(). 4166*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 4167*1370a723SSascha Wildner If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 4168*1370a723SSascha Wildner 4169*1370a723SSascha Wildner @param Operand Operand on which to perform the bitfield operation. 4170*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 4171*1370a723SSascha Wildner Range 0..63. 4172*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 4173*1370a723SSascha Wildner Range 0..63. 4174*1370a723SSascha Wildner @param Value New value of the bit field. 4175*1370a723SSascha Wildner 4176*1370a723SSascha Wildner @return The new 64-bit value. 4177*1370a723SSascha Wildner 4178*1370a723SSascha Wildner **/ 4179*1370a723SSascha Wildner UINT64 4180*1370a723SSascha Wildner EFIAPI 4181*1370a723SSascha Wildner BitFieldWrite64 ( 4182*1370a723SSascha Wildner IN UINT64 Operand, 4183*1370a723SSascha Wildner IN UINTN StartBit, 4184*1370a723SSascha Wildner IN UINTN EndBit, 4185*1370a723SSascha Wildner IN UINT64 Value 4186*1370a723SSascha Wildner ); 4187*1370a723SSascha Wildner 4188*1370a723SSascha Wildner /** 4189*1370a723SSascha Wildner Reads a bit field from a 64-bit value, performs a bitwise OR, and returns the 4190*1370a723SSascha Wildner result. 4191*1370a723SSascha Wildner 4192*1370a723SSascha Wildner Performs a bitwise OR between the bit field specified by StartBit 4193*1370a723SSascha Wildner and EndBit in Operand and the value specified by OrData. All other bits in 4194*1370a723SSascha Wildner Operand are preserved. The new 64-bit value is returned. 4195*1370a723SSascha Wildner 4196*1370a723SSascha Wildner If 64-bit operations are not supported, then ASSERT(). 4197*1370a723SSascha Wildner If StartBit is greater than 63, then ASSERT(). 4198*1370a723SSascha Wildner If EndBit is greater than 63, then ASSERT(). 4199*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 4200*1370a723SSascha Wildner If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 4201*1370a723SSascha Wildner 4202*1370a723SSascha Wildner @param Operand Operand on which to perform the bitfield operation. 4203*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 4204*1370a723SSascha Wildner Range 0..63. 4205*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 4206*1370a723SSascha Wildner Range 0..63. 4207*1370a723SSascha Wildner @param OrData The value to OR with the read value from the value 4208*1370a723SSascha Wildner 4209*1370a723SSascha Wildner @return The new 64-bit value. 4210*1370a723SSascha Wildner 4211*1370a723SSascha Wildner **/ 4212*1370a723SSascha Wildner UINT64 4213*1370a723SSascha Wildner EFIAPI 4214*1370a723SSascha Wildner BitFieldOr64 ( 4215*1370a723SSascha Wildner IN UINT64 Operand, 4216*1370a723SSascha Wildner IN UINTN StartBit, 4217*1370a723SSascha Wildner IN UINTN EndBit, 4218*1370a723SSascha Wildner IN UINT64 OrData 4219*1370a723SSascha Wildner ); 4220*1370a723SSascha Wildner 4221*1370a723SSascha Wildner /** 4222*1370a723SSascha Wildner Reads a bit field from a 64-bit value, performs a bitwise AND, and returns 4223*1370a723SSascha Wildner the result. 4224*1370a723SSascha Wildner 4225*1370a723SSascha Wildner Performs a bitwise AND between the bit field specified by StartBit and EndBit 4226*1370a723SSascha Wildner in Operand and the value specified by AndData. All other bits in Operand are 4227*1370a723SSascha Wildner preserved. The new 64-bit value is returned. 4228*1370a723SSascha Wildner 4229*1370a723SSascha Wildner If 64-bit operations are not supported, then ASSERT(). 4230*1370a723SSascha Wildner If StartBit is greater than 63, then ASSERT(). 4231*1370a723SSascha Wildner If EndBit is greater than 63, then ASSERT(). 4232*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 4233*1370a723SSascha Wildner If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 4234*1370a723SSascha Wildner 4235*1370a723SSascha Wildner @param Operand Operand on which to perform the bitfield operation. 4236*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 4237*1370a723SSascha Wildner Range 0..63. 4238*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 4239*1370a723SSascha Wildner Range 0..63. 4240*1370a723SSascha Wildner @param AndData The value to AND with the read value from the value 4241*1370a723SSascha Wildner 4242*1370a723SSascha Wildner @return The new 64-bit value. 4243*1370a723SSascha Wildner 4244*1370a723SSascha Wildner **/ 4245*1370a723SSascha Wildner UINT64 4246*1370a723SSascha Wildner EFIAPI 4247*1370a723SSascha Wildner BitFieldAnd64 ( 4248*1370a723SSascha Wildner IN UINT64 Operand, 4249*1370a723SSascha Wildner IN UINTN StartBit, 4250*1370a723SSascha Wildner IN UINTN EndBit, 4251*1370a723SSascha Wildner IN UINT64 AndData 4252*1370a723SSascha Wildner ); 4253*1370a723SSascha Wildner 4254*1370a723SSascha Wildner /** 4255*1370a723SSascha Wildner Reads a bit field from a 64-bit value, performs a bitwise AND followed by a 4256*1370a723SSascha Wildner bitwise OR, and returns the result. 4257*1370a723SSascha Wildner 4258*1370a723SSascha Wildner Performs a bitwise AND between the bit field specified by StartBit and EndBit 4259*1370a723SSascha Wildner in Operand and the value specified by AndData, followed by a bitwise 4260*1370a723SSascha Wildner OR with value specified by OrData. All other bits in Operand are 4261*1370a723SSascha Wildner preserved. The new 64-bit value is returned. 4262*1370a723SSascha Wildner 4263*1370a723SSascha Wildner If 64-bit operations are not supported, then ASSERT(). 4264*1370a723SSascha Wildner If StartBit is greater than 63, then ASSERT(). 4265*1370a723SSascha Wildner If EndBit is greater than 63, then ASSERT(). 4266*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 4267*1370a723SSascha Wildner If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 4268*1370a723SSascha Wildner If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 4269*1370a723SSascha Wildner 4270*1370a723SSascha Wildner @param Operand Operand on which to perform the bitfield operation. 4271*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 4272*1370a723SSascha Wildner Range 0..63. 4273*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 4274*1370a723SSascha Wildner Range 0..63. 4275*1370a723SSascha Wildner @param AndData The value to AND with the read value from the value. 4276*1370a723SSascha Wildner @param OrData The value to OR with the result of the AND operation. 4277*1370a723SSascha Wildner 4278*1370a723SSascha Wildner @return The new 64-bit value. 4279*1370a723SSascha Wildner 4280*1370a723SSascha Wildner **/ 4281*1370a723SSascha Wildner UINT64 4282*1370a723SSascha Wildner EFIAPI 4283*1370a723SSascha Wildner BitFieldAndThenOr64 ( 4284*1370a723SSascha Wildner IN UINT64 Operand, 4285*1370a723SSascha Wildner IN UINTN StartBit, 4286*1370a723SSascha Wildner IN UINTN EndBit, 4287*1370a723SSascha Wildner IN UINT64 AndData, 4288*1370a723SSascha Wildner IN UINT64 OrData 4289*1370a723SSascha Wildner ); 4290*1370a723SSascha Wildner 4291*1370a723SSascha Wildner /** 4292*1370a723SSascha Wildner Reads a bit field from a 32-bit value, counts and returns 4293*1370a723SSascha Wildner the number of set bits. 4294*1370a723SSascha Wildner 4295*1370a723SSascha Wildner Counts the number of set bits in the bit field specified by 4296*1370a723SSascha Wildner StartBit and EndBit in Operand. The count is returned. 4297*1370a723SSascha Wildner 4298*1370a723SSascha Wildner If StartBit is greater than 31, then ASSERT(). 4299*1370a723SSascha Wildner If EndBit is greater than 31, then ASSERT(). 4300*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 4301*1370a723SSascha Wildner 4302*1370a723SSascha Wildner @param Operand Operand on which to perform the bitfield operation. 4303*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 4304*1370a723SSascha Wildner Range 0..31. 4305*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 4306*1370a723SSascha Wildner Range 0..31. 4307*1370a723SSascha Wildner 4308*1370a723SSascha Wildner @return The number of bits set between StartBit and EndBit. 4309*1370a723SSascha Wildner 4310*1370a723SSascha Wildner **/ 4311*1370a723SSascha Wildner UINT8 4312*1370a723SSascha Wildner EFIAPI 4313*1370a723SSascha Wildner BitFieldCountOnes32 ( 4314*1370a723SSascha Wildner IN UINT32 Operand, 4315*1370a723SSascha Wildner IN UINTN StartBit, 4316*1370a723SSascha Wildner IN UINTN EndBit 4317*1370a723SSascha Wildner ); 4318*1370a723SSascha Wildner 4319*1370a723SSascha Wildner /** 4320*1370a723SSascha Wildner Reads a bit field from a 64-bit value, counts and returns 4321*1370a723SSascha Wildner the number of set bits. 4322*1370a723SSascha Wildner 4323*1370a723SSascha Wildner Counts the number of set bits in the bit field specified by 4324*1370a723SSascha Wildner StartBit and EndBit in Operand. The count is returned. 4325*1370a723SSascha Wildner 4326*1370a723SSascha Wildner If StartBit is greater than 63, then ASSERT(). 4327*1370a723SSascha Wildner If EndBit is greater than 63, then ASSERT(). 4328*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 4329*1370a723SSascha Wildner 4330*1370a723SSascha Wildner @param Operand Operand on which to perform the bitfield operation. 4331*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 4332*1370a723SSascha Wildner Range 0..63. 4333*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 4334*1370a723SSascha Wildner Range 0..63. 4335*1370a723SSascha Wildner 4336*1370a723SSascha Wildner @return The number of bits set between StartBit and EndBit. 4337*1370a723SSascha Wildner 4338*1370a723SSascha Wildner **/ 4339*1370a723SSascha Wildner UINT8 4340*1370a723SSascha Wildner EFIAPI 4341*1370a723SSascha Wildner BitFieldCountOnes64 ( 4342*1370a723SSascha Wildner IN UINT64 Operand, 4343*1370a723SSascha Wildner IN UINTN StartBit, 4344*1370a723SSascha Wildner IN UINTN EndBit 4345*1370a723SSascha Wildner ); 4346*1370a723SSascha Wildner 4347*1370a723SSascha Wildner // 4348*1370a723SSascha Wildner // Base Library Checksum Functions 4349*1370a723SSascha Wildner // 4350*1370a723SSascha Wildner 4351*1370a723SSascha Wildner /** 4352*1370a723SSascha Wildner Returns the sum of all elements in a buffer in unit of UINT8. 4353*1370a723SSascha Wildner During calculation, the carry bits are dropped. 4354*1370a723SSascha Wildner 4355*1370a723SSascha Wildner This function calculates the sum of all elements in a buffer 4356*1370a723SSascha Wildner in unit of UINT8. The carry bits in result of addition are dropped. 4357*1370a723SSascha Wildner The result is returned as UINT8. If Length is Zero, then Zero is 4358*1370a723SSascha Wildner returned. 4359*1370a723SSascha Wildner 4360*1370a723SSascha Wildner If Buffer is NULL, then ASSERT(). 4361*1370a723SSascha Wildner If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). 4362*1370a723SSascha Wildner 4363*1370a723SSascha Wildner @param Buffer The pointer to the buffer to carry out the sum operation. 4364*1370a723SSascha Wildner @param Length The size, in bytes, of Buffer. 4365*1370a723SSascha Wildner 4366*1370a723SSascha Wildner @return Sum The sum of Buffer with carry bits dropped during additions. 4367*1370a723SSascha Wildner 4368*1370a723SSascha Wildner **/ 4369*1370a723SSascha Wildner UINT8 4370*1370a723SSascha Wildner EFIAPI 4371*1370a723SSascha Wildner CalculateSum8 ( 4372*1370a723SSascha Wildner IN CONST UINT8 *Buffer, 4373*1370a723SSascha Wildner IN UINTN Length 4374*1370a723SSascha Wildner ); 4375*1370a723SSascha Wildner 4376*1370a723SSascha Wildner /** 4377*1370a723SSascha Wildner Returns the two's complement checksum of all elements in a buffer 4378*1370a723SSascha Wildner of 8-bit values. 4379*1370a723SSascha Wildner 4380*1370a723SSascha Wildner This function first calculates the sum of the 8-bit values in the 4381*1370a723SSascha Wildner buffer specified by Buffer and Length. The carry bits in the result 4382*1370a723SSascha Wildner of addition are dropped. Then, the two's complement of the sum is 4383*1370a723SSascha Wildner returned. If Length is 0, then 0 is returned. 4384*1370a723SSascha Wildner 4385*1370a723SSascha Wildner If Buffer is NULL, then ASSERT(). 4386*1370a723SSascha Wildner If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). 4387*1370a723SSascha Wildner 4388*1370a723SSascha Wildner @param Buffer The pointer to the buffer to carry out the checksum operation. 4389*1370a723SSascha Wildner @param Length The size, in bytes, of Buffer. 4390*1370a723SSascha Wildner 4391*1370a723SSascha Wildner @return Checksum The two's complement checksum of Buffer. 4392*1370a723SSascha Wildner 4393*1370a723SSascha Wildner **/ 4394*1370a723SSascha Wildner UINT8 4395*1370a723SSascha Wildner EFIAPI 4396*1370a723SSascha Wildner CalculateCheckSum8 ( 4397*1370a723SSascha Wildner IN CONST UINT8 *Buffer, 4398*1370a723SSascha Wildner IN UINTN Length 4399*1370a723SSascha Wildner ); 4400*1370a723SSascha Wildner 4401*1370a723SSascha Wildner /** 4402*1370a723SSascha Wildner Returns the sum of all elements in a buffer of 16-bit values. During 4403*1370a723SSascha Wildner calculation, the carry bits are dropped. 4404*1370a723SSascha Wildner 4405*1370a723SSascha Wildner This function calculates the sum of the 16-bit values in the buffer 4406*1370a723SSascha Wildner specified by Buffer and Length. The carry bits in result of addition are dropped. 4407*1370a723SSascha Wildner The 16-bit result is returned. If Length is 0, then 0 is returned. 4408*1370a723SSascha Wildner 4409*1370a723SSascha Wildner If Buffer is NULL, then ASSERT(). 4410*1370a723SSascha Wildner If Buffer is not aligned on a 16-bit boundary, then ASSERT(). 4411*1370a723SSascha Wildner If Length is not aligned on a 16-bit boundary, then ASSERT(). 4412*1370a723SSascha Wildner If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). 4413*1370a723SSascha Wildner 4414*1370a723SSascha Wildner @param Buffer The pointer to the buffer to carry out the sum operation. 4415*1370a723SSascha Wildner @param Length The size, in bytes, of Buffer. 4416*1370a723SSascha Wildner 4417*1370a723SSascha Wildner @return Sum The sum of Buffer with carry bits dropped during additions. 4418*1370a723SSascha Wildner 4419*1370a723SSascha Wildner **/ 4420*1370a723SSascha Wildner UINT16 4421*1370a723SSascha Wildner EFIAPI 4422*1370a723SSascha Wildner CalculateSum16 ( 4423*1370a723SSascha Wildner IN CONST UINT16 *Buffer, 4424*1370a723SSascha Wildner IN UINTN Length 4425*1370a723SSascha Wildner ); 4426*1370a723SSascha Wildner 4427*1370a723SSascha Wildner /** 4428*1370a723SSascha Wildner Returns the two's complement checksum of all elements in a buffer of 4429*1370a723SSascha Wildner 16-bit values. 4430*1370a723SSascha Wildner 4431*1370a723SSascha Wildner This function first calculates the sum of the 16-bit values in the buffer 4432*1370a723SSascha Wildner specified by Buffer and Length. The carry bits in the result of addition 4433*1370a723SSascha Wildner are dropped. Then, the two's complement of the sum is returned. If Length 4434*1370a723SSascha Wildner is 0, then 0 is returned. 4435*1370a723SSascha Wildner 4436*1370a723SSascha Wildner If Buffer is NULL, then ASSERT(). 4437*1370a723SSascha Wildner If Buffer is not aligned on a 16-bit boundary, then ASSERT(). 4438*1370a723SSascha Wildner If Length is not aligned on a 16-bit boundary, then ASSERT(). 4439*1370a723SSascha Wildner If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). 4440*1370a723SSascha Wildner 4441*1370a723SSascha Wildner @param Buffer The pointer to the buffer to carry out the checksum operation. 4442*1370a723SSascha Wildner @param Length The size, in bytes, of Buffer. 4443*1370a723SSascha Wildner 4444*1370a723SSascha Wildner @return Checksum The two's complement checksum of Buffer. 4445*1370a723SSascha Wildner 4446*1370a723SSascha Wildner **/ 4447*1370a723SSascha Wildner UINT16 4448*1370a723SSascha Wildner EFIAPI 4449*1370a723SSascha Wildner CalculateCheckSum16 ( 4450*1370a723SSascha Wildner IN CONST UINT16 *Buffer, 4451*1370a723SSascha Wildner IN UINTN Length 4452*1370a723SSascha Wildner ); 4453*1370a723SSascha Wildner 4454*1370a723SSascha Wildner /** 4455*1370a723SSascha Wildner Returns the sum of all elements in a buffer of 32-bit values. During 4456*1370a723SSascha Wildner calculation, the carry bits are dropped. 4457*1370a723SSascha Wildner 4458*1370a723SSascha Wildner This function calculates the sum of the 32-bit values in the buffer 4459*1370a723SSascha Wildner specified by Buffer and Length. The carry bits in result of addition are dropped. 4460*1370a723SSascha Wildner The 32-bit result is returned. If Length is 0, then 0 is returned. 4461*1370a723SSascha Wildner 4462*1370a723SSascha Wildner If Buffer is NULL, then ASSERT(). 4463*1370a723SSascha Wildner If Buffer is not aligned on a 32-bit boundary, then ASSERT(). 4464*1370a723SSascha Wildner If Length is not aligned on a 32-bit boundary, then ASSERT(). 4465*1370a723SSascha Wildner If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). 4466*1370a723SSascha Wildner 4467*1370a723SSascha Wildner @param Buffer The pointer to the buffer to carry out the sum operation. 4468*1370a723SSascha Wildner @param Length The size, in bytes, of Buffer. 4469*1370a723SSascha Wildner 4470*1370a723SSascha Wildner @return Sum The sum of Buffer with carry bits dropped during additions. 4471*1370a723SSascha Wildner 4472*1370a723SSascha Wildner **/ 4473*1370a723SSascha Wildner UINT32 4474*1370a723SSascha Wildner EFIAPI 4475*1370a723SSascha Wildner CalculateSum32 ( 4476*1370a723SSascha Wildner IN CONST UINT32 *Buffer, 4477*1370a723SSascha Wildner IN UINTN Length 4478*1370a723SSascha Wildner ); 4479*1370a723SSascha Wildner 4480*1370a723SSascha Wildner /** 4481*1370a723SSascha Wildner Returns the two's complement checksum of all elements in a buffer of 4482*1370a723SSascha Wildner 32-bit values. 4483*1370a723SSascha Wildner 4484*1370a723SSascha Wildner This function first calculates the sum of the 32-bit values in the buffer 4485*1370a723SSascha Wildner specified by Buffer and Length. The carry bits in the result of addition 4486*1370a723SSascha Wildner are dropped. Then, the two's complement of the sum is returned. If Length 4487*1370a723SSascha Wildner is 0, then 0 is returned. 4488*1370a723SSascha Wildner 4489*1370a723SSascha Wildner If Buffer is NULL, then ASSERT(). 4490*1370a723SSascha Wildner If Buffer is not aligned on a 32-bit boundary, then ASSERT(). 4491*1370a723SSascha Wildner If Length is not aligned on a 32-bit boundary, then ASSERT(). 4492*1370a723SSascha Wildner If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). 4493*1370a723SSascha Wildner 4494*1370a723SSascha Wildner @param Buffer The pointer to the buffer to carry out the checksum operation. 4495*1370a723SSascha Wildner @param Length The size, in bytes, of Buffer. 4496*1370a723SSascha Wildner 4497*1370a723SSascha Wildner @return Checksum The two's complement checksum of Buffer. 4498*1370a723SSascha Wildner 4499*1370a723SSascha Wildner **/ 4500*1370a723SSascha Wildner UINT32 4501*1370a723SSascha Wildner EFIAPI 4502*1370a723SSascha Wildner CalculateCheckSum32 ( 4503*1370a723SSascha Wildner IN CONST UINT32 *Buffer, 4504*1370a723SSascha Wildner IN UINTN Length 4505*1370a723SSascha Wildner ); 4506*1370a723SSascha Wildner 4507*1370a723SSascha Wildner /** 4508*1370a723SSascha Wildner Returns the sum of all elements in a buffer of 64-bit values. During 4509*1370a723SSascha Wildner calculation, the carry bits are dropped. 4510*1370a723SSascha Wildner 4511*1370a723SSascha Wildner This function calculates the sum of the 64-bit values in the buffer 4512*1370a723SSascha Wildner specified by Buffer and Length. The carry bits in result of addition are dropped. 4513*1370a723SSascha Wildner The 64-bit result is returned. If Length is 0, then 0 is returned. 4514*1370a723SSascha Wildner 4515*1370a723SSascha Wildner If Buffer is NULL, then ASSERT(). 4516*1370a723SSascha Wildner If Buffer is not aligned on a 64-bit boundary, then ASSERT(). 4517*1370a723SSascha Wildner If Length is not aligned on a 64-bit boundary, then ASSERT(). 4518*1370a723SSascha Wildner If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). 4519*1370a723SSascha Wildner 4520*1370a723SSascha Wildner @param Buffer The pointer to the buffer to carry out the sum operation. 4521*1370a723SSascha Wildner @param Length The size, in bytes, of Buffer. 4522*1370a723SSascha Wildner 4523*1370a723SSascha Wildner @return Sum The sum of Buffer with carry bits dropped during additions. 4524*1370a723SSascha Wildner 4525*1370a723SSascha Wildner **/ 4526*1370a723SSascha Wildner UINT64 4527*1370a723SSascha Wildner EFIAPI 4528*1370a723SSascha Wildner CalculateSum64 ( 4529*1370a723SSascha Wildner IN CONST UINT64 *Buffer, 4530*1370a723SSascha Wildner IN UINTN Length 4531*1370a723SSascha Wildner ); 4532*1370a723SSascha Wildner 4533*1370a723SSascha Wildner /** 4534*1370a723SSascha Wildner Returns the two's complement checksum of all elements in a buffer of 4535*1370a723SSascha Wildner 64-bit values. 4536*1370a723SSascha Wildner 4537*1370a723SSascha Wildner This function first calculates the sum of the 64-bit values in the buffer 4538*1370a723SSascha Wildner specified by Buffer and Length. The carry bits in the result of addition 4539*1370a723SSascha Wildner are dropped. Then, the two's complement of the sum is returned. If Length 4540*1370a723SSascha Wildner is 0, then 0 is returned. 4541*1370a723SSascha Wildner 4542*1370a723SSascha Wildner If Buffer is NULL, then ASSERT(). 4543*1370a723SSascha Wildner If Buffer is not aligned on a 64-bit boundary, then ASSERT(). 4544*1370a723SSascha Wildner If Length is not aligned on a 64-bit boundary, then ASSERT(). 4545*1370a723SSascha Wildner If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). 4546*1370a723SSascha Wildner 4547*1370a723SSascha Wildner @param Buffer The pointer to the buffer to carry out the checksum operation. 4548*1370a723SSascha Wildner @param Length The size, in bytes, of Buffer. 4549*1370a723SSascha Wildner 4550*1370a723SSascha Wildner @return Checksum The two's complement checksum of Buffer. 4551*1370a723SSascha Wildner 4552*1370a723SSascha Wildner **/ 4553*1370a723SSascha Wildner UINT64 4554*1370a723SSascha Wildner EFIAPI 4555*1370a723SSascha Wildner CalculateCheckSum64 ( 4556*1370a723SSascha Wildner IN CONST UINT64 *Buffer, 4557*1370a723SSascha Wildner IN UINTN Length 4558*1370a723SSascha Wildner ); 4559*1370a723SSascha Wildner 4560*1370a723SSascha Wildner /** 4561*1370a723SSascha Wildner Computes and returns a 32-bit CRC for a data buffer. 4562*1370a723SSascha Wildner CRC32 value bases on ITU-T V.42. 4563*1370a723SSascha Wildner 4564*1370a723SSascha Wildner If Buffer is NULL, then ASSERT(). 4565*1370a723SSascha Wildner If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). 4566*1370a723SSascha Wildner 4567*1370a723SSascha Wildner @param[in] Buffer A pointer to the buffer on which the 32-bit CRC is to be computed. 4568*1370a723SSascha Wildner @param[in] Length The number of bytes in the buffer Data. 4569*1370a723SSascha Wildner 4570*1370a723SSascha Wildner @retval Crc32 The 32-bit CRC was computed for the data buffer. 4571*1370a723SSascha Wildner 4572*1370a723SSascha Wildner **/ 4573*1370a723SSascha Wildner UINT32 4574*1370a723SSascha Wildner EFIAPI 4575*1370a723SSascha Wildner CalculateCrc32 ( 4576*1370a723SSascha Wildner IN VOID *Buffer, 4577*1370a723SSascha Wildner IN UINTN Length 4578*1370a723SSascha Wildner ); 4579*1370a723SSascha Wildner 4580*1370a723SSascha Wildner /** 4581*1370a723SSascha Wildner Calculates the CRC16-ANSI checksum of the given buffer. 4582*1370a723SSascha Wildner 4583*1370a723SSascha Wildner @param[in] Buffer Pointer to the buffer. 4584*1370a723SSascha Wildner @param[in] Length Length of the buffer, in bytes. 4585*1370a723SSascha Wildner @param[in] InitialValue Initial value of the CRC. 4586*1370a723SSascha Wildner 4587*1370a723SSascha Wildner @return The CRC16-ANSI checksum. 4588*1370a723SSascha Wildner **/ 4589*1370a723SSascha Wildner UINT16 4590*1370a723SSascha Wildner EFIAPI 4591*1370a723SSascha Wildner CalculateCrc16Ansi ( 4592*1370a723SSascha Wildner IN CONST VOID *Buffer, 4593*1370a723SSascha Wildner IN UINTN Length, 4594*1370a723SSascha Wildner IN UINT16 InitialValue 4595*1370a723SSascha Wildner ); 4596*1370a723SSascha Wildner 4597*1370a723SSascha Wildner /** 4598*1370a723SSascha Wildner Calculates the CRC32c checksum of the given buffer. 4599*1370a723SSascha Wildner 4600*1370a723SSascha Wildner @param[in] Buffer Pointer to the buffer. 4601*1370a723SSascha Wildner @param[in] Length Length of the buffer, in bytes. 4602*1370a723SSascha Wildner @param[in] InitialValue Initial value of the CRC. 4603*1370a723SSascha Wildner 4604*1370a723SSascha Wildner @return The CRC32c checksum. 4605*1370a723SSascha Wildner **/ 4606*1370a723SSascha Wildner UINT32 4607*1370a723SSascha Wildner EFIAPI 4608*1370a723SSascha Wildner CalculateCrc32c ( 4609*1370a723SSascha Wildner IN CONST VOID *Buffer, 4610*1370a723SSascha Wildner IN UINTN Length, 4611*1370a723SSascha Wildner IN UINT32 InitialValue 4612*1370a723SSascha Wildner ); 4613*1370a723SSascha Wildner 4614*1370a723SSascha Wildner // 4615*1370a723SSascha Wildner // Base Library CPU Functions 4616*1370a723SSascha Wildner // 4617*1370a723SSascha Wildner 4618*1370a723SSascha Wildner /** 4619*1370a723SSascha Wildner Function entry point used when a stack switch is requested with SwitchStack() 4620*1370a723SSascha Wildner 4621*1370a723SSascha Wildner @param Context1 Context1 parameter passed into SwitchStack(). 4622*1370a723SSascha Wildner @param Context2 Context2 parameter passed into SwitchStack(). 4623*1370a723SSascha Wildner **/ 4624*1370a723SSascha Wildner typedef 4625*1370a723SSascha Wildner VOID 4626*1370a723SSascha Wildner (EFIAPI *SWITCH_STACK_ENTRY_POINT)( 4627*1370a723SSascha Wildner IN VOID *Context1 OPTIONAL, 4628*1370a723SSascha Wildner IN VOID *Context2 OPTIONAL 4629*1370a723SSascha Wildner ); 4630*1370a723SSascha Wildner 4631*1370a723SSascha Wildner /** 4632*1370a723SSascha Wildner Used to serialize load and store operations. 4633*1370a723SSascha Wildner 4634*1370a723SSascha Wildner All loads and stores that proceed calls to this function are guaranteed to be 4635*1370a723SSascha Wildner globally visible when this function returns. 4636*1370a723SSascha Wildner 4637*1370a723SSascha Wildner **/ 4638*1370a723SSascha Wildner VOID 4639*1370a723SSascha Wildner EFIAPI 4640*1370a723SSascha Wildner MemoryFence ( 4641*1370a723SSascha Wildner VOID 4642*1370a723SSascha Wildner ); 4643*1370a723SSascha Wildner 4644*1370a723SSascha Wildner /** 4645*1370a723SSascha Wildner Saves the current CPU context that can be restored with a call to LongJump() 4646*1370a723SSascha Wildner and returns 0. 4647*1370a723SSascha Wildner 4648*1370a723SSascha Wildner Saves the current CPU context in the buffer specified by JumpBuffer and 4649*1370a723SSascha Wildner returns 0. The initial call to SetJump() must always return 0. Subsequent 4650*1370a723SSascha Wildner calls to LongJump() cause a non-zero value to be returned by SetJump(). 4651*1370a723SSascha Wildner 4652*1370a723SSascha Wildner If JumpBuffer is NULL, then ASSERT(). 4653*1370a723SSascha Wildner For Itanium processors, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT(). 4654*1370a723SSascha Wildner 4655*1370a723SSascha Wildner NOTE: The structure BASE_LIBRARY_JUMP_BUFFER is CPU architecture specific. 4656*1370a723SSascha Wildner The same structure must never be used for more than one CPU architecture context. 4657*1370a723SSascha Wildner For example, a BASE_LIBRARY_JUMP_BUFFER allocated by an IA-32 module must never be used from an x64 module. 4658*1370a723SSascha Wildner SetJump()/LongJump() is not currently supported for the EBC processor type. 4659*1370a723SSascha Wildner 4660*1370a723SSascha Wildner @param JumpBuffer A pointer to CPU context buffer. 4661*1370a723SSascha Wildner 4662*1370a723SSascha Wildner @retval 0 Indicates a return from SetJump(). 4663*1370a723SSascha Wildner 4664*1370a723SSascha Wildner **/ 4665*1370a723SSascha Wildner RETURNS_TWICE 4666*1370a723SSascha Wildner UINTN 4667*1370a723SSascha Wildner EFIAPI 4668*1370a723SSascha Wildner SetJump ( 4669*1370a723SSascha Wildner OUT BASE_LIBRARY_JUMP_BUFFER *JumpBuffer 4670*1370a723SSascha Wildner ); 4671*1370a723SSascha Wildner 4672*1370a723SSascha Wildner /** 4673*1370a723SSascha Wildner Restores the CPU context that was saved with SetJump(). 4674*1370a723SSascha Wildner 4675*1370a723SSascha Wildner Restores the CPU context from the buffer specified by JumpBuffer. This 4676*1370a723SSascha Wildner function never returns to the caller. Instead is resumes execution based on 4677*1370a723SSascha Wildner the state of JumpBuffer. 4678*1370a723SSascha Wildner 4679*1370a723SSascha Wildner If JumpBuffer is NULL, then ASSERT(). 4680*1370a723SSascha Wildner For Itanium processors, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT(). 4681*1370a723SSascha Wildner If Value is 0, then ASSERT(). 4682*1370a723SSascha Wildner 4683*1370a723SSascha Wildner @param JumpBuffer A pointer to CPU context buffer. 4684*1370a723SSascha Wildner @param Value The value to return when the SetJump() context is 4685*1370a723SSascha Wildner restored and must be non-zero. 4686*1370a723SSascha Wildner 4687*1370a723SSascha Wildner **/ 4688*1370a723SSascha Wildner VOID 4689*1370a723SSascha Wildner EFIAPI 4690*1370a723SSascha Wildner LongJump ( 4691*1370a723SSascha Wildner IN BASE_LIBRARY_JUMP_BUFFER *JumpBuffer, 4692*1370a723SSascha Wildner IN UINTN Value 4693*1370a723SSascha Wildner ); 4694*1370a723SSascha Wildner 4695*1370a723SSascha Wildner /** 4696*1370a723SSascha Wildner Enables CPU interrupts. 4697*1370a723SSascha Wildner 4698*1370a723SSascha Wildner **/ 4699*1370a723SSascha Wildner VOID 4700*1370a723SSascha Wildner EFIAPI 4701*1370a723SSascha Wildner EnableInterrupts ( 4702*1370a723SSascha Wildner VOID 4703*1370a723SSascha Wildner ); 4704*1370a723SSascha Wildner 4705*1370a723SSascha Wildner /** 4706*1370a723SSascha Wildner Disables CPU interrupts. 4707*1370a723SSascha Wildner 4708*1370a723SSascha Wildner **/ 4709*1370a723SSascha Wildner VOID 4710*1370a723SSascha Wildner EFIAPI 4711*1370a723SSascha Wildner DisableInterrupts ( 4712*1370a723SSascha Wildner VOID 4713*1370a723SSascha Wildner ); 4714*1370a723SSascha Wildner 4715*1370a723SSascha Wildner /** 4716*1370a723SSascha Wildner Disables CPU interrupts and returns the interrupt state prior to the disable 4717*1370a723SSascha Wildner operation. 4718*1370a723SSascha Wildner 4719*1370a723SSascha Wildner @retval TRUE CPU interrupts were enabled on entry to this call. 4720*1370a723SSascha Wildner @retval FALSE CPU interrupts were disabled on entry to this call. 4721*1370a723SSascha Wildner 4722*1370a723SSascha Wildner **/ 4723*1370a723SSascha Wildner BOOLEAN 4724*1370a723SSascha Wildner EFIAPI 4725*1370a723SSascha Wildner SaveAndDisableInterrupts ( 4726*1370a723SSascha Wildner VOID 4727*1370a723SSascha Wildner ); 4728*1370a723SSascha Wildner 4729*1370a723SSascha Wildner /** 4730*1370a723SSascha Wildner Enables CPU interrupts for the smallest window required to capture any 4731*1370a723SSascha Wildner pending interrupts. 4732*1370a723SSascha Wildner 4733*1370a723SSascha Wildner **/ 4734*1370a723SSascha Wildner VOID 4735*1370a723SSascha Wildner EFIAPI 4736*1370a723SSascha Wildner EnableDisableInterrupts ( 4737*1370a723SSascha Wildner VOID 4738*1370a723SSascha Wildner ); 4739*1370a723SSascha Wildner 4740*1370a723SSascha Wildner /** 4741*1370a723SSascha Wildner Retrieves the current CPU interrupt state. 4742*1370a723SSascha Wildner 4743*1370a723SSascha Wildner Returns TRUE if interrupts are currently enabled. Otherwise 4744*1370a723SSascha Wildner returns FALSE. 4745*1370a723SSascha Wildner 4746*1370a723SSascha Wildner @retval TRUE CPU interrupts are enabled. 4747*1370a723SSascha Wildner @retval FALSE CPU interrupts are disabled. 4748*1370a723SSascha Wildner 4749*1370a723SSascha Wildner **/ 4750*1370a723SSascha Wildner BOOLEAN 4751*1370a723SSascha Wildner EFIAPI 4752*1370a723SSascha Wildner GetInterruptState ( 4753*1370a723SSascha Wildner VOID 4754*1370a723SSascha Wildner ); 4755*1370a723SSascha Wildner 4756*1370a723SSascha Wildner /** 4757*1370a723SSascha Wildner Set the current CPU interrupt state. 4758*1370a723SSascha Wildner 4759*1370a723SSascha Wildner Sets the current CPU interrupt state to the state specified by 4760*1370a723SSascha Wildner InterruptState. If InterruptState is TRUE, then interrupts are enabled. If 4761*1370a723SSascha Wildner InterruptState is FALSE, then interrupts are disabled. InterruptState is 4762*1370a723SSascha Wildner returned. 4763*1370a723SSascha Wildner 4764*1370a723SSascha Wildner @param InterruptState TRUE if interrupts should enabled. FALSE if 4765*1370a723SSascha Wildner interrupts should be disabled. 4766*1370a723SSascha Wildner 4767*1370a723SSascha Wildner @return InterruptState 4768*1370a723SSascha Wildner 4769*1370a723SSascha Wildner **/ 4770*1370a723SSascha Wildner BOOLEAN 4771*1370a723SSascha Wildner EFIAPI 4772*1370a723SSascha Wildner SetInterruptState ( 4773*1370a723SSascha Wildner IN BOOLEAN InterruptState 4774*1370a723SSascha Wildner ); 4775*1370a723SSascha Wildner 4776*1370a723SSascha Wildner /** 4777*1370a723SSascha Wildner Requests CPU to pause for a short period of time. 4778*1370a723SSascha Wildner 4779*1370a723SSascha Wildner Requests CPU to pause for a short period of time. Typically used in MP 4780*1370a723SSascha Wildner systems to prevent memory starvation while waiting for a spin lock. 4781*1370a723SSascha Wildner 4782*1370a723SSascha Wildner **/ 4783*1370a723SSascha Wildner VOID 4784*1370a723SSascha Wildner EFIAPI 4785*1370a723SSascha Wildner CpuPause ( 4786*1370a723SSascha Wildner VOID 4787*1370a723SSascha Wildner ); 4788*1370a723SSascha Wildner 4789*1370a723SSascha Wildner /** 4790*1370a723SSascha Wildner Transfers control to a function starting with a new stack. 4791*1370a723SSascha Wildner 4792*1370a723SSascha Wildner Transfers control to the function specified by EntryPoint using the 4793*1370a723SSascha Wildner new stack specified by NewStack and passing in the parameters specified 4794*1370a723SSascha Wildner by Context1 and Context2. Context1 and Context2 are optional and may 4795*1370a723SSascha Wildner be NULL. The function EntryPoint must never return. This function 4796*1370a723SSascha Wildner supports a variable number of arguments following the NewStack parameter. 4797*1370a723SSascha Wildner These additional arguments are ignored on IA-32, x64, and EBC architectures. 4798*1370a723SSascha Wildner Itanium processors expect one additional parameter of type VOID * that specifies 4799*1370a723SSascha Wildner the new backing store pointer. 4800*1370a723SSascha Wildner 4801*1370a723SSascha Wildner If EntryPoint is NULL, then ASSERT(). 4802*1370a723SSascha Wildner If NewStack is NULL, then ASSERT(). 4803*1370a723SSascha Wildner 4804*1370a723SSascha Wildner @param EntryPoint A pointer to function to call with the new stack. 4805*1370a723SSascha Wildner @param Context1 A pointer to the context to pass into the EntryPoint 4806*1370a723SSascha Wildner function. 4807*1370a723SSascha Wildner @param Context2 A pointer to the context to pass into the EntryPoint 4808*1370a723SSascha Wildner function. 4809*1370a723SSascha Wildner @param NewStack A pointer to the new stack to use for the EntryPoint 4810*1370a723SSascha Wildner function. 4811*1370a723SSascha Wildner @param ... This variable argument list is ignored for IA-32, x64, and 4812*1370a723SSascha Wildner EBC architectures. For Itanium processors, this variable 4813*1370a723SSascha Wildner argument list is expected to contain a single parameter of 4814*1370a723SSascha Wildner type VOID * that specifies the new backing store pointer. 4815*1370a723SSascha Wildner 4816*1370a723SSascha Wildner 4817*1370a723SSascha Wildner **/ 4818*1370a723SSascha Wildner VOID 4819*1370a723SSascha Wildner EFIAPI 4820*1370a723SSascha Wildner SwitchStack ( 4821*1370a723SSascha Wildner IN SWITCH_STACK_ENTRY_POINT EntryPoint, 4822*1370a723SSascha Wildner IN VOID *Context1 OPTIONAL, 4823*1370a723SSascha Wildner IN VOID *Context2 OPTIONAL, 4824*1370a723SSascha Wildner IN VOID *NewStack, 4825*1370a723SSascha Wildner ... 4826*1370a723SSascha Wildner ); 4827*1370a723SSascha Wildner 4828*1370a723SSascha Wildner /** 4829*1370a723SSascha Wildner Generates a breakpoint on the CPU. 4830*1370a723SSascha Wildner 4831*1370a723SSascha Wildner Generates a breakpoint on the CPU. The breakpoint must be implemented such 4832*1370a723SSascha Wildner that code can resume normal execution after the breakpoint. 4833*1370a723SSascha Wildner 4834*1370a723SSascha Wildner **/ 4835*1370a723SSascha Wildner VOID 4836*1370a723SSascha Wildner EFIAPI 4837*1370a723SSascha Wildner CpuBreakpoint ( 4838*1370a723SSascha Wildner VOID 4839*1370a723SSascha Wildner ); 4840*1370a723SSascha Wildner 4841*1370a723SSascha Wildner /** 4842*1370a723SSascha Wildner Executes an infinite loop. 4843*1370a723SSascha Wildner 4844*1370a723SSascha Wildner Forces the CPU to execute an infinite loop. A debugger may be used to skip 4845*1370a723SSascha Wildner past the loop and the code that follows the loop must execute properly. This 4846*1370a723SSascha Wildner implies that the infinite loop must not cause the code that follow it to be 4847*1370a723SSascha Wildner optimized away. 4848*1370a723SSascha Wildner 4849*1370a723SSascha Wildner **/ 4850*1370a723SSascha Wildner VOID 4851*1370a723SSascha Wildner EFIAPI 4852*1370a723SSascha Wildner CpuDeadLoop ( 4853*1370a723SSascha Wildner VOID 4854*1370a723SSascha Wildner ); 4855*1370a723SSascha Wildner 4856*1370a723SSascha Wildner /** 4857*1370a723SSascha Wildner Uses as a barrier to stop speculative execution. 4858*1370a723SSascha Wildner 4859*1370a723SSascha Wildner Ensures that no later instruction will execute speculatively, until all prior 4860*1370a723SSascha Wildner instructions have completed. 4861*1370a723SSascha Wildner 4862*1370a723SSascha Wildner **/ 4863*1370a723SSascha Wildner VOID 4864*1370a723SSascha Wildner EFIAPI 4865*1370a723SSascha Wildner SpeculationBarrier ( 4866*1370a723SSascha Wildner VOID 4867*1370a723SSascha Wildner ); 4868*1370a723SSascha Wildner 4869*1370a723SSascha Wildner #if defined (MDE_CPU_X64) || defined (MDE_CPU_IA32) 4870*1370a723SSascha Wildner 4871*1370a723SSascha Wildner /** 4872*1370a723SSascha Wildner The TDCALL instruction causes a VM exit to the Intel TDX module. It is 4873*1370a723SSascha Wildner used to call guest-side Intel TDX functions, either local or a TD exit 4874*1370a723SSascha Wildner to the host VMM, as selected by Leaf. 4875*1370a723SSascha Wildner 4876*1370a723SSascha Wildner @param[in] Leaf Leaf number of TDCALL instruction 4877*1370a723SSascha Wildner @param[in] Arg1 Arg1 4878*1370a723SSascha Wildner @param[in] Arg2 Arg2 4879*1370a723SSascha Wildner @param[in] Arg3 Arg3 4880*1370a723SSascha Wildner @param[in,out] Results Returned result of the Leaf function 4881*1370a723SSascha Wildner 4882*1370a723SSascha Wildner @return 0 A successful call 4883*1370a723SSascha Wildner @return Other See individual leaf functions 4884*1370a723SSascha Wildner **/ 4885*1370a723SSascha Wildner UINTN 4886*1370a723SSascha Wildner EFIAPI 4887*1370a723SSascha Wildner TdCall ( 4888*1370a723SSascha Wildner IN UINT64 Leaf, 4889*1370a723SSascha Wildner IN UINT64 Arg1, 4890*1370a723SSascha Wildner IN UINT64 Arg2, 4891*1370a723SSascha Wildner IN UINT64 Arg3, 4892*1370a723SSascha Wildner IN OUT VOID *Results 4893*1370a723SSascha Wildner ); 4894*1370a723SSascha Wildner 4895*1370a723SSascha Wildner /** 4896*1370a723SSascha Wildner TDVMALL is a leaf function 0 for TDCALL. It helps invoke services from the 4897*1370a723SSascha Wildner host VMM to pass/receive information. 4898*1370a723SSascha Wildner 4899*1370a723SSascha Wildner @param[in] Leaf Number of sub-functions 4900*1370a723SSascha Wildner @param[in] Arg1 Arg1 4901*1370a723SSascha Wildner @param[in] Arg2 Arg2 4902*1370a723SSascha Wildner @param[in] Arg3 Arg3 4903*1370a723SSascha Wildner @param[in] Arg4 Arg4 4904*1370a723SSascha Wildner @param[in,out] Results Returned result of the sub-function 4905*1370a723SSascha Wildner 4906*1370a723SSascha Wildner @return 0 A successful call 4907*1370a723SSascha Wildner @return Other See individual sub-functions 4908*1370a723SSascha Wildner 4909*1370a723SSascha Wildner **/ 4910*1370a723SSascha Wildner UINTN 4911*1370a723SSascha Wildner EFIAPI 4912*1370a723SSascha Wildner TdVmCall ( 4913*1370a723SSascha Wildner IN UINT64 Leaf, 4914*1370a723SSascha Wildner IN UINT64 Arg1, 4915*1370a723SSascha Wildner IN UINT64 Arg2, 4916*1370a723SSascha Wildner IN UINT64 Arg3, 4917*1370a723SSascha Wildner IN UINT64 Arg4, 4918*1370a723SSascha Wildner IN OUT VOID *Results 4919*1370a723SSascha Wildner ); 4920*1370a723SSascha Wildner 4921*1370a723SSascha Wildner /** 4922*1370a723SSascha Wildner Probe if TD is enabled. 4923*1370a723SSascha Wildner 4924*1370a723SSascha Wildner @return TRUE TD is enabled. 4925*1370a723SSascha Wildner @return FALSE TD is not enabled. 4926*1370a723SSascha Wildner **/ 4927*1370a723SSascha Wildner BOOLEAN 4928*1370a723SSascha Wildner EFIAPI 4929*1370a723SSascha Wildner TdIsEnabled ( 4930*1370a723SSascha Wildner VOID 4931*1370a723SSascha Wildner ); 4932*1370a723SSascha Wildner 4933*1370a723SSascha Wildner #endif 4934*1370a723SSascha Wildner 4935*1370a723SSascha Wildner #if defined (MDE_CPU_X64) 4936*1370a723SSascha Wildner // 4937*1370a723SSascha Wildner // The page size for the PVALIDATE instruction 4938*1370a723SSascha Wildner // 4939*1370a723SSascha Wildner typedef enum { 4940*1370a723SSascha Wildner PvalidatePageSize4K = 0, 4941*1370a723SSascha Wildner PvalidatePageSize2MB, 4942*1370a723SSascha Wildner } PVALIDATE_PAGE_SIZE; 4943*1370a723SSascha Wildner 4944*1370a723SSascha Wildner // 4945*1370a723SSascha Wildner // PVALIDATE Return Code. 4946*1370a723SSascha Wildner // 4947*1370a723SSascha Wildner #define PVALIDATE_RET_SUCCESS 0 4948*1370a723SSascha Wildner #define PVALIDATE_RET_FAIL_INPUT 1 4949*1370a723SSascha Wildner #define PVALIDATE_RET_SIZE_MISMATCH 6 4950*1370a723SSascha Wildner 4951*1370a723SSascha Wildner // 4952*1370a723SSascha Wildner // The PVALIDATE instruction did not make any changes to the RMP entry. 4953*1370a723SSascha Wildner // 4954*1370a723SSascha Wildner #define PVALIDATE_RET_NO_RMPUPDATE 255 4955*1370a723SSascha Wildner 4956*1370a723SSascha Wildner /** 4957*1370a723SSascha Wildner Execute a PVALIDATE instruction to validate or to rescinds validation of a guest 4958*1370a723SSascha Wildner page's RMP entry. 4959*1370a723SSascha Wildner 4960*1370a723SSascha Wildner The instruction is available only when CPUID Fn8000_001F_EAX[SNP]=1. 4961*1370a723SSascha Wildner 4962*1370a723SSascha Wildner The function is available on X64. 4963*1370a723SSascha Wildner 4964*1370a723SSascha Wildner @param[in] PageSize The page size to use. 4965*1370a723SSascha Wildner @param[in] Validate If TRUE, validate the guest virtual address 4966*1370a723SSascha Wildner otherwise invalidate the guest virtual address. 4967*1370a723SSascha Wildner @param[in] Address The guest virtual address. 4968*1370a723SSascha Wildner 4969*1370a723SSascha Wildner @retval PVALIDATE_RET_SUCCESS The PVALIDATE instruction succeeded, and 4970*1370a723SSascha Wildner updated the RMP entry. 4971*1370a723SSascha Wildner @retval PVALIDATE_RET_NO_RMPUPDATE The PVALIDATE instruction succeeded, but 4972*1370a723SSascha Wildner did not update the RMP entry. 4973*1370a723SSascha Wildner @return Failure code from the PVALIDATE 4974*1370a723SSascha Wildner instruction. 4975*1370a723SSascha Wildner **/ 4976*1370a723SSascha Wildner UINT32 4977*1370a723SSascha Wildner EFIAPI 4978*1370a723SSascha Wildner AsmPvalidate ( 4979*1370a723SSascha Wildner IN PVALIDATE_PAGE_SIZE PageSize, 4980*1370a723SSascha Wildner IN BOOLEAN Validate, 4981*1370a723SSascha Wildner IN PHYSICAL_ADDRESS Address 4982*1370a723SSascha Wildner ); 4983*1370a723SSascha Wildner 4984*1370a723SSascha Wildner // 4985*1370a723SSascha Wildner // RDX settings for RMPADJUST 4986*1370a723SSascha Wildner // 4987*1370a723SSascha Wildner #define RMPADJUST_VMPL_MAX 3 4988*1370a723SSascha Wildner #define RMPADJUST_VMPL_MASK 0xFF 4989*1370a723SSascha Wildner #define RMPADJUST_VMPL_SHIFT 0 4990*1370a723SSascha Wildner #define RMPADJUST_PERMISSION_MASK_MASK 0xFF 4991*1370a723SSascha Wildner #define RMPADJUST_PERMISSION_MASK_SHIFT 8 4992*1370a723SSascha Wildner #define RMPADJUST_VMSA_PAGE_BIT BIT16 4993*1370a723SSascha Wildner 4994*1370a723SSascha Wildner /** 4995*1370a723SSascha Wildner Adjusts the permissions of an SEV-SNP guest page. 4996*1370a723SSascha Wildner 4997*1370a723SSascha Wildner Executes a RMPADJUST instruction with the register state specified by Rax, 4998*1370a723SSascha Wildner Rcx, and Rdx. Returns Eax. This function is only available on X64. 4999*1370a723SSascha Wildner 5000*1370a723SSascha Wildner The instruction is available only when CPUID Fn8000_001F_EAX[SNP]=1. 5001*1370a723SSascha Wildner 5002*1370a723SSascha Wildner @param[in] Rax The value to load into RAX before executing the RMPADJUST 5003*1370a723SSascha Wildner instruction. 5004*1370a723SSascha Wildner @param[in] Rcx The value to load into RCX before executing the RMPADJUST 5005*1370a723SSascha Wildner instruction. 5006*1370a723SSascha Wildner @param[in] Rdx The value to load into RDX before executing the RMPADJUST 5007*1370a723SSascha Wildner instruction. 5008*1370a723SSascha Wildner 5009*1370a723SSascha Wildner @return Eax 5010*1370a723SSascha Wildner **/ 5011*1370a723SSascha Wildner UINT32 5012*1370a723SSascha Wildner EFIAPI 5013*1370a723SSascha Wildner AsmRmpAdjust ( 5014*1370a723SSascha Wildner IN UINT64 Rax, 5015*1370a723SSascha Wildner IN UINT64 Rcx, 5016*1370a723SSascha Wildner IN UINT64 Rdx 5017*1370a723SSascha Wildner ); 5018*1370a723SSascha Wildner 5019*1370a723SSascha Wildner #endif 5020*1370a723SSascha Wildner 5021*1370a723SSascha Wildner #if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64) 5022*1370a723SSascha Wildner /// 5023*1370a723SSascha Wildner /// IA32 and x64 Specific Functions. 5024*1370a723SSascha Wildner /// Byte packed structure for 16-bit Real Mode EFLAGS. 5025*1370a723SSascha Wildner /// 5026*1370a723SSascha Wildner typedef union { 5027*1370a723SSascha Wildner struct { 5028*1370a723SSascha Wildner UINT32 CF : 1; ///< Carry Flag. 5029*1370a723SSascha Wildner UINT32 Reserved_0 : 1; ///< Reserved. 5030*1370a723SSascha Wildner UINT32 PF : 1; ///< Parity Flag. 5031*1370a723SSascha Wildner UINT32 Reserved_1 : 1; ///< Reserved. 5032*1370a723SSascha Wildner UINT32 AF : 1; ///< Auxiliary Carry Flag. 5033*1370a723SSascha Wildner UINT32 Reserved_2 : 1; ///< Reserved. 5034*1370a723SSascha Wildner UINT32 ZF : 1; ///< Zero Flag. 5035*1370a723SSascha Wildner UINT32 SF : 1; ///< Sign Flag. 5036*1370a723SSascha Wildner UINT32 TF : 1; ///< Trap Flag. 5037*1370a723SSascha Wildner UINT32 IF : 1; ///< Interrupt Enable Flag. 5038*1370a723SSascha Wildner UINT32 DF : 1; ///< Direction Flag. 5039*1370a723SSascha Wildner UINT32 OF : 1; ///< Overflow Flag. 5040*1370a723SSascha Wildner UINT32 IOPL : 2; ///< I/O Privilege Level. 5041*1370a723SSascha Wildner UINT32 NT : 1; ///< Nested Task. 5042*1370a723SSascha Wildner UINT32 Reserved_3 : 1; ///< Reserved. 5043*1370a723SSascha Wildner } Bits; 5044*1370a723SSascha Wildner UINT16 Uint16; 5045*1370a723SSascha Wildner } IA32_FLAGS16; 5046*1370a723SSascha Wildner 5047*1370a723SSascha Wildner /// 5048*1370a723SSascha Wildner /// Byte packed structure for EFLAGS/RFLAGS. 5049*1370a723SSascha Wildner /// 32-bits on IA-32. 5050*1370a723SSascha Wildner /// 64-bits on x64. The upper 32-bits on x64 are reserved. 5051*1370a723SSascha Wildner /// 5052*1370a723SSascha Wildner typedef union { 5053*1370a723SSascha Wildner struct { 5054*1370a723SSascha Wildner UINT32 CF : 1; ///< Carry Flag. 5055*1370a723SSascha Wildner UINT32 Reserved_0 : 1; ///< Reserved. 5056*1370a723SSascha Wildner UINT32 PF : 1; ///< Parity Flag. 5057*1370a723SSascha Wildner UINT32 Reserved_1 : 1; ///< Reserved. 5058*1370a723SSascha Wildner UINT32 AF : 1; ///< Auxiliary Carry Flag. 5059*1370a723SSascha Wildner UINT32 Reserved_2 : 1; ///< Reserved. 5060*1370a723SSascha Wildner UINT32 ZF : 1; ///< Zero Flag. 5061*1370a723SSascha Wildner UINT32 SF : 1; ///< Sign Flag. 5062*1370a723SSascha Wildner UINT32 TF : 1; ///< Trap Flag. 5063*1370a723SSascha Wildner UINT32 IF : 1; ///< Interrupt Enable Flag. 5064*1370a723SSascha Wildner UINT32 DF : 1; ///< Direction Flag. 5065*1370a723SSascha Wildner UINT32 OF : 1; ///< Overflow Flag. 5066*1370a723SSascha Wildner UINT32 IOPL : 2; ///< I/O Privilege Level. 5067*1370a723SSascha Wildner UINT32 NT : 1; ///< Nested Task. 5068*1370a723SSascha Wildner UINT32 Reserved_3 : 1; ///< Reserved. 5069*1370a723SSascha Wildner UINT32 RF : 1; ///< Resume Flag. 5070*1370a723SSascha Wildner UINT32 VM : 1; ///< Virtual 8086 Mode. 5071*1370a723SSascha Wildner UINT32 AC : 1; ///< Alignment Check. 5072*1370a723SSascha Wildner UINT32 VIF : 1; ///< Virtual Interrupt Flag. 5073*1370a723SSascha Wildner UINT32 VIP : 1; ///< Virtual Interrupt Pending. 5074*1370a723SSascha Wildner UINT32 ID : 1; ///< ID Flag. 5075*1370a723SSascha Wildner UINT32 Reserved_4 : 10; ///< Reserved. 5076*1370a723SSascha Wildner } Bits; 5077*1370a723SSascha Wildner UINTN UintN; 5078*1370a723SSascha Wildner } IA32_EFLAGS32; 5079*1370a723SSascha Wildner 5080*1370a723SSascha Wildner /// 5081*1370a723SSascha Wildner /// Byte packed structure for Control Register 0 (CR0). 5082*1370a723SSascha Wildner /// 32-bits on IA-32. 5083*1370a723SSascha Wildner /// 64-bits on x64. The upper 32-bits on x64 are reserved. 5084*1370a723SSascha Wildner /// 5085*1370a723SSascha Wildner typedef union { 5086*1370a723SSascha Wildner struct { 5087*1370a723SSascha Wildner UINT32 PE : 1; ///< Protection Enable. 5088*1370a723SSascha Wildner UINT32 MP : 1; ///< Monitor Coprocessor. 5089*1370a723SSascha Wildner UINT32 EM : 1; ///< Emulation. 5090*1370a723SSascha Wildner UINT32 TS : 1; ///< Task Switched. 5091*1370a723SSascha Wildner UINT32 ET : 1; ///< Extension Type. 5092*1370a723SSascha Wildner UINT32 NE : 1; ///< Numeric Error. 5093*1370a723SSascha Wildner UINT32 Reserved_0 : 10; ///< Reserved. 5094*1370a723SSascha Wildner UINT32 WP : 1; ///< Write Protect. 5095*1370a723SSascha Wildner UINT32 Reserved_1 : 1; ///< Reserved. 5096*1370a723SSascha Wildner UINT32 AM : 1; ///< Alignment Mask. 5097*1370a723SSascha Wildner UINT32 Reserved_2 : 10; ///< Reserved. 5098*1370a723SSascha Wildner UINT32 NW : 1; ///< Mot Write-through. 5099*1370a723SSascha Wildner UINT32 CD : 1; ///< Cache Disable. 5100*1370a723SSascha Wildner UINT32 PG : 1; ///< Paging. 5101*1370a723SSascha Wildner } Bits; 5102*1370a723SSascha Wildner UINTN UintN; 5103*1370a723SSascha Wildner } IA32_CR0; 5104*1370a723SSascha Wildner 5105*1370a723SSascha Wildner /// 5106*1370a723SSascha Wildner /// Byte packed structure for Control Register 4 (CR4). 5107*1370a723SSascha Wildner /// 32-bits on IA-32. 5108*1370a723SSascha Wildner /// 64-bits on x64. The upper 32-bits on x64 are reserved. 5109*1370a723SSascha Wildner /// 5110*1370a723SSascha Wildner typedef union { 5111*1370a723SSascha Wildner struct { 5112*1370a723SSascha Wildner UINT32 VME : 1; ///< Virtual-8086 Mode Extensions. 5113*1370a723SSascha Wildner UINT32 PVI : 1; ///< Protected-Mode Virtual Interrupts. 5114*1370a723SSascha Wildner UINT32 TSD : 1; ///< Time Stamp Disable. 5115*1370a723SSascha Wildner UINT32 DE : 1; ///< Debugging Extensions. 5116*1370a723SSascha Wildner UINT32 PSE : 1; ///< Page Size Extensions. 5117*1370a723SSascha Wildner UINT32 PAE : 1; ///< Physical Address Extension. 5118*1370a723SSascha Wildner UINT32 MCE : 1; ///< Machine Check Enable. 5119*1370a723SSascha Wildner UINT32 PGE : 1; ///< Page Global Enable. 5120*1370a723SSascha Wildner UINT32 PCE : 1; ///< Performance Monitoring Counter 5121*1370a723SSascha Wildner ///< Enable. 5122*1370a723SSascha Wildner UINT32 OSFXSR : 1; ///< Operating System Support for 5123*1370a723SSascha Wildner ///< FXSAVE and FXRSTOR instructions 5124*1370a723SSascha Wildner UINT32 OSXMMEXCPT : 1; ///< Operating System Support for 5125*1370a723SSascha Wildner ///< Unmasked SIMD Floating Point 5126*1370a723SSascha Wildner ///< Exceptions. 5127*1370a723SSascha Wildner UINT32 UMIP : 1; ///< User-Mode Instruction Prevention. 5128*1370a723SSascha Wildner UINT32 LA57 : 1; ///< Linear Address 57bit. 5129*1370a723SSascha Wildner UINT32 VMXE : 1; ///< VMX Enable. 5130*1370a723SSascha Wildner UINT32 SMXE : 1; ///< SMX Enable. 5131*1370a723SSascha Wildner UINT32 Reserved_3 : 1; ///< Reserved. 5132*1370a723SSascha Wildner UINT32 FSGSBASE : 1; ///< FSGSBASE Enable. 5133*1370a723SSascha Wildner UINT32 PCIDE : 1; ///< PCID Enable. 5134*1370a723SSascha Wildner UINT32 OSXSAVE : 1; ///< XSAVE and Processor Extended States Enable. 5135*1370a723SSascha Wildner UINT32 Reserved_4 : 1; ///< Reserved. 5136*1370a723SSascha Wildner UINT32 SMEP : 1; ///< SMEP Enable. 5137*1370a723SSascha Wildner UINT32 SMAP : 1; ///< SMAP Enable. 5138*1370a723SSascha Wildner UINT32 PKE : 1; ///< Protection-Key Enable. 5139*1370a723SSascha Wildner UINT32 Reserved_5 : 9; ///< Reserved. 5140*1370a723SSascha Wildner } Bits; 5141*1370a723SSascha Wildner UINTN UintN; 5142*1370a723SSascha Wildner } IA32_CR4; 5143*1370a723SSascha Wildner 5144*1370a723SSascha Wildner /// 5145*1370a723SSascha Wildner /// Byte packed structure for a segment descriptor in a GDT/LDT. 5146*1370a723SSascha Wildner /// 5147*1370a723SSascha Wildner typedef union { 5148*1370a723SSascha Wildner struct { 5149*1370a723SSascha Wildner UINT32 LimitLow : 16; 5150*1370a723SSascha Wildner UINT32 BaseLow : 16; 5151*1370a723SSascha Wildner UINT32 BaseMid : 8; 5152*1370a723SSascha Wildner UINT32 Type : 4; 5153*1370a723SSascha Wildner UINT32 S : 1; 5154*1370a723SSascha Wildner UINT32 DPL : 2; 5155*1370a723SSascha Wildner UINT32 P : 1; 5156*1370a723SSascha Wildner UINT32 LimitHigh : 4; 5157*1370a723SSascha Wildner UINT32 AVL : 1; 5158*1370a723SSascha Wildner UINT32 L : 1; 5159*1370a723SSascha Wildner UINT32 DB : 1; 5160*1370a723SSascha Wildner UINT32 G : 1; 5161*1370a723SSascha Wildner UINT32 BaseHigh : 8; 5162*1370a723SSascha Wildner } Bits; 5163*1370a723SSascha Wildner UINT64 Uint64; 5164*1370a723SSascha Wildner } IA32_SEGMENT_DESCRIPTOR; 5165*1370a723SSascha Wildner 5166*1370a723SSascha Wildner /// 5167*1370a723SSascha Wildner /// Byte packed structure for an IDTR, GDTR, LDTR descriptor. 5168*1370a723SSascha Wildner /// 5169*1370a723SSascha Wildner #pragma pack (1) 5170*1370a723SSascha Wildner typedef struct { 5171*1370a723SSascha Wildner UINT16 Limit; 5172*1370a723SSascha Wildner UINTN Base; 5173*1370a723SSascha Wildner } IA32_DESCRIPTOR; 5174*1370a723SSascha Wildner #pragma pack () 5175*1370a723SSascha Wildner 5176*1370a723SSascha Wildner #define IA32_IDT_GATE_TYPE_TASK 0x85 5177*1370a723SSascha Wildner #define IA32_IDT_GATE_TYPE_INTERRUPT_16 0x86 5178*1370a723SSascha Wildner #define IA32_IDT_GATE_TYPE_TRAP_16 0x87 5179*1370a723SSascha Wildner #define IA32_IDT_GATE_TYPE_INTERRUPT_32 0x8E 5180*1370a723SSascha Wildner #define IA32_IDT_GATE_TYPE_TRAP_32 0x8F 5181*1370a723SSascha Wildner 5182*1370a723SSascha Wildner #define IA32_GDT_TYPE_TSS 0x9 5183*1370a723SSascha Wildner #define IA32_GDT_ALIGNMENT 8 5184*1370a723SSascha Wildner 5185*1370a723SSascha Wildner #if defined (MDE_CPU_IA32) 5186*1370a723SSascha Wildner /// 5187*1370a723SSascha Wildner /// Byte packed structure for an IA-32 Interrupt Gate Descriptor. 5188*1370a723SSascha Wildner /// 5189*1370a723SSascha Wildner typedef union { 5190*1370a723SSascha Wildner struct { 5191*1370a723SSascha Wildner UINT32 OffsetLow : 16; ///< Offset bits 15..0. 5192*1370a723SSascha Wildner UINT32 Selector : 16; ///< Selector. 5193*1370a723SSascha Wildner UINT32 Reserved_0 : 8; ///< Reserved. 5194*1370a723SSascha Wildner UINT32 GateType : 8; ///< Gate Type. See #defines above. 5195*1370a723SSascha Wildner UINT32 OffsetHigh : 16; ///< Offset bits 31..16. 5196*1370a723SSascha Wildner } Bits; 5197*1370a723SSascha Wildner UINT64 Uint64; 5198*1370a723SSascha Wildner } IA32_IDT_GATE_DESCRIPTOR; 5199*1370a723SSascha Wildner 5200*1370a723SSascha Wildner #pragma pack (1) 5201*1370a723SSascha Wildner // 5202*1370a723SSascha Wildner // IA32 Task-State Segment Definition 5203*1370a723SSascha Wildner // 5204*1370a723SSascha Wildner typedef struct { 5205*1370a723SSascha Wildner UINT16 PreviousTaskLink; 5206*1370a723SSascha Wildner UINT16 Reserved_2; 5207*1370a723SSascha Wildner UINT32 ESP0; 5208*1370a723SSascha Wildner UINT16 SS0; 5209*1370a723SSascha Wildner UINT16 Reserved_10; 5210*1370a723SSascha Wildner UINT32 ESP1; 5211*1370a723SSascha Wildner UINT16 SS1; 5212*1370a723SSascha Wildner UINT16 Reserved_18; 5213*1370a723SSascha Wildner UINT32 ESP2; 5214*1370a723SSascha Wildner UINT16 SS2; 5215*1370a723SSascha Wildner UINT16 Reserved_26; 5216*1370a723SSascha Wildner UINT32 CR3; 5217*1370a723SSascha Wildner UINT32 EIP; 5218*1370a723SSascha Wildner UINT32 EFLAGS; 5219*1370a723SSascha Wildner UINT32 EAX; 5220*1370a723SSascha Wildner UINT32 ECX; 5221*1370a723SSascha Wildner UINT32 EDX; 5222*1370a723SSascha Wildner UINT32 EBX; 5223*1370a723SSascha Wildner UINT32 ESP; 5224*1370a723SSascha Wildner UINT32 EBP; 5225*1370a723SSascha Wildner UINT32 ESI; 5226*1370a723SSascha Wildner UINT32 EDI; 5227*1370a723SSascha Wildner UINT16 ES; 5228*1370a723SSascha Wildner UINT16 Reserved_74; 5229*1370a723SSascha Wildner UINT16 CS; 5230*1370a723SSascha Wildner UINT16 Reserved_78; 5231*1370a723SSascha Wildner UINT16 SS; 5232*1370a723SSascha Wildner UINT16 Reserved_82; 5233*1370a723SSascha Wildner UINT16 DS; 5234*1370a723SSascha Wildner UINT16 Reserved_86; 5235*1370a723SSascha Wildner UINT16 FS; 5236*1370a723SSascha Wildner UINT16 Reserved_90; 5237*1370a723SSascha Wildner UINT16 GS; 5238*1370a723SSascha Wildner UINT16 Reserved_94; 5239*1370a723SSascha Wildner UINT16 LDTSegmentSelector; 5240*1370a723SSascha Wildner UINT16 Reserved_98; 5241*1370a723SSascha Wildner UINT16 T; 5242*1370a723SSascha Wildner UINT16 IOMapBaseAddress; 5243*1370a723SSascha Wildner } IA32_TASK_STATE_SEGMENT; 5244*1370a723SSascha Wildner 5245*1370a723SSascha Wildner typedef union { 5246*1370a723SSascha Wildner struct { 5247*1370a723SSascha Wildner UINT32 LimitLow : 16; ///< Segment Limit 15..00 5248*1370a723SSascha Wildner UINT32 BaseLow : 16; ///< Base Address 15..00 5249*1370a723SSascha Wildner UINT32 BaseMid : 8; ///< Base Address 23..16 5250*1370a723SSascha Wildner UINT32 Type : 4; ///< Type (1 0 B 1) 5251*1370a723SSascha Wildner UINT32 Reserved_43 : 1; ///< 0 5252*1370a723SSascha Wildner UINT32 DPL : 2; ///< Descriptor Privilege Level 5253*1370a723SSascha Wildner UINT32 P : 1; ///< Segment Present 5254*1370a723SSascha Wildner UINT32 LimitHigh : 4; ///< Segment Limit 19..16 5255*1370a723SSascha Wildner UINT32 AVL : 1; ///< Available for use by system software 5256*1370a723SSascha Wildner UINT32 Reserved_52 : 2; ///< 0 0 5257*1370a723SSascha Wildner UINT32 G : 1; ///< Granularity 5258*1370a723SSascha Wildner UINT32 BaseHigh : 8; ///< Base Address 31..24 5259*1370a723SSascha Wildner } Bits; 5260*1370a723SSascha Wildner UINT64 Uint64; 5261*1370a723SSascha Wildner } IA32_TSS_DESCRIPTOR; 5262*1370a723SSascha Wildner #pragma pack () 5263*1370a723SSascha Wildner 5264*1370a723SSascha Wildner #endif // defined (MDE_CPU_IA32) 5265*1370a723SSascha Wildner 5266*1370a723SSascha Wildner #if defined (MDE_CPU_X64) 5267*1370a723SSascha Wildner /// 5268*1370a723SSascha Wildner /// Byte packed structure for an x64 Interrupt Gate Descriptor. 5269*1370a723SSascha Wildner /// 5270*1370a723SSascha Wildner typedef union { 5271*1370a723SSascha Wildner struct { 5272*1370a723SSascha Wildner UINT32 OffsetLow : 16; ///< Offset bits 15..0. 5273*1370a723SSascha Wildner UINT32 Selector : 16; ///< Selector. 5274*1370a723SSascha Wildner UINT32 Reserved_0 : 8; ///< Reserved. 5275*1370a723SSascha Wildner UINT32 GateType : 8; ///< Gate Type. See #defines above. 5276*1370a723SSascha Wildner UINT32 OffsetHigh : 16; ///< Offset bits 31..16. 5277*1370a723SSascha Wildner UINT32 OffsetUpper : 32; ///< Offset bits 63..32. 5278*1370a723SSascha Wildner UINT32 Reserved_1 : 32; ///< Reserved. 5279*1370a723SSascha Wildner } Bits; 5280*1370a723SSascha Wildner struct { 5281*1370a723SSascha Wildner UINT64 Uint64; 5282*1370a723SSascha Wildner UINT64 Uint64_1; 5283*1370a723SSascha Wildner } Uint128; 5284*1370a723SSascha Wildner } IA32_IDT_GATE_DESCRIPTOR; 5285*1370a723SSascha Wildner 5286*1370a723SSascha Wildner #pragma pack (1) 5287*1370a723SSascha Wildner // 5288*1370a723SSascha Wildner // IA32 Task-State Segment Definition 5289*1370a723SSascha Wildner // 5290*1370a723SSascha Wildner typedef struct { 5291*1370a723SSascha Wildner UINT32 Reserved_0; 5292*1370a723SSascha Wildner UINT64 RSP0; 5293*1370a723SSascha Wildner UINT64 RSP1; 5294*1370a723SSascha Wildner UINT64 RSP2; 5295*1370a723SSascha Wildner UINT64 Reserved_28; 5296*1370a723SSascha Wildner UINT64 IST[7]; 5297*1370a723SSascha Wildner UINT64 Reserved_92; 5298*1370a723SSascha Wildner UINT16 Reserved_100; 5299*1370a723SSascha Wildner UINT16 IOMapBaseAddress; 5300*1370a723SSascha Wildner } IA32_TASK_STATE_SEGMENT; 5301*1370a723SSascha Wildner 5302*1370a723SSascha Wildner typedef union { 5303*1370a723SSascha Wildner struct { 5304*1370a723SSascha Wildner UINT32 LimitLow : 16; ///< Segment Limit 15..00 5305*1370a723SSascha Wildner UINT32 BaseLow : 16; ///< Base Address 15..00 5306*1370a723SSascha Wildner UINT32 BaseMidl : 8; ///< Base Address 23..16 5307*1370a723SSascha Wildner UINT32 Type : 4; ///< Type (1 0 B 1) 5308*1370a723SSascha Wildner UINT32 Reserved_43 : 1; ///< 0 5309*1370a723SSascha Wildner UINT32 DPL : 2; ///< Descriptor Privilege Level 5310*1370a723SSascha Wildner UINT32 P : 1; ///< Segment Present 5311*1370a723SSascha Wildner UINT32 LimitHigh : 4; ///< Segment Limit 19..16 5312*1370a723SSascha Wildner UINT32 AVL : 1; ///< Available for use by system software 5313*1370a723SSascha Wildner UINT32 Reserved_52 : 2; ///< 0 0 5314*1370a723SSascha Wildner UINT32 G : 1; ///< Granularity 5315*1370a723SSascha Wildner UINT32 BaseMidh : 8; ///< Base Address 31..24 5316*1370a723SSascha Wildner UINT32 BaseHigh : 32; ///< Base Address 63..32 5317*1370a723SSascha Wildner UINT32 Reserved_96 : 32; ///< Reserved 5318*1370a723SSascha Wildner } Bits; 5319*1370a723SSascha Wildner struct { 5320*1370a723SSascha Wildner UINT64 Uint64; 5321*1370a723SSascha Wildner UINT64 Uint64_1; 5322*1370a723SSascha Wildner } Uint128; 5323*1370a723SSascha Wildner } IA32_TSS_DESCRIPTOR; 5324*1370a723SSascha Wildner #pragma pack () 5325*1370a723SSascha Wildner 5326*1370a723SSascha Wildner #endif // defined (MDE_CPU_X64) 5327*1370a723SSascha Wildner 5328*1370a723SSascha Wildner /// 5329*1370a723SSascha Wildner /// Byte packed structure for an FP/SSE/SSE2 context. 5330*1370a723SSascha Wildner /// 5331*1370a723SSascha Wildner typedef struct { 5332*1370a723SSascha Wildner UINT8 Buffer[512]; 5333*1370a723SSascha Wildner } IA32_FX_BUFFER; 5334*1370a723SSascha Wildner 5335*1370a723SSascha Wildner /// 5336*1370a723SSascha Wildner /// Structures for the 16-bit real mode thunks. 5337*1370a723SSascha Wildner /// 5338*1370a723SSascha Wildner typedef struct { 5339*1370a723SSascha Wildner UINT32 Reserved1; 5340*1370a723SSascha Wildner UINT32 Reserved2; 5341*1370a723SSascha Wildner UINT32 Reserved3; 5342*1370a723SSascha Wildner UINT32 Reserved4; 5343*1370a723SSascha Wildner UINT8 BL; 5344*1370a723SSascha Wildner UINT8 BH; 5345*1370a723SSascha Wildner UINT16 Reserved5; 5346*1370a723SSascha Wildner UINT8 DL; 5347*1370a723SSascha Wildner UINT8 DH; 5348*1370a723SSascha Wildner UINT16 Reserved6; 5349*1370a723SSascha Wildner UINT8 CL; 5350*1370a723SSascha Wildner UINT8 CH; 5351*1370a723SSascha Wildner UINT16 Reserved7; 5352*1370a723SSascha Wildner UINT8 AL; 5353*1370a723SSascha Wildner UINT8 AH; 5354*1370a723SSascha Wildner UINT16 Reserved8; 5355*1370a723SSascha Wildner } IA32_BYTE_REGS; 5356*1370a723SSascha Wildner 5357*1370a723SSascha Wildner typedef struct { 5358*1370a723SSascha Wildner UINT16 DI; 5359*1370a723SSascha Wildner UINT16 Reserved1; 5360*1370a723SSascha Wildner UINT16 SI; 5361*1370a723SSascha Wildner UINT16 Reserved2; 5362*1370a723SSascha Wildner UINT16 BP; 5363*1370a723SSascha Wildner UINT16 Reserved3; 5364*1370a723SSascha Wildner UINT16 SP; 5365*1370a723SSascha Wildner UINT16 Reserved4; 5366*1370a723SSascha Wildner UINT16 BX; 5367*1370a723SSascha Wildner UINT16 Reserved5; 5368*1370a723SSascha Wildner UINT16 DX; 5369*1370a723SSascha Wildner UINT16 Reserved6; 5370*1370a723SSascha Wildner UINT16 CX; 5371*1370a723SSascha Wildner UINT16 Reserved7; 5372*1370a723SSascha Wildner UINT16 AX; 5373*1370a723SSascha Wildner UINT16 Reserved8; 5374*1370a723SSascha Wildner } IA32_WORD_REGS; 5375*1370a723SSascha Wildner 5376*1370a723SSascha Wildner typedef struct { 5377*1370a723SSascha Wildner UINT32 EDI; 5378*1370a723SSascha Wildner UINT32 ESI; 5379*1370a723SSascha Wildner UINT32 EBP; 5380*1370a723SSascha Wildner UINT32 ESP; 5381*1370a723SSascha Wildner UINT32 EBX; 5382*1370a723SSascha Wildner UINT32 EDX; 5383*1370a723SSascha Wildner UINT32 ECX; 5384*1370a723SSascha Wildner UINT32 EAX; 5385*1370a723SSascha Wildner UINT16 DS; 5386*1370a723SSascha Wildner UINT16 ES; 5387*1370a723SSascha Wildner UINT16 FS; 5388*1370a723SSascha Wildner UINT16 GS; 5389*1370a723SSascha Wildner IA32_EFLAGS32 EFLAGS; 5390*1370a723SSascha Wildner UINT32 Eip; 5391*1370a723SSascha Wildner UINT16 CS; 5392*1370a723SSascha Wildner UINT16 SS; 5393*1370a723SSascha Wildner } IA32_DWORD_REGS; 5394*1370a723SSascha Wildner 5395*1370a723SSascha Wildner typedef union { 5396*1370a723SSascha Wildner IA32_DWORD_REGS E; 5397*1370a723SSascha Wildner IA32_WORD_REGS X; 5398*1370a723SSascha Wildner IA32_BYTE_REGS H; 5399*1370a723SSascha Wildner } IA32_REGISTER_SET; 5400*1370a723SSascha Wildner 5401*1370a723SSascha Wildner /// 5402*1370a723SSascha Wildner /// Byte packed structure for an 16-bit real mode thunks. 5403*1370a723SSascha Wildner /// 5404*1370a723SSascha Wildner typedef struct { 5405*1370a723SSascha Wildner IA32_REGISTER_SET *RealModeState; 5406*1370a723SSascha Wildner VOID *RealModeBuffer; 5407*1370a723SSascha Wildner UINT32 RealModeBufferSize; 5408*1370a723SSascha Wildner UINT32 ThunkAttributes; 5409*1370a723SSascha Wildner } THUNK_CONTEXT; 5410*1370a723SSascha Wildner 5411*1370a723SSascha Wildner #define THUNK_ATTRIBUTE_BIG_REAL_MODE 0x00000001 5412*1370a723SSascha Wildner #define THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15 0x00000002 5413*1370a723SSascha Wildner #define THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL 0x00000004 5414*1370a723SSascha Wildner 5415*1370a723SSascha Wildner /// 5416*1370a723SSascha Wildner /// Type definition for representing labels in NASM source code that allow for 5417*1370a723SSascha Wildner /// the patching of immediate operands of IA32 and X64 instructions. 5418*1370a723SSascha Wildner /// 5419*1370a723SSascha Wildner /// While the type is technically defined as a function type (note: not a 5420*1370a723SSascha Wildner /// pointer-to-function type), such labels in NASM source code never stand for 5421*1370a723SSascha Wildner /// actual functions, and identifiers declared with this function type should 5422*1370a723SSascha Wildner /// never be called. This is also why the EFIAPI calling convention specifier 5423*1370a723SSascha Wildner /// is missing from the typedef, and why the typedef does not follow the usual 5424*1370a723SSascha Wildner /// edk2 coding style for function (or pointer-to-function) typedefs. The VOID 5425*1370a723SSascha Wildner /// return type and the VOID argument list are merely artifacts. 5426*1370a723SSascha Wildner /// 5427*1370a723SSascha Wildner typedef VOID (X86_ASSEMBLY_PATCH_LABEL) ( 5428*1370a723SSascha Wildner VOID 5429*1370a723SSascha Wildner ); 5430*1370a723SSascha Wildner 5431*1370a723SSascha Wildner /** 5432*1370a723SSascha Wildner Retrieves CPUID information. 5433*1370a723SSascha Wildner 5434*1370a723SSascha Wildner Executes the CPUID instruction with EAX set to the value specified by Index. 5435*1370a723SSascha Wildner This function always returns Index. 5436*1370a723SSascha Wildner If Eax is not NULL, then the value of EAX after CPUID is returned in Eax. 5437*1370a723SSascha Wildner If Ebx is not NULL, then the value of EBX after CPUID is returned in Ebx. 5438*1370a723SSascha Wildner If Ecx is not NULL, then the value of ECX after CPUID is returned in Ecx. 5439*1370a723SSascha Wildner If Edx is not NULL, then the value of EDX after CPUID is returned in Edx. 5440*1370a723SSascha Wildner This function is only available on IA-32 and x64. 5441*1370a723SSascha Wildner 5442*1370a723SSascha Wildner @param Index The 32-bit value to load into EAX prior to invoking the CPUID 5443*1370a723SSascha Wildner instruction. 5444*1370a723SSascha Wildner @param Eax The pointer to the 32-bit EAX value returned by the CPUID 5445*1370a723SSascha Wildner instruction. This is an optional parameter that may be NULL. 5446*1370a723SSascha Wildner @param Ebx The pointer to the 32-bit EBX value returned by the CPUID 5447*1370a723SSascha Wildner instruction. This is an optional parameter that may be NULL. 5448*1370a723SSascha Wildner @param Ecx The pointer to the 32-bit ECX value returned by the CPUID 5449*1370a723SSascha Wildner instruction. This is an optional parameter that may be NULL. 5450*1370a723SSascha Wildner @param Edx The pointer to the 32-bit EDX value returned by the CPUID 5451*1370a723SSascha Wildner instruction. This is an optional parameter that may be NULL. 5452*1370a723SSascha Wildner 5453*1370a723SSascha Wildner @return Index. 5454*1370a723SSascha Wildner 5455*1370a723SSascha Wildner **/ 5456*1370a723SSascha Wildner UINT32 5457*1370a723SSascha Wildner EFIAPI 5458*1370a723SSascha Wildner AsmCpuid ( 5459*1370a723SSascha Wildner IN UINT32 Index, 5460*1370a723SSascha Wildner OUT UINT32 *Eax OPTIONAL, 5461*1370a723SSascha Wildner OUT UINT32 *Ebx OPTIONAL, 5462*1370a723SSascha Wildner OUT UINT32 *Ecx OPTIONAL, 5463*1370a723SSascha Wildner OUT UINT32 *Edx OPTIONAL 5464*1370a723SSascha Wildner ); 5465*1370a723SSascha Wildner 5466*1370a723SSascha Wildner /** 5467*1370a723SSascha Wildner Retrieves CPUID information using an extended leaf identifier. 5468*1370a723SSascha Wildner 5469*1370a723SSascha Wildner Executes the CPUID instruction with EAX set to the value specified by Index 5470*1370a723SSascha Wildner and ECX set to the value specified by SubIndex. This function always returns 5471*1370a723SSascha Wildner Index. This function is only available on IA-32 and x64. 5472*1370a723SSascha Wildner 5473*1370a723SSascha Wildner If Eax is not NULL, then the value of EAX after CPUID is returned in Eax. 5474*1370a723SSascha Wildner If Ebx is not NULL, then the value of EBX after CPUID is returned in Ebx. 5475*1370a723SSascha Wildner If Ecx is not NULL, then the value of ECX after CPUID is returned in Ecx. 5476*1370a723SSascha Wildner If Edx is not NULL, then the value of EDX after CPUID is returned in Edx. 5477*1370a723SSascha Wildner 5478*1370a723SSascha Wildner @param Index The 32-bit value to load into EAX prior to invoking the 5479*1370a723SSascha Wildner CPUID instruction. 5480*1370a723SSascha Wildner @param SubIndex The 32-bit value to load into ECX prior to invoking the 5481*1370a723SSascha Wildner CPUID instruction. 5482*1370a723SSascha Wildner @param Eax The pointer to the 32-bit EAX value returned by the CPUID 5483*1370a723SSascha Wildner instruction. This is an optional parameter that may be 5484*1370a723SSascha Wildner NULL. 5485*1370a723SSascha Wildner @param Ebx The pointer to the 32-bit EBX value returned by the CPUID 5486*1370a723SSascha Wildner instruction. This is an optional parameter that may be 5487*1370a723SSascha Wildner NULL. 5488*1370a723SSascha Wildner @param Ecx The pointer to the 32-bit ECX value returned by the CPUID 5489*1370a723SSascha Wildner instruction. This is an optional parameter that may be 5490*1370a723SSascha Wildner NULL. 5491*1370a723SSascha Wildner @param Edx The pointer to the 32-bit EDX value returned by the CPUID 5492*1370a723SSascha Wildner instruction. This is an optional parameter that may be 5493*1370a723SSascha Wildner NULL. 5494*1370a723SSascha Wildner 5495*1370a723SSascha Wildner @return Index. 5496*1370a723SSascha Wildner 5497*1370a723SSascha Wildner **/ 5498*1370a723SSascha Wildner UINT32 5499*1370a723SSascha Wildner EFIAPI 5500*1370a723SSascha Wildner AsmCpuidEx ( 5501*1370a723SSascha Wildner IN UINT32 Index, 5502*1370a723SSascha Wildner IN UINT32 SubIndex, 5503*1370a723SSascha Wildner OUT UINT32 *Eax OPTIONAL, 5504*1370a723SSascha Wildner OUT UINT32 *Ebx OPTIONAL, 5505*1370a723SSascha Wildner OUT UINT32 *Ecx OPTIONAL, 5506*1370a723SSascha Wildner OUT UINT32 *Edx OPTIONAL 5507*1370a723SSascha Wildner ); 5508*1370a723SSascha Wildner 5509*1370a723SSascha Wildner /** 5510*1370a723SSascha Wildner Set CD bit and clear NW bit of CR0 followed by a WBINVD. 5511*1370a723SSascha Wildner 5512*1370a723SSascha Wildner Disables the caches by setting the CD bit of CR0 to 1, clearing the NW bit of CR0 to 0, 5513*1370a723SSascha Wildner and executing a WBINVD instruction. This function is only available on IA-32 and x64. 5514*1370a723SSascha Wildner 5515*1370a723SSascha Wildner **/ 5516*1370a723SSascha Wildner VOID 5517*1370a723SSascha Wildner EFIAPI 5518*1370a723SSascha Wildner AsmDisableCache ( 5519*1370a723SSascha Wildner VOID 5520*1370a723SSascha Wildner ); 5521*1370a723SSascha Wildner 5522*1370a723SSascha Wildner /** 5523*1370a723SSascha Wildner Perform a WBINVD and clear both the CD and NW bits of CR0. 5524*1370a723SSascha Wildner 5525*1370a723SSascha Wildner Enables the caches by executing a WBINVD instruction and then clear both the CD and NW 5526*1370a723SSascha Wildner bits of CR0 to 0. This function is only available on IA-32 and x64. 5527*1370a723SSascha Wildner 5528*1370a723SSascha Wildner **/ 5529*1370a723SSascha Wildner VOID 5530*1370a723SSascha Wildner EFIAPI 5531*1370a723SSascha Wildner AsmEnableCache ( 5532*1370a723SSascha Wildner VOID 5533*1370a723SSascha Wildner ); 5534*1370a723SSascha Wildner 5535*1370a723SSascha Wildner /** 5536*1370a723SSascha Wildner Returns the lower 32-bits of a Machine Specific Register(MSR). 5537*1370a723SSascha Wildner 5538*1370a723SSascha Wildner Reads and returns the lower 32-bits of the MSR specified by Index. 5539*1370a723SSascha Wildner No parameter checking is performed on Index, and some Index values may cause 5540*1370a723SSascha Wildner CPU exceptions. The caller must either guarantee that Index is valid, or the 5541*1370a723SSascha Wildner caller must set up exception handlers to catch the exceptions. This function 5542*1370a723SSascha Wildner is only available on IA-32 and x64. 5543*1370a723SSascha Wildner 5544*1370a723SSascha Wildner @param Index The 32-bit MSR index to read. 5545*1370a723SSascha Wildner 5546*1370a723SSascha Wildner @return The lower 32 bits of the MSR identified by Index. 5547*1370a723SSascha Wildner 5548*1370a723SSascha Wildner **/ 5549*1370a723SSascha Wildner UINT32 5550*1370a723SSascha Wildner EFIAPI 5551*1370a723SSascha Wildner AsmReadMsr32 ( 5552*1370a723SSascha Wildner IN UINT32 Index 5553*1370a723SSascha Wildner ); 5554*1370a723SSascha Wildner 5555*1370a723SSascha Wildner /** 5556*1370a723SSascha Wildner Writes a 32-bit value to a Machine Specific Register(MSR), and returns the value. 5557*1370a723SSascha Wildner The upper 32-bits of the MSR are set to zero. 5558*1370a723SSascha Wildner 5559*1370a723SSascha Wildner Writes the 32-bit value specified by Value to the MSR specified by Index. The 5560*1370a723SSascha Wildner upper 32-bits of the MSR write are set to zero. The 32-bit value written to 5561*1370a723SSascha Wildner the MSR is returned. No parameter checking is performed on Index or Value, 5562*1370a723SSascha Wildner and some of these may cause CPU exceptions. The caller must either guarantee 5563*1370a723SSascha Wildner that Index and Value are valid, or the caller must establish proper exception 5564*1370a723SSascha Wildner handlers. This function is only available on IA-32 and x64. 5565*1370a723SSascha Wildner 5566*1370a723SSascha Wildner @param Index The 32-bit MSR index to write. 5567*1370a723SSascha Wildner @param Value The 32-bit value to write to the MSR. 5568*1370a723SSascha Wildner 5569*1370a723SSascha Wildner @return Value 5570*1370a723SSascha Wildner 5571*1370a723SSascha Wildner **/ 5572*1370a723SSascha Wildner UINT32 5573*1370a723SSascha Wildner EFIAPI 5574*1370a723SSascha Wildner AsmWriteMsr32 ( 5575*1370a723SSascha Wildner IN UINT32 Index, 5576*1370a723SSascha Wildner IN UINT32 Value 5577*1370a723SSascha Wildner ); 5578*1370a723SSascha Wildner 5579*1370a723SSascha Wildner /** 5580*1370a723SSascha Wildner Reads a 64-bit MSR, performs a bitwise OR on the lower 32-bits, and 5581*1370a723SSascha Wildner writes the result back to the 64-bit MSR. 5582*1370a723SSascha Wildner 5583*1370a723SSascha Wildner Reads the 64-bit MSR specified by Index, performs a bitwise OR 5584*1370a723SSascha Wildner between the lower 32-bits of the read result and the value specified by 5585*1370a723SSascha Wildner OrData, and writes the result to the 64-bit MSR specified by Index. The lower 5586*1370a723SSascha Wildner 32-bits of the value written to the MSR is returned. No parameter checking is 5587*1370a723SSascha Wildner performed on Index or OrData, and some of these may cause CPU exceptions. The 5588*1370a723SSascha Wildner caller must either guarantee that Index and OrData are valid, or the caller 5589*1370a723SSascha Wildner must establish proper exception handlers. This function is only available on 5590*1370a723SSascha Wildner IA-32 and x64. 5591*1370a723SSascha Wildner 5592*1370a723SSascha Wildner @param Index The 32-bit MSR index to write. 5593*1370a723SSascha Wildner @param OrData The value to OR with the read value from the MSR. 5594*1370a723SSascha Wildner 5595*1370a723SSascha Wildner @return The lower 32-bit value written to the MSR. 5596*1370a723SSascha Wildner 5597*1370a723SSascha Wildner **/ 5598*1370a723SSascha Wildner UINT32 5599*1370a723SSascha Wildner EFIAPI 5600*1370a723SSascha Wildner AsmMsrOr32 ( 5601*1370a723SSascha Wildner IN UINT32 Index, 5602*1370a723SSascha Wildner IN UINT32 OrData 5603*1370a723SSascha Wildner ); 5604*1370a723SSascha Wildner 5605*1370a723SSascha Wildner /** 5606*1370a723SSascha Wildner Reads a 64-bit MSR, performs a bitwise AND on the lower 32-bits, and writes 5607*1370a723SSascha Wildner the result back to the 64-bit MSR. 5608*1370a723SSascha Wildner 5609*1370a723SSascha Wildner Reads the 64-bit MSR specified by Index, performs a bitwise AND between the 5610*1370a723SSascha Wildner lower 32-bits of the read result and the value specified by AndData, and 5611*1370a723SSascha Wildner writes the result to the 64-bit MSR specified by Index. The lower 32-bits of 5612*1370a723SSascha Wildner the value written to the MSR is returned. No parameter checking is performed 5613*1370a723SSascha Wildner on Index or AndData, and some of these may cause CPU exceptions. The caller 5614*1370a723SSascha Wildner must either guarantee that Index and AndData are valid, or the caller must 5615*1370a723SSascha Wildner establish proper exception handlers. This function is only available on IA-32 5616*1370a723SSascha Wildner and x64. 5617*1370a723SSascha Wildner 5618*1370a723SSascha Wildner @param Index The 32-bit MSR index to write. 5619*1370a723SSascha Wildner @param AndData The value to AND with the read value from the MSR. 5620*1370a723SSascha Wildner 5621*1370a723SSascha Wildner @return The lower 32-bit value written to the MSR. 5622*1370a723SSascha Wildner 5623*1370a723SSascha Wildner **/ 5624*1370a723SSascha Wildner UINT32 5625*1370a723SSascha Wildner EFIAPI 5626*1370a723SSascha Wildner AsmMsrAnd32 ( 5627*1370a723SSascha Wildner IN UINT32 Index, 5628*1370a723SSascha Wildner IN UINT32 AndData 5629*1370a723SSascha Wildner ); 5630*1370a723SSascha Wildner 5631*1370a723SSascha Wildner /** 5632*1370a723SSascha Wildner Reads a 64-bit MSR, performs a bitwise AND followed by a bitwise OR 5633*1370a723SSascha Wildner on the lower 32-bits, and writes the result back to the 64-bit MSR. 5634*1370a723SSascha Wildner 5635*1370a723SSascha Wildner Reads the 64-bit MSR specified by Index, performs a bitwise AND between the 5636*1370a723SSascha Wildner lower 32-bits of the read result and the value specified by AndData 5637*1370a723SSascha Wildner preserving the upper 32-bits, performs a bitwise OR between the 5638*1370a723SSascha Wildner result of the AND operation and the value specified by OrData, and writes the 5639*1370a723SSascha Wildner result to the 64-bit MSR specified by Address. The lower 32-bits of the value 5640*1370a723SSascha Wildner written to the MSR is returned. No parameter checking is performed on Index, 5641*1370a723SSascha Wildner AndData, or OrData, and some of these may cause CPU exceptions. The caller 5642*1370a723SSascha Wildner must either guarantee that Index, AndData, and OrData are valid, or the 5643*1370a723SSascha Wildner caller must establish proper exception handlers. This function is only 5644*1370a723SSascha Wildner available on IA-32 and x64. 5645*1370a723SSascha Wildner 5646*1370a723SSascha Wildner @param Index The 32-bit MSR index to write. 5647*1370a723SSascha Wildner @param AndData The value to AND with the read value from the MSR. 5648*1370a723SSascha Wildner @param OrData The value to OR with the result of the AND operation. 5649*1370a723SSascha Wildner 5650*1370a723SSascha Wildner @return The lower 32-bit value written to the MSR. 5651*1370a723SSascha Wildner 5652*1370a723SSascha Wildner **/ 5653*1370a723SSascha Wildner UINT32 5654*1370a723SSascha Wildner EFIAPI 5655*1370a723SSascha Wildner AsmMsrAndThenOr32 ( 5656*1370a723SSascha Wildner IN UINT32 Index, 5657*1370a723SSascha Wildner IN UINT32 AndData, 5658*1370a723SSascha Wildner IN UINT32 OrData 5659*1370a723SSascha Wildner ); 5660*1370a723SSascha Wildner 5661*1370a723SSascha Wildner /** 5662*1370a723SSascha Wildner Reads a bit field of an MSR. 5663*1370a723SSascha Wildner 5664*1370a723SSascha Wildner Reads the bit field in the lower 32-bits of a 64-bit MSR. The bit field is 5665*1370a723SSascha Wildner specified by the StartBit and the EndBit. The value of the bit field is 5666*1370a723SSascha Wildner returned. The caller must either guarantee that Index is valid, or the caller 5667*1370a723SSascha Wildner must set up exception handlers to catch the exceptions. This function is only 5668*1370a723SSascha Wildner available on IA-32 and x64. 5669*1370a723SSascha Wildner 5670*1370a723SSascha Wildner If StartBit is greater than 31, then ASSERT(). 5671*1370a723SSascha Wildner If EndBit is greater than 31, then ASSERT(). 5672*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 5673*1370a723SSascha Wildner 5674*1370a723SSascha Wildner @param Index The 32-bit MSR index to read. 5675*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 5676*1370a723SSascha Wildner Range 0..31. 5677*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 5678*1370a723SSascha Wildner Range 0..31. 5679*1370a723SSascha Wildner 5680*1370a723SSascha Wildner @return The bit field read from the MSR. 5681*1370a723SSascha Wildner 5682*1370a723SSascha Wildner **/ 5683*1370a723SSascha Wildner UINT32 5684*1370a723SSascha Wildner EFIAPI 5685*1370a723SSascha Wildner AsmMsrBitFieldRead32 ( 5686*1370a723SSascha Wildner IN UINT32 Index, 5687*1370a723SSascha Wildner IN UINTN StartBit, 5688*1370a723SSascha Wildner IN UINTN EndBit 5689*1370a723SSascha Wildner ); 5690*1370a723SSascha Wildner 5691*1370a723SSascha Wildner /** 5692*1370a723SSascha Wildner Writes a bit field to an MSR. 5693*1370a723SSascha Wildner 5694*1370a723SSascha Wildner Writes Value to a bit field in the lower 32-bits of a 64-bit MSR. The bit 5695*1370a723SSascha Wildner field is specified by the StartBit and the EndBit. All other bits in the 5696*1370a723SSascha Wildner destination MSR are preserved. The lower 32-bits of the MSR written is 5697*1370a723SSascha Wildner returned. The caller must either guarantee that Index and the data written 5698*1370a723SSascha Wildner is valid, or the caller must set up exception handlers to catch the exceptions. 5699*1370a723SSascha Wildner This function is only available on IA-32 and x64. 5700*1370a723SSascha Wildner 5701*1370a723SSascha Wildner If StartBit is greater than 31, then ASSERT(). 5702*1370a723SSascha Wildner If EndBit is greater than 31, then ASSERT(). 5703*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 5704*1370a723SSascha Wildner If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 5705*1370a723SSascha Wildner 5706*1370a723SSascha Wildner @param Index The 32-bit MSR index to write. 5707*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 5708*1370a723SSascha Wildner Range 0..31. 5709*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 5710*1370a723SSascha Wildner Range 0..31. 5711*1370a723SSascha Wildner @param Value New value of the bit field. 5712*1370a723SSascha Wildner 5713*1370a723SSascha Wildner @return The lower 32-bit of the value written to the MSR. 5714*1370a723SSascha Wildner 5715*1370a723SSascha Wildner **/ 5716*1370a723SSascha Wildner UINT32 5717*1370a723SSascha Wildner EFIAPI 5718*1370a723SSascha Wildner AsmMsrBitFieldWrite32 ( 5719*1370a723SSascha Wildner IN UINT32 Index, 5720*1370a723SSascha Wildner IN UINTN StartBit, 5721*1370a723SSascha Wildner IN UINTN EndBit, 5722*1370a723SSascha Wildner IN UINT32 Value 5723*1370a723SSascha Wildner ); 5724*1370a723SSascha Wildner 5725*1370a723SSascha Wildner /** 5726*1370a723SSascha Wildner Reads a bit field in a 64-bit MSR, performs a bitwise OR, and writes the 5727*1370a723SSascha Wildner result back to the bit field in the 64-bit MSR. 5728*1370a723SSascha Wildner 5729*1370a723SSascha Wildner Reads the 64-bit MSR specified by Index, performs a bitwise OR 5730*1370a723SSascha Wildner between the read result and the value specified by OrData, and writes the 5731*1370a723SSascha Wildner result to the 64-bit MSR specified by Index. The lower 32-bits of the value 5732*1370a723SSascha Wildner written to the MSR are returned. Extra left bits in OrData are stripped. The 5733*1370a723SSascha Wildner caller must either guarantee that Index and the data written is valid, or 5734*1370a723SSascha Wildner the caller must set up exception handlers to catch the exceptions. This 5735*1370a723SSascha Wildner function is only available on IA-32 and x64. 5736*1370a723SSascha Wildner 5737*1370a723SSascha Wildner If StartBit is greater than 31, then ASSERT(). 5738*1370a723SSascha Wildner If EndBit is greater than 31, then ASSERT(). 5739*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 5740*1370a723SSascha Wildner If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 5741*1370a723SSascha Wildner 5742*1370a723SSascha Wildner @param Index The 32-bit MSR index to write. 5743*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 5744*1370a723SSascha Wildner Range 0..31. 5745*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 5746*1370a723SSascha Wildner Range 0..31. 5747*1370a723SSascha Wildner @param OrData The value to OR with the read value from the MSR. 5748*1370a723SSascha Wildner 5749*1370a723SSascha Wildner @return The lower 32-bit of the value written to the MSR. 5750*1370a723SSascha Wildner 5751*1370a723SSascha Wildner **/ 5752*1370a723SSascha Wildner UINT32 5753*1370a723SSascha Wildner EFIAPI 5754*1370a723SSascha Wildner AsmMsrBitFieldOr32 ( 5755*1370a723SSascha Wildner IN UINT32 Index, 5756*1370a723SSascha Wildner IN UINTN StartBit, 5757*1370a723SSascha Wildner IN UINTN EndBit, 5758*1370a723SSascha Wildner IN UINT32 OrData 5759*1370a723SSascha Wildner ); 5760*1370a723SSascha Wildner 5761*1370a723SSascha Wildner /** 5762*1370a723SSascha Wildner Reads a bit field in a 64-bit MSR, performs a bitwise AND, and writes the 5763*1370a723SSascha Wildner result back to the bit field in the 64-bit MSR. 5764*1370a723SSascha Wildner 5765*1370a723SSascha Wildner Reads the 64-bit MSR specified by Index, performs a bitwise AND between the 5766*1370a723SSascha Wildner read result and the value specified by AndData, and writes the result to the 5767*1370a723SSascha Wildner 64-bit MSR specified by Index. The lower 32-bits of the value written to the 5768*1370a723SSascha Wildner MSR are returned. Extra left bits in AndData are stripped. The caller must 5769*1370a723SSascha Wildner either guarantee that Index and the data written is valid, or the caller must 5770*1370a723SSascha Wildner set up exception handlers to catch the exceptions. This function is only 5771*1370a723SSascha Wildner available on IA-32 and x64. 5772*1370a723SSascha Wildner 5773*1370a723SSascha Wildner If StartBit is greater than 31, then ASSERT(). 5774*1370a723SSascha Wildner If EndBit is greater than 31, then ASSERT(). 5775*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 5776*1370a723SSascha Wildner If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 5777*1370a723SSascha Wildner 5778*1370a723SSascha Wildner @param Index The 32-bit MSR index to write. 5779*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 5780*1370a723SSascha Wildner Range 0..31. 5781*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 5782*1370a723SSascha Wildner Range 0..31. 5783*1370a723SSascha Wildner @param AndData The value to AND with the read value from the MSR. 5784*1370a723SSascha Wildner 5785*1370a723SSascha Wildner @return The lower 32-bit of the value written to the MSR. 5786*1370a723SSascha Wildner 5787*1370a723SSascha Wildner **/ 5788*1370a723SSascha Wildner UINT32 5789*1370a723SSascha Wildner EFIAPI 5790*1370a723SSascha Wildner AsmMsrBitFieldAnd32 ( 5791*1370a723SSascha Wildner IN UINT32 Index, 5792*1370a723SSascha Wildner IN UINTN StartBit, 5793*1370a723SSascha Wildner IN UINTN EndBit, 5794*1370a723SSascha Wildner IN UINT32 AndData 5795*1370a723SSascha Wildner ); 5796*1370a723SSascha Wildner 5797*1370a723SSascha Wildner /** 5798*1370a723SSascha Wildner Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a 5799*1370a723SSascha Wildner bitwise OR, and writes the result back to the bit field in the 5800*1370a723SSascha Wildner 64-bit MSR. 5801*1370a723SSascha Wildner 5802*1370a723SSascha Wildner Reads the 64-bit MSR specified by Index, performs a bitwise AND followed by a 5803*1370a723SSascha Wildner bitwise OR between the read result and the value specified by 5804*1370a723SSascha Wildner AndData, and writes the result to the 64-bit MSR specified by Index. The 5805*1370a723SSascha Wildner lower 32-bits of the value written to the MSR are returned. Extra left bits 5806*1370a723SSascha Wildner in both AndData and OrData are stripped. The caller must either guarantee 5807*1370a723SSascha Wildner that Index and the data written is valid, or the caller must set up exception 5808*1370a723SSascha Wildner handlers to catch the exceptions. This function is only available on IA-32 5809*1370a723SSascha Wildner and x64. 5810*1370a723SSascha Wildner 5811*1370a723SSascha Wildner If StartBit is greater than 31, then ASSERT(). 5812*1370a723SSascha Wildner If EndBit is greater than 31, then ASSERT(). 5813*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 5814*1370a723SSascha Wildner If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 5815*1370a723SSascha Wildner If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 5816*1370a723SSascha Wildner 5817*1370a723SSascha Wildner @param Index The 32-bit MSR index to write. 5818*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 5819*1370a723SSascha Wildner Range 0..31. 5820*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 5821*1370a723SSascha Wildner Range 0..31. 5822*1370a723SSascha Wildner @param AndData The value to AND with the read value from the MSR. 5823*1370a723SSascha Wildner @param OrData The value to OR with the result of the AND operation. 5824*1370a723SSascha Wildner 5825*1370a723SSascha Wildner @return The lower 32-bit of the value written to the MSR. 5826*1370a723SSascha Wildner 5827*1370a723SSascha Wildner **/ 5828*1370a723SSascha Wildner UINT32 5829*1370a723SSascha Wildner EFIAPI 5830*1370a723SSascha Wildner AsmMsrBitFieldAndThenOr32 ( 5831*1370a723SSascha Wildner IN UINT32 Index, 5832*1370a723SSascha Wildner IN UINTN StartBit, 5833*1370a723SSascha Wildner IN UINTN EndBit, 5834*1370a723SSascha Wildner IN UINT32 AndData, 5835*1370a723SSascha Wildner IN UINT32 OrData 5836*1370a723SSascha Wildner ); 5837*1370a723SSascha Wildner 5838*1370a723SSascha Wildner /** 5839*1370a723SSascha Wildner Returns a 64-bit Machine Specific Register(MSR). 5840*1370a723SSascha Wildner 5841*1370a723SSascha Wildner Reads and returns the 64-bit MSR specified by Index. No parameter checking is 5842*1370a723SSascha Wildner performed on Index, and some Index values may cause CPU exceptions. The 5843*1370a723SSascha Wildner caller must either guarantee that Index is valid, or the caller must set up 5844*1370a723SSascha Wildner exception handlers to catch the exceptions. This function is only available 5845*1370a723SSascha Wildner on IA-32 and x64. 5846*1370a723SSascha Wildner 5847*1370a723SSascha Wildner @param Index The 32-bit MSR index to read. 5848*1370a723SSascha Wildner 5849*1370a723SSascha Wildner @return The value of the MSR identified by Index. 5850*1370a723SSascha Wildner 5851*1370a723SSascha Wildner **/ 5852*1370a723SSascha Wildner UINT64 5853*1370a723SSascha Wildner EFIAPI 5854*1370a723SSascha Wildner AsmReadMsr64 ( 5855*1370a723SSascha Wildner IN UINT32 Index 5856*1370a723SSascha Wildner ); 5857*1370a723SSascha Wildner 5858*1370a723SSascha Wildner /** 5859*1370a723SSascha Wildner Writes a 64-bit value to a Machine Specific Register(MSR), and returns the 5860*1370a723SSascha Wildner value. 5861*1370a723SSascha Wildner 5862*1370a723SSascha Wildner Writes the 64-bit value specified by Value to the MSR specified by Index. The 5863*1370a723SSascha Wildner 64-bit value written to the MSR is returned. No parameter checking is 5864*1370a723SSascha Wildner performed on Index or Value, and some of these may cause CPU exceptions. The 5865*1370a723SSascha Wildner caller must either guarantee that Index and Value are valid, or the caller 5866*1370a723SSascha Wildner must establish proper exception handlers. This function is only available on 5867*1370a723SSascha Wildner IA-32 and x64. 5868*1370a723SSascha Wildner 5869*1370a723SSascha Wildner @param Index The 32-bit MSR index to write. 5870*1370a723SSascha Wildner @param Value The 64-bit value to write to the MSR. 5871*1370a723SSascha Wildner 5872*1370a723SSascha Wildner @return Value 5873*1370a723SSascha Wildner 5874*1370a723SSascha Wildner **/ 5875*1370a723SSascha Wildner UINT64 5876*1370a723SSascha Wildner EFIAPI 5877*1370a723SSascha Wildner AsmWriteMsr64 ( 5878*1370a723SSascha Wildner IN UINT32 Index, 5879*1370a723SSascha Wildner IN UINT64 Value 5880*1370a723SSascha Wildner ); 5881*1370a723SSascha Wildner 5882*1370a723SSascha Wildner /** 5883*1370a723SSascha Wildner Reads a 64-bit MSR, performs a bitwise OR, and writes the result 5884*1370a723SSascha Wildner back to the 64-bit MSR. 5885*1370a723SSascha Wildner 5886*1370a723SSascha Wildner Reads the 64-bit MSR specified by Index, performs a bitwise OR 5887*1370a723SSascha Wildner between the read result and the value specified by OrData, and writes the 5888*1370a723SSascha Wildner result to the 64-bit MSR specified by Index. The value written to the MSR is 5889*1370a723SSascha Wildner returned. No parameter checking is performed on Index or OrData, and some of 5890*1370a723SSascha Wildner these may cause CPU exceptions. The caller must either guarantee that Index 5891*1370a723SSascha Wildner and OrData are valid, or the caller must establish proper exception handlers. 5892*1370a723SSascha Wildner This function is only available on IA-32 and x64. 5893*1370a723SSascha Wildner 5894*1370a723SSascha Wildner @param Index The 32-bit MSR index to write. 5895*1370a723SSascha Wildner @param OrData The value to OR with the read value from the MSR. 5896*1370a723SSascha Wildner 5897*1370a723SSascha Wildner @return The value written back to the MSR. 5898*1370a723SSascha Wildner 5899*1370a723SSascha Wildner **/ 5900*1370a723SSascha Wildner UINT64 5901*1370a723SSascha Wildner EFIAPI 5902*1370a723SSascha Wildner AsmMsrOr64 ( 5903*1370a723SSascha Wildner IN UINT32 Index, 5904*1370a723SSascha Wildner IN UINT64 OrData 5905*1370a723SSascha Wildner ); 5906*1370a723SSascha Wildner 5907*1370a723SSascha Wildner /** 5908*1370a723SSascha Wildner Reads a 64-bit MSR, performs a bitwise AND, and writes the result back to the 5909*1370a723SSascha Wildner 64-bit MSR. 5910*1370a723SSascha Wildner 5911*1370a723SSascha Wildner Reads the 64-bit MSR specified by Index, performs a bitwise AND between the 5912*1370a723SSascha Wildner read result and the value specified by OrData, and writes the result to the 5913*1370a723SSascha Wildner 64-bit MSR specified by Index. The value written to the MSR is returned. No 5914*1370a723SSascha Wildner parameter checking is performed on Index or OrData, and some of these may 5915*1370a723SSascha Wildner cause CPU exceptions. The caller must either guarantee that Index and OrData 5916*1370a723SSascha Wildner are valid, or the caller must establish proper exception handlers. This 5917*1370a723SSascha Wildner function is only available on IA-32 and x64. 5918*1370a723SSascha Wildner 5919*1370a723SSascha Wildner @param Index The 32-bit MSR index to write. 5920*1370a723SSascha Wildner @param AndData The value to AND with the read value from the MSR. 5921*1370a723SSascha Wildner 5922*1370a723SSascha Wildner @return The value written back to the MSR. 5923*1370a723SSascha Wildner 5924*1370a723SSascha Wildner **/ 5925*1370a723SSascha Wildner UINT64 5926*1370a723SSascha Wildner EFIAPI 5927*1370a723SSascha Wildner AsmMsrAnd64 ( 5928*1370a723SSascha Wildner IN UINT32 Index, 5929*1370a723SSascha Wildner IN UINT64 AndData 5930*1370a723SSascha Wildner ); 5931*1370a723SSascha Wildner 5932*1370a723SSascha Wildner /** 5933*1370a723SSascha Wildner Reads a 64-bit MSR, performs a bitwise AND followed by a bitwise 5934*1370a723SSascha Wildner OR, and writes the result back to the 64-bit MSR. 5935*1370a723SSascha Wildner 5936*1370a723SSascha Wildner Reads the 64-bit MSR specified by Index, performs a bitwise AND between read 5937*1370a723SSascha Wildner result and the value specified by AndData, performs a bitwise OR 5938*1370a723SSascha Wildner between the result of the AND operation and the value specified by OrData, 5939*1370a723SSascha Wildner and writes the result to the 64-bit MSR specified by Index. The value written 5940*1370a723SSascha Wildner to the MSR is returned. No parameter checking is performed on Index, AndData, 5941*1370a723SSascha Wildner or OrData, and some of these may cause CPU exceptions. The caller must either 5942*1370a723SSascha Wildner guarantee that Index, AndData, and OrData are valid, or the caller must 5943*1370a723SSascha Wildner establish proper exception handlers. This function is only available on IA-32 5944*1370a723SSascha Wildner and x64. 5945*1370a723SSascha Wildner 5946*1370a723SSascha Wildner @param Index The 32-bit MSR index to write. 5947*1370a723SSascha Wildner @param AndData The value to AND with the read value from the MSR. 5948*1370a723SSascha Wildner @param OrData The value to OR with the result of the AND operation. 5949*1370a723SSascha Wildner 5950*1370a723SSascha Wildner @return The value written back to the MSR. 5951*1370a723SSascha Wildner 5952*1370a723SSascha Wildner **/ 5953*1370a723SSascha Wildner UINT64 5954*1370a723SSascha Wildner EFIAPI 5955*1370a723SSascha Wildner AsmMsrAndThenOr64 ( 5956*1370a723SSascha Wildner IN UINT32 Index, 5957*1370a723SSascha Wildner IN UINT64 AndData, 5958*1370a723SSascha Wildner IN UINT64 OrData 5959*1370a723SSascha Wildner ); 5960*1370a723SSascha Wildner 5961*1370a723SSascha Wildner /** 5962*1370a723SSascha Wildner Reads a bit field of an MSR. 5963*1370a723SSascha Wildner 5964*1370a723SSascha Wildner Reads the bit field in the 64-bit MSR. The bit field is specified by the 5965*1370a723SSascha Wildner StartBit and the EndBit. The value of the bit field is returned. The caller 5966*1370a723SSascha Wildner must either guarantee that Index is valid, or the caller must set up 5967*1370a723SSascha Wildner exception handlers to catch the exceptions. This function is only available 5968*1370a723SSascha Wildner on IA-32 and x64. 5969*1370a723SSascha Wildner 5970*1370a723SSascha Wildner If StartBit is greater than 63, then ASSERT(). 5971*1370a723SSascha Wildner If EndBit is greater than 63, then ASSERT(). 5972*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 5973*1370a723SSascha Wildner 5974*1370a723SSascha Wildner @param Index The 32-bit MSR index to read. 5975*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 5976*1370a723SSascha Wildner Range 0..63. 5977*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 5978*1370a723SSascha Wildner Range 0..63. 5979*1370a723SSascha Wildner 5980*1370a723SSascha Wildner @return The value read from the MSR. 5981*1370a723SSascha Wildner 5982*1370a723SSascha Wildner **/ 5983*1370a723SSascha Wildner UINT64 5984*1370a723SSascha Wildner EFIAPI 5985*1370a723SSascha Wildner AsmMsrBitFieldRead64 ( 5986*1370a723SSascha Wildner IN UINT32 Index, 5987*1370a723SSascha Wildner IN UINTN StartBit, 5988*1370a723SSascha Wildner IN UINTN EndBit 5989*1370a723SSascha Wildner ); 5990*1370a723SSascha Wildner 5991*1370a723SSascha Wildner /** 5992*1370a723SSascha Wildner Writes a bit field to an MSR. 5993*1370a723SSascha Wildner 5994*1370a723SSascha Wildner Writes Value to a bit field in a 64-bit MSR. The bit field is specified by 5995*1370a723SSascha Wildner the StartBit and the EndBit. All other bits in the destination MSR are 5996*1370a723SSascha Wildner preserved. The MSR written is returned. The caller must either guarantee 5997*1370a723SSascha Wildner that Index and the data written is valid, or the caller must set up exception 5998*1370a723SSascha Wildner handlers to catch the exceptions. This function is only available on IA-32 and x64. 5999*1370a723SSascha Wildner 6000*1370a723SSascha Wildner If StartBit is greater than 63, then ASSERT(). 6001*1370a723SSascha Wildner If EndBit is greater than 63, then ASSERT(). 6002*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 6003*1370a723SSascha Wildner If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 6004*1370a723SSascha Wildner 6005*1370a723SSascha Wildner @param Index The 32-bit MSR index to write. 6006*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 6007*1370a723SSascha Wildner Range 0..63. 6008*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 6009*1370a723SSascha Wildner Range 0..63. 6010*1370a723SSascha Wildner @param Value New value of the bit field. 6011*1370a723SSascha Wildner 6012*1370a723SSascha Wildner @return The value written back to the MSR. 6013*1370a723SSascha Wildner 6014*1370a723SSascha Wildner **/ 6015*1370a723SSascha Wildner UINT64 6016*1370a723SSascha Wildner EFIAPI 6017*1370a723SSascha Wildner AsmMsrBitFieldWrite64 ( 6018*1370a723SSascha Wildner IN UINT32 Index, 6019*1370a723SSascha Wildner IN UINTN StartBit, 6020*1370a723SSascha Wildner IN UINTN EndBit, 6021*1370a723SSascha Wildner IN UINT64 Value 6022*1370a723SSascha Wildner ); 6023*1370a723SSascha Wildner 6024*1370a723SSascha Wildner /** 6025*1370a723SSascha Wildner Reads a bit field in a 64-bit MSR, performs a bitwise OR, and 6026*1370a723SSascha Wildner writes the result back to the bit field in the 64-bit MSR. 6027*1370a723SSascha Wildner 6028*1370a723SSascha Wildner Reads the 64-bit MSR specified by Index, performs a bitwise OR 6029*1370a723SSascha Wildner between the read result and the value specified by OrData, and writes the 6030*1370a723SSascha Wildner result to the 64-bit MSR specified by Index. The value written to the MSR is 6031*1370a723SSascha Wildner returned. Extra left bits in OrData are stripped. The caller must either 6032*1370a723SSascha Wildner guarantee that Index and the data written is valid, or the caller must set up 6033*1370a723SSascha Wildner exception handlers to catch the exceptions. This function is only available 6034*1370a723SSascha Wildner on IA-32 and x64. 6035*1370a723SSascha Wildner 6036*1370a723SSascha Wildner If StartBit is greater than 63, then ASSERT(). 6037*1370a723SSascha Wildner If EndBit is greater than 63, then ASSERT(). 6038*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 6039*1370a723SSascha Wildner If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 6040*1370a723SSascha Wildner 6041*1370a723SSascha Wildner @param Index The 32-bit MSR index to write. 6042*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 6043*1370a723SSascha Wildner Range 0..63. 6044*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 6045*1370a723SSascha Wildner Range 0..63. 6046*1370a723SSascha Wildner @param OrData The value to OR with the read value from the bit field. 6047*1370a723SSascha Wildner 6048*1370a723SSascha Wildner @return The value written back to the MSR. 6049*1370a723SSascha Wildner 6050*1370a723SSascha Wildner **/ 6051*1370a723SSascha Wildner UINT64 6052*1370a723SSascha Wildner EFIAPI 6053*1370a723SSascha Wildner AsmMsrBitFieldOr64 ( 6054*1370a723SSascha Wildner IN UINT32 Index, 6055*1370a723SSascha Wildner IN UINTN StartBit, 6056*1370a723SSascha Wildner IN UINTN EndBit, 6057*1370a723SSascha Wildner IN UINT64 OrData 6058*1370a723SSascha Wildner ); 6059*1370a723SSascha Wildner 6060*1370a723SSascha Wildner /** 6061*1370a723SSascha Wildner Reads a bit field in a 64-bit MSR, performs a bitwise AND, and writes the 6062*1370a723SSascha Wildner result back to the bit field in the 64-bit MSR. 6063*1370a723SSascha Wildner 6064*1370a723SSascha Wildner Reads the 64-bit MSR specified by Index, performs a bitwise AND between the 6065*1370a723SSascha Wildner read result and the value specified by AndData, and writes the result to the 6066*1370a723SSascha Wildner 64-bit MSR specified by Index. The value written to the MSR is returned. 6067*1370a723SSascha Wildner Extra left bits in AndData are stripped. The caller must either guarantee 6068*1370a723SSascha Wildner that Index and the data written is valid, or the caller must set up exception 6069*1370a723SSascha Wildner handlers to catch the exceptions. This function is only available on IA-32 6070*1370a723SSascha Wildner and x64. 6071*1370a723SSascha Wildner 6072*1370a723SSascha Wildner If StartBit is greater than 63, then ASSERT(). 6073*1370a723SSascha Wildner If EndBit is greater than 63, then ASSERT(). 6074*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 6075*1370a723SSascha Wildner If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 6076*1370a723SSascha Wildner 6077*1370a723SSascha Wildner @param Index The 32-bit MSR index to write. 6078*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 6079*1370a723SSascha Wildner Range 0..63. 6080*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 6081*1370a723SSascha Wildner Range 0..63. 6082*1370a723SSascha Wildner @param AndData The value to AND with the read value from the bit field. 6083*1370a723SSascha Wildner 6084*1370a723SSascha Wildner @return The value written back to the MSR. 6085*1370a723SSascha Wildner 6086*1370a723SSascha Wildner **/ 6087*1370a723SSascha Wildner UINT64 6088*1370a723SSascha Wildner EFIAPI 6089*1370a723SSascha Wildner AsmMsrBitFieldAnd64 ( 6090*1370a723SSascha Wildner IN UINT32 Index, 6091*1370a723SSascha Wildner IN UINTN StartBit, 6092*1370a723SSascha Wildner IN UINTN EndBit, 6093*1370a723SSascha Wildner IN UINT64 AndData 6094*1370a723SSascha Wildner ); 6095*1370a723SSascha Wildner 6096*1370a723SSascha Wildner /** 6097*1370a723SSascha Wildner Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a 6098*1370a723SSascha Wildner bitwise OR, and writes the result back to the bit field in the 6099*1370a723SSascha Wildner 64-bit MSR. 6100*1370a723SSascha Wildner 6101*1370a723SSascha Wildner Reads the 64-bit MSR specified by Index, performs a bitwise AND followed by 6102*1370a723SSascha Wildner a bitwise OR between the read result and the value specified by 6103*1370a723SSascha Wildner AndData, and writes the result to the 64-bit MSR specified by Index. The 6104*1370a723SSascha Wildner value written to the MSR is returned. Extra left bits in both AndData and 6105*1370a723SSascha Wildner OrData are stripped. The caller must either guarantee that Index and the data 6106*1370a723SSascha Wildner written is valid, or the caller must set up exception handlers to catch the 6107*1370a723SSascha Wildner exceptions. This function is only available on IA-32 and x64. 6108*1370a723SSascha Wildner 6109*1370a723SSascha Wildner If StartBit is greater than 63, then ASSERT(). 6110*1370a723SSascha Wildner If EndBit is greater than 63, then ASSERT(). 6111*1370a723SSascha Wildner If EndBit is less than StartBit, then ASSERT(). 6112*1370a723SSascha Wildner If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 6113*1370a723SSascha Wildner If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT(). 6114*1370a723SSascha Wildner 6115*1370a723SSascha Wildner @param Index The 32-bit MSR index to write. 6116*1370a723SSascha Wildner @param StartBit The ordinal of the least significant bit in the bit field. 6117*1370a723SSascha Wildner Range 0..63. 6118*1370a723SSascha Wildner @param EndBit The ordinal of the most significant bit in the bit field. 6119*1370a723SSascha Wildner Range 0..63. 6120*1370a723SSascha Wildner @param AndData The value to AND with the read value from the bit field. 6121*1370a723SSascha Wildner @param OrData The value to OR with the result of the AND operation. 6122*1370a723SSascha Wildner 6123*1370a723SSascha Wildner @return The value written back to the MSR. 6124*1370a723SSascha Wildner 6125*1370a723SSascha Wildner **/ 6126*1370a723SSascha Wildner UINT64 6127*1370a723SSascha Wildner EFIAPI 6128*1370a723SSascha Wildner AsmMsrBitFieldAndThenOr64 ( 6129*1370a723SSascha Wildner IN UINT32 Index, 6130*1370a723SSascha Wildner IN UINTN StartBit, 6131*1370a723SSascha Wildner IN UINTN EndBit, 6132*1370a723SSascha Wildner IN UINT64 AndData, 6133*1370a723SSascha Wildner IN UINT64 OrData 6134*1370a723SSascha Wildner ); 6135*1370a723SSascha Wildner 6136*1370a723SSascha Wildner /** 6137*1370a723SSascha Wildner Reads the current value of the EFLAGS register. 6138*1370a723SSascha Wildner 6139*1370a723SSascha Wildner Reads and returns the current value of the EFLAGS register. This function is 6140*1370a723SSascha Wildner only available on IA-32 and x64. This returns a 32-bit value on IA-32 and a 6141*1370a723SSascha Wildner 64-bit value on x64. 6142*1370a723SSascha Wildner 6143*1370a723SSascha Wildner @return EFLAGS on IA-32 or RFLAGS on x64. 6144*1370a723SSascha Wildner 6145*1370a723SSascha Wildner **/ 6146*1370a723SSascha Wildner UINTN 6147*1370a723SSascha Wildner EFIAPI 6148*1370a723SSascha Wildner AsmReadEflags ( 6149*1370a723SSascha Wildner VOID 6150*1370a723SSascha Wildner ); 6151*1370a723SSascha Wildner 6152*1370a723SSascha Wildner /** 6153*1370a723SSascha Wildner Reads the current value of the Control Register 0 (CR0). 6154*1370a723SSascha Wildner 6155*1370a723SSascha Wildner Reads and returns the current value of CR0. This function is only available 6156*1370a723SSascha Wildner on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on 6157*1370a723SSascha Wildner x64. 6158*1370a723SSascha Wildner 6159*1370a723SSascha Wildner @return The value of the Control Register 0 (CR0). 6160*1370a723SSascha Wildner 6161*1370a723SSascha Wildner **/ 6162*1370a723SSascha Wildner UINTN 6163*1370a723SSascha Wildner EFIAPI 6164*1370a723SSascha Wildner AsmReadCr0 ( 6165*1370a723SSascha Wildner VOID 6166*1370a723SSascha Wildner ); 6167*1370a723SSascha Wildner 6168*1370a723SSascha Wildner /** 6169*1370a723SSascha Wildner Reads the current value of the Control Register 2 (CR2). 6170*1370a723SSascha Wildner 6171*1370a723SSascha Wildner Reads and returns the current value of CR2. This function is only available 6172*1370a723SSascha Wildner on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on 6173*1370a723SSascha Wildner x64. 6174*1370a723SSascha Wildner 6175*1370a723SSascha Wildner @return The value of the Control Register 2 (CR2). 6176*1370a723SSascha Wildner 6177*1370a723SSascha Wildner **/ 6178*1370a723SSascha Wildner UINTN 6179*1370a723SSascha Wildner EFIAPI 6180*1370a723SSascha Wildner AsmReadCr2 ( 6181*1370a723SSascha Wildner VOID 6182*1370a723SSascha Wildner ); 6183*1370a723SSascha Wildner 6184*1370a723SSascha Wildner /** 6185*1370a723SSascha Wildner Reads the current value of the Control Register 3 (CR3). 6186*1370a723SSascha Wildner 6187*1370a723SSascha Wildner Reads and returns the current value of CR3. This function is only available 6188*1370a723SSascha Wildner on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on 6189*1370a723SSascha Wildner x64. 6190*1370a723SSascha Wildner 6191*1370a723SSascha Wildner @return The value of the Control Register 3 (CR3). 6192*1370a723SSascha Wildner 6193*1370a723SSascha Wildner **/ 6194*1370a723SSascha Wildner UINTN 6195*1370a723SSascha Wildner EFIAPI 6196*1370a723SSascha Wildner AsmReadCr3 ( 6197*1370a723SSascha Wildner VOID 6198*1370a723SSascha Wildner ); 6199*1370a723SSascha Wildner 6200*1370a723SSascha Wildner /** 6201*1370a723SSascha Wildner Reads the current value of the Control Register 4 (CR4). 6202*1370a723SSascha Wildner 6203*1370a723SSascha Wildner Reads and returns the current value of CR4. This function is only available 6204*1370a723SSascha Wildner on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on 6205*1370a723SSascha Wildner x64. 6206*1370a723SSascha Wildner 6207*1370a723SSascha Wildner @return The value of the Control Register 4 (CR4). 6208*1370a723SSascha Wildner 6209*1370a723SSascha Wildner **/ 6210*1370a723SSascha Wildner UINTN 6211*1370a723SSascha Wildner EFIAPI 6212*1370a723SSascha Wildner AsmReadCr4 ( 6213*1370a723SSascha Wildner VOID 6214*1370a723SSascha Wildner ); 6215*1370a723SSascha Wildner 6216*1370a723SSascha Wildner /** 6217*1370a723SSascha Wildner Writes a value to Control Register 0 (CR0). 6218*1370a723SSascha Wildner 6219*1370a723SSascha Wildner Writes and returns a new value to CR0. This function is only available on 6220*1370a723SSascha Wildner IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64. 6221*1370a723SSascha Wildner 6222*1370a723SSascha Wildner @param Cr0 The value to write to CR0. 6223*1370a723SSascha Wildner 6224*1370a723SSascha Wildner @return The value written to CR0. 6225*1370a723SSascha Wildner 6226*1370a723SSascha Wildner **/ 6227*1370a723SSascha Wildner UINTN 6228*1370a723SSascha Wildner EFIAPI 6229*1370a723SSascha Wildner AsmWriteCr0 ( 6230*1370a723SSascha Wildner UINTN Cr0 6231*1370a723SSascha Wildner ); 6232*1370a723SSascha Wildner 6233*1370a723SSascha Wildner /** 6234*1370a723SSascha Wildner Writes a value to Control Register 2 (CR2). 6235*1370a723SSascha Wildner 6236*1370a723SSascha Wildner Writes and returns a new value to CR2. This function is only available on 6237*1370a723SSascha Wildner IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64. 6238*1370a723SSascha Wildner 6239*1370a723SSascha Wildner @param Cr2 The value to write to CR2. 6240*1370a723SSascha Wildner 6241*1370a723SSascha Wildner @return The value written to CR2. 6242*1370a723SSascha Wildner 6243*1370a723SSascha Wildner **/ 6244*1370a723SSascha Wildner UINTN 6245*1370a723SSascha Wildner EFIAPI 6246*1370a723SSascha Wildner AsmWriteCr2 ( 6247*1370a723SSascha Wildner UINTN Cr2 6248*1370a723SSascha Wildner ); 6249*1370a723SSascha Wildner 6250*1370a723SSascha Wildner /** 6251*1370a723SSascha Wildner Writes a value to Control Register 3 (CR3). 6252*1370a723SSascha Wildner 6253*1370a723SSascha Wildner Writes and returns a new value to CR3. This function is only available on 6254*1370a723SSascha Wildner IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64. 6255*1370a723SSascha Wildner 6256*1370a723SSascha Wildner @param Cr3 The value to write to CR3. 6257*1370a723SSascha Wildner 6258*1370a723SSascha Wildner @return The value written to CR3. 6259*1370a723SSascha Wildner 6260*1370a723SSascha Wildner **/ 6261*1370a723SSascha Wildner UINTN 6262*1370a723SSascha Wildner EFIAPI 6263*1370a723SSascha Wildner AsmWriteCr3 ( 6264*1370a723SSascha Wildner UINTN Cr3 6265*1370a723SSascha Wildner ); 6266*1370a723SSascha Wildner 6267*1370a723SSascha Wildner /** 6268*1370a723SSascha Wildner Writes a value to Control Register 4 (CR4). 6269*1370a723SSascha Wildner 6270*1370a723SSascha Wildner Writes and returns a new value to CR4. This function is only available on 6271*1370a723SSascha Wildner IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64. 6272*1370a723SSascha Wildner 6273*1370a723SSascha Wildner @param Cr4 The value to write to CR4. 6274*1370a723SSascha Wildner 6275*1370a723SSascha Wildner @return The value written to CR4. 6276*1370a723SSascha Wildner 6277*1370a723SSascha Wildner **/ 6278*1370a723SSascha Wildner UINTN 6279*1370a723SSascha Wildner EFIAPI 6280*1370a723SSascha Wildner AsmWriteCr4 ( 6281*1370a723SSascha Wildner UINTN Cr4 6282*1370a723SSascha Wildner ); 6283*1370a723SSascha Wildner 6284*1370a723SSascha Wildner /** 6285*1370a723SSascha Wildner Reads the current value of Debug Register 0 (DR0). 6286*1370a723SSascha Wildner 6287*1370a723SSascha Wildner Reads and returns the current value of DR0. This function is only available 6288*1370a723SSascha Wildner on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on 6289*1370a723SSascha Wildner x64. 6290*1370a723SSascha Wildner 6291*1370a723SSascha Wildner @return The value of Debug Register 0 (DR0). 6292*1370a723SSascha Wildner 6293*1370a723SSascha Wildner **/ 6294*1370a723SSascha Wildner UINTN 6295*1370a723SSascha Wildner EFIAPI 6296*1370a723SSascha Wildner AsmReadDr0 ( 6297*1370a723SSascha Wildner VOID 6298*1370a723SSascha Wildner ); 6299*1370a723SSascha Wildner 6300*1370a723SSascha Wildner /** 6301*1370a723SSascha Wildner Reads the current value of Debug Register 1 (DR1). 6302*1370a723SSascha Wildner 6303*1370a723SSascha Wildner Reads and returns the current value of DR1. This function is only available 6304*1370a723SSascha Wildner on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on 6305*1370a723SSascha Wildner x64. 6306*1370a723SSascha Wildner 6307*1370a723SSascha Wildner @return The value of Debug Register 1 (DR1). 6308*1370a723SSascha Wildner 6309*1370a723SSascha Wildner **/ 6310*1370a723SSascha Wildner UINTN 6311*1370a723SSascha Wildner EFIAPI 6312*1370a723SSascha Wildner AsmReadDr1 ( 6313*1370a723SSascha Wildner VOID 6314*1370a723SSascha Wildner ); 6315*1370a723SSascha Wildner 6316*1370a723SSascha Wildner /** 6317*1370a723SSascha Wildner Reads the current value of Debug Register 2 (DR2). 6318*1370a723SSascha Wildner 6319*1370a723SSascha Wildner Reads and returns the current value of DR2. This function is only available 6320*1370a723SSascha Wildner on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on 6321*1370a723SSascha Wildner x64. 6322*1370a723SSascha Wildner 6323*1370a723SSascha Wildner @return The value of Debug Register 2 (DR2). 6324*1370a723SSascha Wildner 6325*1370a723SSascha Wildner **/ 6326*1370a723SSascha Wildner UINTN 6327*1370a723SSascha Wildner EFIAPI 6328*1370a723SSascha Wildner AsmReadDr2 ( 6329*1370a723SSascha Wildner VOID 6330*1370a723SSascha Wildner ); 6331*1370a723SSascha Wildner 6332*1370a723SSascha Wildner /** 6333*1370a723SSascha Wildner Reads the current value of Debug Register 3 (DR3). 6334*1370a723SSascha Wildner 6335*1370a723SSascha Wildner Reads and returns the current value of DR3. This function is only available 6336*1370a723SSascha Wildner on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on 6337*1370a723SSascha Wildner x64. 6338*1370a723SSascha Wildner 6339*1370a723SSascha Wildner @return The value of Debug Register 3 (DR3). 6340*1370a723SSascha Wildner 6341*1370a723SSascha Wildner **/ 6342*1370a723SSascha Wildner UINTN 6343*1370a723SSascha Wildner EFIAPI 6344*1370a723SSascha Wildner AsmReadDr3 ( 6345*1370a723SSascha Wildner VOID 6346*1370a723SSascha Wildner ); 6347*1370a723SSascha Wildner 6348*1370a723SSascha Wildner /** 6349*1370a723SSascha Wildner Reads the current value of Debug Register 4 (DR4). 6350*1370a723SSascha Wildner 6351*1370a723SSascha Wildner Reads and returns the current value of DR4. This function is only available 6352*1370a723SSascha Wildner on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on 6353*1370a723SSascha Wildner x64. 6354*1370a723SSascha Wildner 6355*1370a723SSascha Wildner @return The value of Debug Register 4 (DR4). 6356*1370a723SSascha Wildner 6357*1370a723SSascha Wildner **/ 6358*1370a723SSascha Wildner UINTN 6359*1370a723SSascha Wildner EFIAPI 6360*1370a723SSascha Wildner AsmReadDr4 ( 6361*1370a723SSascha Wildner VOID 6362*1370a723SSascha Wildner ); 6363*1370a723SSascha Wildner 6364*1370a723SSascha Wildner /** 6365*1370a723SSascha Wildner Reads the current value of Debug Register 5 (DR5). 6366*1370a723SSascha Wildner 6367*1370a723SSascha Wildner Reads and returns the current value of DR5. This function is only available 6368*1370a723SSascha Wildner on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on 6369*1370a723SSascha Wildner x64. 6370*1370a723SSascha Wildner 6371*1370a723SSascha Wildner @return The value of Debug Register 5 (DR5). 6372*1370a723SSascha Wildner 6373*1370a723SSascha Wildner **/ 6374*1370a723SSascha Wildner UINTN 6375*1370a723SSascha Wildner EFIAPI 6376*1370a723SSascha Wildner AsmReadDr5 ( 6377*1370a723SSascha Wildner VOID 6378*1370a723SSascha Wildner ); 6379*1370a723SSascha Wildner 6380*1370a723SSascha Wildner /** 6381*1370a723SSascha Wildner Reads the current value of Debug Register 6 (DR6). 6382*1370a723SSascha Wildner 6383*1370a723SSascha Wildner Reads and returns the current value of DR6. This function is only available 6384*1370a723SSascha Wildner on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on 6385*1370a723SSascha Wildner x64. 6386*1370a723SSascha Wildner 6387*1370a723SSascha Wildner @return The value of Debug Register 6 (DR6). 6388*1370a723SSascha Wildner 6389*1370a723SSascha Wildner **/ 6390*1370a723SSascha Wildner UINTN 6391*1370a723SSascha Wildner EFIAPI 6392*1370a723SSascha Wildner AsmReadDr6 ( 6393*1370a723SSascha Wildner VOID 6394*1370a723SSascha Wildner ); 6395*1370a723SSascha Wildner 6396*1370a723SSascha Wildner /** 6397*1370a723SSascha Wildner Reads the current value of Debug Register 7 (DR7). 6398*1370a723SSascha Wildner 6399*1370a723SSascha Wildner Reads and returns the current value of DR7. This function is only available 6400*1370a723SSascha Wildner on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on 6401*1370a723SSascha Wildner x64. 6402*1370a723SSascha Wildner 6403*1370a723SSascha Wildner @return The value of Debug Register 7 (DR7). 6404*1370a723SSascha Wildner 6405*1370a723SSascha Wildner **/ 6406*1370a723SSascha Wildner UINTN 6407*1370a723SSascha Wildner EFIAPI 6408*1370a723SSascha Wildner AsmReadDr7 ( 6409*1370a723SSascha Wildner VOID 6410*1370a723SSascha Wildner ); 6411*1370a723SSascha Wildner 6412*1370a723SSascha Wildner /** 6413*1370a723SSascha Wildner Writes a value to Debug Register 0 (DR0). 6414*1370a723SSascha Wildner 6415*1370a723SSascha Wildner Writes and returns a new value to DR0. This function is only available on 6416*1370a723SSascha Wildner IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64. 6417*1370a723SSascha Wildner 6418*1370a723SSascha Wildner @param Dr0 The value to write to Dr0. 6419*1370a723SSascha Wildner 6420*1370a723SSascha Wildner @return The value written to Debug Register 0 (DR0). 6421*1370a723SSascha Wildner 6422*1370a723SSascha Wildner **/ 6423*1370a723SSascha Wildner UINTN 6424*1370a723SSascha Wildner EFIAPI 6425*1370a723SSascha Wildner AsmWriteDr0 ( 6426*1370a723SSascha Wildner UINTN Dr0 6427*1370a723SSascha Wildner ); 6428*1370a723SSascha Wildner 6429*1370a723SSascha Wildner /** 6430*1370a723SSascha Wildner Writes a value to Debug Register 1 (DR1). 6431*1370a723SSascha Wildner 6432*1370a723SSascha Wildner Writes and returns a new value to DR1. This function is only available on 6433*1370a723SSascha Wildner IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64. 6434*1370a723SSascha Wildner 6435*1370a723SSascha Wildner @param Dr1 The value to write to Dr1. 6436*1370a723SSascha Wildner 6437*1370a723SSascha Wildner @return The value written to Debug Register 1 (DR1). 6438*1370a723SSascha Wildner 6439*1370a723SSascha Wildner **/ 6440*1370a723SSascha Wildner UINTN 6441*1370a723SSascha Wildner EFIAPI 6442*1370a723SSascha Wildner AsmWriteDr1 ( 6443*1370a723SSascha Wildner UINTN Dr1 6444*1370a723SSascha Wildner ); 6445*1370a723SSascha Wildner 6446*1370a723SSascha Wildner /** 6447*1370a723SSascha Wildner Writes a value to Debug Register 2 (DR2). 6448*1370a723SSascha Wildner 6449*1370a723SSascha Wildner Writes and returns a new value to DR2. This function is only available on 6450*1370a723SSascha Wildner IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64. 6451*1370a723SSascha Wildner 6452*1370a723SSascha Wildner @param Dr2 The value to write to Dr2. 6453*1370a723SSascha Wildner 6454*1370a723SSascha Wildner @return The value written to Debug Register 2 (DR2). 6455*1370a723SSascha Wildner 6456*1370a723SSascha Wildner **/ 6457*1370a723SSascha Wildner UINTN 6458*1370a723SSascha Wildner EFIAPI 6459*1370a723SSascha Wildner AsmWriteDr2 ( 6460*1370a723SSascha Wildner UINTN Dr2 6461*1370a723SSascha Wildner ); 6462*1370a723SSascha Wildner 6463*1370a723SSascha Wildner /** 6464*1370a723SSascha Wildner Writes a value to Debug Register 3 (DR3). 6465*1370a723SSascha Wildner 6466*1370a723SSascha Wildner Writes and returns a new value to DR3. This function is only available on 6467*1370a723SSascha Wildner IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64. 6468*1370a723SSascha Wildner 6469*1370a723SSascha Wildner @param Dr3 The value to write to Dr3. 6470*1370a723SSascha Wildner 6471*1370a723SSascha Wildner @return The value written to Debug Register 3 (DR3). 6472*1370a723SSascha Wildner 6473*1370a723SSascha Wildner **/ 6474*1370a723SSascha Wildner UINTN 6475*1370a723SSascha Wildner EFIAPI 6476*1370a723SSascha Wildner AsmWriteDr3 ( 6477*1370a723SSascha Wildner UINTN Dr3 6478*1370a723SSascha Wildner ); 6479*1370a723SSascha Wildner 6480*1370a723SSascha Wildner /** 6481*1370a723SSascha Wildner Writes a value to Debug Register 4 (DR4). 6482*1370a723SSascha Wildner 6483*1370a723SSascha Wildner Writes and returns a new value to DR4. This function is only available on 6484*1370a723SSascha Wildner IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64. 6485*1370a723SSascha Wildner 6486*1370a723SSascha Wildner @param Dr4 The value to write to Dr4. 6487*1370a723SSascha Wildner 6488*1370a723SSascha Wildner @return The value written to Debug Register 4 (DR4). 6489*1370a723SSascha Wildner 6490*1370a723SSascha Wildner **/ 6491*1370a723SSascha Wildner UINTN 6492*1370a723SSascha Wildner EFIAPI 6493*1370a723SSascha Wildner AsmWriteDr4 ( 6494*1370a723SSascha Wildner UINTN Dr4 6495*1370a723SSascha Wildner ); 6496*1370a723SSascha Wildner 6497*1370a723SSascha Wildner /** 6498*1370a723SSascha Wildner Writes a value to Debug Register 5 (DR5). 6499*1370a723SSascha Wildner 6500*1370a723SSascha Wildner Writes and returns a new value to DR5. This function is only available on 6501*1370a723SSascha Wildner IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64. 6502*1370a723SSascha Wildner 6503*1370a723SSascha Wildner @param Dr5 The value to write to Dr5. 6504*1370a723SSascha Wildner 6505*1370a723SSascha Wildner @return The value written to Debug Register 5 (DR5). 6506*1370a723SSascha Wildner 6507*1370a723SSascha Wildner **/ 6508*1370a723SSascha Wildner UINTN 6509*1370a723SSascha Wildner EFIAPI 6510*1370a723SSascha Wildner AsmWriteDr5 ( 6511*1370a723SSascha Wildner UINTN Dr5 6512*1370a723SSascha Wildner ); 6513*1370a723SSascha Wildner 6514*1370a723SSascha Wildner /** 6515*1370a723SSascha Wildner Writes a value to Debug Register 6 (DR6). 6516*1370a723SSascha Wildner 6517*1370a723SSascha Wildner Writes and returns a new value to DR6. This function is only available on 6518*1370a723SSascha Wildner IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64. 6519*1370a723SSascha Wildner 6520*1370a723SSascha Wildner @param Dr6 The value to write to Dr6. 6521*1370a723SSascha Wildner 6522*1370a723SSascha Wildner @return The value written to Debug Register 6 (DR6). 6523*1370a723SSascha Wildner 6524*1370a723SSascha Wildner **/ 6525*1370a723SSascha Wildner UINTN 6526*1370a723SSascha Wildner EFIAPI 6527*1370a723SSascha Wildner AsmWriteDr6 ( 6528*1370a723SSascha Wildner UINTN Dr6 6529*1370a723SSascha Wildner ); 6530*1370a723SSascha Wildner 6531*1370a723SSascha Wildner /** 6532*1370a723SSascha Wildner Writes a value to Debug Register 7 (DR7). 6533*1370a723SSascha Wildner 6534*1370a723SSascha Wildner Writes and returns a new value to DR7. This function is only available on 6535*1370a723SSascha Wildner IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64. 6536*1370a723SSascha Wildner 6537*1370a723SSascha Wildner @param Dr7 The value to write to Dr7. 6538*1370a723SSascha Wildner 6539*1370a723SSascha Wildner @return The value written to Debug Register 7 (DR7). 6540*1370a723SSascha Wildner 6541*1370a723SSascha Wildner **/ 6542*1370a723SSascha Wildner UINTN 6543*1370a723SSascha Wildner EFIAPI 6544*1370a723SSascha Wildner AsmWriteDr7 ( 6545*1370a723SSascha Wildner UINTN Dr7 6546*1370a723SSascha Wildner ); 6547*1370a723SSascha Wildner 6548*1370a723SSascha Wildner /** 6549*1370a723SSascha Wildner Reads the current value of Code Segment Register (CS). 6550*1370a723SSascha Wildner 6551*1370a723SSascha Wildner Reads and returns the current value of CS. This function is only available on 6552*1370a723SSascha Wildner IA-32 and x64. 6553*1370a723SSascha Wildner 6554*1370a723SSascha Wildner @return The current value of CS. 6555*1370a723SSascha Wildner 6556*1370a723SSascha Wildner **/ 6557*1370a723SSascha Wildner UINT16 6558*1370a723SSascha Wildner EFIAPI 6559*1370a723SSascha Wildner AsmReadCs ( 6560*1370a723SSascha Wildner VOID 6561*1370a723SSascha Wildner ); 6562*1370a723SSascha Wildner 6563*1370a723SSascha Wildner /** 6564*1370a723SSascha Wildner Reads the current value of Data Segment Register (DS). 6565*1370a723SSascha Wildner 6566*1370a723SSascha Wildner Reads and returns the current value of DS. This function is only available on 6567*1370a723SSascha Wildner IA-32 and x64. 6568*1370a723SSascha Wildner 6569*1370a723SSascha Wildner @return The current value of DS. 6570*1370a723SSascha Wildner 6571*1370a723SSascha Wildner **/ 6572*1370a723SSascha Wildner UINT16 6573*1370a723SSascha Wildner EFIAPI 6574*1370a723SSascha Wildner AsmReadDs ( 6575*1370a723SSascha Wildner VOID 6576*1370a723SSascha Wildner ); 6577*1370a723SSascha Wildner 6578*1370a723SSascha Wildner /** 6579*1370a723SSascha Wildner Reads the current value of Extra Segment Register (ES). 6580*1370a723SSascha Wildner 6581*1370a723SSascha Wildner Reads and returns the current value of ES. This function is only available on 6582*1370a723SSascha Wildner IA-32 and x64. 6583*1370a723SSascha Wildner 6584*1370a723SSascha Wildner @return The current value of ES. 6585*1370a723SSascha Wildner 6586*1370a723SSascha Wildner **/ 6587*1370a723SSascha Wildner UINT16 6588*1370a723SSascha Wildner EFIAPI 6589*1370a723SSascha Wildner AsmReadEs ( 6590*1370a723SSascha Wildner VOID 6591*1370a723SSascha Wildner ); 6592*1370a723SSascha Wildner 6593*1370a723SSascha Wildner /** 6594*1370a723SSascha Wildner Reads the current value of FS Data Segment Register (FS). 6595*1370a723SSascha Wildner 6596*1370a723SSascha Wildner Reads and returns the current value of FS. This function is only available on 6597*1370a723SSascha Wildner IA-32 and x64. 6598*1370a723SSascha Wildner 6599*1370a723SSascha Wildner @return The current value of FS. 6600*1370a723SSascha Wildner 6601*1370a723SSascha Wildner **/ 6602*1370a723SSascha Wildner UINT16 6603*1370a723SSascha Wildner EFIAPI 6604*1370a723SSascha Wildner AsmReadFs ( 6605*1370a723SSascha Wildner VOID 6606*1370a723SSascha Wildner ); 6607*1370a723SSascha Wildner 6608*1370a723SSascha Wildner /** 6609*1370a723SSascha Wildner Reads the current value of GS Data Segment Register (GS). 6610*1370a723SSascha Wildner 6611*1370a723SSascha Wildner Reads and returns the current value of GS. This function is only available on 6612*1370a723SSascha Wildner IA-32 and x64. 6613*1370a723SSascha Wildner 6614*1370a723SSascha Wildner @return The current value of GS. 6615*1370a723SSascha Wildner 6616*1370a723SSascha Wildner **/ 6617*1370a723SSascha Wildner UINT16 6618*1370a723SSascha Wildner EFIAPI 6619*1370a723SSascha Wildner AsmReadGs ( 6620*1370a723SSascha Wildner VOID 6621*1370a723SSascha Wildner ); 6622*1370a723SSascha Wildner 6623*1370a723SSascha Wildner /** 6624*1370a723SSascha Wildner Reads the current value of Stack Segment Register (SS). 6625*1370a723SSascha Wildner 6626*1370a723SSascha Wildner Reads and returns the current value of SS. This function is only available on 6627*1370a723SSascha Wildner IA-32 and x64. 6628*1370a723SSascha Wildner 6629*1370a723SSascha Wildner @return The current value of SS. 6630*1370a723SSascha Wildner 6631*1370a723SSascha Wildner **/ 6632*1370a723SSascha Wildner UINT16 6633*1370a723SSascha Wildner EFIAPI 6634*1370a723SSascha Wildner AsmReadSs ( 6635*1370a723SSascha Wildner VOID 6636*1370a723SSascha Wildner ); 6637*1370a723SSascha Wildner 6638*1370a723SSascha Wildner /** 6639*1370a723SSascha Wildner Reads the current value of Task Register (TR). 6640*1370a723SSascha Wildner 6641*1370a723SSascha Wildner Reads and returns the current value of TR. This function is only available on 6642*1370a723SSascha Wildner IA-32 and x64. 6643*1370a723SSascha Wildner 6644*1370a723SSascha Wildner @return The current value of TR. 6645*1370a723SSascha Wildner 6646*1370a723SSascha Wildner **/ 6647*1370a723SSascha Wildner UINT16 6648*1370a723SSascha Wildner EFIAPI 6649*1370a723SSascha Wildner AsmReadTr ( 6650*1370a723SSascha Wildner VOID 6651*1370a723SSascha Wildner ); 6652*1370a723SSascha Wildner 6653*1370a723SSascha Wildner /** 6654*1370a723SSascha Wildner Reads the current Global Descriptor Table Register(GDTR) descriptor. 6655*1370a723SSascha Wildner 6656*1370a723SSascha Wildner Reads and returns the current GDTR descriptor and returns it in Gdtr. This 6657*1370a723SSascha Wildner function is only available on IA-32 and x64. 6658*1370a723SSascha Wildner 6659*1370a723SSascha Wildner If Gdtr is NULL, then ASSERT(). 6660*1370a723SSascha Wildner 6661*1370a723SSascha Wildner @param Gdtr The pointer to a GDTR descriptor. 6662*1370a723SSascha Wildner 6663*1370a723SSascha Wildner **/ 6664*1370a723SSascha Wildner VOID 6665*1370a723SSascha Wildner EFIAPI 6666*1370a723SSascha Wildner AsmReadGdtr ( 6667*1370a723SSascha Wildner OUT IA32_DESCRIPTOR *Gdtr 6668*1370a723SSascha Wildner ); 6669*1370a723SSascha Wildner 6670*1370a723SSascha Wildner /** 6671*1370a723SSascha Wildner Writes the current Global Descriptor Table Register (GDTR) descriptor. 6672*1370a723SSascha Wildner 6673*1370a723SSascha Wildner Writes and the current GDTR descriptor specified by Gdtr. This function is 6674*1370a723SSascha Wildner only available on IA-32 and x64. 6675*1370a723SSascha Wildner 6676*1370a723SSascha Wildner If Gdtr is NULL, then ASSERT(). 6677*1370a723SSascha Wildner 6678*1370a723SSascha Wildner @param Gdtr The pointer to a GDTR descriptor. 6679*1370a723SSascha Wildner 6680*1370a723SSascha Wildner **/ 6681*1370a723SSascha Wildner VOID 6682*1370a723SSascha Wildner EFIAPI 6683*1370a723SSascha Wildner AsmWriteGdtr ( 6684*1370a723SSascha Wildner IN CONST IA32_DESCRIPTOR *Gdtr 6685*1370a723SSascha Wildner ); 6686*1370a723SSascha Wildner 6687*1370a723SSascha Wildner /** 6688*1370a723SSascha Wildner Reads the current Interrupt Descriptor Table Register(IDTR) descriptor. 6689*1370a723SSascha Wildner 6690*1370a723SSascha Wildner Reads and returns the current IDTR descriptor and returns it in Idtr. This 6691*1370a723SSascha Wildner function is only available on IA-32 and x64. 6692*1370a723SSascha Wildner 6693*1370a723SSascha Wildner If Idtr is NULL, then ASSERT(). 6694*1370a723SSascha Wildner 6695*1370a723SSascha Wildner @param Idtr The pointer to a IDTR descriptor. 6696*1370a723SSascha Wildner 6697*1370a723SSascha Wildner **/ 6698*1370a723SSascha Wildner VOID 6699*1370a723SSascha Wildner EFIAPI 6700*1370a723SSascha Wildner AsmReadIdtr ( 6701*1370a723SSascha Wildner OUT IA32_DESCRIPTOR *Idtr 6702*1370a723SSascha Wildner ); 6703*1370a723SSascha Wildner 6704*1370a723SSascha Wildner /** 6705*1370a723SSascha Wildner Writes the current Interrupt Descriptor Table Register(IDTR) descriptor. 6706*1370a723SSascha Wildner 6707*1370a723SSascha Wildner Writes the current IDTR descriptor and returns it in Idtr. This function is 6708*1370a723SSascha Wildner only available on IA-32 and x64. 6709*1370a723SSascha Wildner 6710*1370a723SSascha Wildner If Idtr is NULL, then ASSERT(). 6711*1370a723SSascha Wildner 6712*1370a723SSascha Wildner @param Idtr The pointer to a IDTR descriptor. 6713*1370a723SSascha Wildner 6714*1370a723SSascha Wildner **/ 6715*1370a723SSascha Wildner VOID 6716*1370a723SSascha Wildner EFIAPI 6717*1370a723SSascha Wildner AsmWriteIdtr ( 6718*1370a723SSascha Wildner IN CONST IA32_DESCRIPTOR *Idtr 6719*1370a723SSascha Wildner ); 6720*1370a723SSascha Wildner 6721*1370a723SSascha Wildner /** 6722*1370a723SSascha Wildner Reads the current Local Descriptor Table Register(LDTR) selector. 6723*1370a723SSascha Wildner 6724*1370a723SSascha Wildner Reads and returns the current 16-bit LDTR descriptor value. This function is 6725*1370a723SSascha Wildner only available on IA-32 and x64. 6726*1370a723SSascha Wildner 6727*1370a723SSascha Wildner @return The current selector of LDT. 6728*1370a723SSascha Wildner 6729*1370a723SSascha Wildner **/ 6730*1370a723SSascha Wildner UINT16 6731*1370a723SSascha Wildner EFIAPI 6732*1370a723SSascha Wildner AsmReadLdtr ( 6733*1370a723SSascha Wildner VOID 6734*1370a723SSascha Wildner ); 6735*1370a723SSascha Wildner 6736*1370a723SSascha Wildner /** 6737*1370a723SSascha Wildner Writes the current Local Descriptor Table Register (LDTR) selector. 6738*1370a723SSascha Wildner 6739*1370a723SSascha Wildner Writes and the current LDTR descriptor specified by Ldtr. This function is 6740*1370a723SSascha Wildner only available on IA-32 and x64. 6741*1370a723SSascha Wildner 6742*1370a723SSascha Wildner @param Ldtr 16-bit LDTR selector value. 6743*1370a723SSascha Wildner 6744*1370a723SSascha Wildner **/ 6745*1370a723SSascha Wildner VOID 6746*1370a723SSascha Wildner EFIAPI 6747*1370a723SSascha Wildner AsmWriteLdtr ( 6748*1370a723SSascha Wildner IN UINT16 Ldtr 6749*1370a723SSascha Wildner ); 6750*1370a723SSascha Wildner 6751*1370a723SSascha Wildner /** 6752*1370a723SSascha Wildner Save the current floating point/SSE/SSE2 context to a buffer. 6753*1370a723SSascha Wildner 6754*1370a723SSascha Wildner Saves the current floating point/SSE/SSE2 state to the buffer specified by 6755*1370a723SSascha Wildner Buffer. Buffer must be aligned on a 16-byte boundary. This function is only 6756*1370a723SSascha Wildner available on IA-32 and x64. 6757*1370a723SSascha Wildner 6758*1370a723SSascha Wildner If Buffer is NULL, then ASSERT(). 6759*1370a723SSascha Wildner If Buffer is not aligned on a 16-byte boundary, then ASSERT(). 6760*1370a723SSascha Wildner 6761*1370a723SSascha Wildner @param Buffer The pointer to a buffer to save the floating point/SSE/SSE2 context. 6762*1370a723SSascha Wildner 6763*1370a723SSascha Wildner **/ 6764*1370a723SSascha Wildner VOID 6765*1370a723SSascha Wildner EFIAPI 6766*1370a723SSascha Wildner AsmFxSave ( 6767*1370a723SSascha Wildner OUT IA32_FX_BUFFER *Buffer 6768*1370a723SSascha Wildner ); 6769*1370a723SSascha Wildner 6770*1370a723SSascha Wildner /** 6771*1370a723SSascha Wildner Restores the current floating point/SSE/SSE2 context from a buffer. 6772*1370a723SSascha Wildner 6773*1370a723SSascha Wildner Restores the current floating point/SSE/SSE2 state from the buffer specified 6774*1370a723SSascha Wildner by Buffer. Buffer must be aligned on a 16-byte boundary. This function is 6775*1370a723SSascha Wildner only available on IA-32 and x64. 6776*1370a723SSascha Wildner 6777*1370a723SSascha Wildner If Buffer is NULL, then ASSERT(). 6778*1370a723SSascha Wildner If Buffer is not aligned on a 16-byte boundary, then ASSERT(). 6779*1370a723SSascha Wildner If Buffer was not saved with AsmFxSave(), then ASSERT(). 6780*1370a723SSascha Wildner 6781*1370a723SSascha Wildner @param Buffer The pointer to a buffer to save the floating point/SSE/SSE2 context. 6782*1370a723SSascha Wildner 6783*1370a723SSascha Wildner **/ 6784*1370a723SSascha Wildner VOID 6785*1370a723SSascha Wildner EFIAPI 6786*1370a723SSascha Wildner AsmFxRestore ( 6787*1370a723SSascha Wildner IN CONST IA32_FX_BUFFER *Buffer 6788*1370a723SSascha Wildner ); 6789*1370a723SSascha Wildner 6790*1370a723SSascha Wildner /** 6791*1370a723SSascha Wildner Reads the current value of 64-bit MMX Register #0 (MM0). 6792*1370a723SSascha Wildner 6793*1370a723SSascha Wildner Reads and returns the current value of MM0. This function is only available 6794*1370a723SSascha Wildner on IA-32 and x64. 6795*1370a723SSascha Wildner 6796*1370a723SSascha Wildner @return The current value of MM0. 6797*1370a723SSascha Wildner 6798*1370a723SSascha Wildner **/ 6799*1370a723SSascha Wildner UINT64 6800*1370a723SSascha Wildner EFIAPI 6801*1370a723SSascha Wildner AsmReadMm0 ( 6802*1370a723SSascha Wildner VOID 6803*1370a723SSascha Wildner ); 6804*1370a723SSascha Wildner 6805*1370a723SSascha Wildner /** 6806*1370a723SSascha Wildner Reads the current value of 64-bit MMX Register #1 (MM1). 6807*1370a723SSascha Wildner 6808*1370a723SSascha Wildner Reads and returns the current value of MM1. This function is only available 6809*1370a723SSascha Wildner on IA-32 and x64. 6810*1370a723SSascha Wildner 6811*1370a723SSascha Wildner @return The current value of MM1. 6812*1370a723SSascha Wildner 6813*1370a723SSascha Wildner **/ 6814*1370a723SSascha Wildner UINT64 6815*1370a723SSascha Wildner EFIAPI 6816*1370a723SSascha Wildner AsmReadMm1 ( 6817*1370a723SSascha Wildner VOID 6818*1370a723SSascha Wildner ); 6819*1370a723SSascha Wildner 6820*1370a723SSascha Wildner /** 6821*1370a723SSascha Wildner Reads the current value of 64-bit MMX Register #2 (MM2). 6822*1370a723SSascha Wildner 6823*1370a723SSascha Wildner Reads and returns the current value of MM2. This function is only available 6824*1370a723SSascha Wildner on IA-32 and x64. 6825*1370a723SSascha Wildner 6826*1370a723SSascha Wildner @return The current value of MM2. 6827*1370a723SSascha Wildner 6828*1370a723SSascha Wildner **/ 6829*1370a723SSascha Wildner UINT64 6830*1370a723SSascha Wildner EFIAPI 6831*1370a723SSascha Wildner AsmReadMm2 ( 6832*1370a723SSascha Wildner VOID 6833*1370a723SSascha Wildner ); 6834*1370a723SSascha Wildner 6835*1370a723SSascha Wildner /** 6836*1370a723SSascha Wildner Reads the current value of 64-bit MMX Register #3 (MM3). 6837*1370a723SSascha Wildner 6838*1370a723SSascha Wildner Reads and returns the current value of MM3. This function is only available 6839*1370a723SSascha Wildner on IA-32 and x64. 6840*1370a723SSascha Wildner 6841*1370a723SSascha Wildner @return The current value of MM3. 6842*1370a723SSascha Wildner 6843*1370a723SSascha Wildner **/ 6844*1370a723SSascha Wildner UINT64 6845*1370a723SSascha Wildner EFIAPI 6846*1370a723SSascha Wildner AsmReadMm3 ( 6847*1370a723SSascha Wildner VOID 6848*1370a723SSascha Wildner ); 6849*1370a723SSascha Wildner 6850*1370a723SSascha Wildner /** 6851*1370a723SSascha Wildner Reads the current value of 64-bit MMX Register #4 (MM4). 6852*1370a723SSascha Wildner 6853*1370a723SSascha Wildner Reads and returns the current value of MM4. This function is only available 6854*1370a723SSascha Wildner on IA-32 and x64. 6855*1370a723SSascha Wildner 6856*1370a723SSascha Wildner @return The current value of MM4. 6857*1370a723SSascha Wildner 6858*1370a723SSascha Wildner **/ 6859*1370a723SSascha Wildner UINT64 6860*1370a723SSascha Wildner EFIAPI 6861*1370a723SSascha Wildner AsmReadMm4 ( 6862*1370a723SSascha Wildner VOID 6863*1370a723SSascha Wildner ); 6864*1370a723SSascha Wildner 6865*1370a723SSascha Wildner /** 6866*1370a723SSascha Wildner Reads the current value of 64-bit MMX Register #5 (MM5). 6867*1370a723SSascha Wildner 6868*1370a723SSascha Wildner Reads and returns the current value of MM5. This function is only available 6869*1370a723SSascha Wildner on IA-32 and x64. 6870*1370a723SSascha Wildner 6871*1370a723SSascha Wildner @return The current value of MM5. 6872*1370a723SSascha Wildner 6873*1370a723SSascha Wildner **/ 6874*1370a723SSascha Wildner UINT64 6875*1370a723SSascha Wildner EFIAPI 6876*1370a723SSascha Wildner AsmReadMm5 ( 6877*1370a723SSascha Wildner VOID 6878*1370a723SSascha Wildner ); 6879*1370a723SSascha Wildner 6880*1370a723SSascha Wildner /** 6881*1370a723SSascha Wildner Reads the current value of 64-bit MMX Register #6 (MM6). 6882*1370a723SSascha Wildner 6883*1370a723SSascha Wildner Reads and returns the current value of MM6. This function is only available 6884*1370a723SSascha Wildner on IA-32 and x64. 6885*1370a723SSascha Wildner 6886*1370a723SSascha Wildner @return The current value of MM6. 6887*1370a723SSascha Wildner 6888*1370a723SSascha Wildner **/ 6889*1370a723SSascha Wildner UINT64 6890*1370a723SSascha Wildner EFIAPI 6891*1370a723SSascha Wildner AsmReadMm6 ( 6892*1370a723SSascha Wildner VOID 6893*1370a723SSascha Wildner ); 6894*1370a723SSascha Wildner 6895*1370a723SSascha Wildner /** 6896*1370a723SSascha Wildner Reads the current value of 64-bit MMX Register #7 (MM7). 6897*1370a723SSascha Wildner 6898*1370a723SSascha Wildner Reads and returns the current value of MM7. This function is only available 6899*1370a723SSascha Wildner on IA-32 and x64. 6900*1370a723SSascha Wildner 6901*1370a723SSascha Wildner @return The current value of MM7. 6902*1370a723SSascha Wildner 6903*1370a723SSascha Wildner **/ 6904*1370a723SSascha Wildner UINT64 6905*1370a723SSascha Wildner EFIAPI 6906*1370a723SSascha Wildner AsmReadMm7 ( 6907*1370a723SSascha Wildner VOID 6908*1370a723SSascha Wildner ); 6909*1370a723SSascha Wildner 6910*1370a723SSascha Wildner /** 6911*1370a723SSascha Wildner Writes the current value of 64-bit MMX Register #0 (MM0). 6912*1370a723SSascha Wildner 6913*1370a723SSascha Wildner Writes the current value of MM0. This function is only available on IA32 and 6914*1370a723SSascha Wildner x64. 6915*1370a723SSascha Wildner 6916*1370a723SSascha Wildner @param Value The 64-bit value to write to MM0. 6917*1370a723SSascha Wildner 6918*1370a723SSascha Wildner **/ 6919*1370a723SSascha Wildner VOID 6920*1370a723SSascha Wildner EFIAPI 6921*1370a723SSascha Wildner AsmWriteMm0 ( 6922*1370a723SSascha Wildner IN UINT64 Value 6923*1370a723SSascha Wildner ); 6924*1370a723SSascha Wildner 6925*1370a723SSascha Wildner /** 6926*1370a723SSascha Wildner Writes the current value of 64-bit MMX Register #1 (MM1). 6927*1370a723SSascha Wildner 6928*1370a723SSascha Wildner Writes the current value of MM1. This function is only available on IA32 and 6929*1370a723SSascha Wildner x64. 6930*1370a723SSascha Wildner 6931*1370a723SSascha Wildner @param Value The 64-bit value to write to MM1. 6932*1370a723SSascha Wildner 6933*1370a723SSascha Wildner **/ 6934*1370a723SSascha Wildner VOID 6935*1370a723SSascha Wildner EFIAPI 6936*1370a723SSascha Wildner AsmWriteMm1 ( 6937*1370a723SSascha Wildner IN UINT64 Value 6938*1370a723SSascha Wildner ); 6939*1370a723SSascha Wildner 6940*1370a723SSascha Wildner /** 6941*1370a723SSascha Wildner Writes the current value of 64-bit MMX Register #2 (MM2). 6942*1370a723SSascha Wildner 6943*1370a723SSascha Wildner Writes the current value of MM2. This function is only available on IA32 and 6944*1370a723SSascha Wildner x64. 6945*1370a723SSascha Wildner 6946*1370a723SSascha Wildner @param Value The 64-bit value to write to MM2. 6947*1370a723SSascha Wildner 6948*1370a723SSascha Wildner **/ 6949*1370a723SSascha Wildner VOID 6950*1370a723SSascha Wildner EFIAPI 6951*1370a723SSascha Wildner AsmWriteMm2 ( 6952*1370a723SSascha Wildner IN UINT64 Value 6953*1370a723SSascha Wildner ); 6954*1370a723SSascha Wildner 6955*1370a723SSascha Wildner /** 6956*1370a723SSascha Wildner Writes the current value of 64-bit MMX Register #3 (MM3). 6957*1370a723SSascha Wildner 6958*1370a723SSascha Wildner Writes the current value of MM3. This function is only available on IA32 and 6959*1370a723SSascha Wildner x64. 6960*1370a723SSascha Wildner 6961*1370a723SSascha Wildner @param Value The 64-bit value to write to MM3. 6962*1370a723SSascha Wildner 6963*1370a723SSascha Wildner **/ 6964*1370a723SSascha Wildner VOID 6965*1370a723SSascha Wildner EFIAPI 6966*1370a723SSascha Wildner AsmWriteMm3 ( 6967*1370a723SSascha Wildner IN UINT64 Value 6968*1370a723SSascha Wildner ); 6969*1370a723SSascha Wildner 6970*1370a723SSascha Wildner /** 6971*1370a723SSascha Wildner Writes the current value of 64-bit MMX Register #4 (MM4). 6972*1370a723SSascha Wildner 6973*1370a723SSascha Wildner Writes the current value of MM4. This function is only available on IA32 and 6974*1370a723SSascha Wildner x64. 6975*1370a723SSascha Wildner 6976*1370a723SSascha Wildner @param Value The 64-bit value to write to MM4. 6977*1370a723SSascha Wildner 6978*1370a723SSascha Wildner **/ 6979*1370a723SSascha Wildner VOID 6980*1370a723SSascha Wildner EFIAPI 6981*1370a723SSascha Wildner AsmWriteMm4 ( 6982*1370a723SSascha Wildner IN UINT64 Value 6983*1370a723SSascha Wildner ); 6984*1370a723SSascha Wildner 6985*1370a723SSascha Wildner /** 6986*1370a723SSascha Wildner Writes the current value of 64-bit MMX Register #5 (MM5). 6987*1370a723SSascha Wildner 6988*1370a723SSascha Wildner Writes the current value of MM5. This function is only available on IA32 and 6989*1370a723SSascha Wildner x64. 6990*1370a723SSascha Wildner 6991*1370a723SSascha Wildner @param Value The 64-bit value to write to MM5. 6992*1370a723SSascha Wildner 6993*1370a723SSascha Wildner **/ 6994*1370a723SSascha Wildner VOID 6995*1370a723SSascha Wildner EFIAPI 6996*1370a723SSascha Wildner AsmWriteMm5 ( 6997*1370a723SSascha Wildner IN UINT64 Value 6998*1370a723SSascha Wildner ); 6999*1370a723SSascha Wildner 7000*1370a723SSascha Wildner /** 7001*1370a723SSascha Wildner Writes the current value of 64-bit MMX Register #6 (MM6). 7002*1370a723SSascha Wildner 7003*1370a723SSascha Wildner Writes the current value of MM6. This function is only available on IA32 and 7004*1370a723SSascha Wildner x64. 7005*1370a723SSascha Wildner 7006*1370a723SSascha Wildner @param Value The 64-bit value to write to MM6. 7007*1370a723SSascha Wildner 7008*1370a723SSascha Wildner **/ 7009*1370a723SSascha Wildner VOID 7010*1370a723SSascha Wildner EFIAPI 7011*1370a723SSascha Wildner AsmWriteMm6 ( 7012*1370a723SSascha Wildner IN UINT64 Value 7013*1370a723SSascha Wildner ); 7014*1370a723SSascha Wildner 7015*1370a723SSascha Wildner /** 7016*1370a723SSascha Wildner Writes the current value of 64-bit MMX Register #7 (MM7). 7017*1370a723SSascha Wildner 7018*1370a723SSascha Wildner Writes the current value of MM7. This function is only available on IA32 and 7019*1370a723SSascha Wildner x64. 7020*1370a723SSascha Wildner 7021*1370a723SSascha Wildner @param Value The 64-bit value to write to MM7. 7022*1370a723SSascha Wildner 7023*1370a723SSascha Wildner **/ 7024*1370a723SSascha Wildner VOID 7025*1370a723SSascha Wildner EFIAPI 7026*1370a723SSascha Wildner AsmWriteMm7 ( 7027*1370a723SSascha Wildner IN UINT64 Value 7028*1370a723SSascha Wildner ); 7029*1370a723SSascha Wildner 7030*1370a723SSascha Wildner /** 7031*1370a723SSascha Wildner Reads the current value of Time Stamp Counter (TSC). 7032*1370a723SSascha Wildner 7033*1370a723SSascha Wildner Reads and returns the current value of TSC. This function is only available 7034*1370a723SSascha Wildner on IA-32 and x64. 7035*1370a723SSascha Wildner 7036*1370a723SSascha Wildner @return The current value of TSC 7037*1370a723SSascha Wildner 7038*1370a723SSascha Wildner **/ 7039*1370a723SSascha Wildner UINT64 7040*1370a723SSascha Wildner EFIAPI 7041*1370a723SSascha Wildner AsmReadTsc ( 7042*1370a723SSascha Wildner VOID 7043*1370a723SSascha Wildner ); 7044*1370a723SSascha Wildner 7045*1370a723SSascha Wildner /** 7046*1370a723SSascha Wildner Reads the current value of a Performance Counter (PMC). 7047*1370a723SSascha Wildner 7048*1370a723SSascha Wildner Reads and returns the current value of performance counter specified by 7049*1370a723SSascha Wildner Index. This function is only available on IA-32 and x64. 7050*1370a723SSascha Wildner 7051*1370a723SSascha Wildner @param Index The 32-bit Performance Counter index to read. 7052*1370a723SSascha Wildner 7053*1370a723SSascha Wildner @return The value of the PMC specified by Index. 7054*1370a723SSascha Wildner 7055*1370a723SSascha Wildner **/ 7056*1370a723SSascha Wildner UINT64 7057*1370a723SSascha Wildner EFIAPI 7058*1370a723SSascha Wildner AsmReadPmc ( 7059*1370a723SSascha Wildner IN UINT32 Index 7060*1370a723SSascha Wildner ); 7061*1370a723SSascha Wildner 7062*1370a723SSascha Wildner /** 7063*1370a723SSascha Wildner Sets up a monitor buffer that is used by AsmMwait(). 7064*1370a723SSascha Wildner 7065*1370a723SSascha Wildner Executes a MONITOR instruction with the register state specified by Eax, Ecx 7066*1370a723SSascha Wildner and Edx. Returns Eax. This function is only available on IA-32 and x64. 7067*1370a723SSascha Wildner 7068*1370a723SSascha Wildner @param Eax The value to load into EAX or RAX before executing the MONITOR 7069*1370a723SSascha Wildner instruction. 7070*1370a723SSascha Wildner @param Ecx The value to load into ECX or RCX before executing the MONITOR 7071*1370a723SSascha Wildner instruction. 7072*1370a723SSascha Wildner @param Edx The value to load into EDX or RDX before executing the MONITOR 7073*1370a723SSascha Wildner instruction. 7074*1370a723SSascha Wildner 7075*1370a723SSascha Wildner @return Eax 7076*1370a723SSascha Wildner 7077*1370a723SSascha Wildner **/ 7078*1370a723SSascha Wildner UINTN 7079*1370a723SSascha Wildner EFIAPI 7080*1370a723SSascha Wildner AsmMonitor ( 7081*1370a723SSascha Wildner IN UINTN Eax, 7082*1370a723SSascha Wildner IN UINTN Ecx, 7083*1370a723SSascha Wildner IN UINTN Edx 7084*1370a723SSascha Wildner ); 7085*1370a723SSascha Wildner 7086*1370a723SSascha Wildner /** 7087*1370a723SSascha Wildner Executes an MWAIT instruction. 7088*1370a723SSascha Wildner 7089*1370a723SSascha Wildner Executes an MWAIT instruction with the register state specified by Eax and 7090*1370a723SSascha Wildner Ecx. Returns Eax. This function is only available on IA-32 and x64. 7091*1370a723SSascha Wildner 7092*1370a723SSascha Wildner @param Eax The value to load into EAX or RAX before executing the MONITOR 7093*1370a723SSascha Wildner instruction. 7094*1370a723SSascha Wildner @param Ecx The value to load into ECX or RCX before executing the MONITOR 7095*1370a723SSascha Wildner instruction. 7096*1370a723SSascha Wildner 7097*1370a723SSascha Wildner @return Eax 7098*1370a723SSascha Wildner 7099*1370a723SSascha Wildner **/ 7100*1370a723SSascha Wildner UINTN 7101*1370a723SSascha Wildner EFIAPI 7102*1370a723SSascha Wildner AsmMwait ( 7103*1370a723SSascha Wildner IN UINTN Eax, 7104*1370a723SSascha Wildner IN UINTN Ecx 7105*1370a723SSascha Wildner ); 7106*1370a723SSascha Wildner 7107*1370a723SSascha Wildner /** 7108*1370a723SSascha Wildner Executes a WBINVD instruction. 7109*1370a723SSascha Wildner 7110*1370a723SSascha Wildner Executes a WBINVD instruction. This function is only available on IA-32 and 7111*1370a723SSascha Wildner x64. 7112*1370a723SSascha Wildner 7113*1370a723SSascha Wildner **/ 7114*1370a723SSascha Wildner VOID 7115*1370a723SSascha Wildner EFIAPI 7116*1370a723SSascha Wildner AsmWbinvd ( 7117*1370a723SSascha Wildner VOID 7118*1370a723SSascha Wildner ); 7119*1370a723SSascha Wildner 7120*1370a723SSascha Wildner /** 7121*1370a723SSascha Wildner Executes a INVD instruction. 7122*1370a723SSascha Wildner 7123*1370a723SSascha Wildner Executes a INVD instruction. This function is only available on IA-32 and 7124*1370a723SSascha Wildner x64. 7125*1370a723SSascha Wildner 7126*1370a723SSascha Wildner **/ 7127*1370a723SSascha Wildner VOID 7128*1370a723SSascha Wildner EFIAPI 7129*1370a723SSascha Wildner AsmInvd ( 7130*1370a723SSascha Wildner VOID 7131*1370a723SSascha Wildner ); 7132*1370a723SSascha Wildner 7133*1370a723SSascha Wildner /** 7134*1370a723SSascha Wildner Flushes a cache line from all the instruction and data caches within the 7135*1370a723SSascha Wildner coherency domain of the CPU. 7136*1370a723SSascha Wildner 7137*1370a723SSascha Wildner Flushed the cache line specified by LinearAddress, and returns LinearAddress. 7138*1370a723SSascha Wildner This function is only available on IA-32 and x64. 7139*1370a723SSascha Wildner 7140*1370a723SSascha Wildner @param LinearAddress The address of the cache line to flush. If the CPU is 7141*1370a723SSascha Wildner in a physical addressing mode, then LinearAddress is a 7142*1370a723SSascha Wildner physical address. If the CPU is in a virtual 7143*1370a723SSascha Wildner addressing mode, then LinearAddress is a virtual 7144*1370a723SSascha Wildner address. 7145*1370a723SSascha Wildner 7146*1370a723SSascha Wildner @return LinearAddress. 7147*1370a723SSascha Wildner **/ 7148*1370a723SSascha Wildner VOID * 7149*1370a723SSascha Wildner EFIAPI 7150*1370a723SSascha Wildner AsmFlushCacheLine ( 7151*1370a723SSascha Wildner IN VOID *LinearAddress 7152*1370a723SSascha Wildner ); 7153*1370a723SSascha Wildner 7154*1370a723SSascha Wildner /** 7155*1370a723SSascha Wildner Enables the 32-bit paging mode on the CPU. 7156*1370a723SSascha Wildner 7157*1370a723SSascha Wildner Enables the 32-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables 7158*1370a723SSascha Wildner must be properly initialized prior to calling this service. This function 7159*1370a723SSascha Wildner assumes the current execution mode is 32-bit protected mode. This function is 7160*1370a723SSascha Wildner only available on IA-32. After the 32-bit paging mode is enabled, control is 7161*1370a723SSascha Wildner transferred to the function specified by EntryPoint using the new stack 7162*1370a723SSascha Wildner specified by NewStack and passing in the parameters specified by Context1 and 7163*1370a723SSascha Wildner Context2. Context1 and Context2 are optional and may be NULL. The function 7164*1370a723SSascha Wildner EntryPoint must never return. 7165*1370a723SSascha Wildner 7166*1370a723SSascha Wildner If the current execution mode is not 32-bit protected mode, then ASSERT(). 7167*1370a723SSascha Wildner If EntryPoint is NULL, then ASSERT(). 7168*1370a723SSascha Wildner If NewStack is NULL, then ASSERT(). 7169*1370a723SSascha Wildner 7170*1370a723SSascha Wildner There are a number of constraints that must be followed before calling this 7171*1370a723SSascha Wildner function: 7172*1370a723SSascha Wildner 1) Interrupts must be disabled. 7173*1370a723SSascha Wildner 2) The caller must be in 32-bit protected mode with flat descriptors. This 7174*1370a723SSascha Wildner means all descriptors must have a base of 0 and a limit of 4GB. 7175*1370a723SSascha Wildner 3) CR0 and CR4 must be compatible with 32-bit protected mode with flat 7176*1370a723SSascha Wildner descriptors. 7177*1370a723SSascha Wildner 4) CR3 must point to valid page tables that will be used once the transition 7178*1370a723SSascha Wildner is complete, and those page tables must guarantee that the pages for this 7179*1370a723SSascha Wildner function and the stack are identity mapped. 7180*1370a723SSascha Wildner 7181*1370a723SSascha Wildner @param EntryPoint A pointer to function to call with the new stack after 7182*1370a723SSascha Wildner paging is enabled. 7183*1370a723SSascha Wildner @param Context1 A pointer to the context to pass into the EntryPoint 7184*1370a723SSascha Wildner function as the first parameter after paging is enabled. 7185*1370a723SSascha Wildner @param Context2 A pointer to the context to pass into the EntryPoint 7186*1370a723SSascha Wildner function as the second parameter after paging is enabled. 7187*1370a723SSascha Wildner @param NewStack A pointer to the new stack to use for the EntryPoint 7188*1370a723SSascha Wildner function after paging is enabled. 7189*1370a723SSascha Wildner 7190*1370a723SSascha Wildner **/ 7191*1370a723SSascha Wildner VOID 7192*1370a723SSascha Wildner EFIAPI 7193*1370a723SSascha Wildner AsmEnablePaging32 ( 7194*1370a723SSascha Wildner IN SWITCH_STACK_ENTRY_POINT EntryPoint, 7195*1370a723SSascha Wildner IN VOID *Context1 OPTIONAL, 7196*1370a723SSascha Wildner IN VOID *Context2 OPTIONAL, 7197*1370a723SSascha Wildner IN VOID *NewStack 7198*1370a723SSascha Wildner ); 7199*1370a723SSascha Wildner 7200*1370a723SSascha Wildner /** 7201*1370a723SSascha Wildner Disables the 32-bit paging mode on the CPU. 7202*1370a723SSascha Wildner 7203*1370a723SSascha Wildner Disables the 32-bit paging mode on the CPU and returns to 32-bit protected 7204*1370a723SSascha Wildner mode. This function assumes the current execution mode is 32-paged protected 7205*1370a723SSascha Wildner mode. This function is only available on IA-32. After the 32-bit paging mode 7206*1370a723SSascha Wildner is disabled, control is transferred to the function specified by EntryPoint 7207*1370a723SSascha Wildner using the new stack specified by NewStack and passing in the parameters 7208*1370a723SSascha Wildner specified by Context1 and Context2. Context1 and Context2 are optional and 7209*1370a723SSascha Wildner may be NULL. The function EntryPoint must never return. 7210*1370a723SSascha Wildner 7211*1370a723SSascha Wildner If the current execution mode is not 32-bit paged mode, then ASSERT(). 7212*1370a723SSascha Wildner If EntryPoint is NULL, then ASSERT(). 7213*1370a723SSascha Wildner If NewStack is NULL, then ASSERT(). 7214*1370a723SSascha Wildner 7215*1370a723SSascha Wildner There are a number of constraints that must be followed before calling this 7216*1370a723SSascha Wildner function: 7217*1370a723SSascha Wildner 1) Interrupts must be disabled. 7218*1370a723SSascha Wildner 2) The caller must be in 32-bit paged mode. 7219*1370a723SSascha Wildner 3) CR0, CR3, and CR4 must be compatible with 32-bit paged mode. 7220*1370a723SSascha Wildner 4) CR3 must point to valid page tables that guarantee that the pages for 7221*1370a723SSascha Wildner this function and the stack are identity mapped. 7222*1370a723SSascha Wildner 7223*1370a723SSascha Wildner @param EntryPoint A pointer to function to call with the new stack after 7224*1370a723SSascha Wildner paging is disabled. 7225*1370a723SSascha Wildner @param Context1 A pointer to the context to pass into the EntryPoint 7226*1370a723SSascha Wildner function as the first parameter after paging is disabled. 7227*1370a723SSascha Wildner @param Context2 A pointer to the context to pass into the EntryPoint 7228*1370a723SSascha Wildner function as the second parameter after paging is 7229*1370a723SSascha Wildner disabled. 7230*1370a723SSascha Wildner @param NewStack A pointer to the new stack to use for the EntryPoint 7231*1370a723SSascha Wildner function after paging is disabled. 7232*1370a723SSascha Wildner 7233*1370a723SSascha Wildner **/ 7234*1370a723SSascha Wildner VOID 7235*1370a723SSascha Wildner EFIAPI 7236*1370a723SSascha Wildner AsmDisablePaging32 ( 7237*1370a723SSascha Wildner IN SWITCH_STACK_ENTRY_POINT EntryPoint, 7238*1370a723SSascha Wildner IN VOID *Context1 OPTIONAL, 7239*1370a723SSascha Wildner IN VOID *Context2 OPTIONAL, 7240*1370a723SSascha Wildner IN VOID *NewStack 7241*1370a723SSascha Wildner ); 7242*1370a723SSascha Wildner 7243*1370a723SSascha Wildner /** 7244*1370a723SSascha Wildner Enables the 64-bit paging mode on the CPU. 7245*1370a723SSascha Wildner 7246*1370a723SSascha Wildner Enables the 64-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables 7247*1370a723SSascha Wildner must be properly initialized prior to calling this service. This function 7248*1370a723SSascha Wildner assumes the current execution mode is 32-bit protected mode with flat 7249*1370a723SSascha Wildner descriptors. This function is only available on IA-32. After the 64-bit 7250*1370a723SSascha Wildner paging mode is enabled, control is transferred to the function specified by 7251*1370a723SSascha Wildner EntryPoint using the new stack specified by NewStack and passing in the 7252*1370a723SSascha Wildner parameters specified by Context1 and Context2. Context1 and Context2 are 7253*1370a723SSascha Wildner optional and may be 0. The function EntryPoint must never return. 7254*1370a723SSascha Wildner 7255*1370a723SSascha Wildner If the current execution mode is not 32-bit protected mode with flat 7256*1370a723SSascha Wildner descriptors, then ASSERT(). 7257*1370a723SSascha Wildner If EntryPoint is 0, then ASSERT(). 7258*1370a723SSascha Wildner If NewStack is 0, then ASSERT(). 7259*1370a723SSascha Wildner 7260*1370a723SSascha Wildner @param Cs The 16-bit selector to load in the CS before EntryPoint 7261*1370a723SSascha Wildner is called. The descriptor in the GDT that this selector 7262*1370a723SSascha Wildner references must be setup for long mode. 7263*1370a723SSascha Wildner @param EntryPoint The 64-bit virtual address of the function to call with 7264*1370a723SSascha Wildner the new stack after paging is enabled. 7265*1370a723SSascha Wildner @param Context1 The 64-bit virtual address of the context to pass into 7266*1370a723SSascha Wildner the EntryPoint function as the first parameter after 7267*1370a723SSascha Wildner paging is enabled. 7268*1370a723SSascha Wildner @param Context2 The 64-bit virtual address of the context to pass into 7269*1370a723SSascha Wildner the EntryPoint function as the second parameter after 7270*1370a723SSascha Wildner paging is enabled. 7271*1370a723SSascha Wildner @param NewStack The 64-bit virtual address of the new stack to use for 7272*1370a723SSascha Wildner the EntryPoint function after paging is enabled. 7273*1370a723SSascha Wildner 7274*1370a723SSascha Wildner **/ 7275*1370a723SSascha Wildner VOID 7276*1370a723SSascha Wildner EFIAPI 7277*1370a723SSascha Wildner AsmEnablePaging64 ( 7278*1370a723SSascha Wildner IN UINT16 Cs, 7279*1370a723SSascha Wildner IN UINT64 EntryPoint, 7280*1370a723SSascha Wildner IN UINT64 Context1 OPTIONAL, 7281*1370a723SSascha Wildner IN UINT64 Context2 OPTIONAL, 7282*1370a723SSascha Wildner IN UINT64 NewStack 7283*1370a723SSascha Wildner ); 7284*1370a723SSascha Wildner 7285*1370a723SSascha Wildner /** 7286*1370a723SSascha Wildner Disables the 64-bit paging mode on the CPU. 7287*1370a723SSascha Wildner 7288*1370a723SSascha Wildner Disables the 64-bit paging mode on the CPU and returns to 32-bit protected 7289*1370a723SSascha Wildner mode. This function assumes the current execution mode is 64-paging mode. 7290*1370a723SSascha Wildner This function is only available on x64. After the 64-bit paging mode is 7291*1370a723SSascha Wildner disabled, control is transferred to the function specified by EntryPoint 7292*1370a723SSascha Wildner using the new stack specified by NewStack and passing in the parameters 7293*1370a723SSascha Wildner specified by Context1 and Context2. Context1 and Context2 are optional and 7294*1370a723SSascha Wildner may be 0. The function EntryPoint must never return. 7295*1370a723SSascha Wildner 7296*1370a723SSascha Wildner If the current execution mode is not 64-bit paged mode, then ASSERT(). 7297*1370a723SSascha Wildner If EntryPoint is 0, then ASSERT(). 7298*1370a723SSascha Wildner If NewStack is 0, then ASSERT(). 7299*1370a723SSascha Wildner 7300*1370a723SSascha Wildner @param Cs The 16-bit selector to load in the CS before EntryPoint 7301*1370a723SSascha Wildner is called. The descriptor in the GDT that this selector 7302*1370a723SSascha Wildner references must be setup for 32-bit protected mode. 7303*1370a723SSascha Wildner @param EntryPoint The 64-bit virtual address of the function to call with 7304*1370a723SSascha Wildner the new stack after paging is disabled. 7305*1370a723SSascha Wildner @param Context1 The 64-bit virtual address of the context to pass into 7306*1370a723SSascha Wildner the EntryPoint function as the first parameter after 7307*1370a723SSascha Wildner paging is disabled. 7308*1370a723SSascha Wildner @param Context2 The 64-bit virtual address of the context to pass into 7309*1370a723SSascha Wildner the EntryPoint function as the second parameter after 7310*1370a723SSascha Wildner paging is disabled. 7311*1370a723SSascha Wildner @param NewStack The 64-bit virtual address of the new stack to use for 7312*1370a723SSascha Wildner the EntryPoint function after paging is disabled. 7313*1370a723SSascha Wildner 7314*1370a723SSascha Wildner **/ 7315*1370a723SSascha Wildner VOID 7316*1370a723SSascha Wildner EFIAPI 7317*1370a723SSascha Wildner AsmDisablePaging64 ( 7318*1370a723SSascha Wildner IN UINT16 Cs, 7319*1370a723SSascha Wildner IN UINT32 EntryPoint, 7320*1370a723SSascha Wildner IN UINT32 Context1 OPTIONAL, 7321*1370a723SSascha Wildner IN UINT32 Context2 OPTIONAL, 7322*1370a723SSascha Wildner IN UINT32 NewStack 7323*1370a723SSascha Wildner ); 7324*1370a723SSascha Wildner 7325*1370a723SSascha Wildner // 7326*1370a723SSascha Wildner // 16-bit thunking services 7327*1370a723SSascha Wildner // 7328*1370a723SSascha Wildner 7329*1370a723SSascha Wildner /** 7330*1370a723SSascha Wildner Retrieves the properties for 16-bit thunk functions. 7331*1370a723SSascha Wildner 7332*1370a723SSascha Wildner Computes the size of the buffer and stack below 1MB required to use the 7333*1370a723SSascha Wildner AsmPrepareThunk16(), AsmThunk16() and AsmPrepareAndThunk16() functions. This 7334*1370a723SSascha Wildner buffer size is returned in RealModeBufferSize, and the stack size is returned 7335*1370a723SSascha Wildner in ExtraStackSize. If parameters are passed to the 16-bit real mode code, 7336*1370a723SSascha Wildner then the actual minimum stack size is ExtraStackSize plus the maximum number 7337*1370a723SSascha Wildner of bytes that need to be passed to the 16-bit real mode code. 7338*1370a723SSascha Wildner 7339*1370a723SSascha Wildner If RealModeBufferSize is NULL, then ASSERT(). 7340*1370a723SSascha Wildner If ExtraStackSize is NULL, then ASSERT(). 7341*1370a723SSascha Wildner 7342*1370a723SSascha Wildner @param RealModeBufferSize A pointer to the size of the buffer below 1MB 7343*1370a723SSascha Wildner required to use the 16-bit thunk functions. 7344*1370a723SSascha Wildner @param ExtraStackSize A pointer to the extra size of stack below 1MB 7345*1370a723SSascha Wildner that the 16-bit thunk functions require for 7346*1370a723SSascha Wildner temporary storage in the transition to and from 7347*1370a723SSascha Wildner 16-bit real mode. 7348*1370a723SSascha Wildner 7349*1370a723SSascha Wildner **/ 7350*1370a723SSascha Wildner VOID 7351*1370a723SSascha Wildner EFIAPI 7352*1370a723SSascha Wildner AsmGetThunk16Properties ( 7353*1370a723SSascha Wildner OUT UINT32 *RealModeBufferSize, 7354*1370a723SSascha Wildner OUT UINT32 *ExtraStackSize 7355*1370a723SSascha Wildner ); 7356*1370a723SSascha Wildner 7357*1370a723SSascha Wildner /** 7358*1370a723SSascha Wildner Prepares all structures a code required to use AsmThunk16(). 7359*1370a723SSascha Wildner 7360*1370a723SSascha Wildner Prepares all structures and code required to use AsmThunk16(). 7361*1370a723SSascha Wildner 7362*1370a723SSascha Wildner This interface is limited to be used in either physical mode or virtual modes with paging enabled where the 7363*1370a723SSascha Wildner virtual to physical mappings for ThunkContext.RealModeBuffer is mapped 1:1. 7364*1370a723SSascha Wildner 7365*1370a723SSascha Wildner If ThunkContext is NULL, then ASSERT(). 7366*1370a723SSascha Wildner 7367*1370a723SSascha Wildner @param ThunkContext A pointer to the context structure that describes the 7368*1370a723SSascha Wildner 16-bit real mode code to call. 7369*1370a723SSascha Wildner 7370*1370a723SSascha Wildner **/ 7371*1370a723SSascha Wildner VOID 7372*1370a723SSascha Wildner EFIAPI 7373*1370a723SSascha Wildner AsmPrepareThunk16 ( 7374*1370a723SSascha Wildner IN OUT THUNK_CONTEXT *ThunkContext 7375*1370a723SSascha Wildner ); 7376*1370a723SSascha Wildner 7377*1370a723SSascha Wildner /** 7378*1370a723SSascha Wildner Transfers control to a 16-bit real mode entry point and returns the results. 7379*1370a723SSascha Wildner 7380*1370a723SSascha Wildner Transfers control to a 16-bit real mode entry point and returns the results. 7381*1370a723SSascha Wildner AsmPrepareThunk16() must be called with ThunkContext before this function is used. 7382*1370a723SSascha Wildner This function must be called with interrupts disabled. 7383*1370a723SSascha Wildner 7384*1370a723SSascha Wildner The register state from the RealModeState field of ThunkContext is restored just prior 7385*1370a723SSascha Wildner to calling the 16-bit real mode entry point. This includes the EFLAGS field of RealModeState, 7386*1370a723SSascha Wildner which is used to set the interrupt state when a 16-bit real mode entry point is called. 7387*1370a723SSascha Wildner Control is transferred to the 16-bit real mode entry point specified by the CS and Eip fields of RealModeState. 7388*1370a723SSascha Wildner The stack is initialized to the SS and ESP fields of RealModeState. Any parameters passed to 7389*1370a723SSascha Wildner the 16-bit real mode code must be populated by the caller at SS:ESP prior to calling this function. 7390*1370a723SSascha Wildner The 16-bit real mode entry point is invoked with a 16-bit CALL FAR instruction, 7391*1370a723SSascha Wildner so when accessing stack contents, the 16-bit real mode code must account for the 16-bit segment 7392*1370a723SSascha Wildner and 16-bit offset of the return address that were pushed onto the stack. The 16-bit real mode entry 7393*1370a723SSascha Wildner point must exit with a RETF instruction. The register state is captured into RealModeState immediately 7394*1370a723SSascha Wildner after the RETF instruction is executed. 7395*1370a723SSascha Wildner 7396*1370a723SSascha Wildner If EFLAGS specifies interrupts enabled, or any of the 16-bit real mode code enables interrupts, 7397*1370a723SSascha Wildner or any of the 16-bit real mode code makes a SW interrupt, then the caller is responsible for making sure 7398*1370a723SSascha Wildner the IDT at address 0 is initialized to handle any HW or SW interrupts that may occur while in 16-bit real mode. 7399*1370a723SSascha Wildner 7400*1370a723SSascha Wildner If EFLAGS specifies interrupts enabled, or any of the 16-bit real mode code enables interrupts, 7401*1370a723SSascha Wildner then the caller is responsible for making sure the 8259 PIC is in a state compatible with 16-bit real mode. 7402*1370a723SSascha Wildner This includes the base vectors, the interrupt masks, and the edge/level trigger mode. 7403*1370a723SSascha Wildner 7404*1370a723SSascha Wildner If THUNK_ATTRIBUTE_BIG_REAL_MODE is set in the ThunkAttributes field of ThunkContext, then the user code 7405*1370a723SSascha Wildner is invoked in big real mode. Otherwise, the user code is invoked in 16-bit real mode with 64KB segment limits. 7406*1370a723SSascha Wildner 7407*1370a723SSascha Wildner If neither THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15 nor THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL are set in 7408*1370a723SSascha Wildner ThunkAttributes, then it is assumed that the user code did not enable the A20 mask, and no attempt is made to 7409*1370a723SSascha Wildner disable the A20 mask. 7410*1370a723SSascha Wildner 7411*1370a723SSascha Wildner If THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15 is set and THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL is clear in 7412*1370a723SSascha Wildner ThunkAttributes, then attempt to use the INT 15 service to disable the A20 mask. If this INT 15 call fails, 7413*1370a723SSascha Wildner then attempt to disable the A20 mask by directly accessing the 8042 keyboard controller I/O ports. 7414*1370a723SSascha Wildner 7415*1370a723SSascha Wildner If THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15 is clear and THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL is set in 7416*1370a723SSascha Wildner ThunkAttributes, then attempt to disable the A20 mask by directly accessing the 8042 keyboard controller I/O ports. 7417*1370a723SSascha Wildner 7418*1370a723SSascha Wildner If ThunkContext is NULL, then ASSERT(). 7419*1370a723SSascha Wildner If AsmPrepareThunk16() was not previously called with ThunkContext, then ASSERT(). 7420*1370a723SSascha Wildner If both THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15 and THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL are set in 7421*1370a723SSascha Wildner ThunkAttributes, then ASSERT(). 7422*1370a723SSascha Wildner 7423*1370a723SSascha Wildner This interface is limited to be used in either physical mode or virtual modes with paging enabled where the 7424*1370a723SSascha Wildner virtual to physical mappings for ThunkContext.RealModeBuffer are mapped 1:1. 7425*1370a723SSascha Wildner 7426*1370a723SSascha Wildner @param ThunkContext A pointer to the context structure that describes the 7427*1370a723SSascha Wildner 16-bit real mode code to call. 7428*1370a723SSascha Wildner 7429*1370a723SSascha Wildner **/ 7430*1370a723SSascha Wildner VOID 7431*1370a723SSascha Wildner EFIAPI 7432*1370a723SSascha Wildner AsmThunk16 ( 7433*1370a723SSascha Wildner IN OUT THUNK_CONTEXT *ThunkContext 7434*1370a723SSascha Wildner ); 7435*1370a723SSascha Wildner 7436*1370a723SSascha Wildner /** 7437*1370a723SSascha Wildner Prepares all structures and code for a 16-bit real mode thunk, transfers 7438*1370a723SSascha Wildner control to a 16-bit real mode entry point, and returns the results. 7439*1370a723SSascha Wildner 7440*1370a723SSascha Wildner Prepares all structures and code for a 16-bit real mode thunk, transfers 7441*1370a723SSascha Wildner control to a 16-bit real mode entry point, and returns the results. If the 7442*1370a723SSascha Wildner caller only need to perform a single 16-bit real mode thunk, then this 7443*1370a723SSascha Wildner service should be used. If the caller intends to make more than one 16-bit 7444*1370a723SSascha Wildner real mode thunk, then it is more efficient if AsmPrepareThunk16() is called 7445*1370a723SSascha Wildner once and AsmThunk16() can be called for each 16-bit real mode thunk. 7446*1370a723SSascha Wildner 7447*1370a723SSascha Wildner This interface is limited to be used in either physical mode or virtual modes with paging enabled where the 7448*1370a723SSascha Wildner virtual to physical mappings for ThunkContext.RealModeBuffer is mapped 1:1. 7449*1370a723SSascha Wildner 7450*1370a723SSascha Wildner See AsmPrepareThunk16() and AsmThunk16() for the detailed description and ASSERT() conditions. 7451*1370a723SSascha Wildner 7452*1370a723SSascha Wildner @param ThunkContext A pointer to the context structure that describes the 7453*1370a723SSascha Wildner 16-bit real mode code to call. 7454*1370a723SSascha Wildner 7455*1370a723SSascha Wildner **/ 7456*1370a723SSascha Wildner VOID 7457*1370a723SSascha Wildner EFIAPI 7458*1370a723SSascha Wildner AsmPrepareAndThunk16 ( 7459*1370a723SSascha Wildner IN OUT THUNK_CONTEXT *ThunkContext 7460*1370a723SSascha Wildner ); 7461*1370a723SSascha Wildner 7462*1370a723SSascha Wildner /** 7463*1370a723SSascha Wildner Generates a 16-bit random number through RDRAND instruction. 7464*1370a723SSascha Wildner 7465*1370a723SSascha Wildner if Rand is NULL, then ASSERT(). 7466*1370a723SSascha Wildner 7467*1370a723SSascha Wildner @param[out] Rand Buffer pointer to store the random result. 7468*1370a723SSascha Wildner 7469*1370a723SSascha Wildner @retval TRUE RDRAND call was successful. 7470*1370a723SSascha Wildner @retval FALSE Failed attempts to call RDRAND. 7471*1370a723SSascha Wildner 7472*1370a723SSascha Wildner **/ 7473*1370a723SSascha Wildner BOOLEAN 7474*1370a723SSascha Wildner EFIAPI 7475*1370a723SSascha Wildner AsmRdRand16 ( 7476*1370a723SSascha Wildner OUT UINT16 *Rand 7477*1370a723SSascha Wildner ); 7478*1370a723SSascha Wildner 7479*1370a723SSascha Wildner /** 7480*1370a723SSascha Wildner Generates a 32-bit random number through RDRAND instruction. 7481*1370a723SSascha Wildner 7482*1370a723SSascha Wildner if Rand is NULL, then ASSERT(). 7483*1370a723SSascha Wildner 7484*1370a723SSascha Wildner @param[out] Rand Buffer pointer to store the random result. 7485*1370a723SSascha Wildner 7486*1370a723SSascha Wildner @retval TRUE RDRAND call was successful. 7487*1370a723SSascha Wildner @retval FALSE Failed attempts to call RDRAND. 7488*1370a723SSascha Wildner 7489*1370a723SSascha Wildner **/ 7490*1370a723SSascha Wildner BOOLEAN 7491*1370a723SSascha Wildner EFIAPI 7492*1370a723SSascha Wildner AsmRdRand32 ( 7493*1370a723SSascha Wildner OUT UINT32 *Rand 7494*1370a723SSascha Wildner ); 7495*1370a723SSascha Wildner 7496*1370a723SSascha Wildner /** 7497*1370a723SSascha Wildner Generates a 64-bit random number through RDRAND instruction. 7498*1370a723SSascha Wildner 7499*1370a723SSascha Wildner if Rand is NULL, then ASSERT(). 7500*1370a723SSascha Wildner 7501*1370a723SSascha Wildner @param[out] Rand Buffer pointer to store the random result. 7502*1370a723SSascha Wildner 7503*1370a723SSascha Wildner @retval TRUE RDRAND call was successful. 7504*1370a723SSascha Wildner @retval FALSE Failed attempts to call RDRAND. 7505*1370a723SSascha Wildner 7506*1370a723SSascha Wildner **/ 7507*1370a723SSascha Wildner BOOLEAN 7508*1370a723SSascha Wildner EFIAPI 7509*1370a723SSascha Wildner AsmRdRand64 ( 7510*1370a723SSascha Wildner OUT UINT64 *Rand 7511*1370a723SSascha Wildner ); 7512*1370a723SSascha Wildner 7513*1370a723SSascha Wildner /** 7514*1370a723SSascha Wildner Load given selector into TR register. 7515*1370a723SSascha Wildner 7516*1370a723SSascha Wildner @param[in] Selector Task segment selector 7517*1370a723SSascha Wildner **/ 7518*1370a723SSascha Wildner VOID 7519*1370a723SSascha Wildner EFIAPI 7520*1370a723SSascha Wildner AsmWriteTr ( 7521*1370a723SSascha Wildner IN UINT16 Selector 7522*1370a723SSascha Wildner ); 7523*1370a723SSascha Wildner 7524*1370a723SSascha Wildner /** 7525*1370a723SSascha Wildner Performs a serializing operation on all load-from-memory instructions that 7526*1370a723SSascha Wildner were issued prior the AsmLfence function. 7527*1370a723SSascha Wildner 7528*1370a723SSascha Wildner Executes a LFENCE instruction. This function is only available on IA-32 and x64. 7529*1370a723SSascha Wildner 7530*1370a723SSascha Wildner **/ 7531*1370a723SSascha Wildner VOID 7532*1370a723SSascha Wildner EFIAPI 7533*1370a723SSascha Wildner AsmLfence ( 7534*1370a723SSascha Wildner VOID 7535*1370a723SSascha Wildner ); 7536*1370a723SSascha Wildner 7537*1370a723SSascha Wildner /** 7538*1370a723SSascha Wildner Executes a XGETBV instruction 7539*1370a723SSascha Wildner 7540*1370a723SSascha Wildner Executes a XGETBV instruction. This function is only available on IA-32 and 7541*1370a723SSascha Wildner x64. 7542*1370a723SSascha Wildner 7543*1370a723SSascha Wildner @param[in] Index Extended control register index 7544*1370a723SSascha Wildner 7545*1370a723SSascha Wildner @return The current value of the extended control register 7546*1370a723SSascha Wildner **/ 7547*1370a723SSascha Wildner UINT64 7548*1370a723SSascha Wildner EFIAPI 7549*1370a723SSascha Wildner AsmXGetBv ( 7550*1370a723SSascha Wildner IN UINT32 Index 7551*1370a723SSascha Wildner ); 7552*1370a723SSascha Wildner 7553*1370a723SSascha Wildner /** 7554*1370a723SSascha Wildner Executes a XSETBV instruction to write a 64-bit value to a Extended Control 7555*1370a723SSascha Wildner Register(XCR), and returns the value. 7556*1370a723SSascha Wildner 7557*1370a723SSascha Wildner Writes the 64-bit value specified by Value to the XCR specified by Index. The 7558*1370a723SSascha Wildner 64-bit value written to the XCR is returned. No parameter checking is 7559*1370a723SSascha Wildner performed on Index or Value, and some of these may cause CPU exceptions. The 7560*1370a723SSascha Wildner caller must either guarantee that Index and Value are valid, or the caller 7561*1370a723SSascha Wildner must establish proper exception handlers. This function is only available on 7562*1370a723SSascha Wildner IA-32 and x64. 7563*1370a723SSascha Wildner 7564*1370a723SSascha Wildner @param Index The 32-bit XCR index to write. 7565*1370a723SSascha Wildner @param Value The 64-bit value to write to the XCR. 7566*1370a723SSascha Wildner 7567*1370a723SSascha Wildner @return Value 7568*1370a723SSascha Wildner 7569*1370a723SSascha Wildner **/ 7570*1370a723SSascha Wildner UINT64 7571*1370a723SSascha Wildner EFIAPI 7572*1370a723SSascha Wildner AsmXSetBv ( 7573*1370a723SSascha Wildner IN UINT32 Index, 7574*1370a723SSascha Wildner IN UINT64 Value 7575*1370a723SSascha Wildner ); 7576*1370a723SSascha Wildner 7577*1370a723SSascha Wildner /** 7578*1370a723SSascha Wildner Executes a VMGEXIT instruction (VMMCALL with a REP prefix) 7579*1370a723SSascha Wildner 7580*1370a723SSascha Wildner Executes a VMGEXIT instruction. This function is only available on IA-32 and 7581*1370a723SSascha Wildner x64. 7582*1370a723SSascha Wildner 7583*1370a723SSascha Wildner **/ 7584*1370a723SSascha Wildner VOID 7585*1370a723SSascha Wildner EFIAPI 7586*1370a723SSascha Wildner AsmVmgExit ( 7587*1370a723SSascha Wildner VOID 7588*1370a723SSascha Wildner ); 7589*1370a723SSascha Wildner 7590*1370a723SSascha Wildner /** 7591*1370a723SSascha Wildner Patch the immediate operand of an IA32 or X64 instruction such that the byte, 7592*1370a723SSascha Wildner word, dword or qword operand is encoded at the end of the instruction's 7593*1370a723SSascha Wildner binary representation. 7594*1370a723SSascha Wildner 7595*1370a723SSascha Wildner This function should be used to update object code that was compiled with 7596*1370a723SSascha Wildner NASM from assembly source code. Example: 7597*1370a723SSascha Wildner 7598*1370a723SSascha Wildner NASM source code: 7599*1370a723SSascha Wildner 7600*1370a723SSascha Wildner mov eax, strict dword 0 ; the imm32 zero operand will be patched 7601*1370a723SSascha Wildner ASM_PFX(gPatchCr3): 7602*1370a723SSascha Wildner mov cr3, eax 7603*1370a723SSascha Wildner 7604*1370a723SSascha Wildner C source code: 7605*1370a723SSascha Wildner 7606*1370a723SSascha Wildner X86_ASSEMBLY_PATCH_LABEL gPatchCr3; 7607*1370a723SSascha Wildner PatchInstructionX86 (gPatchCr3, AsmReadCr3 (), 4); 7608*1370a723SSascha Wildner 7609*1370a723SSascha Wildner @param[out] InstructionEnd Pointer right past the instruction to patch. The 7610*1370a723SSascha Wildner immediate operand to patch is expected to 7611*1370a723SSascha Wildner comprise the trailing bytes of the instruction. 7612*1370a723SSascha Wildner If InstructionEnd is closer to address 0 than 7613*1370a723SSascha Wildner ValueSize permits, then ASSERT(). 7614*1370a723SSascha Wildner 7615*1370a723SSascha Wildner @param[in] PatchValue The constant to write to the immediate operand. 7616*1370a723SSascha Wildner The caller is responsible for ensuring that 7617*1370a723SSascha Wildner PatchValue can be represented in the byte, word, 7618*1370a723SSascha Wildner dword or qword operand (as indicated through 7619*1370a723SSascha Wildner ValueSize); otherwise ASSERT(). 7620*1370a723SSascha Wildner 7621*1370a723SSascha Wildner @param[in] ValueSize The size of the operand in bytes; must be 1, 2, 7622*1370a723SSascha Wildner 4, or 8. ASSERT() otherwise. 7623*1370a723SSascha Wildner **/ 7624*1370a723SSascha Wildner VOID 7625*1370a723SSascha Wildner EFIAPI 7626*1370a723SSascha Wildner PatchInstructionX86 ( 7627*1370a723SSascha Wildner OUT X86_ASSEMBLY_PATCH_LABEL *InstructionEnd, 7628*1370a723SSascha Wildner IN UINT64 PatchValue, 7629*1370a723SSascha Wildner IN UINTN ValueSize 7630*1370a723SSascha Wildner ); 7631*1370a723SSascha Wildner 7632*1370a723SSascha Wildner #endif // defined (MDE_CPU_IA32) || defined (MDE_CPU_X64) 7633*1370a723SSascha Wildner #endif // !defined (__BASE_LIB__) 7634