]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Include/Library/BaseLib.h
MdePkg/BaseLib: Add bit field population calculating methods
[mirror_edk2.git] / MdePkg / Include / Library / BaseLib.h
index cf337b71900beeea5d2b4ab27126c9a5d04e4196..123ae19dc263dc98e73174e877b37473b7d28a2a 100644 (file)
-/** @file
-  Memory-only library functions with no library constructor/destructor
-
-  Copyright (c) 2006 - 2007, Intel Corporation
-  All rights reserved. This program and the accompanying materials
-  are licensed and made available under the terms and conditions of the BSD License
-  which accompanies this distribution.  The full text of the license may be found at
-  http://opensource.org/licenses/bsd-license.php
-
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef __BASE_LIB__
-#define __BASE_LIB__
-
-//
-// Definitions for architecture specific types
-// These include SPIN_LOCK and BASE_LIBRARY_JUMP_BUFFER
-//
-
-//
-// SPIN_LOCK
-//
-typedef volatile UINTN              SPIN_LOCK;
-
-#if   defined (MDE_CPU_IA32)
-//
-// IA32 context buffer used by SetJump() and LongJump()
-//
-typedef struct {
-  UINT32                            Ebx;
-  UINT32                            Esi;
-  UINT32                            Edi;
-  UINT32                            Ebp;
-  UINT32                            Esp;
-  UINT32                            Eip;
-} BASE_LIBRARY_JUMP_BUFFER;
-
-#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 4
-
-#elif defined (MDE_CPU_IPF)
-
-//
-// IPF context buffer used by SetJump() and LongJump()
-//
-typedef struct {
-  UINT64                            F2[2];
-  UINT64                            F3[2];
-  UINT64                            F4[2];
-  UINT64                            F5[2];
-  UINT64                            F16[2];
-  UINT64                            F17[2];
-  UINT64                            F18[2];
-  UINT64                            F19[2];
-  UINT64                            F20[2];
-  UINT64                            F21[2];
-  UINT64                            F22[2];
-  UINT64                            F23[2];
-  UINT64                            F24[2];
-  UINT64                            F25[2];
-  UINT64                            F26[2];
-  UINT64                            F27[2];
-  UINT64                            F28[2];
-  UINT64                            F29[2];
-  UINT64                            F30[2];
-  UINT64                            F31[2];
-  UINT64                            R4;
-  UINT64                            R5;
-  UINT64                            R6;
-  UINT64                            R7;
-  UINT64                            SP;
-  UINT64                            BR0;
-  UINT64                            BR1;
-  UINT64                            BR2;
-  UINT64                            BR3;
-  UINT64                            BR4;
-  UINT64                            BR5;
-  UINT64                            InitialUNAT;
-  UINT64                            AfterSpillUNAT;
-  UINT64                            PFS;
-  UINT64                            BSP;
-  UINT64                            Predicates;
-  UINT64                            LoopCount;
-  UINT64                            FPSR;
-} BASE_LIBRARY_JUMP_BUFFER;
-
-#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 0x10
-
-#elif defined (MDE_CPU_X64)
-//
-// X64 context buffer used by SetJump() and LongJump()
-//
-typedef struct {
-  UINT64                            Rbx;
-  UINT64                            Rsp;
-  UINT64                            Rbp;
-  UINT64                            Rdi;
-  UINT64                            Rsi;
-  UINT64                            R12;
-  UINT64                            R13;
-  UINT64                            R14;
-  UINT64                            R15;
-  UINT64                            Rip;
-} BASE_LIBRARY_JUMP_BUFFER;
-
-#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8
-
-#elif defined (MDE_CPU_EBC)
-//
-// EBC context buffer used by SetJump() and LongJump()
-//
-typedef struct {
-  UINT64                            R0;
-  UINT64                            R1;
-  UINT64                            R2;
-  UINT64                            R3;
-  UINT64                            IP;
-} BASE_LIBRARY_JUMP_BUFFER;
-
-#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8
-
-#else
-#error Unknown Processor Type
-#endif
-
-//
-// String Services
-//
-
-/**
-  Copies one Null-terminated Unicode string to another Null-terminated Unicode
-  string and returns the new Unicode string.
-
-  This function copies the contents of the Unicode string Source to the Unicode
-  string Destination, and returns Destination. If Source and Destination
-  overlap, then the results are undefined.
-
-  If Destination is NULL, then ASSERT().
-  If Destination is not aligned on a 16-bit boundary, then ASSERT().
-  If Source is NULL, then ASSERT().
-  If Source is not aligned on a 16-bit boundary, then ASSERT().
-  If Source and Destination overlap, then ASSERT().
-  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
-  PcdMaximumUnicodeStringLength Unicode characters not including the
-  Null-terminator, then ASSERT().
-
-  @param  Destination Pointer to a Null-terminated Unicode string.
-  @param  Source      Pointer to a Null-terminated Unicode string.
-
-  @return Destiantion
-
-**/
-CHAR16 *
-EFIAPI
-StrCpy (
-  OUT     CHAR16                    *Destination,
-  IN      CONST CHAR16              *Source
-  );
-
-
-/**
-  Copies one Null-terminated Unicode string with a maximum length to another
-  Null-terminated Unicode string with a maximum length and returns the new
-  Unicode string.
-
-  This function copies the contents of the Unicode string Source to the Unicode
-  string Destination, and returns Destination. At most, Length Unicode
-  characters are copied from Source to Destination. If Length is 0, then
-  Destination is returned unmodified. If Length is greater that the number of
-  Unicode characters in Source, then Destination is padded with Null Unicode
-  characters. If Source and Destination overlap, then the results are
-  undefined.
-
-  If Length > 0 and Destination is NULL, then ASSERT().
-  If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().
-  If Length > 0 and Source is NULL, then ASSERT().
-  If Length > 0 and Source is not aligned on a 16-bit bounadry, then ASSERT().
-  If Source and Destination overlap, then ASSERT().
-  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
-  PcdMaximumUnicodeStringLength Unicode characters not including the
-  Null-terminator, then ASSERT().
-
-  @param  Destination Pointer to a Null-terminated Unicode string.
-  @param  Source      Pointer to a Null-terminated Unicode string.
-  @param  Length      Maximum number of Unicode characters to copy.
-
-  @return Destination
-
-**/
-CHAR16 *
-EFIAPI
-StrnCpy (
-  OUT     CHAR16                    *Destination,
-  IN      CONST CHAR16              *Source,
-  IN      UINTN                     Length
-  );
-
-
-/**
-  Returns the length of a Null-terminated Unicode string.
-
-  This function returns the number of Unicode characters in the Null-terminated
-  Unicode string specified by String.
-
-  If String is NULL, then ASSERT().
-  If String is not aligned on a 16-bit boundary, then ASSERT().
-  If PcdMaximumUnicodeStringLength is not zero, and String contains more than
-  PcdMaximumUnicodeStringLength Unicode characters not including the
-  Null-terminator, then ASSERT().
-
-  @param  String  Pointer to a Null-terminated Unicode string.
-
-  @return The length of String.
-
-**/
-UINTN
-EFIAPI
-StrLen (
-  IN      CONST CHAR16              *String
-  );
-
-
-/**
-  Returns the size of a Null-terminated Unicode string in bytes, including the
-  Null terminator.
-
-  This function returns the size, in bytes, of the Null-terminated Unicode
-  string specified by String.
-
-  If String is NULL, then ASSERT().
-  If String is not aligned on a 16-bit boundary, then ASSERT().
-  If PcdMaximumUnicodeStringLength is not zero, and String contains more than
-  PcdMaximumUnicodeStringLength Unicode characters not including the
-  Null-terminator, then ASSERT().
-
-  @param  String  Pointer to a Null-terminated Unicode string.
-
-  @return The size of String.
-
-**/
-UINTN
-EFIAPI
-StrSize (
-  IN      CONST CHAR16              *String
-  );
-
-
-/**
-  Compares two Null-terminated Unicode strings, and returns the difference
-  between the first mismatched Unicode characters.
-
-  This function compares the Null-terminated Unicode string FirstString to the
-  Null-terminated Unicode string SecondString. If FirstString is identical to
-  SecondString, then 0 is returned. Otherwise, the value returned is the first
-  mismatched Unicode character in SecondString subtracted from the first
-  mismatched Unicode character in FirstString.
-
-  If FirstString is NULL, then ASSERT().
-  If FirstString is not aligned on a 16-bit boundary, then ASSERT().
-  If SecondString is NULL, then ASSERT().
-  If SecondString is not aligned on a 16-bit boundary, then ASSERT().
-  If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more
-  than PcdMaximumUnicodeStringLength Unicode characters not including the
-  Null-terminator, then ASSERT().
-  If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more
-  than PcdMaximumUnicodeStringLength Unicode characters not including the
-  Null-terminator, then ASSERT().
-
-  @param  FirstString   Pointer to a Null-terminated Unicode string.
-  @param  SecondString  Pointer to a Null-terminated Unicode string.
-
-  @retval 0   FirstString is identical to SecondString.
-  @retval !=0 FirstString is not identical to SecondString.
-
-**/
-INTN
-EFIAPI
-StrCmp (
-  IN      CONST CHAR16              *FirstString,
-  IN      CONST CHAR16              *SecondString
-  );
-
-
-/**
-  Compares two Null-terminated Unicode strings with maximum lengths, and
-  returns the difference between the first mismatched Unicode characters.
-
-  This function compares the Null-terminated Unicode string FirstString to the
-  Null-terminated Unicode string SecondString. At most, Length Unicode
-  characters will be compared. If Length is 0, then 0 is returned. If
-  FirstString is identical to SecondString, then 0 is returned. Otherwise, the
-  value returned is the first mismatched Unicode character in SecondString
-  subtracted from the first mismatched Unicode character in FirstString.
-
-  If Length > 0 and FirstString is NULL, then ASSERT().
-  If Length > 0 and FirstString is not aligned on a 16-bit bounadary, then ASSERT().
-  If Length > 0 and SecondString is NULL, then ASSERT().
-  If Length > 0 and SecondString is not aligned on a 16-bit bounadary, then ASSERT().
-  If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more
-  than PcdMaximumUnicodeStringLength Unicode characters not including the
-  Null-terminator, then ASSERT().
-  If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more
-  than PcdMaximumUnicodeStringLength Unicode characters not including the
-  Null-terminator, then ASSERT().
-
-  @param  FirstString   Pointer to a Null-terminated Unicode string.
-  @param  SecondString  Pointer to a Null-terminated Unicode string.
-  @param  Length        Maximum number of Unicode characters to compare.
-
-  @retval 0   FirstString is identical to SecondString.
-  @retval !=0 FirstString is not identical to SecondString.
-
-**/
-INTN
-EFIAPI
-StrnCmp (
-  IN      CONST CHAR16              *FirstString,
-  IN      CONST CHAR16              *SecondString,
-  IN      UINTN                     Length
-  );
-
-
-/**
-  Concatenates one Null-terminated Unicode string to another Null-terminated
-  Unicode string, and returns the concatenated Unicode string.
-
-  This function concatenates two Null-terminated Unicode strings. The contents
-  of Null-terminated Unicode string Source are concatenated to the end of
-  Null-terminated Unicode string Destination. The Null-terminated concatenated
-  Unicode String is returned. If Source and Destination overlap, then the
-  results are undefined.
-
-  If Destination is NULL, then ASSERT().
-  If Destination is not aligned on a 16-bit bounadary, then ASSERT().
-  If Source is NULL, then ASSERT().
-  If Source is not aligned on a 16-bit bounadary, then ASSERT().
-  If Source and Destination overlap, then ASSERT().
-  If PcdMaximumUnicodeStringLength is not zero, and Destination contains more
-  than PcdMaximumUnicodeStringLength Unicode characters not including the
-  Null-terminator, then ASSERT().
-  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
-  PcdMaximumUnicodeStringLength Unicode characters not including the
-  Null-terminator, then ASSERT().
-  If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination
-  and Source results in a Unicode string with more than
-  PcdMaximumUnicodeStringLength Unicode characters not including the
-  Null-terminator, then ASSERT().
-
-  @param  Destination Pointer to a Null-terminated Unicode string.
-  @param  Source      Pointer to a Null-terminated Unicode string.
-
-  @return Destination
-
-**/
-CHAR16 *
-EFIAPI
-StrCat (
-  IN OUT  CHAR16                    *Destination,
-  IN      CONST CHAR16              *Source
-  );
-
-
-/**
-  Concatenates one Null-terminated Unicode string with a maximum length to the
-  end of another Null-terminated Unicode string, and returns the concatenated
-  Unicode string.
-
-  This function concatenates two Null-terminated Unicode strings. The contents
-  of Null-terminated Unicode string Source are concatenated to the end of
-  Null-terminated Unicode string Destination, and Destination is returned. At
-  most, Length Unicode characters are concatenated from Source to the end of
-  Destination, and Destination is always Null-terminated. If Length is 0, then
-  Destination is returned unmodified. If Source and Destination overlap, then
-  the results are undefined.
-
-  If Destination is NULL, then ASSERT().
-  If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().
-  If Length > 0 and Source is NULL, then ASSERT().
-  If Length > 0 and Source is not aligned on a 16-bit boundary, then ASSERT().
-  If Source and Destination overlap, then ASSERT().
-  If PcdMaximumUnicodeStringLength is not zero, and Destination contains more
-  than PcdMaximumUnicodeStringLength Unicode characters not including the
-  Null-terminator, then ASSERT().
-  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
-  PcdMaximumUnicodeStringLength Unicode characters not including the
-  Null-terminator, then ASSERT().
-  If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination
-  and Source results in a Unicode string with more than
-  PcdMaximumUnicodeStringLength Unicode characters not including the
-  Null-terminator, then ASSERT().
-
-  @param  Destination Pointer to a Null-terminated Unicode string.
-  @param  Source      Pointer to a Null-terminated Unicode string.
-  @param  Length      Maximum number of Unicode characters to concatenate from
-                      Source.
-
-  @return Destination
-
-**/
-CHAR16 *
-EFIAPI
-StrnCat (
-  IN OUT  CHAR16                    *Destination,
-  IN      CONST CHAR16              *Source,
-  IN      UINTN                     Length
-  );
-
-/**
-  Returns the first occurance of a Null-terminated Unicode sub-string
-  in a Null-terminated Unicode string.
-
-  This function scans the contents of the Null-terminated Unicode string
-  specified by String and returns the first occurrence of SearchString.
-  If SearchString is not found in String, then NULL is returned.  If
-  the length of SearchString is zero, then String is
-  returned.
-
-  If String is NULL, then ASSERT().
-  If String is not aligned on a 16-bit boundary, then ASSERT().
-  If SearchString is NULL, then ASSERT().
-  If SearchString is not aligned on a 16-bit boundary, then ASSERT().
-
-  If PcdMaximumUnicodeStringLength is not zero, and SearchString
-  or String contains more than PcdMaximumUnicodeStringLength Unicode
-  characters not including the Null-terminator, then ASSERT().
-
-  @param  String                                 Pointer to a Null-terminated Unicode string.
-  @param  SearchString Pointer to a Null-terminated Unicode string to search for.
-
-  @retval NULL            If the SearchString does not appear in String.
-  @retval !NULL           If there is a match.
-
-**/
-CHAR16 *
-EFIAPI
-StrStr (
-  IN      CONST CHAR16               *String,
-  IN      CONST CHAR16               *SearchString
-  );
-
-/**
-  Convert a Null-terminated Unicode decimal string to a value of
-  type UINTN.
-
-  This function returns a value of type UINTN by interpreting the contents
-  of the Unicode string specified by String as a decimal number. The format
-  of the input Unicode string String is:
-
-                  [spaces] [decimal digits].
-
-  The valid decimal digit character is in the range [0-9]. The
-  function will ignore the pad space, which includes spaces or
-  tab characters, before [decimal digits]. The running zero in the
-  beginning of [decimal digits] will be ignored. Then, the function
-  stops at the first character that is a not a valid decimal character
-  or a Null-terminator, whichever one comes first.
-
-  If String is NULL, then ASSERT().
-  If String is not aligned in a 16-bit boundary, then ASSERT().
-  If String has only pad spaces, then 0 is returned.
-  If String has no pad spaces or valid decimal digits,
-  then 0 is returned.
-  If the number represented by String overflows according
-  to the range defined by UINTN, then ASSERT().
-
-  If PcdMaximumUnicodeStringLength is not zero, and String contains
-  more than PcdMaximumUnicodeStringLength Unicode characters not including
-  the Null-terminator, then ASSERT().
-
-  @param  String                           Pointer to a Null-terminated Unicode string.
-
-  @retval UINTN
-
-**/
-UINTN
-EFIAPI
-StrDecimalToUintn (
-  IN      CONST CHAR16               *String
-  );
-
-/**
-  Convert a Null-terminated Unicode decimal string to a value of
-  type UINT64.
-
-  This function returns a value of type UINT64 by interpreting the contents
-  of the Unicode string specified by String as a decimal number. The format
-  of the input Unicode string String is:
-
-                  [spaces] [decimal digits].
-
-  The valid decimal digit character is in the range [0-9]. The
-  function will ignore the pad space, which includes spaces or
-  tab characters, before [decimal digits]. The running zero in the
-  beginning of [decimal digits] will be ignored. Then, the function
-  stops at the first character that is a not a valid decimal character
-  or a Null-terminator, whichever one comes first.
-
-  If String is NULL, then ASSERT().
-  If String is not aligned in a 16-bit boundary, then ASSERT().
-  If String has only pad spaces, then 0 is returned.
-  If String has no pad spaces or valid decimal digits,
-  then 0 is returned.
-  If the number represented by String overflows according
-  to the range defined by UINT64, then ASSERT().
-
-  If PcdMaximumUnicodeStringLength is not zero, and String contains
-  more than PcdMaximumUnicodeStringLength Unicode characters not including
-  the Null-terminator, then ASSERT().
-
-  @param  String                           Pointer to a Null-terminated Unicode string.
-
-  @retval UINT64
-
-**/
-UINT64
-EFIAPI
-StrDecimalToUint64 (
-  IN      CONST CHAR16               *String
-  );
-
-/**
-  Convert a Null-terminated Unicode hexadecimal string to a value of type UINTN.
-
-  This function returns a value of type UINTN by interpreting the contents
-  of the Unicode string specified by String as a hexadecimal number.
-  The format of the input Unicode string String is:
-
-                  [spaces][zeros][x][hexadecimal digits].
-
-  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
-  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.
-  If "x" appears in the input string, it must be prefixed with at least one 0.
-  The function will ignore the pad space, which includes spaces or tab characters,
-  before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or
-  [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the
-  first valid hexadecimal digit. Then, the function stops at the first character that is
-  a not a valid hexadecimal character or NULL, whichever one comes first.
-
-  If String is NULL, then ASSERT().
-  If String is not aligned in a 16-bit boundary, then ASSERT().
-  If String has only pad spaces, then zero is returned.
-  If String has no leading pad spaces, leading zeros or valid hexadecimal digits,
-  then zero is returned.
-  If the number represented by String overflows according to the range defined by
-  UINTN, then ASSERT().
-
-  If PcdMaximumUnicodeStringLength is not zero, and String contains more than
-  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator,
-  then ASSERT().
-
-  @param  String                           Pointer to a Null-terminated Unicode string.
-
-  @retval UINTN
-
-**/
-UINTN
-EFIAPI
-StrHexToUintn (
-  IN      CONST CHAR16               *String
-  );
-
-
-/**
-  Convert a Null-terminated Unicode hexadecimal string to a value of type UINT64.
-
-  This function returns a value of type UINT64 by interpreting the contents
-  of the Unicode string specified by String as a hexadecimal number.
-  The format of the input Unicode string String is
-
-                  [spaces][zeros][x][hexadecimal digits].
-
-  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
-  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.
-  If "x" appears in the input string, it must be prefixed with at least one 0.
-  The function will ignore the pad space, which includes spaces or tab characters,
-  before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or
-  [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the
-  first valid hexadecimal digit. Then, the function stops at the first character that is
-  a not a valid hexadecimal character or NULL, whichever one comes first.
-
-  If String is NULL, then ASSERT().
-  If String is not aligned in a 16-bit boundary, then ASSERT().
-  If String has only pad spaces, then zero is returned.
-  If String has no leading pad spaces, leading zeros or valid hexadecimal digits,
-  then zero is returned.
-  If the number represented by String overflows according to the range defined by
-  UINT64, then ASSERT().
-
-  If PcdMaximumUnicodeStringLength is not zero, and String contains more than
-  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator,
-  then ASSERT().
-
-  @param  String                           Pointer to a Null-terminated Unicode string.
-
-  @retval UINT64
-
-**/
-UINT64
-EFIAPI
-StrHexToUint64 (
-  IN      CONST CHAR16               *String
-  );
-
-
-/**
-  Convert one Null-terminated Unicode string to a Null-terminated
-  ASCII string and returns the ASCII string.
-
-  This function converts the content of the Unicode string Source
-  to the ASCII string Destination by copying the lower 8 bits of
-  each Unicode character. It returns Destination.
-
-  If any Unicode characters in Source contain non-zero value in
-  the upper 8 bits, then ASSERT().
-
-  If Destination is NULL, then ASSERT().
-  If Source is NULL, then ASSERT().
-  If Source is not aligned on a 16-bit boundary, then ASSERT().
-  If Source and Destination overlap, then ASSERT().
-
-  If PcdMaximumUnicodeStringLength is not zero, and Source contains
-  more than PcdMaximumUnicodeStringLength Unicode characters not including
-  the Null-terminator, then ASSERT().
-
-  If PcdMaximumAsciiStringLength is not zero, and Source contains more
-  than PcdMaximumAsciiStringLength Unicode characters not including the
-  Null-terminator, then ASSERT().
-
-  @param  Source        Pointer to a Null-terminated Unicode string.
-  @param  Destination   Pointer to a Null-terminated ASCII string.
-
-  @return Destination
-
-**/
-CHAR8 *
-EFIAPI
-UnicodeStrToAsciiStr (
-  IN      CONST CHAR16               *Source,
-  OUT    CHAR8                           *Destination
-  );
-
-
-/**
-  Copies one Null-terminated ASCII string to another Null-terminated ASCII
-  string and returns the new ASCII string.
-
-  This function copies the contents of the ASCII string Source to the ASCII
-  string Destination, and returns Destination. If Source and Destination
-  overlap, then the results are undefined.
-
-  If Destination is NULL, then ASSERT().
-  If Source is NULL, then ASSERT().
-  If Source and Destination overlap, then ASSERT().
-  If PcdMaximumAsciiStringLength is not zero and Source contains more than
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
-  then ASSERT().
-
-  @param  Destination Pointer to a Null-terminated ASCII string.
-  @param  Source      Pointer to a Null-terminated ASCII string.
-
-  @return Destination
-
-**/
-CHAR8 *
-EFIAPI
-AsciiStrCpy (
-  OUT     CHAR8                     *Destination,
-  IN      CONST CHAR8               *Source
-  );
-
-
-/**
-  Copies one Null-terminated ASCII string with a maximum length to another
-  Null-terminated ASCII string with a maximum length and returns the new ASCII
-  string.
-
-  This function copies the contents of the ASCII string Source to the ASCII
-  string Destination, and returns Destination. At most, Length ASCII characters
-  are copied from Source to Destination. If Length is 0, then Destination is
-  returned unmodified. If Length is greater that the number of ASCII characters
-  in Source, then Destination is padded with Null ASCII characters. If Source
-  and Destination overlap, then the results are undefined.
-
-  If Destination is NULL, then ASSERT().
-  If Source is NULL, then ASSERT().
-  If Source and Destination overlap, then ASSERT().
-  If PcdMaximumAsciiStringLength is not zero, and Source contains more than
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
-  then ASSERT().
-
-  @param  Destination Pointer to a Null-terminated ASCII string.
-  @param  Source      Pointer to a Null-terminated ASCII string.
-  @param  Length      Maximum number of ASCII characters to copy.
-
-  @return Destination
-
-**/
-CHAR8 *
-EFIAPI
-AsciiStrnCpy (
-  OUT     CHAR8                     *Destination,
-  IN      CONST CHAR8               *Source,
-  IN      UINTN                     Length
-  );
-
-
-/**
-  Returns the length of a Null-terminated ASCII string.
-
-  This function returns the number of ASCII characters in the Null-terminated
-  ASCII string specified by String.
-
-  If Length > 0 and Destination is NULL, then ASSERT().
-  If Length > 0 and Source is NULL, then ASSERT().
-  If PcdMaximumAsciiStringLength is not zero and String contains more than
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
-  then ASSERT().
-
-  @param  String  Pointer to a Null-terminated ASCII string.
-
-  @return The length of String.
-
-**/
-UINTN
-EFIAPI
-AsciiStrLen (
-  IN      CONST CHAR8               *String
-  );
-
-
-/**
-  Returns the size of a Null-terminated ASCII string in bytes, including the
-  Null terminator.
-
-  This function returns the size, in bytes, of the Null-terminated ASCII string
-  specified by String.
-
-  If String is NULL, then ASSERT().
-  If PcdMaximumAsciiStringLength is not zero and String contains more than
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
-  then ASSERT().
-
-  @param  String  Pointer to a Null-terminated ASCII string.
-
-  @return The size of String.
-
-**/
-UINTN
-EFIAPI
-AsciiStrSize (
-  IN      CONST CHAR8               *String
-  );
-
-
-/**
-  Compares two Null-terminated ASCII strings, and returns the difference
-  between the first mismatched ASCII characters.
-
-  This function compares the Null-terminated ASCII string FirstString to the
-  Null-terminated ASCII string SecondString. If FirstString is identical to
-  SecondString, then 0 is returned. Otherwise, the value returned is the first
-  mismatched ASCII character in SecondString subtracted from the first
-  mismatched ASCII character in FirstString.
-
-  If FirstString is NULL, then ASSERT().
-  If SecondString is NULL, then ASSERT().
-  If PcdMaximumAsciiStringLength is not zero and FirstString contains more than
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
-  then ASSERT().
-  If PcdMaximumAsciiStringLength is not zero and SecondString contains more
-  than PcdMaximumAsciiStringLength ASCII characters not including the
-  Null-terminator, then ASSERT().
-
-  @param  FirstString   Pointer to a Null-terminated ASCII string.
-  @param  SecondString  Pointer to a Null-terminated ASCII string.
-
-  @retval 0   FirstString is identical to SecondString.
-  @retval !=0 FirstString is not identical to SecondString.
-
-**/
-INTN
-EFIAPI
-AsciiStrCmp (
-  IN      CONST CHAR8               *FirstString,
-  IN      CONST CHAR8               *SecondString
-  );
-
-
-/**
-  Performs a case insensitive comparison of two Null-terminated ASCII strings,
-  and returns the difference between the first mismatched ASCII characters.
-
-  This function performs a case insensitive comparison of the Null-terminated
-  ASCII string FirstString to the Null-terminated ASCII string SecondString. If
-  FirstString is identical to SecondString, then 0 is returned. Otherwise, the
-  value returned is the first mismatched lower case ASCII character in
-  SecondString subtracted from the first mismatched lower case ASCII character
-  in FirstString.
-
-  If FirstString is NULL, then ASSERT().
-  If SecondString is NULL, then ASSERT().
-  If PcdMaximumAsciiStringLength is not zero and FirstString contains more than
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
-  then ASSERT().
-  If PcdMaximumAsciiStringLength is not zero and SecondString contains more
-  than PcdMaximumAsciiStringLength ASCII characters not including the
-  Null-terminator, then ASSERT().
-
-  @param  FirstString   Pointer to a Null-terminated ASCII string.
-  @param  SecondString  Pointer to a Null-terminated ASCII string.
-
-  @retval 0   FirstString is identical to SecondString using case insensitive
-              comparisons.
-  @retval !=0 FirstString is not identical to SecondString using case
-              insensitive comparisons.
-
-**/
-INTN
-EFIAPI
-AsciiStriCmp (
-  IN      CONST CHAR8               *FirstString,
-  IN      CONST CHAR8               *SecondString
-  );
-
-
-/**
-  Compares two Null-terminated ASCII strings with maximum lengths, and returns
-  the difference between the first mismatched ASCII characters.
-
-  This function compares the Null-terminated ASCII string FirstString to the
-  Null-terminated ASCII  string SecondString. At most, Length ASCII characters
-  will be compared. If Length is 0, then 0 is returned. If FirstString is
-  identical to SecondString, then 0 is returned. Otherwise, the value returned
-  is the first mismatched ASCII character in SecondString subtracted from the
-  first mismatched ASCII character in FirstString.
-
-  If Length > 0 and FirstString is NULL, then ASSERT().
-  If Length > 0 and SecondString is NULL, then ASSERT().
-  If PcdMaximumAsciiStringLength is not zero and FirstString contains more than
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
-  then ASSERT().
-  If PcdMaximumAsciiStringLength is not zero and SecondString contains more than
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
-  then ASSERT().
-
-  @param  FirstString   Pointer to a Null-terminated ASCII string.
-  @param  SecondString  Pointer to a Null-terminated ASCII string.
-  @param  Length        Maximum number of ASCII characters for compare.
-  
-  @retval 0   FirstString is identical to SecondString.
-  @retval !=0 FirstString is not identical to SecondString.
-
-**/
-INTN
-EFIAPI
-AsciiStrnCmp (
-  IN      CONST CHAR8               *FirstString,
-  IN      CONST CHAR8               *SecondString,
-  IN      UINTN                     Length
-  );
-
-
-/**
-  Concatenates one Null-terminated ASCII string to another Null-terminated
-  ASCII string, and returns the concatenated ASCII string.
-
-  This function concatenates two Null-terminated ASCII strings. The contents of
-  Null-terminated ASCII string Source are concatenated to the end of Null-
-  terminated ASCII string Destination. The Null-terminated concatenated ASCII
-  String is returned.
-
-  If Destination is NULL, then ASSERT().
-  If Source is NULL, then ASSERT().
-  If PcdMaximumAsciiStringLength is not zero and Destination contains more than
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
-  then ASSERT().
-  If PcdMaximumAsciiStringLength is not zero and Source contains more than
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
-  then ASSERT().
-  If PcdMaximumAsciiStringLength is not zero and concatenating Destination and
-  Source results in a ASCII string with more than PcdMaximumAsciiStringLength
-  ASCII characters, then ASSERT().
-
-  @param  Destination Pointer to a Null-terminated ASCII string.
-  @param  Source      Pointer to a Null-terminated ASCII string.
-
-  @return Destination
-
-**/
-CHAR8 *
-EFIAPI
-AsciiStrCat (
-  IN OUT CHAR8    *Destination,
-  IN CONST CHAR8  *Source
-  );
-
-
-/**
-  Concatenates one Null-terminated ASCII string with a maximum length to the
-  end of another Null-terminated ASCII string, and returns the concatenated
-  ASCII string.
-
-  This function concatenates two Null-terminated ASCII strings. The contents
-  of Null-terminated ASCII string Source are concatenated to the end of Null-
-  terminated ASCII string Destination, and Destination is returned. At most,
-  Length ASCII characters are concatenated from Source to the end of
-  Destination, and Destination is always Null-terminated. If Length is 0, then
-  Destination is returned unmodified. If Source and Destination overlap, then
-  the results are undefined.
-
-  If Length > 0 and Destination is NULL, then ASSERT().
-  If Length > 0 and Source is NULL, then ASSERT().
-  If Source and Destination overlap, then ASSERT().
-  If PcdMaximumAsciiStringLength is not zero, and Destination contains more than
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
-  then ASSERT().
-  If PcdMaximumAsciiStringLength is not zero, and Source contains more than
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
-  then ASSERT().
-  If PcdMaximumAsciiStringLength is not zero, and concatenating Destination and
-  Source results in a ASCII string with more than PcdMaximumAsciiStringLength
-  ASCII characters not including the Null-terminator, then ASSERT().
-
-  @param  Destination Pointer to a Null-terminated ASCII string.
-  @param  Source      Pointer to a Null-terminated ASCII string.
-  @param  Length      Maximum number of ASCII characters to concatenate from
-                      Source.
-
-  @return Destination
-
-**/
-CHAR8 *
-EFIAPI
-AsciiStrnCat (
-  IN OUT  CHAR8                     *Destination,
-  IN      CONST CHAR8               *Source,
-  IN      UINTN                     Length
-  );
-
-
-/**
-  Returns the first occurance of a Null-terminated ASCII sub-string
-  in a Null-terminated ASCII string.
-
-  This function scans the contents of the ASCII string specified by String
-  and returns the first occurrence of SearchString. If SearchString is not
-  found in String, then NULL is returned. If the length of SearchString is zero,
-  then String is returned.
-
-  If String is NULL, then ASSERT().
-  If SearchString is NULL, then ASSERT().
-
-  If PcdMaximumAsciiStringLength is not zero, and SearchString or
-  String contains more than PcdMaximumAsciiStringLength Unicode characters
-  not including the Null-terminator, then ASSERT().
-
-  @param  String                                 Pointer to a Null-terminated ASCII string.
-  @param  SearchString   Pointer to a Null-terminated ASCII string to search for.
-
-  @retval NULL            If the SearchString does not appear in String.
-  @retval !NULL           If there is a match.
-
-**/
-CHAR8 *
-EFIAPI
-AsciiStrStr (
-  IN      CONST CHAR8                  *String,
-  IN      CONST CHAR8                  *SearchString
-  );
-
-
-/**
-  Convert a Null-terminated ASCII decimal string to a value of type
-  UINTN.
-
-  This function returns a value of type UINTN by interpreting the contents
-  of the ASCII string String as a decimal number. The format of the input
-  ASCII string String is:
-
-                    [spaces] [decimal digits].
-
-  The valid decimal digit character is in the range [0-9]. The function will
-  ignore the pad space, which includes spaces or tab characters, before the digits.
-  The running zero in the beginning of [decimal digits] will be ignored. Then, the
-  function stops at the first character that is a not a valid decimal character or
-  Null-terminator, whichever on comes first.
-
-  If String has only pad spaces, then 0 is returned.
-  If String has no pad spaces or valid decimal digits, then 0 is returned.
-  If the number represented by String overflows according to the range defined by
-  UINTN, then ASSERT().
-  If String is NULL, then ASSERT().
-  If PcdMaximumAsciiStringLength is not zero, and String contains more than
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
-  then ASSERT().
-
-  @param  String                           Pointer to a Null-terminated ASCII string.
-
-  @retval UINTN
-
-**/
-UINTN
-EFIAPI
-AsciiStrDecimalToUintn (
-  IN      CONST CHAR8               *String
-  );
-
-
-/**
-  Convert a Null-terminated ASCII decimal string to a value of type
-  UINT64.
-
-  This function returns a value of type UINT64 by interpreting the contents
-  of the ASCII string String as a decimal number. The format of the input
-  ASCII string String is:
-
-                    [spaces] [decimal digits].
-
-  The valid decimal digit character is in the range [0-9]. The function will
-  ignore the pad space, which includes spaces or tab characters, before the digits.
-  The running zero in the beginning of [decimal digits] will be ignored. Then, the
-  function stops at the first character that is a not a valid decimal character or
-  Null-terminator, whichever on comes first.
-
-  If String has only pad spaces, then 0 is returned.
-  If String has no pad spaces or valid decimal digits, then 0 is returned.
-  If the number represented by String overflows according to the range defined by
-  UINT64, then ASSERT().
-  If String is NULL, then ASSERT().
-  If PcdMaximumAsciiStringLength is not zero, and String contains more than
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
-  then ASSERT().
-
-  @param  String                           Pointer to a Null-terminated ASCII string.
-
-  @retval UINT64
-
-**/
-UINT64
-EFIAPI
-AsciiStrDecimalToUint64 (
-  IN      CONST CHAR8                *String
-  );
-
-
-/**
-  Convert a Null-terminated ASCII hexadecimal string to a value of type UINTN.
-
-  This function returns a value of type UINTN by interpreting the contents of
-  the ASCII string String as a hexadecimal number. The format of the input ASCII
-  string String is:
-
-                  [spaces][zeros][x][hexadecimal digits].
-
-  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
-  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x"
-  appears in the input string, it must be prefixed with at least one 0. The function
-  will ignore the pad space, which includes spaces or tab characters, before [zeros],
-  [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits]
-  will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal
-  digit. Then, the function stops at the first character that is a not a valid
-  hexadecimal character or Null-terminator, whichever on comes first.
-
-  If String has only pad spaces, then 0 is returned.
-  If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then
-  0 is returned.
-
-  If the number represented by String overflows according to the range defined by UINTN,
-  then ASSERT().
-  If String is NULL, then ASSERT().
-  If PcdMaximumAsciiStringLength is not zero,
-  and String contains more than PcdMaximumAsciiStringLength ASCII characters not including
-  the Null-terminator, then ASSERT().
-
-  @param  String                           Pointer to a Null-terminated ASCII string.
-
-  @retval UINTN
-
-**/
-UINTN
-EFIAPI
-AsciiStrHexToUintn (
-  IN      CONST CHAR8                *String
-  );
-
-
-/**
-  Convert a Null-terminated ASCII hexadecimal string to a value of type UINT64.
-
-  This function returns a value of type UINT64 by interpreting the contents of
-  the ASCII string String as a hexadecimal number. The format of the input ASCII
-  string String is:
-
-                  [spaces][zeros][x][hexadecimal digits].
-
-  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].
-  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x"
-  appears in the input string, it must be prefixed with at least one 0. The function
-  will ignore the pad space, which includes spaces or tab characters, before [zeros],
-  [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits]
-  will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal
-  digit. Then, the function stops at the first character that is a not a valid
-  hexadecimal character or Null-terminator, whichever on comes first.
-
-  If String has only pad spaces, then 0 is returned.
-  If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then
-  0 is returned.
-
-  If the number represented by String overflows according to the range defined by UINT64,
-  then ASSERT().
-  If String is NULL, then ASSERT().
-  If PcdMaximumAsciiStringLength is not zero,
-  and String contains more than PcdMaximumAsciiStringLength ASCII characters not including
-  the Null-terminator, then ASSERT().
-
-  @param  String                           Pointer to a Null-terminated ASCII string.
-
-  @retval UINT64
-
-**/
-UINT64
-EFIAPI
-AsciiStrHexToUint64 (
-  IN      CONST CHAR8                  *String
-  );
-
-
-/**
-  Convert one Null-terminated ASCII string to a Null-terminated
-  Unicode string and returns the Unicode string.
-
-  This function converts the contents of the ASCII string Source to the Unicode
-  string Destination, and returns Destination.  The function terminates the
-  Unicode string Destination by appending a Null-terminator character at the end.
-  The caller is responsible to make sure Destination points to a buffer with size
-  equal or greater than ((AsciiStrLen (Source) + 1) * sizeof (CHAR16)) in bytes.
-
-  If Destination is NULL, then ASSERT().
-  If Destination is not aligned on a 16-bit boundary, then ASSERT().
-  If Source is NULL, then ASSERT().
-  If Source and Destination overlap, then ASSERT().
-  If PcdMaximumAsciiStringLength is not zero, and Source contains more than
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
-  then ASSERT().
-  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
-  PcdMaximumUnicodeStringLength ASCII characters not including the
-  Null-terminator, then ASSERT().
-
-  @param  Source        Pointer to a Null-terminated ASCII string.
-  @param  Destination   Pointer to a Null-terminated Unicode string.
-
-  @return Destination
-
-**/
-CHAR16 *
-EFIAPI
-AsciiStrToUnicodeStr (
-  IN      CONST CHAR8                *Source,
-  OUT    CHAR16                        *Destination
-  );
-
-
-/**
-  Converts an 8-bit value to an 8-bit BCD value.
-
-  Converts the 8-bit value specified by Value to BCD. The BCD value is
-  returned.
-
-  If Value >= 100, then ASSERT().
-
-  @param  Value The 8-bit value to convert to BCD. Range 0..99.
-
-  @return The BCD value
-
-**/
-UINT8
-EFIAPI
-DecimalToBcd8 (
-  IN      UINT8                     Value
-  );
-
-
-/**
-  Converts an 8-bit BCD value to an 8-bit value.
-
-  Converts the 8-bit BCD value specified by Value to an 8-bit value. The 8-bit
-  value is returned.
-
-  If Value >= 0xA0, then ASSERT().
-  If (Value & 0x0F) >= 0x0A, then ASSERT().
-
-  @param  Value The 8-bit BCD value to convert to an 8-bit value.
-
-  @return The 8-bit value is returned.
-
-**/
-UINT8
-EFIAPI
-BcdToDecimal8 (
-  IN      UINT8                     Value
-  );
-
-
-//
-// Linked List Functions and Macros
-//
-
-/**
-  Initializes the head node of a doubly linked list that is declared as a
-  global variable in a module.
-
-  Initializes the forward and backward links of a new linked list. After
-  initializing a linked list with this macro, the other linked list functions
-  may be used to add and remove nodes from the linked list. This macro results
-  in smaller executables by initializing the linked list in the data section,
-  instead if calling the InitializeListHead() function to perform the
-  equivalent operation.
-
-  @param  ListHead  The head note of a list to initiailize.
-
-**/
-#define INITIALIZE_LIST_HEAD_VARIABLE(ListHead)  {&ListHead, &ListHead}
-
-
-/**
-  Initializes the head node of a doubly linked list, and returns the pointer to
-  the head node of the doubly linked list.
-
-  Initializes the forward and backward links of a new linked list. After
-  initializing a linked list with this function, the other linked list
-  functions may be used to add and remove nodes from the linked list. It is up
-  to the caller of this function to allocate the memory for ListHead.
-
-  If ListHead is NULL, then ASSERT().
-
-  @param  ListHead  A pointer to the head node of a new doubly linked list.
-
-  @return ListHead
-
-**/
-LIST_ENTRY *
-EFIAPI
-InitializeListHead (
-  IN      LIST_ENTRY                *ListHead
-  );
-
-
-/**
-  Adds a node to the beginning of a doubly linked list, and returns the pointer
-  to the head node of the doubly linked list.
-
-  Adds the node Entry at the beginning of the doubly linked list denoted by
-  ListHead, and returns ListHead.
-
-  If ListHead is NULL, then ASSERT().
-  If Entry is NULL, then ASSERT().
-  If ListHead was not initialized with InitializeListHead(), then ASSERT().
-  If PcdMaximumLinkedListLenth is not zero, and prior to insertion the number
-  of nodes in ListHead, including the ListHead node, is greater than or
-  equal to PcdMaximumLinkedListLength, then ASSERT().
-
-  @param  ListHead  A pointer to the head node of a doubly linked list.
-  @param  Entry     A pointer to a node that is to be inserted at the beginning
-                    of a doubly linked list.
-
-  @return ListHead
-
-**/
-LIST_ENTRY *
-EFIAPI
-InsertHeadList (
-  IN      LIST_ENTRY                *ListHead,
-  IN      LIST_ENTRY                *Entry
-  );
-
-
-/**
-  Adds a node to the end of a doubly linked list, and returns the pointer to
-  the head node of the doubly linked list.
-
-  Adds the node Entry to the end of the doubly linked list denoted by ListHead,
-  and returns ListHead.
-
-  If ListHead is NULL, then ASSERT().
-  If Entry is NULL, then ASSERT().
-  If ListHead was not initialized with InitializeListHead(), then ASSERT().
-  If PcdMaximumLinkedListLenth is not zero, and prior to insertion the number
-  of nodes in ListHead, including the ListHead node, is greater than or
-  equal to PcdMaximumLinkedListLength, then ASSERT().
-
-  @param  ListHead  A pointer to the head node of a doubly linked list.
-  @param  Entry     A pointer to a node that is to be added at the end of the
-                    doubly linked list.
-
-  @return ListHead
-
-**/
-LIST_ENTRY *
-EFIAPI
-InsertTailList (
-  IN      LIST_ENTRY                *ListHead,
-  IN      LIST_ENTRY                *Entry
-  );
-
-
-/**
-  Retrieves the first node of a doubly linked list.
-
-  Returns the first node of a doubly linked list. List must have been
-  initialized with InitializeListHead(). If List is empty, then NULL is
-  returned.
-
-  If List is NULL, then ASSERT().
-  If List was not initialized with InitializeListHead(), then ASSERT().
-  If PcdMaximumLinkedListLenth is not zero, and the number of nodes
-  in List, including the List node, is greater than or equal to
-  PcdMaximumLinkedListLength, then ASSERT().
-
-  @param  List  A pointer to the head node of a doubly linked list.
-
-  @return The first node of a doubly linked list.
-  @retval NULL  The list is empty.
-
-**/
-LIST_ENTRY *
-EFIAPI
-GetFirstNode (
-  IN      CONST LIST_ENTRY          *List
-  );
-
-
-/**
-  Retrieves the next node of a doubly linked list.
-
-  Returns the node of a doubly linked list that follows Node. List must have
-  been initialized with InitializeListHead(). If List is empty, then List is
-  returned.
-
-  If List is NULL, then ASSERT().
-  If Node is NULL, then ASSERT().
-  If List was not initialized with InitializeListHead(), then ASSERT().
-  If PcdMaximumLinkedListLenth is not zero, and List contains more than
-  PcdMaximumLinkedListLenth nodes, then ASSERT().
-  If Node is not a node in List, then ASSERT().
-
-  @param  List  A pointer to the head node of a doubly linked list.
-  @param  Node  A pointer to a node in the doubly linked list.
-
-  @return Pointer to the next node if one exists. Otherwise a null value which
-          is actually List is returned.
-
-**/
-LIST_ENTRY *
-EFIAPI
-GetNextNode (
-  IN      CONST LIST_ENTRY          *List,
-  IN      CONST LIST_ENTRY          *Node
-  );
-
-
-/**
-  Checks to see if a doubly linked list is empty or not.
-
-  Checks to see if the doubly linked list is empty. If the linked list contains
-  zero nodes, this function returns TRUE. Otherwise, it returns FALSE.
-
-  If ListHead is NULL, then ASSERT().
-  If ListHead was not initialized with InitializeListHead(), then ASSERT().
-  If PcdMaximumLinkedListLenth is not zero, and the number of nodes
-  in List, including the List node, is greater than or equal to
-  PcdMaximumLinkedListLength, then ASSERT().
-
-  @param  ListHead  A pointer to the head node of a doubly linked list.
-
-  @retval TRUE  The linked list is empty.
-  @retval FALSE The linked list is not empty.
-
-**/
-BOOLEAN
-EFIAPI
-IsListEmpty (
-  IN      CONST LIST_ENTRY          *ListHead
-  );
-
-
-/**
-  Determines if a node in a doubly linked list is null.
-
-  Returns FALSE if Node is one of the nodes in the doubly linked list specified
-  by List. Otherwise, TRUE is returned. List must have been initialized with
-  InitializeListHead().
-
-  If List is NULL, then ASSERT().
-  If Node is NULL, then ASSERT().
-  If List was not initialized with InitializeListHead(), then ASSERT().
-  If PcdMaximumLinkedListLenth is not zero, and the number of nodes
-  in List, including the List node, is greater than or equal to
-  PcdMaximumLinkedListLength, then ASSERT().
-  If Node is not a node in List and Node is not equal to List, then ASSERT().
-
-  @param  List  A pointer to the head node of a doubly linked list.
-  @param  Node  A pointer to a node in the doubly linked list.
-
-  @retval TRUE  Node is one of the nodes in the doubly linked list.
-  @retval FALSE Node is not one of the nodes in the doubly linked list.
-
-**/
-BOOLEAN
-EFIAPI
-IsNull (
-  IN      CONST LIST_ENTRY          *List,
-  IN      CONST LIST_ENTRY          *Node
-  );
-
-
-/**
-  Determines if a node the last node in a doubly linked list.
-
-  Returns TRUE if Node is the last node in the doubly linked list specified by
-  List. Otherwise, FALSE is returned. List must have been initialized with
-  InitializeListHead().
-
-  If List is NULL, then ASSERT().
-  If Node is NULL, then ASSERT().
-  If List was not initialized with InitializeListHead(), then ASSERT().
-  If PcdMaximumLinkedListLenth is not zero, and the number of nodes
-  in List, including the List node, is greater than or equal to
-  PcdMaximumLinkedListLength, then ASSERT().
-  If Node is not a node in List, then ASSERT().
-
-  @param  List  A pointer to the head node of a doubly linked list.
-  @param  Node  A pointer to a node in the doubly linked list.
-
-  @retval TRUE  Node is the last node in the linked list.
-  @retval FALSE Node is not the last node in the linked list.
-
-**/
-BOOLEAN
-EFIAPI
-IsNodeAtEnd (
-  IN      CONST LIST_ENTRY          *List,
-  IN      CONST LIST_ENTRY          *Node
-  );
-
-
-/**
-  Swaps the location of two nodes in a doubly linked list, and returns the
-  first node after the swap.
-
-  If FirstEntry is identical to SecondEntry, then SecondEntry is returned.
-  Otherwise, the location of the FirstEntry node is swapped with the location
-  of the SecondEntry node in a doubly linked list. SecondEntry must be in the
-  same double linked list as FirstEntry and that double linked list must have
-  been initialized with InitializeListHead(). SecondEntry is returned after the
-  nodes are swapped.
-
-  If FirstEntry is NULL, then ASSERT().
-  If SecondEntry is NULL, then ASSERT().
-  If SecondEntry and FirstEntry are not in the same linked list, then ASSERT().
-  If PcdMaximumLinkedListLength is not zero, and the number of nodes in the
-  linked list containing the FirstEntry and SecondEntry nodes, including
-  the FirstEntry and SecondEntry nodes, is greater than or equal to
-  PcdMaximumLinkedListLength, then ASSERT().
-
-  @param  FirstEntry  A pointer to a node in a linked list.
-  @param  SecondEntry A pointer to another node in the same linked list.
-
-**/
-LIST_ENTRY *
-EFIAPI
-SwapListEntries (
-  IN      LIST_ENTRY                *FirstEntry,
-  IN      LIST_ENTRY                *SecondEntry
-  );
-
-
-/**
-  Removes a node from a doubly linked list, and returns the node that follows
-  the removed node.
-
-  Removes the node Entry from a doubly linked list. It is up to the caller of
-  this function to release the memory used by this node if that is required. On
-  exit, the node following Entry in the doubly linked list is returned. If
-  Entry is the only node in the linked list, then the head node of the linked
-  list is returned.
-
-  If Entry is NULL, then ASSERT().
-  If Entry is the head node of an empty list, then ASSERT().
-  If PcdMaximumLinkedListLength is not zero, and the number of nodes in the
-  linked list containing Entry, including the Entry node, is greater than
-  or equal to PcdMaximumLinkedListLength, then ASSERT().
-
-  @param  Entry A pointer to a node in a linked list
-
-  @return Entry
-
-**/
-LIST_ENTRY *
-EFIAPI
-RemoveEntryList (
-  IN      CONST LIST_ENTRY          *Entry
-  );
-
-//
-// Math Services
-//
-
-/**
-  Shifts a 64-bit integer left between 0 and 63 bits. The low bits are filled
-  with zeros. The shifted value is returned.
-
-  This function shifts the 64-bit value Operand to the left by Count bits. The
-  low Count bits are set to zero. The shifted value is returned.
-
-  If Count is greater than 63, then ASSERT().
-
-  @param  Operand The 64-bit operand to shift left.
-  @param  Count   The number of bits to shift left.
-
-  @return Operand << Count
-
-**/
-UINT64
-EFIAPI
-LShiftU64 (
-  IN      UINT64                    Operand,
-  IN      UINTN                     Count
-  );
-
-
-/**
-  Shifts a 64-bit integer right between 0 and 63 bits. This high bits are
-  filled with zeros. The shifted value is returned.
-
-  This function shifts the 64-bit value Operand to the right by Count bits. The
-  high Count bits are set to zero. The shifted value is returned.
-
-  If Count is greater than 63, then ASSERT().
-
-  @param  Operand The 64-bit operand to shift right.
-  @param  Count   The number of bits to shift right.
-
-  @return Operand >> Count
-
-**/
-UINT64
-EFIAPI
-RShiftU64 (
-  IN      UINT64                    Operand,
-  IN      UINTN                     Count
-  );
-
-
-/**
-  Shifts a 64-bit integer right between 0 and 63 bits. The high bits are filled
-  with original integer's bit 63. The shifted value is returned.
-
-  This function shifts the 64-bit value Operand to the right by Count bits. The
-  high Count bits are set to bit 63 of Operand.  The shifted value is returned.
-
-  If Count is greater than 63, then ASSERT().
-
-  @param  Operand The 64-bit operand to shift right.
-  @param  Count   The number of bits to shift right.
-
-  @return Operand >> Count
-
-**/
-UINT64
-EFIAPI
-ARShiftU64 (
-  IN      UINT64                    Operand,
-  IN      UINTN                     Count
-  );
-
-
-/**
-  Rotates a 32-bit integer left between 0 and 31 bits, filling the low bits
-  with the high bits that were rotated.
-
-  This function rotates the 32-bit value Operand to the left by Count bits. The
-  low Count bits are fill with the high Count bits of Operand. The rotated
-  value is returned.
-
-  If Count is greater than 31, then ASSERT().
-
-  @param  Operand The 32-bit operand to rotate left.
-  @param  Count   The number of bits to rotate left.
-
-  @return Operand <<< Count
-
-**/
-UINT32
-EFIAPI
-LRotU32 (
-  IN      UINT32                    Operand,
-  IN      UINTN                     Count
-  );
-
-
-/**
-  Rotates a 32-bit integer right between 0 and 31 bits, filling the high bits
-  with the low bits that were rotated.
-
-  This function rotates the 32-bit value Operand to the right by Count bits.
-  The high Count bits are fill with the low Count bits of Operand. The rotated
-  value is returned.
-
-  If Count is greater than 31, then ASSERT().
-
-  @param  Operand The 32-bit operand to rotate right.
-  @param  Count   The number of bits to rotate right.
-
-  @return Operand >>> Count
-
-**/
-UINT32
-EFIAPI
-RRotU32 (
-  IN      UINT32                    Operand,
-  IN      UINTN                     Count
-  );
-
-
-/**
-  Rotates a 64-bit integer left between 0 and 63 bits, filling the low bits
-  with the high bits that were rotated.
-
-  This function rotates the 64-bit value Operand to the left by Count bits. The
-  low Count bits are fill with the high Count bits of Operand. The rotated
-  value is returned.
-
-  If Count is greater than 63, then ASSERT().
-
-  @param  Operand The 64-bit operand to rotate left.
-  @param  Count   The number of bits to rotate left.
-
-  @return Operand <<< Count
-
-**/
-UINT64
-EFIAPI
-LRotU64 (
-  IN      UINT64                    Operand,
-  IN      UINTN                     Count
-  );
-
-
-/**
-  Rotates a 64-bit integer right between 0 and 63 bits, filling the high bits
-  with the high low bits that were rotated.
-
-  This function rotates the 64-bit value Operand to the right by Count bits.
-  The high Count bits are fill with the low Count bits of Operand. The rotated
-  value is returned.
-
-  If Count is greater than 63, then ASSERT().
-
-  @param  Operand The 64-bit operand to rotate right.
-  @param  Count   The number of bits to rotate right.
-
-  @return Operand >>> Count
-
-**/
-UINT64
-EFIAPI
-RRotU64 (
-  IN      UINT64                    Operand,
-  IN      UINTN                     Count
-  );
-
-
-/**
-  Returns the bit position of the lowest bit set in a 32-bit value.
-
-  This function computes the bit position of the lowest bit set in the 32-bit
-  value specified by Operand. If Operand is zero, then -1 is returned.
-  Otherwise, a value between 0 and 31 is returned.
-
-  @param  Operand The 32-bit operand to evaluate.
-
-  @return Position of the lowest bit set in Operand if found.
-  @retval -1 Operand is zero.
-
-**/
-INTN
-EFIAPI
-LowBitSet32 (
-  IN      UINT32                    Operand
-  );
-
-
-/**
-  Returns the bit position of the lowest bit set in a 64-bit value.
-
-  This function computes the bit position of the lowest bit set in the 64-bit
-  value specified by Operand. If Operand is zero, then -1 is returned.
-  Otherwise, a value between 0 and 63 is returned.
-
-  @param  Operand The 64-bit operand to evaluate.
-
-  @return Position of the lowest bit set in Operand if found.
-  @retval -1  Operand is zero.
-
-**/
-INTN
-EFIAPI
-LowBitSet64 (
-  IN      UINT64                    Operand
-  );
-
-
-/**
-  Returns the bit position of the highest bit set in a 32-bit value. Equivalent
-  to log2(x).
-
-  This function computes the bit position of the highest bit set in the 32-bit
-  value specified by Operand. If Operand is zero, then -1 is returned.
-  Otherwise, a value between 0 and 31 is returned.
-
-  @param  Operand The 32-bit operand to evaluate.
-
-  @return Position of the highest bit set in Operand if found.
-  @retval -1  Operand is zero.
-
-**/
-INTN
-EFIAPI
-HighBitSet32 (
-  IN      UINT32                    Operand
-  );
-
-
-/**
-  Returns the bit position of the highest bit set in a 64-bit value. Equivalent
-  to log2(x).
-
-  This function computes the bit position of the highest bit set in the 64-bit
-  value specified by Operand. If Operand is zero, then -1 is returned.
-  Otherwise, a value between 0 and 63 is returned.
-
-  @param  Operand The 64-bit operand to evaluate.
-
-  @return Position of the highest bit set in Operand if found.
-  @retval -1  Operand is zero.
-
-**/
-INTN
-EFIAPI
-HighBitSet64 (
-  IN      UINT64                    Operand
-  );
-
-
-/**
-  Returns the value of the highest bit set in a 32-bit value. Equivalent to
-  1 << HighBitSet32(x).
-
-  This function computes the value of the highest bit set in the 32-bit value
-  specified by Operand. If Operand is zero, then zero is returned.
-
-  @param  Operand The 32-bit operand to evaluate.
-
-  @return 1 << HighBitSet32(Operand)
-  @retval 0 Operand is zero.
-
-**/
-UINT32
-EFIAPI
-GetPowerOfTwo32 (
-  IN      UINT32                    Operand
-  );
-
-
-/**
-  Returns the value of the highest bit set in a 64-bit value. Equivalent to
-  1 << HighBitSet64(x).
-
-  This function computes the value of the highest bit set in the 64-bit value
-  specified by Operand. If Operand is zero, then zero is returned.
-
-  @param  Operand The 64-bit operand to evaluate.
-
-  @return 1 << HighBitSet64(Operand)
-  @retval 0 Operand is zero.
-
-**/
-UINT64
-EFIAPI
-GetPowerOfTwo64 (
-  IN      UINT64                    Operand
-  );
-
-
-/**
-  Switches the endianess of a 16-bit integer.
-
-  This function swaps the bytes in a 16-bit unsigned value to switch the value
-  from little endian to big endian or vice versa. The byte swapped value is
-  returned.
-
-  @param  Value Operand A 16-bit unsigned value.
-
-  @return The byte swaped Operand.
-
-**/
-UINT16
-EFIAPI
-SwapBytes16 (
-  IN      UINT16                    Value
-  );
-
-
-/**
-  Switches the endianess of a 32-bit integer.
-
-  This function swaps the bytes in a 32-bit unsigned value to switch the value
-  from little endian to big endian or vice versa. The byte swapped value is
-  returned.
-
-  @param  Value Operand A 32-bit unsigned value.
-
-  @return The byte swaped Operand.
-
-**/
-UINT32
-EFIAPI
-SwapBytes32 (
-  IN      UINT32                    Value
-  );
-
-
-/**
-  Switches the endianess of a 64-bit integer.
-
-  This function swaps the bytes in a 64-bit unsigned value to switch the value
-  from little endian to big endian or vice versa. The byte swapped value is
-  returned.
-
-  @param  Value Operand A 64-bit unsigned value.
-
-  @return The byte swaped Operand.
-
-**/
-UINT64
-EFIAPI
-SwapBytes64 (
-  IN      UINT64                    Value
-  );
-
-
-/**
-  Multiples a 64-bit unsigned integer by a 32-bit unsigned integer and
-  generates a 64-bit unsigned result.
-
-  This function multiples the 64-bit unsigned value Multiplicand by the 32-bit
-  unsigned value Multiplier and generates a 64-bit unsigned result. This 64-
-  bit unsigned result is returned.
-
-  If the result overflows, then ASSERT().
-
-  @param  Multiplicand  A 64-bit unsigned value.
-  @param  Multiplier    A 32-bit unsigned value.
-
-  @return Multiplicand * Multiplier
-
-**/
-UINT64
-EFIAPI
-MultU64x32 (
-  IN      UINT64                    Multiplicand,
-  IN      UINT32                    Multiplier
-  );
-
-
-/**
-  Multiples a 64-bit unsigned integer by a 64-bit unsigned integer and
-  generates a 64-bit unsigned result.
-
-  This function multiples the 64-bit unsigned value Multiplicand by the 64-bit
-  unsigned value Multiplier and generates a 64-bit unsigned result. This 64-
-  bit unsigned result is returned.
-
-  If the result overflows, then ASSERT().
-
-  @param  Multiplicand  A 64-bit unsigned value.
-  @param  Multiplier    A 64-bit unsigned value.
-
-  @return Multiplicand * Multiplier
-
-**/
-UINT64
-EFIAPI
-MultU64x64 (
-  IN      UINT64                    Multiplicand,
-  IN      UINT64                    Multiplier
-  );
-
-
-/**
-  Multiples a 64-bit signed integer by a 64-bit signed integer and generates a
-  64-bit signed result.
-
-  This function multiples the 64-bit signed value Multiplicand by the 64-bit
-  signed value Multiplier and generates a 64-bit signed result. This 64-bit
-  signed result is returned.
-
-  If the result overflows, then ASSERT().
-
-  @param  Multiplicand  A 64-bit signed value.
-  @param  Multiplier    A 64-bit signed value.
-
-  @return Multiplicand * Multiplier
-
-**/
-INT64
-EFIAPI
-MultS64x64 (
-  IN      INT64                     Multiplicand,
-  IN      INT64                     Multiplier
-  );
-
-
-/**
-  Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates
-  a 64-bit unsigned result.
-
-  This function divides the 64-bit unsigned value Dividend by the 32-bit
-  unsigned value Divisor and generates a 64-bit unsigned quotient. This
-  function returns the 64-bit unsigned quotient.
-
-  If Divisor is 0, then ASSERT().
-
-  @param  Dividend  A 64-bit unsigned value.
-  @param  Divisor   A 32-bit unsigned value.
-
-  @return Dividend / Divisor
-
-**/
-UINT64
-EFIAPI
-DivU64x32 (
-  IN      UINT64                    Dividend,
-  IN      UINT32                    Divisor
-  );
-
-
-/**
-  Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates
-  a 32-bit unsigned remainder.
-
-  This function divides the 64-bit unsigned value Dividend by the 32-bit
-  unsigned value Divisor and generates a 32-bit remainder. This function
-  returns the 32-bit unsigned remainder.
-
-  If Divisor is 0, then ASSERT().
-
-  @param  Dividend  A 64-bit unsigned value.
-  @param  Divisor   A 32-bit unsigned value.
-
-  @return Dividend % Divisor
-
-**/
-UINT32
-EFIAPI
-ModU64x32 (
-  IN      UINT64                    Dividend,
-  IN      UINT32                    Divisor
-  );
-
-
-/**
-  Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates
-  a 64-bit unsigned result and an optional 32-bit unsigned remainder.
-
-  This function divides the 64-bit unsigned value Dividend by the 32-bit
-  unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder
-  is not NULL, then the 32-bit unsigned remainder is returned in Remainder.
-  This function returns the 64-bit unsigned quotient.
-
-  If Divisor is 0, then ASSERT().
-
-  @param  Dividend  A 64-bit unsigned value.
-  @param  Divisor   A 32-bit unsigned value.
-  @param  Remainder A pointer to a 32-bit unsigned value. This parameter is
-                    optional and may be NULL.
-
-  @return Dividend / Divisor
-
-**/
-UINT64
-EFIAPI
-DivU64x32Remainder (
-  IN      UINT64                    Dividend,
-  IN      UINT32                    Divisor,
-  OUT     UINT32                    *Remainder  OPTIONAL
-  );
-
-
-/**
-  Divides a 64-bit unsigned integer by a 64-bit unsigned integer and generates
-  a 64-bit unsigned result and an optional 64-bit unsigned remainder.
-
-  This function divides the 64-bit unsigned value Dividend by the 64-bit
-  unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder
-  is not NULL, then the 64-bit unsigned remainder is returned in Remainder.
-  This function returns the 64-bit unsigned quotient.
-
-  If Divisor is 0, then ASSERT().
-
-  @param  Dividend  A 64-bit unsigned value.
-  @param  Divisor   A 64-bit unsigned value.
-  @param  Remainder A pointer to a 64-bit unsigned value. This parameter is
-                    optional and may be NULL.
-
-  @return Dividend / Divisor
-
-**/
-UINT64
-EFIAPI
-DivU64x64Remainder (
-  IN      UINT64                    Dividend,
-  IN      UINT64                    Divisor,
-  OUT     UINT64                    *Remainder  OPTIONAL
-  );
-
-
-/**
-  Divides a 64-bit signed integer by a 64-bit signed integer and generates a
-  64-bit signed result and a optional 64-bit signed remainder.
-
-  This function divides the 64-bit signed value Dividend by the 64-bit signed
-  value Divisor and generates a 64-bit signed quotient. If Remainder is not
-  NULL, then the 64-bit signed remainder is returned in Remainder. This
-  function returns the 64-bit signed quotient.
-
-  If Divisor is 0, then ASSERT().
-
-  @param  Dividend  A 64-bit signed value.
-  @param  Divisor   A 64-bit signed value.
-  @param  Remainder A pointer to a 64-bit signed value. This parameter is
-                    optional and may be NULL.
-
-  @return Dividend / Divisor
-
-**/
-INT64
-EFIAPI
-DivS64x64Remainder (
-  IN      INT64                     Dividend,
-  IN      INT64                     Divisor,
-  OUT     INT64                     *Remainder  OPTIONAL
-  );
-
-
-/**
-  Reads a 16-bit value from memory that may be unaligned.
-
-  This function returns the 16-bit value pointed to by Buffer. The function
-  guarantees that the read operation does not produce an alignment fault.
-
-  If the Buffer is NULL, then ASSERT().
-
-  @param  Uint16  Pointer to a 16-bit value that may be unaligned.
-
-  @return *Uint16
-
-**/
-UINT16
-EFIAPI
-ReadUnaligned16 (
-  IN      CONST UINT16              *Uint16
-  );
-
-
-/**
-  Writes a 16-bit value to memory that may be unaligned.
-
-  This function writes the 16-bit value specified by Value to Buffer. Value is
-  returned. The function guarantees that the write operation does not produce
-  an alignment fault.
-
-  If the Buffer is NULL, then ASSERT().
-
-  @param  Uint16  Pointer to a 16-bit value that may be unaligned.
-  @param  Value   16-bit value to write to Buffer.
-
-  @return Value
-
-**/
-UINT16
-EFIAPI
-WriteUnaligned16 (
-  OUT     UINT16                    *Uint16,
-  IN      UINT16                    Value
-  );
-
-
-/**
-  Reads a 24-bit value from memory that may be unaligned.
-
-  This function returns the 24-bit value pointed to by Buffer. The function
-  guarantees that the read operation does not produce an alignment fault.
-
-  If the Buffer is NULL, then ASSERT().
-
-  @param  Buffer  Pointer to a 24-bit value that may be unaligned.
-
-  @return The value read.
-
-**/
-UINT32
-EFIAPI
-ReadUnaligned24 (
-  IN      CONST UINT32              *Buffer
-  );
-
-
-/**
-  Writes a 24-bit value to memory that may be unaligned.
-
-  This function writes the 24-bit value specified by Value to Buffer. Value is
-  returned. The function guarantees that the write operation does not produce
-  an alignment fault.
-
-  If the Buffer is NULL, then ASSERT().
-
-  @param  Buffer  Pointer to a 24-bit value that may be unaligned.
-  @param  Value   24-bit value to write to Buffer.
-
-  @return The value written.
-
-**/
-UINT32
-EFIAPI
-WriteUnaligned24 (
-  OUT     UINT32                    *Buffer,
-  IN      UINT32                    Value
-  );
-
-
-/**
-  Reads a 32-bit value from memory that may be unaligned.
-
-  This function returns the 32-bit value pointed to by Buffer. The function
-  guarantees that the read operation does not produce an alignment fault.
-
-  If the Buffer is NULL, then ASSERT().
-
-  @param  Uint32  Pointer to a 32-bit value that may be unaligned.
-
-  @return *Uint32
-
-**/
-UINT32
-EFIAPI
-ReadUnaligned32 (
-  IN      CONST UINT32              *Uint32
-  );
-
-
-/**
-  Writes a 32-bit value to memory that may be unaligned.
-
-  This function writes the 32-bit value specified by Value to Buffer. Value is
-  returned. The function guarantees that the write operation does not produce
-  an alignment fault.
-
-  If the Buffer is NULL, then ASSERT().
-
-  @param  Uint32  Pointer to a 32-bit value that may be unaligned.
-  @param  Value   32-bit value to write to Buffer.
-
-  @return Value
-
-**/
-UINT32
-EFIAPI
-WriteUnaligned32 (
-  OUT     UINT32                    *Uint32,
-  IN      UINT32                    Value
-  );
-
-
-/**
-  Reads a 64-bit value from memory that may be unaligned.
-
-  This function returns the 64-bit value pointed to by Buffer. The function
-  guarantees that the read operation does not produce an alignment fault.
-
-  If the Buffer is NULL, then ASSERT().
-
-  @param  Uint64  Pointer to a 64-bit value that may be unaligned.
-
-  @return *Uint64
-
-**/
-UINT64
-EFIAPI
-ReadUnaligned64 (
-  IN      CONST UINT64              *Uint64
-  );
-
-
-/**
-  Writes a 64-bit value to memory that may be unaligned.
-
-  This function writes the 64-bit value specified by Value to Buffer. Value is
-  returned. The function guarantees that the write operation does not produce
-  an alignment fault.
-
-  If the Buffer is NULL, then ASSERT().
-
-  @param  Uint64  Pointer to a 64-bit value that may be unaligned.
-  @param  Value   64-bit value to write to Buffer.
-
-  @return Value
-
-**/
-UINT64
-EFIAPI
-WriteUnaligned64 (
-  OUT     UINT64                    *Uint64,
-  IN      UINT64                    Value
-  );
-
-
-//
-// Bit Field Functions
-//
-
-/**
-  Returns a bit field from an 8-bit value.
-
-  Returns the bitfield specified by the StartBit and the EndBit from Operand.
-
-  If 8-bit operations are not supported, then ASSERT().
-  If StartBit is greater than 7, then ASSERT().
-  If EndBit is greater than 7, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Operand   Operand on which to perform the bitfield operation.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..7.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..7.
-
-  @return The bit field read.
-
-**/
-UINT8
-EFIAPI
-BitFieldRead8 (
-  IN      UINT8                     Operand,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit
-  );
-
-
-/**
-  Writes a bit field to an 8-bit value, and returns the result.
-
-  Writes Value to the bit field specified by the StartBit and the EndBit in
-  Operand. All other bits in Operand are preserved. The new 8-bit value is
-  returned.
-
-  If 8-bit operations are not supported, then ASSERT().
-  If StartBit is greater than 7, then ASSERT().
-  If EndBit is greater than 7, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Operand   Operand on which to perform the bitfield operation.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..7.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..7.
-  @param  Value     New value of the bit field.
-
-  @return The new 8-bit value.
-
-**/
-UINT8
-EFIAPI
-BitFieldWrite8 (
-  IN      UINT8                     Operand,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT8                     Value
-  );
-
-
-/**
-  Reads a bit field from an 8-bit value, performs a bitwise OR, and returns the
-  result.
-
-  Performs a bitwise inclusive OR between the bit field specified by StartBit
-  and EndBit in Operand and the value specified by OrData. All other bits in
-  Operand are preserved. The new 8-bit value is returned.
-
-  If 8-bit operations are not supported, then ASSERT().
-  If StartBit is greater than 7, then ASSERT().
-  If EndBit is greater than 7, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Operand   Operand on which to perform the bitfield operation.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..7.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..7.
-  @param  OrData    The value to OR with the read value from the value
-
-  @return The new 8-bit value.
-
-**/
-UINT8
-EFIAPI
-BitFieldOr8 (
-  IN      UINT8                     Operand,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT8                     OrData
-  );
-
-
-/**
-  Reads a bit field from an 8-bit value, performs a bitwise AND, and returns
-  the result.
-
-  Performs a bitwise AND between the bit field specified by StartBit and EndBit
-  in Operand and the value specified by AndData. All other bits in Operand are
-  preserved. The new 8-bit value is returned.
-
-  If 8-bit operations are not supported, then ASSERT().
-  If StartBit is greater than 7, then ASSERT().
-  If EndBit is greater than 7, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Operand   Operand on which to perform the bitfield operation.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..7.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..7.
-  @param  AndData   The value to AND with the read value from the value.
-
-  @return The new 8-bit value.
-
-**/
-UINT8
-EFIAPI
-BitFieldAnd8 (
-  IN      UINT8                     Operand,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT8                     AndData
-  );
-
-
-/**
-  Reads a bit field from an 8-bit value, performs a bitwise AND followed by a
-  bitwise OR, and returns the result.
-
-  Performs a bitwise AND between the bit field specified by StartBit and EndBit
-  in Operand and the value specified by AndData, followed by a bitwise
-  inclusive OR with value specified by OrData. All other bits in Operand are
-  preserved. The new 8-bit value is returned.
-
-  If 8-bit operations are not supported, then ASSERT().
-  If StartBit is greater than 7, then ASSERT().
-  If EndBit is greater than 7, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Operand   Operand on which to perform the bitfield operation.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..7.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..7.
-  @param  AndData   The value to AND with the read value from the value.
-  @param  OrData    The value to OR with the result of the AND operation.
-
-  @return The new 8-bit value.
-
-**/
-UINT8
-EFIAPI
-BitFieldAndThenOr8 (
-  IN      UINT8                     Operand,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT8                     AndData,
-  IN      UINT8                     OrData
-  );
-
-
-/**
-  Returns a bit field from a 16-bit value.
-
-  Returns the bitfield specified by the StartBit and the EndBit from Operand.
-
-  If 16-bit operations are not supported, then ASSERT().
-  If StartBit is greater than 15, then ASSERT().
-  If EndBit is greater than 15, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Operand   Operand on which to perform the bitfield operation.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..15.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..15.
-
-  @return The bit field read.
-
-**/
-UINT16
-EFIAPI
-BitFieldRead16 (
-  IN      UINT16                    Operand,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit
-  );
-
-
-/**
-  Writes a bit field to a 16-bit value, and returns the result.
-
-  Writes Value to the bit field specified by the StartBit and the EndBit in
-  Operand. All other bits in Operand are preserved. The new 16-bit value is
-  returned.
-
-  If 16-bit operations are not supported, then ASSERT().
-  If StartBit is greater than 15, then ASSERT().
-  If EndBit is greater than 15, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Operand   Operand on which to perform the bitfield operation.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..15.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..15.
-  @param  Value     New value of the bit field.
-
-  @return The new 16-bit value.
-
-**/
-UINT16
-EFIAPI
-BitFieldWrite16 (
-  IN      UINT16                    Operand,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT16                    Value
-  );
-
-
-/**
-  Reads a bit field from a 16-bit value, performs a bitwise OR, and returns the
-  result.
-
-  Performs a bitwise inclusive OR between the bit field specified by StartBit
-  and EndBit in Operand and the value specified by OrData. All other bits in
-  Operand are preserved. The new 16-bit value is returned.
-
-  If 16-bit operations are not supported, then ASSERT().
-  If StartBit is greater than 15, then ASSERT().
-  If EndBit is greater than 15, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Operand   Operand on which to perform the bitfield operation.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..15.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..15.
-  @param  OrData    The value to OR with the read value from the value
-
-  @return The new 16-bit value.
-
-**/
-UINT16
-EFIAPI
-BitFieldOr16 (
-  IN      UINT16                    Operand,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT16                    OrData
-  );
-
-
-/**
-  Reads a bit field from a 16-bit value, performs a bitwise AND, and returns
-  the result.
-
-  Performs a bitwise AND between the bit field specified by StartBit and EndBit
-  in Operand and the value specified by AndData. All other bits in Operand are
-  preserved. The new 16-bit value is returned.
-
-  If 16-bit operations are not supported, then ASSERT().
-  If StartBit is greater than 15, then ASSERT().
-  If EndBit is greater than 15, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Operand   Operand on which to perform the bitfield operation.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..15.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..15.
-  @param  AndData   The value to AND with the read value from the value
-
-  @return The new 16-bit value.
-
-**/
-UINT16
-EFIAPI
-BitFieldAnd16 (
-  IN      UINT16                    Operand,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT16                    AndData
-  );
-
-
-/**
-  Reads a bit field from a 16-bit value, performs a bitwise AND followed by a
-  bitwise OR, and returns the result.
-
-  Performs a bitwise AND between the bit field specified by StartBit and EndBit
-  in Operand and the value specified by AndData, followed by a bitwise
-  inclusive OR with value specified by OrData. All other bits in Operand are
-  preserved. The new 16-bit value is returned.
-
-  If 16-bit operations are not supported, then ASSERT().
-  If StartBit is greater than 15, then ASSERT().
-  If EndBit is greater than 15, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Operand   Operand on which to perform the bitfield operation.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..15.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..15.
-  @param  AndData   The value to AND with the read value from the value.
-  @param  OrData    The value to OR with the result of the AND operation.
-
-  @return The new 16-bit value.
-
-**/
-UINT16
-EFIAPI
-BitFieldAndThenOr16 (
-  IN      UINT16                    Operand,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT16                    AndData,
-  IN      UINT16                    OrData
-  );
-
-
-/**
-  Returns a bit field from a 32-bit value.
-
-  Returns the bitfield specified by the StartBit and the EndBit from Operand.
-
-  If 32-bit operations are not supported, then ASSERT().
-  If StartBit is greater than 31, then ASSERT().
-  If EndBit is greater than 31, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Operand   Operand on which to perform the bitfield operation.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..31.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..31.
-
-  @return The bit field read.
-
-**/
-UINT32
-EFIAPI
-BitFieldRead32 (
-  IN      UINT32                    Operand,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit
-  );
-
-
-/**
-  Writes a bit field to a 32-bit value, and returns the result.
-
-  Writes Value to the bit field specified by the StartBit and the EndBit in
-  Operand. All other bits in Operand are preserved. The new 32-bit value is
-  returned.
-
-  If 32-bit operations are not supported, then ASSERT().
-  If StartBit is greater than 31, then ASSERT().
-  If EndBit is greater than 31, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Operand   Operand on which to perform the bitfield operation.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..31.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..31.
-  @param  Value     New value of the bit field.
-
-  @return The new 32-bit value.
-
-**/
-UINT32
-EFIAPI
-BitFieldWrite32 (
-  IN      UINT32                    Operand,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT32                    Value
-  );
-
-
-/**
-  Reads a bit field from a 32-bit value, performs a bitwise OR, and returns the
-  result.
-
-  Performs a bitwise inclusive OR between the bit field specified by StartBit
-  and EndBit in Operand and the value specified by OrData. All other bits in
-  Operand are preserved. The new 32-bit value is returned.
-
-  If 32-bit operations are not supported, then ASSERT().
-  If StartBit is greater than 31, then ASSERT().
-  If EndBit is greater than 31, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Operand   Operand on which to perform the bitfield operation.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..31.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..31.
-  @param  OrData    The value to OR with the read value from the value
-
-  @return The new 32-bit value.
-
-**/
-UINT32
-EFIAPI
-BitFieldOr32 (
-  IN      UINT32                    Operand,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT32                    OrData
-  );
-
-
-/**
-  Reads a bit field from a 32-bit value, performs a bitwise AND, and returns
-  the result.
-
-  Performs a bitwise AND between the bit field specified by StartBit and EndBit
-  in Operand and the value specified by AndData. All other bits in Operand are
-  preserved. The new 32-bit value is returned.
-
-  If 32-bit operations are not supported, then ASSERT().
-  If StartBit is greater than 31, then ASSERT().
-  If EndBit is greater than 31, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Operand   Operand on which to perform the bitfield operation.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..31.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..31.
-  @param  AndData   The value to AND with the read value from the value
-
-  @return The new 32-bit value.
-
-**/
-UINT32
-EFIAPI
-BitFieldAnd32 (
-  IN      UINT32                    Operand,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT32                    AndData
-  );
-
-
-/**
-  Reads a bit field from a 32-bit value, performs a bitwise AND followed by a
-  bitwise OR, and returns the result.
-
-  Performs a bitwise AND between the bit field specified by StartBit and EndBit
-  in Operand and the value specified by AndData, followed by a bitwise
-  inclusive OR with value specified by OrData. All other bits in Operand are
-  preserved. The new 32-bit value is returned.
-
-  If 32-bit operations are not supported, then ASSERT().
-  If StartBit is greater than 31, then ASSERT().
-  If EndBit is greater than 31, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Operand   Operand on which to perform the bitfield operation.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..31.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..31.
-  @param  AndData   The value to AND with the read value from the value.
-  @param  OrData    The value to OR with the result of the AND operation.
-
-  @return The new 32-bit value.
-
-**/
-UINT32
-EFIAPI
-BitFieldAndThenOr32 (
-  IN      UINT32                    Operand,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT32                    AndData,
-  IN      UINT32                    OrData
-  );
-
-
-/**
-  Returns a bit field from a 64-bit value.
-
-  Returns the bitfield specified by the StartBit and the EndBit from Operand.
-
-  If 64-bit operations are not supported, then ASSERT().
-  If StartBit is greater than 63, then ASSERT().
-  If EndBit is greater than 63, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Operand   Operand on which to perform the bitfield operation.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..63.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..63.
-
-  @return The bit field read.
-
-**/
-UINT64
-EFIAPI
-BitFieldRead64 (
-  IN      UINT64                    Operand,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit
-  );
-
-
-/**
-  Writes a bit field to a 64-bit value, and returns the result.
-
-  Writes Value to the bit field specified by the StartBit and the EndBit in
-  Operand. All other bits in Operand are preserved. The new 64-bit value is
-  returned.
-
-  If 64-bit operations are not supported, then ASSERT().
-  If StartBit is greater than 63, then ASSERT().
-  If EndBit is greater than 63, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Operand   Operand on which to perform the bitfield operation.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..63.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..63.
-  @param  Value     New value of the bit field.
-
-  @return The new 64-bit value.
-
-**/
-UINT64
-EFIAPI
-BitFieldWrite64 (
-  IN      UINT64                    Operand,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT64                    Value
-  );
-
-
-/**
-  Reads a bit field from a 64-bit value, performs a bitwise OR, and returns the
-  result.
-
-  Performs a bitwise inclusive OR between the bit field specified by StartBit
-  and EndBit in Operand and the value specified by OrData. All other bits in
-  Operand are preserved. The new 64-bit value is returned.
-
-  If 64-bit operations are not supported, then ASSERT().
-  If StartBit is greater than 63, then ASSERT().
-  If EndBit is greater than 63, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Operand   Operand on which to perform the bitfield operation.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..63.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..63.
-  @param  OrData    The value to OR with the read value from the value
-
-  @return The new 64-bit value.
-
-**/
-UINT64
-EFIAPI
-BitFieldOr64 (
-  IN      UINT64                    Operand,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT64                    OrData
-  );
-
-
-/**
-  Reads a bit field from a 64-bit value, performs a bitwise AND, and returns
-  the result.
-
-  Performs a bitwise AND between the bit field specified by StartBit and EndBit
-  in Operand and the value specified by AndData. All other bits in Operand are
-  preserved. The new 64-bit value is returned.
-
-  If 64-bit operations are not supported, then ASSERT().
-  If StartBit is greater than 63, then ASSERT().
-  If EndBit is greater than 63, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Operand   Operand on which to perform the bitfield operation.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..63.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..63.
-  @param  AndData   The value to AND with the read value from the value
-
-  @return The new 64-bit value.
-
-**/
-UINT64
-EFIAPI
-BitFieldAnd64 (
-  IN      UINT64                    Operand,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT64                    AndData
-  );
-
-
-/**
-  Reads a bit field from a 64-bit value, performs a bitwise AND followed by a
-  bitwise OR, and returns the result.
-
-  Performs a bitwise AND between the bit field specified by StartBit and EndBit
-  in Operand and the value specified by AndData, followed by a bitwise
-  inclusive OR with value specified by OrData. All other bits in Operand are
-  preserved. The new 64-bit value is returned.
-
-  If 64-bit operations are not supported, then ASSERT().
-  If StartBit is greater than 63, then ASSERT().
-  If EndBit is greater than 63, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Operand   Operand on which to perform the bitfield operation.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..63.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..63.
-  @param  AndData   The value to AND with the read value from the value.
-  @param  OrData    The value to OR with the result of the AND operation.
-
-  @return The new 64-bit value.
-
-**/
-UINT64
-EFIAPI
-BitFieldAndThenOr64 (
-  IN      UINT64                    Operand,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT64                    AndData,
-  IN      UINT64                    OrData
-  );
-
-
-//
-// Base Library Synchronization Functions
-//
-
-/**
-  Retrieves the architecture specific spin lock alignment requirements for
-  optimal spin lock performance.
-
-  This function retrieves the spin lock alignment requirements for optimal
-  performance on a given CPU architecture. The spin lock alignment must be a
-  power of two and is returned by this function. If there are no alignment
-  requirements, then 1 must be returned. The spin lock synchronization
-  functions must function correctly if the spin lock size and alignment values
-  returned by this function are not used at all. These values are hints to the
-  consumers of the spin lock synchronization functions to obtain optimal spin
-  lock performance.
-
-  @return The architecture specific spin lock alignment.
-
-**/
-UINTN
-EFIAPI
-GetSpinLockProperties (
-  VOID
-  );
-
-
-/**
-  Initializes a spin lock to the released state and returns the spin lock.
-
-  This function initializes the spin lock specified by SpinLock to the released
-  state, and returns SpinLock. Optimal performance can be achieved by calling
-  GetSpinLockProperties() to determine the size and alignment requirements for
-  SpinLock.
-
-  If SpinLock is NULL, then ASSERT().
-
-  @param  SpinLock  A pointer to the spin lock to initialize to the released
-                    state.
-
-  @return SpinLock
-
-**/
-SPIN_LOCK *
-EFIAPI
-InitializeSpinLock (
-  IN      SPIN_LOCK                 *SpinLock
-  );
-
-
-/**
-  Waits until a spin lock can be placed in the acquired state.
-
-  This function checks the state of the spin lock specified by SpinLock. If
-  SpinLock is in the released state, then this function places SpinLock in the
-  acquired state and returns SpinLock. Otherwise, this function waits
-  indefinitely for the spin lock to be released, and then places it in the
-  acquired state and returns SpinLock. All state transitions of SpinLock must
-  be performed using MP safe mechanisms.
-
-  If SpinLock is NULL, then ASSERT().
-  If SpinLock was not initialized with InitializeSpinLock(), then ASSERT().
-  If PcdSpinLockTimeout is not zero, and SpinLock is can not be acquired in
-  PcdSpinLockTimeout microseconds, then ASSERT().
-
-  @param  SpinLock  A pointer to the spin lock to place in the acquired state.
-
-  @return SpinLock
-
-**/
-SPIN_LOCK *
-EFIAPI
-AcquireSpinLock (
-  IN      SPIN_LOCK                 *SpinLock
-  );
-
-
-/**
-  Attempts to place a spin lock in the acquired state.
-
-  This function checks the state of the spin lock specified by SpinLock. If
-  SpinLock is in the released state, then this function places SpinLock in the
-  acquired state and returns TRUE. Otherwise, FALSE is returned. All state
-  transitions of SpinLock must be performed using MP safe mechanisms.
-
-  If SpinLock is NULL, then ASSERT().
-  If SpinLock was not initialized with InitializeSpinLock(), then ASSERT().
-
-  @param  SpinLock  A pointer to the spin lock to place in the acquired state.
-
-  @retval TRUE  SpinLock was placed in the acquired state.
-  @retval FALSE SpinLock could not be acquired.
-
-**/
-BOOLEAN
-EFIAPI
-AcquireSpinLockOrFail (
-  IN      SPIN_LOCK                 *SpinLock
-  );
-
-
-/**
-  Releases a spin lock.
-
-  This function places the spin lock specified by SpinLock in the release state
-  and returns SpinLock.
-
-  If SpinLock is NULL, then ASSERT().
-  If SpinLock was not initialized with InitializeSpinLock(), then ASSERT().
-
-  @param  SpinLock  A pointer to the spin lock to release.
-
-  @return SpinLock
-
-**/
-SPIN_LOCK *
-EFIAPI
-ReleaseSpinLock (
-  IN      SPIN_LOCK                 *SpinLock
-  );
-
-
-/**
-  Performs an atomic increment of an 32-bit unsigned integer.
-
-  Performs an atomic increment of the 32-bit unsigned integer specified by
-  Value and returns the incremented value. The increment operation must be
-  performed using MP safe mechanisms. The state of the return value is not
-  guaranteed to be MP safe.
-
-  If Value is NULL, then ASSERT().
-
-  @param  Value A pointer to the 32-bit value to increment.
-
-  @return The incremented value.
-
-**/
-UINT32
-EFIAPI
-InterlockedIncrement (
-  IN      UINT32                    *Value
-  );
-
-
-/**
-  Performs an atomic decrement of an 32-bit unsigned integer.
-
-  Performs an atomic decrement of the 32-bit unsigned integer specified by
-  Value and returns the decremented value. The decrement operation must be
-  performed using MP safe mechanisms. The state of the return value is not
-  guaranteed to be MP safe.
-
-  If Value is NULL, then ASSERT().
-
-  @param  Value A pointer to the 32-bit value to decrement.
-
-  @return The decremented value.
-
-**/
-UINT32
-EFIAPI
-InterlockedDecrement (
-  IN      UINT32                    *Value
-  );
-
-
-/**
-  Performs an atomic compare exchange operation on a 32-bit unsigned integer.
-
-  Performs an atomic compare exchange operation on the 32-bit unsigned integer
-  specified by Value.  If Value is equal to CompareValue, then Value is set to
-  ExchangeValue and CompareValue is returned.  If Value is not equal to CompareValue,
-  then Value is returned.  The compare exchange operation must be performed using
-  MP safe mechanisms.
-
-  If Value is NULL, then ASSERT().
-
-  @param  Value         A pointer to the 32-bit value for the compare exchange
-                        operation.
-  @param  CompareValue  32-bit value used in compare operation.
-  @param  ExchangeValue 32-bit value used in exchange operation.
-
-  @return The original *Value before exchange.
-
-**/
-UINT32
-EFIAPI
-InterlockedCompareExchange32 (
-  IN OUT  UINT32                    *Value,
-  IN      UINT32                    CompareValue,
-  IN      UINT32                    ExchangeValue
-  );
-
-
-/**
-  Performs an atomic compare exchange operation on a 64-bit unsigned integer.
-
-  Performs an atomic compare exchange operation on the 64-bit unsigned integer specified
-  by Value.  If Value is equal to CompareValue, then Value is set to ExchangeValue and
-  CompareValue is returned.  If Value is not equal to CompareValue, then Value is returned.
-  The compare exchange operation must be performed using MP safe mechanisms.
-
-  If Value is NULL, then ASSERT().
-
-  @param  Value         A pointer to the 64-bit value for the compare exchange
-                        operation.
-  @param  CompareValue  64-bit value used in compare operation.
-  @param  ExchangeValue 64-bit value used in exchange operation.
-
-  @return The original *Value before exchange.
-
-**/
-UINT64
-EFIAPI
-InterlockedCompareExchange64 (
-  IN OUT  UINT64                    *Value,
-  IN      UINT64                    CompareValue,
-  IN      UINT64                    ExchangeValue
-  );
-
-
-/**
-  Performs an atomic compare exchange operation on a pointer value.
-
-  Performs an atomic compare exchange operation on the pointer value specified
-  by Value. If Value is equal to CompareValue, then Value is set to
-  ExchangeValue and CompareValue is returned. If Value is not equal to
-  CompareValue, then Value is returned. The compare exchange operation must be
-  performed using MP safe mechanisms.
-
-  If Value is NULL, then ASSERT().
-
-  @param  Value         A pointer to the pointer value for the compare exchange
-                        operation.
-  @param  CompareValue  Pointer value used in compare operation.
-  @param  ExchangeValue Pointer value used in exchange operation.
-
-**/
-VOID *
-EFIAPI
-InterlockedCompareExchangePointer (
-  IN OUT  VOID                      **Value,
-  IN      VOID                      *CompareValue,
-  IN      VOID                      *ExchangeValue
-  );
-
-
-//
-// Base Library Checksum Functions
-//
-
-/**
-  Calculate the sum of all elements in a buffer in unit of UINT8.
-  During calculation, the carry bits are dropped.
-
-  This function calculates the sum of all elements in a buffer
-  in unit of UINT8. The carry bits in result of addition are dropped.
-  The result is returned as UINT8. If Length is Zero, then Zero is
-  returned.
-
-  If Buffer is NULL, then ASSERT().
-  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
-
-  @param  Buffer                       Pointer to the buffer to carry out the sum operation.
-  @param  Length           The size, in bytes, of Buffer .
-
-  @return Sum         The sum of Buffer with carry bits dropped during additions.
-
-**/
-UINT8
-EFIAPI
-CalculateSum8 (
-  IN      CONST UINT8                  *Buffer,
-  IN      UINTN                                      Length
-  );
-
-
-/**
-  Returns the two's complement checksum of all elements in a buffer
-  of 8-bit values.
-
-  This function first calculates the sum of the 8-bit values in the
-  buffer specified by Buffer and Length.  The carry bits in the result
-  of addition are dropped. Then, the two's complement of the sum is
-  returned.  If Length is 0, then 0 is returned.
-
-  If Buffer is NULL, then ASSERT().
-  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
-
-
-  @param  Buffer                       Pointer to the buffer to carry out the checksum operation.
-  @param  Length           The size, in bytes, of Buffer.
-
-  @return Checksum       The 2's complement checksum of Buffer.
-
-**/
-UINT8
-EFIAPI
-CalculateCheckSum8 (
-  IN      CONST UINT8                  *Buffer,
-  IN      UINTN                                      Length
-  );
-
-
-/**
-  Returns the sum of all elements in a buffer of 16-bit values.  During
-  calculation, the carry bits are dropped.
-
-  This function calculates the sum of the 16-bit values in the buffer
-  specified by Buffer and Length. The carry bits in result of addition are dropped.
-  The 16-bit result is returned.  If Length is 0, then 0 is returned.
-
-  If Buffer is NULL, then ASSERT().
-  If Buffer is not aligned on a 16-bit boundary, then ASSERT().
-  If Length is not aligned on a 16-bit boundary, then ASSERT().
-  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
-
-  @param  Buffer                       Pointer to the buffer to carry out the sum operation.
-  @param  Length           The size, in bytes, of Buffer.
-
-  @return Sum         The sum of Buffer with carry bits dropped during additions.
-
-**/
-UINT16
-EFIAPI
-CalculateSum16 (
-  IN      CONST UINT16                 *Buffer,
-  IN      UINTN                                      Length
-  );
-
-
-/**
-  Returns the two's complement checksum of all elements in a buffer of
-  16-bit values.
-
-  This function first calculates the sum of the 16-bit values in the buffer
-  specified by Buffer and Length.  The carry bits in the result of addition
-  are dropped. Then, the two's complement of the sum is returned.  If Length
-  is 0, then 0 is returned.
-
-  If Buffer is NULL, then ASSERT().
-  If Buffer is not aligned on a 16-bit boundary, then ASSERT().
-  If Length is not aligned on a 16-bit boundary, then ASSERT().
-  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
-
-  @param  Buffer                       Pointer to the buffer to carry out the checksum operation.
-  @param  Length           The size, in bytes, of Buffer.
-
-  @return Checksum       The 2's complement checksum of Buffer.
-
-**/
-UINT16
-EFIAPI
-CalculateCheckSum16 (
-  IN      CONST UINT16                 *Buffer,
-  IN      UINTN                                      Length
-  );
-
-
-/**
-  Returns the sum of all elements in a buffer of 32-bit values.  During
-  calculation, the carry bits are dropped.
-
-  This function calculates the sum of the 32-bit values in the buffer
-  specified by Buffer and Length. The carry bits in result of addition are dropped.
-  The 32-bit result is returned.  If Length is 0, then 0 is returned.
-
-  If Buffer is NULL, then ASSERT().
-  If Buffer is not aligned on a 32-bit boundary, then ASSERT().
-  If Length is not aligned on a 32-bit boundary, then ASSERT().
-  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
-
-  @param  Buffer                       Pointer to the buffer to carry out the sum operation.
-  @param  Length           The size, in bytes, of Buffer.
-
-  @return Sum         The sum of Buffer with carry bits dropped during additions.
-
-**/
-UINT32
-EFIAPI
-CalculateSum32 (
-  IN      CONST UINT32                 *Buffer,
-  IN      UINTN                                      Length
-  );
-
-
-/**
-  Returns the two's complement checksum of all elements in a buffer of
-  32-bit values.
-
-  This function first calculates the sum of the 32-bit values in the buffer
-  specified by Buffer and Length.  The carry bits in the result of addition
-  are dropped. Then, the two's complement of the sum is returned.  If Length
-  is 0, then 0 is returned.
-
-  If Buffer is NULL, then ASSERT().
-  If Buffer is not aligned on a 32-bit boundary, then ASSERT().
-  If Length is not aligned on a 32-bit boundary, then ASSERT().
-  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
-
-  @param  Buffer                       Pointer to the buffer to carry out the checksum operation.
-  @param  Length           The size, in bytes, of Buffer.
-
-  @return Checksum       The 2's complement checksum of Buffer.
-
-**/
-UINT32
-EFIAPI
-CalculateCheckSum32 (
-  IN      CONST UINT32                 *Buffer,
-  IN      UINTN                                      Length
-  );
-
-
-/**
-  Returns the sum of all elements in a buffer of 64-bit values.  During
-  calculation, the carry bits are dropped.
-
-  This function calculates the sum of the 64-bit values in the buffer
-  specified by Buffer and Length. The carry bits in result of addition are dropped.
-  The 64-bit result is returned.  If Length is 0, then 0 is returned.
-
-  If Buffer is NULL, then ASSERT().
-  If Buffer is not aligned on a 64-bit boundary, then ASSERT().
-  If Length is not aligned on a 64-bit boundary, then ASSERT().
-  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
-
-  @param  Buffer                       Pointer to the buffer to carry out the sum operation.
-  @param  Length           The size, in bytes, of Buffer.
-
-  @return Sum         The sum of Buffer with carry bits dropped during additions.
-
-**/
-UINT64
-EFIAPI
-CalculateSum64 (
-  IN      CONST UINT64                 *Buffer,
-  IN      UINTN                                      Length
-  );
-
-
-/**
-  Returns the two's complement checksum of all elements in a buffer of
-  64-bit values.
-
-  This function first calculates the sum of the 64-bit values in the buffer
-  specified by Buffer and Length.  The carry bits in the result of addition
-  are dropped. Then, the two's complement of the sum is returned.  If Length
-  is 0, then 0 is returned.
-
-  If Buffer is NULL, then ASSERT().
-  If Buffer is not aligned on a 64-bit boundary, then ASSERT().
-  If Length is not aligned on a 64-bit boundary, then ASSERT().
-  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
-
-  @param  Buffer                       Pointer to the buffer to carry out the checksum operation.
-  @param  Length           The size, in bytes, of Buffer.
-
-  @return Checksum       The 2's complement checksum of Buffer.
-
-**/
-UINT64
-EFIAPI
-CalculateCheckSum64 (
-  IN      CONST UINT64                 *Buffer,
-  IN      UINTN                                      Length
-  );
-
-
-//
-// Base Library CPU Functions
-//
-typedef
-VOID
-(EFIAPI *SWITCH_STACK_ENTRY_POINT) (
-  IN      VOID                      *Context1,  OPTIONAL
-  IN      VOID                      *Context2   OPTIONAL
-  );
-
-
-/**
-  Used to serialize load and store operations.
-
-  All loads and stores that proceed calls to this function are guaranteed to be
-  globally visible when this function returns.
-
-**/
-VOID
-EFIAPI
-MemoryFence (
-  VOID
-  );
-
-
-/**
-  Saves the current CPU context that can be restored with a call to LongJump()
-  and returns 0.
-
-  Saves the current CPU context in the buffer specified by JumpBuffer and
-  returns 0. The initial call to SetJump() must always return 0. Subsequent
-  calls to LongJump() cause a non-zero value to be returned by SetJump().
-
-  If JumpBuffer is NULL, then ASSERT().
-  For IPF CPUs, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().
-
-  @param  JumpBuffer  A pointer to CPU context buffer.
-
-  @retval 0 Indicates a return from SetJump().
-
-**/
-UINTN
-EFIAPI
-SetJump (
-  OUT     BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer
-  );
-
-
-/**
-  Restores the CPU context that was saved with SetJump().
-
-  Restores the CPU context from the buffer specified by JumpBuffer. This
-  function never returns to the caller. Instead is resumes execution based on
-  the state of JumpBuffer.
-
-  If JumpBuffer is NULL, then ASSERT().
-  For IPF CPUs, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().
-  If Value is 0, then ASSERT().
-
-  @param  JumpBuffer  A pointer to CPU context buffer.
-  @param  Value       The value to return when the SetJump() context is
-                      restored and must be non-zero.
-
-**/
-VOID
-EFIAPI
-LongJump (
-  IN      BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer,
-  IN      UINTN                     Value
-  );
-
-
-/**
-  Enables CPU interrupts.
-
-  Enables CPU interrupts.
-
-**/
-VOID
-EFIAPI
-EnableInterrupts (
-  VOID
-  );
-
-
-/**
-  Disables CPU interrupts.
-
-  Disables CPU interrupts.
-
-**/
-VOID
-EFIAPI
-DisableInterrupts (
-  VOID
-  );
-
-
-/**
-  Disables CPU interrupts and returns the interrupt state prior to the disable
-  operation.
-
-  Disables CPU interrupts and returns the interrupt state prior to the disable
-  operation.
-
-  @retval TRUE  CPU interrupts were enabled on entry to this call.
-  @retval FALSE CPU interrupts were disabled on entry to this call.
-
-**/
-BOOLEAN
-EFIAPI
-SaveAndDisableInterrupts (
-  VOID
-  );
-
-
-/**
-  Enables CPU interrupts for the smallest window required to capture any
-  pending interrupts.
-
-  Enables CPU interrupts for the smallest window required to capture any
-  pending interrupts.
-
-**/
-VOID
-EFIAPI
-EnableDisableInterrupts (
-  VOID
-  );
-
-
-/**
-  Retrieves the current CPU interrupt state.
-
-  Retrieves the current CPU interrupt state. Returns TRUE is interrupts are
-  currently enabled. Otherwise returns FALSE.
-
-  @retval TRUE  CPU interrupts are enabled.
-  @retval FALSE CPU interrupts are disabled.
-
-**/
-BOOLEAN
-EFIAPI
-GetInterruptState (
-  VOID
-  );
-
-
-/**
-  Set the current CPU interrupt state.
-
-  Sets the current CPU interrupt state to the state specified by
-  InterruptState. If InterruptState is TRUE, then interrupts are enabled. If
-  InterruptState is FALSE, then interrupts are disabled. InterruptState is
-  returned.
-
-  @param  InterruptState  TRUE if interrupts should enabled. FALSE if
-                          interrupts should be disabled.
-
-  @return InterruptState
-
-**/
-BOOLEAN
-EFIAPI
-SetInterruptState (
-  IN      BOOLEAN                   InterruptState
-  );
-
-
-/**
-  Requests CPU to pause for a short period of time.
-
-  Requests CPU to pause for a short period of time. Typically used in MP
-  systems to prevent memory starvation while waiting for a spin lock.
-
-**/
-VOID
-EFIAPI
-CpuPause (
-  VOID
-  );
-
-
-/**
-  Transfers control to a function starting with a new stack.
-
-  Transfers control to the function specified by EntryPoint using the
-  new stack specified by NewStack and passing in the parameters specified
-  by Context1 and Context2.  Context1 and Context2 are optional and may
-  be NULL.  The function EntryPoint must never return.  This function
-  supports a variable number of arguments following the NewStack parameter.
-  These additional arguments are ignored on IA-32, x64, and EBC.
-  IPF CPUs expect one additional parameter of type VOID * that specifies
-  the new backing store pointer.
-
-  If EntryPoint is NULL, then ASSERT().
-  If NewStack is NULL, then ASSERT().
-
-  @param  EntryPoint  A pointer to function to call with the new stack.
-  @param  Context1    A pointer to the context to pass into the EntryPoint
-                      function.
-  @param  Context2    A pointer to the context to pass into the EntryPoint
-                      function.
-  @param  NewStack    A pointer to the new stack to use for the EntryPoint
-                      function.
-
-**/
-VOID
-EFIAPI
-SwitchStack (
-  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
-  IN      VOID                      *Context1,  OPTIONAL
-  IN      VOID                      *Context2,  OPTIONAL
-  IN      VOID                      *NewStack,
-  ...
-  );
-
-
-/**
-  Generates a breakpoint on the CPU.
-
-  Generates a breakpoint on the CPU. The breakpoint must be implemented such
-  that code can resume normal execution after the breakpoint.
-
-**/
-VOID
-EFIAPI
-CpuBreakpoint (
-  VOID
-  );
-
-
-/**
-  Executes an infinite loop.
-
-  Forces the CPU to execute an infinite loop. A debugger may be used to skip
-  past the loop and the code that follows the loop must execute properly. This
-  implies that the infinite loop must not cause the code that follow it to be
-  optimized away.
-
-**/
-VOID
-EFIAPI
-CpuDeadLoop (
-  VOID
-  );
-
-
-#if defined (MDE_CPU_IPF)
-
-/**
-  Flush a range of  cache lines in the cache coherency domain of the calling
-  CPU.
-
-  Invalidates the  cache lines specified by Address and Length. If Address is
-  not aligned on a cache line boundary, then entire cache line containing
-  Address is invalidated. If Address + Length is not aligned on a cache line
-  boundary, then the entire instruction cache line containing Address + Length
-  -1 is invalidated. This function may choose to invalidate the entire
-  instruction cache if that is more efficient than invalidating the specified
-  range. If Length is 0, the no instruction cache lines are invalidated.
-  Address is returned.
-
-  If Length is greater than (MAX_ADDRESS - Address + 1), then ASSERT().
-
-  @param  Address The base address of the instruction lines to invalidate. If
-                  the CPU is in a physical addressing mode, then Address is a
-                  physical address. If the CPU is in a virtual addressing mode,
-                  then Address is a virtual address.
-
-  @param  Length  The number of bytes to invalidate from the instruction cache.
-
-  @return Address
-
-**/
-VOID *
-EFIAPI
-IpfFlushCacheRange (
-  IN      VOID                      *Address,
-  IN      UINTN                     Length
-  );
-
-
-/**
-  Executes a FC instruction
-  Executes a FC instruction on the cache line specified by Address.
-  The cache line size affected is at least 32-bytes (aligned on a 32-byte boundary).
-  An implementation may flush a larger region.  This function is only available on IPF.
-
-  @param Address       The Address of cache line to be flushed.
-
-  @return The address of FC instruction executed.
-
-**/
-UINT64
-EFIAPI
-AsmFc (
-  IN  UINT64  Address
-  );
-
-
-/**
-  Executes a FC.I instruction.
-  Executes a FC.I instruction on the cache line specified by Address.
-  The cache line size affected is at least 32-bytes (aligned on a 32-byte boundary).
-  An implementation may flush a larger region.  This function is only available on IPF.
-
-  @param Address       The Address of cache line to be flushed.
-
-  @return The address of FC.I instruction executed.
-
-**/
-UINT64
-EFIAPI
-AsmFci (
-  IN  UINT64  Address
-  );
-
-
-/**
-  Reads the current value of a Processor Identifier Register (CPUID).
-  The Index of largest implemented CPUID (One less than the number of implemented CPUID
-  registers) is determined by CPUID [3] bits {7:0}.
-  No parameter checking is performed on Index.  If the Index value is beyond the
-  implemented CPUID register range, a Reserved Register/Field fault may occur.  The caller
-  must either guarantee that Index is valid, or the caller must set up fault handlers to
-  catch the faults.  This function is only available on IPF.
-
-  @param Index         The 8-bit Processor Identifier Register index to read.
-
-  @return The current value of Processor Identifier Register specified by Index.
-
-**/
-UINT64
-EFIAPI
-AsmReadCpuid (
-  IN  UINT8   Index
-  );
-
-
-/**
-  Reads the current value of 64-bit Processor Status Register (PSR).
-  This function is only available on IPF.
-
-  @return The current value of PSR.
-
-**/
-UINT64
-EFIAPI
-AsmReadPsr (
-  VOID
-  );
-
-
-/**
-  Writes the current value of 64-bit Processor Status Register (PSR).
-  No parameter checking is performed on Value.  All bits of Value corresponding to
-  reserved fields of PSR must be 0 or a Reserved Register/Field fault may occur.  The caller must either guarantee that Value is valid, or the caller must set up fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to PSR.
-
-  @return The 64-bit value written to the PSR.
-
-**/
-UINT64
-EFIAPI
-AsmWritePsr (
-  IN UINT64  Value
-  );
-
-
-/**
-  Reads the current value of 64-bit Kernel Register #0 (KR0).
-  This function is only available on IPF.
-
-  @return The current value of KR0.
-
-**/
-UINT64
-EFIAPI
-AsmReadKr0 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of 64-bit Kernel Register #1 (KR1).
-  This function is only available on IPF.
-
-  @return The current value of KR1.
-
-**/
-UINT64
-EFIAPI
-AsmReadKr1 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of 64-bit Kernel Register #2 (KR2).
-  This function is only available on IPF.
-
-  @return The current value of KR2.
-
-**/
-UINT64
-EFIAPI
-AsmReadKr2 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of 64-bit Kernel Register #3 (KR3).
-  This function is only available on IPF.
-
-  @return The current value of KR3.
-
-**/
-UINT64
-EFIAPI
-AsmReadKr3 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of 64-bit Kernel Register #4 (KR4).
-  This function is only available on IPF.
-
-  @return The current value of KR4.
-
-**/
-UINT64
-EFIAPI
-AsmReadKr4 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of 64-bit Kernel Register #5 (KR5).
-  This function is only available on IPF.
-
-  @return The current value of KR5.
-
-**/
-UINT64
-EFIAPI
-AsmReadKr5 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of 64-bit Kernel Register #6 (KR6).
-  This function is only available on IPF.
-
-  @return The current value of KR6.
-
-**/
-UINT64
-EFIAPI
-AsmReadKr6 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of 64-bit Kernel Register #7 (KR7).
-  This function is only available on IPF.
-
-  @return The current value of KR7.
-
-**/
-UINT64
-EFIAPI
-AsmReadKr7 (
-  VOID
-  );
-
-
-/**
-  Write the current value of 64-bit Kernel Register #0 (KR0).
-  This function is only available on IPF.
-
-  @param  Value        The 64-bit value to write to KR0.
-
-  @return The 64-bit value written to the KR0.
-
-**/
-UINT64
-EFIAPI
-AsmWriteKr0 (
-  IN UINT64  Value
-  );
-
-
-/**
-  Write the current value of 64-bit Kernel Register #1 (KR1).
-  This function is only available on IPF.
-
-  @param  Value        The 64-bit value to write to KR1.
-
-  @return The 64-bit value written to the KR1.
-
-**/
-UINT64
-EFIAPI
-AsmWriteKr1 (
-  IN UINT64  Value
-  );
-
-
-/**
-  Write the current value of 64-bit Kernel Register #2 (KR2).
-  This function is only available on IPF.
-
-  @param  Value        The 64-bit value to write to KR2.
-
-  @return The 64-bit value written to the KR2.
-
-**/
-UINT64
-EFIAPI
-AsmWriteKr2 (
-  IN UINT64  Value
-  );
-
-
-/**
-  Write the current value of 64-bit Kernel Register #3 (KR3).
-  This function is only available on IPF.
-
-  @param  Value        The 64-bit value to write to KR3.
-
-  @return The 64-bit value written to the KR3.
-
-**/
-UINT64
-EFIAPI
-AsmWriteKr3 (
-  IN UINT64  Value
-  );
-
-
-/**
-  Write the current value of 64-bit Kernel Register #4 (KR4).
-  This function is only available on IPF.
-
-  @param  Value        The 64-bit value to write to KR4.
-
-  @return The 64-bit value written to the KR4.
-
-**/
-UINT64
-EFIAPI
-AsmWriteKr4 (
-  IN UINT64  Value
-  );
-
-
-/**
-  Write the current value of 64-bit Kernel Register #5 (KR5).
-  This function is only available on IPF.
-
-  @param  Value        The 64-bit value to write to KR5.
-
-  @return The 64-bit value written to the KR5.
-
-**/
-UINT64
-EFIAPI
-AsmWriteKr5 (
-  IN UINT64  Value
-  );
-
-
-/**
-  Write the current value of 64-bit Kernel Register #6 (KR6).
-  This function is only available on IPF.
-
-  @param  Value        The 64-bit value to write to KR6.
-
-  @return The 64-bit value written to the KR6.
-
-**/
-UINT64
-EFIAPI
-AsmWriteKr6 (
-  IN UINT64  Value
-  );
-
-
-/**
-  Write the current value of 64-bit Kernel Register #7 (KR7).
-  This function is only available on IPF.
-
-  @param  Value        The 64-bit value to write to KR7.
-
-  @return The 64-bit value written to the KR7.
-
-**/
-UINT64
-EFIAPI
-AsmWriteKr7 (
-  IN UINT64  Value
-  );
-
-
-/**
-  Reads the current value of Interval Timer Counter Register (ITC).
-  This function is only available on IPF.
-
-  @return The current value of ITC.
-
-**/
-UINT64
-EFIAPI
-AsmReadItc (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Interval Timer Vector Register (ITV).
-  This function is only available on IPF.
-
-  @return The current value of ITV.
-
-**/
-UINT64
-EFIAPI
-AsmReadItv (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Interval Timer Match Register (ITM).
-  This function is only available on IPF.
-
-  @return The current value of ITM.
-**/
-UINT64
-EFIAPI
-AsmReadItm (
-  VOID
-  );
-
-
-/**
-  Writes the current value of 64-bit Interval Timer Counter Register (ITC).
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to ITC.
-
-  @return The 64-bit value written to the ITC.
-
-**/
-UINT64
-EFIAPI
-AsmWriteItc (
-  IN UINT64  Value
-  );
-
-
-/**
-  Writes the current value of 64-bit Interval Timer Match Register (ITM).
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to ITM.
-
-  @return The 64-bit value written to the ITM.
-
-**/
-UINT64
-EFIAPI
-AsmWriteItm (
-  IN UINT64  Value
-  );
-
-
-/**
-  Writes the current value of 64-bit Interval Timer Vector Register (ITV).
-  No parameter checking is performed on Value.  All bits of Value corresponding to
-  reserved fields of ITV must be 0 or a Reserved Register/Field fault may occur.
-  The caller must either guarantee that Value is valid, or the caller must set up
-  fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to ITV.
-
-  @return The 64-bit value written to the ITV.
-
-**/
-UINT64
-EFIAPI
-AsmWriteItv (
-  IN UINT64  Value
-  );
-
-
-/**
-  Reads the current value of Default Control Register (DCR).
-  This function is only available on IPF.
-
-  @return The current value of DCR.
-
-**/
-UINT64
-EFIAPI
-AsmReadDcr (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Interruption Vector Address Register (IVA).
-  This function is only available on IPF.
-
-  @return The current value of IVA.
-**/
-UINT64
-EFIAPI
-AsmReadIva (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Page Table Address Register (PTA).
-  This function is only available on IPF.
-
-  @return The current value of PTA.
-
-**/
-UINT64
-EFIAPI
-AsmReadPta (
-  VOID
-  );
-
-
-/**
-  Writes the current value of 64-bit Default Control Register (DCR).
-  No parameter checking is performed on Value.  All bits of Value corresponding to
-  reserved fields of DCR must be 0 or a Reserved Register/Field fault may occur.
-  The caller must either guarantee that Value is valid, or the caller must set up
-  fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to DCR.
-
-  @return The 64-bit value written to the DCR.
-
-**/
-UINT64
-EFIAPI
-AsmWriteDcr (
-  IN UINT64  Value
-  );
-
-
-/**
-  Writes the current value of 64-bit Interruption Vector Address Register (IVA).
-  The size of vector table is 32 K bytes and is 32 K bytes aligned
-  the low 15 bits of Value is ignored when written.
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to IVA.
-
-  @return The 64-bit value written to the IVA.
-
-**/
-UINT64
-EFIAPI
-AsmWriteIva (
-  IN UINT64  Value
-  );
-
-
-/**
-  Writes the current value of 64-bit Page Table Address Register (PTA).
-  No parameter checking is performed on Value.  All bits of Value corresponding to
-  reserved fields of DCR must be 0 or a Reserved Register/Field fault may occur.
-  The caller must either guarantee that Value is valid, or the caller must set up
-  fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to PTA.
-
-  @return The 64-bit value written to the PTA.
-**/
-UINT64
-EFIAPI
-AsmWritePta (
-  IN UINT64  Value
-  );
-
-
-/**
-  Reads the current value of Local Interrupt ID Register (LID).
-  This function is only available on IPF.
-
-  @return The current value of LID.
-
-**/
-UINT64
-EFIAPI
-AsmReadLid (
-  VOID
-  );
-
-
-/**
-  Reads the current value of External Interrupt Vector Register (IVR).
-  This function is only available on IPF.
-
-  @return The current value of IVR.
-
-**/
-UINT64
-EFIAPI
-AsmReadIvr (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Task Priority Register (TPR).
-  This function is only available on IPF.
-
-  @return The current value of TPR.
-
-**/
-UINT64
-EFIAPI
-AsmReadTpr (
-  VOID
-  );
-
-
-/**
-  Reads the current value of External Interrupt Request Register #0 (IRR0).
-  This function is only available on IPF.
-
-  @return The current value of IRR0.
-
-**/
-UINT64
-EFIAPI
-AsmReadIrr0 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of External Interrupt Request Register #1 (IRR1).
-  This function is only available on IPF.
-
-  @return The current value of IRR1.
-
-**/
-UINT64
-EFIAPI
-AsmReadIrr1 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of External Interrupt Request Register #2 (IRR2).
-  This function is only available on IPF.
-
-  @return The current value of IRR2.
-
-**/
-UINT64
-EFIAPI
-AsmReadIrr2 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of External Interrupt Request Register #3 (IRR3).
-  This function is only available on IPF.
-
-  @return The current value of IRR3.
-
-**/
-UINT64
-EFIAPI
-AsmReadIrr3 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Performance Monitor Vector Register (PMV).
-  This function is only available on IPF.
-
-  @return The current value of PMV.
-
-**/
-UINT64
-EFIAPI
-AsmReadPmv (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Corrected Machine Check Vector Register (CMCV).
-  This function is only available on IPF.
-
-  @return The current value of CMCV.
-
-**/
-UINT64
-EFIAPI
-AsmReadCmcv (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Local Redirection Register #0 (LRR0).
-  This function is only available on IPF.
-
-  @return The current value of LRR0.
-
-**/
-UINT64
-EFIAPI
-AsmReadLrr0 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Local Redirection Register #1 (LRR1).
-  This function is only available on IPF.
-
-  @return The current value of LRR1.
-
-**/
-UINT64
-EFIAPI
-AsmReadLrr1 (
-  VOID
-  );
-
-
-/**
-  Writes the current value of 64-bit Page Local Interrupt ID Register (LID).
-  No parameter checking is performed on Value.  All bits of Value corresponding to
-  reserved fields of LID must be 0 or a Reserved Register/Field fault may occur.
-  The caller must either guarantee that Value is valid, or the caller must set up
-  fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to LID.
-
-  @return The 64-bit value written to the LID.
-
-**/
-UINT64
-EFIAPI
-AsmWriteLid (
-  IN UINT64  Value
-  );
-
-
-/**
-  Writes the current value of 64-bit Task Priority Register (TPR).
-  No parameter checking is performed on Value.  All bits of Value corresponding to
-  reserved fields of TPR must be 0 or a Reserved Register/Field fault may occur.
-  The caller must either guarantee that Value is valid, or the caller must set up
-  fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to TPR.
-
-  @return The 64-bit value written to the TPR.
-
-**/
-UINT64
-EFIAPI
-AsmWriteTpr (
-  IN UINT64  Value
-  );
-
-
-/**
-  Performs a write operation on End OF External Interrupt Register (EOI).
-  Writes a value of 0 to the EOI Register.  This function is only available on IPF.
-
-**/
-VOID
-EFIAPI
-AsmWriteEoi (
-  VOID
-  );
-
-
-/**
-  Writes the current value of 64-bit Performance Monitor Vector Register (PMV).
-  No parameter checking is performed on Value.  All bits of Value corresponding
-  to reserved fields of PMV must be 0 or a Reserved Register/Field fault may occur.
-  The caller must either guarantee that Value is valid, or the caller must set up
-  fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to PMV.
-
-  @return The 64-bit value written to the PMV.
-
-**/
-UINT64
-EFIAPI
-AsmWritePmv (
-  IN UINT64  Value
-  );
-
-
-/**
-  Writes the current value of 64-bit Corrected Machine Check Vector Register (CMCV).
-  No parameter checking is performed on Value.  All bits of Value corresponding
-  to reserved fields of CMCV must be 0 or a Reserved Register/Field fault may occur.
-  The caller must either guarantee that Value is valid, or the caller must set up
-  fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to CMCV.
-
-  @return The 64-bit value written to the CMCV.
-
-**/
-UINT64
-EFIAPI
-AsmWriteCmcv (
-  IN UINT64  Value
-  );
-
-
-/**
-  Writes the current value of 64-bit Local Redirection Register #0 (LRR0).
-  No parameter checking is performed on Value.  All bits of Value corresponding
-  to reserved fields of LRR0 must be 0 or a Reserved Register/Field fault may occur.
-  The caller must either guarantee that Value is valid, or the caller must set up
-  fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to LRR0.
-
-  @return The 64-bit value written to the LRR0.
-
-**/
-UINT64
-EFIAPI
-AsmWriteLrr0 (
-  IN UINT64  Value
-  );
-
-
-/**
-  Writes the current value of 64-bit Local Redirection Register #1 (LRR1).
-  No parameter checking is performed on Value.  All bits of Value corresponding
-  to reserved fields of LRR1 must be 0 or a Reserved Register/Field fault may occur.
-  The caller must either guarantee that Value is valid, or the caller must
-  set up fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to LRR1.
-
-  @return The 64-bit value written to the LRR1.
-
-**/
-UINT64
-EFIAPI
-AsmWriteLrr1 (
-  IN UINT64  Value
-  );
-
-
-/**
-  Reads the current value of Instruction Breakpoint Register (IBR).
-  
-  The Instruction Breakpoint Registers are used in pairs.  The even numbered
-  registers contain breakpoint addresses, and the odd numbered registers contain
-  breakpoint mask conditions.  At least 4 instruction registers pairs are implemented
-  on all processor models.   Implemented registers are contiguous starting with
-  register 0.  No parameter checking is performed on Index, and if the Index value
-  is beyond the implemented IBR register range, a Reserved Register/Field fault may
-  occur.  The caller must either guarantee that Index is valid, or the caller must
-  set up fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Index         The 8-bit Instruction Breakpoint Register index to read.
-
-  @return The current value of Instruction Breakpoint Register specified by Index.
-
-**/
-UINT64
-EFIAPI
-AsmReadIbr (
-  IN  UINT8   Index
-  );
-
-
-/**
-  Reads the current value of Data Breakpoint Register (DBR).
-
-  The Data Breakpoint Registers are used in pairs.  The even numbered registers
-  contain breakpoint addresses, and odd numbered registers contain breakpoint
-  mask conditions.  At least 4 data registers pairs are implemented on all processor
-  models.  Implemented registers are contiguous starting with register 0.
-  No parameter checking is performed on Index.  If the Index value is beyond
-  the implemented DBR register range, a Reserved Register/Field fault may occur.
-  The caller must either guarantee that Index is valid, or the caller must set up
-  fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Index         The 8-bit Data Breakpoint Register index to read.
-
-  @return The current value of Data Breakpoint Register specified by Index.
-
-**/
-UINT64
-EFIAPI
-AsmReadDbr (
-  IN  UINT8   Index
-  );
-
-
-/**
-  Reads the current value of Performance Monitor Configuration Register (PMC).
-
-  All processor implementations provide at least 4 performance counters
-  (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter overflow
-  status registers (PMC [0]¡­ PMC [3]).  Processor implementations may provide
-  additional implementation-dependent PMC and PMD to increase the number of
-  Â¡Â®generic¡¯ performance counters (PMC/PMD pairs).  The remainder of PMC and PMD
-  register set is implementation dependent.  No parameter checking is performed
-  on Index.  If the Index value is beyond the implemented PMC register range,
-  zero value will be returned.
-  This function is only available on IPF.
-
-  @param Index         The 8-bit Performance Monitor Configuration Register index to read.
-
-  @return The current value of Performance Monitor Configuration Register
-  specified by Index.
-
-**/
-UINT64
-EFIAPI
-AsmReadPmc (
-  IN  UINT8   Index
-  );
-
-
-/**
-  Reads the current value of Performance Monitor Data Register (PMD).
-
-  All processor implementations provide at least 4 performance counters
-  (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter
-  overflow status registers (PMC [0]¡­ PMC [3]).  Processor implementations may
-  provide additional implementation-dependent PMC and PMD to increase the number
-  of Â¡Â®generic¡¯ performance counters (PMC/PMD pairs).  The remainder of PMC and PMD
-  register set is implementation dependent.  No parameter checking is performed
-  on Index.  If the Index value is beyond the implemented PMD register range,
-  zero value will be returned.
-  This function is only available on IPF.
-
-  @param Index         The 8-bit Performance Monitor Data Register index to read.
-
-  @return The current value of Performance Monitor Data Register specified by Index.
-
-**/
-UINT64
-EFIAPI
-AsmReadPmd (
-  IN  UINT8   Index
-  );
-
-
-/**
-  Writes the current value of 64-bit Instruction Breakpoint Register (IBR).
-
-  Writes current value of Instruction Breakpoint Register specified by Index.
-  The Instruction Breakpoint Registers are used in pairs.  The even numbered
-  registers contain breakpoint addresses, and odd numbered registers contain
-  breakpoint mask conditions.  At least 4 instruction registers pairs are implemented
-  on all processor models.  Implemented registers are contiguous starting with
-  register 0.  No parameter checking is performed on Index.  If the Index value
-  is beyond the implemented IBR register range, a Reserved Register/Field fault may
-  occur.  The caller must either guarantee that Index is valid, or the caller must
-  set up fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Index         The 8-bit Instruction Breakpoint Register index to write.
-  @param Value         The 64-bit value to write to IBR.
-
-  @return The 64-bit value written to the IBR.
-
-**/
-UINT64
-EFIAPI
-AsmWriteIbr (
-  IN UINT8   Index,
-  IN UINT64  Value
-  );
-
-
-/**
-  Writes the current value of 64-bit Data Breakpoint Register (DBR).
-
-  Writes current value of Data Breakpoint Register specified by Index.
-  The Data Breakpoint Registers are used in pairs.  The even numbered registers
-  contain breakpoint addresses, and odd numbered registers contain breakpoint
-  mask conditions.  At least 4 data registers pairs are implemented on all processor
-  models.  Implemented registers are contiguous starting with register 0.  No parameter
-  checking is performed on Index.  If the Index value is beyond the implemented
-  DBR register range, a Reserved Register/Field fault may occur.  The caller must
-  either guarantee that Index is valid, or the caller must set up fault handlers to
-  catch the faults.
-  This function is only available on IPF.
-
-  @param Index         The 8-bit Data Breakpoint Register index to write.
-  @param Value         The 64-bit value to write to DBR.
-
-  @return The 64-bit value written to the DBR.
-
-**/
-UINT64
-EFIAPI
-AsmWriteDbr (
-  IN UINT8   Index,
-  IN UINT64  Value
-  );
-
-
-/**
-  Writes the current value of 64-bit Performance Monitor Configuration Register (PMC).
-
-  Writes current value of Performance Monitor Configuration Register specified by Index.
-  All processor implementations provide at least 4 performance counters
-  (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter overflow status
-  registers (PMC [0]¡­ PMC [3]).  Processor implementations may provide additional
-  implementation-dependent PMC and PMD to increase the number of Â¡Â®generic¡¯ performance
-  counters (PMC/PMD pairs).  The remainder of PMC and PMD register set is implementation
-  dependent.  No parameter checking is performed on Index.  If the Index value is
-  beyond the implemented PMC register range, the write is ignored.
-  This function is only available on IPF.
-
-  @param Index         The 8-bit Performance Monitor Configuration Register index to write.
-  @param Value         The 64-bit value to write to PMC.
-
-  @return The 64-bit value written to the PMC.
-
-**/
-UINT64
-EFIAPI
-AsmWritePmc (
-  IN UINT8   Index,
-  IN UINT64  Value
-  );
-
-
-/**
-  Writes the current value of 64-bit Performance Monitor Data Register (PMD).
-
-  Writes current value of Performance Monitor Data Register specified by Index.
-  All processor implementations provide at least 4 performance counters
-  (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter overflow
-  status registers (PMC [0]¡­ PMC [3]).  Processor implementations may provide
-  additional implementation-dependent PMC and PMD to increase the number of Â¡Â®generic¡¯
-  performance counters (PMC/PMD pairs).  The remainder of PMC and PMD register set
-  is implementation dependent.  No parameter checking is performed on Index.  If the
-  Index value is beyond the implemented PMD register range, the write is ignored.
-  This function is only available on IPF.
-
-  @param Index         The 8-bit Performance Monitor Data Register index to write.
-  @param Value         The 64-bit value to write to PMD.
-
-  @return The 64-bit value written to the PMD.
-
-**/
-UINT64
-EFIAPI
-AsmWritePmd (
-  IN UINT8   Index,
-  IN UINT64  Value
-  );
-
-
-/**
-  Reads the current value of 64-bit Global Pointer (GP).
-
-  Reads and returns the current value of GP.
-  This function is only available on IPF.
-
-  @return The current value of GP.
-
-**/
-UINT64
-EFIAPI
-AsmReadGp (
-  VOID
-  );
-
-
-/**
-  Write the current value of 64-bit Global Pointer (GP).
-
-  Writes the current value of GP. The 64-bit value written to the GP is returned.
-  No parameter checking is performed on Value.
-  This function is only available on IPF.
-
-  @param Value  The 64-bit value to write to GP.
-
-  @return The 64-bit value written to the GP.
-
-**/
-UINT64
-EFIAPI
-AsmWriteGp (
-  IN UINT64  Value
-  );
-
-
-/**
-  Reads the current value of 64-bit Stack Pointer (SP).
-
-  Reads and returns the current value of SP.
-  This function is only available on IPF.
-
-  @return The current value of SP.
-
-**/
-UINT64
-EFIAPI
-AsmReadSp (
-  VOID
-  );
-
-
-/**
-  Determines if the CPU is currently executing in virtual, physical, or mixed mode.
-
-  Determines the current execution mode of the CPU.
-  If the CPU is in virtual mode(PSR.RT=1, PSR.DT=1, PSR.IT=1), then 1 is returned.
-  If the CPU is in physical mode(PSR.RT=0, PSR.DT=0, PSR.IT=0), then 0 is returned.
-  If the CPU is not in physical mode or virtual mode, then it is in mixed mode,
-  and -1 is returned.
-  This function is only available on IPF.
-
-  @return  1  The CPU is in virtual mode.
-  @return  0  The CPU is in physical mode.
-  @return -1  The CPU is in mixed mode.
-
-**/
-INT64
-EFIAPI
-AsmCpuVirtual (
-  VOID
-  );
-
-
-/**
-  Makes a PAL procedure call.
-
-  This is a wrapper function to make a PAL procedure call.  Based on the Index
-  value this API will make static or stacked PAL call.  The following table
-  describes the usage of PAL Procedure Index Assignment. Architected procedures
-  may be designated as required or optional.  If a PAL procedure is specified
-  as optional, a unique return code of 0xFFFFFFFFFFFFFFFF is returned in the
-  Status field of the PAL_CALL_RETURN structure.
-  This indicates that the procedure is not present in this PAL implementation.
-  It is the caller¡¯s responsibility to check for this return code after calling
-  any optional PAL procedure.
-  No parameter checking is performed on the 5 input parameters, but there are
-  some common rules that the caller should follow when making a PAL call.  Any
-  address passed to PAL as buffers for return parameters must be 8-byte aligned.
-  Unaligned addresses may cause undefined results.  For those parameters defined
-  as reserved or some fields defined as reserved must be zero filled or the invalid
-  argument return value may be returned or undefined result may occur during the
-  execution of the procedure.  If the PalEntryPoint  does not point to a valid
-  PAL entry point then the system behavior is undefined.  This function is only
-  available on IPF.
-
-  @param PalEntryPoint The PAL procedure calls entry point.
-  @param Index                     The PAL procedure Index number.
-  @param Arg2                        The 2nd parameter for PAL procedure calls.
-  @param Arg3                        The 3rd parameter for PAL procedure calls.
-  @param Arg4                        The 4th parameter for PAL procedure calls.
-
-  @return structure returned from the PAL Call procedure, including the status and return value.
-
-**/
-PAL_CALL_RETURN
-EFIAPI
-AsmPalCall (
-  IN UINT64  PalEntryPoint,
-  IN UINT64  Index,
-  IN UINT64  Arg2,
-  IN UINT64  Arg3,
-  IN UINT64  Arg4
-  );
-
-
-/**
-  Transfers control to a function starting with a new stack.
-
-  Transfers control to the function specified by EntryPoint using the new stack
-  specified by NewStack and passing in the parameters specified by Context1 and
-  Context2. Context1 and Context2 are optional and may be NULL. The function
-  EntryPoint must never return.
-
-  If EntryPoint is NULL, then ASSERT().
-  If NewStack is NULL, then ASSERT().
-
-  @param  EntryPoint  A pointer to function to call with the new stack.
-  @param  Context1    A pointer to the context to pass into the EntryPoint
-                      function.
-  @param  Context2    A pointer to the context to pass into the EntryPoint
-                      function.
-  @param  NewStack    A pointer to the new stack to use for the EntryPoint
-                      function.
-  @param  NewBsp      A pointer to the new memory location for RSE backing
-                      store.
-
-**/
-VOID
-EFIAPI
-AsmSwitchStackAndBackingStore (
-  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
-  IN      VOID                      *Context1,  OPTIONAL
-  IN      VOID                      *Context2,  OPTIONAL
-  IN      VOID                      *NewStack,
-  IN      VOID                      *NewBsp
-  );
-
-
-//
-// Bugbug: This call should be removed after
-//         the PalCall Instance issue has been fixed.
-//
-/**
-  Performs a PAL call using static calling convention.
-
-  An internal function to perform a PAL call using static calling convention.
-
-  @param  PalEntryPoint The entry point address of PAL. The address in ar.kr5
-                        would be used if this parameter were NULL on input.
-  @param  Arg1          The first argument of a PAL call.
-  @param  Arg1          The second argument of a PAL call.
-  @param  Arg1          The third argument of a PAL call.
-  @param  Arg1          The fourth argument of a PAL call.
-
-  @return The values returned in r8, r9, r10 and r11.
-
-**/
-PAL_CALL_RETURN
-PalCallStatic (
-  IN      CONST VOID                *PalEntryPoint,
-  IN      UINT64                    Arg1,
-  IN      UINT64                    Arg2,
-  IN      UINT64                    Arg3,
-  IN      UINT64                    Arg4
-  );
-
-
-#elif defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)
-//
-// IA32 and X64 Specific Functions
-//
-//
-// Byte packed structure for 16-bit Real Mode EFLAGS
-//
-typedef union {
-  struct {
-    UINT32  CF:1;           // Carry Flag
-    UINT32  Reserved_0:1;   // Reserved
-    UINT32  PF:1;           // Parity Flag
-    UINT32  Reserved_1:1;   // Reserved
-    UINT32  AF:1;           // Auxiliary Carry Flag
-    UINT32  Reserved_2:1;   // Reserved
-    UINT32  ZF:1;           // Zero Flag
-    UINT32  SF:1;           // Sign Flag
-    UINT32  TF:1;           // Trap Flag
-    UINT32  IF:1;           // Interrupt Enable Flag
-    UINT32  DF:1;           // Direction Flag
-    UINT32  OF:1;           // Overflow Flag
-    UINT32  IOPL:2;         // I/O Privilege Level
-    UINT32  NT:1;           // Nested Task
-    UINT32  Reserved_3:1;   // Reserved
-  } Bits;
-  UINT16    Uint16;
-} IA32_FLAGS16;
-
-//
-// Byte packed structure for EFLAGS/RFLAGS
-// 32-bits on IA-32
-// 64-bits on X64.  The upper 32-bits on X64 are reserved
-//
-typedef union {
-  struct {
-    UINT32  CF:1;           // Carry Flag
-    UINT32  Reserved_0:1;   // Reserved
-    UINT32  PF:1;           // Parity Flag
-    UINT32  Reserved_1:1;   // Reserved
-    UINT32  AF:1;           // Auxiliary Carry Flag
-    UINT32  Reserved_2:1;   // Reserved
-    UINT32  ZF:1;           // Zero Flag
-    UINT32  SF:1;           // Sign Flag
-    UINT32  TF:1;           // Trap Flag
-    UINT32  IF:1;           // Interrupt Enable Flag
-    UINT32  DF:1;           // Direction Flag
-    UINT32  OF:1;           // Overflow Flag
-    UINT32  IOPL:2;         // I/O Privilege Level
-    UINT32  NT:1;           // Nested Task
-    UINT32  Reserved_3:1;   // Reserved
-    UINT32  RF:1;           // Resume Flag
-    UINT32  VM:1;           // Virtual 8086 Mode
-    UINT32  AC:1;           // Alignment Check
-    UINT32  VIF:1;          // Virtual Interrupt Flag
-    UINT32  VIP:1;          // Virtual Interrupt Pending
-    UINT32  ID:1;           // ID Flag
-    UINT32  Reserved_4:10;  // Reserved
-  } Bits;
-  UINTN     UintN;
-} IA32_EFLAGS32;
-
-//
-// Byte packed structure for Control Register 0 (CR0)
-// 32-bits on IA-32
-// 64-bits on X64.  The upper 32-bits on X64 are reserved
-//
-typedef union {
-  struct {
-    UINT32  PE:1;           // Protection Enable
-    UINT32  MP:1;           // Monitor Coprocessor
-    UINT32  EM:1;           // Emulation
-    UINT32  TS:1;           // Task Switched
-    UINT32  ET:1;           // Extension Type
-    UINT32  NE:1;           // Numeric Error
-    UINT32  Reserved_0:10;  // Reserved
-    UINT32  WP:1;           // Write Protect
-    UINT32  Reserved_1:1;   // Reserved
-    UINT32  AM:1;           // Alignment Mask
-    UINT32  Reserved_2:10;  // Reserved
-    UINT32  NW:1;           // Mot Write-through
-    UINT32  CD:1;           // Cache Disable
-    UINT32  PG:1;           // Paging
-  } Bits;
-  UINTN     UintN;
-} IA32_CR0;
-
-//
-// Byte packed structure for Control Register 4 (CR4)
-// 32-bits on IA-32
-// 64-bits on X64.  The upper 32-bits on X64 are reserved
-//
-typedef union {
-  struct {
-    UINT32  VME:1;          // Virtual-8086 Mode Extensions
-    UINT32  PVI:1;          // Protected-Mode Virtual Interrupts
-    UINT32  TSD:1;          // Time Stamp Disable
-    UINT32  DE:1;           // Debugging Extensions
-    UINT32  PSE:1;          // Page Size Extensions
-    UINT32  PAE:1;          // Physical Address Extension
-    UINT32  MCE:1;          // Machine Check Enable
-    UINT32  PGE:1;          // Page Global Enable
-    UINT32  PCE:1;          // Performance Monitoring Counter
-                            // Enable
-    UINT32  OSFXSR:1;       // Operating System Support for
-                            // FXSAVE and FXRSTOR instructions
-    UINT32  OSXMMEXCPT:1;   // Operating System Support for
-                            // Unmasked SIMD Floating Point
-                            // Exceptions
-    UINT32  Reserved_0:2;   // Reserved
-    UINT32  VMXE:1;         // VMX Enable
-    UINT32  Reserved_1:18;  // Reseved
-  } Bits;
-  UINTN     UintN;
-} IA32_CR4;
-
-//
-// Byte packed structure for an IDTR, GDTR, LDTR descriptor
-/// @bug  How to make this structure byte-packed in a compiler independent way?
-//
-#pragma pack (1)
-typedef struct {
-  UINT16  Limit;
-  UINTN   Base;
-} IA32_DESCRIPTOR;
-#pragma pack ()
-
-#define IA32_IDT_GATE_TYPE_TASK          0x85
-#define IA32_IDT_GATE_TYPE_INTERRUPT_16  0x86
-#define IA32_IDT_GATE_TYPE_TRAP_16       0x87
-#define IA32_IDT_GATE_TYPE_INTERRUPT_32  0x8E
-#define IA32_IDT_GATE_TYPE_TRAP_32       0x8F
-
-//
-// Byte packed structure for an Interrupt Gate Descriptor
-//
-typedef union {
-  struct {
-    UINT32  OffsetLow:16;   // Offset bits 15..0
-    UINT32  Selector:16;    // Selector
-    UINT32  Reserved_0:8;   // Reserved
-    UINT32  GateType:8;     // Gate Type.  See #defines above
-    UINT32  OffsetHigh:16;  // Offset bits 31..16
-  } Bits;
-  UINT64  Uint64;
-} IA32_IDT_GATE_DESCRIPTOR;
-
-//
-// Byte packed structure for an FP/SSE/SSE2 context
-//
-typedef struct {
-  UINT8  Buffer[512];
-} IA32_FX_BUFFER;
-
-//
-// Structures for the 16-bit real mode thunks
-//
-typedef struct {
-  UINT32                            Reserved1;
-  UINT32                            Reserved2;
-  UINT32                            Reserved3;
-  UINT32                            Reserved4;
-  UINT8                             BL;
-  UINT8                             BH;
-  UINT16                            Reserved5;
-  UINT8                             DL;
-  UINT8                             DH;
-  UINT16                            Reserved6;
-  UINT8                             CL;
-  UINT8                             CH;
-  UINT16                            Reserved7;
-  UINT8                             AL;
-  UINT8                             AH;
-  UINT16                            Reserved8;
-} IA32_BYTE_REGS;
-
-typedef struct {
-  UINT16                            DI;
-  UINT16                            Reserved1;
-  UINT16                            SI;
-  UINT16                            Reserved2;
-  UINT16                            BP;
-  UINT16                            Reserved3;
-  UINT16                            SP;
-  UINT16                            Reserved4;
-  UINT16                            BX;
-  UINT16                            Reserved5;
-  UINT16                            DX;
-  UINT16                            Reserved6;
-  UINT16                            CX;
-  UINT16                            Reserved7;
-  UINT16                            AX;
-  UINT16                            Reserved8;
-} IA32_WORD_REGS;
-
-typedef struct {
-  UINT32                            EDI;
-  UINT32                            ESI;
-  UINT32                            EBP;
-  UINT32                            ESP;
-  UINT32                            EBX;
-  UINT32                            EDX;
-  UINT32                            ECX;
-  UINT32                            EAX;
-  UINT16                            DS;
-  UINT16                            ES;
-  UINT16                            FS;
-  UINT16                            GS;
-  IA32_EFLAGS32                     EFLAGS;
-  UINT32                            Eip;
-  UINT16                            CS;
-  UINT16                            SS;
-} IA32_DWORD_REGS;
-
-typedef union {
-  IA32_DWORD_REGS                   E;
-  IA32_WORD_REGS                    X;
-  IA32_BYTE_REGS                    H;
-} IA32_REGISTER_SET;
-
-//
-// Byte packed structure for an 16-bit real mode thunks
-//
-typedef struct {
-  IA32_REGISTER_SET                 *RealModeState;
-  VOID                              *RealModeBuffer;
-  UINT32                            RealModeBufferSize;
-  UINT32                            ThunkAttributes;
-} THUNK_CONTEXT;
-
-#define THUNK_ATTRIBUTE_BIG_REAL_MODE             0x00000001
-#define THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15   0x00000002
-#define THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL 0x00000004
-
-/**
-  Retrieves CPUID information.
-
-  Executes the CPUID instruction with EAX set to the value specified by Index.
-  This function always returns Index.
-  If Eax is not NULL, then the value of EAX after CPUID is returned in Eax.
-  If Ebx is not NULL, then the value of EBX after CPUID is returned in Ebx.
-  If Ecx is not NULL, then the value of ECX after CPUID is returned in Ecx.
-  If Edx is not NULL, then the value of EDX after CPUID is returned in Edx.
-  This function is only available on IA-32 and X64.
-
-  @param  Index The 32-bit value to load into EAX prior to invoking the CPUID
-                instruction.
-  @param  Eax   Pointer to the 32-bit EAX value returned by the CPUID
-                instruction. This is an optional parameter that may be NULL.
-  @param  Ebx   Pointer to the 32-bit EBX value returned by the CPUID
-                instruction. This is an optional parameter that may be NULL.
-  @param  Ecx   Pointer to the 32-bit ECX value returned by the CPUID
-                instruction. This is an optional parameter that may be NULL.
-  @param  Edx   Pointer to the 32-bit EDX value returned by the CPUID
-                instruction. This is an optional parameter that may be NULL.
-
-  @return Index
-
-**/
-UINT32
-EFIAPI
-AsmCpuid (
-  IN      UINT32                    Index,
-  OUT     UINT32                    *Eax,  OPTIONAL
-  OUT     UINT32                    *Ebx,  OPTIONAL
-  OUT     UINT32                    *Ecx,  OPTIONAL
-  OUT     UINT32                    *Edx   OPTIONAL
-  );
-
-
-/**
-  Retrieves CPUID information using an extended leaf identifier.
-
-  Executes the CPUID instruction with EAX set to the value specified by Index
-  and ECX set to the value specified by SubIndex. This function always returns
-  Index. This function is only available on IA-32 and x64.
-
-  If Eax is not NULL, then the value of EAX after CPUID is returned in Eax.
-  If Ebx is not NULL, then the value of EBX after CPUID is returned in Ebx.
-  If Ecx is not NULL, then the value of ECX after CPUID is returned in Ecx.
-  If Edx is not NULL, then the value of EDX after CPUID is returned in Edx.
-
-  @param  Index     The 32-bit value to load into EAX prior to invoking the
-                    CPUID instruction.
-  @param  SubIndex  The 32-bit value to load into ECX prior to invoking the
-                    CPUID instruction.
-  @param  Eax       Pointer to the 32-bit EAX value returned by the CPUID
-                    instruction. This is an optional parameter that may be
-                    NULL.
-  @param  Ebx       Pointer to the 32-bit EBX value returned by the CPUID
-                    instruction. This is an optional parameter that may be
-                    NULL.
-  @param  Ecx       Pointer to the 32-bit ECX value returned by the CPUID
-                    instruction. This is an optional parameter that may be
-                    NULL.
-  @param  Edx       Pointer to the 32-bit EDX value returned by the CPUID
-                    instruction. This is an optional parameter that may be
-                    NULL.
-
-  @return Index
-
-**/
-UINT32
-EFIAPI
-AsmCpuidEx (
-  IN      UINT32                    Index,
-  IN      UINT32                    SubIndex,
-  OUT     UINT32                    *Eax,  OPTIONAL
-  OUT     UINT32                    *Ebx,  OPTIONAL
-  OUT     UINT32                    *Ecx,  OPTIONAL
-  OUT     UINT32                    *Edx   OPTIONAL
-  );
-
-
-/**
-  Returns the lower 32-bits of a Machine Specific Register(MSR).
-
-  Reads and returns the lower 32-bits of the MSR specified by Index.
-  No parameter checking is performed on Index, and some Index values may cause
-  CPU exceptions. The caller must either guarantee that Index is valid, or the
-  caller must set up exception handlers to catch the exceptions. This function
-  is only available on IA-32 and X64.
-
-  @param  Index The 32-bit MSR index to read.
-
-  @return The lower 32 bits of the MSR identified by Index.
-
-**/
-UINT32
-EFIAPI
-AsmReadMsr32 (
-  IN      UINT32                    Index
-  );
-
-
-/**
-  Zero-extend a 32-bit value and writes it to a Machine Specific Register(MSR).
-
-  Writes the 32-bit value specified by Value to the MSR specified by Index. The
-  upper 32-bits of the MSR write are set to zero. The 32-bit value written to
-  the MSR is returned. No parameter checking is performed on Index or Value,
-  and some of these may cause CPU exceptions. The caller must either guarantee
-  that Index and Value are valid, or the caller must establish proper exception
-  handlers. This function is only available on IA-32 and X64.
-
-  @param  Index The 32-bit MSR index to write.
-  @param  Value The 32-bit value to write to the MSR.
-
-  @return Value
-
-**/
-UINT32
-EFIAPI
-AsmWriteMsr32 (
-  IN      UINT32                    Index,
-  IN      UINT32                    Value
-  );
-
-
-/**
-  Reads a 64-bit MSR, performs a bitwise inclusive OR on the lower 32-bits, and
-  writes the result back to the 64-bit MSR.
-
-  Reads the 64-bit MSR specified by Index, performs a bitwise inclusive OR
-  between the lower 32-bits of the read result and the value specified by
-  OrData, and writes the result to the 64-bit MSR specified by Index. The lower
-  32-bits of the value written to the MSR is returned. No parameter checking is
-  performed on Index or OrData, and some of these may cause CPU exceptions. The
-  caller must either guarantee that Index and OrData are valid, or the caller
-  must establish proper exception handlers. This function is only available on
-  IA-32 and X64.
-
-  @param  Index   The 32-bit MSR index to write.
-  @param  OrData  The value to OR with the read value from the MSR.
-
-  @return The lower 32-bit value written to the MSR.
-
-**/
-UINT32
-EFIAPI
-AsmMsrOr32 (
-  IN      UINT32                    Index,
-  IN      UINT32                    OrData
-  );
-
-
-/**
-  Reads a 64-bit MSR, performs a bitwise AND on the lower 32-bits, and writes
-  the result back to the 64-bit MSR.
-
-  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
-  lower 32-bits of the read result and the value specified by AndData, and
-  writes the result to the 64-bit MSR specified by Index. The lower 32-bits of
-  the value written to the MSR is returned. No parameter checking is performed
-  on Index or AndData, and some of these may cause CPU exceptions. The caller
-  must either guarantee that Index and AndData are valid, or the caller must
-  establish proper exception handlers. This function is only available on IA-32
-  and X64.
-
-  @param  Index   The 32-bit MSR index to write.
-  @param  AndData The value to AND with the read value from the MSR.
-
-  @return The lower 32-bit value written to the MSR.
-
-**/
-UINT32
-EFIAPI
-AsmMsrAnd32 (
-  IN      UINT32                    Index,
-  IN      UINT32                    AndData
-  );
-
-
-/**
-  Reads a 64-bit MSR, performs a bitwise AND followed by a bitwise inclusive OR
-  on the lower 32-bits, and writes the result back to the 64-bit MSR.
-
-  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
-  lower 32-bits of the read result and the value specified by AndData
-  preserving the upper 32-bits, performs a bitwise inclusive OR between the
-  result of the AND operation and the value specified by OrData, and writes the
-  result to the 64-bit MSR specified by Address. The lower 32-bits of the value
-  written to the MSR is returned. No parameter checking is performed on Index,
-  AndData, or OrData, and some of these may cause CPU exceptions. The caller
-  must either guarantee that Index, AndData, and OrData are valid, or the
-  caller must establish proper exception handlers. This function is only
-  available on IA-32 and X64.
-
-  @param  Index   The 32-bit MSR index to write.
-  @param  AndData The value to AND with the read value from the MSR.
-  @param  OrData  The value to OR with the result of the AND operation.
-
-  @return The lower 32-bit value written to the MSR.
-
-**/
-UINT32
-EFIAPI
-AsmMsrAndThenOr32 (
-  IN      UINT32                    Index,
-  IN      UINT32                    AndData,
-  IN      UINT32                    OrData
-  );
-
-
-/**
-  Reads a bit field of an MSR.
-
-  Reads the bit field in the lower 32-bits of a 64-bit MSR. The bit field is
-  specified by the StartBit and the EndBit. The value of the bit field is
-  returned. The caller must either guarantee that Index is valid, or the caller
-  must set up exception handlers to catch the exceptions. This function is only
-  available on IA-32 and X64.
-
-  If StartBit is greater than 31, then ASSERT().
-  If EndBit is greater than 31, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Index     The 32-bit MSR index to read.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..31.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..31.
-
-  @return The bit field read from the MSR.
-
-**/
-UINT32
-EFIAPI
-AsmMsrBitFieldRead32 (
-  IN      UINT32                    Index,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit
-  );
-
-
-/**
-  Writes a bit field to an MSR.
-
-  Writes Value to a bit field in the lower 32-bits of a  64-bit MSR. The bit
-  field is specified by the StartBit and the EndBit. All other bits in the
-  destination MSR are preserved. The lower 32-bits of the MSR written is
-  returned. Extra left bits in Value are stripped. The caller must either
-  guarantee that Index and the data written is valid, or the caller must set up
-  exception handlers to catch the exceptions. This function is only available
-  on IA-32 and X64.
-
-  If StartBit is greater than 31, then ASSERT().
-  If EndBit is greater than 31, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Index     The 32-bit MSR index to write.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..31.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..31.
-  @param  Value     New value of the bit field.
-
-  @return The lower 32-bit of the value written to the MSR.
-
-**/
-UINT32
-EFIAPI
-AsmMsrBitFieldWrite32 (
-  IN      UINT32                    Index,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT32                    Value
-  );
-
-
-/**
-  Reads a bit field in a 64-bit MSR, performs a bitwise OR, and writes the
-  result back to the bit field in the 64-bit MSR.
-
-  Reads the 64-bit MSR specified by Index, performs a bitwise inclusive OR
-  between the read result and the value specified by OrData, and writes the
-  result to the 64-bit MSR specified by Index. The lower 32-bits of the value
-  written to the MSR are returned. Extra left bits in OrData are stripped. The
-  caller must either guarantee that Index and the data written is valid, or
-  the caller must set up exception handlers to catch the exceptions. This
-  function is only available on IA-32 and X64.
-
-  If StartBit is greater than 31, then ASSERT().
-  If EndBit is greater than 31, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Index     The 32-bit MSR index to write.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..31.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..31.
-  @param  OrData    The value to OR with the read value from the MSR.
-
-  @return The lower 32-bit of the value written to the MSR.
-
-**/
-UINT32
-EFIAPI
-AsmMsrBitFieldOr32 (
-  IN      UINT32                    Index,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT32                    OrData
-  );
-
-
-/**
-  Reads a bit field in a 64-bit MSR, performs a bitwise AND, and writes the
-  result back to the bit field in the 64-bit MSR.
-
-  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
-  read result and the value specified by AndData, and writes the result to the
-  64-bit MSR specified by Index. The lower 32-bits of the value written to the
-  MSR are returned. Extra left bits in AndData are stripped. The caller must
-  either guarantee that Index and the data written is valid, or the caller must
-  set up exception handlers to catch the exceptions. This function is only
-  available on IA-32 and X64.
-
-  If StartBit is greater than 31, then ASSERT().
-  If EndBit is greater than 31, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Index     The 32-bit MSR index to write.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..31.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..31.
-  @param  AndData   The value to AND with the read value from the MSR.
-
-  @return The lower 32-bit of the value written to the MSR.
-
-**/
-UINT32
-EFIAPI
-AsmMsrBitFieldAnd32 (
-  IN      UINT32                    Index,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT32                    AndData
-  );
-
-
-/**
-  Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a
-  bitwise inclusive OR, and writes the result back to the bit field in the
-  64-bit MSR.
-
-  Reads the 64-bit MSR specified by Index, performs a bitwise AND followed by a
-  bitwise inclusive OR between the read result and the value specified by
-  AndData, and writes the result to the 64-bit MSR specified by Index. The
-  lower 32-bits of the value written to the MSR are returned. Extra left bits
-  in both AndData and OrData are stripped. The caller must either guarantee
-  that Index and the data written is valid, or the caller must set up exception
-  handlers to catch the exceptions. This function is only available on IA-32
-  and X64.
-
-  If StartBit is greater than 31, then ASSERT().
-  If EndBit is greater than 31, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Index     The 32-bit MSR index to write.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..31.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..31.
-  @param  AndData   The value to AND with the read value from the MSR.
-  @param  OrData    The value to OR with the result of the AND operation.
-
-  @return The lower 32-bit of the value written to the MSR.
-
-**/
-UINT32
-EFIAPI
-AsmMsrBitFieldAndThenOr32 (
-  IN      UINT32                    Index,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT32                    AndData,
-  IN      UINT32                    OrData
-  );
-
-
-/**
-  Returns a 64-bit Machine Specific Register(MSR).
-
-  Reads and returns the 64-bit MSR specified by Index. No parameter checking is
-  performed on Index, and some Index values may cause CPU exceptions. The
-  caller must either guarantee that Index is valid, or the caller must set up
-  exception handlers to catch the exceptions. This function is only available
-  on IA-32 and X64.
-
-  @param  Index The 32-bit MSR index to read.
-
-  @return The value of the MSR identified by Index.
-
-**/
-UINT64
-EFIAPI
-AsmReadMsr64 (
-  IN      UINT32                    Index
-  );
-
-
-/**
-  Writes a 64-bit value to a Machine Specific Register(MSR), and returns the
-  value.
-
-  Writes the 64-bit value specified by Value to the MSR specified by Index. The
-  64-bit value written to the MSR is returned. No parameter checking is
-  performed on Index or Value, and some of these may cause CPU exceptions. The
-  caller must either guarantee that Index and Value are valid, or the caller
-  must establish proper exception handlers. This function is only available on
-  IA-32 and X64.
-
-  @param  Index The 32-bit MSR index to write.
-  @param  Value The 64-bit value to write to the MSR.
-
-  @return Value
-
-**/
-UINT64
-EFIAPI
-AsmWriteMsr64 (
-  IN      UINT32                    Index,
-  IN      UINT64                    Value
-  );
-
-
-/**
-  Reads a 64-bit MSR, performs a bitwise inclusive OR, and writes the result
-  back to the 64-bit MSR.
-
-  Reads the 64-bit MSR specified by Index, performs a bitwise inclusive OR
-  between the read result and the value specified by OrData, and writes the
-  result to the 64-bit MSR specified by Index. The value written to the MSR is
-  returned. No parameter checking is performed on Index or OrData, and some of
-  these may cause CPU exceptions. The caller must either guarantee that Index
-  and OrData are valid, or the caller must establish proper exception handlers.
-  This function is only available on IA-32 and X64.
-
-  @param  Index   The 32-bit MSR index to write.
-  @param  OrData  The value to OR with the read value from the MSR.
-
-  @return The value written back to the MSR.
-
-**/
-UINT64
-EFIAPI
-AsmMsrOr64 (
-  IN      UINT32                    Index,
-  IN      UINT64                    OrData
-  );
-
-
-/**
-  Reads a 64-bit MSR, performs a bitwise AND, and writes the result back to the
-  64-bit MSR.
-
-  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
-  read result and the value specified by OrData, and writes the result to the
-  64-bit MSR specified by Index. The value written to the MSR is returned. No
-  parameter checking is performed on Index or OrData, and some of these may
-  cause CPU exceptions. The caller must either guarantee that Index and OrData
-  are valid, or the caller must establish proper exception handlers. This
-  function is only available on IA-32 and X64.
-
-  @param  Index   The 32-bit MSR index to write.
-  @param  AndData The value to AND with the read value from the MSR.
-
-  @return The value written back to the MSR.
-
-**/
-UINT64
-EFIAPI
-AsmMsrAnd64 (
-  IN      UINT32                    Index,
-  IN      UINT64                    AndData
-  );
-
-
-/**
-  Reads a 64-bit MSR, performs a bitwise AND followed by a bitwise inclusive
-  OR, and writes the result back to the 64-bit MSR.
-
-  Reads the 64-bit MSR specified by Index, performs a bitwise AND between read
-  result and the value specified by AndData, performs a bitwise inclusive OR
-  between the result of the AND operation and the value specified by OrData,
-  and writes the result to the 64-bit MSR specified by Index. The value written
-  to the MSR is returned. No parameter checking is performed on Index, AndData,
-  or OrData, and some of these may cause CPU exceptions. The caller must either
-  guarantee that Index, AndData, and OrData are valid, or the caller must
-  establish proper exception handlers. This function is only available on IA-32
-  and X64.
-
-  @param  Index   The 32-bit MSR index to write.
-  @param  AndData The value to AND with the read value from the MSR.
-  @param  OrData  The value to OR with the result of the AND operation.
-
-  @return The value written back to the MSR.
-
-**/
-UINT64
-EFIAPI
-AsmMsrAndThenOr64 (
-  IN      UINT32                    Index,
-  IN      UINT64                    AndData,
-  IN      UINT64                    OrData
-  );
-
-
-/**
-  Reads a bit field of an MSR.
-
-  Reads the bit field in the 64-bit MSR. The bit field is specified by the
-  StartBit and the EndBit. The value of the bit field is returned. The caller
-  must either guarantee that Index is valid, or the caller must set up
-  exception handlers to catch the exceptions. This function is only available
-  on IA-32 and X64.
-
-  If StartBit is greater than 63, then ASSERT().
-  If EndBit is greater than 63, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Index     The 32-bit MSR index to read.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..63.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..63.
-
-  @return The value read from the MSR.
-
-**/
-UINT64
-EFIAPI
-AsmMsrBitFieldRead64 (
-  IN      UINT32                    Index,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit
-  );
-
-
-/**
-  Writes a bit field to an MSR.
-
-  Writes Value to a bit field in a 64-bit MSR. The bit field is specified by
-  the StartBit and the EndBit. All other bits in the destination MSR are
-  preserved. The MSR written is returned. Extra left bits in Value are
-  stripped. The caller must either guarantee that Index and the data written is
-  valid, or the caller must set up exception handlers to catch the exceptions.
-  This function is only available on IA-32 and X64.
-
-  If StartBit is greater than 63, then ASSERT().
-  If EndBit is greater than 63, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Index     The 32-bit MSR index to write.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..63.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..63.
-  @param  Value     New value of the bit field.
-
-  @return The value written back to the MSR.
-
-**/
-UINT64
-EFIAPI
-AsmMsrBitFieldWrite64 (
-  IN      UINT32                    Index,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT64                    Value
-  );
-
-
-/**
-  Reads a bit field in a 64-bit MSR, performs a bitwise inclusive OR, and
-  writes the result back to the bit field in the 64-bit MSR.
-
-  Reads the 64-bit MSR specified by Index, performs a bitwise inclusive OR
-  between the read result and the value specified by OrData, and writes the
-  result to the 64-bit MSR specified by Index. The value written to the MSR is
-  returned. Extra left bits in OrData are stripped. The caller must either
-  guarantee that Index and the data written is valid, or the caller must set up
-  exception handlers to catch the exceptions. This function is only available
-  on IA-32 and X64.
-
-  If StartBit is greater than 63, then ASSERT().
-  If EndBit is greater than 63, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Index     The 32-bit MSR index to write.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..63.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..63.
-  @param  OrData    The value to OR with the read value from the bit field.
-
-  @return The value written back to the MSR.
-
-**/
-UINT64
-EFIAPI
-AsmMsrBitFieldOr64 (
-  IN      UINT32                    Index,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT64                    OrData
-  );
-
-
-/**
-  Reads a bit field in a 64-bit MSR, performs a bitwise AND, and writes the
-  result back to the bit field in the 64-bit MSR.
-
-  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
-  read result and the value specified by AndData, and writes the result to the
-  64-bit MSR specified by Index. The value written to the MSR is returned.
-  Extra left bits in AndData are stripped. The caller must either guarantee
-  that Index and the data written is valid, or the caller must set up exception
-  handlers to catch the exceptions. This function is only available on IA-32
-  and X64.
-
-  If StartBit is greater than 63, then ASSERT().
-  If EndBit is greater than 63, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Index     The 32-bit MSR index to write.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..63.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..63.
-  @param  AndData   The value to AND with the read value from the bit field.
-
-  @return The value written back to the MSR.
-
-**/
-UINT64
-EFIAPI
-AsmMsrBitFieldAnd64 (
-  IN      UINT32                    Index,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT64                    AndData
-  );
-
-
-/**
-  Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a
-  bitwise inclusive OR, and writes the result back to the bit field in the
-  64-bit MSR.
-
-  Reads the 64-bit MSR specified by Index, performs a bitwise AND followed by
-  a bitwise inclusive OR between the read result and the value specified by
-  AndData, and writes the result to the 64-bit MSR specified by Index. The
-  value written to the MSR is returned. Extra left bits in both AndData and
-  OrData are stripped. The caller must either guarantee that Index and the data
-  written is valid, or the caller must set up exception handlers to catch the
-  exceptions. This function is only available on IA-32 and X64.
-
-  If StartBit is greater than 63, then ASSERT().
-  If EndBit is greater than 63, then ASSERT().
-  If EndBit is less than StartBit, then ASSERT().
-
-  @param  Index     The 32-bit MSR index to write.
-  @param  StartBit  The ordinal of the least significant bit in the bit field.
-                    Range 0..63.
-  @param  EndBit    The ordinal of the most significant bit in the bit field.
-                    Range 0..63.
-  @param  AndData   The value to AND with the read value from the bit field.
-  @param  OrData    The value to OR with the result of the AND operation.
-
-  @return The value written back to the MSR.
-
-**/
-UINT64
-EFIAPI
-AsmMsrBitFieldAndThenOr64 (
-  IN      UINT32                    Index,
-  IN      UINTN                     StartBit,
-  IN      UINTN                     EndBit,
-  IN      UINT64                    AndData,
-  IN      UINT64                    OrData
-  );
-
-
-/**
-  Reads the current value of the EFLAGS register.
-
-  Reads and returns the current value of the EFLAGS register. This function is
-  only available on IA-32 and X64. This returns a 32-bit value on IA-32 and a
-  64-bit value on X64.
-
-  @return EFLAGS on IA-32 or RFLAGS on X64.
-
-**/
-UINTN
-EFIAPI
-AsmReadEflags (
-  VOID
-  );
-
-
-/**
-  Reads the current value of the Control Register 0 (CR0).
-
-  Reads and returns the current value of CR0. This function is only available
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
-  X64.
-
-  @return The value of the Control Register 0 (CR0).
-
-**/
-UINTN
-EFIAPI
-AsmReadCr0 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of the Control Register 2 (CR2).
-
-  Reads and returns the current value of CR2. This function is only available
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
-  X64.
-
-  @return The value of the Control Register 2 (CR2).
-
-**/
-UINTN
-EFIAPI
-AsmReadCr2 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of the Control Register 3 (CR3).
-
-  Reads and returns the current value of CR3. This function is only available
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
-  X64.
-
-  @return The value of the Control Register 3 (CR3).
-
-**/
-UINTN
-EFIAPI
-AsmReadCr3 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of the Control Register 4 (CR4).
-
-  Reads and returns the current value of CR4. This function is only available
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
-  X64.
-
-  @return The value of the Control Register 4 (CR4).
-
-**/
-UINTN
-EFIAPI
-AsmReadCr4 (
-  VOID
-  );
-
-
-/**
-  Writes a value to Control Register 0 (CR0).
-
-  Writes and returns a new value to CR0. This function is only available on
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
-
-  @param  Cr0 The value to write to CR0.
-
-  @return The value written to CR0.
-
-**/
-UINTN
-EFIAPI
-AsmWriteCr0 (
-  UINTN  Cr0
-  );
-
-
-/**
-  Writes a value to Control Register 2 (CR2).
-
-  Writes and returns a new value to CR2. This function is only available on
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
-
-  @param  Cr2 The value to write to CR2.
-
-  @return The value written to CR2.
-
-**/
-UINTN
-EFIAPI
-AsmWriteCr2 (
-  UINTN  Cr2
-  );
-
-
-/**
-  Writes a value to Control Register 3 (CR3).
-
-  Writes and returns a new value to CR3. This function is only available on
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
-
-  @param  Cr3 The value to write to CR3.
-
-  @return The value written to CR3.
-
-**/
-UINTN
-EFIAPI
-AsmWriteCr3 (
-  UINTN  Cr3
-  );
-
-
-/**
-  Writes a value to Control Register 4 (CR4).
-
-  Writes and returns a new value to CR4. This function is only available on
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
-
-  @param  Cr4 The value to write to CR4.
-
-  @return The value written to CR4.
-
-**/
-UINTN
-EFIAPI
-AsmWriteCr4 (
-  UINTN  Cr4
-  );
-
-
-/**
-  Reads the current value of Debug Register 0 (DR0).
-
-  Reads and returns the current value of DR0. This function is only available
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
-  X64.
-
-  @return The value of Debug Register 0 (DR0).
-
-**/
-UINTN
-EFIAPI
-AsmReadDr0 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Debug Register 1 (DR1).
-
-  Reads and returns the current value of DR1. This function is only available
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
-  X64.
-
-  @return The value of Debug Register 1 (DR1).
-
-**/
-UINTN
-EFIAPI
-AsmReadDr1 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Debug Register 2 (DR2).
-
-  Reads and returns the current value of DR2. This function is only available
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
-  X64.
-
-  @return The value of Debug Register 2 (DR2).
-
-**/
-UINTN
-EFIAPI
-AsmReadDr2 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Debug Register 3 (DR3).
-
-  Reads and returns the current value of DR3. This function is only available
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
-  X64.
-
-  @return The value of Debug Register 3 (DR3).
-
-**/
-UINTN
-EFIAPI
-AsmReadDr3 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Debug Register 4 (DR4).
-
-  Reads and returns the current value of DR4. This function is only available
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
-  X64.
-
-  @return The value of Debug Register 4 (DR4).
-
-**/
-UINTN
-EFIAPI
-AsmReadDr4 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Debug Register 5 (DR5).
-
-  Reads and returns the current value of DR5. This function is only available
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
-  X64.
-
-  @return The value of Debug Register 5 (DR5).
-
-**/
-UINTN
-EFIAPI
-AsmReadDr5 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Debug Register 6 (DR6).
-
-  Reads and returns the current value of DR6. This function is only available
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
-  X64.
-
-  @return The value of Debug Register 6 (DR6).
-
-**/
-UINTN
-EFIAPI
-AsmReadDr6 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Debug Register 7 (DR7).
-
-  Reads and returns the current value of DR7. This function is only available
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
-  X64.
-
-  @return The value of Debug Register 7 (DR7).
-
-**/
-UINTN
-EFIAPI
-AsmReadDr7 (
-  VOID
-  );
-
-
-/**
-  Writes a value to Debug Register 0 (DR0).
-
-  Writes and returns a new value to DR0. This function is only available on
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
-
-  @param  Dr0 The value to write to Dr0.
-
-  @return The value written to Debug Register 0 (DR0).
-
-**/
-UINTN
-EFIAPI
-AsmWriteDr0 (
-  UINTN  Dr0
-  );
-
-
-/**
-  Writes a value to Debug Register 1 (DR1).
-
-  Writes and returns a new value to DR1. This function is only available on
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
-
-  @param  Dr1 The value to write to Dr1.
-
-  @return The value written to Debug Register 1 (DR1).
-
-**/
-UINTN
-EFIAPI
-AsmWriteDr1 (
-  UINTN  Dr1
-  );
-
-
-/**
-  Writes a value to Debug Register 2 (DR2).
-
-  Writes and returns a new value to DR2. This function is only available on
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
-
-  @param  Dr2 The value to write to Dr2.
-
-  @return The value written to Debug Register 2 (DR2).
-
-**/
-UINTN
-EFIAPI
-AsmWriteDr2 (
-  UINTN  Dr2
-  );
-
-
-/**
-  Writes a value to Debug Register 3 (DR3).
-
-  Writes and returns a new value to DR3. This function is only available on
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
-
-  @param  Dr3 The value to write to Dr3.
-
-  @return The value written to Debug Register 3 (DR3).
-
-**/
-UINTN
-EFIAPI
-AsmWriteDr3 (
-  UINTN  Dr3
-  );
-
-
-/**
-  Writes a value to Debug Register 4 (DR4).
-
-  Writes and returns a new value to DR4. This function is only available on
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
-
-  @param  Dr4 The value to write to Dr4.
-
-  @return The value written to Debug Register 4 (DR4).
-
-**/
-UINTN
-EFIAPI
-AsmWriteDr4 (
-  UINTN  Dr4
-  );
-
-
-/**
-  Writes a value to Debug Register 5 (DR5).
-
-  Writes and returns a new value to DR5. This function is only available on
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
-
-  @param  Dr5 The value to write to Dr5.
-
-  @return The value written to Debug Register 5 (DR5).
-
-**/
-UINTN
-EFIAPI
-AsmWriteDr5 (
-  UINTN  Dr5
-  );
-
-
-/**
-  Writes a value to Debug Register 6 (DR6).
-
-  Writes and returns a new value to DR6. This function is only available on
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
-
-  @param  Dr6 The value to write to Dr6.
-
-  @return The value written to Debug Register 6 (DR6).
-
-**/
-UINTN
-EFIAPI
-AsmWriteDr6 (
-  UINTN  Dr6
-  );
-
-
-/**
-  Writes a value to Debug Register 7 (DR7).
-
-  Writes and returns a new value to DR7. This function is only available on
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
-
-  @param  Dr7 The value to write to Dr7.
-
-  @return The value written to Debug Register 7 (DR7).
-
-**/
-UINTN
-EFIAPI
-AsmWriteDr7 (
-  UINTN  Dr7
-  );
-
-
-/**
-  Reads the current value of Code Segment Register (CS).
-
-  Reads and returns the current value of CS. This function is only available on
-  IA-32 and X64.
-
-  @return The current value of CS.
-
-**/
-UINT16
-EFIAPI
-AsmReadCs (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Data Segment Register (DS).
-
-  Reads and returns the current value of DS. This function is only available on
-  IA-32 and X64.
-
-  @return The current value of DS.
-
-**/
-UINT16
-EFIAPI
-AsmReadDs (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Extra Segment Register (ES).
-
-  Reads and returns the current value of ES. This function is only available on
-  IA-32 and X64.
-
-  @return The current value of ES.
-
-**/
-UINT16
-EFIAPI
-AsmReadEs (
-  VOID
-  );
-
-
-/**
-  Reads the current value of FS Data Segment Register (FS).
-
-  Reads and returns the current value of FS. This function is only available on
-  IA-32 and X64.
-
-  @return The current value of FS.
-
-**/
-UINT16
-EFIAPI
-AsmReadFs (
-  VOID
-  );
-
-
-/**
-  Reads the current value of GS Data Segment Register (GS).
-
-  Reads and returns the current value of GS. This function is only available on
-  IA-32 and X64.
-
-  @return The current value of GS.
-
-**/
-UINT16
-EFIAPI
-AsmReadGs (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Stack Segment Register (SS).
-
-  Reads and returns the current value of SS. This function is only available on
-  IA-32 and X64.
-
-  @return The current value of SS.
-
-**/
-UINT16
-EFIAPI
-AsmReadSs (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Task Register (TR).
-
-  Reads and returns the current value of TR. This function is only available on
-  IA-32 and X64.
-
-  @return The current value of TR.
-
-**/
-UINT16
-EFIAPI
-AsmReadTr (
-  VOID
-  );
-
-
-/**
-  Reads the current Global Descriptor Table Register(GDTR) descriptor.
-
-  Reads and returns the current GDTR descriptor and returns it in Gdtr. This
-  function is only available on IA-32 and X64.
-
-  If Gdtr is NULL, then ASSERT().
-
-  @param  Gdtr  Pointer to a GDTR descriptor.
-
-**/
-VOID
-EFIAPI
-AsmReadGdtr (
-  OUT     IA32_DESCRIPTOR           *Gdtr
-  );
-
-
-/**
-  Writes the current Global Descriptor Table Register (GDTR) descriptor.
-
-  Writes and the current GDTR descriptor specified by Gdtr. This function is
-  only available on IA-32 and X64.
-
-  If Gdtr is NULL, then ASSERT().
-
-  @param  Gdtr  Pointer to a GDTR descriptor.
-
-**/
-VOID
-EFIAPI
-AsmWriteGdtr (
-  IN      CONST IA32_DESCRIPTOR     *Gdtr
-  );
-
-
-/**
-  Reads the current Interrupt Descriptor Table Register(GDTR) descriptor.
-
-  Reads and returns the current IDTR descriptor and returns it in Idtr. This
-  function is only available on IA-32 and X64.
-
-  If Idtr is NULL, then ASSERT().
-
-  @param  Idtr  Pointer to a IDTR descriptor.
-
-**/
-VOID
-EFIAPI
-AsmReadIdtr (
-  OUT     IA32_DESCRIPTOR           *Idtr
-  );
-
-
-/**
-  Writes the current Interrupt Descriptor Table Register(GDTR) descriptor.
-
-  Writes the current IDTR descriptor and returns it in Idtr. This function is
-  only available on IA-32 and X64.
-
-  If Idtr is NULL, then ASSERT().
-
-  @param  Idtr  Pointer to a IDTR descriptor.
-
-**/
-VOID
-EFIAPI
-AsmWriteIdtr (
-  IN      CONST IA32_DESCRIPTOR     *Idtr
-  );
-
-
-/**
-  Reads the current Local Descriptor Table Register(LDTR) selector.
-
-  Reads and returns the current 16-bit LDTR descriptor value. This function is
-  only available on IA-32 and X64.
-
-  @return The current selector of LDT.
-
-**/
-UINT16
-EFIAPI
-AsmReadLdtr (
-  VOID
-  );
-
-
-/**
-  Writes the current Local Descriptor Table Register (GDTR) selector.
-
-  Writes and the current LDTR descriptor specified by Ldtr. This function is
-  only available on IA-32 and X64.
-
-  @param  Ldtr  16-bit LDTR selector value.
-
-**/
-VOID
-EFIAPI
-AsmWriteLdtr (
-  IN      UINT16                    Ldtr
-  );
-
-
-/**
-  Save the current floating point/SSE/SSE2 context to a buffer.
-
-  Saves the current floating point/SSE/SSE2 state to the buffer specified by
-  Buffer. Buffer must be aligned on a 16-byte boundary. This function is only
-  available on IA-32 and X64.
-
-  If Buffer is NULL, then ASSERT().
-  If Buffer is not aligned on a 16-byte boundary, then ASSERT().
-
-  @param  Buffer  Pointer to a buffer to save the floating point/SSE/SSE2 context.
-
-**/
-VOID
-EFIAPI
-AsmFxSave (
-  OUT     IA32_FX_BUFFER            *Buffer
-  );
-
-
-/**
-  Restores the current floating point/SSE/SSE2 context from a buffer.
-
-  Restores the current floating point/SSE/SSE2 state from the buffer specified
-  by Buffer. Buffer must be aligned on a 16-byte boundary. This function is
-  only available on IA-32 and X64.
-
-  If Buffer is NULL, then ASSERT().
-  If Buffer is not aligned on a 16-byte boundary, then ASSERT().
-  If Buffer was not saved with AsmFxSave(), then ASSERT().
-
-  @param  Buffer  Pointer to a buffer to save the floating point/SSE/SSE2 context.
-
-**/
-VOID
-EFIAPI
-AsmFxRestore (
-  IN      CONST IA32_FX_BUFFER      *Buffer
-  );
-
-
-/**
-  Reads the current value of 64-bit MMX Register #0 (MM0).
-
-  Reads and returns the current value of MM0. This function is only available
-  on IA-32 and X64.
-
-  @return The current value of MM0.
-
-**/
-UINT64
-EFIAPI
-AsmReadMm0 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of 64-bit MMX Register #1 (MM1).
-
-  Reads and returns the current value of MM1. This function is only available
-  on IA-32 and X64.
-
-  @return The current value of MM1.
-
-**/
-UINT64
-EFIAPI
-AsmReadMm1 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of 64-bit MMX Register #2 (MM2).
-
-  Reads and returns the current value of MM2. This function is only available
-  on IA-32 and X64.
-
-  @return The current value of MM2.
-
-**/
-UINT64
-EFIAPI
-AsmReadMm2 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of 64-bit MMX Register #3 (MM3).
-
-  Reads and returns the current value of MM3. This function is only available
-  on IA-32 and X64.
-
-  @return The current value of MM3.
-
-**/
-UINT64
-EFIAPI
-AsmReadMm3 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of 64-bit MMX Register #4 (MM4).
-
-  Reads and returns the current value of MM4. This function is only available
-  on IA-32 and X64.
-
-  @return The current value of MM4.
-
-**/
-UINT64
-EFIAPI
-AsmReadMm4 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of 64-bit MMX Register #5 (MM5).
-
-  Reads and returns the current value of MM5. This function is only available
-  on IA-32 and X64.
-
-  @return The current value of MM5.
-
-**/
-UINT64
-EFIAPI
-AsmReadMm5 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of 64-bit MMX Register #6 (MM6).
-
-  Reads and returns the current value of MM6. This function is only available
-  on IA-32 and X64.
-
-  @return The current value of MM6.
-
-**/
-UINT64
-EFIAPI
-AsmReadMm6 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of 64-bit MMX Register #7 (MM7).
-
-  Reads and returns the current value of MM7. This function is only available
-  on IA-32 and X64.
-
-  @return The current value of MM7.
-
-**/
-UINT64
-EFIAPI
-AsmReadMm7 (
-  VOID
-  );
-
-
-/**
-  Writes the current value of 64-bit MMX Register #0 (MM0).
-
-  Writes the current value of MM0. This function is only available on IA32 and
-  X64.
-
-  @param  Value The 64-bit value to write to MM0.
-
-**/
-VOID
-EFIAPI
-AsmWriteMm0 (
-  IN      UINT64                    Value
-  );
-
-
-/**
-  Writes the current value of 64-bit MMX Register #1 (MM1).
-
-  Writes the current value of MM1. This function is only available on IA32 and
-  X64.
-
-  @param  Value The 64-bit value to write to MM1.
-
-**/
-VOID
-EFIAPI
-AsmWriteMm1 (
-  IN      UINT64                    Value
-  );
-
-
-/**
-  Writes the current value of 64-bit MMX Register #2 (MM2).
-
-  Writes the current value of MM2. This function is only available on IA32 and
-  X64.
-
-  @param  Value The 64-bit value to write to MM2.
-
-**/
-VOID
-EFIAPI
-AsmWriteMm2 (
-  IN      UINT64                    Value
-  );
-
-
-/**
-  Writes the current value of 64-bit MMX Register #3 (MM3).
-
-  Writes the current value of MM3. This function is only available on IA32 and
-  X64.
-
-  @param  Value The 64-bit value to write to MM3.
-
-**/
-VOID
-EFIAPI
-AsmWriteMm3 (
-  IN      UINT64                    Value
-  );
-
-
-/**
-  Writes the current value of 64-bit MMX Register #4 (MM4).
-
-  Writes the current value of MM4. This function is only available on IA32 and
-  X64.
-
-  @param  Value The 64-bit value to write to MM4.
-
-**/
-VOID
-EFIAPI
-AsmWriteMm4 (
-  IN      UINT64                    Value
-  );
-
-
-/**
-  Writes the current value of 64-bit MMX Register #5 (MM5).
-
-  Writes the current value of MM5. This function is only available on IA32 and
-  X64.
-
-  @param  Value The 64-bit value to write to MM5.
-
-**/
-VOID
-EFIAPI
-AsmWriteMm5 (
-  IN      UINT64                    Value
-  );
-
-
-/**
-  Writes the current value of 64-bit MMX Register #6 (MM6).
-
-  Writes the current value of MM6. This function is only available on IA32 and
-  X64.
-
-  @param  Value The 64-bit value to write to MM6.
-
-**/
-VOID
-EFIAPI
-AsmWriteMm6 (
-  IN      UINT64                    Value
-  );
-
-
-/**
-  Writes the current value of 64-bit MMX Register #7 (MM7).
-
-  Writes the current value of MM7. This function is only available on IA32 and
-  X64.
-
-  @param  Value The 64-bit value to write to MM7.
-
-**/
-VOID
-EFIAPI
-AsmWriteMm7 (
-  IN      UINT64                    Value
-  );
-
-
-/**
-  Reads the current value of Time Stamp Counter (TSC).
-
-  Reads and returns the current value of TSC. This function is only available
-  on IA-32 and X64.
-
-  @return The current value of TSC
-
-**/
-UINT64
-EFIAPI
-AsmReadTsc (
-  VOID
-  );
-
-
-/**
-  Reads the current value of a Performance Counter (PMC).
-
-  Reads and returns the current value of performance counter specified by
-  Index. This function is only available on IA-32 and X64.
-
-  @param  Index The 32-bit Performance Counter index to read.
-
-  @return The value of the PMC specified by Index.
-
-**/
-UINT64
-EFIAPI
-AsmReadPmc (
-  IN      UINT32                    Index
-  );
-
-
-/**
-  Sets up a monitor buffer that is used by AsmMwait().
-
-  Executes a MONITOR instruction with the register state specified by Eax, Ecx
-  and Edx. Returns Eax. This function is only available on IA-32 and X64.
-
-  @param  Eax The value to load into EAX or RAX before executing the MONITOR
-              instruction.
-  @param  Ecx The value to load into ECX or RCX before executing the MONITOR
-              instruction.
-  @param  Edx The value to load into EDX or RDX before executing the MONITOR
-              instruction.
-
-  @return Eax
-
-**/
-UINTN
-EFIAPI
-AsmMonitor (
-  IN      UINTN                     Eax,
-  IN      UINTN                     Ecx,
-  IN      UINTN                     Edx
-  );
-
-
-/**
-  Executes an MWAIT instruction.
-
-  Executes an MWAIT instruction with the register state specified by Eax and
-  Ecx. Returns Eax. This function is only available on IA-32 and X64.
-
-  @param  Eax The value to load into EAX or RAX before executing the MONITOR
-              instruction.
-  @param  Ecx The value to load into ECX or RCX before executing the MONITOR
-              instruction.
-
-  @return Eax
-
-**/
-UINTN
-EFIAPI
-AsmMwait (
-  IN      UINTN                     Eax,
-  IN      UINTN                     Ecx
-  );
-
-
-/**
-  Executes a WBINVD instruction.
-
-  Executes a WBINVD instruction. This function is only available on IA-32 and
-  X64.
-
-**/
-VOID
-EFIAPI
-AsmWbinvd (
-  VOID
-  );
-
-
-/**
-  Executes a INVD instruction.
-
-  Executes a INVD instruction. This function is only available on IA-32 and
-  X64.
-
-**/
-VOID
-EFIAPI
-AsmInvd (
-  VOID
-  );
-
-
-/**
-  Flushes a cache line from all the instruction and data caches within the
-  coherency domain of the CPU.
-
-  Flushed the cache line specified by LinearAddress, and returns LinearAddress.
-  This function is only available on IA-32 and X64.
-
-  @param  LinearAddress The address of the cache line to flush. If the CPU is
-                        in a physical addressing mode, then LinearAddress is a
-                        physical address. If the CPU is in a virtual
-                        addressing mode, then LinearAddress is a virtual
-                        address.
-
-  @return LinearAddress
-**/
-VOID *
-EFIAPI
-AsmFlushCacheLine (
-  IN      VOID                      *LinearAddress
-  );
-
-
-/**
-  Enables the 32-bit paging mode on the CPU.
-
-  Enables the 32-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables
-  must be properly initialized prior to calling this service. This function
-  assumes the current execution mode is 32-bit protected mode. This function is
-  only available on IA-32. After the 32-bit paging mode is enabled, control is
-  transferred to the function specified by EntryPoint using the new stack
-  specified by NewStack and passing in the parameters specified by Context1 and
-  Context2. Context1 and Context2 are optional and may be NULL. The function
-  EntryPoint must never return.
-
-  If the current execution mode is not 32-bit protected mode, then ASSERT().
-  If EntryPoint is NULL, then ASSERT().
-  If NewStack is NULL, then ASSERT().
-
-  There are a number of constraints that must be followed before calling this
-  function:
-  1)  Interrupts must be disabled.
-  2)  The caller must be in 32-bit protected mode with flat descriptors. This
-      means all descriptors must have a base of 0 and a limit of 4GB.
-  3)  CR0 and CR4 must be compatible with 32-bit protected mode with flat
-      descriptors.
-  4)  CR3 must point to valid page tables that will be used once the transition
-      is complete, and those page tables must guarantee that the pages for this
-      function and the stack are identity mapped.
-
-  @param  EntryPoint  A pointer to function to call with the new stack after
-                      paging is enabled.
-  @param  Context1    A pointer to the context to pass into the EntryPoint
-                      function as the first parameter after paging is enabled.
-  @param  Context2    A pointer to the context to pass into the EntryPoint
-                      function as the second parameter after paging is enabled.
-  @param  NewStack    A pointer to the new stack to use for the EntryPoint
-                      function after paging is enabled.
-
-**/
-VOID
-EFIAPI
-AsmEnablePaging32 (
-  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
-  IN      VOID                      *Context1,  OPTIONAL
-  IN      VOID                      *Context2,  OPTIONAL
-  IN      VOID                      *NewStack
-  );
-
-
-/**
-  Disables the 32-bit paging mode on the CPU.
-
-  Disables the 32-bit paging mode on the CPU and returns to 32-bit protected
-  mode. This function assumes the current execution mode is 32-paged protected
-  mode. This function is only available on IA-32. After the 32-bit paging mode
-  is disabled, control is transferred to the function specified by EntryPoint
-  using the new stack specified by NewStack and passing in the parameters
-  specified by Context1 and Context2. Context1 and Context2 are optional and
-  may be NULL. The function EntryPoint must never return.
-
-  If the current execution mode is not 32-bit paged mode, then ASSERT().
-  If EntryPoint is NULL, then ASSERT().
-  If NewStack is NULL, then ASSERT().
-
-  There are a number of constraints that must be followed before calling this
-  function:
-  1)  Interrupts must be disabled.
-  2)  The caller must be in 32-bit paged mode.
-  3)  CR0, CR3, and CR4 must be compatible with 32-bit paged mode.
-  4)  CR3 must point to valid page tables that guarantee that the pages for
-      this function and the stack are identity mapped.
-
-  @param  EntryPoint  A pointer to function to call with the new stack after
-                      paging is disabled.
-  @param  Context1    A pointer to the context to pass into the EntryPoint
-                      function as the first parameter after paging is disabled.
-  @param  Context2    A pointer to the context to pass into the EntryPoint
-                      function as the second parameter after paging is
-                      disabled.
-  @param  NewStack    A pointer to the new stack to use for the EntryPoint
-                      function after paging is disabled.
-
-**/
-VOID
-EFIAPI
-AsmDisablePaging32 (
-  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
-  IN      VOID                      *Context1,  OPTIONAL
-  IN      VOID                      *Context2,  OPTIONAL
-  IN      VOID                      *NewStack
-  );
-
-
-/**
-  Enables the 64-bit paging mode on the CPU.
-
-  Enables the 64-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables
-  must be properly initialized prior to calling this service. This function
-  assumes the current execution mode is 32-bit protected mode with flat
-  descriptors. This function is only available on IA-32. After the 64-bit
-  paging mode is enabled, control is transferred to the function specified by
-  EntryPoint using the new stack specified by NewStack and passing in the
-  parameters specified by Context1 and Context2. Context1 and Context2 are
-  optional and may be 0. The function EntryPoint must never return.
-
-  If the current execution mode is not 32-bit protected mode with flat
-  descriptors, then ASSERT().
-  If EntryPoint is 0, then ASSERT().
-  If NewStack is 0, then ASSERT().
-
-  @param  Cs          The 16-bit selector to load in the CS before EntryPoint
-                      is called. The descriptor in the GDT that this selector
-                      references must be setup for long mode.
-  @param  EntryPoint  The 64-bit virtual address of the function to call with
-                      the new stack after paging is enabled.
-  @param  Context1    The 64-bit virtual address of the context to pass into
-                      the EntryPoint function as the first parameter after
-                      paging is enabled.
-  @param  Context2    The 64-bit virtual address of the context to pass into
-                      the EntryPoint function as the second parameter after
-                      paging is enabled.
-  @param  NewStack    The 64-bit virtual address of the new stack to use for
-                      the EntryPoint function after paging is enabled.
-
-**/
-VOID
-EFIAPI
-AsmEnablePaging64 (
-  IN      UINT16                    CodeSelector,
-  IN      UINT64                    EntryPoint,
-  IN      UINT64                    Context1,  OPTIONAL
-  IN      UINT64                    Context2,  OPTIONAL
-  IN      UINT64                    NewStack
-  );
-
-
-/**
-  Disables the 64-bit paging mode on the CPU.
-
-  Disables the 64-bit paging mode on the CPU and returns to 32-bit protected
-  mode. This function assumes the current execution mode is 64-paging mode.
-  This function is only available on X64. After the 64-bit paging mode is
-  disabled, control is transferred to the function specified by EntryPoint
-  using the new stack specified by NewStack and passing in the parameters
-  specified by Context1 and Context2. Context1 and Context2 are optional and
-  may be 0. The function EntryPoint must never return.
-
-  If the current execution mode is not 64-bit paged mode, then ASSERT().
-  If EntryPoint is 0, then ASSERT().
-  If NewStack is 0, then ASSERT().
-
-  @param  Cs          The 16-bit selector to load in the CS before EntryPoint
-                      is called. The descriptor in the GDT that this selector
-                      references must be setup for 32-bit protected mode.
-  @param  EntryPoint  The 64-bit virtual address of the function to call with
-                      the new stack after paging is disabled.
-  @param  Context1    The 64-bit virtual address of the context to pass into
-                      the EntryPoint function as the first parameter after
-                      paging is disabled.
-  @param  Context2    The 64-bit virtual address of the context to pass into
-                      the EntryPoint function as the second parameter after
-                      paging is disabled.
-  @param  NewStack    The 64-bit virtual address of the new stack to use for
-                      the EntryPoint function after paging is disabled.
-
-**/
-VOID
-EFIAPI
-AsmDisablePaging64 (
-  IN      UINT16                    CodeSelector,
-  IN      UINT32                    EntryPoint,
-  IN      UINT32                    Context1,  OPTIONAL
-  IN      UINT32                    Context2,  OPTIONAL
-  IN      UINT32                    NewStack
-  );
-
-
-//
-// 16-bit thunking services
-//
-
-/**
-  Retrieves the properties for 16-bit thunk functions.
-
-  Computes the size of the buffer and stack below 1MB required to use the
-  AsmPrepareThunk16(), AsmThunk16() and AsmPrepareAndThunk16() functions. This
-  buffer size is returned in RealModeBufferSize, and the stack size is returned
-  in ExtraStackSize. If parameters are passed to the 16-bit real mode code,
-  then the actual minimum stack size is ExtraStackSize plus the maximum number
-  of bytes that need to be passed to the 16-bit real mode code.
-
-  If RealModeBufferSize is NULL, then ASSERT().
-  If ExtraStackSize is NULL, then ASSERT().
-
-  @param  RealModeBufferSize  A pointer to the size of the buffer below 1MB
-                              required to use the 16-bit thunk functions.
-  @param  ExtraStackSize      A pointer to the extra size of stack below 1MB
-                              that the 16-bit thunk functions require for
-                              temporary storage in the transition to and from
-                              16-bit real mode.
-
-**/
-VOID
-EFIAPI
-AsmGetThunk16Properties (
-  OUT     UINT32                    *RealModeBufferSize,
-  OUT     UINT32                    *ExtraStackSize
-  );
-
-
-/**
-  Prepares all structures a code required to use AsmThunk16().
-
-  Prepares all structures and code required to use AsmThunk16().
-
-  If ThunkContext is NULL, then ASSERT().
-
-  @param  ThunkContext  A pointer to the context structure that describes the
-                        16-bit real mode code to call.
-
-**/
-VOID
-EFIAPI
-AsmPrepareThunk16 (
-  OUT     THUNK_CONTEXT             *ThunkContext
-  );
-
-
-/**
-  Transfers control to a 16-bit real mode entry point and returns the results.
-
-  Transfers control to a 16-bit real mode entry point and returns the results.
-  AsmPrepareThunk16() must be called with ThunkContext before this function is
-  used.
-
-  If ThunkContext is NULL, then ASSERT().
-  If AsmPrepareThunk16() was not previously called with ThunkContext, then ASSERT().
-
-  @param  ThunkContext  A pointer to the context structure that describes the
-                        16-bit real mode code to call.
-
-**/
-VOID
-EFIAPI
-AsmThunk16 (
-  IN OUT  THUNK_CONTEXT             *ThunkContext
-  );
-
-
-/**
-  Prepares all structures and code for a 16-bit real mode thunk, transfers
-  control to a 16-bit real mode entry point, and returns the results.
-
-  Prepares all structures and code for a 16-bit real mode thunk, transfers
-  control to a 16-bit real mode entry point, and returns the results. If the
-  caller only need to perform a single 16-bit real mode thunk, then this
-  service should be used. If the caller intends to make more than one 16-bit
-  real mode thunk, then it is more efficient if AsmPrepareThunk16() is called
-  once and AsmThunk16() can be called for each 16-bit real mode thunk.
-
-  If ThunkContext is NULL, then ASSERT().
-
-  @param  ThunkContext  A pointer to the context structure that describes the
-                        16-bit real mode code to call.
-
-**/
-VOID
-EFIAPI
-AsmPrepareAndThunk16 (
-  IN OUT  THUNK_CONTEXT             *ThunkContext
-  );
-
-#else
-
-#endif
-
-#endif
-
+/** @file\r
+  Provides string functions, linked list functions, math functions, synchronization\r
+  functions, file path functions, and CPU architecture-specific functions.\r
+\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php.\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __BASE_LIB__\r
+#define __BASE_LIB__\r
+\r
+//\r
+// Definitions for architecture-specific types\r
+//\r
+#if   defined (MDE_CPU_IA32)\r
+///\r
+/// The IA-32 architecture context buffer used by SetJump() and LongJump().\r
+///\r
+typedef struct {\r
+  UINT32                            Ebx;\r
+  UINT32                            Esi;\r
+  UINT32                            Edi;\r
+  UINT32                            Ebp;\r
+  UINT32                            Esp;\r
+  UINT32                            Eip;\r
+} BASE_LIBRARY_JUMP_BUFFER;\r
+\r
+#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 4\r
+\r
+#endif // defined (MDE_CPU_IA32)\r
+\r
+#if defined (MDE_CPU_IPF)\r
+\r
+///\r
+/// The Itanium architecture context buffer used by SetJump() and LongJump().\r
+///\r
+typedef struct {\r
+  UINT64                            F2[2];\r
+  UINT64                            F3[2];\r
+  UINT64                            F4[2];\r
+  UINT64                            F5[2];\r
+  UINT64                            F16[2];\r
+  UINT64                            F17[2];\r
+  UINT64                            F18[2];\r
+  UINT64                            F19[2];\r
+  UINT64                            F20[2];\r
+  UINT64                            F21[2];\r
+  UINT64                            F22[2];\r
+  UINT64                            F23[2];\r
+  UINT64                            F24[2];\r
+  UINT64                            F25[2];\r
+  UINT64                            F26[2];\r
+  UINT64                            F27[2];\r
+  UINT64                            F28[2];\r
+  UINT64                            F29[2];\r
+  UINT64                            F30[2];\r
+  UINT64                            F31[2];\r
+  UINT64                            R4;\r
+  UINT64                            R5;\r
+  UINT64                            R6;\r
+  UINT64                            R7;\r
+  UINT64                            SP;\r
+  UINT64                            BR0;\r
+  UINT64                            BR1;\r
+  UINT64                            BR2;\r
+  UINT64                            BR3;\r
+  UINT64                            BR4;\r
+  UINT64                            BR5;\r
+  UINT64                            InitialUNAT;\r
+  UINT64                            AfterSpillUNAT;\r
+  UINT64                            PFS;\r
+  UINT64                            BSP;\r
+  UINT64                            Predicates;\r
+  UINT64                            LoopCount;\r
+  UINT64                            FPSR;\r
+} BASE_LIBRARY_JUMP_BUFFER;\r
+\r
+#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 0x10\r
+\r
+#endif // defined (MDE_CPU_IPF)\r
+\r
+#if defined (MDE_CPU_X64)\r
+///\r
+/// The x64 architecture context buffer used by SetJump() and LongJump().\r
+///\r
+typedef struct {\r
+  UINT64                            Rbx;\r
+  UINT64                            Rsp;\r
+  UINT64                            Rbp;\r
+  UINT64                            Rdi;\r
+  UINT64                            Rsi;\r
+  UINT64                            R12;\r
+  UINT64                            R13;\r
+  UINT64                            R14;\r
+  UINT64                            R15;\r
+  UINT64                            Rip;\r
+  UINT64                            MxCsr;\r
+  UINT8                             XmmBuffer[160]; ///< XMM6-XMM15.\r
+} BASE_LIBRARY_JUMP_BUFFER;\r
+\r
+#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8\r
+\r
+#endif // defined (MDE_CPU_X64)\r
+\r
+#if defined (MDE_CPU_EBC)\r
+///\r
+/// The EBC context buffer used by SetJump() and LongJump().\r
+///\r
+typedef struct {\r
+  UINT64                            R0;\r
+  UINT64                            R1;\r
+  UINT64                            R2;\r
+  UINT64                            R3;\r
+  UINT64                            IP;\r
+} BASE_LIBRARY_JUMP_BUFFER;\r
+\r
+#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8\r
+\r
+#endif // defined (MDE_CPU_EBC)\r
+\r
+#if defined (MDE_CPU_ARM)\r
+\r
+typedef struct {\r
+  UINT32    R3;  ///< A copy of R13.\r
+  UINT32    R4;\r
+  UINT32    R5;\r
+  UINT32    R6;\r
+  UINT32    R7;\r
+  UINT32    R8;\r
+  UINT32    R9;\r
+  UINT32    R10;\r
+  UINT32    R11;\r
+  UINT32    R12;\r
+  UINT32    R14;\r
+} BASE_LIBRARY_JUMP_BUFFER;\r
+\r
+#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 4\r
+\r
+#endif  // defined (MDE_CPU_ARM)\r
+\r
+#if defined (MDE_CPU_AARCH64)\r
+typedef struct {\r
+  // GP regs\r
+  UINT64    X19;\r
+  UINT64    X20;\r
+  UINT64    X21;\r
+  UINT64    X22;\r
+  UINT64    X23;\r
+  UINT64    X24;\r
+  UINT64    X25;\r
+  UINT64    X26;\r
+  UINT64    X27;\r
+  UINT64    X28;\r
+  UINT64    FP;\r
+  UINT64    LR;\r
+  UINT64    IP0;\r
+\r
+  // FP regs\r
+  UINT64    D8;\r
+  UINT64    D9;\r
+  UINT64    D10;\r
+  UINT64    D11;\r
+  UINT64    D12;\r
+  UINT64    D13;\r
+  UINT64    D14;\r
+  UINT64    D15;\r
+} BASE_LIBRARY_JUMP_BUFFER;\r
+\r
+#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8\r
+\r
+#endif  // defined (MDE_CPU_AARCH64)\r
+\r
+\r
+//\r
+// String Services\r
+//\r
+\r
+\r
+/**\r
+  Returns the length of a Null-terminated Unicode string.\r
+\r
+  This function is similar as strlen_s defined in C11.\r
+\r
+  If String is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  @param  String   A pointer to a Null-terminated Unicode string.\r
+  @param  MaxSize  The maximum number of Destination Unicode\r
+                   char, including terminating null char.\r
+\r
+  @retval 0        If String is NULL.\r
+  @retval MaxSize  If there is no null character in the first MaxSize characters of String.\r
+  @return The number of characters that percede the terminating null character.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+StrnLenS (\r
+  IN CONST CHAR16              *String,\r
+  IN UINTN                     MaxSize\r
+  );\r
+\r
+/**\r
+  Returns the size of a Null-terminated Unicode string in bytes, including the\r
+  Null terminator.\r
+\r
+  This function returns the size of the Null-terminated Unicode string\r
+  specified by String in bytes, including the Null terminator.\r
+\r
+  If String is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  @param  String   A pointer to a Null-terminated Unicode string.\r
+  @param  MaxSize  The maximum number of Destination Unicode\r
+                   char, including the Null terminator.\r
+\r
+  @retval 0  If String is NULL.\r
+  @retval (sizeof (CHAR16) * (MaxSize + 1))\r
+             If there is no Null terminator in the first MaxSize characters of\r
+             String.\r
+  @return The size of the Null-terminated Unicode string in bytes, including\r
+          the Null terminator.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+StrnSizeS (\r
+  IN CONST CHAR16              *String,\r
+  IN UINTN                     MaxSize\r
+  );\r
+\r
+/**\r
+  Copies the string pointed to by Source (including the terminating null char)\r
+  to the array pointed to by Destination.\r
+\r
+  This function is similar as strcpy_s defined in C11.\r
+\r
+  If Destination is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Source is not aligned on a 16-bit boundary, then ASSERT().\r
+  If an error would be returned, then the function will also ASSERT().\r
+\r
+  If an error is returned, then the Destination is unmodified.\r
+\r
+  @param  Destination              A pointer to a Null-terminated Unicode string.\r
+  @param  DestMax                  The maximum number of Destination Unicode\r
+                                   char, including terminating null char.\r
+  @param  Source                   A pointer to a Null-terminated Unicode string.\r
+\r
+  @retval RETURN_SUCCESS           String is copied.\r
+  @retval RETURN_BUFFER_TOO_SMALL  If DestMax is NOT greater than StrLen(Source).\r
+  @retval RETURN_INVALID_PARAMETER If Destination is NULL.\r
+                                   If Source is NULL.\r
+                                   If PcdMaximumUnicodeStringLength is not zero,\r
+                                    and DestMax is greater than\r
+                                    PcdMaximumUnicodeStringLength.\r
+                                   If DestMax is 0.\r
+  @retval RETURN_ACCESS_DENIED     If Source and Destination overlap.\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+StrCpyS (\r
+  OUT CHAR16       *Destination,\r
+  IN  UINTN        DestMax,\r
+  IN  CONST CHAR16 *Source\r
+  );\r
+\r
+/**\r
+  Copies not more than Length successive char from the string pointed to by\r
+  Source to the array pointed to by Destination. If no null char is copied from\r
+  Source, then Destination[Length] is always set to null.\r
+\r
+  This function is similar as strncpy_s defined in C11.\r
+\r
+  If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length > 0 and Source is not aligned on a 16-bit boundary, then ASSERT().\r
+  If an error would be returned, then the function will also ASSERT().\r
+\r
+  If an error is returned, then the Destination is unmodified.\r
+\r
+  @param  Destination              A pointer to a Null-terminated Unicode string.\r
+  @param  DestMax                  The maximum number of Destination Unicode\r
+                                   char, including terminating null char.\r
+  @param  Source                   A pointer to a Null-terminated Unicode string.\r
+  @param  Length                   The maximum number of Unicode characters to copy.\r
+\r
+  @retval RETURN_SUCCESS           String is copied.\r
+  @retval RETURN_BUFFER_TOO_SMALL  If DestMax is NOT greater than\r
+                                   MIN(StrLen(Source), Length).\r
+  @retval RETURN_INVALID_PARAMETER If Destination is NULL.\r
+                                   If Source is NULL.\r
+                                   If PcdMaximumUnicodeStringLength is not zero,\r
+                                    and DestMax is greater than\r
+                                    PcdMaximumUnicodeStringLength.\r
+                                   If DestMax is 0.\r
+  @retval RETURN_ACCESS_DENIED     If Source and Destination overlap.\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+StrnCpyS (\r
+  OUT CHAR16       *Destination,\r
+  IN  UINTN        DestMax,\r
+  IN  CONST CHAR16 *Source,\r
+  IN  UINTN        Length\r
+  );\r
+\r
+/**\r
+  Appends a copy of the string pointed to by Source (including the terminating\r
+  null char) to the end of the string pointed to by Destination.\r
+\r
+  This function is similar as strcat_s defined in C11.\r
+\r
+  If Destination is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Source is not aligned on a 16-bit boundary, then ASSERT().\r
+  If an error would be returned, then the function will also ASSERT().\r
+\r
+  If an error is returned, then the Destination is unmodified.\r
+\r
+  @param  Destination              A pointer to a Null-terminated Unicode string.\r
+  @param  DestMax                  The maximum number of Destination Unicode\r
+                                   char, including terminating null char.\r
+  @param  Source                   A pointer to a Null-terminated Unicode string.\r
+\r
+  @retval RETURN_SUCCESS           String is appended.\r
+  @retval RETURN_BAD_BUFFER_SIZE   If DestMax is NOT greater than\r
+                                   StrLen(Destination).\r
+  @retval RETURN_BUFFER_TOO_SMALL  If (DestMax - StrLen(Destination)) is NOT\r
+                                   greater than StrLen(Source).\r
+  @retval RETURN_INVALID_PARAMETER If Destination is NULL.\r
+                                   If Source is NULL.\r
+                                   If PcdMaximumUnicodeStringLength is not zero,\r
+                                    and DestMax is greater than\r
+                                    PcdMaximumUnicodeStringLength.\r
+                                   If DestMax is 0.\r
+  @retval RETURN_ACCESS_DENIED     If Source and Destination overlap.\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+StrCatS (\r
+  IN OUT CHAR16       *Destination,\r
+  IN     UINTN        DestMax,\r
+  IN     CONST CHAR16 *Source\r
+  );\r
+\r
+/**\r
+  Appends not more than Length successive char from the string pointed to by\r
+  Source to the end of the string pointed to by Destination. If no null char is\r
+  copied from Source, then Destination[StrLen(Destination) + Length] is always\r
+  set to null.\r
+\r
+  This function is similar as strncat_s defined in C11.\r
+\r
+  If Destination is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Source is not aligned on a 16-bit boundary, then ASSERT().\r
+  If an error would be returned, then the function will also ASSERT().\r
+\r
+  If an error is returned, then the Destination is unmodified.\r
+\r
+  @param  Destination              A pointer to a Null-terminated Unicode string.\r
+  @param  DestMax                  The maximum number of Destination Unicode\r
+                                   char, including terminating null char.\r
+  @param  Source                   A pointer to a Null-terminated Unicode string.\r
+  @param  Length                   The maximum number of Unicode characters to copy.\r
+\r
+  @retval RETURN_SUCCESS           String is appended.\r
+  @retval RETURN_BAD_BUFFER_SIZE   If DestMax is NOT greater than\r
+                                   StrLen(Destination).\r
+  @retval RETURN_BUFFER_TOO_SMALL  If (DestMax - StrLen(Destination)) is NOT\r
+                                   greater than MIN(StrLen(Source), Length).\r
+  @retval RETURN_INVALID_PARAMETER If Destination is NULL.\r
+                                   If Source is NULL.\r
+                                   If PcdMaximumUnicodeStringLength is not zero,\r
+                                    and DestMax is greater than\r
+                                    PcdMaximumUnicodeStringLength.\r
+                                   If DestMax is 0.\r
+  @retval RETURN_ACCESS_DENIED     If Source and Destination overlap.\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+StrnCatS (\r
+  IN OUT CHAR16       *Destination,\r
+  IN     UINTN        DestMax,\r
+  IN     CONST CHAR16 *Source,\r
+  IN     UINTN        Length\r
+  );\r
+\r
+/**\r
+  Convert a Null-terminated Unicode decimal string to a value of type UINTN.\r
+\r
+  This function outputs a value of type UINTN by interpreting the contents of\r
+  the Unicode string specified by String as a decimal number. The format of the\r
+  input Unicode string String is:\r
+\r
+                  [spaces] [decimal digits].\r
+\r
+  The valid decimal digit character is in the range [0-9]. The function will\r
+  ignore the pad space, which includes spaces or tab characters, before\r
+  [decimal digits]. The running zero in the beginning of [decimal digits] will\r
+  be ignored. Then, the function stops at the first character that is a not a\r
+  valid decimal character or a Null-terminator, whichever one comes first.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If Data is NULL, then ASSERT().\r
+  If String is not aligned in a 16-bit boundary, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters, not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  If String has no valid decimal digits in the above format, then 0 is stored\r
+  at the location pointed to by Data.\r
+  If the number represented by String exceeds the range defined by UINTN, then\r
+  MAX_UINTN is stored at the location pointed to by Data.\r
+\r
+  If EndPointer is not NULL, a pointer to the character that stopped the scan\r
+  is stored at the location pointed to by EndPointer. If String has no valid\r
+  decimal digits right after the optional pad spaces, the value of String is\r
+  stored at the location pointed to by EndPointer.\r
+\r
+  @param  String                   Pointer to a Null-terminated Unicode string.\r
+  @param  EndPointer               Pointer to character that stops scan.\r
+  @param  Data                     Pointer to the converted value.\r
+\r
+  @retval RETURN_SUCCESS           Value is translated from String.\r
+  @retval RETURN_INVALID_PARAMETER If String is NULL.\r
+                                   If Data is NULL.\r
+                                   If PcdMaximumUnicodeStringLength is not\r
+                                   zero, and String contains more than\r
+                                   PcdMaximumUnicodeStringLength Unicode\r
+                                   characters, not including the\r
+                                   Null-terminator.\r
+  @retval RETURN_UNSUPPORTED       If the number represented by String exceeds\r
+                                   the range defined by UINTN.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+StrDecimalToUintnS (\r
+  IN  CONST CHAR16             *String,\r
+  OUT       CHAR16             **EndPointer,  OPTIONAL\r
+  OUT       UINTN              *Data\r
+  );\r
+\r
+/**\r
+  Convert a Null-terminated Unicode decimal string to a value of type UINT64.\r
+\r
+  This function outputs a value of type UINT64 by interpreting the contents of\r
+  the Unicode string specified by String as a decimal number. The format of the\r
+  input Unicode string String is:\r
+\r
+                  [spaces] [decimal digits].\r
+\r
+  The valid decimal digit character is in the range [0-9]. The function will\r
+  ignore the pad space, which includes spaces or tab characters, before\r
+  [decimal digits]. The running zero in the beginning of [decimal digits] will\r
+  be ignored. Then, the function stops at the first character that is a not a\r
+  valid decimal character or a Null-terminator, whichever one comes first.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If Data is NULL, then ASSERT().\r
+  If String is not aligned in a 16-bit boundary, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters, not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  If String has no valid decimal digits in the above format, then 0 is stored\r
+  at the location pointed to by Data.\r
+  If the number represented by String exceeds the range defined by UINT64, then\r
+  MAX_UINT64 is stored at the location pointed to by Data.\r
+\r
+  If EndPointer is not NULL, a pointer to the character that stopped the scan\r
+  is stored at the location pointed to by EndPointer. If String has no valid\r
+  decimal digits right after the optional pad spaces, the value of String is\r
+  stored at the location pointed to by EndPointer.\r
+\r
+  @param  String                   Pointer to a Null-terminated Unicode string.\r
+  @param  EndPointer               Pointer to character that stops scan.\r
+  @param  Data                     Pointer to the converted value.\r
+\r
+  @retval RETURN_SUCCESS           Value is translated from String.\r
+  @retval RETURN_INVALID_PARAMETER If String is NULL.\r
+                                   If Data is NULL.\r
+                                   If PcdMaximumUnicodeStringLength is not\r
+                                   zero, and String contains more than\r
+                                   PcdMaximumUnicodeStringLength Unicode\r
+                                   characters, not including the\r
+                                   Null-terminator.\r
+  @retval RETURN_UNSUPPORTED       If the number represented by String exceeds\r
+                                   the range defined by UINT64.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+StrDecimalToUint64S (\r
+  IN  CONST CHAR16             *String,\r
+  OUT       CHAR16             **EndPointer,  OPTIONAL\r
+  OUT       UINT64             *Data\r
+  );\r
+\r
+/**\r
+  Convert a Null-terminated Unicode hexadecimal string to a value of type\r
+  UINTN.\r
+\r
+  This function outputs a value of type UINTN by interpreting the contents of\r
+  the Unicode string specified by String as a hexadecimal number. The format of\r
+  the input Unicode string String is:\r
+\r
+                  [spaces][zeros][x][hexadecimal digits].\r
+\r
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].\r
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.\r
+  If "x" appears in the input string, it must be prefixed with at least one 0.\r
+  The function will ignore the pad space, which includes spaces or tab\r
+  characters, before [zeros], [x] or [hexadecimal digit]. The running zero\r
+  before [x] or [hexadecimal digit] will be ignored. Then, the decoding starts\r
+  after [x] or the first valid hexadecimal digit. Then, the function stops at\r
+  the first character that is a not a valid hexadecimal character or NULL,\r
+  whichever one comes first.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If Data is NULL, then ASSERT().\r
+  If String is not aligned in a 16-bit boundary, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters, not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  If String has no valid hexadecimal digits in the above format, then 0 is\r
+  stored at the location pointed to by Data.\r
+  If the number represented by String exceeds the range defined by UINTN, then\r
+  MAX_UINTN is stored at the location pointed to by Data.\r
+\r
+  If EndPointer is not NULL, a pointer to the character that stopped the scan\r
+  is stored at the location pointed to by EndPointer. If String has no valid\r
+  hexadecimal digits right after the optional pad spaces, the value of String\r
+  is stored at the location pointed to by EndPointer.\r
+\r
+  @param  String                   Pointer to a Null-terminated Unicode string.\r
+  @param  EndPointer               Pointer to character that stops scan.\r
+  @param  Data                     Pointer to the converted value.\r
+\r
+  @retval RETURN_SUCCESS           Value is translated from String.\r
+  @retval RETURN_INVALID_PARAMETER If String is NULL.\r
+                                   If Data is NULL.\r
+                                   If PcdMaximumUnicodeStringLength is not\r
+                                   zero, and String contains more than\r
+                                   PcdMaximumUnicodeStringLength Unicode\r
+                                   characters, not including the\r
+                                   Null-terminator.\r
+  @retval RETURN_UNSUPPORTED       If the number represented by String exceeds\r
+                                   the range defined by UINTN.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+StrHexToUintnS (\r
+  IN  CONST CHAR16             *String,\r
+  OUT       CHAR16             **EndPointer,  OPTIONAL\r
+  OUT       UINTN              *Data\r
+  );\r
+\r
+/**\r
+  Convert a Null-terminated Unicode hexadecimal string to a value of type\r
+  UINT64.\r
+\r
+  This function outputs a value of type UINT64 by interpreting the contents of\r
+  the Unicode string specified by String as a hexadecimal number. The format of\r
+  the input Unicode string String is:\r
+\r
+                  [spaces][zeros][x][hexadecimal digits].\r
+\r
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].\r
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.\r
+  If "x" appears in the input string, it must be prefixed with at least one 0.\r
+  The function will ignore the pad space, which includes spaces or tab\r
+  characters, before [zeros], [x] or [hexadecimal digit]. The running zero\r
+  before [x] or [hexadecimal digit] will be ignored. Then, the decoding starts\r
+  after [x] or the first valid hexadecimal digit. Then, the function stops at\r
+  the first character that is a not a valid hexadecimal character or NULL,\r
+  whichever one comes first.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If Data is NULL, then ASSERT().\r
+  If String is not aligned in a 16-bit boundary, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters, not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  If String has no valid hexadecimal digits in the above format, then 0 is\r
+  stored at the location pointed to by Data.\r
+  If the number represented by String exceeds the range defined by UINT64, then\r
+  MAX_UINT64 is stored at the location pointed to by Data.\r
+\r
+  If EndPointer is not NULL, a pointer to the character that stopped the scan\r
+  is stored at the location pointed to by EndPointer. If String has no valid\r
+  hexadecimal digits right after the optional pad spaces, the value of String\r
+  is stored at the location pointed to by EndPointer.\r
+\r
+  @param  String                   Pointer to a Null-terminated Unicode string.\r
+  @param  EndPointer               Pointer to character that stops scan.\r
+  @param  Data                     Pointer to the converted value.\r
+\r
+  @retval RETURN_SUCCESS           Value is translated from String.\r
+  @retval RETURN_INVALID_PARAMETER If String is NULL.\r
+                                   If Data is NULL.\r
+                                   If PcdMaximumUnicodeStringLength is not\r
+                                   zero, and String contains more than\r
+                                   PcdMaximumUnicodeStringLength Unicode\r
+                                   characters, not including the\r
+                                   Null-terminator.\r
+  @retval RETURN_UNSUPPORTED       If the number represented by String exceeds\r
+                                   the range defined by UINT64.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+StrHexToUint64S (\r
+  IN  CONST CHAR16             *String,\r
+  OUT       CHAR16             **EndPointer,  OPTIONAL\r
+  OUT       UINT64             *Data\r
+  );\r
+\r
+/**\r
+  Returns the length of a Null-terminated Ascii string.\r
+\r
+  This function is similar as strlen_s defined in C11.\r
+\r
+  @param  String   A pointer to a Null-terminated Ascii string.\r
+  @param  MaxSize  The maximum number of Destination Ascii\r
+                   char, including terminating null char.\r
+\r
+  @retval 0        If String is NULL.\r
+  @retval MaxSize  If there is no null character in the first MaxSize characters of String.\r
+  @return The number of characters that percede the terminating null character.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsciiStrnLenS (\r
+  IN CONST CHAR8               *String,\r
+  IN UINTN                     MaxSize\r
+  );\r
+\r
+/**\r
+  Returns the size of a Null-terminated Ascii string in bytes, including the\r
+  Null terminator.\r
+\r
+  This function returns the size of the Null-terminated Ascii string specified\r
+  by String in bytes, including the Null terminator.\r
+\r
+  @param  String   A pointer to a Null-terminated Ascii string.\r
+  @param  MaxSize  The maximum number of Destination Ascii\r
+                   char, including the Null terminator.\r
+\r
+  @retval 0  If String is NULL.\r
+  @retval (sizeof (CHAR8) * (MaxSize + 1))\r
+             If there is no Null terminator in the first MaxSize characters of\r
+             String.\r
+  @return The size of the Null-terminated Ascii string in bytes, including the\r
+          Null terminator.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsciiStrnSizeS (\r
+  IN CONST CHAR8               *String,\r
+  IN UINTN                     MaxSize\r
+  );\r
+\r
+/**\r
+  Copies the string pointed to by Source (including the terminating null char)\r
+  to the array pointed to by Destination.\r
+\r
+  This function is similar as strcpy_s defined in C11.\r
+\r
+  If an error would be returned, then the function will also ASSERT().\r
+\r
+  If an error is returned, then the Destination is unmodified.\r
+\r
+  @param  Destination              A pointer to a Null-terminated Ascii string.\r
+  @param  DestMax                  The maximum number of Destination Ascii\r
+                                   char, including terminating null char.\r
+  @param  Source                   A pointer to a Null-terminated Ascii string.\r
+\r
+  @retval RETURN_SUCCESS           String is copied.\r
+  @retval RETURN_BUFFER_TOO_SMALL  If DestMax is NOT greater than StrLen(Source).\r
+  @retval RETURN_INVALID_PARAMETER If Destination is NULL.\r
+                                   If Source is NULL.\r
+                                   If PcdMaximumAsciiStringLength is not zero,\r
+                                    and DestMax is greater than\r
+                                    PcdMaximumAsciiStringLength.\r
+                                   If DestMax is 0.\r
+  @retval RETURN_ACCESS_DENIED     If Source and Destination overlap.\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+AsciiStrCpyS (\r
+  OUT CHAR8        *Destination,\r
+  IN  UINTN        DestMax,\r
+  IN  CONST CHAR8  *Source\r
+  );\r
+\r
+/**\r
+  Copies not more than Length successive char from the string pointed to by\r
+  Source to the array pointed to by Destination. If no null char is copied from\r
+  Source, then Destination[Length] is always set to null.\r
+\r
+  This function is similar as strncpy_s defined in C11.\r
+\r
+  If an error would be returned, then the function will also ASSERT().\r
+\r
+  If an error is returned, then the Destination is unmodified.\r
+\r
+  @param  Destination              A pointer to a Null-terminated Ascii string.\r
+  @param  DestMax                  The maximum number of Destination Ascii\r
+                                   char, including terminating null char.\r
+  @param  Source                   A pointer to a Null-terminated Ascii string.\r
+  @param  Length                   The maximum number of Ascii characters to copy.\r
+\r
+  @retval RETURN_SUCCESS           String is copied.\r
+  @retval RETURN_BUFFER_TOO_SMALL  If DestMax is NOT greater than\r
+                                   MIN(StrLen(Source), Length).\r
+  @retval RETURN_INVALID_PARAMETER If Destination is NULL.\r
+                                   If Source is NULL.\r
+                                   If PcdMaximumAsciiStringLength is not zero,\r
+                                    and DestMax is greater than\r
+                                    PcdMaximumAsciiStringLength.\r
+                                   If DestMax is 0.\r
+  @retval RETURN_ACCESS_DENIED     If Source and Destination overlap.\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+AsciiStrnCpyS (\r
+  OUT CHAR8        *Destination,\r
+  IN  UINTN        DestMax,\r
+  IN  CONST CHAR8  *Source,\r
+  IN  UINTN        Length\r
+  );\r
+\r
+/**\r
+  Appends a copy of the string pointed to by Source (including the terminating\r
+  null char) to the end of the string pointed to by Destination.\r
+\r
+  This function is similar as strcat_s defined in C11.\r
+\r
+  If an error would be returned, then the function will also ASSERT().\r
+\r
+  If an error is returned, then the Destination is unmodified.\r
+\r
+  @param  Destination              A pointer to a Null-terminated Ascii string.\r
+  @param  DestMax                  The maximum number of Destination Ascii\r
+                                   char, including terminating null char.\r
+  @param  Source                   A pointer to a Null-terminated Ascii string.\r
+\r
+  @retval RETURN_SUCCESS           String is appended.\r
+  @retval RETURN_BAD_BUFFER_SIZE   If DestMax is NOT greater than\r
+                                   StrLen(Destination).\r
+  @retval RETURN_BUFFER_TOO_SMALL  If (DestMax - StrLen(Destination)) is NOT\r
+                                   greater than StrLen(Source).\r
+  @retval RETURN_INVALID_PARAMETER If Destination is NULL.\r
+                                   If Source is NULL.\r
+                                   If PcdMaximumAsciiStringLength is not zero,\r
+                                    and DestMax is greater than\r
+                                    PcdMaximumAsciiStringLength.\r
+                                   If DestMax is 0.\r
+  @retval RETURN_ACCESS_DENIED     If Source and Destination overlap.\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+AsciiStrCatS (\r
+  IN OUT CHAR8        *Destination,\r
+  IN     UINTN        DestMax,\r
+  IN     CONST CHAR8  *Source\r
+  );\r
+\r
+/**\r
+  Appends not more than Length successive char from the string pointed to by\r
+  Source to the end of the string pointed to by Destination. If no null char is\r
+  copied from Source, then Destination[StrLen(Destination) + Length] is always\r
+  set to null.\r
+\r
+  This function is similar as strncat_s defined in C11.\r
+\r
+  If an error would be returned, then the function will also ASSERT().\r
+\r
+  If an error is returned, then the Destination is unmodified.\r
+\r
+  @param  Destination              A pointer to a Null-terminated Ascii string.\r
+  @param  DestMax                  The maximum number of Destination Ascii\r
+                                   char, including terminating null char.\r
+  @param  Source                   A pointer to a Null-terminated Ascii string.\r
+  @param  Length                   The maximum number of Ascii characters to copy.\r
+\r
+  @retval RETURN_SUCCESS           String is appended.\r
+  @retval RETURN_BAD_BUFFER_SIZE   If DestMax is NOT greater than\r
+                                   StrLen(Destination).\r
+  @retval RETURN_BUFFER_TOO_SMALL  If (DestMax - StrLen(Destination)) is NOT\r
+                                   greater than MIN(StrLen(Source), Length).\r
+  @retval RETURN_INVALID_PARAMETER If Destination is NULL.\r
+                                   If Source is NULL.\r
+                                   If PcdMaximumAsciiStringLength is not zero,\r
+                                    and DestMax is greater than\r
+                                    PcdMaximumAsciiStringLength.\r
+                                   If DestMax is 0.\r
+  @retval RETURN_ACCESS_DENIED     If Source and Destination overlap.\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+AsciiStrnCatS (\r
+  IN OUT CHAR8        *Destination,\r
+  IN     UINTN        DestMax,\r
+  IN     CONST CHAR8  *Source,\r
+  IN     UINTN        Length\r
+  );\r
+\r
+/**\r
+  Convert a Null-terminated Ascii decimal string to a value of type UINTN.\r
+\r
+  This function outputs a value of type UINTN by interpreting the contents of\r
+  the Ascii string specified by String as a decimal number. The format of the\r
+  input Ascii string String is:\r
+\r
+                  [spaces] [decimal digits].\r
+\r
+  The valid decimal digit character is in the range [0-9]. The function will\r
+  ignore the pad space, which includes spaces or tab characters, before\r
+  [decimal digits]. The running zero in the beginning of [decimal digits] will\r
+  be ignored. Then, the function stops at the first character that is a not a\r
+  valid decimal character or a Null-terminator, whichever one comes first.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If Data is NULL, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero, and String contains more than\r
+  PcdMaximumAsciiStringLength Ascii characters, not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  If String has no valid decimal digits in the above format, then 0 is stored\r
+  at the location pointed to by Data.\r
+  If the number represented by String exceeds the range defined by UINTN, then\r
+  MAX_UINTN is stored at the location pointed to by Data.\r
+\r
+  If EndPointer is not NULL, a pointer to the character that stopped the scan\r
+  is stored at the location pointed to by EndPointer. If String has no valid\r
+  decimal digits right after the optional pad spaces, the value of String is\r
+  stored at the location pointed to by EndPointer.\r
+\r
+  @param  String                   Pointer to a Null-terminated Ascii string.\r
+  @param  EndPointer               Pointer to character that stops scan.\r
+  @param  Data                     Pointer to the converted value.\r
+\r
+  @retval RETURN_SUCCESS           Value is translated from String.\r
+  @retval RETURN_INVALID_PARAMETER If String is NULL.\r
+                                   If Data is NULL.\r
+                                   If PcdMaximumAsciiStringLength is not zero,\r
+                                   and String contains more than\r
+                                   PcdMaximumAsciiStringLength Ascii\r
+                                   characters, not including the\r
+                                   Null-terminator.\r
+  @retval RETURN_UNSUPPORTED       If the number represented by String exceeds\r
+                                   the range defined by UINTN.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+AsciiStrDecimalToUintnS (\r
+  IN  CONST CHAR8              *String,\r
+  OUT       CHAR8              **EndPointer,  OPTIONAL\r
+  OUT       UINTN              *Data\r
+  );\r
+\r
+/**\r
+  Convert a Null-terminated Ascii decimal string to a value of type UINT64.\r
+\r
+  This function outputs a value of type UINT64 by interpreting the contents of\r
+  the Ascii string specified by String as a decimal number. The format of the\r
+  input Ascii string String is:\r
+\r
+                  [spaces] [decimal digits].\r
+\r
+  The valid decimal digit character is in the range [0-9]. The function will\r
+  ignore the pad space, which includes spaces or tab characters, before\r
+  [decimal digits]. The running zero in the beginning of [decimal digits] will\r
+  be ignored. Then, the function stops at the first character that is a not a\r
+  valid decimal character or a Null-terminator, whichever one comes first.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If Data is NULL, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero, and String contains more than\r
+  PcdMaximumAsciiStringLength Ascii characters, not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  If String has no valid decimal digits in the above format, then 0 is stored\r
+  at the location pointed to by Data.\r
+  If the number represented by String exceeds the range defined by UINT64, then\r
+  MAX_UINT64 is stored at the location pointed to by Data.\r
+\r
+  If EndPointer is not NULL, a pointer to the character that stopped the scan\r
+  is stored at the location pointed to by EndPointer. If String has no valid\r
+  decimal digits right after the optional pad spaces, the value of String is\r
+  stored at the location pointed to by EndPointer.\r
+\r
+  @param  String                   Pointer to a Null-terminated Ascii string.\r
+  @param  EndPointer               Pointer to character that stops scan.\r
+  @param  Data                     Pointer to the converted value.\r
+\r
+  @retval RETURN_SUCCESS           Value is translated from String.\r
+  @retval RETURN_INVALID_PARAMETER If String is NULL.\r
+                                   If Data is NULL.\r
+                                   If PcdMaximumAsciiStringLength is not zero,\r
+                                   and String contains more than\r
+                                   PcdMaximumAsciiStringLength Ascii\r
+                                   characters, not including the\r
+                                   Null-terminator.\r
+  @retval RETURN_UNSUPPORTED       If the number represented by String exceeds\r
+                                   the range defined by UINT64.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+AsciiStrDecimalToUint64S (\r
+  IN  CONST CHAR8              *String,\r
+  OUT       CHAR8              **EndPointer,  OPTIONAL\r
+  OUT       UINT64             *Data\r
+  );\r
+\r
+/**\r
+  Convert a Null-terminated Ascii hexadecimal string to a value of type UINTN.\r
+\r
+  This function outputs a value of type UINTN by interpreting the contents of\r
+  the Ascii string specified by String as a hexadecimal number. The format of\r
+  the input Ascii string String is:\r
+\r
+                  [spaces][zeros][x][hexadecimal digits].\r
+\r
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].\r
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If\r
+  "x" appears in the input string, it must be prefixed with at least one 0. The\r
+  function will ignore the pad space, which includes spaces or tab characters,\r
+  before [zeros], [x] or [hexadecimal digits]. The running zero before [x] or\r
+  [hexadecimal digits] will be ignored. Then, the decoding starts after [x] or\r
+  the first valid hexadecimal digit. Then, the function stops at the first\r
+  character that is a not a valid hexadecimal character or Null-terminator,\r
+  whichever on comes first.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If Data is NULL, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero, and String contains more than\r
+  PcdMaximumAsciiStringLength Ascii characters, not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  If String has no valid hexadecimal digits in the above format, then 0 is\r
+  stored at the location pointed to by Data.\r
+  If the number represented by String exceeds the range defined by UINTN, then\r
+  MAX_UINTN is stored at the location pointed to by Data.\r
+\r
+  If EndPointer is not NULL, a pointer to the character that stopped the scan\r
+  is stored at the location pointed to by EndPointer. If String has no valid\r
+  hexadecimal digits right after the optional pad spaces, the value of String\r
+  is stored at the location pointed to by EndPointer.\r
+\r
+  @param  String                   Pointer to a Null-terminated Ascii string.\r
+  @param  EndPointer               Pointer to character that stops scan.\r
+  @param  Data                     Pointer to the converted value.\r
+\r
+  @retval RETURN_SUCCESS           Value is translated from String.\r
+  @retval RETURN_INVALID_PARAMETER If String is NULL.\r
+                                   If Data is NULL.\r
+                                   If PcdMaximumAsciiStringLength is not zero,\r
+                                   and String contains more than\r
+                                   PcdMaximumAsciiStringLength Ascii\r
+                                   characters, not including the\r
+                                   Null-terminator.\r
+  @retval RETURN_UNSUPPORTED       If the number represented by String exceeds\r
+                                   the range defined by UINTN.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+AsciiStrHexToUintnS (\r
+  IN  CONST CHAR8              *String,\r
+  OUT       CHAR8              **EndPointer,  OPTIONAL\r
+  OUT       UINTN              *Data\r
+  );\r
+\r
+/**\r
+  Convert a Null-terminated Ascii hexadecimal string to a value of type UINT64.\r
+\r
+  This function outputs a value of type UINT64 by interpreting the contents of\r
+  the Ascii string specified by String as a hexadecimal number. The format of\r
+  the input Ascii string String is:\r
+\r
+                  [spaces][zeros][x][hexadecimal digits].\r
+\r
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].\r
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If\r
+  "x" appears in the input string, it must be prefixed with at least one 0. The\r
+  function will ignore the pad space, which includes spaces or tab characters,\r
+  before [zeros], [x] or [hexadecimal digits]. The running zero before [x] or\r
+  [hexadecimal digits] will be ignored. Then, the decoding starts after [x] or\r
+  the first valid hexadecimal digit. Then, the function stops at the first\r
+  character that is a not a valid hexadecimal character or Null-terminator,\r
+  whichever on comes first.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If Data is NULL, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero, and String contains more than\r
+  PcdMaximumAsciiStringLength Ascii characters, not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  If String has no valid hexadecimal digits in the above format, then 0 is\r
+  stored at the location pointed to by Data.\r
+  If the number represented by String exceeds the range defined by UINT64, then\r
+  MAX_UINT64 is stored at the location pointed to by Data.\r
+\r
+  If EndPointer is not NULL, a pointer to the character that stopped the scan\r
+  is stored at the location pointed to by EndPointer. If String has no valid\r
+  hexadecimal digits right after the optional pad spaces, the value of String\r
+  is stored at the location pointed to by EndPointer.\r
+\r
+  @param  String                   Pointer to a Null-terminated Ascii string.\r
+  @param  EndPointer               Pointer to character that stops scan.\r
+  @param  Data                     Pointer to the converted value.\r
+\r
+  @retval RETURN_SUCCESS           Value is translated from String.\r
+  @retval RETURN_INVALID_PARAMETER If String is NULL.\r
+                                   If Data is NULL.\r
+                                   If PcdMaximumAsciiStringLength is not zero,\r
+                                   and String contains more than\r
+                                   PcdMaximumAsciiStringLength Ascii\r
+                                   characters, not including the\r
+                                   Null-terminator.\r
+  @retval RETURN_UNSUPPORTED       If the number represented by String exceeds\r
+                                   the range defined by UINT64.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+AsciiStrHexToUint64S (\r
+  IN  CONST CHAR8              *String,\r
+  OUT       CHAR8              **EndPointer,  OPTIONAL\r
+  OUT       UINT64             *Data\r
+  );\r
+\r
+\r
+#ifndef DISABLE_NEW_DEPRECATED_INTERFACES\r
+\r
+/**\r
+  [ATTENTION] This function is deprecated for security reason.\r
+\r
+  Copies one Null-terminated Unicode string to another Null-terminated Unicode\r
+  string and returns the new Unicode string.\r
+\r
+  This function copies the contents of the Unicode string Source to the Unicode\r
+  string Destination, and returns Destination. If Source and Destination\r
+  overlap, then the results are undefined.\r
+\r
+  If Destination is NULL, then ASSERT().\r
+  If Destination is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Source is NULL, then ASSERT().\r
+  If Source is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Source and Destination overlap, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  @param  Destination The pointer to a Null-terminated Unicode string.\r
+  @param  Source      The pointer to a Null-terminated Unicode string.\r
+\r
+  @return Destination.\r
+\r
+**/\r
+CHAR16 *\r
+EFIAPI\r
+StrCpy (\r
+  OUT     CHAR16                    *Destination,\r
+  IN      CONST CHAR16              *Source\r
+  );\r
+\r
+\r
+/**\r
+  [ATTENTION] This function is deprecated for security reason.\r
+\r
+  Copies up to a specified length from one Null-terminated Unicode string to\r
+  another Null-terminated Unicode string and returns the new Unicode string.\r
+\r
+  This function copies the contents of the Unicode string Source to the Unicode\r
+  string Destination, and returns Destination. At most, Length Unicode\r
+  characters are copied from Source to Destination. If Length is 0, then\r
+  Destination is returned unmodified. If Length is greater that the number of\r
+  Unicode characters in Source, then Destination is padded with Null Unicode\r
+  characters. If Source and Destination overlap, then the results are\r
+  undefined.\r
+\r
+  If Length > 0 and Destination is NULL, then ASSERT().\r
+  If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length > 0 and Source is NULL, then ASSERT().\r
+  If Length > 0 and Source is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Source and Destination overlap, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and Length is greater than\r
+  PcdMaximumUnicodeStringLength, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator,\r
+  then ASSERT().\r
+\r
+  @param  Destination The pointer to a Null-terminated Unicode string.\r
+  @param  Source      The pointer to a Null-terminated Unicode string.\r
+  @param  Length      The maximum number of Unicode characters to copy.\r
+\r
+  @return Destination.\r
+\r
+**/\r
+CHAR16 *\r
+EFIAPI\r
+StrnCpy (\r
+  OUT     CHAR16                    *Destination,\r
+  IN      CONST CHAR16              *Source,\r
+  IN      UINTN                     Length\r
+  );\r
+#endif // !defined (DISABLE_NEW_DEPRECATED_INTERFACES)\r
+\r
+/**\r
+  Returns the length of a Null-terminated Unicode string.\r
+\r
+  This function returns the number of Unicode characters in the Null-terminated\r
+  Unicode string specified by String.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If String is not aligned on a 16-bit boundary, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  @param  String  Pointer to a Null-terminated Unicode string.\r
+\r
+  @return The length of String.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+StrLen (\r
+  IN      CONST CHAR16              *String\r
+  );\r
+\r
+\r
+/**\r
+  Returns the size of a Null-terminated Unicode string in bytes, including the\r
+  Null terminator.\r
+\r
+  This function returns the size, in bytes, of the Null-terminated Unicode string\r
+  specified by String.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If String is not aligned on a 16-bit boundary, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  @param  String  The pointer to a Null-terminated Unicode string.\r
+\r
+  @return The size of String.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+StrSize (\r
+  IN      CONST CHAR16              *String\r
+  );\r
+\r
+\r
+/**\r
+  Compares two Null-terminated Unicode strings, and returns the difference\r
+  between the first mismatched Unicode characters.\r
+\r
+  This function compares the Null-terminated Unicode string FirstString to the\r
+  Null-terminated Unicode string SecondString. If FirstString is identical to\r
+  SecondString, then 0 is returned. Otherwise, the value returned is the first\r
+  mismatched Unicode character in SecondString subtracted from the first\r
+  mismatched Unicode character in FirstString.\r
+\r
+  If FirstString is NULL, then ASSERT().\r
+  If FirstString is not aligned on a 16-bit boundary, then ASSERT().\r
+  If SecondString is NULL, then ASSERT().\r
+  If SecondString is not aligned on a 16-bit boundary, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more\r
+  than PcdMaximumUnicodeStringLength Unicode characters not including the\r
+  Null-terminator, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more\r
+  than PcdMaximumUnicodeStringLength Unicode characters, not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  @param  FirstString   The pointer to a Null-terminated Unicode string.\r
+  @param  SecondString  The pointer to a Null-terminated Unicode string.\r
+\r
+  @retval 0      FirstString is identical to SecondString.\r
+  @return others FirstString is not identical to SecondString.\r
+\r
+**/\r
+INTN\r
+EFIAPI\r
+StrCmp (\r
+  IN      CONST CHAR16              *FirstString,\r
+  IN      CONST CHAR16              *SecondString\r
+  );\r
+\r
+\r
+/**\r
+  Compares up to a specified length the contents of two Null-terminated Unicode strings,\r
+  and returns the difference between the first mismatched Unicode characters.\r
+\r
+  This function compares the Null-terminated Unicode string FirstString to the\r
+  Null-terminated Unicode string SecondString. At most, Length Unicode\r
+  characters will be compared. If Length is 0, then 0 is returned. If\r
+  FirstString is identical to SecondString, then 0 is returned. Otherwise, the\r
+  value returned is the first mismatched Unicode character in SecondString\r
+  subtracted from the first mismatched Unicode character in FirstString.\r
+\r
+  If Length > 0 and FirstString is NULL, then ASSERT().\r
+  If Length > 0 and FirstString is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length > 0 and SecondString is NULL, then ASSERT().\r
+  If Length > 0 and SecondString is not aligned on a 16-bit boundary, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and Length is greater than\r
+  PcdMaximumUnicodeStringLength, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator,\r
+  then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator,\r
+  then ASSERT().\r
+\r
+  @param  FirstString   The pointer to a Null-terminated Unicode string.\r
+  @param  SecondString  The pointer to a Null-terminated Unicode string.\r
+  @param  Length        The maximum number of Unicode characters to compare.\r
+\r
+  @retval 0      FirstString is identical to SecondString.\r
+  @return others FirstString is not identical to SecondString.\r
+\r
+**/\r
+INTN\r
+EFIAPI\r
+StrnCmp (\r
+  IN      CONST CHAR16              *FirstString,\r
+  IN      CONST CHAR16              *SecondString,\r
+  IN      UINTN                     Length\r
+  );\r
+\r
+\r
+#ifndef DISABLE_NEW_DEPRECATED_INTERFACES\r
+\r
+/**\r
+  [ATTENTION] This function is deprecated for security reason.\r
+\r
+  Concatenates one Null-terminated Unicode string to another Null-terminated\r
+  Unicode string, and returns the concatenated Unicode string.\r
+\r
+  This function concatenates two Null-terminated Unicode strings. The contents\r
+  of Null-terminated Unicode string Source are concatenated to the end of\r
+  Null-terminated Unicode string Destination. The Null-terminated concatenated\r
+  Unicode String is returned. If Source and Destination overlap, then the\r
+  results are undefined.\r
+\r
+  If Destination is NULL, then ASSERT().\r
+  If Destination is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Source is NULL, then ASSERT().\r
+  If Source is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Source and Destination overlap, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and Destination contains more\r
+  than PcdMaximumUnicodeStringLength Unicode characters, not including the\r
+  Null-terminator, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters, not including the\r
+  Null-terminator, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination\r
+  and Source results in a Unicode string with more than\r
+  PcdMaximumUnicodeStringLength Unicode characters, not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  @param  Destination The pointer to a Null-terminated Unicode string.\r
+  @param  Source      The pointer to a Null-terminated Unicode string.\r
+\r
+  @return Destination.\r
+\r
+**/\r
+CHAR16 *\r
+EFIAPI\r
+StrCat (\r
+  IN OUT  CHAR16                    *Destination,\r
+  IN      CONST CHAR16              *Source\r
+  );\r
+\r
+\r
+/**\r
+  [ATTENTION] This function is deprecated for security reason.\r
+\r
+  Concatenates up to a specified length one Null-terminated Unicode to the end\r
+  of another Null-terminated Unicode string, and returns the concatenated\r
+  Unicode string.\r
+\r
+  This function concatenates two Null-terminated Unicode strings. The contents\r
+  of Null-terminated Unicode string Source are concatenated to the end of\r
+  Null-terminated Unicode string Destination, and Destination is returned. At\r
+  most, Length Unicode characters are concatenated from Source to the end of\r
+  Destination, and Destination is always Null-terminated. If Length is 0, then\r
+  Destination is returned unmodified. If Source and Destination overlap, then\r
+  the results are undefined.\r
+\r
+  If Destination is NULL, then ASSERT().\r
+  If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length > 0 and Source is NULL, then ASSERT().\r
+  If Length > 0 and Source is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Source and Destination overlap, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and Length is greater than\r
+  PcdMaximumUnicodeStringLength, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and Destination contains more\r
+  than PcdMaximumUnicodeStringLength Unicode characters, not including the\r
+  Null-terminator, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters, not including the\r
+  Null-terminator, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination\r
+  and Source results in a Unicode string with more than PcdMaximumUnicodeStringLength\r
+  Unicode characters, not including the Null-terminator, then ASSERT().\r
+\r
+  @param  Destination The pointer to a Null-terminated Unicode string.\r
+  @param  Source      The pointer to a Null-terminated Unicode string.\r
+  @param  Length      The maximum number of Unicode characters to concatenate from\r
+                      Source.\r
+\r
+  @return Destination.\r
+\r
+**/\r
+CHAR16 *\r
+EFIAPI\r
+StrnCat (\r
+  IN OUT  CHAR16                    *Destination,\r
+  IN      CONST CHAR16              *Source,\r
+  IN      UINTN                     Length\r
+  );\r
+#endif // !defined (DISABLE_NEW_DEPRECATED_INTERFACES)\r
+\r
+/**\r
+  Returns the first occurrence of a Null-terminated Unicode sub-string\r
+  in a Null-terminated Unicode string.\r
+\r
+  This function scans the contents of the Null-terminated Unicode string\r
+  specified by String and returns the first occurrence of SearchString.\r
+  If SearchString is not found in String, then NULL is returned.  If\r
+  the length of SearchString is zero, then String is returned.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If String is not aligned on a 16-bit boundary, then ASSERT().\r
+  If SearchString is NULL, then ASSERT().\r
+  If SearchString is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  If PcdMaximumUnicodeStringLength is not zero, and SearchString\r
+  or String contains more than PcdMaximumUnicodeStringLength Unicode\r
+  characters, not including the Null-terminator, then ASSERT().\r
+\r
+  @param  String          The pointer to a Null-terminated Unicode string.\r
+  @param  SearchString    The pointer to a Null-terminated Unicode string to search for.\r
+\r
+  @retval NULL            If the SearchString does not appear in String.\r
+  @return others          If there is a match.\r
+\r
+**/\r
+CHAR16 *\r
+EFIAPI\r
+StrStr (\r
+  IN      CONST CHAR16              *String,\r
+  IN      CONST CHAR16              *SearchString\r
+  );\r
+\r
+/**\r
+  Convert a Null-terminated Unicode decimal string to a value of\r
+  type UINTN.\r
+\r
+  This function returns a value of type UINTN by interpreting the contents\r
+  of the Unicode string specified by String as a decimal number. The format\r
+  of the input Unicode string String is:\r
+\r
+                  [spaces] [decimal digits].\r
+\r
+  The valid decimal digit character is in the range [0-9]. The\r
+  function will ignore the pad space, which includes spaces or\r
+  tab characters, before [decimal digits]. The running zero in the\r
+  beginning of [decimal digits] will be ignored. Then, the function\r
+  stops at the first character that is a not a valid decimal character\r
+  or a Null-terminator, whichever one comes first.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If String is not aligned in a 16-bit boundary, then ASSERT().\r
+  If String has only pad spaces, then 0 is returned.\r
+  If String has no pad spaces or valid decimal digits,\r
+  then 0 is returned.\r
+  If the number represented by String overflows according\r
+  to the range defined by UINTN, then MAX_UINTN is returned.\r
+\r
+  If PcdMaximumUnicodeStringLength is not zero, and String contains\r
+  more than PcdMaximumUnicodeStringLength Unicode characters not including\r
+  the Null-terminator, then ASSERT().\r
+\r
+  @param  String      The pointer to a Null-terminated Unicode string.\r
+\r
+  @retval Value translated from String.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+StrDecimalToUintn (\r
+  IN      CONST CHAR16              *String\r
+  );\r
+\r
+/**\r
+  Convert a Null-terminated Unicode decimal string to a value of\r
+  type UINT64.\r
+\r
+  This function returns a value of type UINT64 by interpreting the contents\r
+  of the Unicode string specified by String as a decimal number. The format\r
+  of the input Unicode string String is:\r
+\r
+                  [spaces] [decimal digits].\r
+\r
+  The valid decimal digit character is in the range [0-9]. The\r
+  function will ignore the pad space, which includes spaces or\r
+  tab characters, before [decimal digits]. The running zero in the\r
+  beginning of [decimal digits] will be ignored. Then, the function\r
+  stops at the first character that is a not a valid decimal character\r
+  or a Null-terminator, whichever one comes first.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If String is not aligned in a 16-bit boundary, then ASSERT().\r
+  If String has only pad spaces, then 0 is returned.\r
+  If String has no pad spaces or valid decimal digits,\r
+  then 0 is returned.\r
+  If the number represented by String overflows according\r
+  to the range defined by UINT64, then MAX_UINT64 is returned.\r
+\r
+  If PcdMaximumUnicodeStringLength is not zero, and String contains\r
+  more than PcdMaximumUnicodeStringLength Unicode characters not including\r
+  the Null-terminator, then ASSERT().\r
+\r
+  @param  String          The pointer to a Null-terminated Unicode string.\r
+\r
+  @retval Value translated from String.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+StrDecimalToUint64 (\r
+  IN      CONST CHAR16              *String\r
+  );\r
+\r
+\r
+/**\r
+  Convert a Null-terminated Unicode hexadecimal string to a value of type UINTN.\r
+\r
+  This function returns a value of type UINTN by interpreting the contents\r
+  of the Unicode string specified by String as a hexadecimal number.\r
+  The format of the input Unicode string String is:\r
+\r
+                  [spaces][zeros][x][hexadecimal digits].\r
+\r
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].\r
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.\r
+  If "x" appears in the input string, it must be prefixed with at least one 0.\r
+  The function will ignore the pad space, which includes spaces or tab characters,\r
+  before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or\r
+  [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the\r
+  first valid hexadecimal digit. Then, the function stops at the first character\r
+  that is a not a valid hexadecimal character or NULL, whichever one comes first.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If String is not aligned in a 16-bit boundary, then ASSERT().\r
+  If String has only pad spaces, then zero is returned.\r
+  If String has no leading pad spaces, leading zeros or valid hexadecimal digits,\r
+  then zero is returned.\r
+  If the number represented by String overflows according to the range defined by\r
+  UINTN, then MAX_UINTN is returned.\r
+\r
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator,\r
+  then ASSERT().\r
+\r
+  @param  String          The pointer to a Null-terminated Unicode string.\r
+\r
+  @retval Value translated from String.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+StrHexToUintn (\r
+  IN      CONST CHAR16              *String\r
+  );\r
+\r
+\r
+/**\r
+  Convert a Null-terminated Unicode hexadecimal string to a value of type UINT64.\r
+\r
+  This function returns a value of type UINT64 by interpreting the contents\r
+  of the Unicode string specified by String as a hexadecimal number.\r
+  The format of the input Unicode string String is\r
+\r
+                  [spaces][zeros][x][hexadecimal digits].\r
+\r
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].\r
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.\r
+  If "x" appears in the input string, it must be prefixed with at least one 0.\r
+  The function will ignore the pad space, which includes spaces or tab characters,\r
+  before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or\r
+  [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the\r
+  first valid hexadecimal digit. Then, the function stops at the first character that is\r
+  a not a valid hexadecimal character or NULL, whichever one comes first.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If String is not aligned in a 16-bit boundary, then ASSERT().\r
+  If String has only pad spaces, then zero is returned.\r
+  If String has no leading pad spaces, leading zeros or valid hexadecimal digits,\r
+  then zero is returned.\r
+  If the number represented by String overflows according to the range defined by\r
+  UINT64, then MAX_UINT64 is returned.\r
+\r
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator,\r
+  then ASSERT().\r
+\r
+  @param  String          The pointer to a Null-terminated Unicode string.\r
+\r
+  @retval Value translated from String.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+StrHexToUint64 (\r
+  IN      CONST CHAR16             *String\r
+  );\r
+\r
+/**\r
+  Convert a Null-terminated Unicode string to IPv6 address and prefix length.\r
+\r
+  This function outputs a value of type IPv6_ADDRESS and may output a value\r
+  of type UINT8 by interpreting the contents of the Unicode string specified\r
+  by String. The format of the input Unicode string String is as follows:\r
+\r
+                  X:X:X:X:X:X:X:X[/P]\r
+\r
+  X contains one to four hexadecimal digit characters in the range [0-9], [a-f] and\r
+  [A-F]. X is converted to a value of type UINT16, whose low byte is stored in low\r
+  memory address and high byte is stored in high memory address. P contains decimal\r
+  digit characters in the range [0-9]. The running zero in the beginning of P will\r
+  be ignored. /P is optional.\r
+\r
+  When /P is not in the String, the function stops at the first character that is\r
+  not a valid hexadecimal digit character after eight X's are converted.\r
+\r
+  When /P is in the String, the function stops at the first character that is not\r
+  a valid decimal digit character after P is converted.\r
+\r
+  "::" can be used to compress one or more groups of X when X contains only 0.\r
+  The "::" can only appear once in the String.\r
+\r
+  If String is NULL, then ASSERT().\r
+\r
+  If Address is NULL, then ASSERT().\r
+\r
+  If String is not aligned in a 16-bit boundary, then ASSERT().\r
+\r
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters, not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  If EndPointer is not NULL and Address is translated from String, a pointer\r
+  to the character that stopped the scan is stored at the location pointed to\r
+  by EndPointer.\r
+\r
+  @param  String                   Pointer to a Null-terminated Unicode string.\r
+  @param  EndPointer               Pointer to character that stops scan.\r
+  @param  Address                  Pointer to the converted IPv6 address.\r
+  @param  PrefixLength             Pointer to the converted IPv6 address prefix\r
+                                   length. MAX_UINT8 is returned when /P is\r
+                                   not in the String.\r
+\r
+  @retval RETURN_SUCCESS           Address is translated from String.\r
+  @retval RETURN_INVALID_PARAMETER If String is NULL.\r
+                                   If Data is NULL.\r
+  @retval RETURN_UNSUPPORTED       If X contains more than four hexadecimal\r
+                                    digit characters.\r
+                                   If String contains "::" and number of X\r
+                                    is not less than 8.\r
+                                   If P starts with character that is not a\r
+                                    valid decimal digit character.\r
+                                   If the decimal number converted from P\r
+                                    exceeds 128.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+StrToIpv6Address (\r
+  IN  CONST CHAR16       *String,\r
+  OUT CHAR16             **EndPointer, OPTIONAL\r
+  OUT IPv6_ADDRESS       *Address,\r
+  OUT UINT8              *PrefixLength OPTIONAL\r
+  );\r
+\r
+/**\r
+  Convert a Null-terminated Unicode string to IPv4 address and prefix length.\r
+\r
+  This function outputs a value of type IPv4_ADDRESS and may output a value\r
+  of type UINT8 by interpreting the contents of the Unicode string specified\r
+  by String. The format of the input Unicode string String is as follows:\r
+\r
+                  D.D.D.D[/P]\r
+\r
+  D and P are decimal digit characters in the range [0-9]. The running zero in\r
+  the beginning of D and P will be ignored. /P is optional.\r
+\r
+  When /P is not in the String, the function stops at the first character that is\r
+  not a valid decimal digit character after four D's are converted.\r
+\r
+  When /P is in the String, the function stops at the first character that is not\r
+  a valid decimal digit character after P is converted.\r
+\r
+  If String is NULL, then ASSERT().\r
+\r
+  If Address is NULL, then ASSERT().\r
+\r
+  If String is not aligned in a 16-bit boundary, then ASSERT().\r
+\r
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters, not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  If EndPointer is not NULL and Address is translated from String, a pointer\r
+  to the character that stopped the scan is stored at the location pointed to\r
+  by EndPointer.\r
+\r
+  @param  String                   Pointer to a Null-terminated Unicode string.\r
+  @param  EndPointer               Pointer to character that stops scan.\r
+  @param  Address                  Pointer to the converted IPv4 address.\r
+  @param  PrefixLength             Pointer to the converted IPv4 address prefix\r
+                                   length. MAX_UINT8 is returned when /P is\r
+                                   not in the String.\r
+\r
+  @retval RETURN_SUCCESS           Address is translated from String.\r
+  @retval RETURN_INVALID_PARAMETER If String is NULL.\r
+                                   If Data is NULL.\r
+  @retval RETURN_UNSUPPORTED       If String is not in the correct format.\r
+                                   If any decimal number converted from D\r
+                                    exceeds 255.\r
+                                   If the decimal number converted from P\r
+                                    exceeds 32.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+StrToIpv4Address (\r
+  IN  CONST CHAR16       *String,\r
+  OUT CHAR16             **EndPointer, OPTIONAL\r
+  OUT IPv4_ADDRESS       *Address,\r
+  OUT UINT8              *PrefixLength OPTIONAL\r
+  );\r
+\r
+#define GUID_STRING_LENGTH  36\r
+\r
+/**\r
+  Convert a Null-terminated Unicode GUID string to a value of type\r
+  EFI_GUID.\r
+\r
+  This function outputs a GUID value by interpreting the contents of\r
+  the Unicode string specified by String. The format of the input\r
+  Unicode string String consists of 36 characters, as follows:\r
+\r
+                  aabbccdd-eeff-gghh-iijj-kkllmmnnoopp\r
+\r
+  The pairs aa - pp are two characters in the range [0-9], [a-f] and\r
+  [A-F], with each pair representing a single byte hexadecimal value.\r
+\r
+  The mapping between String and the EFI_GUID structure is as follows:\r
+                  aa          Data1[24:31]\r
+                  bb          Data1[16:23]\r
+                  cc          Data1[8:15]\r
+                  dd          Data1[0:7]\r
+                  ee          Data2[8:15]\r
+                  ff          Data2[0:7]\r
+                  gg          Data3[8:15]\r
+                  hh          Data3[0:7]\r
+                  ii          Data4[0:7]\r
+                  jj          Data4[8:15]\r
+                  kk          Data4[16:23]\r
+                  ll          Data4[24:31]\r
+                  mm          Data4[32:39]\r
+                  nn          Data4[40:47]\r
+                  oo          Data4[48:55]\r
+                  pp          Data4[56:63]\r
+\r
+  If String is NULL, then ASSERT().\r
+  If Guid is NULL, then ASSERT().\r
+  If String is not aligned in a 16-bit boundary, then ASSERT().\r
+\r
+  @param  String                   Pointer to a Null-terminated Unicode string.\r
+  @param  Guid                     Pointer to the converted GUID.\r
+\r
+  @retval RETURN_SUCCESS           Guid is translated from String.\r
+  @retval RETURN_INVALID_PARAMETER If String is NULL.\r
+                                   If Data is NULL.\r
+  @retval RETURN_UNSUPPORTED       If String is not as the above format.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+StrToGuid (\r
+  IN  CONST CHAR16       *String,\r
+  OUT GUID               *Guid\r
+  );\r
+\r
+/**\r
+  Convert a Null-terminated Unicode hexadecimal string to a byte array.\r
+\r
+  This function outputs a byte array by interpreting the contents of\r
+  the Unicode string specified by String in hexadecimal format. The format of\r
+  the input Unicode string String is:\r
+\r
+                  [XX]*\r
+\r
+  X is a hexadecimal digit character in the range [0-9], [a-f] and [A-F].\r
+  The function decodes every two hexadecimal digit characters as one byte. The\r
+  decoding stops after Length of characters and outputs Buffer containing\r
+  (Length / 2) bytes.\r
+\r
+  If String is not aligned in a 16-bit boundary, then ASSERT().\r
+\r
+  If String is NULL, then ASSERT().\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+\r
+  If Length is not multiple of 2, then ASSERT().\r
+\r
+  If PcdMaximumUnicodeStringLength is not zero and Length is greater than\r
+  PcdMaximumUnicodeStringLength, then ASSERT().\r
+\r
+  If MaxBufferSize is less than (Length / 2), then ASSERT().\r
+\r
+  @param  String                   Pointer to a Null-terminated Unicode string.\r
+  @param  Length                   The number of Unicode characters to decode.\r
+  @param  Buffer                   Pointer to the converted bytes array.\r
+  @param  MaxBufferSize            The maximum size of Buffer.\r
+\r
+  @retval RETURN_SUCCESS           Buffer is translated from String.\r
+  @retval RETURN_INVALID_PARAMETER If String is NULL.\r
+                                   If Data is NULL.\r
+                                   If Length is not multiple of 2.\r
+                                   If PcdMaximumUnicodeStringLength is not zero,\r
+                                    and Length is greater than\r
+                                    PcdMaximumUnicodeStringLength.\r
+  @retval RETURN_UNSUPPORTED       If Length of characters from String contain\r
+                                    a character that is not valid hexadecimal\r
+                                    digit characters, or a Null-terminator.\r
+  @retval RETURN_BUFFER_TOO_SMALL  If MaxBufferSize is less than (Length / 2).\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+StrHexToBytes (\r
+  IN  CONST CHAR16       *String,\r
+  IN  UINTN              Length,\r
+  OUT UINT8              *Buffer,\r
+  IN  UINTN              MaxBufferSize\r
+  );\r
+\r
+#ifndef DISABLE_NEW_DEPRECATED_INTERFACES\r
+\r
+/**\r
+  [ATTENTION] This function is deprecated for security reason.\r
+\r
+  Convert a Null-terminated Unicode string to a Null-terminated\r
+  ASCII string and returns the ASCII string.\r
+\r
+  This function converts the content of the Unicode string Source\r
+  to the ASCII string Destination by copying the lower 8 bits of\r
+  each Unicode character. It returns Destination.\r
+\r
+  The caller is responsible to make sure Destination points to a buffer with size\r
+  equal or greater than ((StrLen (Source) + 1) * sizeof (CHAR8)) in bytes.\r
+\r
+  If any Unicode characters in Source contain non-zero value in\r
+  the upper 8 bits, then ASSERT().\r
+\r
+  If Destination is NULL, then ASSERT().\r
+  If Source is NULL, then ASSERT().\r
+  If Source is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Source and Destination overlap, then ASSERT().\r
+\r
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains\r
+  more than PcdMaximumUnicodeStringLength Unicode characters not including\r
+  the Null-terminator, then ASSERT().\r
+\r
+  If PcdMaximumAsciiStringLength is not zero, and Source contains more\r
+  than PcdMaximumAsciiStringLength Unicode characters not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  @param  Source        The pointer to a Null-terminated Unicode string.\r
+  @param  Destination   The pointer to a Null-terminated ASCII string.\r
+\r
+  @return Destination.\r
+\r
+**/\r
+CHAR8 *\r
+EFIAPI\r
+UnicodeStrToAsciiStr (\r
+  IN      CONST CHAR16              *Source,\r
+  OUT     CHAR8                     *Destination\r
+  );\r
+\r
+#endif // !defined (DISABLE_NEW_DEPRECATED_INTERFACES)\r
+\r
+/**\r
+  Convert a Null-terminated Unicode string to a Null-terminated\r
+  ASCII string.\r
+\r
+  This function is similar to AsciiStrCpyS.\r
+\r
+  This function converts the content of the Unicode string Source\r
+  to the ASCII string Destination by copying the lower 8 bits of\r
+  each Unicode character. The function terminates the ASCII string\r
+  Destination by appending a Null-terminator character at the end.\r
+\r
+  The caller is responsible to make sure Destination points to a buffer with size\r
+  equal or greater than ((StrLen (Source) + 1) * sizeof (CHAR8)) in bytes.\r
+\r
+  If any Unicode characters in Source contain non-zero value in\r
+  the upper 8 bits, then ASSERT().\r
+\r
+  If Source is not aligned on a 16-bit boundary, then ASSERT().\r
+  If an error would be returned, then the function will also ASSERT().\r
+\r
+  If an error is returned, then the Destination is unmodified.\r
+\r
+  @param  Source        The pointer to a Null-terminated Unicode string.\r
+  @param  Destination   The pointer to a Null-terminated ASCII string.\r
+  @param  DestMax       The maximum number of Destination Ascii\r
+                        char, including terminating null char.\r
+\r
+  @retval RETURN_SUCCESS           String is converted.\r
+  @retval RETURN_BUFFER_TOO_SMALL  If DestMax is NOT greater than StrLen(Source).\r
+  @retval RETURN_INVALID_PARAMETER If Destination is NULL.\r
+                                   If Source is NULL.\r
+                                   If PcdMaximumAsciiStringLength is not zero,\r
+                                    and DestMax is greater than\r
+                                    PcdMaximumAsciiStringLength.\r
+                                   If PcdMaximumUnicodeStringLength is not zero,\r
+                                    and DestMax is greater than\r
+                                    PcdMaximumUnicodeStringLength.\r
+                                   If DestMax is 0.\r
+  @retval RETURN_ACCESS_DENIED     If Source and Destination overlap.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+UnicodeStrToAsciiStrS (\r
+  IN      CONST CHAR16              *Source,\r
+  OUT     CHAR8                     *Destination,\r
+  IN      UINTN                     DestMax\r
+  );\r
+\r
+/**\r
+  Convert not more than Length successive characters from a Null-terminated\r
+  Unicode string to a Null-terminated Ascii string. If no null char is copied\r
+  from Source, then Destination[Length] is always set to null.\r
+\r
+  This function converts not more than Length successive characters from the\r
+  Unicode string Source to the Ascii string Destination by copying the lower 8\r
+  bits of each Unicode character. The function terminates the Ascii string\r
+  Destination by appending a Null-terminator character at the end.\r
+\r
+  The caller is responsible to make sure Destination points to a buffer with size\r
+  equal or greater than ((StrLen (Source) + 1) * sizeof (CHAR8)) in bytes.\r
+\r
+  If any Unicode characters in Source contain non-zero value in the upper 8\r
+  bits, then ASSERT().\r
+  If Source is not aligned on a 16-bit boundary, then ASSERT().\r
+  If an error would be returned, then the function will also ASSERT().\r
+\r
+  If an error is returned, then the Destination is unmodified.\r
+\r
+  @param  Source             The pointer to a Null-terminated Unicode string.\r
+  @param  Length             The maximum number of Unicode characters to\r
+                             convert.\r
+  @param  Destination        The pointer to a Null-terminated Ascii string.\r
+  @param  DestMax            The maximum number of Destination Ascii\r
+                             char, including terminating null char.\r
+  @param  DestinationLength  The number of Unicode characters converted.\r
+\r
+  @retval RETURN_SUCCESS            String is converted.\r
+  @retval RETURN_INVALID_PARAMETER  If Destination is NULL.\r
+                                    If Source is NULL.\r
+                                    If DestinationLength is NULL.\r
+                                    If PcdMaximumAsciiStringLength is not zero,\r
+                                    and Length or DestMax is greater than\r
+                                    PcdMaximumAsciiStringLength.\r
+                                    If PcdMaximumUnicodeStringLength is not\r
+                                    zero, and Length or DestMax is greater than\r
+                                    PcdMaximumUnicodeStringLength.\r
+                                    If DestMax is 0.\r
+  @retval RETURN_BUFFER_TOO_SMALL   If DestMax is NOT greater than\r
+                                    MIN(StrLen(Source), Length).\r
+  @retval RETURN_ACCESS_DENIED      If Source and Destination overlap.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+UnicodeStrnToAsciiStrS (\r
+  IN      CONST CHAR16              *Source,\r
+  IN      UINTN                     Length,\r
+  OUT     CHAR8                     *Destination,\r
+  IN      UINTN                     DestMax,\r
+  OUT     UINTN                     *DestinationLength\r
+  );\r
+\r
+#ifndef DISABLE_NEW_DEPRECATED_INTERFACES\r
+\r
+/**\r
+  [ATTENTION] This function is deprecated for security reason.\r
+\r
+  Copies one Null-terminated ASCII string to another Null-terminated ASCII\r
+  string and returns the new ASCII string.\r
+\r
+  This function copies the contents of the ASCII string Source to the ASCII\r
+  string Destination, and returns Destination. If Source and Destination\r
+  overlap, then the results are undefined.\r
+\r
+  If Destination is NULL, then ASSERT().\r
+  If Source is NULL, then ASSERT().\r
+  If Source and Destination overlap, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero and Source contains more than\r
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
+  then ASSERT().\r
+\r
+  @param  Destination The pointer to a Null-terminated ASCII string.\r
+  @param  Source      The pointer to a Null-terminated ASCII string.\r
+\r
+  @return Destination\r
+\r
+**/\r
+CHAR8 *\r
+EFIAPI\r
+AsciiStrCpy (\r
+  OUT     CHAR8                     *Destination,\r
+  IN      CONST CHAR8               *Source\r
+  );\r
+\r
+\r
+/**\r
+  [ATTENTION] This function is deprecated for security reason.\r
+\r
+  Copies up to a specified length one Null-terminated ASCII string to another\r
+  Null-terminated ASCII string and returns the new ASCII string.\r
+\r
+  This function copies the contents of the ASCII string Source to the ASCII\r
+  string Destination, and returns Destination. At most, Length ASCII characters\r
+  are copied from Source to Destination. If Length is 0, then Destination is\r
+  returned unmodified. If Length is greater that the number of ASCII characters\r
+  in Source, then Destination is padded with Null ASCII characters. If Source\r
+  and Destination overlap, then the results are undefined.\r
+\r
+  If Destination is NULL, then ASSERT().\r
+  If Source is NULL, then ASSERT().\r
+  If Source and Destination overlap, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero, and Length is greater than\r
+  PcdMaximumAsciiStringLength, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero, and Source contains more than\r
+  PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
+  then ASSERT().\r
+\r
+  @param  Destination The pointer to a Null-terminated ASCII string.\r
+  @param  Source      The pointer to a Null-terminated ASCII string.\r
+  @param  Length      The maximum number of ASCII characters to copy.\r
+\r
+  @return Destination\r
+\r
+**/\r
+CHAR8 *\r
+EFIAPI\r
+AsciiStrnCpy (\r
+  OUT     CHAR8                     *Destination,\r
+  IN      CONST CHAR8               *Source,\r
+  IN      UINTN                     Length\r
+  );\r
+#endif // !defined (DISABLE_NEW_DEPRECATED_INTERFACES)\r
+\r
+/**\r
+  Returns the length of a Null-terminated ASCII string.\r
+\r
+  This function returns the number of ASCII characters in the Null-terminated\r
+  ASCII string specified by String.\r
+\r
+  If Length > 0 and Destination is NULL, then ASSERT().\r
+  If Length > 0 and Source is NULL, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero and String contains more than\r
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
+  then ASSERT().\r
+\r
+  @param  String  The pointer to a Null-terminated ASCII string.\r
+\r
+  @return The length of String.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsciiStrLen (\r
+  IN      CONST CHAR8               *String\r
+  );\r
+\r
+\r
+/**\r
+  Returns the size of a Null-terminated ASCII string in bytes, including the\r
+  Null terminator.\r
+\r
+  This function returns the size, in bytes, of the Null-terminated ASCII string\r
+  specified by String.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero and String contains more than\r
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
+  then ASSERT().\r
+\r
+  @param  String  The pointer to a Null-terminated ASCII string.\r
+\r
+  @return The size of String.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsciiStrSize (\r
+  IN      CONST CHAR8               *String\r
+  );\r
+\r
+\r
+/**\r
+  Compares two Null-terminated ASCII strings, and returns the difference\r
+  between the first mismatched ASCII characters.\r
+\r
+  This function compares the Null-terminated ASCII string FirstString to the\r
+  Null-terminated ASCII string SecondString. If FirstString is identical to\r
+  SecondString, then 0 is returned. Otherwise, the value returned is the first\r
+  mismatched ASCII character in SecondString subtracted from the first\r
+  mismatched ASCII character in FirstString.\r
+\r
+  If FirstString is NULL, then ASSERT().\r
+  If SecondString is NULL, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero and FirstString contains more than\r
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
+  then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero and SecondString contains more\r
+  than PcdMaximumAsciiStringLength ASCII characters not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  @param  FirstString   The pointer to a Null-terminated ASCII string.\r
+  @param  SecondString  The pointer to a Null-terminated ASCII string.\r
+\r
+  @retval ==0      FirstString is identical to SecondString.\r
+  @retval !=0      FirstString is not identical to SecondString.\r
+\r
+**/\r
+INTN\r
+EFIAPI\r
+AsciiStrCmp (\r
+  IN      CONST CHAR8               *FirstString,\r
+  IN      CONST CHAR8               *SecondString\r
+  );\r
+\r
+\r
+/**\r
+  Performs a case insensitive comparison of two Null-terminated ASCII strings,\r
+  and returns the difference between the first mismatched ASCII characters.\r
+\r
+  This function performs a case insensitive comparison of the Null-terminated\r
+  ASCII string FirstString to the Null-terminated ASCII string SecondString. If\r
+  FirstString is identical to SecondString, then 0 is returned. Otherwise, the\r
+  value returned is the first mismatched lower case ASCII character in\r
+  SecondString subtracted from the first mismatched lower case ASCII character\r
+  in FirstString.\r
+\r
+  If FirstString is NULL, then ASSERT().\r
+  If SecondString is NULL, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero and FirstString contains more than\r
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
+  then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero and SecondString contains more\r
+  than PcdMaximumAsciiStringLength ASCII characters not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  @param  FirstString   The pointer to a Null-terminated ASCII string.\r
+  @param  SecondString  The pointer to a Null-terminated ASCII string.\r
+\r
+  @retval ==0    FirstString is identical to SecondString using case insensitive\r
+                 comparisons.\r
+  @retval !=0    FirstString is not identical to SecondString using case\r
+                 insensitive comparisons.\r
+\r
+**/\r
+INTN\r
+EFIAPI\r
+AsciiStriCmp (\r
+  IN      CONST CHAR8               *FirstString,\r
+  IN      CONST CHAR8               *SecondString\r
+  );\r
+\r
+\r
+/**\r
+  Compares two Null-terminated ASCII strings with maximum lengths, and returns\r
+  the difference between the first mismatched ASCII characters.\r
+\r
+  This function compares the Null-terminated ASCII string FirstString to the\r
+  Null-terminated ASCII  string SecondString. At most, Length ASCII characters\r
+  will be compared. If Length is 0, then 0 is returned. If FirstString is\r
+  identical to SecondString, then 0 is returned. Otherwise, the value returned\r
+  is the first mismatched ASCII character in SecondString subtracted from the\r
+  first mismatched ASCII character in FirstString.\r
+\r
+  If Length > 0 and FirstString is NULL, then ASSERT().\r
+  If Length > 0 and SecondString is NULL, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero, and Length is greater than\r
+  PcdMaximumAsciiStringLength, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero, and FirstString contains more than\r
+  PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
+  then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero, and SecondString contains more than\r
+  PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
+  then ASSERT().\r
+\r
+  @param  FirstString   The pointer to a Null-terminated ASCII string.\r
+  @param  SecondString  The pointer to a Null-terminated ASCII string.\r
+  @param  Length        The maximum number of ASCII characters for compare.\r
+\r
+  @retval ==0       FirstString is identical to SecondString.\r
+  @retval !=0       FirstString is not identical to SecondString.\r
+\r
+**/\r
+INTN\r
+EFIAPI\r
+AsciiStrnCmp (\r
+  IN      CONST CHAR8               *FirstString,\r
+  IN      CONST CHAR8               *SecondString,\r
+  IN      UINTN                     Length\r
+  );\r
+\r
+\r
+#ifndef DISABLE_NEW_DEPRECATED_INTERFACES\r
+\r
+/**\r
+  [ATTENTION] This function is deprecated for security reason.\r
+\r
+  Concatenates one Null-terminated ASCII string to another Null-terminated\r
+  ASCII string, and returns the concatenated ASCII string.\r
+\r
+  This function concatenates two Null-terminated ASCII strings. The contents of\r
+  Null-terminated ASCII string Source are concatenated to the end of Null-\r
+  terminated ASCII string Destination. The Null-terminated concatenated ASCII\r
+  String is returned.\r
+\r
+  If Destination is NULL, then ASSERT().\r
+  If Source is NULL, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero and Destination contains more than\r
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
+  then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero and Source contains more than\r
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
+  then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero and concatenating Destination and\r
+  Source results in a ASCII string with more than PcdMaximumAsciiStringLength\r
+  ASCII characters, then ASSERT().\r
+\r
+  @param  Destination The pointer to a Null-terminated ASCII string.\r
+  @param  Source      The pointer to a Null-terminated ASCII string.\r
+\r
+  @return Destination\r
+\r
+**/\r
+CHAR8 *\r
+EFIAPI\r
+AsciiStrCat (\r
+  IN OUT CHAR8    *Destination,\r
+  IN CONST CHAR8  *Source\r
+  );\r
+\r
+\r
+/**\r
+  [ATTENTION] This function is deprecated for security reason.\r
+\r
+  Concatenates up to a specified length one Null-terminated ASCII string to\r
+  the end of another Null-terminated ASCII string, and returns the\r
+  concatenated ASCII string.\r
+\r
+  This function concatenates two Null-terminated ASCII strings. The contents\r
+  of Null-terminated ASCII string Source are concatenated to the end of Null-\r
+  terminated ASCII string Destination, and Destination is returned. At most,\r
+  Length ASCII characters are concatenated from Source to the end of\r
+  Destination, and Destination is always Null-terminated. If Length is 0, then\r
+  Destination is returned unmodified. If Source and Destination overlap, then\r
+  the results are undefined.\r
+\r
+  If Length > 0 and Destination is NULL, then ASSERT().\r
+  If Length > 0 and Source is NULL, then ASSERT().\r
+  If Source and Destination overlap, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero, and Length is greater than\r
+  PcdMaximumAsciiStringLength, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero, and Destination contains more than\r
+  PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
+  then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero, and Source contains more than\r
+  PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
+  then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero, and concatenating Destination and\r
+  Source results in a ASCII string with more than PcdMaximumAsciiStringLength\r
+  ASCII characters, not including the Null-terminator, then ASSERT().\r
+\r
+  @param  Destination The pointer to a Null-terminated ASCII string.\r
+  @param  Source      The pointer to a Null-terminated ASCII string.\r
+  @param  Length      The maximum number of ASCII characters to concatenate from\r
+                      Source.\r
+\r
+  @return Destination\r
+\r
+**/\r
+CHAR8 *\r
+EFIAPI\r
+AsciiStrnCat (\r
+  IN OUT  CHAR8                     *Destination,\r
+  IN      CONST CHAR8               *Source,\r
+  IN      UINTN                     Length\r
+  );\r
+#endif // !defined (DISABLE_NEW_DEPRECATED_INTERFACES)\r
+\r
+/**\r
+  Returns the first occurrence of a Null-terminated ASCII sub-string\r
+  in a Null-terminated ASCII string.\r
+\r
+  This function scans the contents of the ASCII string specified by String\r
+  and returns the first occurrence of SearchString. If SearchString is not\r
+  found in String, then NULL is returned. If the length of SearchString is zero,\r
+  then String is returned.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If SearchString is NULL, then ASSERT().\r
+\r
+  If PcdMaximumAsciiStringLength is not zero, and SearchString or\r
+  String contains more than PcdMaximumAsciiStringLength Unicode characters\r
+  not including the Null-terminator, then ASSERT().\r
+\r
+  @param  String          The pointer to a Null-terminated ASCII string.\r
+  @param  SearchString    The pointer to a Null-terminated ASCII string to search for.\r
+\r
+  @retval NULL            If the SearchString does not appear in String.\r
+  @retval others          If there is a match return the first occurrence of SearchingString.\r
+                          If the length of SearchString is zero,return String.\r
+\r
+**/\r
+CHAR8 *\r
+EFIAPI\r
+AsciiStrStr (\r
+  IN      CONST CHAR8               *String,\r
+  IN      CONST CHAR8               *SearchString\r
+  );\r
+\r
+\r
+/**\r
+  Convert a Null-terminated ASCII decimal string to a value of type\r
+  UINTN.\r
+\r
+  This function returns a value of type UINTN by interpreting the contents\r
+  of the ASCII string String as a decimal number. The format of the input\r
+  ASCII string String is:\r
+\r
+                    [spaces] [decimal digits].\r
+\r
+  The valid decimal digit character is in the range [0-9]. The function will\r
+  ignore the pad space, which includes spaces or tab characters, before the digits.\r
+  The running zero in the beginning of [decimal digits] will be ignored. Then, the\r
+  function stops at the first character that is a not a valid decimal character or\r
+  Null-terminator, whichever on comes first.\r
+\r
+  If String has only pad spaces, then 0 is returned.\r
+  If String has no pad spaces or valid decimal digits, then 0 is returned.\r
+  If the number represented by String overflows according to the range defined by\r
+  UINTN, then MAX_UINTN is returned.\r
+  If String is NULL, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero, and String contains more than\r
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
+  then ASSERT().\r
+\r
+  @param  String          The pointer to a Null-terminated ASCII string.\r
+\r
+  @retval The value translated from String.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsciiStrDecimalToUintn (\r
+  IN      CONST CHAR8               *String\r
+  );\r
+\r
+\r
+/**\r
+  Convert a Null-terminated ASCII decimal string to a value of type\r
+  UINT64.\r
+\r
+  This function returns a value of type UINT64 by interpreting the contents\r
+  of the ASCII string String as a decimal number. The format of the input\r
+  ASCII string String is:\r
+\r
+                    [spaces] [decimal digits].\r
+\r
+  The valid decimal digit character is in the range [0-9]. The function will\r
+  ignore the pad space, which includes spaces or tab characters, before the digits.\r
+  The running zero in the beginning of [decimal digits] will be ignored. Then, the\r
+  function stops at the first character that is a not a valid decimal character or\r
+  Null-terminator, whichever on comes first.\r
+\r
+  If String has only pad spaces, then 0 is returned.\r
+  If String has no pad spaces or valid decimal digits, then 0 is returned.\r
+  If the number represented by String overflows according to the range defined by\r
+  UINT64, then MAX_UINT64 is returned.\r
+  If String is NULL, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero, and String contains more than\r
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
+  then ASSERT().\r
+\r
+  @param  String          The pointer to a Null-terminated ASCII string.\r
+\r
+  @retval Value translated from String.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsciiStrDecimalToUint64 (\r
+  IN      CONST CHAR8               *String\r
+  );\r
+\r
+\r
+/**\r
+  Convert a Null-terminated ASCII hexadecimal string to a value of type UINTN.\r
+\r
+  This function returns a value of type UINTN by interpreting the contents of\r
+  the ASCII string String as a hexadecimal number. The format of the input ASCII\r
+  string String is:\r
+\r
+                  [spaces][zeros][x][hexadecimal digits].\r
+\r
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].\r
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x"\r
+  appears in the input string, it must be prefixed with at least one 0. The function\r
+  will ignore the pad space, which includes spaces or tab characters, before [zeros],\r
+  [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits]\r
+  will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal\r
+  digit. Then, the function stops at the first character that is a not a valid\r
+  hexadecimal character or Null-terminator, whichever on comes first.\r
+\r
+  If String has only pad spaces, then 0 is returned.\r
+  If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then\r
+  0 is returned.\r
+\r
+  If the number represented by String overflows according to the range defined by UINTN,\r
+  then MAX_UINTN is returned.\r
+  If String is NULL, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero,\r
+  and String contains more than PcdMaximumAsciiStringLength ASCII characters not including\r
+  the Null-terminator, then ASSERT().\r
+\r
+  @param  String          The pointer to a Null-terminated ASCII string.\r
+\r
+  @retval Value translated from String.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsciiStrHexToUintn (\r
+  IN      CONST CHAR8               *String\r
+  );\r
+\r
+\r
+/**\r
+  Convert a Null-terminated ASCII hexadecimal string to a value of type UINT64.\r
+\r
+  This function returns a value of type UINT64 by interpreting the contents of\r
+  the ASCII string String as a hexadecimal number. The format of the input ASCII\r
+  string String is:\r
+\r
+                  [spaces][zeros][x][hexadecimal digits].\r
+\r
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].\r
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x"\r
+  appears in the input string, it must be prefixed with at least one 0. The function\r
+  will ignore the pad space, which includes spaces or tab characters, before [zeros],\r
+  [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits]\r
+  will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal\r
+  digit. Then, the function stops at the first character that is a not a valid\r
+  hexadecimal character or Null-terminator, whichever on comes first.\r
+\r
+  If String has only pad spaces, then 0 is returned.\r
+  If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then\r
+  0 is returned.\r
+\r
+  If the number represented by String overflows according to the range defined by UINT64,\r
+  then MAX_UINT64 is returned.\r
+  If String is NULL, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero,\r
+  and String contains more than PcdMaximumAsciiStringLength ASCII characters not including\r
+  the Null-terminator, then ASSERT().\r
+\r
+  @param  String          The pointer to a Null-terminated ASCII string.\r
+\r
+  @retval Value translated from String.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsciiStrHexToUint64 (\r
+  IN      CONST CHAR8                *String\r
+  );\r
+\r
+/**\r
+  Convert a Null-terminated ASCII string to IPv6 address and prefix length.\r
+\r
+  This function outputs a value of type IPv6_ADDRESS and may output a value\r
+  of type UINT8 by interpreting the contents of the ASCII string specified\r
+  by String. The format of the input ASCII string String is as follows:\r
+\r
+                  X:X:X:X:X:X:X:X[/P]\r
+\r
+  X contains one to four hexadecimal digit characters in the range [0-9], [a-f] and\r
+  [A-F]. X is converted to a value of type UINT16, whose low byte is stored in low\r
+  memory address and high byte is stored in high memory address. P contains decimal\r
+  digit characters in the range [0-9]. The running zero in the beginning of P will\r
+  be ignored. /P is optional.\r
+\r
+  When /P is not in the String, the function stops at the first character that is\r
+  not a valid hexadecimal digit character after eight X's are converted.\r
+\r
+  When /P is in the String, the function stops at the first character that is not\r
+  a valid decimal digit character after P is converted.\r
+\r
+  "::" can be used to compress one or more groups of X when X contains only 0.\r
+  The "::" can only appear once in the String.\r
+\r
+  If String is NULL, then ASSERT().\r
+\r
+  If Address is NULL, then ASSERT().\r
+\r
+  If EndPointer is not NULL and Address is translated from String, a pointer\r
+  to the character that stopped the scan is stored at the location pointed to\r
+  by EndPointer.\r
+\r
+  @param  String                   Pointer to a Null-terminated ASCII string.\r
+  @param  EndPointer               Pointer to character that stops scan.\r
+  @param  Address                  Pointer to the converted IPv6 address.\r
+  @param  PrefixLength             Pointer to the converted IPv6 address prefix\r
+                                   length. MAX_UINT8 is returned when /P is\r
+                                   not in the String.\r
+\r
+  @retval RETURN_SUCCESS           Address is translated from String.\r
+  @retval RETURN_INVALID_PARAMETER If String is NULL.\r
+                                   If Data is NULL.\r
+  @retval RETURN_UNSUPPORTED       If X contains more than four hexadecimal\r
+                                    digit characters.\r
+                                   If String contains "::" and number of X\r
+                                    is not less than 8.\r
+                                   If P starts with character that is not a\r
+                                    valid decimal digit character.\r
+                                   If the decimal number converted from P\r
+                                    exceeds 128.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+AsciiStrToIpv6Address (\r
+  IN  CONST CHAR8        *String,\r
+  OUT CHAR8              **EndPointer, OPTIONAL\r
+  OUT IPv6_ADDRESS       *Address,\r
+  OUT UINT8              *PrefixLength OPTIONAL\r
+  );\r
+\r
+/**\r
+  Convert a Null-terminated ASCII string to IPv4 address and prefix length.\r
+\r
+  This function outputs a value of type IPv4_ADDRESS and may output a value\r
+  of type UINT8 by interpreting the contents of the ASCII string specified\r
+  by String. The format of the input ASCII string String is as follows:\r
+\r
+                  D.D.D.D[/P]\r
+\r
+  D and P are decimal digit characters in the range [0-9]. The running zero in\r
+  the beginning of D and P will be ignored. /P is optional.\r
+\r
+  When /P is not in the String, the function stops at the first character that is\r
+  not a valid decimal digit character after four D's are converted.\r
+\r
+  When /P is in the String, the function stops at the first character that is not\r
+  a valid decimal digit character after P is converted.\r
+\r
+  If String is NULL, then ASSERT().\r
+\r
+  If Address is NULL, then ASSERT().\r
+\r
+  If EndPointer is not NULL and Address is translated from String, a pointer\r
+  to the character that stopped the scan is stored at the location pointed to\r
+  by EndPointer.\r
+\r
+  @param  String                   Pointer to a Null-terminated ASCII string.\r
+  @param  EndPointer               Pointer to character that stops scan.\r
+  @param  Address                  Pointer to the converted IPv4 address.\r
+  @param  PrefixLength             Pointer to the converted IPv4 address prefix\r
+                                   length. MAX_UINT8 is returned when /P is\r
+                                   not in the String.\r
+\r
+  @retval RETURN_SUCCESS           Address is translated from String.\r
+  @retval RETURN_INVALID_PARAMETER If String is NULL.\r
+                                   If Data is NULL.\r
+  @retval RETURN_UNSUPPORTED       If String is not in the correct format.\r
+                                   If any decimal number converted from D\r
+                                    exceeds 255.\r
+                                   If the decimal number converted from P\r
+                                    exceeds 32.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+AsciiStrToIpv4Address (\r
+  IN  CONST CHAR8        *String,\r
+  OUT CHAR8              **EndPointer, OPTIONAL\r
+  OUT IPv4_ADDRESS       *Address,\r
+  OUT UINT8              *PrefixLength OPTIONAL\r
+  );\r
+\r
+/**\r
+  Convert a Null-terminated ASCII GUID string to a value of type\r
+  EFI_GUID.\r
+\r
+  This function outputs a GUID value by interpreting the contents of\r
+  the ASCII string specified by String. The format of the input\r
+  ASCII string String consists of 36 characters, as follows:\r
+\r
+                  aabbccdd-eeff-gghh-iijj-kkllmmnnoopp\r
+\r
+  The pairs aa - pp are two characters in the range [0-9], [a-f] and\r
+  [A-F], with each pair representing a single byte hexadecimal value.\r
+\r
+  The mapping between String and the EFI_GUID structure is as follows:\r
+                  aa          Data1[24:31]\r
+                  bb          Data1[16:23]\r
+                  cc          Data1[8:15]\r
+                  dd          Data1[0:7]\r
+                  ee          Data2[8:15]\r
+                  ff          Data2[0:7]\r
+                  gg          Data3[8:15]\r
+                  hh          Data3[0:7]\r
+                  ii          Data4[0:7]\r
+                  jj          Data4[8:15]\r
+                  kk          Data4[16:23]\r
+                  ll          Data4[24:31]\r
+                  mm          Data4[32:39]\r
+                  nn          Data4[40:47]\r
+                  oo          Data4[48:55]\r
+                  pp          Data4[56:63]\r
+\r
+  If String is NULL, then ASSERT().\r
+  If Guid is NULL, then ASSERT().\r
+\r
+  @param  String                   Pointer to a Null-terminated ASCII string.\r
+  @param  Guid                     Pointer to the converted GUID.\r
+\r
+  @retval RETURN_SUCCESS           Guid is translated from String.\r
+  @retval RETURN_INVALID_PARAMETER If String is NULL.\r
+                                   If Data is NULL.\r
+  @retval RETURN_UNSUPPORTED       If String is not as the above format.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+AsciiStrToGuid (\r
+  IN  CONST CHAR8        *String,\r
+  OUT GUID               *Guid\r
+  );\r
+\r
+/**\r
+  Convert a Null-terminated ASCII hexadecimal string to a byte array.\r
+\r
+  This function outputs a byte array by interpreting the contents of\r
+  the ASCII string specified by String in hexadecimal format. The format of\r
+  the input ASCII string String is:\r
+\r
+                  [XX]*\r
+\r
+  X is a hexadecimal digit character in the range [0-9], [a-f] and [A-F].\r
+  The function decodes every two hexadecimal digit characters as one byte. The\r
+  decoding stops after Length of characters and outputs Buffer containing\r
+  (Length / 2) bytes.\r
+\r
+  If String is NULL, then ASSERT().\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+\r
+  If Length is not multiple of 2, then ASSERT().\r
+\r
+  If PcdMaximumAsciiStringLength is not zero and Length is greater than\r
+  PcdMaximumAsciiStringLength, then ASSERT().\r
+\r
+  If MaxBufferSize is less than (Length / 2), then ASSERT().\r
+\r
+  @param  String                   Pointer to a Null-terminated ASCII string.\r
+  @param  Length                   The number of ASCII characters to decode.\r
+  @param  Buffer                   Pointer to the converted bytes array.\r
+  @param  MaxBufferSize            The maximum size of Buffer.\r
+\r
+  @retval RETURN_SUCCESS           Buffer is translated from String.\r
+  @retval RETURN_INVALID_PARAMETER If String is NULL.\r
+                                   If Data is NULL.\r
+                                   If Length is not multiple of 2.\r
+                                   If PcdMaximumAsciiStringLength is not zero,\r
+                                    and Length is greater than\r
+                                    PcdMaximumAsciiStringLength.\r
+  @retval RETURN_UNSUPPORTED       If Length of characters from String contain\r
+                                    a character that is not valid hexadecimal\r
+                                    digit characters, or a Null-terminator.\r
+  @retval RETURN_BUFFER_TOO_SMALL  If MaxBufferSize is less than (Length / 2).\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+AsciiStrHexToBytes (\r
+  IN  CONST CHAR8        *String,\r
+  IN  UINTN              Length,\r
+  OUT UINT8              *Buffer,\r
+  IN  UINTN              MaxBufferSize\r
+  );\r
+\r
+#ifndef DISABLE_NEW_DEPRECATED_INTERFACES\r
+\r
+/**\r
+  [ATTENTION] This function is deprecated for security reason.\r
+\r
+  Convert one Null-terminated ASCII string to a Null-terminated\r
+  Unicode string and returns the Unicode string.\r
+\r
+  This function converts the contents of the ASCII string Source to the Unicode\r
+  string Destination, and returns Destination.  The function terminates the\r
+  Unicode string Destination by appending a Null-terminator character at the end.\r
+  The caller is responsible to make sure Destination points to a buffer with size\r
+  equal or greater than ((AsciiStrLen (Source) + 1) * sizeof (CHAR16)) in bytes.\r
+\r
+  If Destination is NULL, then ASSERT().\r
+  If Destination is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Source is NULL, then ASSERT().\r
+  If Source and Destination overlap, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero, and Source contains more than\r
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
+  then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
+  PcdMaximumUnicodeStringLength ASCII characters not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  @param  Source        The pointer to a Null-terminated ASCII string.\r
+  @param  Destination   The pointer to a Null-terminated Unicode string.\r
+\r
+  @return Destination.\r
+\r
+**/\r
+CHAR16 *\r
+EFIAPI\r
+AsciiStrToUnicodeStr (\r
+  IN      CONST CHAR8               *Source,\r
+  OUT     CHAR16                    *Destination\r
+  );\r
+\r
+#endif // !defined (DISABLE_NEW_DEPRECATED_INTERFACES)\r
+\r
+/**\r
+  Convert one Null-terminated ASCII string to a Null-terminated\r
+  Unicode string.\r
+\r
+  This function is similar to StrCpyS.\r
+\r
+  This function converts the contents of the ASCII string Source to the Unicode\r
+  string Destination. The function terminates the Unicode string Destination by\r
+  appending a Null-terminator character at the end.\r
+\r
+  The caller is responsible to make sure Destination points to a buffer with size\r
+  equal or greater than ((AsciiStrLen (Source) + 1) * sizeof (CHAR16)) in bytes.\r
+\r
+  If Destination is not aligned on a 16-bit boundary, then ASSERT().\r
+  If an error would be returned, then the function will also ASSERT().\r
+\r
+  If an error is returned, then the Destination is unmodified.\r
+\r
+  @param  Source        The pointer to a Null-terminated ASCII string.\r
+  @param  Destination   The pointer to a Null-terminated Unicode string.\r
+  @param  DestMax       The maximum number of Destination Unicode\r
+                        char, including terminating null char.\r
+\r
+  @retval RETURN_SUCCESS           String is converted.\r
+  @retval RETURN_BUFFER_TOO_SMALL  If DestMax is NOT greater than StrLen(Source).\r
+  @retval RETURN_INVALID_PARAMETER If Destination is NULL.\r
+                                   If Source is NULL.\r
+                                   If PcdMaximumUnicodeStringLength is not zero,\r
+                                    and DestMax is greater than\r
+                                    PcdMaximumUnicodeStringLength.\r
+                                   If PcdMaximumAsciiStringLength is not zero,\r
+                                    and DestMax is greater than\r
+                                    PcdMaximumAsciiStringLength.\r
+                                   If DestMax is 0.\r
+  @retval RETURN_ACCESS_DENIED     If Source and Destination overlap.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+AsciiStrToUnicodeStrS (\r
+  IN      CONST CHAR8               *Source,\r
+  OUT     CHAR16                    *Destination,\r
+  IN      UINTN                     DestMax\r
+  );\r
+\r
+/**\r
+  Convert not more than Length successive characters from a Null-terminated\r
+  Ascii string to a Null-terminated Unicode string. If no null char is copied\r
+  from Source, then Destination[Length] is always set to null.\r
+\r
+  This function converts not more than Length successive characters from the\r
+  Ascii string Source to the Unicode string Destination. The function\r
+  terminates the Unicode string Destination by appending a Null-terminator\r
+  character at the end.\r
+\r
+  The caller is responsible to make sure Destination points to a buffer with\r
+  size not smaller than\r
+  ((MIN(AsciiStrLen(Source), Length) + 1) * sizeof (CHAR8)) in bytes.\r
+\r
+  If Destination is not aligned on a 16-bit boundary, then ASSERT().\r
+  If an error would be returned, then the function will also ASSERT().\r
+\r
+  If an error is returned, then Destination and DestinationLength are\r
+  unmodified.\r
+\r
+  @param  Source             The pointer to a Null-terminated Ascii string.\r
+  @param  Length             The maximum number of Ascii characters to convert.\r
+  @param  Destination        The pointer to a Null-terminated Unicode string.\r
+  @param  DestMax            The maximum number of Destination Unicode char,\r
+                             including terminating null char.\r
+  @param  DestinationLength  The number of Ascii characters converted.\r
+\r
+  @retval RETURN_SUCCESS            String is converted.\r
+  @retval RETURN_INVALID_PARAMETER  If Destination is NULL.\r
+                                    If Source is NULL.\r
+                                    If DestinationLength is NULL.\r
+                                    If PcdMaximumUnicodeStringLength is not\r
+                                    zero, and Length or DestMax is greater than\r
+                                    PcdMaximumUnicodeStringLength.\r
+                                    If PcdMaximumAsciiStringLength is not zero,\r
+                                    and Length or DestMax is greater than\r
+                                    PcdMaximumAsciiStringLength.\r
+                                    If DestMax is 0.\r
+  @retval RETURN_BUFFER_TOO_SMALL   If DestMax is NOT greater than\r
+                                    MIN(AsciiStrLen(Source), Length).\r
+  @retval RETURN_ACCESS_DENIED      If Source and Destination overlap.\r
+\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+AsciiStrnToUnicodeStrS (\r
+  IN      CONST CHAR8               *Source,\r
+  IN      UINTN                     Length,\r
+  OUT     CHAR16                    *Destination,\r
+  IN      UINTN                     DestMax,\r
+  OUT     UINTN                     *DestinationLength\r
+  );\r
+\r
+/**\r
+  Converts an 8-bit value to an 8-bit BCD value.\r
+\r
+  Converts the 8-bit value specified by Value to BCD. The BCD value is\r
+  returned.\r
+\r
+  If Value >= 100, then ASSERT().\r
+\r
+  @param  Value The 8-bit value to convert to BCD. Range 0..99.\r
+\r
+  @return The BCD value.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+DecimalToBcd8 (\r
+  IN      UINT8                     Value\r
+  );\r
+\r
+\r
+/**\r
+  Converts an 8-bit BCD value to an 8-bit value.\r
+\r
+  Converts the 8-bit BCD value specified by Value to an 8-bit value. The 8-bit\r
+  value is returned.\r
+\r
+  If Value >= 0xA0, then ASSERT().\r
+  If (Value & 0x0F) >= 0x0A, then ASSERT().\r
+\r
+  @param  Value The 8-bit BCD value to convert to an 8-bit value.\r
+\r
+  @return The 8-bit value is returned.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+BcdToDecimal8 (\r
+  IN      UINT8                     Value\r
+  );\r
+\r
+//\r
+//  File Path Manipulation Functions\r
+//\r
+\r
+/**\r
+  Removes the last directory or file entry in a path.\r
+\r
+  @param[in, out] Path    The pointer to the path to modify.\r
+\r
+  @retval FALSE     Nothing was found to remove.\r
+  @retval TRUE      A directory or file was removed.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+PathRemoveLastItem(\r
+  IN OUT CHAR16 *Path\r
+  );\r
+\r
+/**\r
+  Function to clean up paths.\r
+    - Single periods in the path are removed.\r
+    - Double periods in the path are removed along with a single parent directory.\r
+    - Forward slashes L'/' are converted to backward slashes L'\'.\r
+\r
+  This will be done inline and the existing buffer may be larger than required\r
+  upon completion.\r
+\r
+  @param[in] Path       The pointer to the string containing the path.\r
+\r
+  @return       Returns Path, otherwise returns NULL to indicate that an error has occurred.\r
+**/\r
+CHAR16*\r
+EFIAPI\r
+PathCleanUpDirectories(\r
+  IN CHAR16 *Path\r
+  );\r
+\r
+//\r
+// Linked List Functions and Macros\r
+//\r
+\r
+/**\r
+  Initializes the head node of a doubly linked list that is declared as a\r
+  global variable in a module.\r
+\r
+  Initializes the forward and backward links of a new linked list. After\r
+  initializing a linked list with this macro, the other linked list functions\r
+  may be used to add and remove nodes from the linked list. This macro results\r
+  in smaller executables by initializing the linked list in the data section,\r
+  instead if calling the InitializeListHead() function to perform the\r
+  equivalent operation.\r
+\r
+  @param  ListHead  The head note of a list to initialize.\r
+\r
+**/\r
+#define INITIALIZE_LIST_HEAD_VARIABLE(ListHead)  {&(ListHead), &(ListHead)}\r
+\r
+\r
+/**\r
+  Checks whether FirstEntry and SecondEntry are part of the same doubly-linked\r
+  list.\r
+\r
+  If FirstEntry is NULL, then ASSERT().\r
+  If FirstEntry->ForwardLink is NULL, then ASSERT().\r
+  If FirstEntry->BackLink is NULL, then ASSERT().\r
+  If SecondEntry is NULL, then ASSERT();\r
+  If PcdMaximumLinkedListLength is not zero, and List contains more than\r
+  PcdMaximumLinkedListLength nodes, then ASSERT().\r
+\r
+  @param  FirstEntry   A pointer to a node in a linked list.\r
+  @param  SecondEntry  A pointer to the node to locate.\r
+\r
+  @retval TRUE   SecondEntry is in the same doubly-linked list as FirstEntry.\r
+  @retval FALSE  SecondEntry isn't in the same doubly-linked list as FirstEntry,\r
+                 or FirstEntry is invalid.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+IsNodeInList (\r
+  IN      CONST LIST_ENTRY      *FirstEntry,\r
+  IN      CONST LIST_ENTRY      *SecondEntry\r
+  );\r
+\r
+\r
+/**\r
+  Initializes the head node of a doubly linked list, and returns the pointer to\r
+  the head node of the doubly linked list.\r
+\r
+  Initializes the forward and backward links of a new linked list. After\r
+  initializing a linked list with this function, the other linked list\r
+  functions may be used to add and remove nodes from the linked list. It is up\r
+  to the caller of this function to allocate the memory for ListHead.\r
+\r
+  If ListHead is NULL, then ASSERT().\r
+\r
+  @param  ListHead  A pointer to the head node of a new doubly linked list.\r
+\r
+  @return ListHead\r
+\r
+**/\r
+LIST_ENTRY *\r
+EFIAPI\r
+InitializeListHead (\r
+  IN OUT  LIST_ENTRY                *ListHead\r
+  );\r
+\r
+\r
+/**\r
+  Adds a node to the beginning of a doubly linked list, and returns the pointer\r
+  to the head node of the doubly linked list.\r
+\r
+  Adds the node Entry at the beginning of the doubly linked list denoted by\r
+  ListHead, and returns ListHead.\r
+\r
+  If ListHead is NULL, then ASSERT().\r
+  If Entry is NULL, then ASSERT().\r
+  If ListHead was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or\r
+  InitializeListHead(), then ASSERT().\r
+  If PcdMaximumLinkedListLength is not zero, and prior to insertion the number\r
+  of nodes in ListHead, including the ListHead node, is greater than or\r
+  equal to PcdMaximumLinkedListLength, then ASSERT().\r
+\r
+  @param  ListHead  A pointer to the head node of a doubly linked list.\r
+  @param  Entry     A pointer to a node that is to be inserted at the beginning\r
+                    of a doubly linked list.\r
+\r
+  @return ListHead\r
+\r
+**/\r
+LIST_ENTRY *\r
+EFIAPI\r
+InsertHeadList (\r
+  IN OUT  LIST_ENTRY                *ListHead,\r
+  IN OUT  LIST_ENTRY                *Entry\r
+  );\r
+\r
+\r
+/**\r
+  Adds a node to the end of a doubly linked list, and returns the pointer to\r
+  the head node of the doubly linked list.\r
+\r
+  Adds the node Entry to the end of the doubly linked list denoted by ListHead,\r
+  and returns ListHead.\r
+\r
+  If ListHead is NULL, then ASSERT().\r
+  If Entry is NULL, then ASSERT().\r
+  If ListHead was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or\r
+  InitializeListHead(), then ASSERT().\r
+  If PcdMaximumLinkedListLength is not zero, and prior to insertion the number\r
+  of nodes in ListHead, including the ListHead node, is greater than or\r
+  equal to PcdMaximumLinkedListLength, then ASSERT().\r
+\r
+  @param  ListHead  A pointer to the head node of a doubly linked list.\r
+  @param  Entry     A pointer to a node that is to be added at the end of the\r
+                    doubly linked list.\r
+\r
+  @return ListHead\r
+\r
+**/\r
+LIST_ENTRY *\r
+EFIAPI\r
+InsertTailList (\r
+  IN OUT  LIST_ENTRY                *ListHead,\r
+  IN OUT  LIST_ENTRY                *Entry\r
+  );\r
+\r
+\r
+/**\r
+  Retrieves the first node of a doubly linked list.\r
+\r
+  Returns the first node of a doubly linked list.  List must have been\r
+  initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead().\r
+  If List is empty, then List is returned.\r
+\r
+  If List is NULL, then ASSERT().\r
+  If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or\r
+  InitializeListHead(), then ASSERT().\r
+  If PcdMaximumLinkedListLength is not zero, and the number of nodes\r
+  in List, including the List node, is greater than or equal to\r
+  PcdMaximumLinkedListLength, then ASSERT().\r
+\r
+  @param  List  A pointer to the head node of a doubly linked list.\r
+\r
+  @return The first node of a doubly linked list.\r
+  @retval List  The list is empty.\r
+\r
+**/\r
+LIST_ENTRY *\r
+EFIAPI\r
+GetFirstNode (\r
+  IN      CONST LIST_ENTRY          *List\r
+  );\r
+\r
+\r
+/**\r
+  Retrieves the next node of a doubly linked list.\r
+\r
+  Returns the node of a doubly linked list that follows Node.\r
+  List must have been initialized with INTIALIZE_LIST_HEAD_VARIABLE()\r
+  or InitializeListHead().  If List is empty, then List is returned.\r
+\r
+  If List is NULL, then ASSERT().\r
+  If Node is NULL, then ASSERT().\r
+  If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or\r
+  InitializeListHead(), then ASSERT().\r
+  If PcdMaximumLinkedListLength is not zero, and List contains more than\r
+  PcdMaximumLinkedListLength nodes, then ASSERT().\r
+  If PcdVerifyNodeInList is TRUE and Node is not a node in List, then ASSERT().\r
+\r
+  @param  List  A pointer to the head node of a doubly linked list.\r
+  @param  Node  A pointer to a node in the doubly linked list.\r
+\r
+  @return The pointer to the next node if one exists. Otherwise List is returned.\r
+\r
+**/\r
+LIST_ENTRY *\r
+EFIAPI\r
+GetNextNode (\r
+  IN      CONST LIST_ENTRY          *List,\r
+  IN      CONST LIST_ENTRY          *Node\r
+  );\r
+\r
+\r
+/**\r
+  Retrieves the previous node of a doubly linked list.\r
+\r
+  Returns the node of a doubly linked list that precedes Node.\r
+  List must have been initialized with INTIALIZE_LIST_HEAD_VARIABLE()\r
+  or InitializeListHead().  If List is empty, then List is returned.\r
+\r
+  If List is NULL, then ASSERT().\r
+  If Node is NULL, then ASSERT().\r
+  If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or\r
+  InitializeListHead(), then ASSERT().\r
+  If PcdMaximumLinkedListLength is not zero, and List contains more than\r
+  PcdMaximumLinkedListLength nodes, then ASSERT().\r
+  If PcdVerifyNodeInList is TRUE and Node is not a node in List, then ASSERT().\r
+\r
+  @param  List  A pointer to the head node of a doubly linked list.\r
+  @param  Node  A pointer to a node in the doubly linked list.\r
+\r
+  @return The pointer to the previous node if one exists. Otherwise List is returned.\r
+\r
+**/\r
+LIST_ENTRY *\r
+EFIAPI\r
+GetPreviousNode (\r
+  IN      CONST LIST_ENTRY          *List,\r
+  IN      CONST LIST_ENTRY          *Node\r
+  );\r
+\r
+\r
+/**\r
+  Checks to see if a doubly linked list is empty or not.\r
+\r
+  Checks to see if the doubly linked list is empty. If the linked list contains\r
+  zero nodes, this function returns TRUE. Otherwise, it returns FALSE.\r
+\r
+  If ListHead is NULL, then ASSERT().\r
+  If ListHead was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or\r
+  InitializeListHead(), then ASSERT().\r
+  If PcdMaximumLinkedListLength is not zero, and the number of nodes\r
+  in List, including the List node, is greater than or equal to\r
+  PcdMaximumLinkedListLength, then ASSERT().\r
+\r
+  @param  ListHead  A pointer to the head node of a doubly linked list.\r
+\r
+  @retval TRUE  The linked list is empty.\r
+  @retval FALSE The linked list is not empty.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+IsListEmpty (\r
+  IN      CONST LIST_ENTRY          *ListHead\r
+  );\r
+\r
+\r
+/**\r
+  Determines if a node in a doubly linked list is the head node of a the same\r
+  doubly linked list.  This function is typically used to terminate a loop that\r
+  traverses all the nodes in a doubly linked list starting with the head node.\r
+\r
+  Returns TRUE if Node is equal to List.  Returns FALSE if Node is one of the\r
+  nodes in the doubly linked list specified by List.  List must have been\r
+  initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead().\r
+\r
+  If List is NULL, then ASSERT().\r
+  If Node is NULL, then ASSERT().\r
+  If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead(),\r
+  then ASSERT().\r
+  If PcdMaximumLinkedListLength is not zero, and the number of nodes\r
+  in List, including the List node, is greater than or equal to\r
+  PcdMaximumLinkedListLength, then ASSERT().\r
+  If PcdVerifyNodeInList is TRUE and Node is not a node in List the and Node is not equal\r
+  to List, then ASSERT().\r
+\r
+  @param  List  A pointer to the head node of a doubly linked list.\r
+  @param  Node  A pointer to a node in the doubly linked list.\r
+\r
+  @retval TRUE  Node is the head of the doubly-linked list pointed by List.\r
+  @retval FALSE Node is not the head of the doubly-linked list pointed by List.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+IsNull (\r
+  IN      CONST LIST_ENTRY          *List,\r
+  IN      CONST LIST_ENTRY          *Node\r
+  );\r
+\r
+\r
+/**\r
+  Determines if a node the last node in a doubly linked list.\r
+\r
+  Returns TRUE if Node is the last node in the doubly linked list specified by\r
+  List. Otherwise, FALSE is returned. List must have been initialized with\r
+  INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead().\r
+\r
+  If List is NULL, then ASSERT().\r
+  If Node is NULL, then ASSERT().\r
+  If List was not initialized with INTIALIZE_LIST_HEAD_VARIABLE() or\r
+  InitializeListHead(), then ASSERT().\r
+  If PcdMaximumLinkedListLength is not zero, and the number of nodes\r
+  in List, including the List node, is greater than or equal to\r
+  PcdMaximumLinkedListLength, then ASSERT().\r
+  If PcdVerifyNodeInList is TRUE and Node is not a node in List, then ASSERT().\r
+\r
+  @param  List  A pointer to the head node of a doubly linked list.\r
+  @param  Node  A pointer to a node in the doubly linked list.\r
+\r
+  @retval TRUE  Node is the last node in the linked list.\r
+  @retval FALSE Node is not the last node in the linked list.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+IsNodeAtEnd (\r
+  IN      CONST LIST_ENTRY          *List,\r
+  IN      CONST LIST_ENTRY          *Node\r
+  );\r
+\r
+\r
+/**\r
+  Swaps the location of two nodes in a doubly linked list, and returns the\r
+  first node after the swap.\r
+\r
+  If FirstEntry is identical to SecondEntry, then SecondEntry is returned.\r
+  Otherwise, the location of the FirstEntry node is swapped with the location\r
+  of the SecondEntry node in a doubly linked list. SecondEntry must be in the\r
+  same double linked list as FirstEntry and that double linked list must have\r
+  been initialized with INTIALIZE_LIST_HEAD_VARIABLE() or InitializeListHead().\r
+  SecondEntry is returned after the nodes are swapped.\r
+\r
+  If FirstEntry is NULL, then ASSERT().\r
+  If SecondEntry is NULL, then ASSERT().\r
+  If PcdVerifyNodeInList is TRUE and SecondEntry and FirstEntry are not in the\r
+  same linked list, then ASSERT().\r
+  If PcdMaximumLinkedListLength is not zero, and the number of nodes in the\r
+  linked list containing the FirstEntry and SecondEntry nodes, including\r
+  the FirstEntry and SecondEntry nodes, is greater than or equal to\r
+  PcdMaximumLinkedListLength, then ASSERT().\r
+\r
+  @param  FirstEntry  A pointer to a node in a linked list.\r
+  @param  SecondEntry A pointer to another node in the same linked list.\r
+\r
+  @return SecondEntry.\r
+\r
+**/\r
+LIST_ENTRY *\r
+EFIAPI\r
+SwapListEntries (\r
+  IN OUT  LIST_ENTRY                *FirstEntry,\r
+  IN OUT  LIST_ENTRY                *SecondEntry\r
+  );\r
+\r
+\r
+/**\r
+  Removes a node from a doubly linked list, and returns the node that follows\r
+  the removed node.\r
+\r
+  Removes the node Entry from a doubly linked list. It is up to the caller of\r
+  this function to release the memory used by this node if that is required. On\r
+  exit, the node following Entry in the doubly linked list is returned. If\r
+  Entry is the only node in the linked list, then the head node of the linked\r
+  list is returned.\r
+\r
+  If Entry is NULL, then ASSERT().\r
+  If Entry is the head node of an empty list, then ASSERT().\r
+  If PcdMaximumLinkedListLength is not zero, and the number of nodes in the\r
+  linked list containing Entry, including the Entry node, is greater than\r
+  or equal to PcdMaximumLinkedListLength, then ASSERT().\r
+\r
+  @param  Entry A pointer to a node in a linked list.\r
+\r
+  @return Entry.\r
+\r
+**/\r
+LIST_ENTRY *\r
+EFIAPI\r
+RemoveEntryList (\r
+  IN      CONST LIST_ENTRY          *Entry\r
+  );\r
+\r
+//\r
+// Math Services\r
+//\r
+\r
+/**\r
+  Shifts a 64-bit integer left between 0 and 63 bits. The low bits are filled\r
+  with zeros. The shifted value is returned.\r
+\r
+  This function shifts the 64-bit value Operand to the left by Count bits. The\r
+  low Count bits are set to zero. The shifted value is returned.\r
+\r
+  If Count is greater than 63, then ASSERT().\r
+\r
+  @param  Operand The 64-bit operand to shift left.\r
+  @param  Count   The number of bits to shift left.\r
+\r
+  @return Operand << Count.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+LShiftU64 (\r
+  IN      UINT64                    Operand,\r
+  IN      UINTN                     Count\r
+  );\r
+\r
+\r
+/**\r
+  Shifts a 64-bit integer right between 0 and 63 bits. This high bits are\r
+  filled with zeros. The shifted value is returned.\r
+\r
+  This function shifts the 64-bit value Operand to the right by Count bits. The\r
+  high Count bits are set to zero. The shifted value is returned.\r
+\r
+  If Count is greater than 63, then ASSERT().\r
+\r
+  @param  Operand The 64-bit operand to shift right.\r
+  @param  Count   The number of bits to shift right.\r
+\r
+  @return Operand >> Count\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+RShiftU64 (\r
+  IN      UINT64                    Operand,\r
+  IN      UINTN                     Count\r
+  );\r
+\r
+\r
+/**\r
+  Shifts a 64-bit integer right between 0 and 63 bits. The high bits are filled\r
+  with original integer's bit 63. The shifted value is returned.\r
+\r
+  This function shifts the 64-bit value Operand to the right by Count bits. The\r
+  high Count bits are set to bit 63 of Operand.  The shifted value is returned.\r
+\r
+  If Count is greater than 63, then ASSERT().\r
+\r
+  @param  Operand The 64-bit operand to shift right.\r
+  @param  Count   The number of bits to shift right.\r
+\r
+  @return Operand >> Count\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+ARShiftU64 (\r
+  IN      UINT64                    Operand,\r
+  IN      UINTN                     Count\r
+  );\r
+\r
+\r
+/**\r
+  Rotates a 32-bit integer left between 0 and 31 bits, filling the low bits\r
+  with the high bits that were rotated.\r
+\r
+  This function rotates the 32-bit value Operand to the left by Count bits. The\r
+  low Count bits are fill with the high Count bits of Operand. The rotated\r
+  value is returned.\r
+\r
+  If Count is greater than 31, then ASSERT().\r
+\r
+  @param  Operand The 32-bit operand to rotate left.\r
+  @param  Count   The number of bits to rotate left.\r
+\r
+  @return Operand << Count\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+LRotU32 (\r
+  IN      UINT32                    Operand,\r
+  IN      UINTN                     Count\r
+  );\r
+\r
+\r
+/**\r
+  Rotates a 32-bit integer right between 0 and 31 bits, filling the high bits\r
+  with the low bits that were rotated.\r
+\r
+  This function rotates the 32-bit value Operand to the right by Count bits.\r
+  The high Count bits are fill with the low Count bits of Operand. The rotated\r
+  value is returned.\r
+\r
+  If Count is greater than 31, then ASSERT().\r
+\r
+  @param  Operand The 32-bit operand to rotate right.\r
+  @param  Count   The number of bits to rotate right.\r
+\r
+  @return Operand >> Count\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+RRotU32 (\r
+  IN      UINT32                    Operand,\r
+  IN      UINTN                     Count\r
+  );\r
+\r
+\r
+/**\r
+  Rotates a 64-bit integer left between 0 and 63 bits, filling the low bits\r
+  with the high bits that were rotated.\r
+\r
+  This function rotates the 64-bit value Operand to the left by Count bits. The\r
+  low Count bits are fill with the high Count bits of Operand. The rotated\r
+  value is returned.\r
+\r
+  If Count is greater than 63, then ASSERT().\r
+\r
+  @param  Operand The 64-bit operand to rotate left.\r
+  @param  Count   The number of bits to rotate left.\r
+\r
+  @return Operand << Count\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+LRotU64 (\r
+  IN      UINT64                    Operand,\r
+  IN      UINTN                     Count\r
+  );\r
+\r
+\r
+/**\r
+  Rotates a 64-bit integer right between 0 and 63 bits, filling the high bits\r
+  with the high low bits that were rotated.\r
+\r
+  This function rotates the 64-bit value Operand to the right by Count bits.\r
+  The high Count bits are fill with the low Count bits of Operand. The rotated\r
+  value is returned.\r
+\r
+  If Count is greater than 63, then ASSERT().\r
+\r
+  @param  Operand The 64-bit operand to rotate right.\r
+  @param  Count   The number of bits to rotate right.\r
+\r
+  @return Operand >> Count\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+RRotU64 (\r
+  IN      UINT64                    Operand,\r
+  IN      UINTN                     Count\r
+  );\r
+\r
+\r
+/**\r
+  Returns the bit position of the lowest bit set in a 32-bit value.\r
+\r
+  This function computes the bit position of the lowest bit set in the 32-bit\r
+  value specified by Operand. If Operand is zero, then -1 is returned.\r
+  Otherwise, a value between 0 and 31 is returned.\r
+\r
+  @param  Operand The 32-bit operand to evaluate.\r
+\r
+  @retval 0..31  The lowest bit set in Operand was found.\r
+  @retval -1    Operand is zero.\r
+\r
+**/\r
+INTN\r
+EFIAPI\r
+LowBitSet32 (\r
+  IN      UINT32                    Operand\r
+  );\r
+\r
+\r
+/**\r
+  Returns the bit position of the lowest bit set in a 64-bit value.\r
+\r
+  This function computes the bit position of the lowest bit set in the 64-bit\r
+  value specified by Operand. If Operand is zero, then -1 is returned.\r
+  Otherwise, a value between 0 and 63 is returned.\r
+\r
+  @param  Operand The 64-bit operand to evaluate.\r
+\r
+  @retval 0..63  The lowest bit set in Operand was found.\r
+  @retval -1    Operand is zero.\r
+\r
+\r
+**/\r
+INTN\r
+EFIAPI\r
+LowBitSet64 (\r
+  IN      UINT64                    Operand\r
+  );\r
+\r
+\r
+/**\r
+  Returns the bit position of the highest bit set in a 32-bit value. Equivalent\r
+  to log2(x).\r
+\r
+  This function computes the bit position of the highest bit set in the 32-bit\r
+  value specified by Operand. If Operand is zero, then -1 is returned.\r
+  Otherwise, a value between 0 and 31 is returned.\r
+\r
+  @param  Operand The 32-bit operand to evaluate.\r
+\r
+  @retval 0..31  Position of the highest bit set in Operand if found.\r
+  @retval -1    Operand is zero.\r
+\r
+**/\r
+INTN\r
+EFIAPI\r
+HighBitSet32 (\r
+  IN      UINT32                    Operand\r
+  );\r
+\r
+\r
+/**\r
+  Returns the bit position of the highest bit set in a 64-bit value. Equivalent\r
+  to log2(x).\r
+\r
+  This function computes the bit position of the highest bit set in the 64-bit\r
+  value specified by Operand. If Operand is zero, then -1 is returned.\r
+  Otherwise, a value between 0 and 63 is returned.\r
+\r
+  @param  Operand The 64-bit operand to evaluate.\r
+\r
+  @retval 0..63   Position of the highest bit set in Operand if found.\r
+  @retval -1     Operand is zero.\r
+\r
+**/\r
+INTN\r
+EFIAPI\r
+HighBitSet64 (\r
+  IN      UINT64                    Operand\r
+  );\r
+\r
+\r
+/**\r
+  Returns the value of the highest bit set in a 32-bit value. Equivalent to\r
+  1 << log2(x).\r
+\r
+  This function computes the value of the highest bit set in the 32-bit value\r
+  specified by Operand. If Operand is zero, then zero is returned.\r
+\r
+  @param  Operand The 32-bit operand to evaluate.\r
+\r
+  @return 1 << HighBitSet32(Operand)\r
+  @retval 0 Operand is zero.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+GetPowerOfTwo32 (\r
+  IN      UINT32                    Operand\r
+  );\r
+\r
+\r
+/**\r
+  Returns the value of the highest bit set in a 64-bit value. Equivalent to\r
+  1 << log2(x).\r
+\r
+  This function computes the value of the highest bit set in the 64-bit value\r
+  specified by Operand. If Operand is zero, then zero is returned.\r
+\r
+  @param  Operand The 64-bit operand to evaluate.\r
+\r
+  @return 1 << HighBitSet64(Operand)\r
+  @retval 0 Operand is zero.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+GetPowerOfTwo64 (\r
+  IN      UINT64                    Operand\r
+  );\r
+\r
+\r
+/**\r
+  Switches the endianness of a 16-bit integer.\r
+\r
+  This function swaps the bytes in a 16-bit unsigned value to switch the value\r
+  from little endian to big endian or vice versa. The byte swapped value is\r
+  returned.\r
+\r
+  @param  Value A 16-bit unsigned value.\r
+\r
+  @return The byte swapped Value.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+SwapBytes16 (\r
+  IN      UINT16                    Value\r
+  );\r
+\r
+\r
+/**\r
+  Switches the endianness of a 32-bit integer.\r
+\r
+  This function swaps the bytes in a 32-bit unsigned value to switch the value\r
+  from little endian to big endian or vice versa. The byte swapped value is\r
+  returned.\r
+\r
+  @param  Value A 32-bit unsigned value.\r
+\r
+  @return The byte swapped Value.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+SwapBytes32 (\r
+  IN      UINT32                    Value\r
+  );\r
+\r
+\r
+/**\r
+  Switches the endianness of a 64-bit integer.\r
+\r
+  This function swaps the bytes in a 64-bit unsigned value to switch the value\r
+  from little endian to big endian or vice versa. The byte swapped value is\r
+  returned.\r
+\r
+  @param  Value A 64-bit unsigned value.\r
+\r
+  @return The byte swapped Value.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+SwapBytes64 (\r
+  IN      UINT64                    Value\r
+  );\r
+\r
+\r
+/**\r
+  Multiples a 64-bit unsigned integer by a 32-bit unsigned integer and\r
+  generates a 64-bit unsigned result.\r
+\r
+  This function multiples the 64-bit unsigned value Multiplicand by the 32-bit\r
+  unsigned value Multiplier and generates a 64-bit unsigned result. This 64-\r
+  bit unsigned result is returned.\r
+\r
+  @param  Multiplicand  A 64-bit unsigned value.\r
+  @param  Multiplier    A 32-bit unsigned value.\r
+\r
+  @return Multiplicand * Multiplier\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+MultU64x32 (\r
+  IN      UINT64                    Multiplicand,\r
+  IN      UINT32                    Multiplier\r
+  );\r
+\r
+\r
+/**\r
+  Multiples a 64-bit unsigned integer by a 64-bit unsigned integer and\r
+  generates a 64-bit unsigned result.\r
+\r
+  This function multiples the 64-bit unsigned value Multiplicand by the 64-bit\r
+  unsigned value Multiplier and generates a 64-bit unsigned result. This 64-\r
+  bit unsigned result is returned.\r
+\r
+  @param  Multiplicand  A 64-bit unsigned value.\r
+  @param  Multiplier    A 64-bit unsigned value.\r
+\r
+  @return Multiplicand * Multiplier.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+MultU64x64 (\r
+  IN      UINT64                    Multiplicand,\r
+  IN      UINT64                    Multiplier\r
+  );\r
+\r
+\r
+/**\r
+  Multiples a 64-bit signed integer by a 64-bit signed integer and generates a\r
+  64-bit signed result.\r
+\r
+  This function multiples the 64-bit signed value Multiplicand by the 64-bit\r
+  signed value Multiplier and generates a 64-bit signed result. This 64-bit\r
+  signed result is returned.\r
+\r
+  @param  Multiplicand  A 64-bit signed value.\r
+  @param  Multiplier    A 64-bit signed value.\r
+\r
+  @return Multiplicand * Multiplier\r
+\r
+**/\r
+INT64\r
+EFIAPI\r
+MultS64x64 (\r
+  IN      INT64                     Multiplicand,\r
+  IN      INT64                     Multiplier\r
+  );\r
+\r
+\r
+/**\r
+  Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates\r
+  a 64-bit unsigned result.\r
+\r
+  This function divides the 64-bit unsigned value Dividend by the 32-bit\r
+  unsigned value Divisor and generates a 64-bit unsigned quotient. This\r
+  function returns the 64-bit unsigned quotient.\r
+\r
+  If Divisor is 0, then ASSERT().\r
+\r
+  @param  Dividend  A 64-bit unsigned value.\r
+  @param  Divisor   A 32-bit unsigned value.\r
+\r
+  @return Dividend / Divisor.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+DivU64x32 (\r
+  IN      UINT64                    Dividend,\r
+  IN      UINT32                    Divisor\r
+  );\r
+\r
+\r
+/**\r
+  Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates\r
+  a 32-bit unsigned remainder.\r
+\r
+  This function divides the 64-bit unsigned value Dividend by the 32-bit\r
+  unsigned value Divisor and generates a 32-bit remainder. This function\r
+  returns the 32-bit unsigned remainder.\r
+\r
+  If Divisor is 0, then ASSERT().\r
+\r
+  @param  Dividend  A 64-bit unsigned value.\r
+  @param  Divisor   A 32-bit unsigned value.\r
+\r
+  @return Dividend % Divisor.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+ModU64x32 (\r
+  IN      UINT64                    Dividend,\r
+  IN      UINT32                    Divisor\r
+  );\r
+\r
+\r
+/**\r
+  Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates\r
+  a 64-bit unsigned result and an optional 32-bit unsigned remainder.\r
+\r
+  This function divides the 64-bit unsigned value Dividend by the 32-bit\r
+  unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder\r
+  is not NULL, then the 32-bit unsigned remainder is returned in Remainder.\r
+  This function returns the 64-bit unsigned quotient.\r
+\r
+  If Divisor is 0, then ASSERT().\r
+\r
+  @param  Dividend  A 64-bit unsigned value.\r
+  @param  Divisor   A 32-bit unsigned value.\r
+  @param  Remainder A pointer to a 32-bit unsigned value. This parameter is\r
+                    optional and may be NULL.\r
+\r
+  @return Dividend / Divisor.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+DivU64x32Remainder (\r
+  IN      UINT64                    Dividend,\r
+  IN      UINT32                    Divisor,\r
+  OUT     UINT32                    *Remainder  OPTIONAL\r
+  );\r
+\r
+\r
+/**\r
+  Divides a 64-bit unsigned integer by a 64-bit unsigned integer and generates\r
+  a 64-bit unsigned result and an optional 64-bit unsigned remainder.\r
+\r
+  This function divides the 64-bit unsigned value Dividend by the 64-bit\r
+  unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder\r
+  is not NULL, then the 64-bit unsigned remainder is returned in Remainder.\r
+  This function returns the 64-bit unsigned quotient.\r
+\r
+  If Divisor is 0, then ASSERT().\r
+\r
+  @param  Dividend  A 64-bit unsigned value.\r
+  @param  Divisor   A 64-bit unsigned value.\r
+  @param  Remainder A pointer to a 64-bit unsigned value. This parameter is\r
+                    optional and may be NULL.\r
+\r
+  @return Dividend / Divisor.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+DivU64x64Remainder (\r
+  IN      UINT64                    Dividend,\r
+  IN      UINT64                    Divisor,\r
+  OUT     UINT64                    *Remainder  OPTIONAL\r
+  );\r
+\r
+\r
+/**\r
+  Divides a 64-bit signed integer by a 64-bit signed integer and generates a\r
+  64-bit signed result and a optional 64-bit signed remainder.\r
+\r
+  This function divides the 64-bit signed value Dividend by the 64-bit signed\r
+  value Divisor and generates a 64-bit signed quotient. If Remainder is not\r
+  NULL, then the 64-bit signed remainder is returned in Remainder. This\r
+  function returns the 64-bit signed quotient.\r
+\r
+  It is the caller's responsibility to not call this function with a Divisor of 0.\r
+  If Divisor is 0, then the quotient and remainder should be assumed to be\r
+  the largest negative integer.\r
+\r
+  If Divisor is 0, then ASSERT().\r
+\r
+  @param  Dividend  A 64-bit signed value.\r
+  @param  Divisor   A 64-bit signed value.\r
+  @param  Remainder A pointer to a 64-bit signed value. This parameter is\r
+                    optional and may be NULL.\r
+\r
+  @return Dividend / Divisor.\r
+\r
+**/\r
+INT64\r
+EFIAPI\r
+DivS64x64Remainder (\r
+  IN      INT64                     Dividend,\r
+  IN      INT64                     Divisor,\r
+  OUT     INT64                     *Remainder  OPTIONAL\r
+  );\r
+\r
+\r
+/**\r
+  Reads a 16-bit value from memory that may be unaligned.\r
+\r
+  This function returns the 16-bit value pointed to by Buffer. The function\r
+  guarantees that the read operation does not produce an alignment fault.\r
+\r
+  If the Buffer is NULL, then ASSERT().\r
+\r
+  @param  Buffer  The pointer to a 16-bit value that may be unaligned.\r
+\r
+  @return The 16-bit value read from Buffer.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+ReadUnaligned16 (\r
+  IN CONST UINT16              *Buffer\r
+  );\r
+\r
+\r
+/**\r
+  Writes a 16-bit value to memory that may be unaligned.\r
+\r
+  This function writes the 16-bit value specified by Value to Buffer. Value is\r
+  returned. The function guarantees that the write operation does not produce\r
+  an alignment fault.\r
+\r
+  If the Buffer is NULL, then ASSERT().\r
+\r
+  @param  Buffer  The pointer to a 16-bit value that may be unaligned.\r
+  @param  Value   16-bit value to write to Buffer.\r
+\r
+  @return The 16-bit value to write to Buffer.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+WriteUnaligned16 (\r
+  OUT UINT16                    *Buffer,\r
+  IN  UINT16                    Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads a 24-bit value from memory that may be unaligned.\r
+\r
+  This function returns the 24-bit value pointed to by Buffer. The function\r
+  guarantees that the read operation does not produce an alignment fault.\r
+\r
+  If the Buffer is NULL, then ASSERT().\r
+\r
+  @param  Buffer  The pointer to a 24-bit value that may be unaligned.\r
+\r
+  @return The 24-bit value read from Buffer.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+ReadUnaligned24 (\r
+  IN CONST UINT32              *Buffer\r
+  );\r
+\r
+\r
+/**\r
+  Writes a 24-bit value to memory that may be unaligned.\r
+\r
+  This function writes the 24-bit value specified by Value to Buffer. Value is\r
+  returned. The function guarantees that the write operation does not produce\r
+  an alignment fault.\r
+\r
+  If the Buffer is NULL, then ASSERT().\r
+\r
+  @param  Buffer  The pointer to a 24-bit value that may be unaligned.\r
+  @param  Value   24-bit value to write to Buffer.\r
+\r
+  @return The 24-bit value to write to Buffer.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+WriteUnaligned24 (\r
+  OUT UINT32                    *Buffer,\r
+  IN  UINT32                    Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads a 32-bit value from memory that may be unaligned.\r
+\r
+  This function returns the 32-bit value pointed to by Buffer. The function\r
+  guarantees that the read operation does not produce an alignment fault.\r
+\r
+  If the Buffer is NULL, then ASSERT().\r
+\r
+  @param  Buffer  The pointer to a 32-bit value that may be unaligned.\r
+\r
+  @return The 32-bit value read from Buffer.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+ReadUnaligned32 (\r
+  IN CONST UINT32              *Buffer\r
+  );\r
+\r
+\r
+/**\r
+  Writes a 32-bit value to memory that may be unaligned.\r
+\r
+  This function writes the 32-bit value specified by Value to Buffer. Value is\r
+  returned. The function guarantees that the write operation does not produce\r
+  an alignment fault.\r
+\r
+  If the Buffer is NULL, then ASSERT().\r
+\r
+  @param  Buffer  The pointer to a 32-bit value that may be unaligned.\r
+  @param  Value   32-bit value to write to Buffer.\r
+\r
+  @return The 32-bit value to write to Buffer.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+WriteUnaligned32 (\r
+  OUT UINT32                    *Buffer,\r
+  IN  UINT32                    Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads a 64-bit value from memory that may be unaligned.\r
+\r
+  This function returns the 64-bit value pointed to by Buffer. The function\r
+  guarantees that the read operation does not produce an alignment fault.\r
+\r
+  If the Buffer is NULL, then ASSERT().\r
+\r
+  @param  Buffer  The pointer to a 64-bit value that may be unaligned.\r
+\r
+  @return The 64-bit value read from Buffer.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+ReadUnaligned64 (\r
+  IN CONST UINT64              *Buffer\r
+  );\r
+\r
+\r
+/**\r
+  Writes a 64-bit value to memory that may be unaligned.\r
+\r
+  This function writes the 64-bit value specified by Value to Buffer. Value is\r
+  returned. The function guarantees that the write operation does not produce\r
+  an alignment fault.\r
+\r
+  If the Buffer is NULL, then ASSERT().\r
+\r
+  @param  Buffer  The pointer to a 64-bit value that may be unaligned.\r
+  @param  Value   64-bit value to write to Buffer.\r
+\r
+  @return The 64-bit value to write to Buffer.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+WriteUnaligned64 (\r
+  OUT UINT64                    *Buffer,\r
+  IN  UINT64                    Value\r
+  );\r
+\r
+\r
+//\r
+// Bit Field Functions\r
+//\r
+\r
+/**\r
+  Returns a bit field from an 8-bit value.\r
+\r
+  Returns the bitfield specified by the StartBit and the EndBit from Operand.\r
+\r
+  If 8-bit operations are not supported, then ASSERT().\r
+  If StartBit is greater than 7, then ASSERT().\r
+  If EndBit is greater than 7, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+\r
+  @param  Operand   Operand on which to perform the bitfield operation.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..7.\r
+\r
+  @return The bit field read.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+BitFieldRead8 (\r
+  IN      UINT8                     Operand,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit\r
+  );\r
+\r
+\r
+/**\r
+  Writes a bit field to an 8-bit value, and returns the result.\r
+\r
+  Writes Value to the bit field specified by the StartBit and the EndBit in\r
+  Operand. All other bits in Operand are preserved. The new 8-bit value is\r
+  returned.\r
+\r
+  If 8-bit operations are not supported, then ASSERT().\r
+  If StartBit is greater than 7, then ASSERT().\r
+  If EndBit is greater than 7, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Operand   Operand on which to perform the bitfield operation.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  Value     New value of the bit field.\r
+\r
+  @return The new 8-bit value.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+BitFieldWrite8 (\r
+  IN      UINT8                     Operand,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT8                     Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads a bit field from an 8-bit value, performs a bitwise OR, and returns the\r
+  result.\r
+\r
+  Performs a bitwise OR between the bit field specified by StartBit\r
+  and EndBit in Operand and the value specified by OrData. All other bits in\r
+  Operand are preserved. The new 8-bit value is returned.\r
+\r
+  If 8-bit operations are not supported, then ASSERT().\r
+  If StartBit is greater than 7, then ASSERT().\r
+  If EndBit is greater than 7, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Operand   Operand on which to perform the bitfield operation.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  OrData    The value to OR with the read value from the value\r
+\r
+  @return The new 8-bit value.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+BitFieldOr8 (\r
+  IN      UINT8                     Operand,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT8                     OrData\r
+  );\r
+\r
+\r
+/**\r
+  Reads a bit field from an 8-bit value, performs a bitwise AND, and returns\r
+  the result.\r
+\r
+  Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
+  in Operand and the value specified by AndData. All other bits in Operand are\r
+  preserved. The new 8-bit value is returned.\r
+\r
+  If 8-bit operations are not supported, then ASSERT().\r
+  If StartBit is greater than 7, then ASSERT().\r
+  If EndBit is greater than 7, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Operand   Operand on which to perform the bitfield operation.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  AndData   The value to AND with the read value from the value.\r
+\r
+  @return The new 8-bit value.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+BitFieldAnd8 (\r
+  IN      UINT8                     Operand,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT8                     AndData\r
+  );\r
+\r
+\r
+/**\r
+  Reads a bit field from an 8-bit value, performs a bitwise AND followed by a\r
+  bitwise OR, and returns the result.\r
+\r
+  Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
+  in Operand and the value specified by AndData, followed by a bitwise\r
+  OR with value specified by OrData. All other bits in Operand are\r
+  preserved. The new 8-bit value is returned.\r
+\r
+  If 8-bit operations are not supported, then ASSERT().\r
+  If StartBit is greater than 7, then ASSERT().\r
+  If EndBit is greater than 7, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+  If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Operand   Operand on which to perform the bitfield operation.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..7.\r
+  @param  AndData   The value to AND with the read value from the value.\r
+  @param  OrData    The value to OR with the result of the AND operation.\r
+\r
+  @return The new 8-bit value.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+BitFieldAndThenOr8 (\r
+  IN      UINT8                     Operand,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT8                     AndData,\r
+  IN      UINT8                     OrData\r
+  );\r
+\r
+\r
+/**\r
+  Returns a bit field from a 16-bit value.\r
+\r
+  Returns the bitfield specified by the StartBit and the EndBit from Operand.\r
+\r
+  If 16-bit operations are not supported, then ASSERT().\r
+  If StartBit is greater than 15, then ASSERT().\r
+  If EndBit is greater than 15, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+\r
+  @param  Operand   Operand on which to perform the bitfield operation.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..15.\r
+\r
+  @return The bit field read.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+BitFieldRead16 (\r
+  IN      UINT16                    Operand,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit\r
+  );\r
+\r
+\r
+/**\r
+  Writes a bit field to a 16-bit value, and returns the result.\r
+\r
+  Writes Value to the bit field specified by the StartBit and the EndBit in\r
+  Operand. All other bits in Operand are preserved. The new 16-bit value is\r
+  returned.\r
+\r
+  If 16-bit operations are not supported, then ASSERT().\r
+  If StartBit is greater than 15, then ASSERT().\r
+  If EndBit is greater than 15, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Operand   Operand on which to perform the bitfield operation.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  Value     New value of the bit field.\r
+\r
+  @return The new 16-bit value.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+BitFieldWrite16 (\r
+  IN      UINT16                    Operand,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT16                    Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads a bit field from a 16-bit value, performs a bitwise OR, and returns the\r
+  result.\r
+\r
+  Performs a bitwise OR between the bit field specified by StartBit\r
+  and EndBit in Operand and the value specified by OrData. All other bits in\r
+  Operand are preserved. The new 16-bit value is returned.\r
+\r
+  If 16-bit operations are not supported, then ASSERT().\r
+  If StartBit is greater than 15, then ASSERT().\r
+  If EndBit is greater than 15, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Operand   Operand on which to perform the bitfield operation.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  OrData    The value to OR with the read value from the value\r
+\r
+  @return The new 16-bit value.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+BitFieldOr16 (\r
+  IN      UINT16                    Operand,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT16                    OrData\r
+  );\r
+\r
+\r
+/**\r
+  Reads a bit field from a 16-bit value, performs a bitwise AND, and returns\r
+  the result.\r
+\r
+  Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
+  in Operand and the value specified by AndData. All other bits in Operand are\r
+  preserved. The new 16-bit value is returned.\r
+\r
+  If 16-bit operations are not supported, then ASSERT().\r
+  If StartBit is greater than 15, then ASSERT().\r
+  If EndBit is greater than 15, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Operand   Operand on which to perform the bitfield operation.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  AndData   The value to AND with the read value from the value\r
+\r
+  @return The new 16-bit value.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+BitFieldAnd16 (\r
+  IN      UINT16                    Operand,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT16                    AndData\r
+  );\r
+\r
+\r
+/**\r
+  Reads a bit field from a 16-bit value, performs a bitwise AND followed by a\r
+  bitwise OR, and returns the result.\r
+\r
+  Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
+  in Operand and the value specified by AndData, followed by a bitwise\r
+  OR with value specified by OrData. All other bits in Operand are\r
+  preserved. The new 16-bit value is returned.\r
+\r
+  If 16-bit operations are not supported, then ASSERT().\r
+  If StartBit is greater than 15, then ASSERT().\r
+  If EndBit is greater than 15, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+  If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Operand   Operand on which to perform the bitfield operation.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..15.\r
+  @param  AndData   The value to AND with the read value from the value.\r
+  @param  OrData    The value to OR with the result of the AND operation.\r
+\r
+  @return The new 16-bit value.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+BitFieldAndThenOr16 (\r
+  IN      UINT16                    Operand,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT16                    AndData,\r
+  IN      UINT16                    OrData\r
+  );\r
+\r
+\r
+/**\r
+  Returns a bit field from a 32-bit value.\r
+\r
+  Returns the bitfield specified by the StartBit and the EndBit from Operand.\r
+\r
+  If 32-bit operations are not supported, then ASSERT().\r
+  If StartBit is greater than 31, then ASSERT().\r
+  If EndBit is greater than 31, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+\r
+  @param  Operand   Operand on which to perform the bitfield operation.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..31.\r
+\r
+  @return The bit field read.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+BitFieldRead32 (\r
+  IN      UINT32                    Operand,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit\r
+  );\r
+\r
+\r
+/**\r
+  Writes a bit field to a 32-bit value, and returns the result.\r
+\r
+  Writes Value to the bit field specified by the StartBit and the EndBit in\r
+  Operand. All other bits in Operand are preserved. The new 32-bit value is\r
+  returned.\r
+\r
+  If 32-bit operations are not supported, then ASSERT().\r
+  If StartBit is greater than 31, then ASSERT().\r
+  If EndBit is greater than 31, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Operand   Operand on which to perform the bitfield operation.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  Value     New value of the bit field.\r
+\r
+  @return The new 32-bit value.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+BitFieldWrite32 (\r
+  IN      UINT32                    Operand,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT32                    Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads a bit field from a 32-bit value, performs a bitwise OR, and returns the\r
+  result.\r
+\r
+  Performs a bitwise OR between the bit field specified by StartBit\r
+  and EndBit in Operand and the value specified by OrData. All other bits in\r
+  Operand are preserved. The new 32-bit value is returned.\r
+\r
+  If 32-bit operations are not supported, then ASSERT().\r
+  If StartBit is greater than 31, then ASSERT().\r
+  If EndBit is greater than 31, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Operand   Operand on which to perform the bitfield operation.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  OrData    The value to OR with the read value from the value.\r
+\r
+  @return The new 32-bit value.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+BitFieldOr32 (\r
+  IN      UINT32                    Operand,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT32                    OrData\r
+  );\r
+\r
+\r
+/**\r
+  Reads a bit field from a 32-bit value, performs a bitwise AND, and returns\r
+  the result.\r
+\r
+  Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
+  in Operand and the value specified by AndData. All other bits in Operand are\r
+  preserved. The new 32-bit value is returned.\r
+\r
+  If 32-bit operations are not supported, then ASSERT().\r
+  If StartBit is greater than 31, then ASSERT().\r
+  If EndBit is greater than 31, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Operand   Operand on which to perform the bitfield operation.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  AndData   The value to AND with the read value from the value\r
+\r
+  @return The new 32-bit value.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+BitFieldAnd32 (\r
+  IN      UINT32                    Operand,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT32                    AndData\r
+  );\r
+\r
+\r
+/**\r
+  Reads a bit field from a 32-bit value, performs a bitwise AND followed by a\r
+  bitwise OR, and returns the result.\r
+\r
+  Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
+  in Operand and the value specified by AndData, followed by a bitwise\r
+  OR with value specified by OrData. All other bits in Operand are\r
+  preserved. The new 32-bit value is returned.\r
+\r
+  If 32-bit operations are not supported, then ASSERT().\r
+  If StartBit is greater than 31, then ASSERT().\r
+  If EndBit is greater than 31, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+  If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Operand   Operand on which to perform the bitfield operation.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  AndData   The value to AND with the read value from the value.\r
+  @param  OrData    The value to OR with the result of the AND operation.\r
+\r
+  @return The new 32-bit value.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+BitFieldAndThenOr32 (\r
+  IN      UINT32                    Operand,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT32                    AndData,\r
+  IN      UINT32                    OrData\r
+  );\r
+\r
+\r
+/**\r
+  Returns a bit field from a 64-bit value.\r
+\r
+  Returns the bitfield specified by the StartBit and the EndBit from Operand.\r
+\r
+  If 64-bit operations are not supported, then ASSERT().\r
+  If StartBit is greater than 63, then ASSERT().\r
+  If EndBit is greater than 63, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+\r
+  @param  Operand   Operand on which to perform the bitfield operation.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..63.\r
+\r
+  @return The bit field read.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+BitFieldRead64 (\r
+  IN      UINT64                    Operand,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit\r
+  );\r
+\r
+\r
+/**\r
+  Writes a bit field to a 64-bit value, and returns the result.\r
+\r
+  Writes Value to the bit field specified by the StartBit and the EndBit in\r
+  Operand. All other bits in Operand are preserved. The new 64-bit value is\r
+  returned.\r
+\r
+  If 64-bit operations are not supported, then ASSERT().\r
+  If StartBit is greater than 63, then ASSERT().\r
+  If EndBit is greater than 63, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Operand   Operand on which to perform the bitfield operation.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  Value     New value of the bit field.\r
+\r
+  @return The new 64-bit value.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+BitFieldWrite64 (\r
+  IN      UINT64                    Operand,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT64                    Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads a bit field from a 64-bit value, performs a bitwise OR, and returns the\r
+  result.\r
+\r
+  Performs a bitwise OR between the bit field specified by StartBit\r
+  and EndBit in Operand and the value specified by OrData. All other bits in\r
+  Operand are preserved. The new 64-bit value is returned.\r
+\r
+  If 64-bit operations are not supported, then ASSERT().\r
+  If StartBit is greater than 63, then ASSERT().\r
+  If EndBit is greater than 63, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Operand   Operand on which to perform the bitfield operation.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  OrData    The value to OR with the read value from the value\r
+\r
+  @return The new 64-bit value.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+BitFieldOr64 (\r
+  IN      UINT64                    Operand,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT64                    OrData\r
+  );\r
+\r
+\r
+/**\r
+  Reads a bit field from a 64-bit value, performs a bitwise AND, and returns\r
+  the result.\r
+\r
+  Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
+  in Operand and the value specified by AndData. All other bits in Operand are\r
+  preserved. The new 64-bit value is returned.\r
+\r
+  If 64-bit operations are not supported, then ASSERT().\r
+  If StartBit is greater than 63, then ASSERT().\r
+  If EndBit is greater than 63, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Operand   Operand on which to perform the bitfield operation.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  AndData   The value to AND with the read value from the value\r
+\r
+  @return The new 64-bit value.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+BitFieldAnd64 (\r
+  IN      UINT64                    Operand,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT64                    AndData\r
+  );\r
+\r
+\r
+/**\r
+  Reads a bit field from a 64-bit value, performs a bitwise AND followed by a\r
+  bitwise OR, and returns the result.\r
+\r
+  Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
+  in Operand and the value specified by AndData, followed by a bitwise\r
+  OR with value specified by OrData. All other bits in Operand are\r
+  preserved. The new 64-bit value is returned.\r
+\r
+  If 64-bit operations are not supported, then ASSERT().\r
+  If StartBit is greater than 63, then ASSERT().\r
+  If EndBit is greater than 63, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+  If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Operand   Operand on which to perform the bitfield operation.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  AndData   The value to AND with the read value from the value.\r
+  @param  OrData    The value to OR with the result of the AND operation.\r
+\r
+  @return The new 64-bit value.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+BitFieldAndThenOr64 (\r
+  IN      UINT64                    Operand,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT64                    AndData,\r
+  IN      UINT64                    OrData\r
+  );\r
+\r
+/**\r
+  Reads a bit field from a 32-bit value, counts and returns\r
+  the number of set bits.\r
+\r
+  Counts the number of set bits in the  bit field specified by\r
+  StartBit and EndBit in Operand. The count is returned.\r
+\r
+  If StartBit is greater than 31, then ASSERT().\r
+  If EndBit is greater than 31, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+\r
+  @param  Operand   Operand on which to perform the bitfield operation.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..31.\r
+\r
+  @return The number of bits set between StartBit and EndBit.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+BitFieldCountOnes32 (\r
+  IN       UINT32                   Operand,\r
+  IN       UINTN                    StartBit,\r
+  IN       UINTN                    EndBit\r
+  );\r
+\r
+/**\r
+   Reads a bit field from a 64-bit value, counts and returns\r
+   the number of set bits.\r
+\r
+   Counts the number of set bits in the  bit field specified by\r
+   StartBit and EndBit in Operand. The count is returned.\r
+\r
+   If StartBit is greater than 63, then ASSERT().\r
+   If EndBit is greater than 63, then ASSERT().\r
+   If EndBit is less than StartBit, then ASSERT().\r
+\r
+   @param  Operand   Operand on which to perform the bitfield operation.\r
+   @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+   Range 0..63.\r
+   @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+   Range 0..63.\r
+\r
+   @return The number of bits set between StartBit and EndBit.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+BitFieldCountOnes64 (\r
+  IN       UINT64                   Operand,\r
+  IN       UINTN                    StartBit,\r
+  IN       UINTN                    EndBit\r
+  );\r
+\r
+//\r
+// Base Library Checksum Functions\r
+//\r
+\r
+/**\r
+  Returns the sum of all elements in a buffer in unit of UINT8.\r
+  During calculation, the carry bits are dropped.\r
+\r
+  This function calculates the sum of all elements in a buffer\r
+  in unit of UINT8. The carry bits in result of addition are dropped.\r
+  The result is returned as UINT8. If Length is Zero, then Zero is\r
+  returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer      The pointer to the buffer to carry out the sum operation.\r
+  @param  Length      The size, in bytes, of Buffer.\r
+\r
+  @return Sum         The sum of Buffer with carry bits dropped during additions.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+CalculateSum8 (\r
+  IN      CONST UINT8              *Buffer,\r
+  IN      UINTN                     Length\r
+  );\r
+\r
+\r
+/**\r
+  Returns the two's complement checksum of all elements in a buffer\r
+  of 8-bit values.\r
+\r
+  This function first calculates the sum of the 8-bit values in the\r
+  buffer specified by Buffer and Length.  The carry bits in the result\r
+  of addition are dropped. Then, the two's complement of the sum is\r
+  returned.  If Length is 0, then 0 is returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer      The pointer to the buffer to carry out the checksum operation.\r
+  @param  Length      The size, in bytes, of Buffer.\r
+\r
+  @return Checksum    The two's complement checksum of Buffer.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+CalculateCheckSum8 (\r
+  IN      CONST UINT8              *Buffer,\r
+  IN      UINTN                     Length\r
+  );\r
+\r
+\r
+/**\r
+  Returns the sum of all elements in a buffer of 16-bit values.  During\r
+  calculation, the carry bits are dropped.\r
+\r
+  This function calculates the sum of the 16-bit values in the buffer\r
+  specified by Buffer and Length. The carry bits in result of addition are dropped.\r
+  The 16-bit result is returned.  If Length is 0, then 0 is returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer      The pointer to the buffer to carry out the sum operation.\r
+  @param  Length      The size, in bytes, of Buffer.\r
+\r
+  @return Sum         The sum of Buffer with carry bits dropped during additions.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+CalculateSum16 (\r
+  IN      CONST UINT16             *Buffer,\r
+  IN      UINTN                     Length\r
+  );\r
+\r
+\r
+/**\r
+  Returns the two's complement checksum of all elements in a buffer of\r
+  16-bit values.\r
+\r
+  This function first calculates the sum of the 16-bit values in the buffer\r
+  specified by Buffer and Length.  The carry bits in the result of addition\r
+  are dropped. Then, the two's complement of the sum is returned.  If Length\r
+  is 0, then 0 is returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer      The pointer to the buffer to carry out the checksum operation.\r
+  @param  Length      The size, in bytes, of Buffer.\r
+\r
+  @return Checksum    The two's complement checksum of Buffer.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+CalculateCheckSum16 (\r
+  IN      CONST UINT16             *Buffer,\r
+  IN      UINTN                     Length\r
+  );\r
+\r
+\r
+/**\r
+  Returns the sum of all elements in a buffer of 32-bit values. During\r
+  calculation, the carry bits are dropped.\r
+\r
+  This function calculates the sum of the 32-bit values in the buffer\r
+  specified by Buffer and Length. The carry bits in result of addition are dropped.\r
+  The 32-bit result is returned. If Length is 0, then 0 is returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 32-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 32-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer      The pointer to the buffer to carry out the sum operation.\r
+  @param  Length      The size, in bytes, of Buffer.\r
+\r
+  @return Sum         The sum of Buffer with carry bits dropped during additions.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+CalculateSum32 (\r
+  IN      CONST UINT32             *Buffer,\r
+  IN      UINTN                     Length\r
+  );\r
+\r
+\r
+/**\r
+  Returns the two's complement checksum of all elements in a buffer of\r
+  32-bit values.\r
+\r
+  This function first calculates the sum of the 32-bit values in the buffer\r
+  specified by Buffer and Length.  The carry bits in the result of addition\r
+  are dropped. Then, the two's complement of the sum is returned.  If Length\r
+  is 0, then 0 is returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 32-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 32-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer      The pointer to the buffer to carry out the checksum operation.\r
+  @param  Length      The size, in bytes, of Buffer.\r
+\r
+  @return Checksum    The two's complement checksum of Buffer.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+CalculateCheckSum32 (\r
+  IN      CONST UINT32             *Buffer,\r
+  IN      UINTN                     Length\r
+  );\r
+\r
+\r
+/**\r
+  Returns the sum of all elements in a buffer of 64-bit values.  During\r
+  calculation, the carry bits are dropped.\r
+\r
+  This function calculates the sum of the 64-bit values in the buffer\r
+  specified by Buffer and Length. The carry bits in result of addition are dropped.\r
+  The 64-bit result is returned.  If Length is 0, then 0 is returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 64-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 64-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer      The pointer to the buffer to carry out the sum operation.\r
+  @param  Length      The size, in bytes, of Buffer.\r
+\r
+  @return Sum         The sum of Buffer with carry bits dropped during additions.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+CalculateSum64 (\r
+  IN      CONST UINT64             *Buffer,\r
+  IN      UINTN                     Length\r
+  );\r
+\r
+\r
+/**\r
+  Returns the two's complement checksum of all elements in a buffer of\r
+  64-bit values.\r
+\r
+  This function first calculates the sum of the 64-bit values in the buffer\r
+  specified by Buffer and Length.  The carry bits in the result of addition\r
+  are dropped. Then, the two's complement of the sum is returned.  If Length\r
+  is 0, then 0 is returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 64-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 64-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer      The pointer to the buffer to carry out the checksum operation.\r
+  @param  Length      The size, in bytes, of Buffer.\r
+\r
+  @return Checksum    The two's complement checksum of Buffer.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+CalculateCheckSum64 (\r
+  IN      CONST UINT64             *Buffer,\r
+  IN      UINTN                     Length\r
+  );\r
+\r
+/**\r
+  Computes and returns a 32-bit CRC for a data buffer.\r
+  CRC32 value bases on ITU-T V.42.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param[in]  Buffer       A pointer to the buffer on which the 32-bit CRC is to be computed.\r
+  @param[in]  Length       The number of bytes in the buffer Data.\r
+\r
+  @retval Crc32            The 32-bit CRC was computed for the data buffer.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+CalculateCrc32(\r
+  IN  VOID                         *Buffer,\r
+  IN  UINTN                        Length\r
+  );\r
+\r
+//\r
+// Base Library CPU Functions\r
+//\r
+\r
+/**\r
+  Function entry point used when a stack switch is requested with SwitchStack()\r
+\r
+  @param  Context1        Context1 parameter passed into SwitchStack().\r
+  @param  Context2        Context2 parameter passed into SwitchStack().\r
+\r
+**/\r
+typedef\r
+VOID\r
+(EFIAPI *SWITCH_STACK_ENTRY_POINT)(\r
+  IN      VOID                      *Context1,  OPTIONAL\r
+  IN      VOID                      *Context2   OPTIONAL\r
+  );\r
+\r
+\r
+/**\r
+  Used to serialize load and store operations.\r
+\r
+  All loads and stores that proceed calls to this function are guaranteed to be\r
+  globally visible when this function returns.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+MemoryFence (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Saves the current CPU context that can be restored with a call to LongJump()\r
+  and returns 0.\r
+\r
+  Saves the current CPU context in the buffer specified by JumpBuffer and\r
+  returns 0. The initial call to SetJump() must always return 0. Subsequent\r
+  calls to LongJump() cause a non-zero value to be returned by SetJump().\r
+\r
+  If JumpBuffer is NULL, then ASSERT().\r
+  For Itanium processors, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().\r
+\r
+  NOTE: The structure BASE_LIBRARY_JUMP_BUFFER is CPU architecture specific.\r
+  The same structure must never be used for more than one CPU architecture context.\r
+  For example, a BASE_LIBRARY_JUMP_BUFFER allocated by an IA-32 module must never be used from an x64 module.\r
+  SetJump()/LongJump() is not currently supported for the EBC processor type.\r
+\r
+  @param  JumpBuffer  A pointer to CPU context buffer.\r
+\r
+  @retval 0 Indicates a return from SetJump().\r
+\r
+**/\r
+RETURNS_TWICE\r
+UINTN\r
+EFIAPI\r
+SetJump (\r
+  OUT     BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer\r
+  );\r
+\r
+\r
+/**\r
+  Restores the CPU context that was saved with SetJump().\r
+\r
+  Restores the CPU context from the buffer specified by JumpBuffer. This\r
+  function never returns to the caller. Instead is resumes execution based on\r
+  the state of JumpBuffer.\r
+\r
+  If JumpBuffer is NULL, then ASSERT().\r
+  For Itanium processors, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().\r
+  If Value is 0, then ASSERT().\r
+\r
+  @param  JumpBuffer  A pointer to CPU context buffer.\r
+  @param  Value       The value to return when the SetJump() context is\r
+                      restored and must be non-zero.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+LongJump (\r
+  IN      BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer,\r
+  IN      UINTN                     Value\r
+  );\r
+\r
+\r
+/**\r
+  Enables CPU interrupts.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+EnableInterrupts (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Disables CPU interrupts.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+DisableInterrupts (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Disables CPU interrupts and returns the interrupt state prior to the disable\r
+  operation.\r
+\r
+  @retval TRUE  CPU interrupts were enabled on entry to this call.\r
+  @retval FALSE CPU interrupts were disabled on entry to this call.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+SaveAndDisableInterrupts (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Enables CPU interrupts for the smallest window required to capture any\r
+  pending interrupts.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+EnableDisableInterrupts (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Retrieves the current CPU interrupt state.\r
+\r
+  Returns TRUE if interrupts are currently enabled. Otherwise\r
+  returns FALSE.\r
+\r
+  @retval TRUE  CPU interrupts are enabled.\r
+  @retval FALSE CPU interrupts are disabled.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+GetInterruptState (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Set the current CPU interrupt state.\r
+\r
+  Sets the current CPU interrupt state to the state specified by\r
+  InterruptState. If InterruptState is TRUE, then interrupts are enabled. If\r
+  InterruptState is FALSE, then interrupts are disabled. InterruptState is\r
+  returned.\r
+\r
+  @param  InterruptState  TRUE if interrupts should enabled. FALSE if\r
+                          interrupts should be disabled.\r
+\r
+  @return InterruptState\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+SetInterruptState (\r
+  IN      BOOLEAN                   InterruptState\r
+  );\r
+\r
+\r
+/**\r
+  Requests CPU to pause for a short period of time.\r
+\r
+  Requests CPU to pause for a short period of time. Typically used in MP\r
+  systems to prevent memory starvation while waiting for a spin lock.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+CpuPause (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Transfers control to a function starting with a new stack.\r
+\r
+  Transfers control to the function specified by EntryPoint using the\r
+  new stack specified by NewStack and passing in the parameters specified\r
+  by Context1 and Context2.  Context1 and Context2 are optional and may\r
+  be NULL.  The function EntryPoint must never return.  This function\r
+  supports a variable number of arguments following the NewStack parameter.\r
+  These additional arguments are ignored on IA-32, x64, and EBC architectures.\r
+  Itanium processors expect one additional parameter of type VOID * that specifies\r
+  the new backing store pointer.\r
+\r
+  If EntryPoint is NULL, then ASSERT().\r
+  If NewStack is NULL, then ASSERT().\r
+\r
+  @param  EntryPoint  A pointer to function to call with the new stack.\r
+  @param  Context1    A pointer to the context to pass into the EntryPoint\r
+                      function.\r
+  @param  Context2    A pointer to the context to pass into the EntryPoint\r
+                      function.\r
+  @param  NewStack    A pointer to the new stack to use for the EntryPoint\r
+                      function.\r
+  @param  ...         This variable argument list is ignored for IA-32, x64, and\r
+                      EBC architectures.  For Itanium processors, this variable\r
+                      argument list is expected to contain a single parameter of\r
+                      type VOID * that specifies the new backing store pointer.\r
+\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SwitchStack (\r
+  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
+  IN      VOID                      *Context1,  OPTIONAL\r
+  IN      VOID                      *Context2,  OPTIONAL\r
+  IN      VOID                      *NewStack,\r
+  ...\r
+  );\r
+\r
+\r
+/**\r
+  Generates a breakpoint on the CPU.\r
+\r
+  Generates a breakpoint on the CPU. The breakpoint must be implemented such\r
+  that code can resume normal execution after the breakpoint.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+CpuBreakpoint (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Executes an infinite loop.\r
+\r
+  Forces the CPU to execute an infinite loop. A debugger may be used to skip\r
+  past the loop and the code that follows the loop must execute properly. This\r
+  implies that the infinite loop must not cause the code that follow it to be\r
+  optimized away.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+CpuDeadLoop (\r
+  VOID\r
+  );\r
+\r
+#if defined (MDE_CPU_IPF)\r
+\r
+/**\r
+  Flush a range of  cache lines in the cache coherency domain of the calling\r
+  CPU.\r
+\r
+  Flushes the cache lines specified by Address and Length.  If Address is not aligned\r
+  on a cache line boundary, then entire cache line containing Address is flushed.\r
+  If Address + Length is not aligned on a cache line boundary, then the entire cache\r
+  line containing Address + Length - 1 is flushed.  This function may choose to flush\r
+  the entire cache if that is more efficient than flushing the specified range.  If\r
+  Length is 0, the no cache lines are flushed.  Address is returned.\r
+  This function is only available on Itanium processors.\r
+\r
+  If Length is greater than (MAX_ADDRESS - Address + 1), then ASSERT().\r
+\r
+  @param  Address The base address of the instruction lines to invalidate. If\r
+                  the CPU is in a physical addressing mode, then Address is a\r
+                  physical address. If the CPU is in a virtual addressing mode,\r
+                  then Address is a virtual address.\r
+\r
+  @param  Length  The number of bytes to invalidate from the instruction cache.\r
+\r
+  @return Address.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+AsmFlushCacheRange (\r
+  IN      VOID                      *Address,\r
+  IN      UINTN                     Length\r
+  );\r
+\r
+\r
+/**\r
+  Executes an FC instruction.\r
+  Executes an FC instruction on the cache line specified by Address.\r
+  The cache line size affected is at least 32-bytes (aligned on a 32-byte boundary).\r
+  An implementation may flush a larger region.  This function is only available on Itanium processors.\r
+\r
+  @param Address    The Address of cache line to be flushed.\r
+\r
+  @return The address of FC instruction executed.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmFc (\r
+  IN  UINT64  Address\r
+  );\r
+\r
+\r
+/**\r
+  Executes an FC.I instruction.\r
+  Executes an FC.I instruction on the cache line specified by Address.\r
+  The cache line size affected is at least 32-bytes (aligned on a 32-byte boundary).\r
+  An implementation may flush a larger region.  This function is only available on Itanium processors.\r
+\r
+  @param Address    The Address of cache line to be flushed.\r
+\r
+  @return The address of the FC.I instruction executed.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmFci (\r
+  IN  UINT64  Address\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of a Processor Identifier Register (CPUID).\r
+\r
+  Reads and returns the current value of Processor Identifier Register specified by Index.\r
+  The Index of largest implemented CPUID (One less than the number of implemented CPUID\r
+  registers) is determined by CPUID [3] bits {7:0}.\r
+  No parameter checking is performed on Index.  If the Index value is beyond the\r
+  implemented CPUID register range, a Reserved Register/Field fault may occur.  The caller\r
+  must either guarantee that Index is valid, or the caller must set up fault handlers to\r
+  catch the faults.  This function is only available on Itanium processors.\r
+\r
+  @param Index    The 8-bit Processor Identifier Register index to read.\r
+\r
+  @return The current value of Processor Identifier Register specified by Index.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadCpuid (\r
+  IN  UINT8   Index\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Processor Status Register (PSR).\r
+  This function is only available on Itanium processors.\r
+\r
+  @return The current value of PSR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadPsr (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Processor Status Register (PSR).\r
+\r
+  No parameter checking is performed on Value.  All bits of Value corresponding to\r
+  reserved fields of PSR must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults. This function is only available on Itanium processors.\r
+\r
+  @param Value    The 64-bit value to write to PSR.\r
+\r
+  @return The 64-bit value written to the PSR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWritePsr (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #0 (KR0).\r
+\r
+  Reads and returns the current value of KR0.\r
+  This function is only available on Itanium processors.\r
+\r
+  @return The current value of KR0.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr0 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #1 (KR1).\r
+\r
+  Reads and returns the current value of KR1.\r
+  This function is only available on Itanium processors.\r
+\r
+  @return The current value of KR1.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr1 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #2 (KR2).\r
+\r
+  Reads and returns the current value of KR2.\r
+  This function is only available on Itanium processors.\r
+\r
+  @return The current value of KR2.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr2 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #3 (KR3).\r
+\r
+  Reads and returns the current value of KR3.\r
+  This function is only available on Itanium processors.\r
+\r
+  @return The current value of KR3.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr3 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #4 (KR4).\r
+\r
+  Reads and returns the current value of KR4.\r
+  This function is only available on Itanium processors.\r
+\r
+  @return The current value of KR4.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr4 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #5 (KR5).\r
+\r
+  Reads and returns the current value of KR5.\r
+  This function is only available on Itanium processors.\r
+\r
+  @return The current value of KR5.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr5 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #6 (KR6).\r
+\r
+  Reads and returns the current value of KR6.\r
+  This function is only available on Itanium processors.\r
+\r
+  @return The current value of KR6.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr6 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #7 (KR7).\r
+\r
+  Reads and returns the current value of KR7.\r
+  This function is only available on Itanium processors.\r
+\r
+  @return The current value of KR7.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr7 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #0 (KR0).\r
+\r
+  Writes the current value of KR0.  The 64-bit value written to\r
+  the KR0 is returned. This function is only available on Itanium processors.\r
+\r
+  @param  Value   The 64-bit value to write to KR0.\r
+\r
+  @return The 64-bit value written to the KR0.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr0 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #1 (KR1).\r
+\r
+  Writes the current value of KR1.  The 64-bit value written to\r
+  the KR1 is returned. This function is only available on Itanium processors.\r
+\r
+  @param  Value   The 64-bit value to write to KR1.\r
+\r
+  @return The 64-bit value written to the KR1.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr1 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #2 (KR2).\r
+\r
+  Writes the current value of KR2.  The 64-bit value written to\r
+  the KR2 is returned. This function is only available on Itanium processors.\r
+\r
+  @param  Value   The 64-bit value to write to KR2.\r
+\r
+  @return The 64-bit value written to the KR2.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr2 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #3 (KR3).\r
+\r
+  Writes the current value of KR3.  The 64-bit value written to\r
+  the KR3 is returned. This function is only available on Itanium processors.\r
+\r
+  @param  Value   The 64-bit value to write to KR3.\r
+\r
+  @return The 64-bit value written to the KR3.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr3 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #4 (KR4).\r
+\r
+  Writes the current value of KR4.  The 64-bit value written to\r
+  the KR4 is returned. This function is only available on Itanium processors.\r
+\r
+  @param  Value   The 64-bit value to write to KR4.\r
+\r
+  @return The 64-bit value written to the KR4.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr4 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #5 (KR5).\r
+\r
+  Writes the current value of KR5.  The 64-bit value written to\r
+  the KR5 is returned. This function is only available on Itanium processors.\r
+\r
+  @param  Value   The 64-bit value to write to KR5.\r
+\r
+  @return The 64-bit value written to the KR5.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr5 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #6 (KR6).\r
+\r
+  Writes the current value of KR6.  The 64-bit value written to\r
+  the KR6 is returned. This function is only available on Itanium processors.\r
+\r
+  @param  Value   The 64-bit value to write to KR6.\r
+\r
+  @return The 64-bit value written to the KR6.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr6 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #7 (KR7).\r
+\r
+  Writes the current value of KR7.  The 64-bit value written to\r
+  the KR7 is returned. This function is only available on Itanium processors.\r
+\r
+  @param  Value   The 64-bit value to write to KR7.\r
+\r
+  @return The 64-bit value written to the KR7.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr7 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Interval Timer Counter Register (ITC).\r
+\r
+  Reads and returns the current value of ITC.\r
+  This function is only available on Itanium processors.\r
+\r
+  @return The current value of ITC.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadItc (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Interval Timer Vector Register (ITV).\r
+\r
+  Reads and returns the current value of ITV.\r
+  This function is only available on Itanium processors.\r
+\r
+  @return The current value of ITV.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadItv (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Interval Timer Match Register (ITM).\r
+\r
+  Reads and returns the current value of ITM.\r
+  This function is only available on Itanium processors.\r
+\r
+  @return The current value of ITM.\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadItm (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Interval Timer Counter Register (ITC).\r
+\r
+  Writes the current value of ITC.  The 64-bit value written to the ITC is returned.\r
+  This function is only available on Itanium processors.\r
+\r
+  @param Value    The 64-bit value to write to ITC.\r
+\r
+  @return The 64-bit value written to the ITC.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteItc (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Interval Timer Match Register (ITM).\r
+\r
+  Writes the current value of ITM.  The 64-bit value written to the ITM is returned.\r
+  This function is only available on Itanium processors.\r
+\r
+  @param Value    The 64-bit value to write to ITM.\r
+\r
+  @return The 64-bit value written to the ITM.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteItm (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Interval Timer Vector Register (ITV).\r
+\r
+  Writes the current value of ITV.  The 64-bit value written to the ITV is returned.\r
+  No parameter checking is performed on Value.  All bits of Value corresponding to\r
+  reserved fields of ITV must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on Itanium processors.\r
+\r
+  @param Value    The 64-bit value to write to ITV.\r
+\r
+  @return The 64-bit value written to the ITV.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteItv (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Default Control Register (DCR).\r
+\r
+  Reads and returns the current value of DCR.  This function is only available on Itanium processors.\r
+\r
+  @return The current value of DCR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadDcr (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Interruption Vector Address Register (IVA).\r
+\r
+  Reads and returns the current value of IVA.  This function is only available on Itanium processors.\r
+\r
+  @return The current value of IVA.\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadIva (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Page Table Address Register (PTA).\r
+\r
+  Reads and returns the current value of PTA.  This function is only available on Itanium processors.\r
+\r
+  @return The current value of PTA.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadPta (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Default Control Register (DCR).\r
+\r
+  Writes the current value of DCR.  The 64-bit value written to the DCR is returned.\r
+  No parameter checking is performed on Value.  All bits of Value corresponding to\r
+  reserved fields of DCR must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on Itanium processors.\r
+\r
+  @param Value    The 64-bit value to write to DCR.\r
+\r
+  @return The 64-bit value written to the DCR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteDcr (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Interruption Vector Address Register (IVA).\r
+\r
+  Writes the current value of IVA.  The 64-bit value written to the IVA is returned.\r
+  The size of vector table is 32 K bytes and is 32 K bytes aligned\r
+  the low 15 bits of Value is ignored when written.\r
+  This function is only available on Itanium processors.\r
+\r
+  @param Value    The 64-bit value to write to IVA.\r
+\r
+  @return The 64-bit value written to the IVA.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteIva (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Page Table Address Register (PTA).\r
+\r
+  Writes the current value of PTA.  The 64-bit value written to the PTA is returned.\r
+  No parameter checking is performed on Value.  All bits of Value corresponding to\r
+  reserved fields of DCR must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on Itanium processors.\r
+\r
+  @param Value    The 64-bit value to write to PTA.\r
+\r
+  @return The 64-bit value written to the PTA.\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWritePta (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Local Interrupt ID Register (LID).\r
+\r
+  Reads and returns the current value of LID.  This function is only available on Itanium processors.\r
+\r
+  @return The current value of LID.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadLid (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of External Interrupt Vector Register (IVR).\r
+\r
+  Reads and returns the current value of IVR.  This function is only available on Itanium processors.\r
+\r
+  @return The current value of IVR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadIvr (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Task Priority Register (TPR).\r
+\r
+  Reads and returns the current value of TPR.  This function is only available on Itanium processors.\r
+\r
+  @return The current value of TPR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadTpr (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of External Interrupt Request Register #0 (IRR0).\r
+\r
+  Reads and returns the current value of IRR0.  This function is only available on Itanium processors.\r
+\r
+  @return The current value of IRR0.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadIrr0 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of External Interrupt Request Register #1 (IRR1).\r
+\r
+  Reads and returns the current value of IRR1.  This function is only available on Itanium processors.\r
+\r
+  @return The current value of IRR1.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadIrr1 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of External Interrupt Request Register #2 (IRR2).\r
+\r
+  Reads and returns the current value of IRR2.  This function is only available on Itanium processors.\r
+\r
+  @return The current value of IRR2.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadIrr2 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of External Interrupt Request Register #3 (IRR3).\r
+\r
+  Reads and returns the current value of IRR3.  This function is only available on Itanium processors.\r
+\r
+  @return The current value of IRR3.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadIrr3 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Performance Monitor Vector Register (PMV).\r
+\r
+  Reads and returns the current value of PMV.  This function is only available on Itanium processors.\r
+\r
+  @return The current value of PMV.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadPmv (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Corrected Machine Check Vector Register (CMCV).\r
+\r
+  Reads and returns the current value of CMCV.  This function is only available on Itanium processors.\r
+\r
+  @return The current value of CMCV.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadCmcv (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Local Redirection Register #0 (LRR0).\r
+\r
+  Reads and returns the current value of LRR0.  This function is only available on Itanium processors.\r
+\r
+  @return The current value of LRR0.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadLrr0 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Local Redirection Register #1 (LRR1).\r
+\r
+  Reads and returns the current value of LRR1.  This function is only available on Itanium processors.\r
+\r
+  @return The current value of LRR1.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadLrr1 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Page Local Interrupt ID Register (LID).\r
+\r
+  Writes the current value of LID.  The 64-bit value written to the LID is returned.\r
+  No parameter checking is performed on Value.  All bits of Value corresponding to\r
+  reserved fields of LID must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on Itanium processors.\r
+\r
+  @param Value    The 64-bit value to write to LID.\r
+\r
+  @return The 64-bit value written to the LID.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteLid (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Task Priority Register (TPR).\r
+\r
+  Writes the current value of TPR.  The 64-bit value written to the TPR is returned.\r
+  No parameter checking is performed on Value.  All bits of Value corresponding to\r
+  reserved fields of TPR must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on Itanium processors.\r
+\r
+  @param Value    The 64-bit value to write to TPR.\r
+\r
+  @return The 64-bit value written to the TPR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteTpr (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Performs a write operation on End OF External Interrupt Register (EOI).\r
+\r
+  Writes a value of 0 to the EOI Register.  This function is only available on Itanium processors.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmWriteEoi (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Performance Monitor Vector Register (PMV).\r
+\r
+  Writes the current value of PMV.  The 64-bit value written to the PMV is returned.\r
+  No parameter checking is performed on Value.  All bits of Value corresponding\r
+  to reserved fields of PMV must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on Itanium processors.\r
+\r
+  @param Value    The 64-bit value to write to PMV.\r
+\r
+  @return The 64-bit value written to the PMV.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWritePmv (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Corrected Machine Check Vector Register (CMCV).\r
+\r
+  Writes the current value of CMCV.  The 64-bit value written to the CMCV is returned.\r
+  No parameter checking is performed on Value.  All bits of Value corresponding\r
+  to reserved fields of CMCV must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on Itanium processors.\r
+\r
+  @param Value    The 64-bit value to write to CMCV.\r
+\r
+  @return The 64-bit value written to the CMCV.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteCmcv (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Local Redirection Register #0 (LRR0).\r
+\r
+  Writes the current value of LRR0.  The 64-bit value written to the LRR0 is returned.\r
+  No parameter checking is performed on Value.  All bits of Value corresponding\r
+  to reserved fields of LRR0 must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on Itanium processors.\r
+\r
+  @param Value    The 64-bit value to write to LRR0.\r
+\r
+  @return The 64-bit value written to the LRR0.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteLrr0 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Local Redirection Register #1 (LRR1).\r
+\r
+  Writes the current value of LRR1.  The 64-bit value written to the LRR1 is returned.\r
+  No parameter checking is performed on Value.  All bits of Value corresponding\r
+  to reserved fields of LRR1 must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must\r
+  set up fault handlers to catch the faults.\r
+  This function is only available on Itanium processors.\r
+\r
+  @param Value    The 64-bit value to write to LRR1.\r
+\r
+  @return The 64-bit value written to the LRR1.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteLrr1 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Instruction Breakpoint Register (IBR).\r
+\r
+  The Instruction Breakpoint Registers are used in pairs.  The even numbered\r
+  registers contain breakpoint addresses, and the odd numbered registers contain\r
+  breakpoint mask conditions.  At least four instruction registers pairs are implemented\r
+  on all processor models.   Implemented registers are contiguous starting with\r
+  register 0.  No parameter checking is performed on Index, and if the Index value\r
+  is beyond the implemented IBR register range, a Reserved Register/Field fault may\r
+  occur.  The caller must either guarantee that Index is valid, or the caller must\r
+  set up fault handlers to catch the faults.\r
+  This function is only available on Itanium processors.\r
+\r
+  @param Index    The 8-bit Instruction Breakpoint Register index to read.\r
+\r
+  @return The current value of Instruction Breakpoint Register specified by Index.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadIbr (\r
+  IN  UINT8   Index\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Data Breakpoint Register (DBR).\r
+\r
+  The Data Breakpoint Registers are used in pairs.  The even numbered registers\r
+  contain breakpoint addresses, and odd numbered registers contain breakpoint\r
+  mask conditions.  At least four data registers pairs are implemented on all processor\r
+  models.  Implemented registers are contiguous starting with register 0.\r
+  No parameter checking is performed on Index.  If the Index value is beyond\r
+  the implemented DBR register range, a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Index is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on Itanium processors.\r
+\r
+  @param Index    The 8-bit Data Breakpoint Register index to read.\r
+\r
+  @return The current value of Data Breakpoint Register specified by Index.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadDbr (\r
+  IN  UINT8   Index\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Performance Monitor Configuration Register (PMC).\r
+\r
+  All processor implementations provide at least four performance counters\r
+  (PMC/PMD [4]...PMC/PMD [7] pairs), and four performance monitor counter overflow\r
+  status registers (PMC [0]... PMC [3]).  Processor implementations may provide\r
+  additional implementation-dependent PMC and PMD to increase the number of\r
+  'generic' performance counters (PMC/PMD pairs).  The remainder of PMC and PMD\r
+  register set is implementation dependent.  No parameter checking is performed\r
+  on Index.  If the Index value is beyond the implemented PMC register range,\r
+  zero value will be returned.\r
+  This function is only available on Itanium processors.\r
+\r
+  @param Index    The 8-bit Performance Monitor Configuration Register index to read.\r
+\r
+  @return   The current value of Performance Monitor Configuration Register\r
+            specified by Index.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadPmc (\r
+  IN  UINT8   Index\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Performance Monitor Data Register (PMD).\r
+\r
+  All processor implementations provide at least 4 performance counters\r
+  (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter\r
+  overflow status registers (PMC [0]... PMC [3]).  Processor implementations may\r
+  provide additional implementation-dependent PMC and PMD to increase the number\r
+  of 'generic' performance counters (PMC/PMD pairs).  The remainder of PMC and PMD\r
+  register set is implementation dependent.  No parameter checking is performed\r
+  on Index.  If the Index value is beyond the implemented PMD register range,\r
+  zero value will be returned.\r
+  This function is only available on Itanium processors.\r
+\r
+  @param Index    The 8-bit Performance Monitor Data Register index to read.\r
+\r
+  @return The current value of Performance Monitor Data Register specified by Index.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadPmd (\r
+  IN  UINT8   Index\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Instruction Breakpoint Register (IBR).\r
+\r
+  Writes current value of Instruction Breakpoint Register specified by Index.\r
+  The Instruction Breakpoint Registers are used in pairs.  The even numbered\r
+  registers contain breakpoint addresses, and odd numbered registers contain\r
+  breakpoint mask conditions.  At least four instruction registers pairs are implemented\r
+  on all processor models.  Implemented registers are contiguous starting with\r
+  register 0.  No parameter checking is performed on Index.  If the Index value\r
+  is beyond the implemented IBR register range, a Reserved Register/Field fault may\r
+  occur.  The caller must either guarantee that Index is valid, or the caller must\r
+  set up fault handlers to catch the faults.\r
+  This function is only available on Itanium processors.\r
+\r
+  @param Index    The 8-bit Instruction Breakpoint Register index to write.\r
+  @param Value    The 64-bit value to write to IBR.\r
+\r
+  @return The 64-bit value written to the IBR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteIbr (\r
+  IN UINT8   Index,\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Data Breakpoint Register (DBR).\r
+\r
+  Writes current value of Data Breakpoint Register specified by Index.\r
+  The Data Breakpoint Registers are used in pairs.  The even numbered registers\r
+  contain breakpoint addresses, and odd numbered registers contain breakpoint\r
+  mask conditions.  At least four data registers pairs are implemented on all processor\r
+  models.  Implemented registers are contiguous starting with register 0.  No parameter\r
+  checking is performed on Index.  If the Index value is beyond the implemented\r
+  DBR register range, a Reserved Register/Field fault may occur.  The caller must\r
+  either guarantee that Index is valid, or the caller must set up fault handlers to\r
+  catch the faults.\r
+  This function is only available on Itanium processors.\r
+\r
+  @param Index    The 8-bit Data Breakpoint Register index to write.\r
+  @param Value    The 64-bit value to write to DBR.\r
+\r
+  @return The 64-bit value written to the DBR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteDbr (\r
+  IN UINT8   Index,\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Performance Monitor Configuration Register (PMC).\r
+\r
+  Writes current value of Performance Monitor Configuration Register specified by Index.\r
+  All processor implementations provide at least four performance counters\r
+  (PMC/PMD [4]...PMC/PMD [7] pairs), and four performance monitor counter overflow status\r
+  registers (PMC [0]... PMC [3]).  Processor implementations may provide additional\r
+  implementation-dependent PMC and PMD to increase the number of 'generic' performance\r
+  counters (PMC/PMD pairs).  The remainder of PMC and PMD register set is implementation\r
+  dependent.  No parameter checking is performed on Index.  If the Index value is\r
+  beyond the implemented PMC register range, the write is ignored.\r
+  This function is only available on Itanium processors.\r
+\r
+  @param Index    The 8-bit Performance Monitor Configuration Register index to write.\r
+  @param Value    The 64-bit value to write to PMC.\r
+\r
+  @return The 64-bit value written to the PMC.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWritePmc (\r
+  IN UINT8   Index,\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Performance Monitor Data Register (PMD).\r
+\r
+  Writes current value of Performance Monitor Data Register specified by Index.\r
+  All processor implementations provide at least four performance counters\r
+  (PMC/PMD [4]...PMC/PMD [7] pairs), and four performance monitor counter overflow\r
+  status registers (PMC [0]... PMC [3]).  Processor implementations may provide\r
+  additional implementation-dependent PMC and PMD to increase the number of 'generic'\r
+  performance counters (PMC/PMD pairs).  The remainder of PMC and PMD register set\r
+  is implementation dependent.  No parameter checking is performed on Index.  If the\r
+  Index value is beyond the implemented PMD register range, the write is ignored.\r
+  This function is only available on Itanium processors.\r
+\r
+  @param Index    The 8-bit Performance Monitor Data Register index to write.\r
+  @param Value    The 64-bit value to write to PMD.\r
+\r
+  @return The 64-bit value written to the PMD.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWritePmd (\r
+  IN UINT8   Index,\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Global Pointer (GP).\r
+\r
+  Reads and returns the current value of GP.\r
+  This function is only available on Itanium processors.\r
+\r
+  @return The current value of GP.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadGp (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Global Pointer (GP).\r
+\r
+  Writes the current value of GP. The 64-bit value written to the GP is returned.\r
+  No parameter checking is performed on Value.\r
+  This function is only available on Itanium processors.\r
+\r
+  @param Value  The 64-bit value to write to GP.\r
+\r
+  @return The 64-bit value written to the GP.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteGp (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Stack Pointer (SP).\r
+\r
+  Reads and returns the current value of SP.\r
+  This function is only available on Itanium processors.\r
+\r
+  @return The current value of SP.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadSp (\r
+  VOID\r
+  );\r
+\r
+\r
+///\r
+/// Valid Index value for AsmReadControlRegister().\r
+///\r
+#define IPF_CONTROL_REGISTER_DCR   0\r
+#define IPF_CONTROL_REGISTER_ITM   1\r
+#define IPF_CONTROL_REGISTER_IVA   2\r
+#define IPF_CONTROL_REGISTER_PTA   8\r
+#define IPF_CONTROL_REGISTER_IPSR  16\r
+#define IPF_CONTROL_REGISTER_ISR   17\r
+#define IPF_CONTROL_REGISTER_IIP   19\r
+#define IPF_CONTROL_REGISTER_IFA   20\r
+#define IPF_CONTROL_REGISTER_ITIR  21\r
+#define IPF_CONTROL_REGISTER_IIPA  22\r
+#define IPF_CONTROL_REGISTER_IFS   23\r
+#define IPF_CONTROL_REGISTER_IIM   24\r
+#define IPF_CONTROL_REGISTER_IHA   25\r
+#define IPF_CONTROL_REGISTER_LID   64\r
+#define IPF_CONTROL_REGISTER_IVR   65\r
+#define IPF_CONTROL_REGISTER_TPR   66\r
+#define IPF_CONTROL_REGISTER_EOI   67\r
+#define IPF_CONTROL_REGISTER_IRR0  68\r
+#define IPF_CONTROL_REGISTER_IRR1  69\r
+#define IPF_CONTROL_REGISTER_IRR2  70\r
+#define IPF_CONTROL_REGISTER_IRR3  71\r
+#define IPF_CONTROL_REGISTER_ITV   72\r
+#define IPF_CONTROL_REGISTER_PMV   73\r
+#define IPF_CONTROL_REGISTER_CMCV  74\r
+#define IPF_CONTROL_REGISTER_LRR0  80\r
+#define IPF_CONTROL_REGISTER_LRR1  81\r
+\r
+/**\r
+  Reads a 64-bit control register.\r
+\r
+  Reads and returns the control register specified by Index. The valid Index valued\r
+  are defined above in "Related Definitions".\r
+  If Index is invalid then 0xFFFFFFFFFFFFFFFF is returned.  This function is only\r
+  available on Itanium processors.\r
+\r
+  @param  Index                     The index of the control register to read.\r
+\r
+  @return The control register specified by Index.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadControlRegister (\r
+  IN UINT64  Index\r
+  );\r
+\r
+\r
+///\r
+/// Valid Index value for AsmReadApplicationRegister().\r
+///\r
+#define IPF_APPLICATION_REGISTER_K0        0\r
+#define IPF_APPLICATION_REGISTER_K1        1\r
+#define IPF_APPLICATION_REGISTER_K2        2\r
+#define IPF_APPLICATION_REGISTER_K3        3\r
+#define IPF_APPLICATION_REGISTER_K4        4\r
+#define IPF_APPLICATION_REGISTER_K5        5\r
+#define IPF_APPLICATION_REGISTER_K6        6\r
+#define IPF_APPLICATION_REGISTER_K7        7\r
+#define IPF_APPLICATION_REGISTER_RSC       16\r
+#define IPF_APPLICATION_REGISTER_BSP       17\r
+#define IPF_APPLICATION_REGISTER_BSPSTORE  18\r
+#define IPF_APPLICATION_REGISTER_RNAT      19\r
+#define IPF_APPLICATION_REGISTER_FCR       21\r
+#define IPF_APPLICATION_REGISTER_EFLAG     24\r
+#define IPF_APPLICATION_REGISTER_CSD       25\r
+#define IPF_APPLICATION_REGISTER_SSD       26\r
+#define IPF_APPLICATION_REGISTER_CFLG      27\r
+#define IPF_APPLICATION_REGISTER_FSR       28\r
+#define IPF_APPLICATION_REGISTER_FIR       29\r
+#define IPF_APPLICATION_REGISTER_FDR       30\r
+#define IPF_APPLICATION_REGISTER_CCV       32\r
+#define IPF_APPLICATION_REGISTER_UNAT      36\r
+#define IPF_APPLICATION_REGISTER_FPSR      40\r
+#define IPF_APPLICATION_REGISTER_ITC       44\r
+#define IPF_APPLICATION_REGISTER_PFS       64\r
+#define IPF_APPLICATION_REGISTER_LC        65\r
+#define IPF_APPLICATION_REGISTER_EC        66\r
+\r
+/**\r
+  Reads a 64-bit application register.\r
+\r
+  Reads and returns the application register specified by Index. The valid Index\r
+  valued are defined above in "Related Definitions".\r
+  If Index is invalid then 0xFFFFFFFFFFFFFFFF is returned.  This function is only\r
+  available on Itanium processors.\r
+\r
+  @param  Index                     The index of the application register to read.\r
+\r
+  @return The application register specified by Index.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadApplicationRegister (\r
+  IN UINT64  Index\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of a Machine Specific Register (MSR).\r
+\r
+  Reads and returns the current value of the Machine Specific Register specified by Index.  No\r
+  parameter checking is performed on Index, and if the Index value is beyond the implemented MSR\r
+  register range, a Reserved Register/Field fault may occur.  The caller must either guarantee that\r
+  Index is valid, or the caller must set up fault handlers to catch the faults.  This function is\r
+  only available on Itanium processors.\r
+\r
+  @param  Index                     The 8-bit Machine Specific Register index to read.\r
+\r
+  @return The current value of the Machine Specific Register specified by Index.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadMsr (\r
+  IN UINT8   Index\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of a Machine Specific Register (MSR).\r
+\r
+  Writes Value to the Machine Specific Register specified by Index.  Value is returned.  No\r
+  parameter checking is performed on Index, and if the Index value is beyond the implemented MSR\r
+  register range, a Reserved Register/Field fault may occur.  The caller must either guarantee that\r
+  Index is valid, or the caller must set up fault handlers to catch the faults.  This function is\r
+  only available on Itanium processors.\r
+\r
+  @param  Index                     The 8-bit Machine Specific Register index to write.\r
+  @param  Value                     The 64-bit value to write to the Machine Specific Register.\r
+\r
+  @return The 64-bit value to write to the Machine Specific Register.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteMsr (\r
+  IN UINT8   Index,\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Determines if the CPU is currently executing in virtual, physical, or mixed mode.\r
+\r
+  Determines the current execution mode of the CPU.\r
+  If the CPU is in virtual mode(PSR.RT=1, PSR.DT=1, PSR.IT=1), then 1 is returned.\r
+  If the CPU is in physical mode(PSR.RT=0, PSR.DT=0, PSR.IT=0), then 0 is returned.\r
+  If the CPU is not in physical mode or virtual mode, then it is in mixed mode,\r
+  and -1 is returned.\r
+  This function is only available on Itanium processors.\r
+\r
+  @retval  1  The CPU is in virtual mode.\r
+  @retval  0  The CPU is in physical mode.\r
+  @retval -1  The CPU is in mixed mode.\r
+\r
+**/\r
+INT64\r
+EFIAPI\r
+AsmCpuVirtual (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Makes a PAL procedure call.\r
+\r
+  This is a wrapper function to make a PAL procedure call.  Based on the Index\r
+  value this API will make static or stacked PAL call.  The following table\r
+  describes the usage of PAL Procedure Index Assignment. Architected procedures\r
+  may be designated as required or optional.  If a PAL procedure is specified\r
+  as optional, a unique return code of 0xFFFFFFFFFFFFFFFF is returned in the\r
+  Status field of the PAL_CALL_RETURN structure.\r
+  This indicates that the procedure is not present in this PAL implementation.\r
+  It is the caller's responsibility to check for this return code after calling\r
+  any optional PAL procedure.\r
+  No parameter checking is performed on the 5 input parameters, but there are\r
+  some common rules that the caller should follow when making a PAL call.  Any\r
+  address passed to PAL as buffers for return parameters must be 8-byte aligned.\r
+  Unaligned addresses may cause undefined results.  For those parameters defined\r
+  as reserved or some fields defined as reserved must be zero filled or the invalid\r
+  argument return value may be returned or undefined result may occur during the\r
+  execution of the procedure.  If the PalEntryPoint  does not point to a valid\r
+  PAL entry point then the system behavior is undefined.  This function is only\r
+  available on Itanium processors.\r
+\r
+  @param PalEntryPoint  The PAL procedure calls entry point.\r
+  @param Index          The PAL procedure Index number.\r
+  @param Arg2           The 2nd parameter for PAL procedure calls.\r
+  @param Arg3           The 3rd parameter for PAL procedure calls.\r
+  @param Arg4           The 4th parameter for PAL procedure calls.\r
+\r
+  @return structure returned from the PAL Call procedure, including the status and return value.\r
+\r
+**/\r
+PAL_CALL_RETURN\r
+EFIAPI\r
+AsmPalCall (\r
+  IN UINT64  PalEntryPoint,\r
+  IN UINT64  Index,\r
+  IN UINT64  Arg2,\r
+  IN UINT64  Arg3,\r
+  IN UINT64  Arg4\r
+  );\r
+#endif // defined (MDE_CPU_IPF)\r
+\r
+#if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)\r
+///\r
+/// IA32 and x64 Specific Functions.\r
+/// Byte packed structure for 16-bit Real Mode EFLAGS.\r
+///\r
+typedef union {\r
+  struct {\r
+    UINT32  CF:1;           ///< Carry Flag.\r
+    UINT32  Reserved_0:1;   ///< Reserved.\r
+    UINT32  PF:1;           ///< Parity Flag.\r
+    UINT32  Reserved_1:1;   ///< Reserved.\r
+    UINT32  AF:1;           ///< Auxiliary Carry Flag.\r
+    UINT32  Reserved_2:1;   ///< Reserved.\r
+    UINT32  ZF:1;           ///< Zero Flag.\r
+    UINT32  SF:1;           ///< Sign Flag.\r
+    UINT32  TF:1;           ///< Trap Flag.\r
+    UINT32  IF:1;           ///< Interrupt Enable Flag.\r
+    UINT32  DF:1;           ///< Direction Flag.\r
+    UINT32  OF:1;           ///< Overflow Flag.\r
+    UINT32  IOPL:2;         ///< I/O Privilege Level.\r
+    UINT32  NT:1;           ///< Nested Task.\r
+    UINT32  Reserved_3:1;   ///< Reserved.\r
+  } Bits;\r
+  UINT16    Uint16;\r
+} IA32_FLAGS16;\r
+\r
+///\r
+/// Byte packed structure for EFLAGS/RFLAGS.\r
+/// 32-bits on IA-32.\r
+/// 64-bits on x64.  The upper 32-bits on x64 are reserved.\r
+///\r
+typedef union {\r
+  struct {\r
+    UINT32  CF:1;           ///< Carry Flag.\r
+    UINT32  Reserved_0:1;   ///< Reserved.\r
+    UINT32  PF:1;           ///< Parity Flag.\r
+    UINT32  Reserved_1:1;   ///< Reserved.\r
+    UINT32  AF:1;           ///< Auxiliary Carry Flag.\r
+    UINT32  Reserved_2:1;   ///< Reserved.\r
+    UINT32  ZF:1;           ///< Zero Flag.\r
+    UINT32  SF:1;           ///< Sign Flag.\r
+    UINT32  TF:1;           ///< Trap Flag.\r
+    UINT32  IF:1;           ///< Interrupt Enable Flag.\r
+    UINT32  DF:1;           ///< Direction Flag.\r
+    UINT32  OF:1;           ///< Overflow Flag.\r
+    UINT32  IOPL:2;         ///< I/O Privilege Level.\r
+    UINT32  NT:1;           ///< Nested Task.\r
+    UINT32  Reserved_3:1;   ///< Reserved.\r
+    UINT32  RF:1;           ///< Resume Flag.\r
+    UINT32  VM:1;           ///< Virtual 8086 Mode.\r
+    UINT32  AC:1;           ///< Alignment Check.\r
+    UINT32  VIF:1;          ///< Virtual Interrupt Flag.\r
+    UINT32  VIP:1;          ///< Virtual Interrupt Pending.\r
+    UINT32  ID:1;           ///< ID Flag.\r
+    UINT32  Reserved_4:10;  ///< Reserved.\r
+  } Bits;\r
+  UINTN     UintN;\r
+} IA32_EFLAGS32;\r
+\r
+///\r
+/// Byte packed structure for Control Register 0 (CR0).\r
+/// 32-bits on IA-32.\r
+/// 64-bits on x64.  The upper 32-bits on x64 are reserved.\r
+///\r
+typedef union {\r
+  struct {\r
+    UINT32  PE:1;           ///< Protection Enable.\r
+    UINT32  MP:1;           ///< Monitor Coprocessor.\r
+    UINT32  EM:1;           ///< Emulation.\r
+    UINT32  TS:1;           ///< Task Switched.\r
+    UINT32  ET:1;           ///< Extension Type.\r
+    UINT32  NE:1;           ///< Numeric Error.\r
+    UINT32  Reserved_0:10;  ///< Reserved.\r
+    UINT32  WP:1;           ///< Write Protect.\r
+    UINT32  Reserved_1:1;   ///< Reserved.\r
+    UINT32  AM:1;           ///< Alignment Mask.\r
+    UINT32  Reserved_2:10;  ///< Reserved.\r
+    UINT32  NW:1;           ///< Mot Write-through.\r
+    UINT32  CD:1;           ///< Cache Disable.\r
+    UINT32  PG:1;           ///< Paging.\r
+  } Bits;\r
+  UINTN     UintN;\r
+} IA32_CR0;\r
+\r
+///\r
+/// Byte packed structure for Control Register 4 (CR4).\r
+/// 32-bits on IA-32.\r
+/// 64-bits on x64.  The upper 32-bits on x64 are reserved.\r
+///\r
+typedef union {\r
+  struct {\r
+    UINT32  VME:1;          ///< Virtual-8086 Mode Extensions.\r
+    UINT32  PVI:1;          ///< Protected-Mode Virtual Interrupts.\r
+    UINT32  TSD:1;          ///< Time Stamp Disable.\r
+    UINT32  DE:1;           ///< Debugging Extensions.\r
+    UINT32  PSE:1;          ///< Page Size Extensions.\r
+    UINT32  PAE:1;          ///< Physical Address Extension.\r
+    UINT32  MCE:1;          ///< Machine Check Enable.\r
+    UINT32  PGE:1;          ///< Page Global Enable.\r
+    UINT32  PCE:1;          ///< Performance Monitoring Counter\r
+                            ///< Enable.\r
+    UINT32  OSFXSR:1;       ///< Operating System Support for\r
+                            ///< FXSAVE and FXRSTOR instructions\r
+    UINT32  OSXMMEXCPT:1;   ///< Operating System Support for\r
+                            ///< Unmasked SIMD Floating Point\r
+                            ///< Exceptions.\r
+    UINT32  Reserved_0:2;   ///< Reserved.\r
+    UINT32  VMXE:1;         ///< VMX Enable\r
+    UINT32  Reserved_1:18;  ///< Reserved.\r
+  } Bits;\r
+  UINTN     UintN;\r
+} IA32_CR4;\r
+\r
+///\r
+/// Byte packed structure for a segment descriptor in a GDT/LDT.\r
+///\r
+typedef union {\r
+  struct {\r
+    UINT32  LimitLow:16;\r
+    UINT32  BaseLow:16;\r
+    UINT32  BaseMid:8;\r
+    UINT32  Type:4;\r
+    UINT32  S:1;\r
+    UINT32  DPL:2;\r
+    UINT32  P:1;\r
+    UINT32  LimitHigh:4;\r
+    UINT32  AVL:1;\r
+    UINT32  L:1;\r
+    UINT32  DB:1;\r
+    UINT32  G:1;\r
+    UINT32  BaseHigh:8;\r
+  } Bits;\r
+  UINT64  Uint64;\r
+} IA32_SEGMENT_DESCRIPTOR;\r
+\r
+///\r
+/// Byte packed structure for an IDTR, GDTR, LDTR descriptor.\r
+///\r
+#pragma pack (1)\r
+typedef struct {\r
+  UINT16  Limit;\r
+  UINTN   Base;\r
+} IA32_DESCRIPTOR;\r
+#pragma pack ()\r
+\r
+#define IA32_IDT_GATE_TYPE_TASK          0x85\r
+#define IA32_IDT_GATE_TYPE_INTERRUPT_16  0x86\r
+#define IA32_IDT_GATE_TYPE_TRAP_16       0x87\r
+#define IA32_IDT_GATE_TYPE_INTERRUPT_32  0x8E\r
+#define IA32_IDT_GATE_TYPE_TRAP_32       0x8F\r
+\r
+#define IA32_GDT_TYPE_TSS               0x9\r
+#define IA32_GDT_ALIGNMENT              8\r
+\r
+#if defined (MDE_CPU_IA32)\r
+///\r
+/// Byte packed structure for an IA-32 Interrupt Gate Descriptor.\r
+///\r
+typedef union {\r
+  struct {\r
+    UINT32  OffsetLow:16;   ///< Offset bits 15..0.\r
+    UINT32  Selector:16;    ///< Selector.\r
+    UINT32  Reserved_0:8;   ///< Reserved.\r
+    UINT32  GateType:8;     ///< Gate Type.  See #defines above.\r
+    UINT32  OffsetHigh:16;  ///< Offset bits 31..16.\r
+  } Bits;\r
+  UINT64  Uint64;\r
+} IA32_IDT_GATE_DESCRIPTOR;\r
+\r
+#pragma pack (1)\r
+//\r
+// IA32 Task-State Segment Definition\r
+//\r
+typedef struct {\r
+  UINT16    PreviousTaskLink;\r
+  UINT16    Reserved_2;\r
+  UINT32    ESP0;\r
+  UINT16    SS0;\r
+  UINT16    Reserved_10;\r
+  UINT32    ESP1;\r
+  UINT16    SS1;\r
+  UINT16    Reserved_18;\r
+  UINT32    ESP2;\r
+  UINT16    SS2;\r
+  UINT16    Reserved_26;\r
+  UINT32    CR3;\r
+  UINT32    EIP;\r
+  UINT32    EFLAGS;\r
+  UINT32    EAX;\r
+  UINT32    ECX;\r
+  UINT32    EDX;\r
+  UINT32    EBX;\r
+  UINT32    ESP;\r
+  UINT32    EBP;\r
+  UINT32    ESI;\r
+  UINT32    EDI;\r
+  UINT16    ES;\r
+  UINT16    Reserved_74;\r
+  UINT16    CS;\r
+  UINT16    Reserved_78;\r
+  UINT16    SS;\r
+  UINT16    Reserved_82;\r
+  UINT16    DS;\r
+  UINT16    Reserved_86;\r
+  UINT16    FS;\r
+  UINT16    Reserved_90;\r
+  UINT16    GS;\r
+  UINT16    Reserved_94;\r
+  UINT16    LDTSegmentSelector;\r
+  UINT16    Reserved_98;\r
+  UINT16    T;\r
+  UINT16    IOMapBaseAddress;\r
+} IA32_TASK_STATE_SEGMENT;\r
+\r
+typedef union {\r
+  struct {\r
+    UINT32  LimitLow:16;    ///< Segment Limit 15..00\r
+    UINT32  BaseLow:16;     ///< Base Address  15..00\r
+    UINT32  BaseMid:8;      ///< Base Address  23..16\r
+    UINT32  Type:4;         ///< Type (1 0 B 1)\r
+    UINT32  Reserved_43:1;  ///< 0\r
+    UINT32  DPL:2;          ///< Descriptor Privilege Level\r
+    UINT32  P:1;            ///< Segment Present\r
+    UINT32  LimitHigh:4;    ///< Segment Limit 19..16\r
+    UINT32  AVL:1;          ///< Available for use by system software\r
+    UINT32  Reserved_52:2;  ///< 0 0\r
+    UINT32  G:1;            ///< Granularity\r
+    UINT32  BaseHigh:8;     ///< Base Address 31..24\r
+  } Bits;\r
+  UINT64  Uint64;\r
+} IA32_TSS_DESCRIPTOR;\r
+#pragma pack ()\r
+\r
+#endif // defined (MDE_CPU_IA32)\r
+\r
+#if defined (MDE_CPU_X64)\r
+///\r
+/// Byte packed structure for an x64 Interrupt Gate Descriptor.\r
+///\r
+typedef union {\r
+  struct {\r
+    UINT32  OffsetLow:16;   ///< Offset bits 15..0.\r
+    UINT32  Selector:16;    ///< Selector.\r
+    UINT32  Reserved_0:8;   ///< Reserved.\r
+    UINT32  GateType:8;     ///< Gate Type.  See #defines above.\r
+    UINT32  OffsetHigh:16;  ///< Offset bits 31..16.\r
+    UINT32  OffsetUpper:32; ///< Offset bits 63..32.\r
+    UINT32  Reserved_1:32;  ///< Reserved.\r
+  } Bits;\r
+  struct {\r
+    UINT64  Uint64;\r
+    UINT64  Uint64_1;\r
+  } Uint128;\r
+} IA32_IDT_GATE_DESCRIPTOR;\r
+\r
+#pragma pack (1)\r
+//\r
+// IA32 Task-State Segment Definition\r
+//\r
+typedef struct {\r
+  UINT32    Reserved_0;\r
+  UINT64    RSP0;\r
+  UINT64    RSP1;\r
+  UINT64    RSP2;\r
+  UINT64    Reserved_28;\r
+  UINT64    IST[7];\r
+  UINT64    Reserved_92;\r
+  UINT16    Reserved_100;\r
+  UINT16    IOMapBaseAddress;\r
+} IA32_TASK_STATE_SEGMENT;\r
+\r
+typedef union {\r
+  struct {\r
+    UINT32  LimitLow:16;    ///< Segment Limit 15..00\r
+    UINT32  BaseLow:16;     ///< Base Address  15..00\r
+    UINT32  BaseMidl:8;     ///< Base Address  23..16\r
+    UINT32  Type:4;         ///< Type (1 0 B 1)\r
+    UINT32  Reserved_43:1;  ///< 0\r
+    UINT32  DPL:2;          ///< Descriptor Privilege Level\r
+    UINT32  P:1;            ///< Segment Present\r
+    UINT32  LimitHigh:4;    ///< Segment Limit 19..16\r
+    UINT32  AVL:1;          ///< Available for use by system software\r
+    UINT32  Reserved_52:2;  ///< 0 0\r
+    UINT32  G:1;            ///< Granularity\r
+    UINT32  BaseMidh:8;     ///< Base Address  31..24\r
+    UINT32  BaseHigh:32;    ///< Base Address  63..32\r
+    UINT32  Reserved_96:32; ///< Reserved\r
+  } Bits;\r
+  struct {\r
+    UINT64  Uint64;\r
+    UINT64  Uint64_1;\r
+  } Uint128;\r
+} IA32_TSS_DESCRIPTOR;\r
+#pragma pack ()\r
+\r
+#endif // defined (MDE_CPU_X64)\r
+\r
+///\r
+/// Byte packed structure for an FP/SSE/SSE2 context.\r
+///\r
+typedef struct {\r
+  UINT8  Buffer[512];\r
+} IA32_FX_BUFFER;\r
+\r
+///\r
+/// Structures for the 16-bit real mode thunks.\r
+///\r
+typedef struct {\r
+  UINT32                            Reserved1;\r
+  UINT32                            Reserved2;\r
+  UINT32                            Reserved3;\r
+  UINT32                            Reserved4;\r
+  UINT8                             BL;\r
+  UINT8                             BH;\r
+  UINT16                            Reserved5;\r
+  UINT8                             DL;\r
+  UINT8                             DH;\r
+  UINT16                            Reserved6;\r
+  UINT8                             CL;\r
+  UINT8                             CH;\r
+  UINT16                            Reserved7;\r
+  UINT8                             AL;\r
+  UINT8                             AH;\r
+  UINT16                            Reserved8;\r
+} IA32_BYTE_REGS;\r
+\r
+typedef struct {\r
+  UINT16                            DI;\r
+  UINT16                            Reserved1;\r
+  UINT16                            SI;\r
+  UINT16                            Reserved2;\r
+  UINT16                            BP;\r
+  UINT16                            Reserved3;\r
+  UINT16                            SP;\r
+  UINT16                            Reserved4;\r
+  UINT16                            BX;\r
+  UINT16                            Reserved5;\r
+  UINT16                            DX;\r
+  UINT16                            Reserved6;\r
+  UINT16                            CX;\r
+  UINT16                            Reserved7;\r
+  UINT16                            AX;\r
+  UINT16                            Reserved8;\r
+} IA32_WORD_REGS;\r
+\r
+typedef struct {\r
+  UINT32                            EDI;\r
+  UINT32                            ESI;\r
+  UINT32                            EBP;\r
+  UINT32                            ESP;\r
+  UINT32                            EBX;\r
+  UINT32                            EDX;\r
+  UINT32                            ECX;\r
+  UINT32                            EAX;\r
+  UINT16                            DS;\r
+  UINT16                            ES;\r
+  UINT16                            FS;\r
+  UINT16                            GS;\r
+  IA32_EFLAGS32                     EFLAGS;\r
+  UINT32                            Eip;\r
+  UINT16                            CS;\r
+  UINT16                            SS;\r
+} IA32_DWORD_REGS;\r
+\r
+typedef union {\r
+  IA32_DWORD_REGS                   E;\r
+  IA32_WORD_REGS                    X;\r
+  IA32_BYTE_REGS                    H;\r
+} IA32_REGISTER_SET;\r
+\r
+///\r
+/// Byte packed structure for an 16-bit real mode thunks.\r
+///\r
+typedef struct {\r
+  IA32_REGISTER_SET                 *RealModeState;\r
+  VOID                              *RealModeBuffer;\r
+  UINT32                            RealModeBufferSize;\r
+  UINT32                            ThunkAttributes;\r
+} THUNK_CONTEXT;\r
+\r
+#define THUNK_ATTRIBUTE_BIG_REAL_MODE             0x00000001\r
+#define THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15   0x00000002\r
+#define THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL 0x00000004\r
+\r
+///\r
+/// Type definition for representing labels in NASM source code that allow for\r
+/// the patching of immediate operands of IA32 and X64 instructions.\r
+///\r
+/// While the type is technically defined as a function type (note: not a\r
+/// pointer-to-function type), such labels in NASM source code never stand for\r
+/// actual functions, and identifiers declared with this function type should\r
+/// never be called. This is also why the EFIAPI calling convention specifier\r
+/// is missing from the typedef, and why the typedef does not follow the usual\r
+/// edk2 coding style for function (or pointer-to-function) typedefs. The VOID\r
+/// return type and the VOID argument list are merely artifacts.\r
+///\r
+typedef VOID (X86_ASSEMBLY_PATCH_LABEL) (VOID);\r
+\r
+/**\r
+  Retrieves CPUID information.\r
+\r
+  Executes the CPUID instruction with EAX set to the value specified by Index.\r
+  This function always returns Index.\r
+  If Eax is not NULL, then the value of EAX after CPUID is returned in Eax.\r
+  If Ebx is not NULL, then the value of EBX after CPUID is returned in Ebx.\r
+  If Ecx is not NULL, then the value of ECX after CPUID is returned in Ecx.\r
+  If Edx is not NULL, then the value of EDX after CPUID is returned in Edx.\r
+  This function is only available on IA-32 and x64.\r
+\r
+  @param  Index The 32-bit value to load into EAX prior to invoking the CPUID\r
+                instruction.\r
+  @param  Eax   The pointer to the 32-bit EAX value returned by the CPUID\r
+                instruction. This is an optional parameter that may be NULL.\r
+  @param  Ebx   The pointer to the 32-bit EBX value returned by the CPUID\r
+                instruction. This is an optional parameter that may be NULL.\r
+  @param  Ecx   The pointer to the 32-bit ECX value returned by the CPUID\r
+                instruction. This is an optional parameter that may be NULL.\r
+  @param  Edx   The pointer to the 32-bit EDX value returned by the CPUID\r
+                instruction. This is an optional parameter that may be NULL.\r
+\r
+  @return Index.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+AsmCpuid (\r
+  IN      UINT32                    Index,\r
+  OUT     UINT32                    *Eax,  OPTIONAL\r
+  OUT     UINT32                    *Ebx,  OPTIONAL\r
+  OUT     UINT32                    *Ecx,  OPTIONAL\r
+  OUT     UINT32                    *Edx   OPTIONAL\r
+  );\r
+\r
+\r
+/**\r
+  Retrieves CPUID information using an extended leaf identifier.\r
+\r
+  Executes the CPUID instruction with EAX set to the value specified by Index\r
+  and ECX set to the value specified by SubIndex. This function always returns\r
+  Index. This function is only available on IA-32 and x64.\r
+\r
+  If Eax is not NULL, then the value of EAX after CPUID is returned in Eax.\r
+  If Ebx is not NULL, then the value of EBX after CPUID is returned in Ebx.\r
+  If Ecx is not NULL, then the value of ECX after CPUID is returned in Ecx.\r
+  If Edx is not NULL, then the value of EDX after CPUID is returned in Edx.\r
+\r
+  @param  Index     The 32-bit value to load into EAX prior to invoking the\r
+                    CPUID instruction.\r
+  @param  SubIndex  The 32-bit value to load into ECX prior to invoking the\r
+                    CPUID instruction.\r
+  @param  Eax       The pointer to the 32-bit EAX value returned by the CPUID\r
+                    instruction. This is an optional parameter that may be\r
+                    NULL.\r
+  @param  Ebx       The pointer to the 32-bit EBX value returned by the CPUID\r
+                    instruction. This is an optional parameter that may be\r
+                    NULL.\r
+  @param  Ecx       The pointer to the 32-bit ECX value returned by the CPUID\r
+                    instruction. This is an optional parameter that may be\r
+                    NULL.\r
+  @param  Edx       The pointer to the 32-bit EDX value returned by the CPUID\r
+                    instruction. This is an optional parameter that may be\r
+                    NULL.\r
+\r
+  @return Index.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+AsmCpuidEx (\r
+  IN      UINT32                    Index,\r
+  IN      UINT32                    SubIndex,\r
+  OUT     UINT32                    *Eax,  OPTIONAL\r
+  OUT     UINT32                    *Ebx,  OPTIONAL\r
+  OUT     UINT32                    *Ecx,  OPTIONAL\r
+  OUT     UINT32                    *Edx   OPTIONAL\r
+  );\r
+\r
+\r
+/**\r
+  Set CD bit and clear NW bit of CR0 followed by a WBINVD.\r
+\r
+  Disables the caches by setting the CD bit of CR0 to 1, clearing the NW bit of CR0 to 0,\r
+  and executing a WBINVD instruction.  This function is only available on IA-32 and x64.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmDisableCache (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Perform a WBINVD and clear both the CD and NW bits of CR0.\r
+\r
+  Enables the caches by executing a WBINVD instruction and then clear both the CD and NW\r
+  bits of CR0 to 0.  This function is only available on IA-32 and x64.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmEnableCache (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Returns the lower 32-bits of a Machine Specific Register(MSR).\r
+\r
+  Reads and returns the lower 32-bits of the MSR specified by Index.\r
+  No parameter checking is performed on Index, and some Index values may cause\r
+  CPU exceptions. The caller must either guarantee that Index is valid, or the\r
+  caller must set up exception handlers to catch the exceptions. This function\r
+  is only available on IA-32 and x64.\r
+\r
+  @param  Index The 32-bit MSR index to read.\r
+\r
+  @return The lower 32 bits of the MSR identified by Index.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+AsmReadMsr32 (\r
+  IN      UINT32                    Index\r
+  );\r
+\r
+\r
+/**\r
+  Writes a 32-bit value to a Machine Specific Register(MSR), and returns the value.\r
+  The upper 32-bits of the MSR are set to zero.\r
+\r
+  Writes the 32-bit value specified by Value to the MSR specified by Index. The\r
+  upper 32-bits of the MSR write are set to zero. The 32-bit value written to\r
+  the MSR is returned. No parameter checking is performed on Index or Value,\r
+  and some of these may cause CPU exceptions. The caller must either guarantee\r
+  that Index and Value are valid, or the caller must establish proper exception\r
+  handlers. This function is only available on IA-32 and x64.\r
+\r
+  @param  Index The 32-bit MSR index to write.\r
+  @param  Value The 32-bit value to write to the MSR.\r
+\r
+  @return Value\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+AsmWriteMsr32 (\r
+  IN      UINT32                    Index,\r
+  IN      UINT32                    Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads a 64-bit MSR, performs a bitwise OR on the lower 32-bits, and\r
+  writes the result back to the 64-bit MSR.\r
+\r
+  Reads the 64-bit MSR specified by Index, performs a bitwise OR\r
+  between the lower 32-bits of the read result and the value specified by\r
+  OrData, and writes the result to the 64-bit MSR specified by Index. The lower\r
+  32-bits of the value written to the MSR is returned. No parameter checking is\r
+  performed on Index or OrData, and some of these may cause CPU exceptions. The\r
+  caller must either guarantee that Index and OrData are valid, or the caller\r
+  must establish proper exception handlers. This function is only available on\r
+  IA-32 and x64.\r
+\r
+  @param  Index   The 32-bit MSR index to write.\r
+  @param  OrData  The value to OR with the read value from the MSR.\r
+\r
+  @return The lower 32-bit value written to the MSR.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+AsmMsrOr32 (\r
+  IN      UINT32                    Index,\r
+  IN      UINT32                    OrData\r
+  );\r
+\r
+\r
+/**\r
+  Reads a 64-bit MSR, performs a bitwise AND on the lower 32-bits, and writes\r
+  the result back to the 64-bit MSR.\r
+\r
+  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the\r
+  lower 32-bits of the read result and the value specified by AndData, and\r
+  writes the result to the 64-bit MSR specified by Index. The lower 32-bits of\r
+  the value written to the MSR is returned. No parameter checking is performed\r
+  on Index or AndData, and some of these may cause CPU exceptions. The caller\r
+  must either guarantee that Index and AndData are valid, or the caller must\r
+  establish proper exception handlers. This function is only available on IA-32\r
+  and x64.\r
+\r
+  @param  Index   The 32-bit MSR index to write.\r
+  @param  AndData The value to AND with the read value from the MSR.\r
+\r
+  @return The lower 32-bit value written to the MSR.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+AsmMsrAnd32 (\r
+  IN      UINT32                    Index,\r
+  IN      UINT32                    AndData\r
+  );\r
+\r
+\r
+/**\r
+  Reads a 64-bit MSR, performs a bitwise AND followed by a bitwise OR\r
+  on the lower 32-bits, and writes the result back to the 64-bit MSR.\r
+\r
+  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the\r
+  lower 32-bits of the read result and the value specified by AndData\r
+  preserving the upper 32-bits, performs a bitwise OR between the\r
+  result of the AND operation and the value specified by OrData, and writes the\r
+  result to the 64-bit MSR specified by Address. The lower 32-bits of the value\r
+  written to the MSR is returned. No parameter checking is performed on Index,\r
+  AndData, or OrData, and some of these may cause CPU exceptions. The caller\r
+  must either guarantee that Index, AndData, and OrData are valid, or the\r
+  caller must establish proper exception handlers. This function is only\r
+  available on IA-32 and x64.\r
+\r
+  @param  Index   The 32-bit MSR index to write.\r
+  @param  AndData The value to AND with the read value from the MSR.\r
+  @param  OrData  The value to OR with the result of the AND operation.\r
+\r
+  @return The lower 32-bit value written to the MSR.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+AsmMsrAndThenOr32 (\r
+  IN      UINT32                    Index,\r
+  IN      UINT32                    AndData,\r
+  IN      UINT32                    OrData\r
+  );\r
+\r
+\r
+/**\r
+  Reads a bit field of an MSR.\r
+\r
+  Reads the bit field in the lower 32-bits of a 64-bit MSR. The bit field is\r
+  specified by the StartBit and the EndBit. The value of the bit field is\r
+  returned. The caller must either guarantee that Index is valid, or the caller\r
+  must set up exception handlers to catch the exceptions. This function is only\r
+  available on IA-32 and x64.\r
+\r
+  If StartBit is greater than 31, then ASSERT().\r
+  If EndBit is greater than 31, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+\r
+  @param  Index     The 32-bit MSR index to read.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..31.\r
+\r
+  @return The bit field read from the MSR.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+AsmMsrBitFieldRead32 (\r
+  IN      UINT32                    Index,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit\r
+  );\r
+\r
+\r
+/**\r
+  Writes a bit field to an MSR.\r
+\r
+  Writes Value to a bit field in the lower 32-bits of a 64-bit MSR. The bit\r
+  field is specified by the StartBit and the EndBit. All other bits in the\r
+  destination MSR are preserved. The lower 32-bits of the MSR written is\r
+  returned. The caller must either guarantee that Index and the data written\r
+  is valid, or the caller must set up exception handlers to catch the exceptions.\r
+  This function is only available on IA-32 and x64.\r
+\r
+  If StartBit is greater than 31, then ASSERT().\r
+  If EndBit is greater than 31, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Index     The 32-bit MSR index to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  Value     New value of the bit field.\r
+\r
+  @return The lower 32-bit of the value written to the MSR.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+AsmMsrBitFieldWrite32 (\r
+  IN      UINT32                    Index,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT32                    Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads a bit field in a 64-bit MSR, performs a bitwise OR, and writes the\r
+  result back to the bit field in the 64-bit MSR.\r
+\r
+  Reads the 64-bit MSR specified by Index, performs a bitwise OR\r
+  between the read result and the value specified by OrData, and writes the\r
+  result to the 64-bit MSR specified by Index. The lower 32-bits of the value\r
+  written to the MSR are returned. Extra left bits in OrData are stripped. The\r
+  caller must either guarantee that Index and the data written is valid, or\r
+  the caller must set up exception handlers to catch the exceptions. This\r
+  function is only available on IA-32 and x64.\r
+\r
+  If StartBit is greater than 31, then ASSERT().\r
+  If EndBit is greater than 31, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Index     The 32-bit MSR index to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  OrData    The value to OR with the read value from the MSR.\r
+\r
+  @return The lower 32-bit of the value written to the MSR.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+AsmMsrBitFieldOr32 (\r
+  IN      UINT32                    Index,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT32                    OrData\r
+  );\r
+\r
+\r
+/**\r
+  Reads a bit field in a 64-bit MSR, performs a bitwise AND, and writes the\r
+  result back to the bit field in the 64-bit MSR.\r
+\r
+  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the\r
+  read result and the value specified by AndData, and writes the result to the\r
+  64-bit MSR specified by Index. The lower 32-bits of the value written to the\r
+  MSR are returned. Extra left bits in AndData are stripped. The caller must\r
+  either guarantee that Index and the data written is valid, or the caller must\r
+  set up exception handlers to catch the exceptions. This function is only\r
+  available on IA-32 and x64.\r
+\r
+  If StartBit is greater than 31, then ASSERT().\r
+  If EndBit is greater than 31, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Index     The 32-bit MSR index to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  AndData   The value to AND with the read value from the MSR.\r
+\r
+  @return The lower 32-bit of the value written to the MSR.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+AsmMsrBitFieldAnd32 (\r
+  IN      UINT32                    Index,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT32                    AndData\r
+  );\r
+\r
+\r
+/**\r
+  Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a\r
+  bitwise OR, and writes the result back to the bit field in the\r
+  64-bit MSR.\r
+\r
+  Reads the 64-bit MSR specified by Index, performs a bitwise AND followed by a\r
+  bitwise OR between the read result and the value specified by\r
+  AndData, and writes the result to the 64-bit MSR specified by Index. The\r
+  lower 32-bits of the value written to the MSR are returned. Extra left bits\r
+  in both AndData and OrData are stripped. The caller must either guarantee\r
+  that Index and the data written is valid, or the caller must set up exception\r
+  handlers to catch the exceptions. This function is only available on IA-32\r
+  and x64.\r
+\r
+  If StartBit is greater than 31, then ASSERT().\r
+  If EndBit is greater than 31, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+  If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Index     The 32-bit MSR index to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..31.\r
+  @param  AndData   The value to AND with the read value from the MSR.\r
+  @param  OrData    The value to OR with the result of the AND operation.\r
+\r
+  @return The lower 32-bit of the value written to the MSR.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+AsmMsrBitFieldAndThenOr32 (\r
+  IN      UINT32                    Index,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT32                    AndData,\r
+  IN      UINT32                    OrData\r
+  );\r
+\r
+\r
+/**\r
+  Returns a 64-bit Machine Specific Register(MSR).\r
+\r
+  Reads and returns the 64-bit MSR specified by Index. No parameter checking is\r
+  performed on Index, and some Index values may cause CPU exceptions. The\r
+  caller must either guarantee that Index is valid, or the caller must set up\r
+  exception handlers to catch the exceptions. This function is only available\r
+  on IA-32 and x64.\r
+\r
+  @param  Index The 32-bit MSR index to read.\r
+\r
+  @return The value of the MSR identified by Index.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadMsr64 (\r
+  IN      UINT32                    Index\r
+  );\r
+\r
+\r
+/**\r
+  Writes a 64-bit value to a Machine Specific Register(MSR), and returns the\r
+  value.\r
+\r
+  Writes the 64-bit value specified by Value to the MSR specified by Index. The\r
+  64-bit value written to the MSR is returned. No parameter checking is\r
+  performed on Index or Value, and some of these may cause CPU exceptions. The\r
+  caller must either guarantee that Index and Value are valid, or the caller\r
+  must establish proper exception handlers. This function is only available on\r
+  IA-32 and x64.\r
+\r
+  @param  Index The 32-bit MSR index to write.\r
+  @param  Value The 64-bit value to write to the MSR.\r
+\r
+  @return Value\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteMsr64 (\r
+  IN      UINT32                    Index,\r
+  IN      UINT64                    Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads a 64-bit MSR, performs a bitwise OR, and writes the result\r
+  back to the 64-bit MSR.\r
+\r
+  Reads the 64-bit MSR specified by Index, performs a bitwise OR\r
+  between the read result and the value specified by OrData, and writes the\r
+  result to the 64-bit MSR specified by Index. The value written to the MSR is\r
+  returned. No parameter checking is performed on Index or OrData, and some of\r
+  these may cause CPU exceptions. The caller must either guarantee that Index\r
+  and OrData are valid, or the caller must establish proper exception handlers.\r
+  This function is only available on IA-32 and x64.\r
+\r
+  @param  Index   The 32-bit MSR index to write.\r
+  @param  OrData  The value to OR with the read value from the MSR.\r
+\r
+  @return The value written back to the MSR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmMsrOr64 (\r
+  IN      UINT32                    Index,\r
+  IN      UINT64                    OrData\r
+  );\r
+\r
+\r
+/**\r
+  Reads a 64-bit MSR, performs a bitwise AND, and writes the result back to the\r
+  64-bit MSR.\r
+\r
+  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the\r
+  read result and the value specified by OrData, and writes the result to the\r
+  64-bit MSR specified by Index. The value written to the MSR is returned. No\r
+  parameter checking is performed on Index or OrData, and some of these may\r
+  cause CPU exceptions. The caller must either guarantee that Index and OrData\r
+  are valid, or the caller must establish proper exception handlers. This\r
+  function is only available on IA-32 and x64.\r
+\r
+  @param  Index   The 32-bit MSR index to write.\r
+  @param  AndData The value to AND with the read value from the MSR.\r
+\r
+  @return The value written back to the MSR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmMsrAnd64 (\r
+  IN      UINT32                    Index,\r
+  IN      UINT64                    AndData\r
+  );\r
+\r
+\r
+/**\r
+  Reads a 64-bit MSR, performs a bitwise AND followed by a bitwise\r
+  OR, and writes the result back to the 64-bit MSR.\r
+\r
+  Reads the 64-bit MSR specified by Index, performs a bitwise AND between read\r
+  result and the value specified by AndData, performs a bitwise OR\r
+  between the result of the AND operation and the value specified by OrData,\r
+  and writes the result to the 64-bit MSR specified by Index. The value written\r
+  to the MSR is returned. No parameter checking is performed on Index, AndData,\r
+  or OrData, and some of these may cause CPU exceptions. The caller must either\r
+  guarantee that Index, AndData, and OrData are valid, or the caller must\r
+  establish proper exception handlers. This function is only available on IA-32\r
+  and x64.\r
+\r
+  @param  Index   The 32-bit MSR index to write.\r
+  @param  AndData The value to AND with the read value from the MSR.\r
+  @param  OrData  The value to OR with the result of the AND operation.\r
+\r
+  @return The value written back to the MSR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmMsrAndThenOr64 (\r
+  IN      UINT32                    Index,\r
+  IN      UINT64                    AndData,\r
+  IN      UINT64                    OrData\r
+  );\r
+\r
+\r
+/**\r
+  Reads a bit field of an MSR.\r
+\r
+  Reads the bit field in the 64-bit MSR. The bit field is specified by the\r
+  StartBit and the EndBit. The value of the bit field is returned. The caller\r
+  must either guarantee that Index is valid, or the caller must set up\r
+  exception handlers to catch the exceptions. This function is only available\r
+  on IA-32 and x64.\r
+\r
+  If StartBit is greater than 63, then ASSERT().\r
+  If EndBit is greater than 63, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+\r
+  @param  Index     The 32-bit MSR index to read.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..63.\r
+\r
+  @return The value read from the MSR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmMsrBitFieldRead64 (\r
+  IN      UINT32                    Index,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit\r
+  );\r
+\r
+\r
+/**\r
+  Writes a bit field to an MSR.\r
+\r
+  Writes Value to a bit field in a 64-bit MSR. The bit field is specified by\r
+  the StartBit and the EndBit. All other bits in the destination MSR are\r
+  preserved. The MSR written is returned. The caller must either guarantee\r
+  that Index and the data written is valid, or the caller must set up exception\r
+  handlers to catch the exceptions. This function is only available on IA-32 and x64.\r
+\r
+  If StartBit is greater than 63, then ASSERT().\r
+  If EndBit is greater than 63, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If Value is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Index     The 32-bit MSR index to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  Value     New value of the bit field.\r
+\r
+  @return The value written back to the MSR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmMsrBitFieldWrite64 (\r
+  IN      UINT32                    Index,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT64                    Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads a bit field in a 64-bit MSR, performs a bitwise OR, and\r
+  writes the result back to the bit field in the 64-bit MSR.\r
+\r
+  Reads the 64-bit MSR specified by Index, performs a bitwise OR\r
+  between the read result and the value specified by OrData, and writes the\r
+  result to the 64-bit MSR specified by Index. The value written to the MSR is\r
+  returned. Extra left bits in OrData are stripped. The caller must either\r
+  guarantee that Index and the data written is valid, or the caller must set up\r
+  exception handlers to catch the exceptions. This function is only available\r
+  on IA-32 and x64.\r
+\r
+  If StartBit is greater than 63, then ASSERT().\r
+  If EndBit is greater than 63, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Index     The 32-bit MSR index to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  OrData    The value to OR with the read value from the bit field.\r
+\r
+  @return The value written back to the MSR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmMsrBitFieldOr64 (\r
+  IN      UINT32                    Index,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT64                    OrData\r
+  );\r
+\r
+\r
+/**\r
+  Reads a bit field in a 64-bit MSR, performs a bitwise AND, and writes the\r
+  result back to the bit field in the 64-bit MSR.\r
+\r
+  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the\r
+  read result and the value specified by AndData, and writes the result to the\r
+  64-bit MSR specified by Index. The value written to the MSR is returned.\r
+  Extra left bits in AndData are stripped. The caller must either guarantee\r
+  that Index and the data written is valid, or the caller must set up exception\r
+  handlers to catch the exceptions. This function is only available on IA-32\r
+  and x64.\r
+\r
+  If StartBit is greater than 63, then ASSERT().\r
+  If EndBit is greater than 63, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Index     The 32-bit MSR index to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  AndData   The value to AND with the read value from the bit field.\r
+\r
+  @return The value written back to the MSR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmMsrBitFieldAnd64 (\r
+  IN      UINT32                    Index,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT64                    AndData\r
+  );\r
+\r
+\r
+/**\r
+  Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a\r
+  bitwise OR, and writes the result back to the bit field in the\r
+  64-bit MSR.\r
+\r
+  Reads the 64-bit MSR specified by Index, performs a bitwise AND followed by\r
+  a bitwise OR between the read result and the value specified by\r
+  AndData, and writes the result to the 64-bit MSR specified by Index. The\r
+  value written to the MSR is returned. Extra left bits in both AndData and\r
+  OrData are stripped. The caller must either guarantee that Index and the data\r
+  written is valid, or the caller must set up exception handlers to catch the\r
+  exceptions. This function is only available on IA-32 and x64.\r
+\r
+  If StartBit is greater than 63, then ASSERT().\r
+  If EndBit is greater than 63, then ASSERT().\r
+  If EndBit is less than StartBit, then ASSERT().\r
+  If AndData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+  If OrData is larger than the bitmask value range specified by StartBit and EndBit, then ASSERT().\r
+\r
+  @param  Index     The 32-bit MSR index to write.\r
+  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
+                    Range 0..63.\r
+  @param  AndData   The value to AND with the read value from the bit field.\r
+  @param  OrData    The value to OR with the result of the AND operation.\r
+\r
+  @return The value written back to the MSR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmMsrBitFieldAndThenOr64 (\r
+  IN      UINT32                    Index,\r
+  IN      UINTN                     StartBit,\r
+  IN      UINTN                     EndBit,\r
+  IN      UINT64                    AndData,\r
+  IN      UINT64                    OrData\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of the EFLAGS register.\r
+\r
+  Reads and returns the current value of the EFLAGS register. This function is\r
+  only available on IA-32 and x64. This returns a 32-bit value on IA-32 and a\r
+  64-bit value on x64.\r
+\r
+  @return EFLAGS on IA-32 or RFLAGS on x64.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmReadEflags (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of the Control Register 0 (CR0).\r
+\r
+  Reads and returns the current value of CR0. This function is only available\r
+  on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
+  x64.\r
+\r
+  @return The value of the Control Register 0 (CR0).\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmReadCr0 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of the Control Register 2 (CR2).\r
+\r
+  Reads and returns the current value of CR2. This function is only available\r
+  on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
+  x64.\r
+\r
+  @return The value of the Control Register 2 (CR2).\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmReadCr2 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of the Control Register 3 (CR3).\r
+\r
+  Reads and returns the current value of CR3. This function is only available\r
+  on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
+  x64.\r
+\r
+  @return The value of the Control Register 3 (CR3).\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmReadCr3 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of the Control Register 4 (CR4).\r
+\r
+  Reads and returns the current value of CR4. This function is only available\r
+  on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
+  x64.\r
+\r
+  @return The value of the Control Register 4 (CR4).\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmReadCr4 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Writes a value to Control Register 0 (CR0).\r
+\r
+  Writes and returns a new value to CR0. This function is only available on\r
+  IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.\r
+\r
+  @param  Cr0 The value to write to CR0.\r
+\r
+  @return The value written to CR0.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmWriteCr0 (\r
+  UINTN  Cr0\r
+  );\r
+\r
+\r
+/**\r
+  Writes a value to Control Register 2 (CR2).\r
+\r
+  Writes and returns a new value to CR2. This function is only available on\r
+  IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.\r
+\r
+  @param  Cr2 The value to write to CR2.\r
+\r
+  @return The value written to CR2.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmWriteCr2 (\r
+  UINTN  Cr2\r
+  );\r
+\r
+\r
+/**\r
+  Writes a value to Control Register 3 (CR3).\r
+\r
+  Writes and returns a new value to CR3. This function is only available on\r
+  IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.\r
+\r
+  @param  Cr3 The value to write to CR3.\r
+\r
+  @return The value written to CR3.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmWriteCr3 (\r
+  UINTN  Cr3\r
+  );\r
+\r
+\r
+/**\r
+  Writes a value to Control Register 4 (CR4).\r
+\r
+  Writes and returns a new value to CR4. This function is only available on\r
+  IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.\r
+\r
+  @param  Cr4 The value to write to CR4.\r
+\r
+  @return The value written to CR4.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmWriteCr4 (\r
+  UINTN  Cr4\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Debug Register 0 (DR0).\r
+\r
+  Reads and returns the current value of DR0. This function is only available\r
+  on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
+  x64.\r
+\r
+  @return The value of Debug Register 0 (DR0).\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmReadDr0 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Debug Register 1 (DR1).\r
+\r
+  Reads and returns the current value of DR1. This function is only available\r
+  on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
+  x64.\r
+\r
+  @return The value of Debug Register 1 (DR1).\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmReadDr1 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Debug Register 2 (DR2).\r
+\r
+  Reads and returns the current value of DR2. This function is only available\r
+  on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
+  x64.\r
+\r
+  @return The value of Debug Register 2 (DR2).\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmReadDr2 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Debug Register 3 (DR3).\r
+\r
+  Reads and returns the current value of DR3. This function is only available\r
+  on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
+  x64.\r
+\r
+  @return The value of Debug Register 3 (DR3).\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmReadDr3 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Debug Register 4 (DR4).\r
+\r
+  Reads and returns the current value of DR4. This function is only available\r
+  on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
+  x64.\r
+\r
+  @return The value of Debug Register 4 (DR4).\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmReadDr4 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Debug Register 5 (DR5).\r
+\r
+  Reads and returns the current value of DR5. This function is only available\r
+  on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
+  x64.\r
+\r
+  @return The value of Debug Register 5 (DR5).\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmReadDr5 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Debug Register 6 (DR6).\r
+\r
+  Reads and returns the current value of DR6. This function is only available\r
+  on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
+  x64.\r
+\r
+  @return The value of Debug Register 6 (DR6).\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmReadDr6 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Debug Register 7 (DR7).\r
+\r
+  Reads and returns the current value of DR7. This function is only available\r
+  on IA-32 and x64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
+  x64.\r
+\r
+  @return The value of Debug Register 7 (DR7).\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmReadDr7 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Writes a value to Debug Register 0 (DR0).\r
+\r
+  Writes and returns a new value to DR0. This function is only available on\r
+  IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.\r
+\r
+  @param  Dr0 The value to write to Dr0.\r
+\r
+  @return The value written to Debug Register 0 (DR0).\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmWriteDr0 (\r
+  UINTN  Dr0\r
+  );\r
+\r
+\r
+/**\r
+  Writes a value to Debug Register 1 (DR1).\r
+\r
+  Writes and returns a new value to DR1. This function is only available on\r
+  IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.\r
+\r
+  @param  Dr1 The value to write to Dr1.\r
+\r
+  @return The value written to Debug Register 1 (DR1).\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmWriteDr1 (\r
+  UINTN  Dr1\r
+  );\r
+\r
+\r
+/**\r
+  Writes a value to Debug Register 2 (DR2).\r
+\r
+  Writes and returns a new value to DR2. This function is only available on\r
+  IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.\r
+\r
+  @param  Dr2 The value to write to Dr2.\r
+\r
+  @return The value written to Debug Register 2 (DR2).\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmWriteDr2 (\r
+  UINTN  Dr2\r
+  );\r
+\r
+\r
+/**\r
+  Writes a value to Debug Register 3 (DR3).\r
+\r
+  Writes and returns a new value to DR3. This function is only available on\r
+  IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.\r
+\r
+  @param  Dr3 The value to write to Dr3.\r
+\r
+  @return The value written to Debug Register 3 (DR3).\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmWriteDr3 (\r
+  UINTN  Dr3\r
+  );\r
+\r
+\r
+/**\r
+  Writes a value to Debug Register 4 (DR4).\r
+\r
+  Writes and returns a new value to DR4. This function is only available on\r
+  IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.\r
+\r
+  @param  Dr4 The value to write to Dr4.\r
+\r
+  @return The value written to Debug Register 4 (DR4).\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmWriteDr4 (\r
+  UINTN  Dr4\r
+  );\r
+\r
+\r
+/**\r
+  Writes a value to Debug Register 5 (DR5).\r
+\r
+  Writes and returns a new value to DR5. This function is only available on\r
+  IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.\r
+\r
+  @param  Dr5 The value to write to Dr5.\r
+\r
+  @return The value written to Debug Register 5 (DR5).\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmWriteDr5 (\r
+  UINTN  Dr5\r
+  );\r
+\r
+\r
+/**\r
+  Writes a value to Debug Register 6 (DR6).\r
+\r
+  Writes and returns a new value to DR6. This function is only available on\r
+  IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.\r
+\r
+  @param  Dr6 The value to write to Dr6.\r
+\r
+  @return The value written to Debug Register 6 (DR6).\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmWriteDr6 (\r
+  UINTN  Dr6\r
+  );\r
+\r
+\r
+/**\r
+  Writes a value to Debug Register 7 (DR7).\r
+\r
+  Writes and returns a new value to DR7. This function is only available on\r
+  IA-32 and x64. This writes a 32-bit value on IA-32 and a 64-bit value on x64.\r
+\r
+  @param  Dr7 The value to write to Dr7.\r
+\r
+  @return The value written to Debug Register 7 (DR7).\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmWriteDr7 (\r
+  UINTN  Dr7\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Code Segment Register (CS).\r
+\r
+  Reads and returns the current value of CS. This function is only available on\r
+  IA-32 and x64.\r
+\r
+  @return The current value of CS.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+AsmReadCs (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Data Segment Register (DS).\r
+\r
+  Reads and returns the current value of DS. This function is only available on\r
+  IA-32 and x64.\r
+\r
+  @return The current value of DS.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+AsmReadDs (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Extra Segment Register (ES).\r
+\r
+  Reads and returns the current value of ES. This function is only available on\r
+  IA-32 and x64.\r
+\r
+  @return The current value of ES.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+AsmReadEs (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of FS Data Segment Register (FS).\r
+\r
+  Reads and returns the current value of FS. This function is only available on\r
+  IA-32 and x64.\r
+\r
+  @return The current value of FS.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+AsmReadFs (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of GS Data Segment Register (GS).\r
+\r
+  Reads and returns the current value of GS. This function is only available on\r
+  IA-32 and x64.\r
+\r
+  @return The current value of GS.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+AsmReadGs (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Stack Segment Register (SS).\r
+\r
+  Reads and returns the current value of SS. This function is only available on\r
+  IA-32 and x64.\r
+\r
+  @return The current value of SS.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+AsmReadSs (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Task Register (TR).\r
+\r
+  Reads and returns the current value of TR. This function is only available on\r
+  IA-32 and x64.\r
+\r
+  @return The current value of TR.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+AsmReadTr (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current Global Descriptor Table Register(GDTR) descriptor.\r
+\r
+  Reads and returns the current GDTR descriptor and returns it in Gdtr. This\r
+  function is only available on IA-32 and x64.\r
+\r
+  If Gdtr is NULL, then ASSERT().\r
+\r
+  @param  Gdtr  The pointer to a GDTR descriptor.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmReadGdtr (\r
+  OUT     IA32_DESCRIPTOR           *Gdtr\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current Global Descriptor Table Register (GDTR) descriptor.\r
+\r
+  Writes and the current GDTR descriptor specified by Gdtr. This function is\r
+  only available on IA-32 and x64.\r
+\r
+  If Gdtr is NULL, then ASSERT().\r
+\r
+  @param  Gdtr  The pointer to a GDTR descriptor.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmWriteGdtr (\r
+  IN      CONST IA32_DESCRIPTOR     *Gdtr\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current Interrupt Descriptor Table Register(IDTR) descriptor.\r
+\r
+  Reads and returns the current IDTR descriptor and returns it in Idtr. This\r
+  function is only available on IA-32 and x64.\r
+\r
+  If Idtr is NULL, then ASSERT().\r
+\r
+  @param  Idtr  The pointer to a IDTR descriptor.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmReadIdtr (\r
+  OUT     IA32_DESCRIPTOR           *Idtr\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current Interrupt Descriptor Table Register(IDTR) descriptor.\r
+\r
+  Writes the current IDTR descriptor and returns it in Idtr. This function is\r
+  only available on IA-32 and x64.\r
+\r
+  If Idtr is NULL, then ASSERT().\r
+\r
+  @param  Idtr  The pointer to a IDTR descriptor.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmWriteIdtr (\r
+  IN      CONST IA32_DESCRIPTOR     *Idtr\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current Local Descriptor Table Register(LDTR) selector.\r
+\r
+  Reads and returns the current 16-bit LDTR descriptor value. This function is\r
+  only available on IA-32 and x64.\r
+\r
+  @return The current selector of LDT.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+AsmReadLdtr (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current Local Descriptor Table Register (LDTR) selector.\r
+\r
+  Writes and the current LDTR descriptor specified by Ldtr. This function is\r
+  only available on IA-32 and x64.\r
+\r
+  @param  Ldtr  16-bit LDTR selector value.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmWriteLdtr (\r
+  IN      UINT16                    Ldtr\r
+  );\r
+\r
+\r
+/**\r
+  Save the current floating point/SSE/SSE2 context to a buffer.\r
+\r
+  Saves the current floating point/SSE/SSE2 state to the buffer specified by\r
+  Buffer. Buffer must be aligned on a 16-byte boundary. This function is only\r
+  available on IA-32 and x64.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 16-byte boundary, then ASSERT().\r
+\r
+  @param  Buffer  The pointer to a buffer to save the floating point/SSE/SSE2 context.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmFxSave (\r
+  OUT     IA32_FX_BUFFER            *Buffer\r
+  );\r
+\r
+\r
+/**\r
+  Restores the current floating point/SSE/SSE2 context from a buffer.\r
+\r
+  Restores the current floating point/SSE/SSE2 state from the buffer specified\r
+  by Buffer. Buffer must be aligned on a 16-byte boundary. This function is\r
+  only available on IA-32 and x64.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 16-byte boundary, then ASSERT().\r
+  If Buffer was not saved with AsmFxSave(), then ASSERT().\r
+\r
+  @param  Buffer  The pointer to a buffer to save the floating point/SSE/SSE2 context.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmFxRestore (\r
+  IN      CONST IA32_FX_BUFFER      *Buffer\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit MMX Register #0 (MM0).\r
+\r
+  Reads and returns the current value of MM0. This function is only available\r
+  on IA-32 and x64.\r
+\r
+  @return The current value of MM0.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadMm0 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit MMX Register #1 (MM1).\r
+\r
+  Reads and returns the current value of MM1. This function is only available\r
+  on IA-32 and x64.\r
+\r
+  @return The current value of MM1.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadMm1 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit MMX Register #2 (MM2).\r
+\r
+  Reads and returns the current value of MM2. This function is only available\r
+  on IA-32 and x64.\r
+\r
+  @return The current value of MM2.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadMm2 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit MMX Register #3 (MM3).\r
+\r
+  Reads and returns the current value of MM3. This function is only available\r
+  on IA-32 and x64.\r
+\r
+  @return The current value of MM3.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadMm3 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit MMX Register #4 (MM4).\r
+\r
+  Reads and returns the current value of MM4. This function is only available\r
+  on IA-32 and x64.\r
+\r
+  @return The current value of MM4.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadMm4 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit MMX Register #5 (MM5).\r
+\r
+  Reads and returns the current value of MM5. This function is only available\r
+  on IA-32 and x64.\r
+\r
+  @return The current value of MM5.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadMm5 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit MMX Register #6 (MM6).\r
+\r
+  Reads and returns the current value of MM6. This function is only available\r
+  on IA-32 and x64.\r
+\r
+  @return The current value of MM6.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadMm6 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit MMX Register #7 (MM7).\r
+\r
+  Reads and returns the current value of MM7. This function is only available\r
+  on IA-32 and x64.\r
+\r
+  @return The current value of MM7.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadMm7 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit MMX Register #0 (MM0).\r
+\r
+  Writes the current value of MM0. This function is only available on IA32 and\r
+  x64.\r
+\r
+  @param  Value The 64-bit value to write to MM0.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmWriteMm0 (\r
+  IN      UINT64                    Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit MMX Register #1 (MM1).\r
+\r
+  Writes the current value of MM1. This function is only available on IA32 and\r
+  x64.\r
+\r
+  @param  Value The 64-bit value to write to MM1.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmWriteMm1 (\r
+  IN      UINT64                    Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit MMX Register #2 (MM2).\r
+\r
+  Writes the current value of MM2. This function is only available on IA32 and\r
+  x64.\r
+\r
+  @param  Value The 64-bit value to write to MM2.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmWriteMm2 (\r
+  IN      UINT64                    Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit MMX Register #3 (MM3).\r
+\r
+  Writes the current value of MM3. This function is only available on IA32 and\r
+  x64.\r
+\r
+  @param  Value The 64-bit value to write to MM3.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmWriteMm3 (\r
+  IN      UINT64                    Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit MMX Register #4 (MM4).\r
+\r
+  Writes the current value of MM4. This function is only available on IA32 and\r
+  x64.\r
+\r
+  @param  Value The 64-bit value to write to MM4.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmWriteMm4 (\r
+  IN      UINT64                    Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit MMX Register #5 (MM5).\r
+\r
+  Writes the current value of MM5. This function is only available on IA32 and\r
+  x64.\r
+\r
+  @param  Value The 64-bit value to write to MM5.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmWriteMm5 (\r
+  IN      UINT64                    Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit MMX Register #6 (MM6).\r
+\r
+  Writes the current value of MM6. This function is only available on IA32 and\r
+  x64.\r
+\r
+  @param  Value The 64-bit value to write to MM6.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmWriteMm6 (\r
+  IN      UINT64                    Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit MMX Register #7 (MM7).\r
+\r
+  Writes the current value of MM7. This function is only available on IA32 and\r
+  x64.\r
+\r
+  @param  Value The 64-bit value to write to MM7.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmWriteMm7 (\r
+  IN      UINT64                    Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Time Stamp Counter (TSC).\r
+\r
+  Reads and returns the current value of TSC. This function is only available\r
+  on IA-32 and x64.\r
+\r
+  @return The current value of TSC\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadTsc (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of a Performance Counter (PMC).\r
+\r
+  Reads and returns the current value of performance counter specified by\r
+  Index. This function is only available on IA-32 and x64.\r
+\r
+  @param  Index The 32-bit Performance Counter index to read.\r
+\r
+  @return The value of the PMC specified by Index.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadPmc (\r
+  IN      UINT32                    Index\r
+  );\r
+\r
+\r
+/**\r
+  Sets up a monitor buffer that is used by AsmMwait().\r
+\r
+  Executes a MONITOR instruction with the register state specified by Eax, Ecx\r
+  and Edx. Returns Eax. This function is only available on IA-32 and x64.\r
+\r
+  @param  Eax The value to load into EAX or RAX before executing the MONITOR\r
+              instruction.\r
+  @param  Ecx The value to load into ECX or RCX before executing the MONITOR\r
+              instruction.\r
+  @param  Edx The value to load into EDX or RDX before executing the MONITOR\r
+              instruction.\r
+\r
+  @return Eax\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmMonitor (\r
+  IN      UINTN                     Eax,\r
+  IN      UINTN                     Ecx,\r
+  IN      UINTN                     Edx\r
+  );\r
+\r
+\r
+/**\r
+  Executes an MWAIT instruction.\r
+\r
+  Executes an MWAIT instruction with the register state specified by Eax and\r
+  Ecx. Returns Eax. This function is only available on IA-32 and x64.\r
+\r
+  @param  Eax The value to load into EAX or RAX before executing the MONITOR\r
+              instruction.\r
+  @param  Ecx The value to load into ECX or RCX before executing the MONITOR\r
+              instruction.\r
+\r
+  @return Eax\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsmMwait (\r
+  IN      UINTN                     Eax,\r
+  IN      UINTN                     Ecx\r
+  );\r
+\r
+\r
+/**\r
+  Executes a WBINVD instruction.\r
+\r
+  Executes a WBINVD instruction. This function is only available on IA-32 and\r
+  x64.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmWbinvd (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Executes a INVD instruction.\r
+\r
+  Executes a INVD instruction. This function is only available on IA-32 and\r
+  x64.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmInvd (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Flushes a cache line from all the instruction and data caches within the\r
+  coherency domain of the CPU.\r
+\r
+  Flushed the cache line specified by LinearAddress, and returns LinearAddress.\r
+  This function is only available on IA-32 and x64.\r
+\r
+  @param  LinearAddress The address of the cache line to flush. If the CPU is\r
+                        in a physical addressing mode, then LinearAddress is a\r
+                        physical address. If the CPU is in a virtual\r
+                        addressing mode, then LinearAddress is a virtual\r
+                        address.\r
+\r
+  @return LinearAddress.\r
+**/\r
+VOID *\r
+EFIAPI\r
+AsmFlushCacheLine (\r
+  IN      VOID                      *LinearAddress\r
+  );\r
+\r
+\r
+/**\r
+  Enables the 32-bit paging mode on the CPU.\r
+\r
+  Enables the 32-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables\r
+  must be properly initialized prior to calling this service. This function\r
+  assumes the current execution mode is 32-bit protected mode. This function is\r
+  only available on IA-32. After the 32-bit paging mode is enabled, control is\r
+  transferred to the function specified by EntryPoint using the new stack\r
+  specified by NewStack and passing in the parameters specified by Context1 and\r
+  Context2. Context1 and Context2 are optional and may be NULL. The function\r
+  EntryPoint must never return.\r
+\r
+  If the current execution mode is not 32-bit protected mode, then ASSERT().\r
+  If EntryPoint is NULL, then ASSERT().\r
+  If NewStack is NULL, then ASSERT().\r
+\r
+  There are a number of constraints that must be followed before calling this\r
+  function:\r
+  1)  Interrupts must be disabled.\r
+  2)  The caller must be in 32-bit protected mode with flat descriptors. This\r
+      means all descriptors must have a base of 0 and a limit of 4GB.\r
+  3)  CR0 and CR4 must be compatible with 32-bit protected mode with flat\r
+      descriptors.\r
+  4)  CR3 must point to valid page tables that will be used once the transition\r
+      is complete, and those page tables must guarantee that the pages for this\r
+      function and the stack are identity mapped.\r
+\r
+  @param  EntryPoint  A pointer to function to call with the new stack after\r
+                      paging is enabled.\r
+  @param  Context1    A pointer to the context to pass into the EntryPoint\r
+                      function as the first parameter after paging is enabled.\r
+  @param  Context2    A pointer to the context to pass into the EntryPoint\r
+                      function as the second parameter after paging is enabled.\r
+  @param  NewStack    A pointer to the new stack to use for the EntryPoint\r
+                      function after paging is enabled.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmEnablePaging32 (\r
+  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
+  IN      VOID                      *Context1,  OPTIONAL\r
+  IN      VOID                      *Context2,  OPTIONAL\r
+  IN      VOID                      *NewStack\r
+  );\r
+\r
+\r
+/**\r
+  Disables the 32-bit paging mode on the CPU.\r
+\r
+  Disables the 32-bit paging mode on the CPU and returns to 32-bit protected\r
+  mode. This function assumes the current execution mode is 32-paged protected\r
+  mode. This function is only available on IA-32. After the 32-bit paging mode\r
+  is disabled, control is transferred to the function specified by EntryPoint\r
+  using the new stack specified by NewStack and passing in the parameters\r
+  specified by Context1 and Context2. Context1 and Context2 are optional and\r
+  may be NULL. The function EntryPoint must never return.\r
+\r
+  If the current execution mode is not 32-bit paged mode, then ASSERT().\r
+  If EntryPoint is NULL, then ASSERT().\r
+  If NewStack is NULL, then ASSERT().\r
+\r
+  There are a number of constraints that must be followed before calling this\r
+  function:\r
+  1)  Interrupts must be disabled.\r
+  2)  The caller must be in 32-bit paged mode.\r
+  3)  CR0, CR3, and CR4 must be compatible with 32-bit paged mode.\r
+  4)  CR3 must point to valid page tables that guarantee that the pages for\r
+      this function and the stack are identity mapped.\r
+\r
+  @param  EntryPoint  A pointer to function to call with the new stack after\r
+                      paging is disabled.\r
+  @param  Context1    A pointer to the context to pass into the EntryPoint\r
+                      function as the first parameter after paging is disabled.\r
+  @param  Context2    A pointer to the context to pass into the EntryPoint\r
+                      function as the second parameter after paging is\r
+                      disabled.\r
+  @param  NewStack    A pointer to the new stack to use for the EntryPoint\r
+                      function after paging is disabled.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmDisablePaging32 (\r
+  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
+  IN      VOID                      *Context1,  OPTIONAL\r
+  IN      VOID                      *Context2,  OPTIONAL\r
+  IN      VOID                      *NewStack\r
+  );\r
+\r
+\r
+/**\r
+  Enables the 64-bit paging mode on the CPU.\r
+\r
+  Enables the 64-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables\r
+  must be properly initialized prior to calling this service. This function\r
+  assumes the current execution mode is 32-bit protected mode with flat\r
+  descriptors. This function is only available on IA-32. After the 64-bit\r
+  paging mode is enabled, control is transferred to the function specified by\r
+  EntryPoint using the new stack specified by NewStack and passing in the\r
+  parameters specified by Context1 and Context2. Context1 and Context2 are\r
+  optional and may be 0. The function EntryPoint must never return.\r
+\r
+  If the current execution mode is not 32-bit protected mode with flat\r
+  descriptors, then ASSERT().\r
+  If EntryPoint is 0, then ASSERT().\r
+  If NewStack is 0, then ASSERT().\r
+\r
+  @param  Cs          The 16-bit selector to load in the CS before EntryPoint\r
+                      is called. The descriptor in the GDT that this selector\r
+                      references must be setup for long mode.\r
+  @param  EntryPoint  The 64-bit virtual address of the function to call with\r
+                      the new stack after paging is enabled.\r
+  @param  Context1    The 64-bit virtual address of the context to pass into\r
+                      the EntryPoint function as the first parameter after\r
+                      paging is enabled.\r
+  @param  Context2    The 64-bit virtual address of the context to pass into\r
+                      the EntryPoint function as the second parameter after\r
+                      paging is enabled.\r
+  @param  NewStack    The 64-bit virtual address of the new stack to use for\r
+                      the EntryPoint function after paging is enabled.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmEnablePaging64 (\r
+  IN      UINT16                    Cs,\r
+  IN      UINT64                    EntryPoint,\r
+  IN      UINT64                    Context1,  OPTIONAL\r
+  IN      UINT64                    Context2,  OPTIONAL\r
+  IN      UINT64                    NewStack\r
+  );\r
+\r
+\r
+/**\r
+  Disables the 64-bit paging mode on the CPU.\r
+\r
+  Disables the 64-bit paging mode on the CPU and returns to 32-bit protected\r
+  mode. This function assumes the current execution mode is 64-paging mode.\r
+  This function is only available on x64. After the 64-bit paging mode is\r
+  disabled, control is transferred to the function specified by EntryPoint\r
+  using the new stack specified by NewStack and passing in the parameters\r
+  specified by Context1 and Context2. Context1 and Context2 are optional and\r
+  may be 0. The function EntryPoint must never return.\r
+\r
+  If the current execution mode is not 64-bit paged mode, then ASSERT().\r
+  If EntryPoint is 0, then ASSERT().\r
+  If NewStack is 0, then ASSERT().\r
+\r
+  @param  Cs          The 16-bit selector to load in the CS before EntryPoint\r
+                      is called. The descriptor in the GDT that this selector\r
+                      references must be setup for 32-bit protected mode.\r
+  @param  EntryPoint  The 64-bit virtual address of the function to call with\r
+                      the new stack after paging is disabled.\r
+  @param  Context1    The 64-bit virtual address of the context to pass into\r
+                      the EntryPoint function as the first parameter after\r
+                      paging is disabled.\r
+  @param  Context2    The 64-bit virtual address of the context to pass into\r
+                      the EntryPoint function as the second parameter after\r
+                      paging is disabled.\r
+  @param  NewStack    The 64-bit virtual address of the new stack to use for\r
+                      the EntryPoint function after paging is disabled.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmDisablePaging64 (\r
+  IN      UINT16                    Cs,\r
+  IN      UINT32                    EntryPoint,\r
+  IN      UINT32                    Context1,  OPTIONAL\r
+  IN      UINT32                    Context2,  OPTIONAL\r
+  IN      UINT32                    NewStack\r
+  );\r
+\r
+\r
+//\r
+// 16-bit thunking services\r
+//\r
+\r
+/**\r
+  Retrieves the properties for 16-bit thunk functions.\r
+\r
+  Computes the size of the buffer and stack below 1MB required to use the\r
+  AsmPrepareThunk16(), AsmThunk16() and AsmPrepareAndThunk16() functions. This\r
+  buffer size is returned in RealModeBufferSize, and the stack size is returned\r
+  in ExtraStackSize. If parameters are passed to the 16-bit real mode code,\r
+  then the actual minimum stack size is ExtraStackSize plus the maximum number\r
+  of bytes that need to be passed to the 16-bit real mode code.\r
+\r
+  If RealModeBufferSize is NULL, then ASSERT().\r
+  If ExtraStackSize is NULL, then ASSERT().\r
+\r
+  @param  RealModeBufferSize  A pointer to the size of the buffer below 1MB\r
+                              required to use the 16-bit thunk functions.\r
+  @param  ExtraStackSize      A pointer to the extra size of stack below 1MB\r
+                              that the 16-bit thunk functions require for\r
+                              temporary storage in the transition to and from\r
+                              16-bit real mode.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmGetThunk16Properties (\r
+  OUT     UINT32                    *RealModeBufferSize,\r
+  OUT     UINT32                    *ExtraStackSize\r
+  );\r
+\r
+\r
+/**\r
+  Prepares all structures a code required to use AsmThunk16().\r
+\r
+  Prepares all structures and code required to use AsmThunk16().\r
+\r
+  This interface is limited to be used in either physical mode or virtual modes with paging enabled where the\r
+  virtual to physical mappings for ThunkContext.RealModeBuffer is mapped 1:1.\r
+\r
+  If ThunkContext is NULL, then ASSERT().\r
+\r
+  @param  ThunkContext  A pointer to the context structure that describes the\r
+                        16-bit real mode code to call.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmPrepareThunk16 (\r
+  IN OUT  THUNK_CONTEXT             *ThunkContext\r
+  );\r
+\r
+\r
+/**\r
+  Transfers control to a 16-bit real mode entry point and returns the results.\r
+\r
+  Transfers control to a 16-bit real mode entry point and returns the results.\r
+  AsmPrepareThunk16() must be called with ThunkContext before this function is used.\r
+  This function must be called with interrupts disabled.\r
+\r
+  The register state from the RealModeState field of ThunkContext is restored just prior\r
+  to calling the 16-bit real mode entry point.  This includes the EFLAGS field of RealModeState,\r
+  which is used to set the interrupt state when a 16-bit real mode entry point is called.\r
+  Control is transferred to the 16-bit real mode entry point specified by the CS and Eip fields of RealModeState.\r
+  The stack is initialized to the SS and ESP fields of RealModeState.  Any parameters passed to\r
+  the 16-bit real mode code must be populated by the caller at SS:ESP prior to calling this function.\r
+  The 16-bit real mode entry point is invoked with a 16-bit CALL FAR instruction,\r
+  so when accessing stack contents, the 16-bit real mode code must account for the 16-bit segment\r
+  and 16-bit offset of the return address that were pushed onto the stack. The 16-bit real mode entry\r
+  point must exit with a RETF instruction. The register state is captured into RealModeState immediately\r
+  after the RETF instruction is executed.\r
+\r
+  If EFLAGS specifies interrupts enabled, or any of the 16-bit real mode code enables interrupts,\r
+  or any of the 16-bit real mode code makes a SW interrupt, then the caller is responsible for making sure\r
+  the IDT at address 0 is initialized to handle any HW or SW interrupts that may occur while in 16-bit real mode.\r
+\r
+  If EFLAGS specifies interrupts enabled, or any of the 16-bit real mode code enables interrupts,\r
+  then the caller is responsible for making sure the 8259 PIC is in a state compatible with 16-bit real mode.\r
+  This includes the base vectors, the interrupt masks, and the edge/level trigger mode.\r
+\r
+  If THUNK_ATTRIBUTE_BIG_REAL_MODE is set in the ThunkAttributes field of ThunkContext, then the user code\r
+  is invoked in big real mode.  Otherwise, the user code is invoked in 16-bit real mode with 64KB segment limits.\r
+\r
+  If neither THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15 nor THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL are set in\r
+  ThunkAttributes, then it is assumed that the user code did not enable the A20 mask, and no attempt is made to\r
+  disable the A20 mask.\r
+\r
+  If THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15 is set and THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL is clear in\r
+  ThunkAttributes, then attempt to use the INT 15 service to disable the A20 mask.  If this INT 15 call fails,\r
+  then attempt to disable the A20 mask by directly accessing the 8042 keyboard controller I/O ports.\r
+\r
+  If THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15 is clear and THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL is set in\r
+  ThunkAttributes, then attempt to disable the A20 mask by directly accessing the 8042 keyboard controller I/O ports.\r
+\r
+  If ThunkContext is NULL, then ASSERT().\r
+  If AsmPrepareThunk16() was not previously called with ThunkContext, then ASSERT().\r
+  If both THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15 and THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL are set in\r
+  ThunkAttributes, then ASSERT().\r
+\r
+  This interface is limited to be used in either physical mode or virtual modes with paging enabled where the\r
+  virtual to physical mappings for ThunkContext.RealModeBuffer are mapped 1:1.\r
+\r
+  @param  ThunkContext  A pointer to the context structure that describes the\r
+                        16-bit real mode code to call.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmThunk16 (\r
+  IN OUT  THUNK_CONTEXT             *ThunkContext\r
+  );\r
+\r
+\r
+/**\r
+  Prepares all structures and code for a 16-bit real mode thunk, transfers\r
+  control to a 16-bit real mode entry point, and returns the results.\r
+\r
+  Prepares all structures and code for a 16-bit real mode thunk, transfers\r
+  control to a 16-bit real mode entry point, and returns the results. If the\r
+  caller only need to perform a single 16-bit real mode thunk, then this\r
+  service should be used. If the caller intends to make more than one 16-bit\r
+  real mode thunk, then it is more efficient if AsmPrepareThunk16() is called\r
+  once and AsmThunk16() can be called for each 16-bit real mode thunk.\r
+\r
+  This interface is limited to be used in either physical mode or virtual modes with paging enabled where the\r
+  virtual to physical mappings for ThunkContext.RealModeBuffer is mapped 1:1.\r
+\r
+  See AsmPrepareThunk16() and AsmThunk16() for the detailed description and ASSERT() conditions.\r
+\r
+  @param  ThunkContext  A pointer to the context structure that describes the\r
+                        16-bit real mode code to call.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmPrepareAndThunk16 (\r
+  IN OUT  THUNK_CONTEXT             *ThunkContext\r
+  );\r
+\r
+/**\r
+  Generates a 16-bit random number through RDRAND instruction.\r
+\r
+  if Rand is NULL, then ASSERT().\r
+\r
+  @param[out]  Rand     Buffer pointer to store the random result.\r
+\r
+  @retval TRUE          RDRAND call was successful.\r
+  @retval FALSE         Failed attempts to call RDRAND.\r
+\r
+ **/\r
+BOOLEAN\r
+EFIAPI\r
+AsmRdRand16 (\r
+  OUT     UINT16                    *Rand\r
+  );\r
+\r
+/**\r
+  Generates a 32-bit random number through RDRAND instruction.\r
+\r
+  if Rand is NULL, then ASSERT().\r
+\r
+  @param[out]  Rand     Buffer pointer to store the random result.\r
+\r
+  @retval TRUE          RDRAND call was successful.\r
+  @retval FALSE         Failed attempts to call RDRAND.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+AsmRdRand32 (\r
+  OUT     UINT32                    *Rand\r
+  );\r
+\r
+/**\r
+  Generates a 64-bit random number through RDRAND instruction.\r
+\r
+  if Rand is NULL, then ASSERT().\r
+\r
+  @param[out]  Rand     Buffer pointer to store the random result.\r
+\r
+  @retval TRUE          RDRAND call was successful.\r
+  @retval FALSE         Failed attempts to call RDRAND.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+AsmRdRand64  (\r
+  OUT     UINT64                    *Rand\r
+  );\r
+\r
+/**\r
+  Load given selector into TR register.\r
+\r
+  @param[in] Selector     Task segment selector\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmWriteTr (\r
+  IN UINT16 Selector\r
+  );\r
+\r
+/**\r
+  Patch the immediate operand of an IA32 or X64 instruction such that the byte,\r
+  word, dword or qword operand is encoded at the end of the instruction's\r
+  binary representation.\r
+\r
+  This function should be used to update object code that was compiled with\r
+  NASM from assembly source code. Example:\r
+\r
+  NASM source code:\r
+\r
+        mov     eax, strict dword 0 ; the imm32 zero operand will be patched\r
+    ASM_PFX(gPatchCr3):\r
+        mov     cr3, eax\r
+\r
+  C source code:\r
+\r
+    X86_ASSEMBLY_PATCH_LABEL gPatchCr3;\r
+    PatchInstructionX86 (gPatchCr3, AsmReadCr3 (), 4);\r
+\r
+  @param[out] InstructionEnd  Pointer right past the instruction to patch. The\r
+                              immediate operand to patch is expected to\r
+                              comprise the trailing bytes of the instruction.\r
+                              If InstructionEnd is closer to address 0 than\r
+                              ValueSize permits, then ASSERT().\r
+\r
+  @param[in] PatchValue       The constant to write to the immediate operand.\r
+                              The caller is responsible for ensuring that\r
+                              PatchValue can be represented in the byte, word,\r
+                              dword or qword operand (as indicated through\r
+                              ValueSize); otherwise ASSERT().\r
+\r
+  @param[in] ValueSize        The size of the operand in bytes; must be 1, 2,\r
+                              4, or 8. ASSERT() otherwise.\r
+**/\r
+VOID\r
+EFIAPI\r
+PatchInstructionX86 (\r
+  OUT X86_ASSEMBLY_PATCH_LABEL *InstructionEnd,\r
+  IN  UINT64                   PatchValue,\r
+  IN  UINTN                    ValueSize\r
+  );\r
+\r
+#endif // defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)\r
+#endif // !defined (__BASE_LIB__)\r