]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Include/Library/BaseLib.h
Modify MDE source code according to MDE library update.
[mirror_edk2.git] / MdePkg / Include / Library / BaseLib.h
index ff663c91b7eff435f42063295b37022e5a93d6a8..24f93c9bb140226cd449a520bc53ccfeb13c6796 100644 (file)
@@ -1,36 +1,32 @@
 /** @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 - 2008, 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
 #ifndef __BASE_LIB__\r
 #define __BASE_LIB__\r
 \r
-//\r
-// Definitions for architecture specific types\r
-// These include SPIN_LOCK and BASE_LIBRARY_JUMP_BUFFER\r
-//\r
+///\r
+/// Definitions for SPIN_LOCK\r
+///\r
+typedef volatile UINTN              SPIN_LOCK;\r
 \r
 //\r
-// SPIN_LOCK\r
+// Definitions for architecture specific types\r
 //\r
-typedef UINTN                       SPIN_LOCK;\r
-\r
 #if   defined (MDE_CPU_IA32)\r
-//\r
-// IA32 context buffer used by SetJump() and LongJump()\r
-//\r
+///\r
+/// IA32 context buffer used by SetJump() and LongJump()\r
+///\r
 typedef struct {\r
   UINT32                            Ebx;\r
   UINT32                            Esi;\r
@@ -40,76 +36,60 @@ 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                            InitialUNAT;\r
-  UINT64                            AfterSpillUNAT;\r
-  UINT64                            PFS;\r
-  UINT64                            BSP;\r
-  UINT64                            RNAT;\r
-  UINT64                            Predicates;\r
-  UINT64                            LoopCount;\r
+  UINT64                            F2[2];\r
+  UINT64                            F3[2];\r
+  UINT64                            F4[2];\r
+  UINT64                            F5[2];\r
+  UINT64                            F16[2];\r
+  UINT64                            F17[2];\r
+  UINT64                            F18[2];\r
+  UINT64                            F19[2];\r
+  UINT64                            F20[2];\r
+  UINT64                            F21[2];\r
+  UINT64                            F22[2];\r
+  UINT64                            F23[2];\r
+  UINT64                            F24[2];\r
+  UINT64                            F25[2];\r
+  UINT64                            F26[2];\r
+  UINT64                            F27[2];\r
+  UINT64                            F28[2];\r
+  UINT64                            F29[2];\r
+  UINT64                            F30[2];\r
+  UINT64                            F31[2];\r
   UINT64                            R4;\r
   UINT64                            R5;\r
   UINT64                            R6;\r
   UINT64                            R7;\r
   UINT64                            SP;\r
-  UINT64                            F2Low;\r
-  UINT64                            F2High;\r
-  UINT64                            F3Low;\r
-  UINT64                            F3High;\r
-  UINT64                            F4Low;\r
-  UINT64                            F4High;\r
-  UINT64                            F5Low;\r
-  UINT64                            F5High;\r
-  UINT64                            F16Low;\r
-  UINT64                            F16High;\r
-  UINT64                            F17Low;\r
-  UINT64                            F17High;\r
-  UINT64                            F18Low;\r
-  UINT64                            F18High;\r
-  UINT64                            F19Low;\r
-  UINT64                            F19High;\r
-  UINT64                            F20Low;\r
-  UINT64                            F20High;\r
-  UINT64                            F21Low;\r
-  UINT64                            F21High;\r
-  UINT64                            F22Low;\r
-  UINT64                            F22High;\r
-  UINT64                            F23Low;\r
-  UINT64                            F23High;\r
-  UINT64                            F24Low;\r
-  UINT64                            F24High;\r
-  UINT64                            F25Low;\r
-  UINT64                            F25High;\r
-  UINT64                            F26Low;\r
-  UINT64                            F26High;\r
-  UINT64                            F27Low;\r
-  UINT64                            F27High;\r
-  UINT64                            F28Low;\r
-  UINT64                            F28High;\r
-  UINT64                            F29Low;\r
-  UINT64                            F29High;\r
-  UINT64                            F30Low;\r
-  UINT64                            F30High;\r
-  UINT64                            F31Low;\r
-  UINT64                            F31High;\r
-  UINT64                            FPSR;\r
   UINT64                            BR0;\r
   UINT64                            BR1;\r
   UINT64                            BR2;\r
   UINT64                            BR3;\r
   UINT64                            BR4;\r
   UINT64                            BR5;\r
+  UINT64                            InitialUNAT;\r
+  UINT64                            AfterSpillUNAT;\r
+  UINT64                            PFS;\r
+  UINT64                            BSP;\r
+  UINT64                            Predicates;\r
+  UINT64                            LoopCount;\r
+  UINT64                            FPSR;\r
 } BASE_LIBRARY_JUMP_BUFFER;\r
 \r
+#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 0x10\r
+\r
 #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
@@ -123,10 +103,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
@@ -135,6 +117,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
@@ -152,10 +136,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
@@ -170,6 +157,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
@@ -183,11 +171,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
@@ -204,6 +195,7 @@ StrnCpy (
   IN      UINTN                     Length\r
   );\r
 \r
+\r
 /**\r
   Returns the length of a Null-terminated Unicode string.\r
 \r
@@ -211,8 +203,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
@@ -225,6 +219,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
@@ -233,8 +228,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
@@ -247,6 +244,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
@@ -258,17 +256,21 @@ 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
 \r
-  @retval 0   FirstString is identical to SecondString.\r
-  @retval !=0 FirstString is not identical to SecondString.\r
+  @retval 0      FirstString is identical to SecondString.\r
+  @return others FirstString is not identical to SecondString.\r
 \r
 **/\r
 INTN\r
@@ -278,6 +280,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
@@ -289,19 +292,23 @@ 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
   @param  Length        Maximum number of Unicode characters to compare.\r
 \r
-  @retval 0   FirstString is identical to SecondString.\r
-  @retval !=0 FirstString is not identical to SecondString.\r
+  @retval 0      FirstString is identical to SecondString.\r
+  @return others FirstString is not identical to SecondString.\r
 \r
 **/\r
 INTN\r
