]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Include/Library/BaseLib.h
1) Added BIT0, BIT1, …, BIT63 to the Base Defines
[mirror_edk2.git] / MdePkg / Include / Library / BaseLib.h
index c1d1fa09006734c9adb760b3a036b2918700096a..e1d79e325ce4d0b34a7ef1f635cf189fca3c0acd 100644 (file)
-/** @file\r
-  Memory-only library functions with no library constructor/destructor\r
-\r
-  Copyright (c) 2006, Intel Corporation\r
-  All rights reserved. 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
-  Module Name:  BaseLib.h\r
-\r
-**/\r
-\r
-#ifndef __BASE_LIB__\r
-#define __BASE_LIB__\r
-\r
-//\r
-// Definitions for architecture specific types\r
-// These include SPIN_LOCK and BASE_LIBRARY_JUMP_BUFFER\r
-//\r
-\r
-//\r
-// SPIN_LOCK\r
-//\r
-typedef UINTN                       SPIN_LOCK;\r
-\r
-#if   defined (MDE_CPU_IA32)\r
-//\r
-// IA32 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
-#elif defined (MDE_CPU_IPF)\r
-//\r
-// IPF 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
-#elif defined (MDE_CPU_X64)\r
-//\r
-// X64 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
-} BASE_LIBRARY_JUMP_BUFFER;\r
-\r
-#elif defined (MDE_CPU_EBC)\r
-//\r
-// 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
-#else\r
-#error Unknown Processor Type\r
-#endif\r
-\r
-//\r
-// String Services\r
-//\r
-\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 Source is NULL, 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 Pointer to a Null-terminated Unicode string.\r
-  @param  Source      Pointer to a Null-terminated Unicode string.\r
-\r
-  @return Destiantion\r
-\r
-**/\r
-CHAR16 *\r
-EFIAPI\r
-StrCpy (\r
-  OUT     CHAR16                    *Destination,\r
-  IN      CONST CHAR16              *Source\r
-  );\r
-/**\r
-  Copies one Null-terminated Unicode string with a maximum length to another\r
-  Null-terminated Unicode string with a maximum length and returns the new\r
-  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 Destination is NULL, then ASSERT().\r
-  If Source is NULL, 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 Pointer to a Null-terminated Unicode string.\r
-  @param  Source      Pointer to a Null-terminated Unicode string.\r
-  @param  Length      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
-/**\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 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
-  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\r
-  string specified by String.\r
-\r
-  If String is NULL, 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 size of String.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-StrSize (\r
-  IN      CONST CHAR16              *String\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 SecondString is NULL, 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   Pointer to a Null-terminated Unicode string.\r
-  @param  SecondString  Pointer to a Null-terminated Unicode 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
-StrCmp (\r
-  IN      CONST CHAR16              *FirstString,\r
-  IN      CONST CHAR16              *SecondString\r
-  );\r
-/**\r
-  Compares two Null-terminated Unicode strings with maximum lengths, and\r
-  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 FirstString is NULL, then ASSERT().\r
-  If SecondString is NULL, 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   Pointer to a Null-terminated Unicode string.\r
-  @param  SecondString  Pointer to a Null-terminated Unicode string.\r
-  @param  Length        Maximum number of Unicode characters to 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
-StrnCmp (\r
-  IN      CONST CHAR16              *FirstString,\r
-  IN      CONST CHAR16              *SecondString,\r
-  IN      UINTN                     Length\r
-  );\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 Source is NULL, 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 Pointer to a Null-terminated Unicode string.\r
-  @param  Source      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
-  Concatenates one Null-terminated Unicode string with a maximum length to the\r
-  end 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 Source is NULL, 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 Pointer to a Null-terminated Unicode string.\r
-  @param  Source      Pointer to a Null-terminated Unicode string.\r
-  @param  Length      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
-/**\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 Pointer to a Null-terminated ASCII string.\r
-  @param  Source      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
-  Copies one Null-terminated ASCII string with a maximum length to another\r
-  Null-terminated ASCII string with a maximum length and returns the new ASCII\r
-  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 Source contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-\r
-  @param  Destination Pointer to a Null-terminated ASCII string.\r
-  @param  Source      Pointer to a Null-terminated ASCII string.\r
-  @param  Length      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
-/**\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 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  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
-  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  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
-  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   Pointer to a Null-terminated ASCII string.\r
-  @param  SecondString  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
-  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   Pointer to a Null-terminated ASCII string.\r
-  @param  SecondString  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
-  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 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 than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-\r
-  @param  FirstString   Pointer to a Null-terminated ASCII string.\r
-  @param  SecondString  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
-AsciiStrnCmp (\r
-  IN      CONST CHAR8               *FirstString,\r
-  IN      CONST CHAR8               *SecondString,\r
-  IN      UINTN                     Length\r
-  );\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 Pointer to a Null-terminated ASCII string.\r
-  @param  Source      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
-  Concatenates one Null-terminated ASCII string with a maximum length to the\r
-  end of another Null-terminated ASCII string, and returns the concatenated\r
-  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 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 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 Pointer to a Null-terminated ASCII string.\r
-  @param  Source      Pointer to a Null-terminated ASCII string.\r
-  @param  Length      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
-/**\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
-  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
-// LIST_ENTRY definition\r
-//\r
-typedef struct _LIST_ENTRY LIST_ENTRY;\r
-\r
-struct _LIST_ENTRY {\r
-  LIST_ENTRY  *ForwardLink;\r
-  LIST_ENTRY  *BackLink;\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 initiailize.\r
-\r
-**/\r
-#define INITIALIZE_LIST_HEAD_VARIABLE(ListHead)  {&ListHead, &ListHead}\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      LIST_ENTRY                *ListHead\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 InitializeListHead(), then ASSERT().\r
-  If PcdMaximumLinkedListLenth 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      LIST_ENTRY                *ListHead,\r
-  IN      LIST_ENTRY                *Entry\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 InitializeListHead(), then ASSERT().\r
-  If PcdMaximumLinkedListLenth 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      LIST_ENTRY                *ListHead,\r
-  IN      LIST_ENTRY                *Entry\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 InitializeListHead(). If List is empty, then NULL is\r
-  returned.\r
-\r
-  If List is NULL, then ASSERT().\r
-  If List was not initialized with InitializeListHead(), then ASSERT().\r
-  If PcdMaximumLinkedListLenth 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 NULL  The list is empty.\r
-\r
-**/\r
-LIST_ENTRY *\r
-EFIAPI\r
-GetFirstNode (\r
-  IN      CONST LIST_ENTRY          *List\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. List must have\r
-  been initialized with InitializeListHead(). If List is empty, then List is\r
-  returned.\r
-\r
-  If List is NULL, then ASSERT().\r
-  If Node is NULL, then ASSERT().\r
-  If List was not initialized with InitializeListHead(), then ASSERT().\r
-  If PcdMaximumLinkedListLenth is not zero, and List contains more than\r
-  PcdMaximumLinkedListLenth nodes, then ASSERT().\r
-  If 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 Pointer to the next node if one exists. Otherwise a null value which\r
-          is actually 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
-  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 InitializeListHead(), then ASSERT().\r
-  If PcdMaximumLinkedListLenth 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
-  Determines if a node in a doubly linked list is null.\r
-\r
-  Returns FALSE if Node is one of the nodes in the doubly linked list specified\r
-  by List. Otherwise, TRUE is returned. List must have been initialized with\r
-  InitializeListHead().\r
-\r
-  If List is NULL, then ASSERT().\r
-  If Node is NULL, then ASSERT().\r
-  If List was not initialized with InitializeListHead(), then ASSERT().\r
-  If PcdMaximumLinkedListLenth 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 Node is not a node in List and Node is not equal 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 one of the nodes in the doubly linked list.\r
-  @retval FALSE Node is not one of the nodes in the doubly linked 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
-  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
-  InitializeListHead().\r
-\r
-  If List is NULL, then ASSERT().\r
-  If Node is NULL, then ASSERT().\r
-  If List was not initialized with InitializeListHead(), then ASSERT().\r
-  If PcdMaximumLinkedListLenth 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 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
-  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 InitializeListHead(). SecondEntry is returned after the\r
-  nodes are swapped.\r
-\r
-  If FirstEntry is NULL, then ASSERT().\r
-  If SecondEntry is NULL, then ASSERT().\r
-  If SecondEntry and FirstEntry are not in the 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
-**/\r
-LIST_ENTRY *\r
-EFIAPI\r
-SwapListEntries (\r
-  IN      LIST_ENTRY                *FirstEntry,\r
-  IN      LIST_ENTRY                *SecondEntry\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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  @return Position of the lowest bit set in Operand if found.\r
-  @retval -1 Operand is zero.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-LowBitSet32 (\r
-  IN      UINT32                    Operand\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
-  @return Position of the lowest bit set in Operand if found.\r
-  @retval -1  Operand is zero.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-LowBitSet64 (\r
-  IN      UINT64                    Operand\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
-  @return 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
-  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
-  @return 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
-  Returns the value of the highest bit set in a 32-bit value. Equivalent to\r
-  1 << HighBitSet32(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
-  Returns the value of the highest bit set in a 64-bit value. Equivalent to\r
-  1 << HighBitSet64(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
-  Switches the endianess 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  Operand A 16-bit unsigned value.\r
-\r
-  @return The byte swaped Operand.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-SwapBytes16 (\r
-  IN      UINT16                    Value\r
-  );\r
-\r
-/**\r
-  Switches the endianess 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  Operand A 32-bit unsigned value.\r
-\r
-  @return The byte swaped Operand.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-SwapBytes32 (\r
-  IN      UINT32                    Value\r
-  );\r
-\r
-/**\r
-  Switches the endianess 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  Operand A 64-bit unsigned value.\r
-\r
-  @return The byte swaped Operand.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-SwapBytes64 (\r
-  IN      UINT64                    Value\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
-  If the result overflows, then ASSERT().\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
-  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
-  If the result overflows, then ASSERT().\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
-  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
-  If the result overflows, then ASSERT().\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
-  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
-  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
-  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
-  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
-  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
-  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
-  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  Pointer to a 16-bit value that may be unaligned.\r
-\r
-  @return *Uint16\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-ReadUnaligned16 (\r
-  IN      CONST UINT16              *Uint16\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  Pointer to a 16-bit value that may be unaligned.\r
-  @param  Value   16-bit value to write to Buffer.\r
-\r
-  @return Value\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-WriteUnaligned16 (\r
-  OUT     UINT16                    *Uint16,\r
-  IN      UINT16                    Value\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  Pointer to a 24-bit value that may be unaligned.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-ReadUnaligned24 (\r
-  IN      CONST UINT32              *Buffer\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  Pointer to a 24-bit value that may be unaligned.\r
-  @param  Value   24-bit value to write to Buffer.\r
-\r
-  @return The value written.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-WriteUnaligned24 (\r
-  OUT     UINT32                    *Buffer,\r
-  IN      UINT32                    Value\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  Pointer to a 32-bit value that may be unaligned.\r
-\r
-  @return *Uint32\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-ReadUnaligned32 (\r
-  IN      CONST UINT32              *Uint32\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  Pointer to a 32-bit value that may be unaligned.\r
-  @param  Value   32-bit value to write to Buffer.\r
-\r
-  @return Value\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-WriteUnaligned32 (\r
-  OUT     UINT32                    *Uint32,\r
-  IN      UINT32                    Value\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  Pointer to a 64-bit value that may be unaligned.\r
-\r
-  @return *Uint64\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-ReadUnaligned64 (\r
-  IN      CONST UINT64              *Uint64\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  Pointer to a 64-bit value that may be unaligned.\r
-  @param  Value   64-bit value to write to Buffer.\r
-\r
-  @return Value\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-WriteUnaligned64 (\r
-  OUT     UINT64                    *Uint64,\r
-  IN      UINT64                    Value\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
-  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
-\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
-  Reads a bit field from an 8-bit value, performs a bitwise OR, and returns the\r
-  result.\r
-\r
-  Performs a bitwise inclusive 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
-\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
-  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
-\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
-  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
-  inclusive 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
-\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
-  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
-  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
-\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
-  Reads a bit field from a 16-bit value, performs a bitwise OR, and returns the\r
-  result.\r
-\r
-  Performs a bitwise inclusive 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
-\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
-  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
-\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
-  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
-  inclusive 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
-\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
-  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
-  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
-\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
-  Reads a bit field from a 32-bit value, performs a bitwise OR, and returns the\r
-  result.\r
-\r
-  Performs a bitwise inclusive 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
-\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
-  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
-\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
-  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
-  inclusive 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
-\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
-  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
-  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
-\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
-  Reads a bit field from a 64-bit value, performs a bitwise OR, and returns the\r
-  result.\r
-\r
-  Performs a bitwise inclusive 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
-\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
-  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
-\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
-  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
-  inclusive 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
-\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
-// Base Library Synchronization Functions\r
-//\r
-\r
-/**\r
-  Retrieves the architecture specific spin lock alignment requirements for\r
-  optimal spin lock performance.\r
-\r
-  This function retrieves the spin lock alignment requirements for optimal\r
-  performance on a given CPU architecture. The spin lock alignment must be a\r
-  power of two and is returned by this function. If there are no alignment\r
-  requirements, then 1 must be returned. The spin lock synchronization\r
-  functions must function correctly if the spin lock size and alignment values\r
-  returned by this function are not used at all. These values are hints to the\r
-  consumers of the spin lock synchronization functions to obtain optimal spin\r
-  lock performance.\r
-\r
-  @return The architecture specific spin lock alignment.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-GetSpinLockProperties (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Initializes a spin lock to the released state and returns the spin lock.\r
-\r
-  This function initializes the spin lock specified by SpinLock to the released\r
-  state, and returns SpinLock. Optimal performance can be achieved by calling\r
-  GetSpinLockProperties() to determine the size and alignment requirements for\r
-  SpinLock.\r
-\r
-  If SpinLock is NULL, then ASSERT().\r
-\r
-  @param  SpinLock  A pointer to the spin lock to initialize to the released\r
-                    state.\r
-\r
-  @return SpinLock\r
-\r
-**/\r
-SPIN_LOCK *\r
-EFIAPI\r
-InitializeSpinLock (\r
-  IN      SPIN_LOCK                 *SpinLock\r
-  );\r
-\r
-/**\r
-  Waits until a spin lock can be placed in the acquired state.\r
-\r
-  This function checks the state of the spin lock specified by SpinLock. If\r
-  SpinLock is in the released state, then this function places SpinLock in the\r
-  acquired state and returns SpinLock. Otherwise, this function waits\r
-  indefinitely for the spin lock to be released, and then places it in the\r
-  acquired state and returns SpinLock. All state transitions of SpinLock must\r
-  be performed using MP safe mechanisms.\r
-\r
-  If SpinLock is NULL, then ASSERT().\r
-  If SpinLock was not initialized with InitializeSpinLock(), then ASSERT().\r
-  If PcdSpinLockTimeout is not zero, and SpinLock is can not be acquired in\r
-  PcdSpinLockTimeout microseconds, then ASSERT().\r
-\r
-  @param  SpinLock  A pointer to the spin lock to place in the acquired state.\r
-\r
-  @return SpinLock\r
-\r
-**/\r
-SPIN_LOCK *\r
-EFIAPI\r
-AcquireSpinLock (\r
-  IN      SPIN_LOCK                 *SpinLock\r
-  );\r
-\r
-/**\r
-  Attempts to place a spin lock in the acquired state.\r
-\r
-  This function checks the state of the spin lock specified by SpinLock. If\r
-  SpinLock is in the released state, then this function places SpinLock in the\r
-  acquired state and returns TRUE. Otherwise, FALSE is returned. All state\r
-  transitions of SpinLock must be performed using MP safe mechanisms.\r
-\r
-  If SpinLock is NULL, then ASSERT().\r
-  If SpinLock was not initialized with InitializeSpinLock(), then ASSERT().\r
-\r
-  @param  SpinLock  A pointer to the spin lock to place in the acquired state.\r
-\r
-  @retval TRUE  SpinLock was placed in the acquired state.\r
-  @retval FALSE SpinLock could not be acquired.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-AcquireSpinLockOrFail (\r
-  IN      SPIN_LOCK                 *SpinLock\r
-  );\r
-\r
-/**\r
-  Releases a spin lock.\r
-\r
-  This function places the spin lock specified by SpinLock in the release state\r
-  and returns SpinLock.\r
-\r
-  If SpinLock is NULL, then ASSERT().\r
-  If SpinLock was not initialized with InitializeSpinLock(), then ASSERT().\r
-\r
-  @param  SpinLock  A pointer to the spin lock to release.\r
-\r
-  @return SpinLock\r
-\r
-**/\r
-SPIN_LOCK *\r
-EFIAPI\r
-ReleaseSpinLock (\r
-  IN      SPIN_LOCK                 *SpinLock\r
-  );\r
-\r
-/**\r
-  Performs an atomic increment of an 32-bit unsigned integer.\r
-\r
-  Performs an atomic increment of the 32-bit unsigned integer specified by\r
-  Value and returns the incremented value. The increment operation must be\r
-  performed using MP safe mechanisms. The state of the return value is not\r
-  guaranteed to be MP safe.\r
-\r
-  If Value is NULL, then ASSERT().\r
-\r
-  @param  Value A pointer to the 32-bit value to increment.\r
-\r
-  @return The incremented value.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-InterlockedIncrement (\r
-  IN      UINT32                    *Value\r
-  );\r
-\r
-/**\r
-  Performs an atomic decrement of an 32-bit unsigned integer.\r
-\r
-  Performs an atomic decrement of the 32-bit unsigned integer specified by\r
-  Value and returns the decremented value. The decrement operation must be\r
-  performed using MP safe mechanisms. The state of the return value is not\r
-  guaranteed to be MP safe.\r
-\r
-  If Value is NULL, then ASSERT().\r
-\r
-  @param  Value A pointer to the 32-bit value to decrement.\r
-\r
-  @return The decremented value.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-InterlockedDecrement (\r
-  IN      UINT32                    *Value\r
-  );\r
-\r
-/**\r
-  Performs an atomic compare exchange operation on a 32-bit unsigned integer.\r
-\r
-  Performs an atomic compare exchange operation on the 32-bit unsigned integer\r
-  specified by Value.  If Value is equal to CompareValue, then Value is set to\r
-  ExchangeValue and CompareValue is returned.  If Value is not equal to CompareValue,\r
-  then Value is returned.  The compare exchange operation must be performed using\r
-  MP safe mechanisms.\r
-\r
-  If Value is NULL, then ASSERT().\r
-\r
-  @param  Value         A pointer to the 32-bit value for the compare exchange\r
-                        operation.\r
-  @param  CompareValue  32-bit value used in compare operation.\r
-  @param  ExchangeValue 32-bit value used in exchange operation.\r
-\r
-  @return The original *Value before exchange.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-InterlockedCompareExchange32 (\r
-  IN OUT  UINT32                    *Value,\r
-  IN      UINT32                    CompareValue,\r
-  IN      UINT32                    ExchangeValue\r
-  );\r
-\r
-/**\r
-  Performs an atomic compare exchange operation on a 64-bit unsigned integer.\r
-\r
-  Performs an atomic compare exchange operation on the 64-bit unsigned integer specified\r
-  by Value.  If Value is equal to CompareValue, then Value is set to ExchangeValue and\r
-  CompareValue is returned.  If Value is not equal to CompareValue, then Value is returned.\r
-  The compare exchange operation must be performed using MP safe mechanisms.\r
-\r
-  If Value is NULL, then ASSERT().\r
-\r
-  @param  Value         A pointer to the 64-bit value for the compare exchange\r
-                        operation.\r
-  @param  CompareValue  64-bit value used in compare operation.\r
-  @param  ExchangeValue 64-bit value used in exchange operation.\r
-\r
-  @return The original *Value before exchange.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InterlockedCompareExchange64 (\r
-  IN OUT  UINT64                    *Value,\r
-  IN      UINT64                    CompareValue,\r
-  IN      UINT64                    ExchangeValue\r
-  );\r
-\r
-/**\r
-  Performs an atomic compare exchange operation on a pointer value.\r
-\r
-  Performs an atomic compare exchange operation on the pointer value specified\r
-  by Value. If Value is equal to CompareValue, then Value is set to\r
-  ExchangeValue and CompareValue is returned. If Value is not equal to\r
-  CompareValue, then Value is returned. The compare exchange operation must be\r
-  performed using MP safe mechanisms.\r
-\r
-  If Value is NULL, then ASSERT().\r
-\r
-  @param  Value         A pointer to the pointer value for the compare exchange\r
-                        operation.\r
-  @param  CompareValue  Pointer value used in compare operation.\r
-  @param  ExchangeValue Pointer value used in exchange operation.\r
-\r
-**/\r
-VOID *\r
-EFIAPI\r
-InterlockedCompareExchangePointer (\r
-  IN OUT  VOID                      **Value,\r
-  IN      VOID                      *CompareValue,\r
-  IN      VOID                      *ExchangeValue\r
-  );\r
-\r
-//\r
-// Base Library CPU Functions\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
-  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
-  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 IPF CPUs, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().\r
-\r
-  @param  JumpBuffer  A pointer to CPU context buffer.\r
-\r
-  @retval 0 Indicates a return from SetJump().\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-SetJump (\r
-  OUT     BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer\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 IPF CPUs, 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
-  Enables CPU interrupts.\r
-\r
-  Enables CPU interrupts.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-EnableInterrupts (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Disables CPU interrupts.\r
-\r
-  Disables CPU interrupts.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-DisableInterrupts (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Disables CPU interrupts and returns the interrupt state prior to the disable\r
-  operation.\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
-  Enables CPU interrupts for the smallest window required to capture any\r
-  pending interrupts.\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
-  Retrieves the current CPU interrupt state.\r
-\r
-  Retrieves the current CPU interrupt state. Returns TRUE is interrupts are\r
-  currently enabled. Otherwise 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
-  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
-  Places the CPU in a sleep state until an interrupt is received.\r
-\r
-  Places the CPU in a sleep state until an interrupt is received. If interrupts\r
-  are disabled prior to calling this function, then the CPU will be placed in a\r
-  sleep state indefinitely.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-CpuSleep (\r
-  VOID\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
-  Flushes all the Translation Lookaside Buffers(TLB) entries in a CPU.\r
-\r
-  Flushes all the Translation Lookaside Buffers(TLB) entries in a CPU.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-CpuFlushTlb (\r
-  VOID\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 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 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
-\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
-  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
-  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
-//\r
-// IA32 and X64 Specific Functions\r
-//\r
-//\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;  // Reseved\r
-  } Bits;\r
-  UINTN     UintN;\r
-} IA32_CR4;\r
-\r
-//\r
-// Byte packed structure for an IDTR, GDTR, LDTR descriptor\r
-/// @bug  How to make this structure byte-packed in a compiler independent way?\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
-//\r
-// Byte packed structure for an 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
-//\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
-  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   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   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   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   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
-  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       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       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       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       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
-  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
-  Zero-extend a 32-bit value and writes it to a Machine Specific Register(MSR).\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
-  Reads a 64-bit MSR, performs a bitwise inclusive 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 inclusive 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
-  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
-  Reads a 64-bit MSR, performs a bitwise AND followed by a bitwise inclusive 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 inclusive 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
-  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
-  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. Extra left bits in Value 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 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 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
-  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 inclusive 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
-\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
-  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
-\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
-  Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a\r
-  bitwise inclusive 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 inclusive 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
-\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
-  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
-  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
-  Reads a 64-bit MSR, performs a bitwise inclusive 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 inclusive 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
-  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
-  Reads a 64-bit MSR, performs a bitwise AND followed by a bitwise inclusive\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 inclusive 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
-  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
-  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. Extra left bits in Value are\r
-  stripped. The caller must either guarantee that Index and the data written is\r
-  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 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 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
-  Reads a bit field in a 64-bit MSR, performs a bitwise inclusive 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 inclusive 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
-\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
-  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
-\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
-  Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a\r
-  bitwise inclusive 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 inclusive 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
-\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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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  Pointer to a GDTR descriptor.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmReadGdtr (\r
-  OUT     IA32_DESCRIPTOR           *Gdtr\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  Pointer to a GDTR descriptor.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmWriteGdtr (\r
-  IN      CONST IA32_DESCRIPTOR     *Gdtr\r
-  );\r
-\r
-/**\r
-  Reads the current Interrupt Descriptor Table Register(GDTR) 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  Pointer to a IDTR descriptor.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmReadIdtr (\r
-  OUT     IA32_DESCRIPTOR           *Idtr\r
-  );\r
-\r
-/**\r
-  Writes the current Interrupt Descriptor Table Register(GDTR) 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  Pointer to a IDTR descriptor.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmWriteIdtr (\r
-  IN      CONST IA32_DESCRIPTOR     *Idtr\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
-  Writes the current Local Descriptor Table Register (GDTR) 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
-  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  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
-  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  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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
-  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                    CodeSelector,\r
-  IN      UINT64                    EntryPoint,\r
-  IN      UINT64                    Context1,  OPTIONAL\r
-  IN      UINT64                    Context2,  OPTIONAL\r
-  IN      UINT64                    NewStack\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                    CodeSelector,\r
-  IN      UINT32                    EntryPoint,\r
-  IN      UINT32                    Context1,  OPTIONAL\r
-  IN      UINT32                    Context2,  OPTIONAL\r
-  IN      UINT32                    NewStack\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
-  Prepares all structures a code required to use AsmThunk16().\r
-\r
-  Prepares all structures and code required to use AsmThunk16().\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
-  OUT     THUNK_CONTEXT             *ThunkContext\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\r
-  used.\r
-\r
-  If ThunkContext is NULL, then ASSERT().\r
-  If AsmPrepareThunk16() was not previously called with ThunkContext, 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
-AsmThunk16 (\r
-  IN OUT  THUNK_CONTEXT             *ThunkContext\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
-  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
-AsmPrepareAndThunk16 (\r
-  IN OUT  THUNK_CONTEXT             *ThunkContext\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 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 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  NewBsp      A pointer to the new memory location for RSE backing\r
-                      store.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmSwitchStackAndBackingStore (\r
-  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
-  IN      VOID                      *Context1,  OPTIONAL\r
-  IN      VOID                      *Context2,  OPTIONAL\r
-  IN      VOID                      *NewStack,\r
-  IN      VOID                      *NewBsp\r
-  );\r
-\r
-#endif\r
+/** @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.
+
+  Module Name:  BaseLib.h
+
+**/
+
+#ifndef __BASE_LIB__
+#define __BASE_LIB__
+
+//
+// Definitions for architecture specific types
+// These include SPIN_LOCK and BASE_LIBRARY_JUMP_BUFFER
+//
+
+//
+// SPIN_LOCK
+//
+typedef 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 8
+
+#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 Source is NULL, 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 Destination is NULL, then ASSERT().
+  If Source is NULL, 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 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 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 SecondString is NULL, 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 FirstString is NULL, then ASSERT().
+  If SecondString is NULL, 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 Source is NULL, 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 Source is NULL, 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 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.
+
+  @reture 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 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 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 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
+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 Destination is NULL, then ASSERT().
+  If 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.
+
+  @reture 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  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  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  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  Buffer  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  Buffer  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  Buffer  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  Buffer  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  Buffer  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  Buffer  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
+  );
+
+/**
+  Places the CPU in a sleep state until an interrupt is received.
+
+  Places the CPU in a sleep state until an interrupt is received. If interrupts
+  are disabled prior to calling this function, then the CPU will be placed in a
+  sleep state indefinitely.
+
+**/
+VOID
+EFIAPI
+CpuSleep (
+  VOID
+  );
+
+/**
+  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
+  );
+
+/**
+  Flushes all the Translation Lookaside Buffers(TLB) entries in a CPU.
+
+  Flushes all the Translation Lookaside Buffers(TLB) entries in a CPU.
+
+**/
+VOID
+EFIAPI
+CpuFlushTlb (
+  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.
+
+  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
+  );
+
+//
+// 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
+  );
+
+/**
+  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
+  );
+
+typedef struct {
+  UINT64                            Status;
+  UINT64                            r9;
+  UINT64                            r10;
+  UINT64                            r11;
+} PAL_PROC_RETURN;
+
+//
+// IPF Specific functions
+//
+
+
+/**
+  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_PROC_RETURN
+PalCallStatic (
+  IN      CONST VOID                *PalEntryPoint,
+  IN      UINT64                    Arg1,
+  IN      UINT64                    Arg2,
+  IN      UINT64                    Arg3,
+  IN      UINT64                    Arg4
+  );
+
+
+/**
+  Returns the current value of ar.itc.
+
+  An internal function to return the current value of ar.itc, which is the
+  timer tick on IPF.
+
+  @return The currect value of ar.itc
+
+**/
+INT64
+IpfReadItc (
+  VOID
+  );
+
+
+/**
+  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
+  );
+
+#endif
+