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