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