@@ -312,6 +319,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
@@ -323,15 +331,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
@@ -346,6 +359,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
@@ -360,15 +374,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
@@ -386,6 +405,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
+  @return others          If there is a match.\r
+\r
+**/\r
+CHAR16 *\r
+EFIAPI\r
+StrStr (\r
+  IN      CONST CHAR16               *String,\r
+  IN      CONST CHAR16               *SearchString\r
+  );\r
+\r
+/**\r
+  Convert a Null-terminated Unicode decimal string to a value of\r
+  type UINTN.\r
+\r
+  This function returns a value of type UINTN by interpreting the contents\r
+  of the Unicode string specified by String as a decimal number. The format\r
+  of the input Unicode string String is:\r
+\r
+                  [spaces] [decimal digits].\r
+\r
+  The valid decimal digit character is in the range [0-9]. The\r
+  function will ignore the pad space, which includes spaces or\r
+  tab characters, before [decimal digits]. The running zero in the\r
+  beginning of [decimal digits] will be ignored. Then, the function\r
+  stops at the first character that is a not a valid decimal character\r
+  or a Null-terminator, whichever one comes first.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If String is not aligned in a 16-bit boundary, then ASSERT().\r
+  If String has only pad spaces, then 0 is returned.\r
+  If String has no pad spaces or valid decimal digits,\r
+  then 0 is returned.\r
+  If the number represented by String overflows according\r
+  to the range defined by UINTN, then 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
+  Convert binary buffer to a Unicode String in a specified sequence. \r
+\r
+  This function converts bytes in the memory block pointed by Buffer 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
+  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
+  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
+  @param  Digit       The output hexadecimal digit.\r
+\r
+  @param  Char        The input Unicode character.\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
+  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
@@ -398,7 +781,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
@@ -413,6 +797,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
@@ -429,7 +814,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
@@ -446,15 +832,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
@@ -467,6 +856,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
@@ -476,7 +866,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
@@ -489,6 +880,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
@@ -502,15 +894,17 @@ 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
 \r
-  @retval 0   FirstString is identical to SecondString.\r
-  @retval !=0 FirstString is not identical to SecondString.\r
+  @retval 0      FirstString is identical to SecondString.\r
+  @return others FirstString is not identical to SecondString.\r
 \r
 **/\r
 INTN\r
@@ -520,6 +914,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
@@ -534,17 +929,19 @@ 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
 \r
-  @retval 0   FirstString is identical to SecondString using case insensitive\r
-              comparisons.\r
-  @retval !=0 FirstString is not identical to SecondString using case\r
-              insensitive comparisons.\r
+  @retval 0      FirstString is identical to SecondString using case insensitive\r
+                 comparisons.\r
+  @return others FirstString is not identical to SecondString using case\r
+                 insensitive comparisons.\r
 \r
 **/\r
 INTN\r
@@ -554,6 +951,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
@@ -565,18 +963,21 @@ 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
-  @retval 0   FirstString is identical to SecondString.\r
-  @retval !=0 FirstString is not identical to SecondString.\r
+  @param  Length        Maximum number of ASCII characters for compare.\r
+  \r
+  @retval 0      FirstString is identical to SecondString.\r
+  @return others FirstString is not identical to SecondString.\r
 \r
 **/\r
 INTN\r
@@ -587,6 +988,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
@@ -599,9 +1001,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
@@ -615,10 +1019,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
@@ -632,16 +1037,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
@@ -659,85 +1066,343 @@ 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
+  @return others          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
+  Convert a Null-terminated ASCII hexadecimal string to a value of type UINTN.\r
+\r
+  This function returns a value of type UINTN by interpreting the contents of\r
+  the ASCII string String as a hexadecimal number. The format of the input ASCII\r
+  string String is:\r
+\r
+                  [spaces][zeros][x][hexadecimal digits].\r
+\r
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].\r
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x"\r
+  appears in the input string, it must be prefixed with at least one 0. The function\r
+  will ignore the pad space, which includes spaces or tab characters, before [zeros],\r
+  [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits]\r
+  will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal\r
+  digit. Then, the function stops at the first character that is a not a valid\r
+  hexadecimal character or Null-terminator, whichever on comes first.\r
+\r
+  If String has only pad spaces, then 0 is returned.\r
+  If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then\r
+  0 is returned.\r
+\r
+  If the number represented by String overflows according to the range defined by UINTN,\r
+  then 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
+UINTN\r
+EFIAPI\r
+AsciiStrHexToUintn (\r
+  IN      CONST CHAR8                *String\r
+  );\r
+\r
+\r
+/**\r
+  Convert a Null-terminated ASCII hexadecimal string to a value of type UINT64.\r
+\r
+  This function returns a value of type UINT64 by interpreting the contents of\r
+  the ASCII string String as a hexadecimal number. The format of the input ASCII\r
+  string String is:\r
+\r
+                  [spaces][zeros][x][hexadecimal digits].\r
+\r
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].\r
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x"\r
+  appears in the input string, it must be prefixed with at least one 0. The function\r
+  will ignore the pad space, which includes spaces or tab characters, before [zeros],\r
+  [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits]\r
+  will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal\r
+  digit. Then, the function stops at the first character that is a not a valid\r
+  hexadecimal character or Null-terminator, whichever on comes first.\r
+\r
+  If String has only pad spaces, then 0 is returned.\r
+  If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then\r
+  0 is returned.\r
+\r
+  If the number represented by String overflows according to the range defined by UINT64,\r
+  then 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 OUT  LIST_ENTRY                *ListHead\r
+  );\r
+\r
+\r
+/**\r
+  Adds a node to the beginning of a doubly linked list, and returns the pointer\r
+  to the head node of the doubly linked list.\r
+\r
+  Adds the node Entry at the beginning of the doubly linked list denoted by\r
+  ListHead, and returns ListHead.\r
+\r
+  If ListHead is NULL, then ASSERT().\r
+  If Entry is NULL, then ASSERT().\r
+  If ListHead was not initialized with 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 OUT  LIST_ENTRY                *ListHead,\r
+  IN OUT  LIST_ENTRY                *Entry\r
+  );\r
+\r
+\r
 /**\r
   Adds a node to the end of a doubly linked list, and returns the pointer to\r
   the head node of the doubly linked list.\r
@@ -748,8 +1413,9 @@ InsertHeadList (
   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
+  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
@@ -761,10 +1427,11 @@ InsertHeadList (
 LIST_ENTRY *\r
 EFIAPI\r
 InsertTailList (\r
-  IN      LIST_ENTRY                *ListHead,\r
-  IN      LIST_ENTRY                *Entry\r
+  IN OUT  LIST_ENTRY                *ListHead,\r
+  IN OUT  LIST_ENTRY                *Entry\r
   );\r
 \r
+\r
 /**\r
   Retrieves the first node of a doubly linked list.\r
 \r
@@ -774,8 +1441,9 @@ InsertTailList (
 \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
@@ -789,6 +1457,7 @@ GetFirstNode (
   IN      CONST LIST_ENTRY          *List\r
   );\r
 \r
+\r
 /**\r
   Retrieves the next node of a doubly linked list.\r
 \r
@@ -817,6 +1486,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
@@ -825,8 +1495,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
@@ -840,22 +1511,26 @@ IsListEmpty (
   IN      CONST LIST_ENTRY          *ListHead\r
   );\r
 \r
+\r
 /**\r
-  Determines if a node in a doubly linked list is null.\r
+  Determines if a node in a doubly linked list is the head node of a the same\r
+  doubly linked list.  This function is typically used to terminate a loop that\r
+  traverses all the nodes in a doubly linked list starting with the head node.\r
 \r
-  Returns FALSE if Node is one of the nodes in the doubly linked list specified\r
-  by List. Otherwise, TRUE is returned. List must have been initialized with\r
-  InitializeListHead().\r
+  Returns TRUE if Node is equal to List.  Returns FALSE if Node is one of the\r
+  nodes in the doubly linked list specified by List.  List must have been\r
+  initialized with InitializeListHead().\r
 \r
   If List is NULL, then ASSERT().\r
   If Node is NULL, then ASSERT().\r
   If List was not initialized with InitializeListHead(), then ASSERT().\r
-  If PcdMaximumLinkedListLenth is not zero, and 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
@@ -868,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
@@ -878,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
@@ -896,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
@@ -910,21 +1588,25 @@ 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
 EFIAPI\r
 SwapListEntries (\r
-  IN      LIST_ENTRY                *FirstEntry,\r
-  IN      LIST_ENTRY                *SecondEntry\r
+  IN OUT  LIST_ENTRY                *FirstEntry,\r
+  IN OUT  LIST_ENTRY                *SecondEntry\r
   );\r
 \r
+\r
 /**\r
   Removes a node from a doubly linked list, and returns the node that follows\r
   the removed node.\r
@@ -937,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
@@ -977,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
@@ -999,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
@@ -1021,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
@@ -1044,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
@@ -1067,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
@@ -1090,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
@@ -1113,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
@@ -1132,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
@@ -1151,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
@@ -1171,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
@@ -1191,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
@@ -1210,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
@@ -1229,6 +1924,7 @@ GetPowerOfTwo64 (
   IN      UINT64                    Operand\r
   );\r
 \r
+\r
 /**\r
   Switches the endianess of a 16-bit integer.\r
 \r
@@ -1236,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
@@ -1247,6 +1943,7 @@ SwapBytes16 (
   IN      UINT16                    Value\r
   );\r
 \r
+\r
 /**\r
   Switches the endianess of a 32-bit integer.\r
 \r
@@ -1254,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
@@ -1265,6 +1962,7 @@ SwapBytes32 (
   IN      UINT32                    Value\r
   );\r
 \r
+\r
 /**\r
   Switches the endianess of a 64-bit integer.\r
 \r
@@ -1272,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
@@ -1283,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
@@ -1306,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
@@ -1329,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
@@ -1352,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
@@ -1375,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
@@ -1398,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
@@ -1425,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
@@ -1452,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
@@ -1479,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
@@ -1489,15 +2196,16 @@ DivS64x64Remainder (
 \r
   @param  Buffer  Pointer to a 16-bit value that may be unaligned.\r
 \r
-  @return *Uint16\r
+  @return The 16-bit value read from Buffer.\r
 \r
 **/\r
 UINT16\r
 EFIAPI\r
 ReadUnaligned16 (\r
-  IN      CONST UINT16              *Uint16\r
+  IN CONST UINT16              *Buffer\r
   );\r
 \r
