]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Include/Library/BaseLib.h
Use doxygen comment style for document entity such as struct, enum, variable that...
[mirror_edk2.git] / MdePkg / Include / Library / BaseLib.h
index e042ccb712641e0809b66793e3bb04b5ed610717..0c16c4813058fb11e688e115ea0a97c27aa20c0f 100644 (file)
@@ -1,16 +1,14 @@
 /** @file\r
-       Memory-only library functions with no library constructor/destructor\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
+  Copyright (c) 2006 - 2007, 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
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 \r
 **/\r
 \r
 // These include SPIN_LOCK and BASE_LIBRARY_JUMP_BUFFER\r
 //\r
 \r
-//\r
-// SPIN_LOCK\r
-//\r
-typedef UINTN                       SPIN_LOCK;\r
+///\r
+/// SPIN_LOCK\r
+///\r
+typedef volatile UINTN              SPIN_LOCK;\r
 \r
 #if   defined (MDE_CPU_IA32)\r
-//\r
-// IA32 context buffer used by SetJump() and LongJump()\r
-//\r
+///\r
+/// IA32 context buffer used by SetJump() and LongJump()\r
+///\r
 typedef struct {\r
   UINT32                            Ebx;\r
   UINT32                            Esi;\r
@@ -40,10 +38,13 @@ typedef struct {
   UINT32                            Eip;\r
 } BASE_LIBRARY_JUMP_BUFFER;\r
 \r
+#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 4\r
+\r
 #elif defined (MDE_CPU_IPF)\r
-//\r
-// IPF context buffer used by SetJump() and LongJump()\r
-//\r
+\r
+///\r
+/// IPF context buffer used by SetJump() and LongJump()\r
+///\r
 typedef struct {\r
   UINT64                            F2[2];\r
   UINT64                            F3[2];\r
@@ -85,10 +86,12 @@ typedef struct {
   UINT64                            FPSR;\r
 } BASE_LIBRARY_JUMP_BUFFER;\r
 \r
+#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 0x10\r
+\r
 #elif defined (MDE_CPU_X64)\r
-//\r
-// X64 context buffer used by SetJump() and LongJump()\r
-//\r
+///\r
+/// X64 context buffer used by SetJump() and LongJump()\r
+///\r
 typedef struct {\r
   UINT64                            Rbx;\r
   UINT64                            Rsp;\r
@@ -102,10 +105,12 @@ typedef struct {
   UINT64                            Rip;\r
 } BASE_LIBRARY_JUMP_BUFFER;\r
 \r
+#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8\r
+\r
 #elif defined (MDE_CPU_EBC)\r
-//\r
-// EBC context buffer used by SetJump() and LongJump()\r
-//\r
+///\r
+/// EBC context buffer used by SetJump() and LongJump()\r
+///\r
 typedef struct {\r
   UINT64                            R0;\r
   UINT64                            R1;\r
@@ -114,6 +119,8 @@ typedef struct {
   UINT64                            IP;\r
 } BASE_LIBRARY_JUMP_BUFFER;\r
 \r
+#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8\r
+\r
 #else\r
 #error Unknown Processor Type\r
 #endif\r
@@ -131,10 +138,13 @@ typedef struct {
   overlap, then the results are undefined.\r
 \r
   If Destination is NULL, then ASSERT().\r
+  If Destination is not aligned on a 16-bit boundary, then ASSERT().\r
   If Source is NULL, then ASSERT().\r
+  If Source is not aligned on a 16-bit boundary, then ASSERT().\r
   If Source and Destination overlap, then ASSERT().\r
   If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters, then ASSERT().\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
@@ -149,6 +159,7 @@ StrCpy (
   IN      CONST CHAR16              *Source\r
   );\r
 \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
@@ -162,11 +173,14 @@ StrCpy (
   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 Length > 0 and Destination is NULL, then ASSERT().\r
+  If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length > 0 and Source is NULL, then ASSERT().\r
+  If Length > 0 and Source is not aligned on a 16-bit bounadry, 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, then ASSERT().\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
@@ -183,6 +197,7 @@ StrnCpy (
   IN      UINTN                     Length\r
   );\r
 \r
+\r
 /**\r
   Returns the length of a Null-terminated Unicode string.\r
 \r
@@ -190,8 +205,10 @@ StrnCpy (
   Unicode string specified by String.\r
 \r
   If String is NULL, then ASSERT().\r
+  If String is not aligned on a 16-bit boundary, then ASSERT().\r
   If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters, then ASSERT().\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
@@ -204,6 +221,7 @@ StrLen (
   IN      CONST CHAR16              *String\r
   );\r
 \r
+\r
 /**\r
   Returns the size of a Null-terminated Unicode string in bytes, including the\r
   Null terminator.\r
@@ -212,8 +230,10 @@ StrLen (
   string specified by String.\r
 \r
   If String is NULL, then ASSERT().\r
+  If String is not aligned on a 16-bit boundary, then ASSERT().\r
   If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters, then ASSERT().\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
@@ -226,6 +246,7 @@ StrSize (
   IN      CONST CHAR16              *String\r
   );\r
 \r
+\r
 /**\r
   Compares two Null-terminated Unicode strings, and returns the difference\r
   between the first mismatched Unicode characters.\r
@@ -237,11 +258,15 @@ StrSize (
   mismatched Unicode character in FirstString.\r
 \r
   If FirstString is NULL, then ASSERT().\r
+  If FirstString is not aligned on a 16-bit boundary, then ASSERT().\r
   If SecondString is NULL, then ASSERT().\r
+  If SecondString is not aligned on a 16-bit boundary, then ASSERT().\r
   If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more\r
-  than PcdMaximumUnicodeStringLength Unicode characters, then ASSERT().\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, then ASSERT().\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
@@ -257,6 +282,7 @@ StrCmp (
   IN      CONST CHAR16              *SecondString\r
   );\r
 \r
+\r
 /**\r
   Compares two Null-terminated Unicode strings with maximum lengths, and\r
   returns the difference between the first mismatched Unicode characters.\r
@@ -268,12 +294,16 @@ StrCmp (
   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 Length > 0 and FirstString is NULL, then ASSERT().\r
+  If Length > 0 and FirstString is not aligned on a 16-bit bounadary, then ASSERT().\r
+  If Length > 0 and SecondString is NULL, then ASSERT().\r
+  If Length > 0 and SecondString is not aligned on a 16-bit bounadary, then ASSERT().\r
   If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more\r
-  than PcdMaximumUnicodeStringLength Unicode characters, then ASSERT().\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, then ASSERT().\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
@@ -291,6 +321,7 @@ StrnCmp (
   IN      UINTN                     Length\r
   );\r
 \r
+\r
 /**\r
   Concatenates one Null-terminated Unicode string to another Null-terminated\r
   Unicode string, and returns the concatenated Unicode string.\r
@@ -302,15 +333,20 @@ StrnCmp (
   results are undefined.\r
 \r
   If Destination is NULL, then ASSERT().\r
+  If Destination is not aligned on a 16-bit bounadary, then ASSERT().\r
   If Source is NULL, then ASSERT().\r
+  If Source is not aligned on a 16-bit bounadary, 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, then ASSERT().\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, then ASSERT().\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, then ASSERT().\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
@@ -325,6 +361,7 @@ StrCat (
   IN      CONST CHAR16              *Source\r
   );\r
 \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
@@ -339,15 +376,20 @@ StrCat (
   the results are undefined.\r
 \r
   If Destination is NULL, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
+  If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length > 0 and Source is NULL, then ASSERT().\r
+  If Length > 0 and Source is not aligned on a 16-bit boundary, then ASSERT().\r
   If Source and Destination overlap, then ASSERT().\r
   If PcdMaximumUnicodeStringLength is not zero, and Destination contains more\r
-  than PcdMaximumUnicodeStringLength Unicode characters, then ASSERT().\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, then ASSERT().\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, then ASSERT().\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
@@ -365,6 +407,370 @@ StrnCat (
   IN      UINTN                     Length\r
   );\r
 \r
+/**\r
+  Returns the first occurance of a Null-terminated Unicode sub-string\r
+  in a Null-terminated Unicode string.\r
+\r
+  This function scans the contents of the Null-terminated Unicode string\r
+  specified by String and returns the first occurrence of SearchString.\r
+  If SearchString is not found in String, then NULL is returned.  If\r
+  the length of SearchString is zero, then String is\r
+  returned.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If String is not aligned on a 16-bit boundary, then ASSERT().\r
+  If SearchString is NULL, then ASSERT().\r
+  If SearchString is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  If PcdMaximumUnicodeStringLength is not zero, and SearchString\r
+  or String contains more than PcdMaximumUnicodeStringLength Unicode\r
+  characters not including the Null-terminator, then ASSERT().\r
+\r
+  @param  String                                 Pointer to a Null-terminated Unicode string.\r
+  @param  SearchString Pointer to a Null-terminated Unicode string to search for.\r
+\r
+  @retval NULL            If the SearchString does not appear in String.\r
+  @retval !NULL           If there is a match.\r
+\r
+**/\r
+CHAR16 *\r
+EFIAPI\r
+StrStr (\r
+  IN      CONST CHAR16               *String,\r
+  IN      CONST CHAR16               *SearchString\r
+  );\r
+\r
+/**\r
+  Convert a Null-terminated Unicode decimal string to a value of\r
+  type UINTN.\r
+\r
+  This function returns a value of type UINTN by interpreting the contents\r
+  of the Unicode string specified by String as a decimal number. The format\r
+  of the input Unicode string String is:\r
+\r
+                  [spaces] [decimal digits].\r
+\r
+  The valid decimal digit character is in the range [0-9]. The\r
+  function will ignore the pad space, which includes spaces or\r
+  tab characters, before [decimal digits]. The running zero in the\r
+  beginning of [decimal digits] will be ignored. Then, the function\r
+  stops at the first character that is a not a valid decimal character\r
+  or a Null-terminator, whichever one comes first.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If String is not aligned in a 16-bit boundary, then ASSERT().\r
+  If String has only pad spaces, then 0 is returned.\r
+  If String has no pad spaces or valid decimal digits,\r
+  then 0 is returned.\r
+  If the number represented by String overflows according\r
+  to the range defined by UINTN, then ASSERT().\r
+\r
+  If PcdMaximumUnicodeStringLength is not zero, and String contains\r
+  more than PcdMaximumUnicodeStringLength Unicode characters not including\r
+  the Null-terminator, then ASSERT().\r
+\r
+  @param  String                           Pointer to a Null-terminated Unicode string.\r
+\r
+  @retval Value translated from String.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+StrDecimalToUintn (\r
+  IN      CONST CHAR16               *String\r
+  );\r
+\r
+/**\r
+  Convert a Null-terminated Unicode decimal string to a value of\r
+  type UINT64.\r
+\r
+  This function returns a value of type UINT64 by interpreting the contents\r
+  of the Unicode string specified by String as a decimal number. The format\r
+  of the input Unicode string String is:\r
+\r
+                  [spaces] [decimal digits].\r
+\r
+  The valid decimal digit character is in the range [0-9]. The\r
+  function will ignore the pad space, which includes spaces or\r
+  tab characters, before [decimal digits]. The running zero in the\r
+  beginning of [decimal digits] will be ignored. Then, the function\r
+  stops at the first character that is a not a valid decimal character\r
+  or a Null-terminator, whichever one comes first.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If String is not aligned in a 16-bit boundary, then ASSERT().\r
+  If String has only pad spaces, then 0 is returned.\r
+  If String has no pad spaces or valid decimal digits,\r
+  then 0 is returned.\r
+  If the number represented by String overflows according\r
+  to the range defined by UINT64, then ASSERT().\r
+\r
+  If PcdMaximumUnicodeStringLength is not zero, and String contains\r
+  more than PcdMaximumUnicodeStringLength Unicode characters not including\r
+  the Null-terminator, then ASSERT().\r
+\r
+  @param  String                           Pointer to a Null-terminated Unicode string.\r
+\r
+  @retval Value translated from String.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+StrDecimalToUint64 (\r
+  IN      CONST CHAR16               *String\r
+  );\r
\r
+\r
+/**\r
+  Convert a Null-terminated Unicode hexadecimal string to a value of type UINTN.\r
+\r
+  This function returns a value of type UINTN by interpreting the contents\r
+  of the Unicode string specified by String as a hexadecimal number.\r
+  The format of the input Unicode string String is:\r
+\r
+                  [spaces][zeros][x][hexadecimal digits].\r
+\r
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].\r
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.\r
+  If "x" appears in the input string, it must be prefixed with at least one 0.\r
+  The function will ignore the pad space, which includes spaces or tab characters,\r
+  before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or\r
+  [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the\r
+  first valid hexadecimal digit. Then, the function stops at the first character that is\r
+  a not a valid hexadecimal character or NULL, whichever one comes first.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If String is not aligned in a 16-bit boundary, then ASSERT().\r
+  If String has only pad spaces, then zero is returned.\r
+  If String has no leading pad spaces, leading zeros or valid hexadecimal digits,\r
+  then zero is returned.\r
+  If the number represented by String overflows according to the range defined by\r
+  UINTN, then ASSERT().\r
+\r
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator,\r
+  then ASSERT().\r
+\r
+  @param  String                           Pointer to a Null-terminated Unicode string.\r
+\r
+  @retval Value translated from String.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+StrHexToUintn (\r
+  IN      CONST CHAR16               *String\r
+  );\r
+\r
+\r
+/**\r
+  Convert a Null-terminated Unicode hexadecimal string to a value of type UINT64.\r
+\r
+  This function returns a value of type UINT64 by interpreting the contents\r
+  of the Unicode string specified by String as a hexadecimal number.\r
+  The format of the input Unicode string String is\r
+\r
+                  [spaces][zeros][x][hexadecimal digits].\r
+\r
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].\r
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.\r
+  If "x" appears in the input string, it must be prefixed with at least one 0.\r
+  The function will ignore the pad space, which includes spaces or tab characters,\r
+  before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or\r
+  [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the\r
+  first valid hexadecimal digit. Then, the function stops at the first character that is\r
+  a not a valid hexadecimal character or NULL, whichever one comes first.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If String is not aligned in a 16-bit boundary, then ASSERT().\r
+  If String has only pad spaces, then zero is returned.\r
+  If String has no leading pad spaces, leading zeros or valid hexadecimal digits,\r
+  then zero is returned.\r
+  If the number represented by String overflows according to the range defined by\r
+  UINT64, then ASSERT().\r
+\r
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator,\r
+  then ASSERT().\r
+\r
+  @param  String                           Pointer to a Null-terminated Unicode string.\r
+\r
+  @retval Value translated from String.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+StrHexToUint64 (\r
+  IN      CONST CHAR16               *String\r
+  );\r
+\r
+/**\r
+  Convert a nibble in the low 4 bits of a byte to a Unicode hexadecimal character.\r
+\r
+  This function converts a nibble in the low 4 bits of a byte to a Unicode hexadecimal \r
+  character  For example, the nibble  0x01 and 0x0A will converted to L'1' and L'A' \r
+  respectively.\r
+\r
+  The upper nibble in the input byte will be masked off.\r
+\r
+  @param Nibble     The nibble which is in the low 4 bits of the input byte.\r
+\r
+  @retval  CHAR16   The Unicode hexadecimal character.\r
+  \r
+**/\r
+CHAR16\r
+EFIAPI\r
+NibbleToHexChar (\r
+  IN UINT8      Nibble\r
+  )\r
+;\r
+\r
+/** \r
+  Convert binary buffer to a Unicode String in a specified sequence. \r
+\r
+  This function converts bytes in the binary Buffer Buf to a Unicode String Str. \r
+  Each byte will be represented by two Unicode characters. For example, byte 0xA1 will \r
+  be converted into two Unicode character L'A' and L'1'. In the output String, the Unicode Character \r
+  for the Most Significant Nibble will be put before the Unicode Character for the Least Significant\r
+  Nibble. The output string for the buffer containing a single byte 0xA1 will be L"A1". \r
+  For a buffer with multiple bytes, the Unicode character produced by the first byte will be put into the \r
+  the last character in the output string. The one next to first byte will be put into the\r
+  character before the last character. This rules applies to the rest of the bytes. The Unicode\r
+  character by the last byte will be put into the first character in the output string. For example,\r
+  the input buffer for a 64-bits unsigned integrer 0x12345678abcdef1234 will be converted to\r
+  a Unicode string equal to L"12345678abcdef1234".\r
+\r
+  @param String                        On input, String is pointed to the buffer allocated for the convertion.\r
+  @param StringLen                     The Length of String buffer to hold the output String. The length must include the tailing '\0' character.\r
+                                       The StringLen required to convert a N bytes Buffer will be a least equal to or greater \r
+                                       than 2*N + 1.\r
+  @param Buffer                        The pointer to a input buffer.\r
+  @param BufferSizeInBytes             Lenth in bytes of the input buffer.\r
+  \r
+\r
+  @retval  EFI_SUCCESS                 The convertion is successfull. All bytes in Buffer has been convert to the corresponding\r
+                                       Unicode character and placed into the right place in String.\r
+  @retval  EFI_BUFFER_TOO_SMALL        StringSizeInBytes is smaller than 2 * N + 1the number of bytes required to\r
+                                       complete the convertion. \r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+BufToHexString (\r
+  IN OUT       CHAR16               *String,\r
+  IN OUT       UINTN                *StringLen,\r
+  IN     CONST UINT8                *Buffer,\r
+  IN           UINTN                BufferSizeInBytes\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  Convert a Unicode string consisting of hexadecimal characters to a output byte buffer.\r
+\r
+  This function converts a Unicode string consisting of characters in the range of Hexadecimal\r
+  character (L'0' to L'9', L'A' to L'F' and L'a' to L'f') to a output byte buffer. The function will stop\r
+  at the first non-hexadecimal character or the NULL character. The convertion process can be\r
+  simply viewed as the reverse operations defined by BufToHexString. Two Unicode characters will be \r
+  converted into one byte. The first Unicode character represents the Most Significant Nibble and the\r
+  second Unicode character represents the Least Significant Nibble in the output byte. \r
+  The first pair of Unicode characters represents the last byte in the output buffer. The second pair of Unicode \r
+  characters represent the  the byte preceding the last byte. This rule applies to the rest pairs of bytes. \r
+  The last pair represent the first byte in the output buffer. \r
+\r
+  For example, a Unciode String L"12345678" will be converted into a buffer wil the following bytes \r
+  (first byte is the byte in the lowest memory address): "0x78, 0x56, 0x34, 0x12".\r
+\r
+  If String has N valid hexadecimal characters for conversion,  the caller must make sure Buffer is at least \r
+  N/2 (if N is even) or (N+1)/2 (if N if odd) bytes. \r
+\r
+  @param Buffer                      The output buffer allocated by the caller.\r
+  @param BufferSizeInBytes           On input, the size in bytes of Buffer. On output, it is updated to \r
+                                     contain the size of the Buffer which is actually used for the converstion.\r
+                                     For Unicode string with 2*N hexadecimal characters (not including the \r
+                                     tailing NULL character), N bytes of Buffer will be used for the output.\r
+  @param String                      The input hexadecimal string.\r
+  @param ConvertedStrLen             The number of hexadecimal characters used to produce content in output\r
+                                     buffer Buffer.\r
+\r
+  @retval  RETURN_BUFFER_TOO_SMALL   The input BufferSizeInBytes is too small to hold the output. BufferSizeInBytes\r
+                                     will be updated to the size required for the converstion.\r
+  @retval  RETURN_SUCCESS            The convertion is successful or the first Unicode character from String\r
+                                     is hexadecimal. If ConvertedStrLen is not NULL, it is updated\r
+                                     to the number of hexadecimal character used for the converstion.\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+HexStringToBuf (\r
+  OUT          UINT8                    *Buffer,   \r
+  IN OUT       UINTN                    *BufferSizeInBytes,\r
+  IN     CONST CHAR16                   *String,\r
+  OUT          UINTN                    *ConvertedStrLen  OPTIONAL\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  Test if  a Unicode character is a hexadecimal digit. If true, the input\r
+  Unicode character is converted to a byte. \r
+\r
+  This function tests if a Unicode character is a hexadecimal digit. If true, the input\r
+  Unicode character is converted to a byte. For example, Unicode character\r
+  L'A' will be converted to 0x0A. \r
+\r
+  If Digit is NULL, then ASSERT.\r
+\r
+  @retval TRUE        Char is in the range of Hexadecimal number. Digit is updated\r
+                      to the byte value of the number.\r
+  @retval FALSE       Char is not in the range of Hexadecimal number. Digit is keep\r
+                      intact.\r
+  \r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+IsHexDigit (\r
+  OUT UINT8      *Digit,\r
+  IN  CHAR16      Char\r
+  )\r
+;\r
+\r
+/**\r
+  Convert one Null-terminated Unicode string to a Null-terminated\r
+  ASCII string and returns the ASCII string.\r
+\r
+  This function converts the content of the Unicode string Source\r
+  to the ASCII string Destination by copying the lower 8 bits of\r
+  each Unicode character. It returns Destination.\r
+\r
+  If any Unicode characters in Source contain non-zero value in\r
+  the upper 8 bits, then ASSERT().\r
+\r
+  If Destination is NULL, then ASSERT().\r
+  If Source is NULL, then ASSERT().\r
+  If Source is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Source and Destination overlap, then ASSERT().\r
+\r
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains\r
+  more than PcdMaximumUnicodeStringLength Unicode characters not including\r
+  the Null-terminator, then ASSERT().\r
+\r
+  If PcdMaximumAsciiStringLength is not zero, and Source contains more\r
+  than PcdMaximumAsciiStringLength Unicode characters not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  @param  Source        Pointer to a Null-terminated Unicode string.\r
+  @param  Destination   Pointer to a Null-terminated ASCII string.\r
+\r
+  @return Destination\r
+\r
+**/\r
+CHAR8 *\r
+EFIAPI\r
+UnicodeStrToAsciiStr (\r
+  IN      CONST CHAR16               *Source,\r
+  OUT    CHAR8                           *Destination\r
+  );\r
+\r
+\r
 /**\r
   Copies one Null-terminated ASCII string to another Null-terminated ASCII\r
   string and returns the new ASCII string.\r
@@ -377,7 +783,8 @@ StrnCat (
   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, then ASSERT().\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
@@ -392,6 +799,7 @@ AsciiStrCpy (
   IN      CONST CHAR8               *Source\r
   );\r
 \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
@@ -408,7 +816,8 @@ AsciiStrCpy (
   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, then ASSERT().\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
@@ -425,15 +834,18 @@ AsciiStrnCpy (
   IN      UINTN                     Length\r
   );\r
 \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 Length > 0 and Destination is NULL, then ASSERT().\r
+  If Length > 0 and Source is NULL, then ASSERT().\r
   If PcdMaximumAsciiStringLength is not zero and String contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters, then ASSERT().\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
@@ -446,6 +858,7 @@ AsciiStrLen (
   IN      CONST CHAR8               *String\r
   );\r
 \r
+\r
 /**\r
   Returns the size of a Null-terminated ASCII string in bytes, including the\r
   Null terminator.\r
@@ -455,7 +868,8 @@ AsciiStrLen (
 \r
   If String is NULL, then ASSERT().\r
   If PcdMaximumAsciiStringLength is not zero and String contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters, then ASSERT().\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
@@ -468,6 +882,7 @@ AsciiStrSize (
   IN      CONST CHAR8               *String\r
   );\r
 \r
+\r
 /**\r
   Compares two Null-terminated ASCII strings, and returns the difference\r
   between the first mismatched ASCII characters.\r
@@ -481,9 +896,11 @@ AsciiStrSize (
   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, then ASSERT().\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, then ASSERT().\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
@@ -499,6 +916,7 @@ AsciiStrCmp (
   IN      CONST CHAR8               *SecondString\r
   );\r
 \r
+\r
 /**\r
   Performs a case insensitive comparison of two Null-terminated ASCII strings,\r
   and returns the difference between the first mismatched ASCII characters.\r
@@ -513,9 +931,11 @@ AsciiStrCmp (
   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, then ASSERT().\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, then ASSERT().\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
@@ -533,6 +953,7 @@ AsciiStriCmp (
   IN      CONST CHAR8               *SecondString\r
   );\r
 \r
+\r
 /**\r
   Compares two Null-terminated ASCII strings with maximum lengths, and returns\r
   the difference between the first mismatched ASCII characters.\r
@@ -544,16 +965,19 @@ AsciiStriCmp (
   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 Length > 0 and FirstString is NULL, then ASSERT().\r
+  If Length > 0 and SecondString is NULL, then ASSERT().\r
   If PcdMaximumAsciiStringLength is not zero and FirstString contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and SecondString contains more\r
-  than PcdMaximumAsciiStringLength ASCII characters, then ASSERT().\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
+  @param  Length        Maximum number of ASCII characters for compare.\r
+  \r
   @retval 0   FirstString is identical to SecondString.\r
   @retval !=0 FirstString is not identical to SecondString.\r
 \r
@@ -566,6 +990,7 @@ AsciiStrnCmp (
   IN      UINTN                     Length\r
   );\r
 \r
+\r
 /**\r
   Concatenates one Null-terminated ASCII string to another Null-terminated\r
   ASCII string, and returns the concatenated ASCII string.\r
@@ -578,9 +1003,11 @@ AsciiStrnCmp (
   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, then ASSERT().\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, then ASSERT().\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
@@ -594,10 +1021,11 @@ AsciiStrnCmp (
 CHAR8 *\r
 EFIAPI\r
 AsciiStrCat (\r
-  IN OUT  CHAR8                     *Destination,\r
-  IN      CONST CHAR8               *Source\r
+  IN OUT CHAR8    *Destination,\r
+  IN CONST CHAR8  *Source\r
   );\r
 \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
@@ -611,16 +1039,18 @@ AsciiStrCat (
   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 Length > 0 and Destination is NULL, then ASSERT().\r
+  If Length > 0 and Source is NULL, then ASSERT().\r
   If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and Destination contains more\r
-  than PcdMaximumAsciiStringLength ASCII characters, 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, then ASSERT().\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
+  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
@@ -638,123 +1068,384 @@ AsciiStrnCat (
   IN      UINTN                     Length\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
+  Returns the first occurance of a Null-terminated ASCII sub-string\r
+  in a Null-terminated ASCII string.\r
 \r
-//\r
-// Linked List Functions and Macros\r
-//\r
+  This function scans the contents of the ASCII string specified by String\r
+  and returns the first occurrence of SearchString. If SearchString is not\r
+  found in String, then NULL is returned. If the length of SearchString is zero,\r
+  then String is returned.\r
 \r
-/**\r
-  Initializes the head node of a doubly linked list that is declared as a\r
-  global variable in a module.\r
+  If String is NULL, then ASSERT().\r
+  If SearchString is NULL, then ASSERT().\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
+  If PcdMaximumAsciiStringLength is not zero, and SearchString or\r
+  String contains more than PcdMaximumAsciiStringLength Unicode characters\r
+  not including the Null-terminator, then ASSERT().\r
 \r
-  @param  ListHead  The head note of a list to initiailize.\r
+  @param  String                                 Pointer to a Null-terminated ASCII string.\r
+  @param  SearchString   Pointer to a Null-terminated ASCII string to search for.\r
+\r
+  @retval NULL            If the SearchString does not appear in String.\r
+  @retval !NULL           If there is a match.\r
 \r
 **/\r
-#define INITIALIZE_LIST_HEAD_VARIABLE(ListHead)  {&ListHead, &ListHead}\r
+CHAR8 *\r
+EFIAPI\r
+AsciiStrStr (\r
+  IN      CONST CHAR8                  *String,\r
+  IN      CONST CHAR8                  *SearchString\r
+  );\r
+\r
 \r
 /**\r
-  Initializes the head node of a doubly linked list, and returns the pointer to\r
-  the head node of the doubly linked list.\r
+  Convert a Null-terminated ASCII decimal string to a value of type\r
+  UINTN.\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
+  This function returns a value of type UINTN by interpreting the contents\r
+  of the ASCII string String as a decimal number. The format of the input\r
+  ASCII string String is:\r
 \r
-  If ListHead is NULL, then ASSERT().\r
+                    [spaces] [decimal digits].\r
 \r
-  @param  ListHead  A pointer to the head node of a new doubly linked list.\r
+  The valid decimal digit character is in the range [0-9]. The function will\r
+  ignore the pad space, which includes spaces or tab characters, before the digits.\r
+  The running zero in the beginning of [decimal digits] will be ignored. Then, the\r
+  function stops at the first character that is a not a valid decimal character or\r
+  Null-terminator, whichever on comes first.\r
 \r
-  @return ListHead\r
+  If String has only pad spaces, then 0 is returned.\r
+  If String has no pad spaces or valid decimal digits, then 0 is returned.\r
+  If the number represented by String overflows according to the range defined by\r
+  UINTN, then ASSERT().\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
+  @retval Value translated from String.\r
 \r
 **/\r
-LIST_ENTRY *\r
+UINTN\r
 EFIAPI\r
-InitializeListHead (\r
-  IN      LIST_ENTRY                *ListHead\r
+AsciiStrDecimalToUintn (\r
+  IN      CONST CHAR8               *String\r
   );\r
 \r
+\r
 /**\r
-  Adds a node to the beginning of a doubly linked list, and returns the pointer\r
-  to the head node of the doubly linked list.\r
+  Convert a Null-terminated ASCII decimal string to a value of type\r
+  UINT64.\r
 \r
-  Adds the node Entry at the beginning of the doubly linked list denoted by\r
-  ListHead, and returns ListHead.\r
+  This function returns a value of type UINT64 by interpreting the contents\r
+  of the ASCII string String as a decimal number. The format of the input\r
+  ASCII string String is:\r
 \r
-  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 ListHead contains more than\r
-  PcdMaximumLinkedListLenth nodes, then ASSERT().\r
+                    [spaces] [decimal digits].\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
+  The valid decimal digit character is in the range [0-9]. The function will\r
+  ignore the pad space, which includes spaces or tab characters, before the digits.\r
+  The running zero in the beginning of [decimal digits] will be ignored. Then, the\r
+  function stops at the first character that is a not a valid decimal character or\r
+  Null-terminator, whichever on comes first.\r
 \r
-  @return ListHead\r
+  If String has only pad spaces, then 0 is returned.\r
+  If String has no pad spaces or valid decimal digits, then 0 is returned.\r
+  If the number represented by String overflows according to the range defined by\r
+  UINT64, then ASSERT().\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
+  @retval Value translated from String.\r
 \r
 **/\r
-LIST_ENTRY *\r
+UINT64\r
 EFIAPI\r
-InsertHeadList (\r
-  IN      LIST_ENTRY                *ListHead,\r
-  IN      LIST_ENTRY                *Entry\r
+AsciiStrDecimalToUint64 (\r
+  IN      CONST CHAR8                *String\r
   );\r
 \r
+\r
 /**\r
-  Adds a node to the end of a doubly linked list, and returns the pointer to\r
-  the head node of the doubly linked list.\r
+  Convert a Null-terminated ASCII hexadecimal string to a value of type UINTN.\r
 \r
-  Adds the node Entry to the end of the doubly linked list denoted by ListHead,\r
-  and returns ListHead.\r
+  This function returns a value of type UINTN by interpreting the contents of\r
+  the ASCII string String as a hexadecimal number. The format of the input ASCII\r
+  string String is:\r
 \r
-  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 ListHead contains more than\r
-  PcdMaximumLinkedListLenth nodes, then ASSERT().\r
+                  [spaces][zeros][x][hexadecimal digits].\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
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].\r
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x"\r
+  appears in the input string, it must be prefixed with at least one 0. The function\r
+  will ignore the pad space, which includes spaces or tab characters, before [zeros],\r
+  [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits]\r
+  will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal\r
+  digit. Then, the function stops at the first character that is a not a valid\r
+  hexadecimal character or Null-terminator, whichever on comes first.\r
 \r
-  @return ListHead\r
+  If String has only pad spaces, then 0 is returned.\r
+  If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then\r
+  0 is returned.\r
+\r
+  If the number represented by String overflows according to the range defined by UINTN,\r
+  then ASSERT().\r
+  If String is NULL, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero,\r
+  and String contains more than PcdMaximumAsciiStringLength ASCII characters not including\r
+  the Null-terminator, then ASSERT().\r
+\r
+  @param  String                           Pointer to a Null-terminated ASCII string.\r
+\r
+  @retval Value translated from String.\r
 \r
 **/\r
-LIST_ENTRY *\r
+UINTN\r
 EFIAPI\r
-InsertTailList (\r
-  IN      LIST_ENTRY                *ListHead,\r
-  IN      LIST_ENTRY                *Entry\r
+AsciiStrHexToUintn (\r
+  IN      CONST CHAR8                *String\r
   );\r
 \r
+\r
 /**\r
-  Retrieves the first node of a doubly linked list.\r
+  Convert a Null-terminated ASCII hexadecimal string to a value of type UINT64.\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
+  This function returns a value of type UINT64 by interpreting the contents of\r
+  the ASCII string String as a hexadecimal number. The format of the input ASCII\r
+  string String is:\r
+\r
+                  [spaces][zeros][x][hexadecimal digits].\r
+\r
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].\r
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x"\r
+  appears in the input string, it must be prefixed with at least one 0. The function\r
+  will ignore the pad space, which includes spaces or tab characters, before [zeros],\r
+  [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits]\r
+  will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal\r
+  digit. Then, the function stops at the first character that is a not a valid\r
+  hexadecimal character or Null-terminator, whichever on comes first.\r
+\r
+  If String has only pad spaces, then 0 is returned.\r
+  If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then\r
+  0 is returned.\r
+\r
+  If the number represented by String overflows according to the range defined by UINT64,\r
+  then ASSERT().\r
+  If String is NULL, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero,\r
+  and String contains more than PcdMaximumAsciiStringLength ASCII characters not including\r
+  the Null-terminator, then ASSERT().\r
+\r
+  @param  String                           Pointer to a Null-terminated ASCII string.\r
+\r
+  @retval Value translated from String.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsciiStrHexToUint64 (\r
+  IN      CONST CHAR8                  *String\r
+  );\r
+\r
+\r
+/**\r
+  Convert one Null-terminated ASCII string to a Null-terminated\r
+  Unicode string and returns the Unicode string.\r
+\r
+  This function converts the contents of the ASCII string Source to the Unicode\r
+  string Destination, and returns Destination.  The function terminates the\r
+  Unicode string Destination by appending a Null-terminator character at the end.\r
+  The caller is responsible to make sure Destination points to a buffer with size\r
+  equal or greater than ((AsciiStrLen (Source) + 1) * sizeof (CHAR16)) in bytes.\r
+\r
+  If Destination is NULL, then ASSERT().\r
+  If Destination is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Source is NULL, then ASSERT().\r
+  If Source and Destination overlap, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero, and Source contains more than\r
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
+  then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
+  PcdMaximumUnicodeStringLength ASCII characters not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  @param  Source        Pointer to a Null-terminated ASCII string.\r
+  @param  Destination   Pointer to a Null-terminated Unicode string.\r
+\r
+  @return Destination\r
+\r
+**/\r
+CHAR16 *\r
+EFIAPI\r
+AsciiStrToUnicodeStr (\r
+  IN      CONST CHAR8                *Source,\r
+  OUT    CHAR16                        *Destination\r
+  );\r
+\r
+\r
+/**\r
+  Converts an 8-bit value to an 8-bit BCD value.\r
+\r
+  Converts the 8-bit value specified by Value to BCD. The BCD value is\r
+  returned.\r
+\r
+  If Value >= 100, then ASSERT().\r
+\r
+  @param  Value The 8-bit value to convert to BCD. Range 0..99.\r
+\r
+  @return The BCD value\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+DecimalToBcd8 (\r
+  IN      UINT8                     Value\r
+  );\r
+\r
+\r
+/**\r
+  Converts an 8-bit BCD value to an 8-bit value.\r
+\r
+  Converts the 8-bit BCD value specified by Value to an 8-bit value. The 8-bit\r
+  value is returned.\r
+\r
+  If Value >= 0xA0, then ASSERT().\r
+  If (Value & 0x0F) >= 0x0A, then ASSERT().\r
+\r
+  @param  Value The 8-bit BCD value to convert to an 8-bit value.\r
+\r
+  @return The 8-bit value is returned.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+BcdToDecimal8 (\r
+  IN      UINT8                     Value\r
+  );\r
+\r
+\r
+//\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
+/**\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
+/**\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
+/**\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
+/**\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 List contains more than\r
-  PcdMaximumLinkedListLenth nodes, 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
@@ -768,6 +1459,7 @@ GetFirstNode (
   IN      CONST LIST_ENTRY          *List\r
   );\r
 \r
+\r
 /**\r
   Retrieves the next node of a doubly linked list.\r
 \r
@@ -796,6 +1488,7 @@ GetNextNode (
   IN      CONST LIST_ENTRY          *Node\r
   );\r
 \r
+\r
 /**\r
   Checks to see if a doubly linked list is empty or not.\r
 \r
@@ -804,8 +1497,9 @@ GetNextNode (
 \r
   If ListHead is NULL, then ASSERT().\r
   If ListHead 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 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
@@ -819,6 +1513,7 @@ IsListEmpty (
   IN      CONST LIST_ENTRY          *ListHead\r
   );\r
 \r
+\r
 /**\r
   Determines if a node in a doubly linked list is null.\r
 \r
@@ -829,12 +1524,13 @@ IsListEmpty (
   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 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
+  @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
@@ -847,6 +1543,7 @@ IsNull (
   IN      CONST LIST_ENTRY          *Node\r
   );\r
 \r
+\r
 /**\r
   Determines if a node the last node in a doubly linked list.\r
 \r
@@ -857,12 +1554,13 @@ IsNull (
   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 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
+  @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
@@ -875,6 +1573,7 @@ IsNodeAtEnd (
   IN      CONST LIST_ENTRY          *Node\r
   );\r
 \r
+\r
 /**\r
   Swaps the location of two nodes in a doubly linked list, and returns the\r
   first node after the swap.\r
@@ -889,12 +1588,15 @@ IsNodeAtEnd (
   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 PcdMaximumLinkedListLenth is not zero, and the linked list containing\r
-  FirstEntry and SecondEntry contains more than PcdMaximumLinkedListLenth\r
-  nodes, then ASSERT().\r
+  If PcdMaximumLinkedListLength is not zero, and the number of nodes in the\r
+  linked list containing the FirstEntry and SecondEntry nodes, including\r
+  the FirstEntry and SecondEntry nodes, is greater than or equal to\r
+  PcdMaximumLinkedListLength, then ASSERT().\r
 \r
   @param  FirstEntry  A pointer to a node in a linked list.\r
   @param  SecondEntry A pointer to another node in the same linked list.\r
+  \r
+  @return SecondEntry\r
 \r
 **/\r
 LIST_ENTRY *\r
@@ -904,6 +1606,7 @@ SwapListEntries (
   IN      LIST_ENTRY                *SecondEntry\r
   );\r
 \r
+\r
 /**\r
   Removes a node from a doubly linked list, and returns the node that follows\r
   the removed node.\r
@@ -916,8 +1619,9 @@ SwapListEntries (
 \r
   If Entry is NULL, then ASSERT().\r
   If Entry is the head node of an empty list, then ASSERT().\r
-  If PcdMaximumLinkedListLenth is not zero, and the linked list containing\r
-  Entry contains more than PcdMaximumLinkedListLenth nodes, 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
@@ -956,6 +1660,7 @@ LShiftU64 (
   IN      UINTN                     Count\r
   );\r
 \r
+\r
 /**\r
   Shifts a 64-bit integer right between 0 and 63 bits. This high bits are\r
   filled with zeros. The shifted value is returned.\r
@@ -978,6 +1683,7 @@ RShiftU64 (
   IN      UINTN                     Count\r
   );\r
 \r
+\r
 /**\r
   Shifts a 64-bit integer right between 0 and 63 bits. The high bits are filled\r
   with original integer's bit 63. The shifted value is returned.\r
@@ -1000,6 +1706,7 @@ ARShiftU64 (
   IN      UINTN                     Count\r
   );\r
 \r
+\r
 /**\r
   Rotates a 32-bit integer left between 0 and 31 bits, filling the low bits\r
   with the high bits that were rotated.\r
@@ -1023,6 +1730,7 @@ LRotU32 (
   IN      UINTN                     Count\r
   );\r
 \r
+\r
 /**\r
   Rotates a 32-bit integer right between 0 and 31 bits, filling the high bits\r
   with the low bits that were rotated.\r
@@ -1046,6 +1754,7 @@ RRotU32 (
   IN      UINTN                     Count\r
   );\r
 \r
+\r
 /**\r
   Rotates a 64-bit integer left between 0 and 63 bits, filling the low bits\r
   with the high bits that were rotated.\r
@@ -1069,6 +1778,7 @@ LRotU64 (
   IN      UINTN                     Count\r
   );\r
 \r
+\r
 /**\r
   Rotates a 64-bit integer right between 0 and 63 bits, filling the high bits\r
   with the high low bits that were rotated.\r
@@ -1092,6 +1802,7 @@ RRotU64 (
   IN      UINTN                     Count\r
   );\r
 \r
+\r
 /**\r
   Returns the bit position of the lowest bit set in a 32-bit value.\r
 \r
@@ -1111,6 +1822,7 @@ LowBitSet32 (
   IN      UINT32                    Operand\r
   );\r
 \r
+\r
 /**\r
   Returns the bit position of the lowest bit set in a 64-bit value.\r
 \r
@@ -1130,6 +1842,7 @@ LowBitSet64 (
   IN      UINT64                    Operand\r
   );\r
 \r
+\r
 /**\r
   Returns the bit position of the highest bit set in a 32-bit value. Equivalent\r
   to log2(x).\r
@@ -1150,6 +1863,7 @@ HighBitSet32 (
   IN      UINT32                    Operand\r
   );\r
 \r
+\r
 /**\r
   Returns the bit position of the highest bit set in a 64-bit value. Equivalent\r
   to log2(x).\r
@@ -1170,6 +1884,7 @@ HighBitSet64 (
   IN      UINT64                    Operand\r
   );\r
 \r
+\r
 /**\r
   Returns the value of the highest bit set in a 32-bit value. Equivalent to\r
   1 << HighBitSet32(x).\r
@@ -1189,6 +1904,7 @@ GetPowerOfTwo32 (
   IN      UINT32                    Operand\r
   );\r
 \r
+\r
 /**\r
   Returns the value of the highest bit set in a 64-bit value. Equivalent to\r
   1 << HighBitSet64(x).\r
@@ -1208,6 +1924,7 @@ GetPowerOfTwo64 (
   IN      UINT64                    Operand\r
   );\r
 \r
+\r
 /**\r
   Switches the endianess of a 16-bit integer.\r
 \r
@@ -1215,7 +1932,7 @@ GetPowerOfTwo64 (
   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
+  @param  Value Operand A 16-bit unsigned value.\r
 \r
   @return The byte swaped Operand.\r
 \r
@@ -1226,6 +1943,7 @@ SwapBytes16 (
   IN      UINT16                    Value\r
   );\r
 \r
+\r
 /**\r
   Switches the endianess of a 32-bit integer.\r
 \r
@@ -1233,7 +1951,7 @@ SwapBytes16 (
   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
+  @param  Value Operand A 32-bit unsigned value.\r
 \r
   @return The byte swaped Operand.\r
 \r
@@ -1244,6 +1962,7 @@ SwapBytes32 (
   IN      UINT32                    Value\r
   );\r
 \r
+\r
 /**\r
   Switches the endianess of a 64-bit integer.\r
 \r
@@ -1251,7 +1970,7 @@ SwapBytes32 (
   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
+  @param  Value Operand A 64-bit unsigned value.\r
 \r
   @return The byte swaped Operand.\r
 \r
@@ -1262,6 +1981,7 @@ SwapBytes64 (
   IN      UINT64                    Value\r
   );\r
 \r
+\r
 /**\r
   Multiples a 64-bit unsigned integer by a 32-bit unsigned integer and\r
   generates a 64-bit unsigned result.\r
@@ -1285,6 +2005,7 @@ MultU64x32 (
   IN      UINT32                    Multiplier\r
   );\r
 \r
+\r
 /**\r
   Multiples a 64-bit unsigned integer by a 64-bit unsigned integer and\r
   generates a 64-bit unsigned result.\r
@@ -1308,6 +2029,7 @@ MultU64x64 (
   IN      UINT64                    Multiplier\r
   );\r
 \r
+\r
 /**\r
   Multiples a 64-bit signed integer by a 64-bit signed integer and generates a\r
   64-bit signed result.\r
@@ -1331,6 +2053,7 @@ MultS64x64 (
   IN      INT64                     Multiplier\r
   );\r
 \r
+\r
 /**\r
   Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates\r
   a 64-bit unsigned result.\r
@@ -1354,6 +2077,7 @@ DivU64x32 (
   IN      UINT32                    Divisor\r
   );\r
 \r
+\r
 /**\r
   Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates\r
   a 32-bit unsigned remainder.\r
@@ -1377,6 +2101,7 @@ ModU64x32 (
   IN      UINT32                    Divisor\r
   );\r
 \r
+\r
 /**\r
   Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates\r
   a 64-bit unsigned result and an optional 32-bit unsigned remainder.\r
@@ -1404,6 +2129,7 @@ DivU64x32Remainder (
   OUT     UINT32                    *Remainder  OPTIONAL\r
   );\r
 \r
+\r
 /**\r
   Divides a 64-bit unsigned integer by a 64-bit unsigned integer and generates\r
   a 64-bit unsigned result and an optional 64-bit unsigned remainder.\r
@@ -1431,6 +2157,7 @@ DivU64x64Remainder (
   OUT     UINT64                    *Remainder  OPTIONAL\r
   );\r
 \r
+\r
 /**\r
   Divides a 64-bit signed integer by a 64-bit signed integer and generates a\r
   64-bit signed result and a optional 64-bit signed remainder.\r
@@ -1458,6 +2185,7 @@ DivS64x64Remainder (
   OUT     INT64                     *Remainder  OPTIONAL\r
   );\r
 \r
+\r
 /**\r
   Reads a 16-bit value from memory that may be unaligned.\r
 \r
@@ -1466,7 +2194,7 @@ DivS64x64Remainder (
 \r
   If the Buffer is NULL, then ASSERT().\r
 \r
-  @param  Buffer  Pointer to a 16-bit value that may be unaligned.\r
+  @param  Uint16  Pointer to a 16-bit value that may be unaligned.\r
 \r
   @return *Uint16\r
 \r
@@ -1477,6 +2205,7 @@ ReadUnaligned16 (
   IN      CONST UINT16              *Uint16\r
   );\r
 \r
+\r
 /**\r
   Writes a 16-bit value to memory that may be unaligned.\r
 \r
@@ -1486,7 +2215,7 @@ ReadUnaligned16 (
 \r
   If the Buffer is NULL, then ASSERT().\r
 \r
-  @param  Buffer  Pointer to a 16-bit value that may be unaligned.\r
+  @param  Uint16  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
@@ -1499,6 +2228,7 @@ WriteUnaligned16 (
   IN      UINT16                    Value\r
   );\r
 \r
+\r
 /**\r
   Reads a 24-bit value from memory that may be unaligned.\r
 \r
@@ -1509,7 +2239,7 @@ WriteUnaligned16 (
 \r
   @param  Buffer  Pointer to a 24-bit value that may be unaligned.\r
 \r
-  @return The value read.\r
+  @return The value read from Buffer.\r
 \r
 **/\r
 UINT32\r
@@ -1518,6 +2248,7 @@ ReadUnaligned24 (
   IN      CONST UINT32              *Buffer\r
   );\r
 \r
+\r
 /**\r
   Writes a 24-bit value to memory that may be unaligned.\r
 \r
@@ -1530,7 +2261,7 @@ ReadUnaligned24 (
   @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
+  @return The value written to Buffer.\r
 \r
 **/\r
 UINT32\r
@@ -1540,6 +2271,7 @@ WriteUnaligned24 (
   IN      UINT32                    Value\r
   );\r
 \r
+\r
 /**\r
   Reads a 32-bit value from memory that may be unaligned.\r
 \r
@@ -1548,9 +2280,9 @@ WriteUnaligned24 (
 \r
   If the Buffer is NULL, then ASSERT().\r
 \r
-  @param  Buffer  Pointer to a 32-bit value that may be unaligned.\r
+  @param  Uint32  Pointer to a 32-bit value that may be unaligned.\r
 \r
-  @return *Uint32\r
+  @return Value read from Uint32\r
 \r
 **/\r
 UINT32\r
@@ -1559,6 +2291,7 @@ ReadUnaligned32 (
   IN      CONST UINT32              *Uint32\r
   );\r
 \r
+\r
 /**\r
   Writes a 32-bit value to memory that may be unaligned.\r
 \r
@@ -1568,10 +2301,10 @@ ReadUnaligned32 (
 \r
   If the Buffer is NULL, then ASSERT().\r
 \r
-  @param  Buffer  Pointer to a 32-bit value that may be unaligned.\r
+  @param  Uint32  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
+  @return Value written to Uint32.\r
 \r
 **/\r
 UINT32\r
@@ -1581,6 +2314,7 @@ WriteUnaligned32 (
   IN      UINT32                    Value\r
   );\r
 \r
+\r
 /**\r
   Reads a 64-bit value from memory that may be unaligned.\r
 \r
@@ -1589,9 +2323,9 @@ WriteUnaligned32 (
 \r
   If the Buffer is NULL, then ASSERT().\r
 \r
-  @param  Buffer  Pointer to a 64-bit value that may be unaligned.\r
+  @param  Uint64  Pointer to a 64-bit value that may be unaligned.\r
 \r
-  @return *Uint64\r
+  @return Value read from Uint64.\r
 \r
 **/\r
 UINT64\r
@@ -1600,6 +2334,7 @@ ReadUnaligned64 (
   IN      CONST UINT64              *Uint64\r
   );\r
 \r
+\r
 /**\r
   Writes a 64-bit value to memory that may be unaligned.\r
 \r
@@ -1609,10 +2344,10 @@ ReadUnaligned64 (
 \r
   If the Buffer is NULL, then ASSERT().\r
 \r
-  @param  Buffer  Pointer to a 64-bit value that may be unaligned.\r
+  @param  Uint64  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
+  @return Value written to Uint64.\r
 \r
 **/\r
 UINT64\r
@@ -1622,6 +2357,7 @@ WriteUnaligned64 (
   IN      UINT64                    Value\r
   );\r
 \r
+\r
 //\r
 // Bit Field Functions\r
 //\r
@@ -1634,7 +2370,7 @@ WriteUnaligned64 (
   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 or equal to StartBit, 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
@@ -1653,6 +2389,7 @@ BitFieldRead8 (
   IN      UINTN                     EndBit\r
   );\r
 \r
+\r
 /**\r
   Writes a bit field to an 8-bit value, and returns the result.\r
 \r
@@ -1663,7 +2400,7 @@ BitFieldRead8 (
   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 or equal to StartBit, 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
@@ -1684,6 +2421,7 @@ BitFieldWrite8 (
   IN      UINT8                     Value\r
   );\r
 \r
+\r
 /**\r
   Reads a bit field from an 8-bit value, performs a bitwise OR, and returns the\r
   result.\r
@@ -1695,7 +2433,7 @@ BitFieldWrite8 (
   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 or equal to StartBit, 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
@@ -1716,6 +2454,7 @@ BitFieldOr8 (
   IN      UINT8                     OrData\r
   );\r
 \r
+\r
 /**\r
   Reads a bit field from an 8-bit value, performs a bitwise AND, and returns\r
   the result.\r
@@ -1727,7 +2466,7 @@ BitFieldOr8 (
   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 or equal to StartBit, 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
@@ -1748,6 +2487,7 @@ BitFieldAnd8 (
   IN      UINT8                     AndData\r
   );\r
 \r
+\r
 /**\r
   Reads a bit field from an 8-bit value, performs a bitwise AND followed by a\r
   bitwise OR, and returns the result.\r
@@ -1760,7 +2500,7 @@ BitFieldAnd8 (
   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 or equal to StartBit, 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
@@ -1783,6 +2523,7 @@ BitFieldAndThenOr8 (
   IN      UINT8                     OrData\r
   );\r
 \r
+\r
 /**\r
   Returns a bit field from a 16-bit value.\r
 \r
@@ -1791,7 +2532,7 @@ BitFieldAndThenOr8 (
   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 or equal to StartBit, 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
@@ -1810,6 +2551,7 @@ BitFieldRead16 (
   IN      UINTN                     EndBit\r
   );\r
 \r
+\r
 /**\r
   Writes a bit field to a 16-bit value, and returns the result.\r
 \r
@@ -1820,7 +2562,7 @@ BitFieldRead16 (
   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 or equal to StartBit, 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
@@ -1841,6 +2583,7 @@ BitFieldWrite16 (
   IN      UINT16                    Value\r
   );\r
 \r
+\r
 /**\r
   Reads a bit field from a 16-bit value, performs a bitwise OR, and returns the\r
   result.\r
@@ -1852,7 +2595,7 @@ BitFieldWrite16 (
   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 or equal to StartBit, 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
@@ -1873,6 +2616,7 @@ BitFieldOr16 (
   IN      UINT16                    OrData\r
   );\r
 \r
+\r
 /**\r
   Reads a bit field from a 16-bit value, performs a bitwise AND, and returns\r
   the result.\r
@@ -1884,7 +2628,7 @@ BitFieldOr16 (
   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 or equal to StartBit, 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
@@ -1905,6 +2649,7 @@ BitFieldAnd16 (
   IN      UINT16                    AndData\r
   );\r
 \r
+\r
 /**\r
   Reads a bit field from a 16-bit value, performs a bitwise AND followed by a\r
   bitwise OR, and returns the result.\r
@@ -1917,7 +2662,7 @@ BitFieldAnd16 (
   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 or equal to StartBit, 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
@@ -1940,6 +2685,7 @@ BitFieldAndThenOr16 (
   IN      UINT16                    OrData\r
   );\r
 \r
+\r
 /**\r
   Returns a bit field from a 32-bit value.\r
 \r
@@ -1948,7 +2694,7 @@ BitFieldAndThenOr16 (
   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 or equal to StartBit, 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
@@ -1967,6 +2713,7 @@ BitFieldRead32 (
   IN      UINTN                     EndBit\r
   );\r
 \r
+\r
 /**\r
   Writes a bit field to a 32-bit value, and returns the result.\r
 \r
@@ -1977,7 +2724,7 @@ BitFieldRead32 (
   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 or equal to StartBit, 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
@@ -1998,6 +2745,7 @@ BitFieldWrite32 (
   IN      UINT32                    Value\r
   );\r
 \r
+\r
 /**\r
   Reads a bit field from a 32-bit value, performs a bitwise OR, and returns the\r
   result.\r
@@ -2009,7 +2757,7 @@ BitFieldWrite32 (
   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 or equal to StartBit, 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
@@ -2030,6 +2778,7 @@ BitFieldOr32 (
   IN      UINT32                    OrData\r
   );\r
 \r
+\r
 /**\r
   Reads a bit field from a 32-bit value, performs a bitwise AND, and returns\r
   the result.\r
@@ -2041,7 +2790,7 @@ BitFieldOr32 (
   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 or equal to StartBit, 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
@@ -2062,6 +2811,7 @@ BitFieldAnd32 (
   IN      UINT32                    AndData\r
   );\r
 \r
+\r
 /**\r
   Reads a bit field from a 32-bit value, performs a bitwise AND followed by a\r
   bitwise OR, and returns the result.\r
@@ -2074,7 +2824,7 @@ BitFieldAnd32 (
   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 or equal to StartBit, 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
@@ -2097,6 +2847,7 @@ BitFieldAndThenOr32 (
   IN      UINT32                    OrData\r
   );\r
 \r
+\r
 /**\r
   Returns a bit field from a 64-bit value.\r
 \r
@@ -2105,7 +2856,7 @@ BitFieldAndThenOr32 (
   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 or equal to StartBit, 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
@@ -2124,6 +2875,7 @@ BitFieldRead64 (
   IN      UINTN                     EndBit\r
   );\r
 \r
+\r
 /**\r
   Writes a bit field to a 64-bit value, and returns the result.\r
 \r
@@ -2134,7 +2886,7 @@ BitFieldRead64 (
   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 or equal to StartBit, 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
@@ -2155,6 +2907,7 @@ BitFieldWrite64 (
   IN      UINT64                    Value\r
   );\r
 \r
+\r
 /**\r
   Reads a bit field from a 64-bit value, performs a bitwise OR, and returns the\r
   result.\r
@@ -2166,7 +2919,7 @@ BitFieldWrite64 (
   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 or equal to StartBit, 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
@@ -2187,6 +2940,7 @@ BitFieldOr64 (
   IN      UINT64                    OrData\r
   );\r
 \r
+\r
 /**\r
   Reads a bit field from a 64-bit value, performs a bitwise AND, and returns\r
   the result.\r
@@ -2198,7 +2952,7 @@ BitFieldOr64 (
   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 or equal to StartBit, 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
@@ -2219,6 +2973,7 @@ BitFieldAnd64 (
   IN      UINT64                    AndData\r
   );\r
 \r
+\r
 /**\r
   Reads a bit field from a 64-bit value, performs a bitwise AND followed by a\r
   bitwise OR, and returns the result.\r
@@ -2231,7 +2986,7 @@ BitFieldAnd64 (
   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 or equal to StartBit, 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
@@ -2254,6 +3009,7 @@ BitFieldAndThenOr64 (
   IN      UINT64                    OrData\r
   );\r
 \r
+\r
 //\r
 // Base Library Synchronization Functions\r
 //\r
@@ -2280,6 +3036,7 @@ GetSpinLockProperties (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Initializes a spin lock to the released state and returns the spin lock.\r
 \r
@@ -2293,7 +3050,7 @@ GetSpinLockProperties (
   @param  SpinLock  A pointer to the spin lock to initialize to the released\r
                     state.\r
 \r
-  @return SpinLock\r
+  @return SpinLock in release state.\r
 \r
 **/\r
 SPIN_LOCK *\r
@@ -2302,6 +3059,7 @@ InitializeSpinLock (
   IN      SPIN_LOCK                 *SpinLock\r
   );\r
 \r
+\r
 /**\r
   Waits until a spin lock can be placed in the acquired state.\r
 \r
@@ -2319,7 +3077,7 @@ InitializeSpinLock (
 \r
   @param  SpinLock  A pointer to the spin lock to place in the acquired state.\r
 \r
-  @return SpinLock\r
+  @return SpinLock accquired lock.\r
 \r
 **/\r
 SPIN_LOCK *\r
@@ -2328,6 +3086,7 @@ AcquireSpinLock (
   IN      SPIN_LOCK                 *SpinLock\r
   );\r
 \r
+\r
 /**\r
   Attempts to place a spin lock in the acquired state.\r
 \r
@@ -2351,6 +3110,7 @@ AcquireSpinLockOrFail (
   IN      SPIN_LOCK                 *SpinLock\r
   );\r
 \r
+\r
 /**\r
   Releases a spin lock.\r
 \r
@@ -2362,7 +3122,7 @@ AcquireSpinLockOrFail (
 \r
   @param  SpinLock  A pointer to the spin lock to release.\r
 \r
-  @return SpinLock\r
+  @return SpinLock released lock.\r
 \r
 **/\r
 SPIN_LOCK *\r
@@ -2371,6 +3131,7 @@ ReleaseSpinLock (
   IN      SPIN_LOCK                 *SpinLock\r
   );\r
 \r
+\r
 /**\r
   Performs an atomic increment of an 32-bit unsigned integer.\r
 \r
@@ -2392,6 +3153,7 @@ InterlockedIncrement (
   IN      UINT32                    *Value\r
   );\r
 \r
+\r
 /**\r
   Performs an atomic decrement of an 32-bit unsigned integer.\r
 \r
@@ -2413,9 +3175,18 @@ InterlockedDecrement (
   IN      UINT32                    *Value\r
   );\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
@@ -2427,14 +3198,22 @@ InterlockedDecrement (
 UINT32\r
 EFIAPI\r
 InterlockedCompareExchange32 (\r
-  IN      UINT32                    *Value,\r
+  IN OUT  UINT32                    *Value,\r
   IN      UINT32                    CompareValue,\r
   IN      UINT32                    ExchangeValue\r
   );\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
@@ -2446,11 +3225,12 @@ InterlockedCompareExchange32 (
 UINT64\r
 EFIAPI\r
 InterlockedCompareExchange64 (\r
-  IN      UINT64                    *Value,\r
+  IN OUT  UINT64                    *Value,\r
   IN      UINT64                    CompareValue,\r
   IN      UINT64                    ExchangeValue\r
   );\r
 \r
+\r
 /**\r
   Performs an atomic compare exchange operation on a pointer value.\r
 \r
@@ -2467,27 +3247,252 @@ InterlockedCompareExchange64 (
   @param  CompareValue  Pointer value used in compare operation.\r
   @param  ExchangeValue Pointer value used in exchange operation.\r
 \r
+  @return The original *Value before exchange.\r
 **/\r
 VOID *\r
 EFIAPI\r
 InterlockedCompareExchangePointer (\r
-  IN      VOID                      **Value,\r
+  IN OUT  VOID                      **Value,\r
   IN      VOID                      *CompareValue,\r
   IN      VOID                      *ExchangeValue\r
   );\r
 \r
+\r
 //\r
-// Base Library CPU Functions\r
+// Base Library Checksum 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
+  Calculate the sum of all elements in a buffer in unit of UINT8.\r
+  During calculation, the carry bits are dropped.\r
+\r
+  This function calculates the sum of all elements in a buffer\r
+  in unit of UINT8. The carry bits in result of addition are dropped.\r
+  The result is returned as UINT8. If Length is Zero, then Zero is\r
+  returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the sum operation.\r
+  @param  Length           The size, in bytes, of Buffer .\r
+\r
+  @return Sum         The sum of Buffer with carry bits dropped during additions.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+CalculateSum8 (\r
+  IN      CONST UINT8                  *Buffer,\r
+  IN      UINTN                                      Length\r
+  );\r
+\r
+\r
+/**\r
+  Returns the two's complement checksum of all elements in a buffer\r
+  of 8-bit values.\r
+\r
+  This function first calculates the sum of the 8-bit values in the\r
+  buffer specified by Buffer and Length.  The carry bits in the result\r
+  of addition are dropped. Then, the two's complement of the sum is\r
+  returned.  If Length is 0, then 0 is returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the checksum operation.\r
+  @param  Length           The size, in bytes, of Buffer.\r
+\r
+  @return Checksum       The 2's complement checksum of Buffer.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+CalculateCheckSum8 (\r
+  IN      CONST UINT8                  *Buffer,\r
+  IN      UINTN                                      Length\r
+  );\r
+\r
+\r
+/**\r
+  Returns the sum of all elements in a buffer of 16-bit values.  During\r
+  calculation, the carry bits are dropped.\r
+\r
+  This function calculates the sum of the 16-bit values in the buffer\r
+  specified by Buffer and Length. The carry bits in result of addition are dropped.\r
+  The 16-bit result is returned.  If Length is 0, then 0 is returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the sum operation.\r
+  @param  Length           The size, in bytes, of Buffer.\r
+\r
+  @return Sum         The sum of Buffer with carry bits dropped during additions.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+CalculateSum16 (\r
+  IN      CONST UINT16                 *Buffer,\r
+  IN      UINTN                                      Length\r
+  );\r
+\r
+\r
+/**\r
+  Returns the two's complement checksum of all elements in a buffer of\r
+  16-bit values.\r
+\r
+  This function first calculates the sum of the 16-bit values in the buffer\r
+  specified by Buffer and Length.  The carry bits in the result of addition\r
+  are dropped. Then, the two's complement of the sum is returned.  If Length\r
+  is 0, then 0 is returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the checksum operation.\r
+  @param  Length           The size, in bytes, of Buffer.\r
+\r
+  @return Checksum       The 2's complement checksum of Buffer.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+CalculateCheckSum16 (\r
+  IN      CONST UINT16                 *Buffer,\r
+  IN      UINTN                                      Length\r
+  );\r
+\r
+\r
+/**\r
+  Returns the sum of all elements in a buffer of 32-bit values.  During\r
+  calculation, the carry bits are dropped.\r
+\r
+  This function calculates the sum of the 32-bit values in the buffer\r
+  specified by Buffer and Length. The carry bits in result of addition are dropped.\r
+  The 32-bit result is returned.  If Length is 0, then 0 is returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 32-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 32-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the sum operation.\r
+  @param  Length           The size, in bytes, of Buffer.\r
+\r
+  @return Sum         The sum of Buffer with carry bits dropped during additions.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+CalculateSum32 (\r
+  IN      CONST UINT32                 *Buffer,\r
+  IN      UINTN                                      Length\r
+  );\r
+\r
+\r
+/**\r
+  Returns the two's complement checksum of all elements in a buffer of\r
+  32-bit values.\r
+\r
+  This function first calculates the sum of the 32-bit values in the buffer\r
+  specified by Buffer and Length.  The carry bits in the result of addition\r
+  are dropped. Then, the two's complement of the sum is returned.  If Length\r
+  is 0, then 0 is returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 32-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 32-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the checksum operation.\r
+  @param  Length           The size, in bytes, of Buffer.\r
+\r
+  @return Checksum       The 2's complement checksum of Buffer.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+CalculateCheckSum32 (\r
+  IN      CONST UINT32                 *Buffer,\r
+  IN      UINTN                                      Length\r
+  );\r
+\r
+\r
+/**\r
+  Returns the sum of all elements in a buffer of 64-bit values.  During\r
+  calculation, the carry bits are dropped.\r
+\r
+  This function calculates the sum of the 64-bit values in the buffer\r
+  specified by Buffer and Length. The carry bits in result of addition are dropped.\r
+  The 64-bit result is returned.  If Length is 0, then 0 is returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 64-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 64-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the sum operation.\r
+  @param  Length           The size, in bytes, of Buffer.\r
+\r
+  @return Sum         The sum of Buffer with carry bits dropped during additions.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+CalculateSum64 (\r
+  IN      CONST UINT64                 *Buffer,\r
+  IN      UINTN                                      Length\r
+  );\r
+\r
+\r
+/**\r
+  Returns the two's complement checksum of all elements in a buffer of\r
+  64-bit values.\r
+\r
+  This function first calculates the sum of the 64-bit values in the buffer\r
+  specified by Buffer and Length.  The carry bits in the result of addition\r
+  are dropped. Then, the two's complement of the sum is returned.  If Length\r
+  is 0, then 0 is returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 64-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 64-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the checksum operation.\r
+  @param  Length           The size, in bytes, of Buffer.\r
+\r
+  @return Checksum       The 2's complement checksum of Buffer.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+CalculateCheckSum64 (\r
+  IN      CONST UINT64                 *Buffer,\r
+  IN      UINTN                                      Length\r
+  );\r
+\r
+\r
+//\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
+/**\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
@@ -2495,183 +3500,1393 @@ VOID
 **/\r
 VOID\r
 EFIAPI\r
-MemoryFence (\r
-  VOID\r
+MemoryFence (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Saves the current CPU context that can be restored with a call to LongJump()\r
+  and returns 0.\r
+\r
+  Saves the current CPU context in the buffer specified by JumpBuffer and\r
+  returns 0. The initial call to SetJump() must always return 0. Subsequent\r
+  calls to LongJump() cause a non-zero value to be returned by SetJump().\r
+\r
+  If JumpBuffer is NULL, then ASSERT().\r
+  For 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
+/**\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
+/**\r
+  Enables CPU interrupts.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+EnableInterrupts (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Disables CPU interrupts.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+DisableInterrupts (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Disables CPU interrupts and returns the interrupt state prior to the disable\r
+  operation.\r
+\r
+  @retval TRUE  CPU interrupts were enabled on entry to this call.\r
+  @retval FALSE CPU interrupts were disabled on entry to this call.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+SaveAndDisableInterrupts (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Enables CPU interrupts for the smallest window required to capture any\r
+  pending interrupts.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+EnableDisableInterrupts (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Retrieves the current CPU interrupt state.\r
+\r
+  Returns TRUE is interrupts are currently enabled. Otherwise\r
+  returns FALSE.\r
+\r
+  @retval TRUE  CPU interrupts are enabled.\r
+  @retval FALSE CPU interrupts are disabled.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+GetInterruptState (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Set the current CPU interrupt state.\r
+\r
+  Sets the current CPU interrupt state to the state specified by\r
+  InterruptState. If InterruptState is TRUE, then interrupts are enabled. If\r
+  InterruptState is FALSE, then interrupts are disabled. InterruptState is\r
+  returned.\r
+\r
+  @param  InterruptState  TRUE if interrupts should enabled. FALSE if\r
+                          interrupts should be disabled.\r
+\r
+  @return InterruptState\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+SetInterruptState (\r
+  IN      BOOLEAN                   InterruptState\r
+  );\r
+\r
+\r
+/**\r
+  Requests CPU to pause for a short period of time.\r
+\r
+  Requests CPU to pause for a short period of time. Typically used in MP\r
+  systems to prevent memory starvation while waiting for a spin lock.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+CpuPause (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Transfers control to a function starting with a new stack.\r
+\r
+  Transfers control to the function specified by EntryPoint using the\r
+  new stack specified by NewStack and passing in the parameters specified\r
+  by Context1 and Context2.  Context1 and Context2 are optional and may\r
+  be NULL.  The function EntryPoint must never return.  This function\r
+  supports a variable number of arguments following the NewStack parameter.\r
+  These additional arguments are ignored on IA-32, x64, and EBC.\r
+  IPF CPUs expect one additional parameter of type VOID * that specifies\r
+  the new backing store pointer.\r
+\r
+  If EntryPoint is NULL, then ASSERT().\r
+  If NewStack is NULL, then ASSERT().\r
+\r
+  @param  EntryPoint  A pointer to function to call with the new stack.\r
+  @param  Context1    A pointer to the context to pass into the EntryPoint\r
+                      function.\r
+  @param  Context2    A pointer to the context to pass into the EntryPoint\r
+                      function.\r
+  @param  NewStack    A pointer to the new stack to use for the EntryPoint\r
+                      function.\r
+  @param  ...         Extended parameters.\r
+\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SwitchStack (\r
+  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
+  IN      VOID                      *Context1,  OPTIONAL\r
+  IN      VOID                      *Context2,  OPTIONAL\r
+  IN      VOID                      *NewStack,\r
+  ...\r
+  );\r
+\r
+\r
+/**\r
+  Generates a breakpoint on the CPU.\r
+\r
+  Generates a breakpoint on the CPU. The breakpoint must be implemented such\r
+  that code can resume normal execution after the breakpoint.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+CpuBreakpoint (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Executes an infinite loop.\r
+\r
+  Forces the CPU to execute an infinite loop. A debugger may be used to skip\r
+  past the loop and the code that follows the loop must execute properly. This\r
+  implies that the infinite loop must not cause the code that follow it to be\r
+  optimized away.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+CpuDeadLoop (\r
+  VOID\r
+  );\r
+\r
+\r
+#if defined (MDE_CPU_IPF)\r
+\r
+/**\r
+  Flush a range of  cache lines in the cache coherency domain of the calling\r
+  CPU.\r
+\r
+  Invalidates the  cache lines specified by Address and Length. If Address is\r
+  not aligned on a cache line boundary, then entire cache line containing\r
+  Address is invalidated. If Address + Length is not aligned on a cache line\r
+  boundary, then the entire instruction cache line containing Address + Length\r
+  -1 is invalidated. This function may choose to invalidate the entire\r
+  instruction cache if that is more efficient than invalidating the specified\r
+  range. If Length is 0, the no instruction cache lines are invalidated.\r
+  Address is returned.\r
+\r
+  If Length is greater than (MAX_ADDRESS - Address + 1), then ASSERT().\r
+\r
+  @param  Address The base address of the instruction lines to invalidate. If\r
+                  the CPU is in a physical addressing mode, then Address is a\r
+                  physical address. If the CPU is in a virtual addressing mode,\r
+                  then Address is a virtual address.\r
+\r
+  @param  Length  The number of bytes to invalidate from the instruction cache.\r
+\r
+  @return Address\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+IpfFlushCacheRange (\r
+  IN      VOID                      *Address,\r
+  IN      UINTN                     Length\r
+  );\r
+\r
+\r
+/**\r
+  Executes a FC instruction\r
+  Executes a FC instruction on the cache line specified by Address.\r
+  The cache line size affected is at least 32-bytes (aligned on a 32-byte boundary).\r
+  An implementation may flush a larger region.  This function is only available on IPF.\r
+\r
+  @param Address       The Address of cache line to be flushed.\r
+\r
+  @return The address of FC instruction executed.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmFc (\r
+  IN  UINT64  Address\r
+  );\r
+\r
+\r
+/**\r
+  Executes a FC.I instruction.\r
+  Executes a FC.I instruction on the cache line specified by Address.\r
+  The cache line size affected is at least 32-bytes (aligned on a 32-byte boundary).\r
+  An implementation may flush a larger region.  This function is only available on IPF.\r
+\r
+  @param Address       The Address of cache line to be flushed.\r
+\r
+  @return The address of FC.I instruction executed.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmFci (\r
+  IN  UINT64  Address\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of a Processor Identifier Register (CPUID).\r
+  The Index of largest implemented CPUID (One less than the number of implemented CPUID\r
+  registers) is determined by CPUID [3] bits {7:0}.\r
+  No parameter checking is performed on Index.  If the Index value is beyond the\r
+  implemented CPUID register range, a Reserved Register/Field fault may occur.  The caller\r
+  must either guarantee that Index is valid, or the caller must set up fault handlers to\r
+  catch the faults.  This function is only available on IPF.\r
+\r
+  @param Index         The 8-bit Processor Identifier Register index to read.\r
+\r
+  @return The current value of Processor Identifier Register specified by Index.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadCpuid (\r
+  IN  UINT8   Index\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Processor Status Register (PSR).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of PSR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadPsr (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Processor Status Register (PSR).\r
+  No parameter checking is performed on Value.  All bits of Value corresponding to\r
+  reserved fields of PSR must be 0 or a Reserved Register/Field fault may occur.  The caller must either guarantee that Value is valid, or the caller must set up fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to PSR.\r
+\r
+  @return The 64-bit value written to the PSR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWritePsr (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #0 (KR0).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of KR0.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr0 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #1 (KR1).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of KR1.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr1 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #2 (KR2).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of KR2.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr2 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #3 (KR3).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of KR3.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr3 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #4 (KR4).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of KR4.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr4 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #5 (KR5).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of KR5.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr5 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #6 (KR6).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of KR6.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr6 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #7 (KR7).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of KR7.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr7 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #0 (KR0).\r
+  This function is only available on IPF.\r
+\r
+  @param  Value        The 64-bit value to write to KR0.\r
+\r
+  @return The 64-bit value written to the KR0.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr0 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #1 (KR1).\r
+  This function is only available on IPF.\r
+\r
+  @param  Value        The 64-bit value to write to KR1.\r
+\r
+  @return The 64-bit value written to the KR1.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr1 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #2 (KR2).\r
+  This function is only available on IPF.\r
+\r
+  @param  Value        The 64-bit value to write to KR2.\r
+\r
+  @return The 64-bit value written to the KR2.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr2 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #3 (KR3).\r
+  This function is only available on IPF.\r
+\r
+  @param  Value        The 64-bit value to write to KR3.\r
+\r
+  @return The 64-bit value written to the KR3.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr3 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #4 (KR4).\r
+  This function is only available on IPF.\r
+\r
+  @param  Value        The 64-bit value to write to KR4.\r
+\r
+  @return The 64-bit value written to the KR4.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr4 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #5 (KR5).\r
+  This function is only available on IPF.\r
+\r
+  @param  Value        The 64-bit value to write to KR5.\r
+\r
+  @return The 64-bit value written to the KR5.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr5 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #6 (KR6).\r
+  This function is only available on IPF.\r
+\r
+  @param  Value        The 64-bit value to write to KR6.\r
+\r
+  @return The 64-bit value written to the KR6.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr6 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #7 (KR7).\r
+  This function is only available on IPF.\r
+\r
+  @param  Value        The 64-bit value to write to KR7.\r
+\r
+  @return The 64-bit value written to the KR7.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr7 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Interval Timer Counter Register (ITC).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of ITC.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadItc (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Interval Timer Vector Register (ITV).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of ITV.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadItv (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Interval Timer Match Register (ITM).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of ITM.\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadItm (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Interval Timer Counter Register (ITC).\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to ITC.\r
+\r
+  @return The 64-bit value written to the ITC.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteItc (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Interval Timer Match Register (ITM).\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to ITM.\r
+\r
+  @return The 64-bit value written to the ITM.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteItm (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Interval Timer Vector Register (ITV).\r
+  No parameter checking is performed on Value.  All bits of Value corresponding to\r
+  reserved fields of ITV must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to ITV.\r
+\r
+  @return The 64-bit value written to the ITV.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteItv (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Default Control Register (DCR).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of DCR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadDcr (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Interruption Vector Address Register (IVA).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of IVA.\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadIva (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Page Table Address Register (PTA).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of PTA.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadPta (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Default Control Register (DCR).\r
+  No parameter checking is performed on Value.  All bits of Value corresponding to\r
+  reserved fields of DCR must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to DCR.\r
+\r
+  @return The 64-bit value written to the DCR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteDcr (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Interruption Vector Address Register (IVA).\r
+  The size of vector table is 32 K bytes and is 32 K bytes aligned\r
+  the low 15 bits of Value is ignored when written.\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to IVA.\r
+\r
+  @return The 64-bit value written to the IVA.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteIva (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Page Table Address Register (PTA).\r
+  No parameter checking is performed on Value.  All bits of Value corresponding to\r
+  reserved fields of DCR must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to PTA.\r
+\r
+  @return The 64-bit value written to the PTA.\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWritePta (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Local Interrupt ID Register (LID).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of LID.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadLid (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of External Interrupt Vector Register (IVR).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of IVR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadIvr (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Task Priority Register (TPR).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of TPR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadTpr (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of External Interrupt Request Register #0 (IRR0).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of IRR0.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadIrr0 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of External Interrupt Request Register #1 (IRR1).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of IRR1.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadIrr1 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of External Interrupt Request Register #2 (IRR2).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of IRR2.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadIrr2 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of External Interrupt Request Register #3 (IRR3).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of IRR3.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadIrr3 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Performance Monitor Vector Register (PMV).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of PMV.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadPmv (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Corrected Machine Check Vector Register (CMCV).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of CMCV.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadCmcv (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Local Redirection Register #0 (LRR0).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of LRR0.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadLrr0 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Local Redirection Register #1 (LRR1).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of LRR1.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadLrr1 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Page Local Interrupt ID Register (LID).\r
+  No parameter checking is performed on Value.  All bits of Value corresponding to\r
+  reserved fields of LID must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to LID.\r
+\r
+  @return The 64-bit value written to the LID.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteLid (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Task Priority Register (TPR).\r
+  No parameter checking is performed on Value.  All bits of Value corresponding to\r
+  reserved fields of TPR must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to TPR.\r
+\r
+  @return The 64-bit value written to the TPR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteTpr (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Performs a write operation on End OF External Interrupt Register (EOI).\r
+  Writes a value of 0 to the EOI Register.  This function is only available on IPF.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmWriteEoi (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Performance Monitor Vector Register (PMV).\r
+  No parameter checking is performed on Value.  All bits of Value corresponding\r
+  to reserved fields of PMV must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to PMV.\r
+\r
+  @return The 64-bit value written to the PMV.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWritePmv (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Corrected Machine Check Vector Register (CMCV).\r
+  No parameter checking is performed on Value.  All bits of Value corresponding\r
+  to reserved fields of CMCV must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to CMCV.\r
+\r
+  @return The 64-bit value written to the CMCV.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteCmcv (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Local Redirection Register #0 (LRR0).\r
+  No parameter checking is performed on Value.  All bits of Value corresponding\r
+  to reserved fields of LRR0 must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to LRR0.\r
+\r
+  @return The 64-bit value written to the LRR0.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteLrr0 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Local Redirection Register #1 (LRR1).\r
+  No parameter checking is performed on Value.  All bits of Value corresponding\r
+  to reserved fields of LRR1 must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must\r
+  set up fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to LRR1.\r
+\r
+  @return The 64-bit value written to the LRR1.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteLrr1 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Instruction Breakpoint Register (IBR).\r
+  \r
+  The Instruction Breakpoint Registers are used in pairs.  The even numbered\r
+  registers contain breakpoint addresses, and the odd numbered registers contain\r
+  breakpoint mask conditions.  At least 4 instruction registers pairs are implemented\r
+  on all processor models.   Implemented registers are contiguous starting with\r
+  register 0.  No parameter checking is performed on Index, and if the Index value\r
+  is beyond the implemented IBR register range, a Reserved Register/Field fault may\r
+  occur.  The caller must either guarantee that Index is valid, or the caller must\r
+  set up fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Index         The 8-bit Instruction Breakpoint Register index to read.\r
+\r
+  @return The current value of Instruction Breakpoint Register specified by Index.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadIbr (\r
+  IN  UINT8   Index\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Data Breakpoint Register (DBR).\r
+\r
+  The Data Breakpoint Registers are used in pairs.  The even numbered registers\r
+  contain breakpoint addresses, and odd numbered registers contain breakpoint\r
+  mask conditions.  At least 4 data registers pairs are implemented on all processor\r
+  models.  Implemented registers are contiguous starting with register 0.\r
+  No parameter checking is performed on Index.  If the Index value is beyond\r
+  the implemented DBR register range, a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Index is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Index         The 8-bit Data Breakpoint Register index to read.\r
+\r
+  @return The current value of Data Breakpoint Register specified by Index.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadDbr (\r
+  IN  UINT8   Index\r
   );\r
 \r
-/**\r
-  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
+  Reads the current value of Performance Monitor Configuration Register (PMC).\r
 \r
-  If JumpBuffer is NULL, then ASSERT().\r
+  All processor implementations provide at least 4 performance counters\r
+  (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter overflow\r
+  status registers (PMC [0]... PMC [3]).  Processor implementations may provide\r
+  additional implementation-dependent PMC and PMD to increase the number of\r
+  'generic' performance counters (PMC/PMD pairs).  The remainder of PMC and PMD\r
+  register set is implementation dependent.  No parameter checking is performed\r
+  on Index.  If the Index value is beyond the implemented PMC register range,\r
+  zero value will be returned.\r
+  This function is only available on IPF.\r
 \r
-  @param  JumpBuffer  A pointer to CPU context buffer.\r
+  @param Index         The 8-bit Performance Monitor Configuration Register index to read.\r
 \r
-  @retval 0 Indicates a return from SetJump().\r
+  @return The current value of Performance Monitor Configuration Register\r
+  specified by Index.\r
 \r
 **/\r
-UINTN\r
+UINT64\r
 EFIAPI\r
-SetJump (\r
-  OUT     BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer\r
+AsmReadPmc (\r
+  IN  UINT8   Index\r
   );\r
 \r
+\r
 /**\r
-  Restores the CPU context that was saved with SetJump().\r
+  Reads the current value of Performance Monitor Data Register (PMD).\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
+  All processor implementations provide at least 4 performance counters\r
+  (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter\r
+  overflow status registers (PMC [0]... PMC [3]).  Processor implementations may\r
+  provide additional implementation-dependent PMC and PMD to increase the number\r
+  of 'generic' performance counters (PMC/PMD pairs).  The remainder of PMC and PMD\r
+  register set is implementation dependent.  No parameter checking is performed\r
+  on Index.  If the Index value is beyond the implemented PMD register range,\r
+  zero value will be returned.\r
+  This function is only available on IPF.\r
 \r
-  If JumpBuffer is NULL, then ASSERT().\r
-  If Value is 0, then ASSERT().\r
+  @param Index         The 8-bit Performance Monitor Data Register index to read.\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
+  @return The current value of Performance Monitor Data Register specified by Index.\r
 \r
 **/\r
-VOID\r
+UINT64\r
 EFIAPI\r
-LongJump (\r
-  IN      BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer,\r
-  IN      UINTN                     Value\r
+AsmReadPmd (\r
+  IN  UINT8   Index\r
   );\r
 \r
+\r
 /**\r
-  Enables CPU interrupts.\r
+  Writes the current value of 64-bit Instruction Breakpoint Register (IBR).\r
 \r
-  Enables CPU interrupts.\r
+  Writes current value of Instruction Breakpoint Register specified by Index.\r
+  The Instruction Breakpoint Registers are used in pairs.  The even numbered\r
+  registers contain breakpoint addresses, and odd numbered registers contain\r
+  breakpoint mask conditions.  At least 4 instruction registers pairs are implemented\r
+  on all processor models.  Implemented registers are contiguous starting with\r
+  register 0.  No parameter checking is performed on Index.  If the Index value\r
+  is beyond the implemented IBR register range, a Reserved Register/Field fault may\r
+  occur.  The caller must either guarantee that Index is valid, or the caller must\r
+  set up fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Index         The 8-bit Instruction Breakpoint Register index to write.\r
+  @param Value         The 64-bit value to write to IBR.\r
+\r
+  @return The 64-bit value written to the IBR.\r
 \r
 **/\r
-VOID\r
+UINT64\r
 EFIAPI\r
-EnableInterrupts (\r
-  VOID\r
+AsmWriteIbr (\r
+  IN UINT8   Index,\r
+  IN UINT64  Value\r
   );\r
 \r
+\r
 /**\r
-  Disables CPU interrupts.\r
+  Writes the current value of 64-bit Data Breakpoint Register (DBR).\r
 \r
-  Disables CPU interrupts.\r
+  Writes current value of Data Breakpoint Register specified by Index.\r
+  The Data Breakpoint Registers are used in pairs.  The even numbered registers\r
+  contain breakpoint addresses, and odd numbered registers contain breakpoint\r
+  mask conditions.  At least 4 data registers pairs are implemented on all processor\r
+  models.  Implemented registers are contiguous starting with register 0.  No parameter\r
+  checking is performed on Index.  If the Index value is beyond the implemented\r
+  DBR register range, a Reserved Register/Field fault may occur.  The caller must\r
+  either guarantee that Index is valid, or the caller must set up fault handlers to\r
+  catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Index         The 8-bit Data Breakpoint Register index to write.\r
+  @param Value         The 64-bit value to write to DBR.\r
+\r
+  @return The 64-bit value written to the DBR.\r
 \r
 **/\r
-VOID\r
+UINT64\r
 EFIAPI\r
-DisableInterrupts (\r
-  VOID\r
+AsmWriteDbr (\r
+  IN UINT8   Index,\r
+  IN UINT64  Value\r
   );\r
 \r
+\r
 /**\r
-  Disables CPU interrupts and returns the interrupt state prior to the disable\r
-  operation.\r
+  Writes the current value of 64-bit Performance Monitor Configuration Register (PMC).\r
 \r
-  Disables CPU interrupts and returns the interrupt state prior to the disable\r
-  operation.\r
+  Writes current value of Performance Monitor Configuration Register specified by Index.\r
+  All processor implementations provide at least 4 performance counters\r
+  (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter overflow status\r
+  registers (PMC [0]... PMC [3]).  Processor implementations may provide additional\r
+  implementation-dependent PMC and PMD to increase the number of 'generic' performance\r
+  counters (PMC/PMD pairs).  The remainder of PMC and PMD register set is implementation\r
+  dependent.  No parameter checking is performed on Index.  If the Index value is\r
+  beyond the implemented PMC register range, the write is ignored.\r
+  This function is only available on IPF.\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
+  @param Index         The 8-bit Performance Monitor Configuration Register index to write.\r
+  @param Value         The 64-bit value to write to PMC.\r
+\r
+  @return The 64-bit value written to the PMC.\r
 \r
 **/\r
-BOOLEAN\r
+UINT64\r
 EFIAPI\r
-SaveAndDisableInterrupts (\r
-  VOID\r
+AsmWritePmc (\r
+  IN UINT8   Index,\r
+  IN UINT64  Value\r
   );\r
 \r
+\r
 /**\r
-  Enables CPU interrupts for the smallest window required to capture any\r
-  pending interrupts.\r
+  Writes the current value of 64-bit Performance Monitor Data Register (PMD).\r
 \r
-  Enables CPU interrupts for the smallest window required to capture any\r
-  pending interrupts.\r
+  Writes current value of Performance Monitor Data Register specified by Index.\r
+  All processor implementations provide at least 4 performance counters\r
+  (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter overflow\r
+  status registers (PMC [0]... PMC [3]).  Processor implementations may provide\r
+  additional implementation-dependent PMC and PMD to increase the number of 'generic'\r
+  performance counters (PMC/PMD pairs).  The remainder of PMC and PMD register set\r
+  is implementation dependent.  No parameter checking is performed on Index.  If the\r
+  Index value is beyond the implemented PMD register range, the write is ignored.\r
+  This function is only available on IPF.\r
+\r
+  @param Index         The 8-bit Performance Monitor Data Register index to write.\r
+  @param Value         The 64-bit value to write to PMD.\r
+\r
+  @return The 64-bit value written to the PMD.\r
 \r
 **/\r
-VOID\r
+UINT64\r
 EFIAPI\r
-EnableDisableInterrupts (\r
-  VOID\r
+AsmWritePmd (\r
+  IN UINT8   Index,\r
+  IN UINT64  Value\r
   );\r
 \r
+\r
 /**\r
-  Retrieves the current CPU interrupt state.\r
+  Reads the current value of 64-bit Global Pointer (GP).\r
 \r
-  Retrieves the current CPU interrupt state. Returns TRUE is interrupts are\r
-  currently enabled. Otherwise returns FALSE.\r
+  Reads and returns the current value of GP.\r
+  This function is only available on IPF.\r
 \r
-  @retval TRUE  CPU interrupts are enabled.\r
-  @retval FALSE CPU interrupts are disabled.\r
+  @return The current value of GP.\r
 \r
 **/\r
-BOOLEAN\r
+UINT64\r
 EFIAPI\r
-GetInterruptState (\r
+AsmReadGp (\r
   VOID\r
   );\r
 \r
+\r
 /**\r
-  Set the current CPU interrupt state.\r
+  Write the current value of 64-bit Global Pointer (GP).\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
+  Writes the current value of GP. The 64-bit value written to the GP is returned.\r
+  No parameter checking is performed on Value.\r
+  This function is only available on IPF.\r
 \r
-  @param  InterruptState  TRUE if interrupts should enabled. FALSE if\r
-                          interrupts should be disabled.\r
+  @param Value  The 64-bit value to write to GP.\r
 \r
-  @return InterruptState\r
+  @return The 64-bit value written to the GP.\r
 \r
 **/\r
-BOOLEAN\r
+UINT64\r
 EFIAPI\r
-SetInterruptState (\r
-  IN      BOOLEAN                   InterruptState\r
+AsmWriteGp (\r
+  IN UINT64  Value\r
   );\r
 \r
+\r
 /**\r
-  Places the CPU in a sleep state until an interrupt is received.\r
+  Reads the current value of 64-bit Stack Pointer (SP).\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
+  Reads and returns the current value of SP.\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of SP.\r
 \r
 **/\r
-VOID\r
+UINT64\r
 EFIAPI\r
-CpuSleep (\r
+AsmReadSp (\r
   VOID\r
   );\r
 \r
+\r
 /**\r
-  Requests CPU to pause for a short period of time.\r
+  Determines if the CPU is currently executing in virtual, physical, or mixed mode.\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
+  Determines the current execution mode of the CPU.\r
+  If the CPU is in virtual mode(PSR.RT=1, PSR.DT=1, PSR.IT=1), then 1 is returned.\r
+  If the CPU is in physical mode(PSR.RT=0, PSR.DT=0, PSR.IT=0), then 0 is returned.\r
+  If the CPU is not in physical mode or virtual mode, then it is in mixed mode,\r
+  and -1 is returned.\r
+  This function is only available on IPF.\r
+\r
+  @return  1  The CPU is in virtual mode.\r
+  @return  0  The CPU is in physical mode.\r
+  @return -1  The CPU is in mixed mode.\r
 \r
 **/\r
-VOID\r
+INT64\r
 EFIAPI\r
-CpuPause (\r
+AsmCpuVirtual (\r
   VOID\r
   );\r
 \r
+\r
 /**\r
-  Flushes all the Translation Lookaside Buffers(TLB) entries in a CPU.\r
+  Makes a PAL procedure call.\r
+\r
+  This is a wrapper function to make a PAL procedure call.  Based on the Index\r
+  value this API will make static or stacked PAL call.  The following table\r
+  describes the usage of PAL Procedure Index Assignment. Architected procedures\r
+  may be designated as required or optional.  If a PAL procedure is specified\r
+  as optional, a unique return code of 0xFFFFFFFFFFFFFFFF is returned in the\r
+  Status field of the PAL_CALL_RETURN structure.\r
+  This indicates that the procedure is not present in this PAL implementation.\r
+  It is the caller's responsibility to check for this return code after calling\r
+  any optional PAL procedure.\r
+  No parameter checking is performed on the 5 input parameters, but there are\r
+  some common rules that the caller should follow when making a PAL call.  Any\r
+  address passed to PAL as buffers for return parameters must be 8-byte aligned.\r
+  Unaligned addresses may cause undefined results.  For those parameters defined\r
+  as reserved or some fields defined as reserved must be zero filled or the invalid\r
+  argument return value may be returned or undefined result may occur during the\r
+  execution of the procedure.  If the PalEntryPoint  does not point to a valid\r
+  PAL entry point then the system behavior is undefined.  This function is only\r
+  available on IPF.\r
+\r
+  @param PalEntryPoint The PAL procedure calls entry point.\r
+  @param Index                     The PAL procedure Index number.\r
+  @param Arg2                        The 2nd parameter for PAL procedure calls.\r
+  @param Arg3                        The 3rd parameter for PAL procedure calls.\r
+  @param Arg4                        The 4th parameter for PAL procedure calls.\r
 \r
-  Flushes all the Translation Lookaside Buffers(TLB) entries in a CPU.\r
+  @return structure returned from the PAL Call procedure, including the status and return value.\r
 \r
 **/\r
-VOID\r
+PAL_CALL_RETURN\r
 EFIAPI\r
-CpuFlushTlb (\r
-  VOID\r
+AsmPalCall (\r
+  IN UINT64  PalEntryPoint,\r
+  IN UINT64  Index,\r
+  IN UINT64  Arg2,\r
+  IN UINT64  Arg3,\r
+  IN UINT64  Arg4\r
   );\r
 \r
+\r
 /**\r
   Transfers control to a function starting with a new stack.\r
 \r
@@ -2690,45 +4905,51 @@ CpuFlushTlb (
                       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
-SwitchStack (\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                      *NewStack,\r
+  IN      VOID                      *NewBsp\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
+// Bugbug: This call should be removed after\r
+//         the PalCall Instance issue has been fixed.\r
+//\r
+/**\r
+  Performs a PAL call using static calling convention.\r
 \r
-**/\r
-VOID\r
-EFIAPI\r
-CpuBreakpoint (\r
-  VOID\r
-  );\r
+  An internal function to perform a PAL call using static calling convention.\r
 \r
-/**\r
-  Executes an infinite loop.\r
+  @param  PalEntryPoint The entry point address of PAL. The address in ar.kr5\r
+                        would be used if this parameter were NULL on input.\r
+  @param  Arg1          The first argument of a PAL call.\r
+  @param  Arg2          The second argument of a PAL call.\r
+  @param  Arg3          The third argument of a PAL call.\r
+  @param  Arg4          The fourth argument of a PAL call.\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
+  @return The values returned in r8, r9, r10 and r11.\r
 \r
 **/\r
-VOID\r
-EFIAPI\r
-CpuDeadLoop (\r
-  VOID\r
+PAL_CALL_RETURN\r
+PalCallStatic (\r
+  IN      CONST VOID                *PalEntryPoint,\r
+  IN      UINT64                    Arg1,\r
+  IN      UINT64                    Arg2,\r
+  IN      UINT64                    Arg3,\r
+  IN      UINT64                    Arg4\r
   );\r
 \r
+\r
+#elif defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)\r
 //\r
 // IA32 and X64 Specific Functions\r
 //\r
@@ -2847,10 +5068,12 @@ typedef union {
 // 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
@@ -2994,6 +5217,51 @@ AsmCpuid (
   OUT     UINT32                    *Edx   OPTIONAL\r
   );\r
 \r
+\r
+/**\r
+  Retrieves CPUID information using an extended leaf identifier.\r
+\r
+  Executes the CPUID instruction with EAX set to the value specified by Index\r
+  and ECX set to the value specified by SubIndex. This function always returns\r
+  Index. This function is only available on IA-32 and x64.\r
+\r
+  If Eax is not NULL, then the value of EAX after CPUID is returned in Eax.\r
+  If Ebx is not NULL, then the value of EBX after CPUID is returned in Ebx.\r
+  If Ecx is not NULL, then the value of ECX after CPUID is returned in Ecx.\r
+  If Edx is not NULL, then the value of EDX after CPUID is returned in Edx.\r
+\r
+  @param  Index     The 32-bit value to load into EAX prior to invoking the\r
+                    CPUID instruction.\r
+  @param  SubIndex  The 32-bit value to load into ECX prior to invoking the\r
+                    CPUID instruction.\r
+  @param  Eax       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
 /**\r
   Returns the lower 32-bits of a Machine Specific Register(MSR).\r
 \r
@@ -3014,6 +5282,7 @@ AsmReadMsr32 (
   IN      UINT32                    Index\r
   );\r
 \r
+\r
 /**\r
   Zero-extend a 32-bit value and writes it to a Machine Specific Register(MSR).\r
 \r
@@ -3037,6 +5306,7 @@ AsmWriteMsr32 (
   IN      UINT32                    Value\r
   );\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
@@ -3063,6 +5333,7 @@ AsmMsrOr32 (
   IN      UINT32                    OrData\r
   );\r
 \r
+\r
 /**\r
   Reads a 64-bit MSR, performs a bitwise AND on the lower 32-bits, and writes\r
   the result back to the 64-bit MSR.\r
@@ -3089,6 +5360,7 @@ AsmMsrAnd32 (
   IN      UINT32                    AndData\r
   );\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
@@ -3119,6 +5391,7 @@ AsmMsrAndThenOr32 (
   IN      UINT32                    OrData\r
   );\r
 \r
+\r
 /**\r
   Reads a bit field of an MSR.\r
 \r
@@ -3130,7 +5403,7 @@ AsmMsrAndThenOr32 (
 \r
   If StartBit is greater than 31, then ASSERT().\r
   If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than or equal to StartBit, 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
@@ -3149,6 +5422,7 @@ AsmMsrBitFieldRead32 (
   IN      UINTN                     EndBit\r
   );\r
 \r
+\r
 /**\r
   Writes a bit field to an MSR.\r
 \r
@@ -3162,7 +5436,7 @@ AsmMsrBitFieldRead32 (
 \r
   If StartBit is greater than 31, then ASSERT().\r
   If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than or equal to StartBit, 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
@@ -3183,6 +5457,7 @@ AsmMsrBitFieldWrite32 (
   IN      UINT32                    Value\r
   );\r
 \r
+\r
 /**\r
   Reads a bit field in a 64-bit MSR, performs a bitwise OR, and writes the\r
   result back to the bit field in the 64-bit MSR.\r
@@ -3197,7 +5472,7 @@ AsmMsrBitFieldWrite32 (
 \r
   If StartBit is greater than 31, then ASSERT().\r
   If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than or equal to StartBit, 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
@@ -3218,6 +5493,7 @@ AsmMsrBitFieldOr32 (
   IN      UINT32                    OrData\r
   );\r
 \r
+\r
 /**\r
   Reads a bit field in a 64-bit MSR, performs a bitwise AND, and writes the\r
   result back to the bit field in the 64-bit MSR.\r
@@ -3232,7 +5508,7 @@ AsmMsrBitFieldOr32 (
 \r
   If StartBit is greater than 31, then ASSERT().\r
   If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than or equal to StartBit, 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
@@ -3253,6 +5529,7 @@ AsmMsrBitFieldAnd32 (
   IN      UINT32                    AndData\r
   );\r
 \r
+\r
 /**\r
   Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a\r
   bitwise inclusive OR, and writes the result back to the bit field in the\r
@@ -3269,7 +5546,7 @@ AsmMsrBitFieldAnd32 (
 \r
   If StartBit is greater than 31, then ASSERT().\r
   If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than or equal to StartBit, 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
@@ -3292,6 +5569,7 @@ AsmMsrBitFieldAndThenOr32 (
   IN      UINT32                    OrData\r
   );\r
 \r
+\r
 /**\r
   Returns a 64-bit Machine Specific Register(MSR).\r
 \r
@@ -3312,6 +5590,7 @@ AsmReadMsr64 (
   IN      UINT32                    Index\r
   );\r
 \r
+\r
 /**\r
   Writes a 64-bit value to a Machine Specific Register(MSR), and returns the\r
   value.\r
@@ -3336,6 +5615,7 @@ AsmWriteMsr64 (
   IN      UINT64                    Value\r
   );\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
@@ -3361,6 +5641,7 @@ AsmMsrOr64 (
   IN      UINT64                    OrData\r
   );\r
 \r
+\r
 /**\r
   Reads a 64-bit MSR, performs a bitwise AND, and writes the result back to the\r
   64-bit MSR.\r
@@ -3386,6 +5667,7 @@ AsmMsrAnd64 (
   IN      UINT64                    AndData\r
   );\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
@@ -3415,6 +5697,7 @@ AsmMsrAndThenOr64 (
   IN      UINT64                    OrData\r
   );\r
 \r
+\r
 /**\r
   Reads a bit field of an MSR.\r
 \r
@@ -3426,7 +5709,7 @@ AsmMsrAndThenOr64 (
 \r
   If StartBit is greater than 63, then ASSERT().\r
   If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than or equal to StartBit, 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
@@ -3445,6 +5728,7 @@ AsmMsrBitFieldRead64 (
   IN      UINTN                     EndBit\r
   );\r
 \r
+\r
 /**\r
   Writes a bit field to an MSR.\r
 \r
@@ -3457,7 +5741,7 @@ AsmMsrBitFieldRead64 (
 \r
   If StartBit is greater than 63, then ASSERT().\r
   If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than or equal to StartBit, 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
@@ -3478,6 +5762,7 @@ AsmMsrBitFieldWrite64 (
   IN      UINT64                    Value\r
   );\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
@@ -3492,7 +5777,7 @@ AsmMsrBitFieldWrite64 (
 \r
   If StartBit is greater than 63, then ASSERT().\r
   If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than or equal to StartBit, 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
@@ -3513,6 +5798,7 @@ AsmMsrBitFieldOr64 (
   IN      UINT64                    OrData\r
   );\r
 \r
+\r
 /**\r
   Reads a bit field in a 64-bit MSR, performs a bitwise AND, and writes the\r
   result back to the bit field in the 64-bit MSR.\r
@@ -3527,7 +5813,7 @@ AsmMsrBitFieldOr64 (
 \r
   If StartBit is greater than 63, then ASSERT().\r
   If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than or equal to StartBit, 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
@@ -3548,6 +5834,7 @@ AsmMsrBitFieldAnd64 (
   IN      UINT64                    AndData\r
   );\r
 \r
+\r
 /**\r
   Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a\r
   bitwise inclusive OR, and writes the result back to the bit field in the\r
@@ -3563,7 +5850,7 @@ AsmMsrBitFieldAnd64 (
 \r
   If StartBit is greater than 63, then ASSERT().\r
   If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than or equal to StartBit, 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
@@ -3586,6 +5873,7 @@ AsmMsrBitFieldAndThenOr64 (
   IN      UINT64                    OrData\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of the EFLAGS register.\r
 \r
@@ -3602,6 +5890,7 @@ AsmReadEflags (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of the Control Register 0 (CR0).\r
 \r
@@ -3618,6 +5907,7 @@ AsmReadCr0 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of the Control Register 2 (CR2).\r
 \r
@@ -3634,6 +5924,7 @@ AsmReadCr2 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of the Control Register 3 (CR3).\r
 \r
@@ -3650,6 +5941,7 @@ AsmReadCr3 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of the Control Register 4 (CR4).\r
 \r
@@ -3666,6 +5958,7 @@ AsmReadCr4 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Control Register 0 (CR0).\r
 \r
@@ -3683,6 +5976,7 @@ AsmWriteCr0 (
   UINTN  Cr0\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Control Register 2 (CR2).\r
 \r
@@ -3700,6 +5994,7 @@ AsmWriteCr2 (
   UINTN  Cr2\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Control Register 3 (CR3).\r
 \r
@@ -3717,6 +6012,7 @@ AsmWriteCr3 (
   UINTN  Cr3\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Control Register 4 (CR4).\r
 \r
@@ -3734,6 +6030,7 @@ AsmWriteCr4 (
   UINTN  Cr4\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Debug Register 0 (DR0).\r
 \r
@@ -3750,6 +6047,7 @@ AsmReadDr0 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Debug Register 1 (DR1).\r
 \r
@@ -3766,6 +6064,7 @@ AsmReadDr1 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Debug Register 2 (DR2).\r
 \r
@@ -3782,6 +6081,7 @@ AsmReadDr2 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Debug Register 3 (DR3).\r
 \r
@@ -3798,6 +6098,7 @@ AsmReadDr3 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Debug Register 4 (DR4).\r
 \r
@@ -3814,6 +6115,7 @@ AsmReadDr4 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Debug Register 5 (DR5).\r
 \r
@@ -3830,6 +6132,7 @@ AsmReadDr5 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Debug Register 6 (DR6).\r
 \r
@@ -3846,6 +6149,7 @@ AsmReadDr6 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Debug Register 7 (DR7).\r
 \r
@@ -3862,6 +6166,7 @@ AsmReadDr7 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Debug Register 0 (DR0).\r
 \r
@@ -3879,6 +6184,7 @@ AsmWriteDr0 (
   UINTN  Dr0\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Debug Register 1 (DR1).\r
 \r
@@ -3896,6 +6202,7 @@ AsmWriteDr1 (
   UINTN  Dr1\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Debug Register 2 (DR2).\r
 \r
@@ -3913,6 +6220,7 @@ AsmWriteDr2 (
   UINTN  Dr2\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Debug Register 3 (DR3).\r
 \r
@@ -3930,6 +6238,7 @@ AsmWriteDr3 (
   UINTN  Dr3\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Debug Register 4 (DR4).\r
 \r
@@ -3947,6 +6256,7 @@ AsmWriteDr4 (
   UINTN  Dr4\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Debug Register 5 (DR5).\r
 \r
@@ -3964,6 +6274,7 @@ AsmWriteDr5 (
   UINTN  Dr5\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Debug Register 6 (DR6).\r
 \r
@@ -3981,6 +6292,7 @@ AsmWriteDr6 (
   UINTN  Dr6\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Debug Register 7 (DR7).\r
 \r
@@ -3998,6 +6310,7 @@ AsmWriteDr7 (
   UINTN  Dr7\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Code Segment Register (CS).\r
 \r
@@ -4013,6 +6326,7 @@ AsmReadCs (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Data Segment Register (DS).\r
 \r
@@ -4028,6 +6342,7 @@ AsmReadDs (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Extra Segment Register (ES).\r
 \r
@@ -4043,6 +6358,7 @@ AsmReadEs (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of FS Data Segment Register (FS).\r
 \r
@@ -4058,6 +6374,7 @@ AsmReadFs (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of GS Data Segment Register (GS).\r
 \r
@@ -4073,6 +6390,7 @@ AsmReadGs (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Stack Segment Register (SS).\r
 \r
@@ -4088,6 +6406,7 @@ AsmReadSs (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Task Register (TR).\r
 \r
@@ -4103,6 +6422,7 @@ AsmReadTr (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current Global Descriptor Table Register(GDTR) descriptor.\r
 \r
@@ -4120,6 +6440,7 @@ AsmReadGdtr (
   OUT     IA32_DESCRIPTOR           *Gdtr\r
   );\r
 \r
+\r
 /**\r
   Writes the current Global Descriptor Table Register (GDTR) descriptor.\r
 \r
@@ -4137,6 +6458,7 @@ AsmWriteGdtr (
   IN      CONST IA32_DESCRIPTOR     *Gdtr\r
   );\r
 \r
+\r
 /**\r
   Reads the current Interrupt Descriptor Table Register(GDTR) descriptor.\r
 \r
@@ -4154,6 +6476,7 @@ AsmReadIdtr (
   OUT     IA32_DESCRIPTOR           *Idtr\r
   );\r
 \r
+\r
 /**\r
   Writes the current Interrupt Descriptor Table Register(GDTR) descriptor.\r
 \r
@@ -4171,6 +6494,7 @@ AsmWriteIdtr (
   IN      CONST IA32_DESCRIPTOR     *Idtr\r
   );\r
 \r
+\r
 /**\r
   Reads the current Local Descriptor Table Register(LDTR) selector.\r
 \r
@@ -4186,6 +6510,7 @@ AsmReadLdtr (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Writes the current Local Descriptor Table Register (GDTR) selector.\r
 \r
@@ -4201,6 +6526,7 @@ AsmWriteLdtr (
   IN      UINT16                    Ldtr\r
   );\r
 \r
+\r
 /**\r
   Save the current floating point/SSE/SSE2 context to a buffer.\r
 \r
@@ -4220,6 +6546,7 @@ AsmFxSave (
   OUT     IA32_FX_BUFFER            *Buffer\r
   );\r
 \r
+\r
 /**\r
   Restores the current floating point/SSE/SSE2 context from a buffer.\r
 \r
@@ -4240,6 +6567,7 @@ AsmFxRestore (
   IN      CONST IA32_FX_BUFFER      *Buffer\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of 64-bit MMX Register #0 (MM0).\r
 \r
@@ -4255,6 +6583,7 @@ AsmReadMm0 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of 64-bit MMX Register #1 (MM1).\r
 \r
@@ -4270,6 +6599,7 @@ AsmReadMm1 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of 64-bit MMX Register #2 (MM2).\r
 \r
@@ -4285,6 +6615,7 @@ AsmReadMm2 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of 64-bit MMX Register #3 (MM3).\r
 \r
@@ -4300,6 +6631,7 @@ AsmReadMm3 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of 64-bit MMX Register #4 (MM4).\r
 \r
@@ -4315,6 +6647,7 @@ AsmReadMm4 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of 64-bit MMX Register #5 (MM5).\r
 \r
@@ -4330,6 +6663,7 @@ AsmReadMm5 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of 64-bit MMX Register #6 (MM6).\r
 \r
@@ -4345,6 +6679,7 @@ AsmReadMm6 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of 64-bit MMX Register #7 (MM7).\r
 \r
@@ -4360,6 +6695,7 @@ AsmReadMm7 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Writes the current value of 64-bit MMX Register #0 (MM0).\r
 \r
@@ -4375,6 +6711,7 @@ AsmWriteMm0 (
   IN      UINT64                    Value\r
   );\r
 \r
+\r
 /**\r
   Writes the current value of 64-bit MMX Register #1 (MM1).\r
 \r
@@ -4390,6 +6727,7 @@ AsmWriteMm1 (
   IN      UINT64                    Value\r
   );\r
 \r
+\r
 /**\r
   Writes the current value of 64-bit MMX Register #2 (MM2).\r
 \r
@@ -4405,6 +6743,7 @@ AsmWriteMm2 (
   IN      UINT64                    Value\r
   );\r
 \r
+\r
 /**\r
   Writes the current value of 64-bit MMX Register #3 (MM3).\r
 \r
@@ -4420,6 +6759,7 @@ AsmWriteMm3 (
   IN      UINT64                    Value\r
   );\r
 \r
+\r
 /**\r
   Writes the current value of 64-bit MMX Register #4 (MM4).\r
 \r
@@ -4435,6 +6775,7 @@ AsmWriteMm4 (
   IN      UINT64                    Value\r
   );\r
 \r
+\r
 /**\r
   Writes the current value of 64-bit MMX Register #5 (MM5).\r
 \r
@@ -4450,6 +6791,7 @@ AsmWriteMm5 (
   IN      UINT64                    Value\r
   );\r
 \r
+\r
 /**\r
   Writes the current value of 64-bit MMX Register #6 (MM6).\r
 \r
@@ -4465,6 +6807,7 @@ AsmWriteMm6 (
   IN      UINT64                    Value\r
   );\r
 \r
+\r
 /**\r
   Writes the current value of 64-bit MMX Register #7 (MM7).\r
 \r
@@ -4480,6 +6823,7 @@ AsmWriteMm7 (
   IN      UINT64                    Value\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Time Stamp Counter (TSC).\r
 \r
@@ -4495,6 +6839,7 @@ AsmReadTsc (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of a Performance Counter (PMC).\r
 \r
@@ -4512,6 +6857,7 @@ AsmReadPmc (
   IN      UINT32                    Index\r
   );\r
 \r
+\r
 /**\r
   Sets up a monitor buffer that is used by AsmMwait().\r
 \r
@@ -4536,6 +6882,7 @@ AsmMonitor (
   IN      UINTN                     Edx\r
   );\r
 \r
+\r
 /**\r
   Executes an MWAIT instruction.\r
 \r
@@ -4557,6 +6904,7 @@ AsmMwait (
   IN      UINTN                     Ecx\r
   );\r
 \r
+\r
 /**\r
   Executes a WBINVD instruction.\r
 \r
@@ -4570,6 +6918,7 @@ AsmWbinvd (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Executes a INVD instruction.\r
 \r
@@ -4583,6 +6932,7 @@ AsmInvd (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Flushes a cache line from all the instruction and data caches within the\r
   coherency domain of the CPU.\r
@@ -4604,6 +6954,7 @@ AsmFlushCacheLine (
   IN      VOID                      *LinearAddress\r
   );\r
 \r
+\r
 /**\r
   Enables the 32-bit paging mode on the CPU.\r
 \r
@@ -4650,6 +7001,7 @@ AsmEnablePaging32 (
   IN      VOID                      *NewStack\r
   );\r
 \r
+\r
 /**\r
   Disables the 32-bit paging mode on the CPU.\r
 \r
@@ -4693,6 +7045,7 @@ AsmDisablePaging32 (
   IN      VOID                      *NewStack\r
   );\r
 \r
+\r
 /**\r
   Enables the 64-bit paging mode on the CPU.\r
 \r
@@ -4710,7 +7063,7 @@ AsmDisablePaging32 (
   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
+  @param  CodeSelector 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
@@ -4735,6 +7088,7 @@ AsmEnablePaging64 (
   IN      UINT64                    NewStack\r
   );\r
 \r
+\r
 /**\r
   Disables the 64-bit paging mode on the CPU.\r
 \r
@@ -4750,7 +7104,7 @@ AsmEnablePaging64 (
   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
+  @param  CodeSelector 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
@@ -4775,6 +7129,7 @@ AsmDisablePaging64 (
   IN      UINT32                    NewStack\r
   );\r
 \r
+\r
 //\r
 // 16-bit thunking services\r
 //\r
@@ -4807,6 +7162,7 @@ AsmGetThunk16Properties (
   OUT     UINT32                    *ExtraStackSize\r
   );\r
 \r
+\r
 /**\r
   Prepares all structures a code required to use AsmThunk16().\r
 \r
@@ -4824,6 +7180,7 @@ AsmPrepareThunk16 (
   OUT     THUNK_CONTEXT             *ThunkContext\r
   );\r
 \r
+\r
 /**\r
   Transfers control to a 16-bit real mode entry point and returns the results.\r
 \r
@@ -4844,6 +7201,7 @@ AsmThunk16 (
   IN OUT  THUNK_CONTEXT             *ThunkContext\r
   );\r
 \r
+\r
 /**\r
   Prepares all structures and code for a 16-bit real mode thunk, transfers\r
   control to a 16-bit real mode entry point, and returns the results.\r
@@ -4867,4 +7225,10 @@ AsmPrepareAndThunk16 (
   IN OUT  THUNK_CONTEXT             *ThunkContext\r
   );\r
 \r
+#else\r
+\r
 #endif\r
+\r
+#endif\r
+\r
+\r