+\r
 /**\r
   Writes a 16-bit value to memory that may be unaligned.\r
 \r
@@ -1510,16 +2218,17 @@ ReadUnaligned16 (
   @param  Buffer  Pointer to a 16-bit value that may be unaligned.\r
   @param  Value   16-bit value to write to Buffer.\r
 \r
-  @return Value\r
+  @return The 16-bit value to write to Buffer.\r
 \r
 **/\r
 UINT16\r
 EFIAPI\r
 WriteUnaligned16 (\r
-  OUT     UINT16                    *Uint16,\r
-  IN      UINT16                    Value\r
+  OUT UINT16                    *Buffer,\r
+  IN  UINT16                    Value\r
   );\r
 \r
+\r
 /**\r
   Reads a 24-bit value from memory that may be unaligned.\r
 \r
@@ -1530,15 +2239,16 @@ WriteUnaligned16 (
 \r
   @param  Buffer  Pointer to a 24-bit value that may be unaligned.\r
 \r
-  @return The value read.\r
+  @return The 24-bit value read from Buffer.\r
 \r
 **/\r
 UINT32\r
 EFIAPI\r
 ReadUnaligned24 (\r
-  IN      CONST UINT32              *Buffer\r
+  IN CONST UINT32              *Buffer\r
   );\r
 \r
+\r
 /**\r
   Writes a 24-bit value to memory that may be unaligned.\r
 \r
@@ -1551,16 +2261,17 @@ 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 24-bit value to write to Buffer.\r
 \r
 **/\r
 UINT32\r
 EFIAPI\r
 WriteUnaligned24 (\r
-  OUT     UINT32                    *Buffer,\r
-  IN      UINT32                    Value\r
+  OUT UINT32                    *Buffer,\r
+  IN  UINT32                    Value\r
   );\r
 \r
+\r
 /**\r
   Reads a 32-bit value from memory that may be unaligned.\r
 \r
@@ -1571,15 +2282,16 @@ WriteUnaligned24 (
 \r
   @param  Buffer  Pointer to a 32-bit value that may be unaligned.\r
 \r
-  @return *Uint32\r
+  @return The 32-bit value read from Buffer.\r
 \r
 **/\r
 UINT32\r
 EFIAPI\r
 ReadUnaligned32 (\r
-  IN      CONST UINT32              *Uint32\r
+  IN CONST UINT32              *Buffer\r
   );\r
 \r
+\r
 /**\r
   Writes a 32-bit value to memory that may be unaligned.\r
 \r
@@ -1592,16 +2304,17 @@ ReadUnaligned32 (
   @param  Buffer  Pointer to a 32-bit value that may be unaligned.\r
   @param  Value   32-bit value to write to Buffer.\r
 \r
-  @return Value\r
+  @return The 32-bit value to write to Buffer.\r
 \r
 **/\r
 UINT32\r
 EFIAPI\r
 WriteUnaligned32 (\r
-  OUT     UINT32                    *Uint32,\r
-  IN      UINT32                    Value\r
+  OUT UINT32                    *Buffer,\r
+  IN  UINT32                    Value\r
   );\r
 \r
+\r
 /**\r
   Reads a 64-bit value from memory that may be unaligned.\r
 \r
@@ -1612,15 +2325,16 @@ WriteUnaligned32 (
 \r
   @param  Buffer  Pointer to a 64-bit value that may be unaligned.\r
 \r
-  @return *Uint64\r
+  @return The 64-bit value read from Buffer.\r
 \r
 **/\r
 UINT64\r
 EFIAPI\r
 ReadUnaligned64 (\r
-  IN      CONST UINT64              *Uint64\r
+  IN CONST UINT64              *Buffer\r
   );\r
 \r
+\r
 /**\r
   Writes a 64-bit value to memory that may be unaligned.\r
 \r
@@ -1633,16 +2347,17 @@ ReadUnaligned64 (
   @param  Buffer  Pointer to a 64-bit value that may be unaligned.\r
   @param  Value   64-bit value to write to Buffer.\r
 \r
-  @return Value\r
+  @return The 64-bit value to write to Buffer.\r
 \r
 **/\r
 UINT64\r
 EFIAPI\r
 WriteUnaligned64 (\r
-  OUT     UINT64                    *Uint64,\r
-  IN      UINT64                    Value\r
+  OUT UINT64                    *Buffer,\r
+  IN  UINT64                    Value\r
   );\r
 \r
+\r
 //\r
 // Bit Field Functions\r
 //\r
@@ -1655,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
@@ -1674,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
@@ -1684,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
@@ -1705,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
@@ -1716,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
@@ -1737,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
@@ -1748,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
@@ -1769,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
@@ -1781,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
@@ -1804,6 +2523,7 @@ BitFieldAndThenOr8 (
   IN      UINT8                     OrData\r
   );\r
 \r
+\r
 /**\r
   Returns a bit field from a 16-bit value.\r
 \r
@@ -1812,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
@@ -1831,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
@@ -1841,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
@@ -1862,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
@@ -1873,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
@@ -1894,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
@@ -1905,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
@@ -1926,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
@@ -1938,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
@@ -1961,6 +2685,7 @@ BitFieldAndThenOr16 (
   IN      UINT16                    OrData\r
   );\r
 \r
+\r
 /**\r
   Returns a bit field from a 32-bit value.\r
 \r
@@ -1969,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
@@ -1988,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
@@ -1998,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
@@ -2019,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
@@ -2030,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
@@ -2051,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
@@ -2062,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
@@ -2083,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
@@ -2095,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
@@ -2118,6 +2847,7 @@ BitFieldAndThenOr32 (
   IN      UINT32                    OrData\r
   );\r
 \r
+\r
 /**\r
   Returns a bit field from a 64-bit value.\r
 \r
@@ -2126,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
@@ -2145,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
@@ -2155,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
@@ -2176,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
@@ -2187,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
@@ -2208,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
@@ -2219,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
@@ -2240,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
@@ -2252,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
@@ -2275,6 +3009,7 @@ BitFieldAndThenOr64 (
   IN      UINT64                    OrData\r
   );\r
 \r
+\r
 //\r
 // Base Library Synchronization Functions\r
 //\r
@@ -2301,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
@@ -2314,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
@@ -2323,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
@@ -2340,15 +3077,16 @@ 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
 EFIAPI\r
 AcquireSpinLock (\r
-  IN      SPIN_LOCK                 *SpinLock\r
+  IN OUT  SPIN_LOCK                 *SpinLock\r
   );\r
 \r
+\r
 /**\r
   Attempts to place a spin lock in the acquired state.\r
 \r
@@ -2369,9 +3107,10 @@ AcquireSpinLock (
 BOOLEAN\r
 EFIAPI\r
 AcquireSpinLockOrFail (\r
-  IN      SPIN_LOCK                 *SpinLock\r
+  IN OUT  SPIN_LOCK                 *SpinLock\r
   );\r
 \r
+\r
 /**\r
   Releases a spin lock.\r
 \r
@@ -2383,15 +3122,16 @@ 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
 EFIAPI\r
 ReleaseSpinLock (\r
-  IN      SPIN_LOCK                 *SpinLock\r
+  IN OUT  SPIN_LOCK                 *SpinLock\r
   );\r
 \r
+\r
 /**\r
   Performs an atomic increment of an 32-bit unsigned integer.\r
 \r
@@ -2413,6 +3153,7 @@ InterlockedIncrement (
   IN      UINT32                    *Value\r
   );\r
 \r
+\r
 /**\r
   Performs an atomic decrement of an 32-bit unsigned integer.\r
 \r
@@ -2434,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
@@ -2448,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
@@ -2467,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
@@ -2488,38 +3247,263 @@ 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
-  All loads and stores that proceed calls to this function are guaranteed to be\r
-  globally visible when this function returns.\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
-**/\r
-VOID\r
-EFIAPI\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
+  @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
+\r
+**/\r
+VOID\r
+EFIAPI\r
 MemoryFence (\r
   VOID\r
   );\r
 \r
+\r
 /**\r
   Saves the current CPU context that can be restored with a call to LongJump()\r
   and returns 0.\r
@@ -2529,6 +3513,7 @@ MemoryFence (
   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
@@ -2541,6 +3526,7 @@ SetJump (
   OUT     BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer\r
   );\r
 \r
+\r
 /**\r
   Restores the CPU context that was saved with SetJump().\r
 \r
@@ -2549,150 +3535,1357 @@ SetJump (
   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
+  @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
+/**\r
+  Reads the current value of Performance Monitor Configuration Register (PMC).\r
+\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 Index         The 8-bit Performance Monitor Configuration Register index to read.\r
+\r
+  @return The current value of Performance Monitor Configuration Register\r
+  specified by Index.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadPmc (\r
+  IN  UINT8   Index\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Performance Monitor Data Register (PMD).\r
+\r
+  All processor implementations provide at least 4 performance counters\r
+  (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter\r
+  overflow status registers (PMC [0]... PMC [3]).  Processor implementations may\r
+  provide additional implementation-dependent PMC and PMD to increase the number\r
+  of 'generic' performance counters (PMC/PMD pairs).  The remainder of PMC and PMD\r
+  register set is implementation dependent.  No parameter checking is performed\r
+  on Index.  If the Index value is beyond the implemented PMD register range,\r
+  zero value will be returned.\r
+  This function is only available on IPF.\r
+\r
+  @param Index         The 8-bit Performance Monitor Data Register index to read.\r
+\r
+  @return The current value of Performance Monitor Data Register specified by Index.\r
 \r
 **/\r
-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
@@ -2711,166 +4904,171 @@ 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
+  @todo   This call should be removed after the PalCall\r
+          Instance issue has been fixed.\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
+  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
-// IA32 and X64 Specific Functions\r
-//\r
-//\r
-// Byte packed structure for 16-bit Real Mode EFLAGS\r
-//\r
+\r
+#elif defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)\r
+///\r
+/// IA32 and X64 Specific Functions\r
+/// Byte packed structure for 16-bit Real Mode EFLAGS\r
+///\r
 typedef union {\r
   struct {\r
-    UINT32  CF:1;           // Carry Flag\r
-    UINT32  Reserved_0:1;   // Reserved\r
-    UINT32  PF:1;           // Parity Flag\r
-    UINT32  Reserved_1:1;   // Reserved\r
-    UINT32  AF:1;           // Auxiliary Carry Flag\r
-    UINT32  Reserved_2:1;   // Reserved\r
-    UINT32  ZF:1;           // Zero Flag\r
-    UINT32  SF:1;           // Sign Flag\r
-    UINT32  TF:1;           // Trap Flag\r
-    UINT32  IF:1;           // Interrupt Enable Flag\r
-    UINT32  DF:1;           // Direction Flag\r
-    UINT32  OF:1;           // Overflow Flag\r
-    UINT32  IOPL:2;         // I/O Privilege Level\r
-    UINT32  NT:1;           // Nested Task\r
-    UINT32  Reserved_3:1;   // Reserved\r
+    UINT32  CF:1;           /// Carry Flag\r
+    UINT32  Reserved_0:1;   /// Reserved\r
+    UINT32  PF:1;           /// Parity Flag\r
+    UINT32  Reserved_1:1;   /// Reserved\r
+    UINT32  AF:1;           /// Auxiliary Carry Flag\r
+    UINT32  Reserved_2:1;   /// Reserved\r
+    UINT32  ZF:1;           /// Zero Flag\r
+    UINT32  SF:1;           /// Sign Flag\r
+    UINT32  TF:1;           /// Trap Flag\r
+    UINT32  IF:1;           /// Interrupt Enable Flag\r
+    UINT32  DF:1;           /// Direction Flag\r
+    UINT32  OF:1;           /// Overflow Flag\r
+    UINT32  IOPL:2;         /// I/O Privilege Level\r
+    UINT32  NT:1;           /// Nested Task\r
+    UINT32  Reserved_3:1;   /// Reserved\r
   } Bits;\r
   UINT16    Uint16;\r
 } IA32_FLAGS16;\r
 \r
-//\r
-// Byte packed structure for EFLAGS/RFLAGS\r
-// 32-bits on IA-32\r
-// 64-bits on X64.  The upper 32-bits on X64 are reserved\r
-//\r
+///\r
+/// Byte packed structure for EFLAGS/RFLAGS\r
+/// 32-bits on IA-32\r
+/// 64-bits on X64.  The upper 32-bits on X64 are reserved\r
+///\r
 typedef union {\r
   struct {\r
-    UINT32  CF:1;           // Carry Flag\r
-    UINT32  Reserved_0:1;   // Reserved\r
-    UINT32  PF:1;           // Parity Flag\r
-    UINT32  Reserved_1:1;   // Reserved\r
-    UINT32  AF:1;           // Auxiliary Carry Flag\r
-    UINT32  Reserved_2:1;   // Reserved\r
-    UINT32  ZF:1;           // Zero Flag\r
-    UINT32  SF:1;           // Sign Flag\r
-    UINT32  TF:1;           // Trap Flag\r
-    UINT32  IF:1;           // Interrupt Enable Flag\r
-    UINT32  DF:1;           // Direction Flag\r
-    UINT32  OF:1;           // Overflow Flag\r
-    UINT32  IOPL:2;         // I/O Privilege Level\r
-    UINT32  NT:1;           // Nested Task\r
-    UINT32  Reserved_3:1;   // Reserved\r
-    UINT32  RF:1;           // Resume Flag\r
-    UINT32  VM:1;           // Virtual 8086 Mode\r
-    UINT32  AC:1;           // Alignment Check\r
-    UINT32  VIF:1;          // Virtual Interrupt Flag\r
-    UINT32  VIP:1;          // Virtual Interrupt Pending\r
-    UINT32  ID:1;           // ID Flag\r
-    UINT32  Reserved_4:10;  // Reserved\r
+    UINT32  CF:1;           /// Carry Flag\r
+    UINT32  Reserved_0:1;   /// Reserved\r
+    UINT32  PF:1;           /// Parity Flag\r
+    UINT32  Reserved_1:1;   /// Reserved\r
+    UINT32  AF:1;           /// Auxiliary Carry Flag\r
+    UINT32  Reserved_2:1;   /// Reserved\r
+    UINT32  ZF:1;           /// Zero Flag\r
+    UINT32  SF:1;           /// Sign Flag\r
+    UINT32  TF:1;           /// Trap Flag\r
+    UINT32  IF:1;           /// Interrupt Enable Flag\r
+    UINT32  DF:1;           /// Direction Flag\r
+    UINT32  OF:1;           /// Overflow Flag\r
+    UINT32  IOPL:2;         /// I/O Privilege Level\r
+    UINT32  NT:1;           /// Nested Task\r
+    UINT32  Reserved_3:1;   /// Reserved\r
+    UINT32  RF:1;           /// Resume Flag\r
+    UINT32  VM:1;           /// Virtual 8086 Mode\r
+    UINT32  AC:1;           /// Alignment Check\r
+    UINT32  VIF:1;          /// Virtual Interrupt Flag\r
+    UINT32  VIP:1;          /// Virtual Interrupt Pending\r
+    UINT32  ID:1;           /// ID Flag\r
+    UINT32  Reserved_4:10;  /// Reserved\r
   } Bits;\r
   UINTN     UintN;\r
 } IA32_EFLAGS32;\r
 \r
-//\r
-// Byte packed structure for Control Register 0 (CR0)\r
-// 32-bits on IA-32\r
-// 64-bits on X64.  The upper 32-bits on X64 are reserved\r
-//\r
+///\r
+/// Byte packed structure for Control Register 0 (CR0)\r
+/// 32-bits on IA-32\r
+/// 64-bits on X64.  The upper 32-bits on X64 are reserved\r
+///\r
 typedef union {\r
   struct {\r
-    UINT32  PE:1;           // Protection Enable\r
-    UINT32  MP:1;           // Monitor Coprocessor\r
-    UINT32  EM:1;           // Emulation\r
-    UINT32  TS:1;           // Task Switched\r
-    UINT32  ET:1;           // Extension Type\r
-    UINT32  NE:1;           // Numeric Error\r
-    UINT32  Reserved_0:10;  // Reserved\r
-    UINT32  WP:1;           // Write Protect\r
-    UINT32  Reserved_1:1;   // Reserved\r
-    UINT32  AM:1;           // Alignment Mask\r
-    UINT32  Reserved_2:10;  // Reserved\r
-    UINT32  NW:1;           // Mot Write-through\r
-    UINT32  CD:1;           // Cache Disable\r
-    UINT32  PG:1;           // Paging\r
+    UINT32  PE:1;           /// Protection Enable\r
+    UINT32  MP:1;           /// Monitor Coprocessor\r
+    UINT32  EM:1;           /// Emulation\r
+    UINT32  TS:1;           /// Task Switched\r
+    UINT32  ET:1;           /// Extension Type\r
+    UINT32  NE:1;           /// Numeric Error\r
+    UINT32  Reserved_0:10;  /// Reserved\r
+    UINT32  WP:1;           /// Write Protect\r
+    UINT32  Reserved_1:1;   /// Reserved\r
+    UINT32  AM:1;           /// Alignment Mask\r
+    UINT32  Reserved_2:10;  /// Reserved\r
+    UINT32  NW:1;           /// Mot Write-through\r
+    UINT32  CD:1;           /// Cache Disable\r
+    UINT32  PG:1;           /// Paging\r
   } Bits;\r
   UINTN     UintN;\r
 } IA32_CR0;\r
 \r
-//\r
-// Byte packed structure for Control Register 4 (CR4)\r
-// 32-bits on IA-32\r
-// 64-bits on X64.  The upper 32-bits on X64 are reserved\r
-//\r
+///\r
+/// Byte packed structure for Control Register 4 (CR4)\r
+/// 32-bits on IA-32\r
+/// 64-bits on X64.  The upper 32-bits on X64 are reserved\r
+///\r
 typedef union {\r
   struct {\r
-    UINT32  VME:1;          // Virtual-8086 Mode Extensions\r
-    UINT32  PVI:1;          // Protected-Mode Virtual Interrupts\r
-    UINT32  TSD:1;          // Time Stamp Disable\r
-    UINT32  DE:1;           // Debugging Extensions\r
-    UINT32  PSE:1;          // Page Size Extensions\r
-    UINT32  PAE:1;          // Physical Address Extension\r
-    UINT32  MCE:1;          // Machine Check Enable\r
-    UINT32  PGE:1;          // Page Global Enable\r
-    UINT32  PCE:1;          // Performance Monitoring Counter\r
-                            // Enable\r
-    UINT32  OSFXSR:1;       // Operating System Support for\r
-                            // FXSAVE and FXRSTOR instructions\r
-    UINT32  OSXMMEXCPT:1;   // Operating System Support for\r
-                            // Unmasked SIMD Floating Point\r
-                            // Exceptions\r
-    UINT32  Reserved_0:2;   // Reserved\r
-    UINT32  VMXE:1;         // VMX Enable\r
-    UINT32  Reserved_1:18;  // Reseved\r
+    UINT32  VME:1;          /// Virtual-8086 Mode Extensions\r
+    UINT32  PVI:1;          /// Protected-Mode Virtual Interrupts\r
+    UINT32  TSD:1;          /// Time Stamp Disable\r
+    UINT32  DE:1;           /// Debugging Extensions\r
+    UINT32  PSE:1;          /// Page Size Extensions\r
+    UINT32  PAE:1;          /// Physical Address Extension\r
+    UINT32  MCE:1;          /// Machine Check Enable\r
+    UINT32  PGE:1;          /// Page Global Enable\r
+    UINT32  PCE:1;          /// Performance Monitoring Counter\r
+                            /// Enable\r
+    UINT32  OSFXSR:1;       /// Operating System Support for\r
+                            /// FXSAVE and FXRSTOR instructions\r
+    UINT32  OSXMMEXCPT:1;   /// Operating System Support for\r
+                            /// Unmasked SIMD Floating Point\r
+                            /// Exceptions\r
+    UINT32  Reserved_0:2;   /// Reserved\r
+    UINT32  VMXE:1;         /// VMX Enable\r
+    UINT32  Reserved_1:18;  /// Reseved\r
   } Bits;\r
   UINTN     UintN;\r
 } IA32_CR4;\r
 \r
-//\r
-// Byte packed structure for an IDTR, GDTR, LDTR descriptor\r
-//\r
+///\r
+/// Byte packed structure for an IDTR, GDTR, LDTR descriptor\r
+/// @todo  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
@@ -2878,30 +5076,30 @@ typedef struct {
 #define IA32_IDT_GATE_TYPE_INTERRUPT_32  0x8E\r
 #define IA32_IDT_GATE_TYPE_TRAP_32       0x8F\r
 \r
-//\r
-// Byte packed structure for an Interrupt Gate Descriptor\r
-//\r
+///\r
+/// Byte packed structure for an Interrupt Gate Descriptor\r
+///\r
 typedef union {\r
   struct {\r
-    UINT32  OffsetLow:16;   // Offset bits 15..0\r
-    UINT32  Selector:16;    // Selector\r
-    UINT32  Reserved_0:8;   // Reserved\r
-    UINT32  GateType:8;     // Gate Type.  See #defines above\r
-    UINT32  OffsetHigh:16;  // Offset bits 31..16\r
+    UINT32  OffsetLow:16;   /// Offset bits 15..0\r
+    UINT32  Selector:16;    /// Selector\r
+    UINT32  Reserved_0:8;   /// Reserved\r
+    UINT32  GateType:8;     /// Gate Type.  See #defines above\r
+    UINT32  OffsetHigh:16;  /// Offset bits 31..16\r
   } Bits;\r
   UINT64  Uint64;\r
 } IA32_IDT_GATE_DESCRIPTOR;\r
 \r
-//\r
-// Byte packed structure for an FP/SSE/SSE2 context\r
-//\r
+///\r
+/// Byte packed structure for an FP/SSE/SSE2 context\r
+///\r
 typedef struct {\r
   UINT8  Buffer[512];\r
 } IA32_FX_BUFFER;\r
 \r
-//\r
-// Structures for the 16-bit real mode thunks\r
-//\r
+///\r
+/// Structures for the 16-bit real mode thunks\r
+///\r
 typedef struct {\r
   UINT32                            Reserved1;\r
   UINT32                            Reserved2;\r
@@ -2965,19 +5163,20 @@ typedef union {
   IA32_BYTE_REGS                    H;\r
 } IA32_REGISTER_SET;\r
 \r
-//\r
-// Byte packed structure for an 16-bit real mode thunks\r
-//\r
+///\r
+/// Byte packed structure for an 16-bit real mode thunks\r
+///\r
 typedef struct {\r
-  IA32_REGISTER_SET                 RealModeState;\r
+  IA32_REGISTER_SET                 *RealModeState;\r
   VOID                              *RealModeBuffer;\r
-  UINTN                             RealModeBufferSize;\r
-  VOID                              *CallStack;\r
-  UINTN                             CallStackSize;\r
-  VOID                              *RealModeCode;\r
-  UINTN                             RealModeCodeSize;\r
+  UINT32                            RealModeBufferSize;\r
+  UINT32                            ThunkAttributes;\r
 } THUNK_CONTEXT;\r
 \r
+#define THUNK_ATTRIBUTE_BIG_REAL_MODE             0x00000001\r
+#define THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15   0x00000002\r
+#define THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL 0x00000004\r
+\r
 /**\r
   Retrieves CPUID information.\r
 \r
@@ -3013,6 +5212,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
@@ -3033,6 +5277,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
@@ -3056,6 +5301,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
@@ -3082,6 +5328,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
@@ -3108,6 +5355,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
@@ -3138,6 +5386,7 @@ AsmMsrAndThenOr32 (
   IN      UINT32                    OrData\r
   );\r
 \r
+\r
 /**\r
   Reads a bit field of an MSR.\r
 \r
@@ -3149,7 +5398,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
@@ -3168,6 +5417,7 @@ AsmMsrBitFieldRead32 (
   IN      UINTN                     EndBit\r
   );\r
 \r
+\r
 /**\r
   Writes a bit field to an MSR.\r
 \r
@@ -3181,7 +5431,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
@@ -3202,6 +5452,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
@@ -3216,7 +5467,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
@@ -3237,6 +5488,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
@@ -3251,7 +5503,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
@@ -3272,6 +5524,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
@@ -3288,7 +5541,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
@@ -3311,6 +5564,7 @@ AsmMsrBitFieldAndThenOr32 (
   IN      UINT32                    OrData\r
   );\r
 \r
+\r
 /**\r
   Returns a 64-bit Machine Specific Register(MSR).\r
 \r
@@ -3331,6 +5585,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
@@ -3355,6 +5610,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
@@ -3380,6 +5636,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
@@ -3405,6 +5662,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
@@ -3434,6 +5692,7 @@ AsmMsrAndThenOr64 (
   IN      UINT64                    OrData\r
   );\r
 \r
+\r
 /**\r
   Reads a bit field of an MSR.\r
 \r
@@ -3445,7 +5704,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
@@ -3464,6 +5723,7 @@ AsmMsrBitFieldRead64 (
   IN      UINTN                     EndBit\r
   );\r
 \r
+\r
 /**\r
   Writes a bit field to an MSR.\r
 \r
@@ -3476,7 +5736,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
@@ -3497,6 +5757,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
@@ -3511,7 +5772,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
@@ -3532,6 +5793,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
@@ -3546,7 +5808,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
@@ -3567,6 +5829,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
@@ -3582,7 +5845,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
@@ -3605,6 +5868,7 @@ AsmMsrBitFieldAndThenOr64 (
   IN      UINT64                    OrData\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of the EFLAGS register.\r
 \r
@@ -3621,6 +5885,7 @@ AsmReadEflags (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of the Control Register 0 (CR0).\r
 \r
@@ -3637,6 +5902,7 @@ AsmReadCr0 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of the Control Register 2 (CR2).\r
 \r
@@ -3653,6 +5919,7 @@ AsmReadCr2 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of the Control Register 3 (CR3).\r
 \r
@@ -3669,6 +5936,7 @@ AsmReadCr3 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of the Control Register 4 (CR4).\r
 \r
@@ -3685,6 +5953,7 @@ AsmReadCr4 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Control Register 0 (CR0).\r
 \r
@@ -3702,6 +5971,7 @@ AsmWriteCr0 (
   UINTN  Cr0\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Control Register 2 (CR2).\r
 \r
@@ -3719,6 +5989,7 @@ AsmWriteCr2 (
   UINTN  Cr2\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Control Register 3 (CR3).\r
 \r
@@ -3736,6 +6007,7 @@ AsmWriteCr3 (
   UINTN  Cr3\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Control Register 4 (CR4).\r
 \r
@@ -3753,6 +6025,7 @@ AsmWriteCr4 (
   UINTN  Cr4\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Debug Register 0 (DR0).\r
 \r
@@ -3769,6 +6042,7 @@ AsmReadDr0 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Debug Register 1 (DR1).\r
 \r
@@ -3785,6 +6059,7 @@ AsmReadDr1 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Debug Register 2 (DR2).\r
 \r
@@ -3801,6 +6076,7 @@ AsmReadDr2 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Debug Register 3 (DR3).\r
 \r
@@ -3817,6 +6093,7 @@ AsmReadDr3 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Debug Register 4 (DR4).\r
 \r
@@ -3833,6 +6110,7 @@ AsmReadDr4 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Debug Register 5 (DR5).\r
 \r
@@ -3849,6 +6127,7 @@ AsmReadDr5 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Debug Register 6 (DR6).\r
 \r
@@ -3865,6 +6144,7 @@ AsmReadDr6 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Debug Register 7 (DR7).\r
 \r
@@ -3881,6 +6161,7 @@ AsmReadDr7 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Debug Register 0 (DR0).\r
 \r
@@ -3898,6 +6179,7 @@ AsmWriteDr0 (
   UINTN  Dr0\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Debug Register 1 (DR1).\r
 \r
@@ -3915,6 +6197,7 @@ AsmWriteDr1 (
   UINTN  Dr1\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Debug Register 2 (DR2).\r
 \r
@@ -3932,6 +6215,7 @@ AsmWriteDr2 (
   UINTN  Dr2\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Debug Register 3 (DR3).\r
 \r
@@ -3949,6 +6233,7 @@ AsmWriteDr3 (
   UINTN  Dr3\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Debug Register 4 (DR4).\r
 \r
@@ -3966,6 +6251,7 @@ AsmWriteDr4 (
   UINTN  Dr4\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Debug Register 5 (DR5).\r
 \r
@@ -3983,6 +6269,7 @@ AsmWriteDr5 (
   UINTN  Dr5\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Debug Register 6 (DR6).\r
 \r
@@ -4000,6 +6287,7 @@ AsmWriteDr6 (
   UINTN  Dr6\r
   );\r
 \r
+\r
 /**\r
   Writes a value to Debug Register 7 (DR7).\r
 \r
@@ -4017,6 +6305,7 @@ AsmWriteDr7 (
   UINTN  Dr7\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Code Segment Register (CS).\r
 \r
@@ -4032,6 +6321,7 @@ AsmReadCs (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Data Segment Register (DS).\r
 \r
@@ -4047,6 +6337,7 @@ AsmReadDs (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Extra Segment Register (ES).\r
 \r
@@ -4062,6 +6353,7 @@ AsmReadEs (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of FS Data Segment Register (FS).\r
 \r
@@ -4077,6 +6369,7 @@ AsmReadFs (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of GS Data Segment Register (GS).\r
 \r
@@ -4092,6 +6385,7 @@ AsmReadGs (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Stack Segment Register (SS).\r
 \r
@@ -4107,6 +6401,7 @@ AsmReadSs (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Task Register (TR).\r
 \r
@@ -4122,6 +6417,7 @@ AsmReadTr (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current Global Descriptor Table Register(GDTR) descriptor.\r
 \r
@@ -4139,6 +6435,7 @@ AsmReadGdtr (
   OUT     IA32_DESCRIPTOR           *Gdtr\r
   );\r
 \r
+\r
 /**\r
   Writes the current Global Descriptor Table Register (GDTR) descriptor.\r
 \r
@@ -4156,6 +6453,7 @@ AsmWriteGdtr (
   IN      CONST IA32_DESCRIPTOR     *Gdtr\r
   );\r
 \r
+\r
 /**\r
   Reads the current Interrupt Descriptor Table Register(GDTR) descriptor.\r
 \r
@@ -4173,6 +6471,7 @@ AsmReadIdtr (
   OUT     IA32_DESCRIPTOR           *Idtr\r
   );\r
 \r
+\r
 /**\r
   Writes the current Interrupt Descriptor Table Register(GDTR) descriptor.\r
 \r
@@ -4190,6 +6489,7 @@ AsmWriteIdtr (
   IN      CONST IA32_DESCRIPTOR     *Idtr\r
   );\r
 \r
+\r
 /**\r
   Reads the current Local Descriptor Table Register(LDTR) selector.\r
 \r
@@ -4205,6 +6505,7 @@ AsmReadLdtr (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Writes the current Local Descriptor Table Register (GDTR) selector.\r
 \r
@@ -4220,6 +6521,7 @@ AsmWriteLdtr (
   IN      UINT16                    Ldtr\r
   );\r
 \r
+\r
 /**\r
   Save the current floating point/SSE/SSE2 context to a buffer.\r
 \r
@@ -4239,6 +6541,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
@@ -4259,6 +6562,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
@@ -4274,6 +6578,7 @@ AsmReadMm0 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of 64-bit MMX Register #1 (MM1).\r
 \r
@@ -4289,6 +6594,7 @@ AsmReadMm1 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of 64-bit MMX Register #2 (MM2).\r
 \r
@@ -4304,6 +6610,7 @@ AsmReadMm2 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of 64-bit MMX Register #3 (MM3).\r
 \r
@@ -4319,6 +6626,7 @@ AsmReadMm3 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of 64-bit MMX Register #4 (MM4).\r
 \r
@@ -4334,6 +6642,7 @@ AsmReadMm4 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of 64-bit MMX Register #5 (MM5).\r
 \r
@@ -4349,6 +6658,7 @@ AsmReadMm5 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of 64-bit MMX Register #6 (MM6).\r
 \r
@@ -4364,6 +6674,7 @@ AsmReadMm6 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of 64-bit MMX Register #7 (MM7).\r
 \r
@@ -4379,6 +6690,7 @@ AsmReadMm7 (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Writes the current value of 64-bit MMX Register #0 (MM0).\r
 \r
@@ -4394,6 +6706,7 @@ AsmWriteMm0 (
   IN      UINT64                    Value\r
   );\r
 \r
+\r
 /**\r
   Writes the current value of 64-bit MMX Register #1 (MM1).\r
 \r
@@ -4409,6 +6722,7 @@ AsmWriteMm1 (
   IN      UINT64                    Value\r
   );\r
 \r
+\r
 /**\r
   Writes the current value of 64-bit MMX Register #2 (MM2).\r
 \r
@@ -4424,6 +6738,7 @@ AsmWriteMm2 (
   IN      UINT64                    Value\r
   );\r
 \r
+\r
 /**\r
   Writes the current value of 64-bit MMX Register #3 (MM3).\r
 \r
@@ -4439,6 +6754,7 @@ AsmWriteMm3 (
   IN      UINT64                    Value\r
   );\r
 \r
+\r
 /**\r
   Writes the current value of 64-bit MMX Register #4 (MM4).\r
 \r
@@ -4454,6 +6770,7 @@ AsmWriteMm4 (
   IN      UINT64                    Value\r
   );\r
 \r
+\r
 /**\r
   Writes the current value of 64-bit MMX Register #5 (MM5).\r
 \r
@@ -4469,6 +6786,7 @@ AsmWriteMm5 (
   IN      UINT64                    Value\r
   );\r
 \r
+\r
 /**\r
   Writes the current value of 64-bit MMX Register #6 (MM6).\r
 \r
@@ -4484,6 +6802,7 @@ AsmWriteMm6 (
   IN      UINT64                    Value\r
   );\r
 \r
+\r
 /**\r
   Writes the current value of 64-bit MMX Register #7 (MM7).\r
 \r
@@ -4499,6 +6818,7 @@ AsmWriteMm7 (
   IN      UINT64                    Value\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of Time Stamp Counter (TSC).\r
 \r
@@ -4514,6 +6834,7 @@ AsmReadTsc (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Reads the current value of a Performance Counter (PMC).\r
 \r
@@ -4531,6 +6852,7 @@ AsmReadPmc (
   IN      UINT32                    Index\r
   );\r
 \r
+\r
 /**\r
   Sets up a monitor buffer that is used by AsmMwait().\r
 \r
@@ -4555,6 +6877,7 @@ AsmMonitor (
   IN      UINTN                     Edx\r
   );\r
 \r
+\r
 /**\r
   Executes an MWAIT instruction.\r
 \r
@@ -4576,6 +6899,7 @@ AsmMwait (
   IN      UINTN                     Ecx\r
   );\r
 \r
+\r
 /**\r
   Executes a WBINVD instruction.\r
 \r
@@ -4589,6 +6913,7 @@ AsmWbinvd (
   VOID\r
   );\r
 \r
+\r
 /**\r
   Executes a INVD instruction.\r
 \r
@@ -4602,6 +6927,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
@@ -4623,6 +6949,7 @@ AsmFlushCacheLine (
   IN      VOID                      *LinearAddress\r
   );\r
 \r
+\r
 /**\r
   Enables the 32-bit paging mode on the CPU.\r
 \r
@@ -4669,6 +6996,7 @@ AsmEnablePaging32 (
   IN      VOID                      *NewStack\r
   );\r
 \r
+\r
 /**\r
   Disables the 32-bit paging mode on the CPU.\r
 \r
@@ -4712,6 +7040,7 @@ AsmDisablePaging32 (
   IN      VOID                      *NewStack\r
   );\r
 \r
+\r
 /**\r
   Enables the 64-bit paging mode on the CPU.\r
 \r
@@ -4729,7 +7058,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
@@ -4754,6 +7083,7 @@ AsmEnablePaging64 (
   IN      UINT64                    NewStack\r
   );\r
 \r
+\r
 /**\r
   Disables the 64-bit paging mode on the CPU.\r
 \r
@@ -4769,7 +7099,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
@@ -4794,10 +7124,40 @@ AsmDisablePaging64 (
   IN      UINT32                    NewStack\r
   );\r
 \r
+\r
 //\r
 // 16-bit thunking services\r
 //\r
 \r
+/**\r
+  Retrieves the properties for 16-bit thunk functions.\r
+\r
+  Computes the size of the buffer and stack below 1MB required to use the\r
+  AsmPrepareThunk16(), AsmThunk16() and AsmPrepareAndThunk16() functions. This\r
+  buffer size is returned in RealModeBufferSize, and the stack size is returned\r
+  in ExtraStackSize. If parameters are passed to the 16-bit real mode code,\r
+  then the actual minimum stack size is ExtraStackSize plus the maximum number\r
+  of bytes that need to be passed to the 16-bit real mode code.\r
+\r
+  If RealModeBufferSize is NULL, then ASSERT().\r
+  If ExtraStackSize is NULL, then ASSERT().\r
+\r
+  @param  RealModeBufferSize  A pointer to the size of the buffer below 1MB\r
+                              required to use the 16-bit thunk functions.\r
+  @param  ExtraStackSize      A pointer to the extra size of stack below 1MB\r
+                              that the 16-bit thunk functions require for\r
+                              temporary storage in the transition to and from\r
+                              16-bit real mode.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmGetThunk16Properties (\r
+  OUT     UINT32                    *RealModeBufferSize,\r
+  OUT     UINT32                    *ExtraStackSize\r
+  );\r
+\r
+\r
 /**\r
   Prepares all structures a code required to use AsmThunk16().\r
 \r
@@ -4815,6 +7175,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
@@ -4835,6 +7196,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
@@ -4859,3 +7221,6 @@ AsmPrepareAndThunk16 (
   );\r
 \r
 #endif\r
+#endif\r
+\r
+\r