]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdePkg/Include/Library/BaseLib.h
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / MdePkg / Include / Library / BaseLib.h
index 9c42f82a7d91366304eda8fb2c8a567bb824980a..8f2df76c29a303b156b10ba5ec86a20525989af2 100644 (file)
@@ -2,15 +2,13 @@
   Provides string functions, linked list functions, math functions, synchronization\r
   functions, file path functions, and CPU architecture-specific functions.\r
 \r
-Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2006 - 2021, Intel Corporation. All rights reserved.<BR>\r
 Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php.\r
+Copyright (c) Microsoft Corporation.<BR>\r
+Portions Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>\r
+Portions Copyright (c) 2022, Loongson Technology Corporation Limited. All rights reserved.<BR>\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
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -25,15 +23,16 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 /// The IA-32 architecture context buffer used by SetJump() and LongJump().\r
 ///\r
 typedef struct {\r
-  UINT32                            Ebx;\r
-  UINT32                            Esi;\r
-  UINT32                            Edi;\r
-  UINT32                            Ebp;\r
-  UINT32                            Esp;\r
-  UINT32                            Eip;\r
+  UINT32    Ebx;\r
+  UINT32    Esi;\r
+  UINT32    Edi;\r
+  UINT32    Ebp;\r
+  UINT32    Esp;\r
+  UINT32    Eip;\r
+  UINT32    Ssp;\r
 } BASE_LIBRARY_JUMP_BUFFER;\r
 \r
-#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 4\r
+#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT  4\r
 \r
 #endif // defined (MDE_CPU_IA32)\r
 \r
@@ -42,21 +41,22 @@ typedef struct {
 /// The x64 architecture context buffer used by SetJump() and LongJump().\r
 ///\r
 typedef struct {\r
-  UINT64                            Rbx;\r
-  UINT64                            Rsp;\r
-  UINT64                            Rbp;\r
-  UINT64                            Rdi;\r
-  UINT64                            Rsi;\r
-  UINT64                            R12;\r
-  UINT64                            R13;\r
-  UINT64                            R14;\r
-  UINT64                            R15;\r
-  UINT64                            Rip;\r
-  UINT64                            MxCsr;\r
-  UINT8                             XmmBuffer[160]; ///< XMM6-XMM15.\r
+  UINT64    Rbx;\r
+  UINT64    Rsp;\r
+  UINT64    Rbp;\r
+  UINT64    Rdi;\r
+  UINT64    Rsi;\r
+  UINT64    R12;\r
+  UINT64    R13;\r
+  UINT64    R14;\r
+  UINT64    R15;\r
+  UINT64    Rip;\r
+  UINT64    MxCsr;\r
+  UINT8     XmmBuffer[160];                         ///< XMM6-XMM15.\r
+  UINT64    Ssp;\r
 } BASE_LIBRARY_JUMP_BUFFER;\r
 \r
-#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8\r
+#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT  8\r
 \r
 #endif // defined (MDE_CPU_X64)\r
 \r
@@ -65,14 +65,14 @@ typedef struct {
 /// The EBC context buffer used by SetJump() and LongJump().\r
 ///\r
 typedef struct {\r
-  UINT64                            R0;\r
-  UINT64                            R1;\r
-  UINT64                            R2;\r
-  UINT64                            R3;\r
-  UINT64                            IP;\r
+  UINT64    R0;\r
+  UINT64    R1;\r
+  UINT64    R2;\r
+  UINT64    R3;\r
+  UINT64    IP;\r
 } BASE_LIBRARY_JUMP_BUFFER;\r
 \r
-#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8\r
+#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT  8\r
 \r
 #endif // defined (MDE_CPU_EBC)\r
 \r
@@ -92,9 +92,9 @@ typedef struct {
   UINT32    R14;\r
 } BASE_LIBRARY_JUMP_BUFFER;\r
 \r
-#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 4\r
+#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT  4\r
 \r
-#endif  // defined (MDE_CPU_ARM)\r
+#endif // defined (MDE_CPU_ARM)\r
 \r
 #if defined (MDE_CPU_AARCH64)\r
 typedef struct {\r
@@ -124,16 +124,112 @@ typedef struct {
   UINT64    D15;\r
 } BASE_LIBRARY_JUMP_BUFFER;\r
 \r
-#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8\r
+#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT  8\r
 \r
-#endif  // defined (MDE_CPU_AARCH64)\r
+#endif // defined (MDE_CPU_AARCH64)\r
 \r
+#if defined (MDE_CPU_RISCV64)\r
+///\r
+/// The RISC-V architecture context buffer used by SetJump() and LongJump().\r
+///\r
+typedef struct {\r
+  UINT64    RA;\r
+  UINT64    S0;\r
+  UINT64    S1;\r
+  UINT64    S2;\r
+  UINT64    S3;\r
+  UINT64    S4;\r
+  UINT64    S5;\r
+  UINT64    S6;\r
+  UINT64    S7;\r
+  UINT64    S8;\r
+  UINT64    S9;\r
+  UINT64    S10;\r
+  UINT64    S11;\r
+  UINT64    SP;\r
+} BASE_LIBRARY_JUMP_BUFFER;\r
+\r
+#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT  8\r
+\r
+VOID\r
+RiscVSetSupervisorScratch (\r
+  IN UINT64\r
+  );\r
+\r
+UINT64\r
+RiscVGetSupervisorScratch (\r
+  VOID\r
+  );\r
+\r
+VOID\r
+RiscVSetSupervisorStvec (\r
+  IN UINT64\r
+  );\r
+\r
+UINT64\r
+RiscVGetSupervisorStvec (\r
+  VOID\r
+  );\r
+\r
+UINT64\r
+RiscVGetSupervisorTrapCause (\r
+  VOID\r
+  );\r
+\r
+VOID\r
+RiscVSetSupervisorAddressTranslationRegister (\r
+  IN UINT64\r
+  );\r
+\r
+UINT64\r
+RiscVReadTimer (\r
+  VOID\r
+  );\r
+\r
+VOID\r
+RiscVEnableTimerInterrupt (\r
+  VOID\r
+  );\r
+\r
+VOID\r
+RiscVDisableTimerInterrupt (\r
+  VOID\r
+  );\r
+\r
+VOID\r
+RiscVClearPendingTimerInterrupt (\r
+  VOID\r
+  );\r
+\r
+#endif // defined (MDE_CPU_RISCV64)\r
+\r
+#if defined (MDE_CPU_LOONGARCH64)\r
+///\r
+/// The LoongArch architecture context buffer used by SetJump() and LongJump()\r
+///\r
+typedef struct {\r
+  UINT64    S0;\r
+  UINT64    S1;\r
+  UINT64    S2;\r
+  UINT64    S3;\r
+  UINT64    S4;\r
+  UINT64    S5;\r
+  UINT64    S6;\r
+  UINT64    S7;\r
+  UINT64    S8;\r
+  UINT64    SP;\r
+  UINT64    FP;\r
+  UINT64    RA;\r
+} BASE_LIBRARY_JUMP_BUFFER;\r
+\r
+#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT  8\r
+\r
+#endif // defined (MDE_CPU_LOONGARCH64)\r
 \r
 //\r
 // String Services\r
 //\r
 \r
-\r
 /**\r
   Returns the length of a Null-terminated Unicode string.\r
 \r
@@ -153,8 +249,8 @@ typedef struct {
 UINTN\r
 EFIAPI\r
 StrnLenS (\r
-  IN CONST CHAR16              *String,\r
-  IN UINTN                     MaxSize\r
+  IN CONST CHAR16  *String,\r
+  IN UINTN         MaxSize\r
   );\r
 \r
 /**\r
@@ -181,8 +277,8 @@ StrnLenS (
 UINTN\r
 EFIAPI\r
 StrnSizeS (\r
-  IN CONST CHAR16              *String,\r
-  IN UINTN                     MaxSize\r
+  IN CONST CHAR16  *String,\r
+  IN UINTN         MaxSize\r
   );\r
 \r
 /**\r
@@ -193,7 +289,6 @@ StrnSizeS (
 \r
   If Destination is not aligned on a 16-bit boundary, then ASSERT().\r
   If Source is not aligned on a 16-bit boundary, then ASSERT().\r
-  If an error would be returned, then the function will also ASSERT().\r
 \r
   If an error is returned, then the Destination is unmodified.\r
 \r
@@ -215,9 +310,9 @@ StrnSizeS (
 RETURN_STATUS\r
 EFIAPI\r
 StrCpyS (\r
-  OUT CHAR16       *Destination,\r
-  IN  UINTN        DestMax,\r
-  IN  CONST CHAR16 *Source\r
+  OUT CHAR16        *Destination,\r
+  IN  UINTN         DestMax,\r
+  IN  CONST CHAR16  *Source\r
   );\r
 \r
 /**\r
@@ -229,7 +324,6 @@ StrCpyS (
 \r
   If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().\r
   If Length > 0 and Source is not aligned on a 16-bit boundary, then ASSERT().\r
-  If an error would be returned, then the function will also ASSERT().\r
 \r
   If an error is returned, then the Destination is unmodified.\r
 \r
@@ -253,10 +347,10 @@ StrCpyS (
 RETURN_STATUS\r
 EFIAPI\r
 StrnCpyS (\r
-  OUT CHAR16       *Destination,\r
-  IN  UINTN        DestMax,\r
-  IN  CONST CHAR16 *Source,\r
-  IN  UINTN        Length\r
+  OUT CHAR16        *Destination,\r
+  IN  UINTN         DestMax,\r
+  IN  CONST CHAR16  *Source,\r
+  IN  UINTN         Length\r
   );\r
 \r
 /**\r
@@ -267,7 +361,6 @@ StrnCpyS (
 \r
   If Destination is not aligned on a 16-bit boundary, then ASSERT().\r
   If Source is not aligned on a 16-bit boundary, then ASSERT().\r
-  If an error would be returned, then the function will also ASSERT().\r
 \r
   If an error is returned, then the Destination is unmodified.\r
 \r
@@ -292,9 +385,9 @@ StrnCpyS (
 RETURN_STATUS\r
 EFIAPI\r
 StrCatS (\r
-  IN OUT CHAR16       *Destination,\r
-  IN     UINTN        DestMax,\r
-  IN     CONST CHAR16 *Source\r
+  IN OUT CHAR16        *Destination,\r
+  IN     UINTN         DestMax,\r
+  IN     CONST CHAR16  *Source\r
   );\r
 \r
 /**\r
@@ -307,7 +400,6 @@ StrCatS (
 \r
   If Destination is not aligned on a 16-bit boundary, then ASSERT().\r
   If Source is not aligned on a 16-bit boundary, then ASSERT().\r
-  If an error would be returned, then the function will also ASSERT().\r
 \r
   If an error is returned, then the Destination is unmodified.\r
 \r
@@ -333,10 +425,10 @@ StrCatS (
 RETURN_STATUS\r
 EFIAPI\r
 StrnCatS (\r
-  IN OUT CHAR16       *Destination,\r
-  IN     UINTN        DestMax,\r
-  IN     CONST CHAR16 *Source,\r
-  IN     UINTN        Length\r
+  IN OUT CHAR16        *Destination,\r
+  IN     UINTN         DestMax,\r
+  IN     CONST CHAR16  *Source,\r
+  IN     UINTN         Length\r
   );\r
 \r
 /**\r
@@ -354,12 +446,7 @@ StrnCatS (
   be ignored. Then, the function stops at the first character that is a not a\r
   valid decimal character or a Null-terminator, whichever one comes first.\r
 \r
-  If String is NULL, then ASSERT().\r
-  If Data is NULL, then ASSERT().\r
   If String is not aligned in a 16-bit boundary, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters, not including the\r
-  Null-terminator, then ASSERT().\r
 \r
   If String has no valid decimal digits in the above format, then 0 is stored\r
   at the location pointed to by Data.\r
@@ -390,9 +477,9 @@ StrnCatS (
 RETURN_STATUS\r
 EFIAPI\r
 StrDecimalToUintnS (\r
-  IN  CONST CHAR16             *String,\r
-  OUT       CHAR16             **EndPointer,  OPTIONAL\r
-  OUT       UINTN              *Data\r
+  IN  CONST CHAR16  *String,\r
+  OUT       CHAR16  **EndPointer   OPTIONAL,\r
+  OUT       UINTN   *Data\r
   );\r
 \r
 /**\r
@@ -410,12 +497,7 @@ StrDecimalToUintnS (
   be ignored. Then, the function stops at the first character that is a not a\r
   valid decimal character or a Null-terminator, whichever one comes first.\r
 \r
-  If String is NULL, then ASSERT().\r
-  If Data is NULL, then ASSERT().\r
   If String is not aligned in a 16-bit boundary, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters, not including the\r
-  Null-terminator, then ASSERT().\r
 \r
   If String has no valid decimal digits in the above format, then 0 is stored\r
   at the location pointed to by Data.\r
@@ -446,9 +528,9 @@ StrDecimalToUintnS (
 RETURN_STATUS\r
 EFIAPI\r
 StrDecimalToUint64S (\r
-  IN  CONST CHAR16             *String,\r
-  OUT       CHAR16             **EndPointer,  OPTIONAL\r
-  OUT       UINT64             *Data\r
+  IN  CONST CHAR16  *String,\r
+  OUT       CHAR16  **EndPointer   OPTIONAL,\r
+  OUT       UINT64  *Data\r
   );\r
 \r
 /**\r
@@ -471,12 +553,7 @@ StrDecimalToUint64S (
   the first character that is a not a valid hexadecimal character or NULL,\r
   whichever one comes first.\r
 \r
-  If String is NULL, then ASSERT().\r
-  If Data is NULL, then ASSERT().\r
   If String is not aligned in a 16-bit boundary, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters, not including the\r
-  Null-terminator, then ASSERT().\r
 \r
   If String has no valid hexadecimal digits in the above format, then 0 is\r
   stored at the location pointed to by Data.\r
@@ -507,9 +584,9 @@ StrDecimalToUint64S (
 RETURN_STATUS\r
 EFIAPI\r
 StrHexToUintnS (\r
-  IN  CONST CHAR16             *String,\r
-  OUT       CHAR16             **EndPointer,  OPTIONAL\r
-  OUT       UINTN              *Data\r
+  IN  CONST CHAR16  *String,\r
+  OUT       CHAR16  **EndPointer   OPTIONAL,\r
+  OUT       UINTN   *Data\r
   );\r
 \r
 /**\r
@@ -532,12 +609,7 @@ StrHexToUintnS (
   the first character that is a not a valid hexadecimal character or NULL,\r
   whichever one comes first.\r
 \r
-  If String is NULL, then ASSERT().\r
-  If Data is NULL, then ASSERT().\r
   If String is not aligned in a 16-bit boundary, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters, not including the\r
-  Null-terminator, then ASSERT().\r
 \r
   If String has no valid hexadecimal digits in the above format, then 0 is\r
   stored at the location pointed to by Data.\r
@@ -568,9 +640,9 @@ StrHexToUintnS (
 RETURN_STATUS\r
 EFIAPI\r
 StrHexToUint64S (\r
-  IN  CONST CHAR16             *String,\r
-  OUT       CHAR16             **EndPointer,  OPTIONAL\r
-  OUT       UINT64             *Data\r
+  IN  CONST CHAR16  *String,\r
+  OUT       CHAR16  **EndPointer   OPTIONAL,\r
+  OUT       UINT64  *Data\r
   );\r
 \r
 /**\r
@@ -590,8 +662,8 @@ StrHexToUint64S (
 UINTN\r
 EFIAPI\r
 AsciiStrnLenS (\r
-  IN CONST CHAR8               *String,\r
-  IN UINTN                     MaxSize\r
+  IN CONST CHAR8  *String,\r
+  IN UINTN        MaxSize\r
   );\r
 \r
 /**\r
@@ -616,8 +688,8 @@ AsciiStrnLenS (
 UINTN\r
 EFIAPI\r
 AsciiStrnSizeS (\r
-  IN CONST CHAR8               *String,\r
-  IN UINTN                     MaxSize\r
+  IN CONST CHAR8  *String,\r
+  IN UINTN        MaxSize\r
   );\r
 \r
 /**\r
@@ -626,8 +698,6 @@ AsciiStrnSizeS (
 \r
   This function is similar as strcpy_s defined in C11.\r
 \r
-  If an error would be returned, then the function will also ASSERT().\r
-\r
   If an error is returned, then the Destination is unmodified.\r
 \r
   @param  Destination              A pointer to a Null-terminated Ascii string.\r
@@ -660,8 +730,6 @@ AsciiStrCpyS (
 \r
   This function is similar as strncpy_s defined in C11.\r
 \r
-  If an error would be returned, then the function will also ASSERT().\r
-\r
   If an error is returned, then the Destination is unmodified.\r
 \r
   @param  Destination              A pointer to a Null-terminated Ascii string.\r
@@ -696,8 +764,6 @@ AsciiStrnCpyS (
 \r
   This function is similar as strcat_s defined in C11.\r
 \r
-  If an error would be returned, then the function will also ASSERT().\r
-\r
   If an error is returned, then the Destination is unmodified.\r
 \r
   @param  Destination              A pointer to a Null-terminated Ascii string.\r
@@ -734,8 +800,6 @@ AsciiStrCatS (
 \r
   This function is similar as strncat_s defined in C11.\r
 \r
-  If an error would be returned, then the function will also ASSERT().\r
-\r
   If an error is returned, then the Destination is unmodified.\r
 \r
   @param  Destination              A pointer to a Null-terminated Ascii string.\r
@@ -781,12 +845,6 @@ AsciiStrnCatS (
   be ignored. Then, the function stops at the first character that is a not a\r
   valid decimal character or a Null-terminator, whichever one comes first.\r
 \r
-  If String is NULL, then ASSERT().\r
-  If Data is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and String contains more than\r
-  PcdMaximumAsciiStringLength Ascii characters, not including the\r
-  Null-terminator, then ASSERT().\r
-\r
   If String has no valid decimal digits in the above format, then 0 is stored\r
   at the location pointed to by Data.\r
   If the number represented by String exceeds the range defined by UINTN, then\r
@@ -816,9 +874,9 @@ AsciiStrnCatS (
 RETURN_STATUS\r
 EFIAPI\r
 AsciiStrDecimalToUintnS (\r
-  IN  CONST CHAR8              *String,\r
-  OUT       CHAR8              **EndPointer,  OPTIONAL\r
-  OUT       UINTN              *Data\r
+  IN  CONST CHAR8  *String,\r
+  OUT       CHAR8  **EndPointer   OPTIONAL,\r
+  OUT       UINTN  *Data\r
   );\r
 \r
 /**\r
@@ -836,12 +894,6 @@ AsciiStrDecimalToUintnS (
   be ignored. Then, the function stops at the first character that is a not a\r
   valid decimal character or a Null-terminator, whichever one comes first.\r
 \r
-  If String is NULL, then ASSERT().\r
-  If Data is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and String contains more than\r
-  PcdMaximumAsciiStringLength Ascii characters, not including the\r
-  Null-terminator, then ASSERT().\r
-\r
   If String has no valid decimal digits in the above format, then 0 is stored\r
   at the location pointed to by Data.\r
   If the number represented by String exceeds the range defined by UINT64, then\r
@@ -871,9 +923,9 @@ AsciiStrDecimalToUintnS (
 RETURN_STATUS\r
 EFIAPI\r
 AsciiStrDecimalToUint64S (\r
-  IN  CONST CHAR8              *String,\r
-  OUT       CHAR8              **EndPointer,  OPTIONAL\r
-  OUT       UINT64             *Data\r
+  IN  CONST CHAR8   *String,\r
+  OUT       CHAR8   **EndPointer   OPTIONAL,\r
+  OUT       UINT64  *Data\r
   );\r
 \r
 /**\r
@@ -895,12 +947,6 @@ AsciiStrDecimalToUint64S (
   character that is a not a valid hexadecimal character or Null-terminator,\r
   whichever on comes first.\r
 \r
-  If String is NULL, then ASSERT().\r
-  If Data is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and String contains more than\r
-  PcdMaximumAsciiStringLength Ascii characters, not including the\r
-  Null-terminator, then ASSERT().\r
-\r
   If String has no valid hexadecimal digits in the above format, then 0 is\r
   stored at the location pointed to by Data.\r
   If the number represented by String exceeds the range defined by UINTN, then\r
@@ -930,9 +976,9 @@ AsciiStrDecimalToUint64S (
 RETURN_STATUS\r
 EFIAPI\r
 AsciiStrHexToUintnS (\r
-  IN  CONST CHAR8              *String,\r
-  OUT       CHAR8              **EndPointer,  OPTIONAL\r
-  OUT       UINTN              *Data\r
+  IN  CONST CHAR8  *String,\r
+  OUT       CHAR8  **EndPointer   OPTIONAL,\r
+  OUT       UINTN  *Data\r
   );\r
 \r
 /**\r
@@ -954,12 +1000,6 @@ AsciiStrHexToUintnS (
   character that is a not a valid hexadecimal character or Null-terminator,\r
   whichever on comes first.\r
 \r
-  If String is NULL, then ASSERT().\r
-  If Data is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and String contains more than\r
-  PcdMaximumAsciiStringLength Ascii characters, not including the\r
-  Null-terminator, then ASSERT().\r
-\r
   If String has no valid hexadecimal digits in the above format, then 0 is\r
   stored at the location pointed to by Data.\r
   If the number represented by String exceeds the range defined by UINT64, then\r
@@ -989,88 +1029,11 @@ AsciiStrHexToUintnS (
 RETURN_STATUS\r
 EFIAPI\r
 AsciiStrHexToUint64S (\r
-  IN  CONST CHAR8              *String,\r
-  OUT       CHAR8              **EndPointer,  OPTIONAL\r
-  OUT       UINT64             *Data\r
+  IN  CONST CHAR8   *String,\r
+  OUT       CHAR8   **EndPointer   OPTIONAL,\r
+  OUT       UINT64  *Data\r
   );\r
 \r
-\r
-#ifndef DISABLE_NEW_DEPRECATED_INTERFACES\r
-\r
-/**\r
-  [ATTENTION] This function is deprecated for security reason.\r
-\r
-  Copies one Null-terminated Unicode string to another Null-terminated Unicode\r
-  string and returns the new Unicode string.\r
-\r
-  This function copies the contents of the Unicode string Source to the Unicode\r
-  string Destination, and returns Destination. If Source and Destination\r
-  overlap, then the results are undefined.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Destination is not aligned on a 16-bit boundary, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If Source is not aligned on a 16-bit boundary, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  Destination The pointer to a Null-terminated Unicode string.\r
-  @param  Source      The pointer to a Null-terminated Unicode string.\r
-\r
-  @return Destination.\r
-\r
-**/\r
-CHAR16 *\r
-EFIAPI\r
-StrCpy (\r
-  OUT     CHAR16                    *Destination,\r
-  IN      CONST CHAR16              *Source\r
-  );\r
-\r
-\r
-/**\r
-  [ATTENTION] This function is deprecated for security reason.\r
-\r
-  Copies up to a specified length from one Null-terminated Unicode string to\r
-  another Null-terminated Unicode string and returns the new Unicode string.\r
-\r
-  This function copies the contents of the Unicode string Source to the Unicode\r
-  string Destination, and returns Destination. At most, Length Unicode\r
-  characters are copied from Source to Destination. If Length is 0, then\r
-  Destination is returned unmodified. If Length is greater that the number of\r
-  Unicode characters in Source, then Destination is padded with Null Unicode\r
-  characters. If Source and Destination overlap, then the results are\r
-  undefined.\r
-\r
-  If Length > 0 and Destination is NULL, then ASSERT().\r
-  If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().\r
-  If Length > 0 and Source is NULL, then ASSERT().\r
-  If Length > 0 and Source is not aligned on a 16-bit boundary, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and Length is greater than\r
-  PcdMaximumUnicodeStringLength, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters, not including the Null-terminator,\r
-  then ASSERT().\r
-\r
-  @param  Destination The pointer to a Null-terminated Unicode string.\r
-  @param  Source      The pointer to a Null-terminated Unicode string.\r
-  @param  Length      The maximum number of Unicode characters to copy.\r
-\r
-  @return Destination.\r
-\r
-**/\r
-CHAR16 *\r
-EFIAPI\r
-StrnCpy (\r
-  OUT     CHAR16                    *Destination,\r
-  IN      CONST CHAR16              *Source,\r
-  IN      UINTN                     Length\r
-  );\r
-#endif // !defined (DISABLE_NEW_DEPRECATED_INTERFACES)\r
-\r
 /**\r
   Returns the length of a Null-terminated Unicode string.\r
 \r
@@ -1091,10 +1054,9 @@ StrnCpy (
 UINTN\r
 EFIAPI\r
 StrLen (\r
-  IN      CONST CHAR16              *String\r
+  IN      CONST CHAR16  *String\r
   );\r
 \r
-\r
 /**\r
   Returns the size of a Null-terminated Unicode string in bytes, including the\r
   Null terminator.\r
@@ -1116,10 +1078,9 @@ StrLen (
 UINTN\r
 EFIAPI\r
 StrSize (\r
-  IN      CONST CHAR16              *String\r
+  IN      CONST CHAR16  *String\r
   );\r
 \r
-\r
 /**\r
   Compares two Null-terminated Unicode strings, and returns the difference\r
   between the first mismatched Unicode characters.\r
@@ -1151,11 +1112,10 @@ StrSize (
 INTN\r
 EFIAPI\r
 StrCmp (\r
-  IN      CONST CHAR16              *FirstString,\r
-  IN      CONST CHAR16              *SecondString\r
+  IN      CONST CHAR16  *FirstString,\r
+  IN      CONST CHAR16  *SecondString\r
   );\r
 \r
-\r
 /**\r
   Compares up to a specified length the contents of two Null-terminated Unicode strings,\r
   and returns the difference between the first mismatched Unicode characters.\r
@@ -1191,104 +1151,10 @@ StrCmp (
 INTN\r
 EFIAPI\r
 StrnCmp (\r
-  IN      CONST CHAR16              *FirstString,\r
-  IN      CONST CHAR16              *SecondString,\r
-  IN      UINTN                     Length\r
-  );\r
-\r
-\r
-#ifndef DISABLE_NEW_DEPRECATED_INTERFACES\r
-\r
-/**\r
-  [ATTENTION] This function is deprecated for security reason.\r
-\r
-  Concatenates one Null-terminated Unicode string to another Null-terminated\r
-  Unicode string, and returns the concatenated Unicode string.\r
-\r
-  This function concatenates two Null-terminated Unicode strings. The contents\r
-  of Null-terminated Unicode string Source are concatenated to the end of\r
-  Null-terminated Unicode string Destination. The Null-terminated concatenated\r
-  Unicode String is returned. If Source and Destination overlap, then the\r
-  results are undefined.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Destination is not aligned on a 16-bit boundary, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If Source is not aligned on a 16-bit boundary, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and Destination contains more\r
-  than PcdMaximumUnicodeStringLength Unicode characters, not including the\r
-  Null-terminator, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters, not including the\r
-  Null-terminator, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination\r
-  and Source results in a Unicode string with more than\r
-  PcdMaximumUnicodeStringLength Unicode characters, not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  Destination The pointer to a Null-terminated Unicode string.\r
-  @param  Source      The pointer to a Null-terminated Unicode string.\r
-\r
-  @return Destination.\r
-\r
-**/\r
-CHAR16 *\r
-EFIAPI\r
-StrCat (\r
-  IN OUT  CHAR16                    *Destination,\r
-  IN      CONST CHAR16              *Source\r
-  );\r
-\r
-\r
-/**\r
-  [ATTENTION] This function is deprecated for security reason.\r
-\r
-  Concatenates up to a specified length one Null-terminated Unicode to the end\r
-  of another Null-terminated Unicode string, and returns the concatenated\r
-  Unicode string.\r
-\r
-  This function concatenates two Null-terminated Unicode strings. The contents\r
-  of Null-terminated Unicode string Source are concatenated to the end of\r
-  Null-terminated Unicode string Destination, and Destination is returned. At\r
-  most, Length Unicode characters are concatenated from Source to the end of\r
-  Destination, and Destination is always Null-terminated. If Length is 0, then\r
-  Destination is returned unmodified. If Source and Destination overlap, then\r
-  the results are undefined.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().\r
-  If Length > 0 and Source is NULL, then ASSERT().\r
-  If Length > 0 and Source is not aligned on a 16-bit boundary, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and Length is greater than\r
-  PcdMaximumUnicodeStringLength, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and Destination contains more\r
-  than PcdMaximumUnicodeStringLength Unicode characters, not including the\r
-  Null-terminator, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters, not including the\r
-  Null-terminator, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination\r
-  and Source results in a Unicode string with more than PcdMaximumUnicodeStringLength\r
-  Unicode characters, not including the Null-terminator, then ASSERT().\r
-\r
-  @param  Destination The pointer to a Null-terminated Unicode string.\r
-  @param  Source      The pointer to a Null-terminated Unicode string.\r
-  @param  Length      The maximum number of Unicode characters to concatenate from\r
-                      Source.\r
-\r
-  @return Destination.\r
-\r
-**/\r
-CHAR16 *\r
-EFIAPI\r
-StrnCat (\r
-  IN OUT  CHAR16                    *Destination,\r
-  IN      CONST CHAR16              *Source,\r
-  IN      UINTN                     Length\r
+  IN      CONST CHAR16  *FirstString,\r
+  IN      CONST CHAR16  *SecondString,\r
+  IN      UINTN         Length\r
   );\r
-#endif // !defined (DISABLE_NEW_DEPRECATED_INTERFACES)\r
 \r
 /**\r
   Returns the first occurrence of a Null-terminated Unicode sub-string\r
@@ -1318,8 +1184,8 @@ StrnCat (
 CHAR16 *\r
 EFIAPI\r
 StrStr (\r
-  IN      CONST CHAR16              *String,\r
-  IN      CONST CHAR16              *SearchString\r
+  IN      CONST CHAR16  *String,\r
+  IN      CONST CHAR16  *SearchString\r
   );\r
 \r
 /**\r
@@ -1359,7 +1225,7 @@ StrStr (
 UINTN\r
 EFIAPI\r
 StrDecimalToUintn (\r
-  IN      CONST CHAR16              *String\r
+  IN      CONST CHAR16  *String\r
   );\r
 \r
 /**\r
@@ -1399,10 +1265,9 @@ StrDecimalToUintn (
 UINT64\r
 EFIAPI\r
 StrDecimalToUint64 (\r
-  IN      CONST CHAR16              *String\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
@@ -1441,10 +1306,9 @@ StrDecimalToUint64 (
 UINTN\r
 EFIAPI\r
 StrHexToUintn (\r
-  IN      CONST CHAR16              *String\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
@@ -1483,7 +1347,7 @@ StrHexToUintn (
 UINT64\r
 EFIAPI\r
 StrHexToUint64 (\r
-  IN      CONST CHAR16             *String\r
+  IN      CONST CHAR16  *String\r
   );\r
 \r
 /**\r
@@ -1510,16 +1374,8 @@ StrHexToUint64 (
   "::" can be used to compress one or more groups of X when X contains only 0.\r
   The "::" can only appear once in the String.\r
 \r
-  If String is NULL, then ASSERT().\r
-\r
-  If Address is NULL, then ASSERT().\r
-\r
   If String is not aligned in a 16-bit boundary, then ASSERT().\r
 \r
-  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters, not including the\r
-  Null-terminator, then ASSERT().\r
-\r
   If EndPointer is not NULL and Address is translated from String, a pointer\r
   to the character that stopped the scan is stored at the location pointed to\r
   by EndPointer.\r
@@ -1547,10 +1403,10 @@ StrHexToUint64 (
 RETURN_STATUS\r
 EFIAPI\r
 StrToIpv6Address (\r
-  IN  CONST CHAR16       *String,\r
-  OUT CHAR16             **EndPointer, OPTIONAL\r
-  OUT IPv6_ADDRESS       *Address,\r
-  OUT UINT8              *PrefixLength OPTIONAL\r
+  IN  CONST CHAR16  *String,\r
+  OUT CHAR16        **EndPointer  OPTIONAL,\r
+  OUT IPv6_ADDRESS  *Address,\r
+  OUT UINT8         *PrefixLength OPTIONAL\r
   );\r
 \r
 /**\r
@@ -1571,16 +1427,8 @@ StrToIpv6Address (
   When /P is in the String, the function stops at the first character that is not\r
   a valid decimal digit character after P is converted.\r
 \r
-  If String is NULL, then ASSERT().\r
-\r
-  If Address is NULL, then ASSERT().\r
-\r
   If String is not aligned in a 16-bit boundary, then ASSERT().\r
 \r
-  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters, not including the\r
-  Null-terminator, then ASSERT().\r
-\r
   If EndPointer is not NULL and Address is translated from String, a pointer\r
   to the character that stopped the scan is stored at the location pointed to\r
   by EndPointer.\r
@@ -1605,10 +1453,10 @@ StrToIpv6Address (
 RETURN_STATUS\r
 EFIAPI\r
 StrToIpv4Address (\r
-  IN  CONST CHAR16       *String,\r
-  OUT CHAR16             **EndPointer, OPTIONAL\r
-  OUT IPv4_ADDRESS       *Address,\r
-  OUT UINT8              *PrefixLength OPTIONAL\r
+  IN  CONST CHAR16  *String,\r
+  OUT CHAR16        **EndPointer  OPTIONAL,\r
+  OUT IPv4_ADDRESS  *Address,\r
+  OUT UINT8         *PrefixLength OPTIONAL\r
   );\r
 \r
 #define GUID_STRING_LENGTH  36\r
@@ -1644,8 +1492,6 @@ StrToIpv4Address (
                   oo          Data4[48:55]\r
                   pp          Data4[56:63]\r
 \r
-  If String is NULL, then ASSERT().\r
-  If Guid is NULL, then ASSERT().\r
   If String is not aligned in a 16-bit boundary, then ASSERT().\r
 \r
   @param  String                   Pointer to a Null-terminated Unicode string.\r
@@ -1660,8 +1506,8 @@ StrToIpv4Address (
 RETURN_STATUS\r
 EFIAPI\r
 StrToGuid (\r
-  IN  CONST CHAR16       *String,\r
-  OUT GUID               *Guid\r
+  IN  CONST CHAR16  *String,\r
+  OUT GUID          *Guid\r
   );\r
 \r
 /**\r
@@ -1680,17 +1526,6 @@ StrToGuid (
 \r
   If String is not aligned in a 16-bit boundary, then ASSERT().\r
 \r
-  If String is NULL, then ASSERT().\r
-\r
-  If Buffer is NULL, then ASSERT().\r
-\r
-  If Length is not multiple of 2, then ASSERT().\r
-\r
-  If PcdMaximumUnicodeStringLength is not zero and Length is greater than\r
-  PcdMaximumUnicodeStringLength, then ASSERT().\r
-\r
-  If MaxBufferSize is less than (Length / 2), then ASSERT().\r
-\r
   @param  String                   Pointer to a Null-terminated Unicode string.\r
   @param  Length                   The number of Unicode characters to decode.\r
   @param  Buffer                   Pointer to the converted bytes array.\r
@@ -1711,58 +1546,12 @@ StrToGuid (
 RETURN_STATUS\r
 EFIAPI\r
 StrHexToBytes (\r
-  IN  CONST CHAR16       *String,\r
-  IN  UINTN              Length,\r
-  OUT UINT8              *Buffer,\r
-  IN  UINTN              MaxBufferSize\r
+  IN  CONST CHAR16  *String,\r
+  IN  UINTN         Length,\r
+  OUT UINT8         *Buffer,\r
+  IN  UINTN         MaxBufferSize\r
   );\r
 \r
-#ifndef DISABLE_NEW_DEPRECATED_INTERFACES\r
-\r
-/**\r
-  [ATTENTION] This function is deprecated for security reason.\r
-\r
-  Convert a Null-terminated Unicode string to a Null-terminated\r
-  ASCII string and returns the ASCII string.\r
-\r
-  This function converts the content of the Unicode string Source\r
-  to the ASCII string Destination by copying the lower 8 bits of\r
-  each Unicode character. It returns Destination.\r
-\r
-  The caller is responsible to make sure Destination points to a buffer with size\r
-  equal or greater than ((StrLen (Source) + 1) * sizeof (CHAR8)) in bytes.\r
-\r
-  If any Unicode characters in Source contain non-zero value in\r
-  the upper 8 bits, then ASSERT().\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If Source is not aligned on a 16-bit boundary, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-\r
-  If PcdMaximumUnicodeStringLength is not zero, and Source contains\r
-  more than PcdMaximumUnicodeStringLength Unicode characters not including\r
-  the Null-terminator, then ASSERT().\r
-\r
-  If PcdMaximumAsciiStringLength is not zero, and Source contains more\r
-  than PcdMaximumAsciiStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  Source        The pointer to a Null-terminated Unicode string.\r
-  @param  Destination   The pointer to a Null-terminated ASCII string.\r
-\r
-  @return Destination.\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-UnicodeStrToAsciiStr (\r
-  IN      CONST CHAR16              *Source,\r
-  OUT     CHAR8                     *Destination\r
-  );\r
-\r
-#endif // !defined (DISABLE_NEW_DEPRECATED_INTERFACES)\r
-\r
 /**\r
   Convert a Null-terminated Unicode string to a Null-terminated\r
   ASCII string.\r
@@ -1781,7 +1570,6 @@ UnicodeStrToAsciiStr (
   the upper 8 bits, then ASSERT().\r
 \r
   If Source is not aligned on a 16-bit boundary, then ASSERT().\r
-  If an error would be returned, then the function will also ASSERT().\r
 \r
   If an error is returned, then the Destination is unmodified.\r
 \r
@@ -1807,9 +1595,9 @@ UnicodeStrToAsciiStr (
 RETURN_STATUS\r
 EFIAPI\r
 UnicodeStrToAsciiStrS (\r
-  IN      CONST CHAR16              *Source,\r
-  OUT     CHAR8                     *Destination,\r
-  IN      UINTN                     DestMax\r
+  IN      CONST CHAR16  *Source,\r
+  OUT     CHAR8         *Destination,\r
+  IN      UINTN         DestMax\r
   );\r
 \r
 /**\r
@@ -1828,7 +1616,6 @@ UnicodeStrToAsciiStrS (
   If any Unicode characters in Source contain non-zero value in the upper 8\r
   bits, then ASSERT().\r
   If Source is not aligned on a 16-bit boundary, then ASSERT().\r
-  If an error would be returned, then the function will also ASSERT().\r
 \r
   If an error is returned, then the Destination is unmodified.\r
 \r
@@ -1859,83 +1646,12 @@ UnicodeStrToAsciiStrS (
 RETURN_STATUS\r
 EFIAPI\r
 UnicodeStrnToAsciiStrS (\r
-  IN      CONST CHAR16              *Source,\r
-  IN      UINTN                     Length,\r
-  OUT     CHAR8                     *Destination,\r
-  IN      UINTN                     DestMax,\r
-  OUT     UINTN                     *DestinationLength\r
-  );\r
-\r
-#ifndef DISABLE_NEW_DEPRECATED_INTERFACES\r
-\r
-/**\r
-  [ATTENTION] This function is deprecated for security reason.\r
-\r
-  Copies one Null-terminated ASCII string to another Null-terminated ASCII\r
-  string and returns the new ASCII string.\r
-\r
-  This function copies the contents of the ASCII string Source to the ASCII\r
-  string Destination, and returns Destination. If Source and Destination\r
-  overlap, then the results are undefined.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and Source contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-\r
-  @param  Destination The pointer to a Null-terminated ASCII string.\r
-  @param  Source      The pointer to a Null-terminated ASCII string.\r
-\r
-  @return Destination\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-AsciiStrCpy (\r
-  OUT     CHAR8                     *Destination,\r
-  IN      CONST CHAR8               *Source\r
-  );\r
-\r
-\r
-/**\r
-  [ATTENTION] This function is deprecated for security reason.\r
-\r
-  Copies up to a specified length one Null-terminated ASCII string to another\r
-  Null-terminated ASCII string and returns the new ASCII string.\r
-\r
-  This function copies the contents of the ASCII string Source to the ASCII\r
-  string Destination, and returns Destination. At most, Length ASCII characters\r
-  are copied from Source to Destination. If Length is 0, then Destination is\r
-  returned unmodified. If Length is greater that the number of ASCII characters\r
-  in Source, then Destination is padded with Null ASCII characters. If Source\r
-  and Destination overlap, then the results are undefined.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and Length is greater than\r
-  PcdMaximumAsciiStringLength, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and Source contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
-  then ASSERT().\r
-\r
-  @param  Destination The pointer to a Null-terminated ASCII string.\r
-  @param  Source      The pointer to a Null-terminated ASCII string.\r
-  @param  Length      The maximum number of ASCII characters to copy.\r
-\r
-  @return Destination\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-AsciiStrnCpy (\r
-  OUT     CHAR8                     *Destination,\r
-  IN      CONST CHAR8               *Source,\r
-  IN      UINTN                     Length\r
+  IN      CONST CHAR16  *Source,\r
+  IN      UINTN         Length,\r
+  OUT     CHAR8         *Destination,\r
+  IN      UINTN         DestMax,\r
+  OUT     UINTN         *DestinationLength\r
   );\r
-#endif // !defined (DISABLE_NEW_DEPRECATED_INTERFACES)\r
 \r
 /**\r
   Returns the length of a Null-terminated ASCII string.\r
@@ -1957,10 +1673,9 @@ AsciiStrnCpy (
 UINTN\r
 EFIAPI\r
 AsciiStrLen (\r
-  IN      CONST CHAR8               *String\r
+  IN      CONST CHAR8  *String\r
   );\r
 \r
-\r
 /**\r
   Returns the size of a Null-terminated ASCII string in bytes, including the\r
   Null terminator.\r
@@ -1981,10 +1696,9 @@ AsciiStrLen (
 UINTN\r
 EFIAPI\r
 AsciiStrSize (\r
-  IN      CONST CHAR8               *String\r
+  IN      CONST CHAR8  *String\r
   );\r
 \r
-\r
 /**\r
   Compares two Null-terminated ASCII strings, and returns the difference\r
   between the first mismatched ASCII characters.\r
@@ -2014,11 +1728,10 @@ AsciiStrSize (
 INTN\r
 EFIAPI\r
 AsciiStrCmp (\r
-  IN      CONST CHAR8               *FirstString,\r
-  IN      CONST CHAR8               *SecondString\r
+  IN      CONST CHAR8  *FirstString,\r
+  IN      CONST CHAR8  *SecondString\r
   );\r
 \r
-\r
 /**\r
   Performs a case insensitive comparison of two Null-terminated ASCII strings,\r
   and returns the difference between the first mismatched ASCII characters.\r
@@ -2051,11 +1764,10 @@ AsciiStrCmp (
 INTN\r
 EFIAPI\r
 AsciiStriCmp (\r
-  IN      CONST CHAR8               *FirstString,\r
-  IN      CONST CHAR8               *SecondString\r
+  IN      CONST CHAR8  *FirstString,\r
+  IN      CONST CHAR8  *SecondString\r
   );\r
 \r
-\r
 /**\r
   Compares two Null-terminated ASCII strings with maximum lengths, and returns\r
   the difference between the first mismatched ASCII characters.\r
@@ -2089,97 +1801,10 @@ AsciiStriCmp (
 INTN\r
 EFIAPI\r
 AsciiStrnCmp (\r
-  IN      CONST CHAR8               *FirstString,\r
-  IN      CONST CHAR8               *SecondString,\r
-  IN      UINTN                     Length\r
-  );\r
-\r
-\r
-#ifndef DISABLE_NEW_DEPRECATED_INTERFACES\r
-\r
-/**\r
-  [ATTENTION] This function is deprecated for security reason.\r
-\r
-  Concatenates one Null-terminated ASCII string to another Null-terminated\r
-  ASCII string, and returns the concatenated ASCII string.\r
-\r
-  This function concatenates two Null-terminated ASCII strings. The contents of\r
-  Null-terminated ASCII string Source are concatenated to the end of Null-\r
-  terminated ASCII string Destination. The Null-terminated concatenated ASCII\r
-  String is returned.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and Destination contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and Source contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and concatenating Destination and\r
-  Source results in a ASCII string with more than PcdMaximumAsciiStringLength\r
-  ASCII characters, then ASSERT().\r
-\r
-  @param  Destination The pointer to a Null-terminated ASCII string.\r
-  @param  Source      The pointer to a Null-terminated ASCII string.\r
-\r
-  @return Destination\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-AsciiStrCat (\r
-  IN OUT CHAR8    *Destination,\r
-  IN CONST CHAR8  *Source\r
-  );\r
-\r
-\r
-/**\r
-  [ATTENTION] This function is deprecated for security reason.\r
-\r
-  Concatenates up to a specified length one Null-terminated ASCII string to\r
-  the end of another Null-terminated ASCII string, and returns the\r
-  concatenated ASCII string.\r
-\r
-  This function concatenates two Null-terminated ASCII strings. The contents\r
-  of Null-terminated ASCII string Source are concatenated to the end of Null-\r
-  terminated ASCII string Destination, and Destination is returned. At most,\r
-  Length ASCII characters are concatenated from Source to the end of\r
-  Destination, and Destination is always Null-terminated. If Length is 0, then\r
-  Destination is returned unmodified. If Source and Destination overlap, then\r
-  the results are undefined.\r
-\r
-  If Length > 0 and Destination is NULL, then ASSERT().\r
-  If Length > 0 and Source is NULL, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and Length is greater than\r
-  PcdMaximumAsciiStringLength, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and Destination contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
-  then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and Source contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters, not including the Null-terminator,\r
-  then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and concatenating Destination and\r
-  Source results in a ASCII string with more than PcdMaximumAsciiStringLength\r
-  ASCII characters, not including the Null-terminator, then ASSERT().\r
-\r
-  @param  Destination The pointer to a Null-terminated ASCII string.\r
-  @param  Source      The pointer to a Null-terminated ASCII string.\r
-  @param  Length      The maximum number of ASCII characters to concatenate from\r
-                      Source.\r
-\r
-  @return Destination\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-AsciiStrnCat (\r
-  IN OUT  CHAR8                     *Destination,\r
-  IN      CONST CHAR8               *Source,\r
-  IN      UINTN                     Length\r
+  IN      CONST CHAR8  *FirstString,\r
+  IN      CONST CHAR8  *SecondString,\r
+  IN      UINTN        Length\r
   );\r
-#endif // !defined (DISABLE_NEW_DEPRECATED_INTERFACES)\r
 \r
 /**\r
   Returns the first occurrence of a Null-terminated ASCII sub-string\r
@@ -2208,11 +1833,10 @@ AsciiStrnCat (
 CHAR8 *\r
 EFIAPI\r
 AsciiStrStr (\r
-  IN      CONST CHAR8               *String,\r
-  IN      CONST CHAR8               *SearchString\r
+  IN      CONST CHAR8  *String,\r
+  IN      CONST CHAR8  *SearchString\r
   );\r
 \r
-\r
 /**\r
   Convert a Null-terminated ASCII decimal string to a value of type\r
   UINTN.\r
@@ -2246,10 +1870,9 @@ AsciiStrStr (
 UINTN\r
 EFIAPI\r
 AsciiStrDecimalToUintn (\r
-  IN      CONST CHAR8               *String\r
+  IN      CONST CHAR8  *String\r
   );\r
 \r
-\r
 /**\r
   Convert a Null-terminated ASCII decimal string to a value of type\r
   UINT64.\r
@@ -2283,10 +1906,9 @@ AsciiStrDecimalToUintn (
 UINT64\r
 EFIAPI\r
 AsciiStrDecimalToUint64 (\r
-  IN      CONST CHAR8               *String\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
@@ -2324,10 +1946,9 @@ AsciiStrDecimalToUint64 (
 UINTN\r
 EFIAPI\r
 AsciiStrHexToUintn (\r
-  IN      CONST CHAR8               *String\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
@@ -2365,7 +1986,7 @@ AsciiStrHexToUintn (
 UINT64\r
 EFIAPI\r
 AsciiStrHexToUint64 (\r
-  IN      CONST CHAR8                *String\r
+  IN      CONST CHAR8  *String\r
   );\r
 \r
 /**\r
@@ -2392,10 +2013,6 @@ AsciiStrHexToUint64 (
   "::" can be used to compress one or more groups of X when X contains only 0.\r
   The "::" can only appear once in the String.\r
 \r
-  If String is NULL, then ASSERT().\r
-\r
-  If Address is NULL, then ASSERT().\r
-\r
   If EndPointer is not NULL and Address is translated from String, a pointer\r
   to the character that stopped the scan is stored at the location pointed to\r
   by EndPointer.\r
@@ -2423,10 +2040,10 @@ AsciiStrHexToUint64 (
 RETURN_STATUS\r
 EFIAPI\r
 AsciiStrToIpv6Address (\r
-  IN  CONST CHAR8        *String,\r
-  OUT CHAR8              **EndPointer, OPTIONAL\r
-  OUT IPv6_ADDRESS       *Address,\r
-  OUT UINT8              *PrefixLength OPTIONAL\r
+  IN  CONST CHAR8   *String,\r
+  OUT CHAR8         **EndPointer  OPTIONAL,\r
+  OUT IPv6_ADDRESS  *Address,\r
+  OUT UINT8         *PrefixLength OPTIONAL\r
   );\r
 \r
 /**\r
@@ -2447,10 +2064,6 @@ AsciiStrToIpv6Address (
   When /P is in the String, the function stops at the first character that is not\r
   a valid decimal digit character after P is converted.\r
 \r
-  If String is NULL, then ASSERT().\r
-\r
-  If Address is NULL, then ASSERT().\r
-\r
   If EndPointer is not NULL and Address is translated from String, a pointer\r
   to the character that stopped the scan is stored at the location pointed to\r
   by EndPointer.\r
@@ -2475,10 +2088,10 @@ AsciiStrToIpv6Address (
 RETURN_STATUS\r
 EFIAPI\r
 AsciiStrToIpv4Address (\r
-  IN  CONST CHAR8        *String,\r
-  OUT CHAR8              **EndPointer, OPTIONAL\r
-  OUT IPv4_ADDRESS       *Address,\r
-  OUT UINT8              *PrefixLength OPTIONAL\r
+  IN  CONST CHAR8   *String,\r
+  OUT CHAR8         **EndPointer  OPTIONAL,\r
+  OUT IPv4_ADDRESS  *Address,\r
+  OUT UINT8         *PrefixLength OPTIONAL\r
   );\r
 \r
 /**\r
@@ -2512,9 +2125,6 @@ AsciiStrToIpv4Address (
                   oo          Data4[48:55]\r
                   pp          Data4[56:63]\r
 \r
-  If String is NULL, then ASSERT().\r
-  If Guid is NULL, then ASSERT().\r
-\r
   @param  String                   Pointer to a Null-terminated ASCII string.\r
   @param  Guid                     Pointer to the converted GUID.\r
 \r
@@ -2527,8 +2137,8 @@ AsciiStrToIpv4Address (
 RETURN_STATUS\r
 EFIAPI\r
 AsciiStrToGuid (\r
-  IN  CONST CHAR8        *String,\r
-  OUT GUID               *Guid\r
+  IN  CONST CHAR8  *String,\r
+  OUT GUID         *Guid\r
   );\r
 \r
 /**\r
@@ -2545,17 +2155,6 @@ AsciiStrToGuid (
   decoding stops after Length of characters and outputs Buffer containing\r
   (Length / 2) bytes.\r
 \r
-  If String is NULL, then ASSERT().\r
-\r
-  If Buffer is NULL, then ASSERT().\r
-\r
-  If Length is not multiple of 2, then ASSERT().\r
-\r
-  If PcdMaximumAsciiStringLength is not zero and Length is greater than\r
-  PcdMaximumAsciiStringLength, then ASSERT().\r
-\r
-  If MaxBufferSize is less than (Length / 2), then ASSERT().\r
-\r
   @param  String                   Pointer to a Null-terminated ASCII string.\r
   @param  Length                   The number of ASCII characters to decode.\r
   @param  Buffer                   Pointer to the converted bytes array.\r
@@ -2576,52 +2175,12 @@ AsciiStrToGuid (
 RETURN_STATUS\r
 EFIAPI\r
 AsciiStrHexToBytes (\r
-  IN  CONST CHAR8        *String,\r
-  IN  UINTN              Length,\r
-  OUT UINT8              *Buffer,\r
-  IN  UINTN              MaxBufferSize\r
-  );\r
-\r
-#ifndef DISABLE_NEW_DEPRECATED_INTERFACES\r
-\r
-/**\r
-  [ATTENTION] This function is deprecated for security reason.\r
-\r
-  Convert one Null-terminated ASCII string to a Null-terminated\r
-  Unicode string and returns the Unicode string.\r
-\r
-  This function converts the contents of the ASCII string Source to the Unicode\r
-  string Destination, and returns Destination.  The function terminates the\r
-  Unicode string Destination by appending a Null-terminator character at the end.\r
-  The caller is responsible to make sure Destination points to a buffer with size\r
-  equal or greater than ((AsciiStrLen (Source) + 1) * sizeof (CHAR16)) in bytes.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Destination is not aligned on a 16-bit boundary, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and Source contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
-  PcdMaximumUnicodeStringLength ASCII characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  Source        The pointer to a Null-terminated ASCII string.\r
-  @param  Destination   The pointer to a Null-terminated Unicode string.\r
-\r
-  @return Destination.\r
-\r
-**/\r
-CHAR16 *\r
-EFIAPI\r
-AsciiStrToUnicodeStr (\r
-  IN      CONST CHAR8               *Source,\r
-  OUT     CHAR16                    *Destination\r
+  IN  CONST CHAR8  *String,\r
+  IN  UINTN        Length,\r
+  OUT UINT8        *Buffer,\r
+  IN  UINTN        MaxBufferSize\r
   );\r
 \r
-#endif // !defined (DISABLE_NEW_DEPRECATED_INTERFACES)\r
-\r
 /**\r
   Convert one Null-terminated ASCII string to a Null-terminated\r
   Unicode string.\r
@@ -2636,7 +2195,6 @@ AsciiStrToUnicodeStr (
   equal or greater than ((AsciiStrLen (Source) + 1) * sizeof (CHAR16)) in bytes.\r
 \r
   If Destination is not aligned on a 16-bit boundary, then ASSERT().\r
-  If an error would be returned, then the function will also ASSERT().\r
 \r
   If an error is returned, then the Destination is unmodified.\r
 \r
@@ -2662,9 +2220,9 @@ AsciiStrToUnicodeStr (
 RETURN_STATUS\r
 EFIAPI\r
 AsciiStrToUnicodeStrS (\r
-  IN      CONST CHAR8               *Source,\r
-  OUT     CHAR16                    *Destination,\r
-  IN      UINTN                     DestMax\r
+  IN      CONST CHAR8  *Source,\r
+  OUT     CHAR16       *Destination,\r
+  IN      UINTN        DestMax\r
   );\r
 \r
 /**\r
@@ -2682,7 +2240,6 @@ AsciiStrToUnicodeStrS (
   ((MIN(AsciiStrLen(Source), Length) + 1) * sizeof (CHAR8)) in bytes.\r
 \r
   If Destination is not aligned on a 16-bit boundary, then ASSERT().\r
-  If an error would be returned, then the function will also ASSERT().\r
 \r
   If an error is returned, then Destination and DestinationLength are\r
   unmodified.\r
@@ -2713,11 +2270,11 @@ AsciiStrToUnicodeStrS (
 RETURN_STATUS\r
 EFIAPI\r
 AsciiStrnToUnicodeStrS (\r
-  IN      CONST CHAR8               *Source,\r
-  IN      UINTN                     Length,\r
-  OUT     CHAR16                    *Destination,\r
-  IN      UINTN                     DestMax,\r
-  OUT     UINTN                     *DestinationLength\r
+  IN      CONST CHAR8  *Source,\r
+  IN      UINTN        Length,\r
+  OUT     CHAR16       *Destination,\r
+  IN      UINTN        DestMax,\r
+  OUT     UINTN        *DestinationLength\r
   );\r
 \r
 /**\r
@@ -2738,7 +2295,7 @@ AsciiStrnToUnicodeStrS (
 CHAR16\r
 EFIAPI\r
 CharToUpper (\r
-  IN      CHAR16                    Char\r
+  IN      CHAR16  Char\r
   );\r
 \r
 /**\r
@@ -2757,7 +2314,7 @@ CharToUpper (
 CHAR8\r
 EFIAPI\r
 AsciiCharToUpper (\r
-  IN      CHAR8                     Chr\r
+  IN      CHAR8  Chr\r
   );\r
 \r
 /**\r
@@ -2783,37 +2340,100 @@ RETURN_STATUS
 EFIAPI\r
 Base64Encode (\r
   IN  CONST UINT8  *Source,\r
-  IN        UINTN   SourceLength,\r
+  IN        UINTN  SourceLength,\r
   OUT       CHAR8  *Destination  OPTIONAL,\r
   IN OUT    UINTN  *DestinationSize\r
   );\r
 \r
 /**\r
-  Convert Base64 ascii string to binary data based on RFC4648.\r
+  Decode Base64 ASCII encoded data to 8-bit binary representation, based on\r
+  RFC4648.\r
 \r
-  Produce Null-terminated binary data in the output buffer specified by Destination and DestinationSize.\r
-  The binary data is produced by converting the Base64 ascii string specified by Source and SourceLength.\r
+  Decoding occurs according to "Table 1: The Base 64 Alphabet" in RFC4648.\r
 \r
-  @param Source          Input ASCII characters\r
-  @param SourceLength    Number of ASCII characters\r
-  @param Destination     Pointer to output buffer\r
-  @param DestinationSize Caller is responsible for passing in buffer of at least DestinationSize.\r
-                         Set 0 to get the size needed. Set to bytes stored on return.\r
+  Whitespace is ignored at all positions:\r
+  - 0x09 ('\t') horizontal tab\r
+  - 0x0A ('\n') new line\r
+  - 0x0B ('\v') vertical tab\r
+  - 0x0C ('\f') form feed\r
+  - 0x0D ('\r') carriage return\r
+  - 0x20 (' ')  space\r
 \r
-  @retval RETURN_SUCCESS             When binary buffer is filled in.\r
-  @retval RETURN_INVALID_PARAMETER   If Source is NULL or DestinationSize is NULL.\r
-  @retval RETURN_INVALID_PARAMETER   If SourceLength or DestinationSize is bigger than (MAX_ADDRESS -(UINTN)Destination ).\r
-  @retval RETURN_INVALID_PARAMETER   If there is any invalid character in input stream.\r
-  @retval RETURN_BUFFER_TOO_SMALL    If buffer length is smaller than required buffer size.\r
+  The minimum amount of required padding (with ASCII 0x3D, '=') is tolerated\r
+  and enforced at the end of the Base64 ASCII encoded data, and only there.\r
 \r
- **/\r
+  Other characters outside of the encoding alphabet cause the function to\r
+  reject the Base64 ASCII encoded data.\r
+\r
+  @param[in] Source               Array of CHAR8 elements containing the Base64\r
+                                  ASCII encoding. May be NULL if SourceSize is\r
+                                  zero.\r
+\r
+  @param[in] SourceSize           Number of CHAR8 elements in Source.\r
+\r
+  @param[out] Destination         Array of UINT8 elements receiving the decoded\r
+                                  8-bit binary representation. Allocated by the\r
+                                  caller. May be NULL if DestinationSize is\r
+                                  zero on input. If NULL, decoding is\r
+                                  performed, but the 8-bit binary\r
+                                  representation is not stored. If non-NULL and\r
+                                  the function returns an error, the contents\r
+                                  of Destination are indeterminate.\r
+\r
+  @param[in,out] DestinationSize  On input, the number of UINT8 elements that\r
+                                  the caller allocated for Destination. On\r
+                                  output, if the function returns\r
+                                  RETURN_SUCCESS or RETURN_BUFFER_TOO_SMALL,\r
+                                  the number of UINT8 elements that are\r
+                                  required for decoding the Base64 ASCII\r
+                                  representation. If the function returns a\r
+                                  value different from both RETURN_SUCCESS and\r
+                                  RETURN_BUFFER_TOO_SMALL, then DestinationSize\r
+                                  is indeterminate on output.\r
+\r
+  @retval RETURN_SUCCESS            SourceSize CHAR8 elements at Source have\r
+                                    been decoded to on-output DestinationSize\r
+                                    UINT8 elements at Destination. Note that\r
+                                    RETURN_SUCCESS covers the case when\r
+                                    DestinationSize is zero on input, and\r
+                                    Source decodes to zero bytes (due to\r
+                                    containing at most ignored whitespace).\r
+\r
+  @retval RETURN_BUFFER_TOO_SMALL   The input value of DestinationSize is not\r
+                                    large enough for decoding SourceSize CHAR8\r
+                                    elements at Source. The required number of\r
+                                    UINT8 elements has been stored to\r
+                                    DestinationSize.\r
+\r
+  @retval RETURN_INVALID_PARAMETER  DestinationSize is NULL.\r
+\r
+  @retval RETURN_INVALID_PARAMETER  Source is NULL, but SourceSize is not zero.\r
+\r
+  @retval RETURN_INVALID_PARAMETER  Destination is NULL, but DestinationSize is\r
+                                    not zero on input.\r
+\r
+  @retval RETURN_INVALID_PARAMETER  Source is non-NULL, and (Source +\r
+                                    SourceSize) would wrap around MAX_ADDRESS.\r
+\r
+  @retval RETURN_INVALID_PARAMETER  Destination is non-NULL, and (Destination +\r
+                                    DestinationSize) would wrap around\r
+                                    MAX_ADDRESS, as specified on input.\r
+\r
+  @retval RETURN_INVALID_PARAMETER  None of Source and Destination are NULL,\r
+                                    and CHAR8[SourceSize] at Source overlaps\r
+                                    UINT8[DestinationSize] at Destination, as\r
+                                    specified on input.\r
+\r
+  @retval RETURN_INVALID_PARAMETER  Invalid CHAR8 element encountered in\r
+                                    Source.\r
+**/\r
 RETURN_STATUS\r
 EFIAPI\r
 Base64Decode (\r
-  IN  CONST CHAR8  *Source,\r
-  IN        UINTN   SourceLength,\r
-  OUT       UINT8  *Destination  OPTIONAL,\r
-  IN OUT    UINTN  *DestinationSize\r
+  IN     CONST CHAR8  *Source          OPTIONAL,\r
+  IN     UINTN        SourceSize,\r
+  OUT    UINT8        *Destination     OPTIONAL,\r
+  IN OUT UINTN        *DestinationSize\r
   );\r
 \r
 /**\r
@@ -2832,10 +2452,9 @@ Base64Decode (
 UINT8\r
 EFIAPI\r
 DecimalToBcd8 (\r
-  IN      UINT8                     Value\r
+  IN      UINT8  Value\r
   );\r
 \r
-\r
 /**\r
   Converts an 8-bit BCD value to an 8-bit value.\r
 \r
@@ -2853,7 +2472,7 @@ DecimalToBcd8 (
 UINT8\r
 EFIAPI\r
 BcdToDecimal8 (\r
-  IN      UINT8                     Value\r
+  IN      UINT8  Value\r
   );\r
 \r
 //\r
@@ -2870,8 +2489,8 @@ BcdToDecimal8 (
 **/\r
 BOOLEAN\r
 EFIAPI\r
-PathRemoveLastItem(\r
-  IN OUT CHAR16 *Path\r
+PathRemoveLastItem (\r
+  IN OUT CHAR16  *Path\r
   );\r
 \r
 /**\r
@@ -2887,10 +2506,10 @@ PathRemoveLastItem(
 \r
   @return       Returns Path, otherwise returns NULL to indicate that an error has occurred.\r
 **/\r
-CHAR16*\r
+CHAR16 *\r
 EFIAPI\r
-PathCleanUpDirectories(\r
-  IN CHAR16 *Path\r
+PathCleanUpDirectories (\r
+  IN CHAR16  *Path\r
   );\r
 \r
 //\r
@@ -2913,6 +2532,32 @@ PathCleanUpDirectories(
 **/\r
 #define INITIALIZE_LIST_HEAD_VARIABLE(ListHead)  {&(ListHead), &(ListHead)}\r
 \r
+/**\r
+  Iterates over each node in a doubly linked list using each node's forward link.\r
+\r
+  @param  Entry     A pointer to a list node used as a loop cursor during iteration\r
+  @param  ListHead  The head node of the doubly linked list\r
+\r
+**/\r
+#define BASE_LIST_FOR_EACH(Entry, ListHead)    \\r
+  for(Entry = (ListHead)->ForwardLink; Entry != (ListHead); Entry = Entry->ForwardLink)\r
+\r
+/**\r
+  Iterates over each node in a doubly linked list using each node's forward link\r
+  with safety against node removal.\r
+\r
+  This macro uses NextEntry to temporarily store the next list node so the node\r
+  pointed to by Entry may be deleted in the current loop iteration step and\r
+  iteration can continue from the node pointed to by NextEntry.\r
+\r
+  @param  Entry     A pointer to a list node used as a loop cursor during iteration\r
+  @param  NextEntry A pointer to a list node used to temporarily store the next node\r
+  @param  ListHead  The head node of the doubly linked list\r
+\r
+**/\r
+#define BASE_LIST_FOR_EACH_SAFE(Entry, NextEntry, ListHead)            \\r
+  for(Entry = (ListHead)->ForwardLink, NextEntry = Entry->ForwardLink;\\r
+      Entry != (ListHead); Entry = NextEntry, NextEntry = Entry->ForwardLink)\r
 \r
 /**\r
   Checks whether FirstEntry and SecondEntry are part of the same doubly-linked\r
@@ -2936,11 +2581,10 @@ PathCleanUpDirectories(
 BOOLEAN\r
 EFIAPI\r
 IsNodeInList (\r
-  IN      CONST LIST_ENTRY      *FirstEntry,\r
-  IN      CONST LIST_ENTRY      *SecondEntry\r
+  IN      CONST LIST_ENTRY  *FirstEntry,\r
+  IN      CONST LIST_ENTRY  *SecondEntry\r
   );\r
 \r
-\r
 /**\r
   Initializes the head node of a doubly linked list, and returns the pointer to\r
   the head node of the doubly linked list.\r
@@ -2960,10 +2604,9 @@ IsNodeInList (
 LIST_ENTRY *\r
 EFIAPI\r
 InitializeListHead (\r
-  IN OUT  LIST_ENTRY                *ListHead\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
@@ -2989,11 +2632,10 @@ InitializeListHead (
 LIST_ENTRY *\r
 EFIAPI\r
 InsertHeadList (\r
-  IN OUT  LIST_ENTRY                *ListHead,\r
-  IN OUT  LIST_ENTRY                *Entry\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
@@ -3019,11 +2661,10 @@ InsertHeadList (
 LIST_ENTRY *\r
 EFIAPI\r
 InsertTailList (\r
-  IN OUT  LIST_ENTRY                *ListHead,\r
-  IN OUT  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
@@ -3047,10 +2688,9 @@ InsertTailList (
 LIST_ENTRY *\r
 EFIAPI\r
 GetFirstNode (\r
-  IN      CONST LIST_ENTRY          *List\r
+  IN      CONST LIST_ENTRY  *List\r
   );\r
 \r
-\r
 /**\r
   Retrieves the next node of a doubly linked list.\r
 \r
@@ -3075,11 +2715,10 @@ GetFirstNode (
 LIST_ENTRY *\r
 EFIAPI\r
 GetNextNode (\r
-  IN      CONST LIST_ENTRY          *List,\r
-  IN      CONST LIST_ENTRY          *Node\r
+  IN      CONST LIST_ENTRY  *List,\r
+  IN      CONST LIST_ENTRY  *Node\r
   );\r
 \r
-\r
 /**\r
   Retrieves the previous node of a doubly linked list.\r
 \r
@@ -3104,11 +2743,10 @@ GetNextNode (
 LIST_ENTRY *\r
 EFIAPI\r
 GetPreviousNode (\r
-  IN      CONST LIST_ENTRY          *List,\r
-  IN      CONST LIST_ENTRY          *Node\r
+  IN      CONST LIST_ENTRY  *List,\r
+  IN      CONST LIST_ENTRY  *Node\r
   );\r
 \r
-\r
 /**\r
   Checks to see if a doubly linked list is empty or not.\r
 \r
@@ -3131,10 +2769,9 @@ GetPreviousNode (
 BOOLEAN\r
 EFIAPI\r
 IsListEmpty (\r
-  IN      CONST LIST_ENTRY          *ListHead\r
+  IN      CONST LIST_ENTRY  *ListHead\r
   );\r
 \r
-\r
 /**\r
   Determines if a node in a doubly linked list is the head node of a the same\r
   doubly linked list.  This function is typically used to terminate a loop that\r
@@ -3164,11 +2801,10 @@ IsListEmpty (
 BOOLEAN\r
 EFIAPI\r
 IsNull (\r
-  IN      CONST LIST_ENTRY          *List,\r
-  IN      CONST LIST_ENTRY          *Node\r
+  IN      CONST LIST_ENTRY  *List,\r
+  IN      CONST LIST_ENTRY  *Node\r
   );\r
 \r
-\r
 /**\r
   Determines if a node the last node in a doubly linked list.\r
 \r
@@ -3195,11 +2831,10 @@ IsNull (
 BOOLEAN\r
 EFIAPI\r
 IsNodeAtEnd (\r
-  IN      CONST LIST_ENTRY          *List,\r
-  IN      CONST LIST_ENTRY          *Node\r
+  IN      CONST LIST_ENTRY  *List,\r
+  IN      CONST LIST_ENTRY  *Node\r
   );\r
 \r
-\r
 /**\r
   Swaps the location of two nodes in a doubly linked list, and returns the\r
   first node after the swap.\r
@@ -3229,11 +2864,10 @@ IsNodeAtEnd (
 LIST_ENTRY *\r
 EFIAPI\r
 SwapListEntries (\r
-  IN OUT  LIST_ENTRY                *FirstEntry,\r
-  IN OUT  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
@@ -3258,13 +2892,63 @@ SwapListEntries (
 LIST_ENTRY *\r
 EFIAPI\r
 RemoveEntryList (\r
-  IN      CONST LIST_ENTRY          *Entry\r
+  IN      CONST LIST_ENTRY  *Entry\r
   );\r
 \r
 //\r
 // Math Services\r
 //\r
 \r
+/**\r
+  Prototype for comparison function for any two element types.\r
+\r
+  @param[in] Buffer1                  The pointer to first buffer.\r
+  @param[in] Buffer2                  The pointer to second buffer.\r
+\r
+  @retval 0                           Buffer1 equal to Buffer2.\r
+  @return <0                          Buffer1 is less than Buffer2.\r
+  @return >0                          Buffer1 is greater than Buffer2.\r
+**/\r
+typedef\r
+INTN\r
+(EFIAPI *BASE_SORT_COMPARE)(\r
+  IN CONST VOID                 *Buffer1,\r
+  IN CONST VOID                 *Buffer2\r
+  );\r
+\r
+/**\r
+  This function is identical to perform QuickSort,\r
+  except that is uses the pre-allocated buffer so the in place sorting does not need to\r
+  allocate and free buffers constantly.\r
+\r
+  Each element must be equal sized.\r
+\r
+  if BufferToSort is NULL, then ASSERT.\r
+  if CompareFunction is NULL, then ASSERT.\r
+  if BufferOneElement is NULL, then ASSERT.\r
+  if ElementSize is < 1, then ASSERT.\r
+\r
+  if Count is < 2 then perform no action.\r
+\r
+  @param[in, out] BufferToSort   on call a Buffer of (possibly sorted) elements\r
+                                 on return a buffer of sorted elements\r
+  @param[in] Count               the number of elements in the buffer to sort\r
+  @param[in] ElementSize         Size of an element in bytes\r
+  @param[in] CompareFunction     The function to call to perform the comparison\r
+                                 of any 2 elements\r
+  @param[out] BufferOneElement   Caller provided buffer whose size equals to ElementSize.\r
+                                 It's used by QuickSort() for swapping in sorting.\r
+**/\r
+VOID\r
+EFIAPI\r
+QuickSort (\r
+  IN OUT VOID                 *BufferToSort,\r
+  IN CONST UINTN              Count,\r
+  IN CONST UINTN              ElementSize,\r
+  IN       BASE_SORT_COMPARE  CompareFunction,\r
+  OUT VOID                    *BufferOneElement\r
+  );\r
+\r
 /**\r
   Shifts a 64-bit integer left between 0 and 63 bits. The low bits are filled\r
   with zeros. The shifted value is returned.\r
@@ -3283,11 +2967,10 @@ RemoveEntryList (
 UINT64\r
 EFIAPI\r
 LShiftU64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     Count\r
+  IN      UINT64  Operand,\r
+  IN      UINTN   Count\r
   );\r
 \r
-\r
 /**\r
   Shifts a 64-bit integer right between 0 and 63 bits. This high bits are\r
   filled with zeros. The shifted value is returned.\r
@@ -3306,11 +2989,10 @@ LShiftU64 (
 UINT64\r
 EFIAPI\r
 RShiftU64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     Count\r
+  IN      UINT64  Operand,\r
+  IN      UINTN   Count\r
   );\r
 \r
-\r
 /**\r
   Shifts a 64-bit integer right between 0 and 63 bits. The high bits are filled\r
   with original integer's bit 63. The shifted value is returned.\r
@@ -3329,11 +3011,10 @@ RShiftU64 (
 UINT64\r
 EFIAPI\r
 ARShiftU64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     Count\r
+  IN      UINT64  Operand,\r
+  IN      UINTN   Count\r
   );\r
 \r
-\r
 /**\r
   Rotates a 32-bit integer left between 0 and 31 bits, filling the low bits\r
   with the high bits that were rotated.\r
@@ -3353,11 +3034,10 @@ ARShiftU64 (
 UINT32\r
 EFIAPI\r
 LRotU32 (\r
-  IN      UINT32                    Operand,\r
-  IN      UINTN                     Count\r
+  IN      UINT32  Operand,\r
+  IN      UINTN   Count\r
   );\r
 \r
-\r
 /**\r
   Rotates a 32-bit integer right between 0 and 31 bits, filling the high bits\r
   with the low bits that were rotated.\r
@@ -3377,11 +3057,10 @@ LRotU32 (
 UINT32\r
 EFIAPI\r
 RRotU32 (\r
-  IN      UINT32                    Operand,\r
-  IN      UINTN                     Count\r
+  IN      UINT32  Operand,\r
+  IN      UINTN   Count\r
   );\r
 \r
-\r
 /**\r
   Rotates a 64-bit integer left between 0 and 63 bits, filling the low bits\r
   with the high bits that were rotated.\r
@@ -3401,11 +3080,10 @@ RRotU32 (
 UINT64\r
 EFIAPI\r
 LRotU64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     Count\r
+  IN      UINT64  Operand,\r
+  IN      UINTN   Count\r
   );\r
 \r
-\r
 /**\r
   Rotates a 64-bit integer right between 0 and 63 bits, filling the high bits\r
   with the high low bits that were rotated.\r
@@ -3425,11 +3103,10 @@ LRotU64 (
 UINT64\r
 EFIAPI\r
 RRotU64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     Count\r
+  IN      UINT64  Operand,\r
+  IN      UINTN   Count\r
   );\r
 \r
-\r
 /**\r
   Returns the bit position of the lowest bit set in a 32-bit value.\r
 \r
@@ -3446,10 +3123,9 @@ RRotU64 (
 INTN\r
 EFIAPI\r
 LowBitSet32 (\r
-  IN      UINT32                    Operand\r
+  IN      UINT32  Operand\r
   );\r
 \r
-\r
 /**\r
   Returns the bit position of the lowest bit set in a 64-bit value.\r
 \r
@@ -3467,10 +3143,9 @@ LowBitSet32 (
 INTN\r
 EFIAPI\r
 LowBitSet64 (\r
-  IN      UINT64                    Operand\r
+  IN      UINT64  Operand\r
   );\r
 \r
-\r
 /**\r
   Returns the bit position of the highest bit set in a 32-bit value. Equivalent\r
   to log2(x).\r
@@ -3488,10 +3163,9 @@ LowBitSet64 (
 INTN\r
 EFIAPI\r
 HighBitSet32 (\r
-  IN      UINT32                    Operand\r
+  IN      UINT32  Operand\r
   );\r
 \r
-\r
 /**\r
   Returns the bit position of the highest bit set in a 64-bit value. Equivalent\r
   to log2(x).\r
@@ -3509,10 +3183,9 @@ HighBitSet32 (
 INTN\r
 EFIAPI\r
 HighBitSet64 (\r
-  IN      UINT64                    Operand\r
+  IN      UINT64  Operand\r
   );\r
 \r
-\r
 /**\r
   Returns the value of the highest bit set in a 32-bit value. Equivalent to\r
   1 << log2(x).\r
@@ -3529,10 +3202,9 @@ HighBitSet64 (
 UINT32\r
 EFIAPI\r
 GetPowerOfTwo32 (\r
-  IN      UINT32                    Operand\r
+  IN      UINT32  Operand\r
   );\r
 \r
-\r
 /**\r
   Returns the value of the highest bit set in a 64-bit value. Equivalent to\r
   1 << log2(x).\r
@@ -3549,10 +3221,9 @@ GetPowerOfTwo32 (
 UINT64\r
 EFIAPI\r
 GetPowerOfTwo64 (\r
-  IN      UINT64                    Operand\r
+  IN      UINT64  Operand\r
   );\r
 \r
-\r
 /**\r
   Switches the endianness of a 16-bit integer.\r
 \r
@@ -3568,10 +3239,9 @@ GetPowerOfTwo64 (
 UINT16\r
 EFIAPI\r
 SwapBytes16 (\r
-  IN      UINT16                    Value\r
+  IN      UINT16  Value\r
   );\r
 \r
-\r
 /**\r
   Switches the endianness of a 32-bit integer.\r
 \r
@@ -3587,10 +3257,9 @@ SwapBytes16 (
 UINT32\r
 EFIAPI\r
 SwapBytes32 (\r
-  IN      UINT32                    Value\r
+  IN      UINT32  Value\r
   );\r
 \r
-\r
 /**\r
   Switches the endianness of a 64-bit integer.\r
 \r
@@ -3606,10 +3275,9 @@ SwapBytes32 (
 UINT64\r
 EFIAPI\r
 SwapBytes64 (\r
-  IN      UINT64                    Value\r
+  IN      UINT64  Value\r
   );\r
 \r
-\r
 /**\r
   Multiples a 64-bit unsigned integer by a 32-bit unsigned integer and\r
   generates a 64-bit unsigned result.\r
@@ -3627,11 +3295,10 @@ SwapBytes64 (
 UINT64\r
 EFIAPI\r
 MultU64x32 (\r
-  IN      UINT64                    Multiplicand,\r
-  IN      UINT32                    Multiplier\r
+  IN      UINT64  Multiplicand,\r
+  IN      UINT32  Multiplier\r
   );\r
 \r
-\r
 /**\r
   Multiples a 64-bit unsigned integer by a 64-bit unsigned integer and\r
   generates a 64-bit unsigned result.\r
@@ -3649,11 +3316,10 @@ MultU64x32 (
 UINT64\r
 EFIAPI\r
 MultU64x64 (\r
-  IN      UINT64                    Multiplicand,\r
-  IN      UINT64                    Multiplier\r
+  IN      UINT64  Multiplicand,\r
+  IN      UINT64  Multiplier\r
   );\r
 \r
-\r
 /**\r
   Multiples a 64-bit signed integer by a 64-bit signed integer and generates a\r
   64-bit signed result.\r
@@ -3671,11 +3337,10 @@ MultU64x64 (
 INT64\r
 EFIAPI\r
 MultS64x64 (\r
-  IN      INT64                     Multiplicand,\r
-  IN      INT64                     Multiplier\r
+  IN      INT64  Multiplicand,\r
+  IN      INT64  Multiplier\r
   );\r
 \r
-\r
 /**\r
   Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates\r
   a 64-bit unsigned result.\r
@@ -3695,11 +3360,10 @@ MultS64x64 (
 UINT64\r
 EFIAPI\r
 DivU64x32 (\r
-  IN      UINT64                    Dividend,\r
-  IN      UINT32                    Divisor\r
+  IN      UINT64  Dividend,\r
+  IN      UINT32  Divisor\r
   );\r
 \r
-\r
 /**\r
   Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates\r
   a 32-bit unsigned remainder.\r
@@ -3719,11 +3383,10 @@ DivU64x32 (
 UINT32\r
 EFIAPI\r
 ModU64x32 (\r
-  IN      UINT64                    Dividend,\r
-  IN      UINT32                    Divisor\r
+  IN      UINT64  Dividend,\r
+  IN      UINT32  Divisor\r
   );\r
 \r
-\r
 /**\r
   Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates\r
   a 64-bit unsigned result and an optional 32-bit unsigned remainder.\r
@@ -3746,12 +3409,11 @@ ModU64x32 (
 UINT64\r
 EFIAPI\r
 DivU64x32Remainder (\r
-  IN      UINT64                    Dividend,\r
-  IN      UINT32                    Divisor,\r
-  OUT     UINT32                    *Remainder  OPTIONAL\r
+  IN      UINT64  Dividend,\r
+  IN      UINT32  Divisor,\r
+  OUT     UINT32  *Remainder  OPTIONAL\r
   );\r
 \r
-\r
 /**\r
   Divides a 64-bit unsigned integer by a 64-bit unsigned integer and generates\r
   a 64-bit unsigned result and an optional 64-bit unsigned remainder.\r
@@ -3774,12 +3436,11 @@ DivU64x32Remainder (
 UINT64\r
 EFIAPI\r
 DivU64x64Remainder (\r
-  IN      UINT64                    Dividend,\r
-  IN      UINT64                    Divisor,\r
-  OUT     UINT64                    *Remainder  OPTIONAL\r
+  IN      UINT64  Dividend,\r
+  IN      UINT64  Divisor,\r
+  OUT     UINT64  *Remainder  OPTIONAL\r
   );\r
 \r
-\r
 /**\r
   Divides a 64-bit signed integer by a 64-bit signed integer and generates a\r
   64-bit signed result and a optional 64-bit signed remainder.\r
@@ -3806,12 +3467,11 @@ DivU64x64Remainder (
 INT64\r
 EFIAPI\r
 DivS64x64Remainder (\r
-  IN      INT64                     Dividend,\r
-  IN      INT64                     Divisor,\r
-  OUT     INT64                     *Remainder  OPTIONAL\r
+  IN      INT64  Dividend,\r
+  IN      INT64  Divisor,\r
+  OUT     INT64  *Remainder  OPTIONAL\r
   );\r
 \r
-\r
 /**\r
   Reads a 16-bit value from memory that may be unaligned.\r
 \r
@@ -3828,10 +3488,9 @@ DivS64x64Remainder (
 UINT16\r
 EFIAPI\r
 ReadUnaligned16 (\r
-  IN CONST UINT16              *Buffer\r
+  IN CONST UINT16  *Buffer\r
   );\r
 \r
-\r
 /**\r
   Writes a 16-bit value to memory that may be unaligned.\r
 \r
@@ -3850,11 +3509,10 @@ ReadUnaligned16 (
 UINT16\r
 EFIAPI\r
 WriteUnaligned16 (\r
-  OUT UINT16                    *Buffer,\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
@@ -3871,10 +3529,9 @@ WriteUnaligned16 (
 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
@@ -3893,11 +3550,10 @@ ReadUnaligned24 (
 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
@@ -3914,10 +3570,9 @@ WriteUnaligned24 (
 UINT32\r
 EFIAPI\r
 ReadUnaligned32 (\r
-  IN CONST UINT32              *Buffer\r
+  IN CONST UINT32  *Buffer\r
   );\r
 \r
-\r
 /**\r
   Writes a 32-bit value to memory that may be unaligned.\r
 \r
@@ -3936,11 +3591,10 @@ ReadUnaligned32 (
 UINT32\r
 EFIAPI\r
 WriteUnaligned32 (\r
-  OUT UINT32                    *Buffer,\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
@@ -3957,10 +3611,9 @@ WriteUnaligned32 (
 UINT64\r
 EFIAPI\r
 ReadUnaligned64 (\r
-  IN CONST UINT64              *Buffer\r
+  IN CONST UINT64  *Buffer\r
   );\r
 \r
-\r
 /**\r
   Writes a 64-bit value to memory that may be unaligned.\r
 \r
@@ -3979,11 +3632,10 @@ ReadUnaligned64 (
 UINT64\r
 EFIAPI\r
 WriteUnaligned64 (\r
-  OUT UINT64                    *Buffer,\r
-  IN  UINT64                    Value\r
+  OUT UINT64  *Buffer,\r
+  IN  UINT64  Value\r
   );\r
 \r
-\r
 //\r
 // Bit Field Functions\r
 //\r
@@ -4010,12 +3662,11 @@ WriteUnaligned64 (
 UINT8\r
 EFIAPI\r
 BitFieldRead8 (\r
-  IN      UINT8                     Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
+  IN      UINT8  Operand,\r
+  IN      UINTN  StartBit,\r
+  IN      UINTN  EndBit\r
   );\r
 \r
-\r
 /**\r
   Writes a bit field to an 8-bit value, and returns the result.\r
 \r
@@ -4042,13 +3693,12 @@ BitFieldRead8 (
 UINT8\r
 EFIAPI\r
 BitFieldWrite8 (\r
-  IN      UINT8                     Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     Value\r
+  IN      UINT8  Operand,\r
+  IN      UINTN  StartBit,\r
+  IN      UINTN  EndBit,\r
+  IN      UINT8  Value\r
   );\r
 \r
-\r
 /**\r
   Reads a bit field from an 8-bit value, performs a bitwise OR, and returns the\r
   result.\r
@@ -4076,13 +3726,12 @@ BitFieldWrite8 (
 UINT8\r
 EFIAPI\r
 BitFieldOr8 (\r
-  IN      UINT8                     Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     OrData\r
+  IN      UINT8  Operand,\r
+  IN      UINTN  StartBit,\r
+  IN      UINTN  EndBit,\r
+  IN      UINT8  OrData\r
   );\r
 \r
-\r
 /**\r
   Reads a bit field from an 8-bit value, performs a bitwise AND, and returns\r
   the result.\r
@@ -4110,13 +3759,12 @@ BitFieldOr8 (
 UINT8\r
 EFIAPI\r
 BitFieldAnd8 (\r
-  IN      UINT8                     Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     AndData\r
+  IN      UINT8  Operand,\r
+  IN      UINTN  StartBit,\r
+  IN      UINTN  EndBit,\r
+  IN      UINT8  AndData\r
   );\r
 \r
-\r
 /**\r
   Reads a bit field from an 8-bit value, performs a bitwise AND followed by a\r
   bitwise OR, and returns the result.\r
@@ -4147,14 +3795,13 @@ BitFieldAnd8 (
 UINT8\r
 EFIAPI\r
 BitFieldAndThenOr8 (\r
-  IN      UINT8                     Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     AndData,\r
-  IN      UINT8                     OrData\r
+  IN      UINT8  Operand,\r
+  IN      UINTN  StartBit,\r
+  IN      UINTN  EndBit,\r
+  IN      UINT8  AndData,\r
+  IN      UINT8  OrData\r
   );\r
 \r
-\r
 /**\r
   Returns a bit field from a 16-bit value.\r
 \r
@@ -4177,12 +3824,11 @@ BitFieldAndThenOr8 (
 UINT16\r
 EFIAPI\r
 BitFieldRead16 (\r
-  IN      UINT16                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
+  IN      UINT16  Operand,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit\r
   );\r
 \r
-\r
 /**\r
   Writes a bit field to a 16-bit value, and returns the result.\r
 \r
@@ -4209,13 +3855,12 @@ BitFieldRead16 (
 UINT16\r
 EFIAPI\r
 BitFieldWrite16 (\r
-  IN      UINT16                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    Value\r
+  IN      UINT16  Operand,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit,\r
+  IN      UINT16  Value\r
   );\r
 \r
-\r
 /**\r
   Reads a bit field from a 16-bit value, performs a bitwise OR, and returns the\r
   result.\r
@@ -4243,13 +3888,12 @@ BitFieldWrite16 (
 UINT16\r
 EFIAPI\r
 BitFieldOr16 (\r
-  IN      UINT16                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    OrData\r
+  IN      UINT16  Operand,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit,\r
+  IN      UINT16  OrData\r
   );\r
 \r
-\r
 /**\r
   Reads a bit field from a 16-bit value, performs a bitwise AND, and returns\r
   the result.\r
@@ -4277,13 +3921,12 @@ BitFieldOr16 (
 UINT16\r
 EFIAPI\r
 BitFieldAnd16 (\r
-  IN      UINT16                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    AndData\r
+  IN      UINT16  Operand,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit,\r
+  IN      UINT16  AndData\r
   );\r
 \r
-\r
 /**\r
   Reads a bit field from a 16-bit value, performs a bitwise AND followed by a\r
   bitwise OR, and returns the result.\r
@@ -4314,14 +3957,13 @@ BitFieldAnd16 (
 UINT16\r
 EFIAPI\r
 BitFieldAndThenOr16 (\r
-  IN      UINT16                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    AndData,\r
-  IN      UINT16                    OrData\r
+  IN      UINT16  Operand,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit,\r
+  IN      UINT16  AndData,\r
+  IN      UINT16  OrData\r
   );\r
 \r
-\r
 /**\r
   Returns a bit field from a 32-bit value.\r
 \r
@@ -4344,12 +3986,11 @@ BitFieldAndThenOr16 (
 UINT32\r
 EFIAPI\r
 BitFieldRead32 (\r
-  IN      UINT32                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
+  IN      UINT32  Operand,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit\r
   );\r
 \r
-\r
 /**\r
   Writes a bit field to a 32-bit value, and returns the result.\r
 \r
@@ -4376,13 +4017,12 @@ BitFieldRead32 (
 UINT32\r
 EFIAPI\r
 BitFieldWrite32 (\r
-  IN      UINT32                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    Value\r
+  IN      UINT32  Operand,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit,\r
+  IN      UINT32  Value\r
   );\r
 \r
-\r
 /**\r
   Reads a bit field from a 32-bit value, performs a bitwise OR, and returns the\r
   result.\r
@@ -4410,13 +4050,12 @@ BitFieldWrite32 (
 UINT32\r
 EFIAPI\r
 BitFieldOr32 (\r
-  IN      UINT32                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    OrData\r
+  IN      UINT32  Operand,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit,\r
+  IN      UINT32  OrData\r
   );\r
 \r
-\r
 /**\r
   Reads a bit field from a 32-bit value, performs a bitwise AND, and returns\r
   the result.\r
@@ -4444,13 +4083,12 @@ BitFieldOr32 (
 UINT32\r
 EFIAPI\r
 BitFieldAnd32 (\r
-  IN      UINT32                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    AndData\r
+  IN      UINT32  Operand,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit,\r
+  IN      UINT32  AndData\r
   );\r
 \r
-\r
 /**\r
   Reads a bit field from a 32-bit value, performs a bitwise AND followed by a\r
   bitwise OR, and returns the result.\r
@@ -4481,14 +4119,13 @@ BitFieldAnd32 (
 UINT32\r
 EFIAPI\r
 BitFieldAndThenOr32 (\r
-  IN      UINT32                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    AndData,\r
-  IN      UINT32                    OrData\r
+  IN      UINT32  Operand,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit,\r
+  IN      UINT32  AndData,\r
+  IN      UINT32  OrData\r
   );\r
 \r
-\r
 /**\r
   Returns a bit field from a 64-bit value.\r
 \r
@@ -4511,12 +4148,11 @@ BitFieldAndThenOr32 (
 UINT64\r
 EFIAPI\r
 BitFieldRead64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
+  IN      UINT64  Operand,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit\r
   );\r
 \r
-\r
 /**\r
   Writes a bit field to a 64-bit value, and returns the result.\r
 \r
@@ -4543,13 +4179,12 @@ BitFieldRead64 (
 UINT64\r
 EFIAPI\r
 BitFieldWrite64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    Value\r
+  IN      UINT64  Operand,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit,\r
+  IN      UINT64  Value\r
   );\r
 \r
-\r
 /**\r
   Reads a bit field from a 64-bit value, performs a bitwise OR, and returns the\r
   result.\r
@@ -4577,13 +4212,12 @@ BitFieldWrite64 (
 UINT64\r
 EFIAPI\r
 BitFieldOr64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    OrData\r
+  IN      UINT64  Operand,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit,\r
+  IN      UINT64  OrData\r
   );\r
 \r
-\r
 /**\r
   Reads a bit field from a 64-bit value, performs a bitwise AND, and returns\r
   the result.\r
@@ -4611,13 +4245,12 @@ BitFieldOr64 (
 UINT64\r
 EFIAPI\r
 BitFieldAnd64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    AndData\r
+  IN      UINT64  Operand,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit,\r
+  IN      UINT64  AndData\r
   );\r
 \r
-\r
 /**\r
   Reads a bit field from a 64-bit value, performs a bitwise AND followed by a\r
   bitwise OR, and returns the result.\r
@@ -4648,11 +4281,11 @@ BitFieldAnd64 (
 UINT64\r
 EFIAPI\r
 BitFieldAndThenOr64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    AndData,\r
-  IN      UINT64                    OrData\r
+  IN      UINT64  Operand,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit,\r
+  IN      UINT64  AndData,\r
+  IN      UINT64  OrData\r
   );\r
 \r
 /**\r
@@ -4678,9 +4311,9 @@ BitFieldAndThenOr64 (
 UINT8\r
 EFIAPI\r
 BitFieldCountOnes32 (\r
-  IN       UINT32                   Operand,\r
-  IN       UINTN                    StartBit,\r
-  IN       UINTN                    EndBit\r
+  IN       UINT32  Operand,\r
+  IN       UINTN   StartBit,\r
+  IN       UINTN   EndBit\r
   );\r
 \r
 /**\r
@@ -4706,9 +4339,9 @@ BitFieldCountOnes32 (
 UINT8\r
 EFIAPI\r
 BitFieldCountOnes64 (\r
-  IN       UINT64                   Operand,\r
-  IN       UINTN                    StartBit,\r
-  IN       UINTN                    EndBit\r
+  IN       UINT64  Operand,\r
+  IN       UINTN   StartBit,\r
+  IN       UINTN   EndBit\r
   );\r
 \r
 //\r
@@ -4736,11 +4369,10 @@ BitFieldCountOnes64 (
 UINT8\r
 EFIAPI\r
 CalculateSum8 (\r
-  IN      CONST UINT8              *Buffer,\r
-  IN      UINTN                     Length\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
@@ -4762,11 +4394,10 @@ CalculateSum8 (
 UINT8\r
 EFIAPI\r
 CalculateCheckSum8 (\r
-  IN      CONST UINT8              *Buffer,\r
-  IN      UINTN                     Length\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
@@ -4789,11 +4420,10 @@ CalculateCheckSum8 (
 UINT16\r
 EFIAPI\r
 CalculateSum16 (\r
-  IN      CONST UINT16             *Buffer,\r
-  IN      UINTN                     Length\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
@@ -4817,11 +4447,10 @@ CalculateSum16 (
 UINT16\r
 EFIAPI\r
 CalculateCheckSum16 (\r
-  IN      CONST UINT16             *Buffer,\r
-  IN      UINTN                     Length\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
@@ -4844,11 +4473,10 @@ CalculateCheckSum16 (
 UINT32\r
 EFIAPI\r
 CalculateSum32 (\r
-  IN      CONST UINT32             *Buffer,\r
-  IN      UINTN                     Length\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
@@ -4872,11 +4500,10 @@ CalculateSum32 (
 UINT32\r
 EFIAPI\r
 CalculateCheckSum32 (\r
-  IN      CONST UINT32             *Buffer,\r
-  IN      UINTN                     Length\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
@@ -4899,11 +4526,10 @@ CalculateCheckSum32 (
 UINT64\r
 EFIAPI\r
 CalculateSum64 (\r
-  IN      CONST UINT64             *Buffer,\r
-  IN      UINTN                     Length\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
@@ -4927,8 +4553,8 @@ CalculateSum64 (
 UINT64\r
 EFIAPI\r
 CalculateCheckSum64 (\r
-  IN      CONST UINT64             *Buffer,\r
-  IN      UINTN                     Length\r
+  IN      CONST UINT64  *Buffer,\r
+  IN      UINTN         Length\r
   );\r
 \r
 /**\r
@@ -4946,9 +4572,43 @@ CalculateCheckSum64 (
 **/\r
 UINT32\r
 EFIAPI\r
-CalculateCrc32(\r
-  IN  VOID                         *Buffer,\r
-  IN  UINTN                        Length\r
+CalculateCrc32 (\r
+  IN  VOID   *Buffer,\r
+  IN  UINTN  Length\r
+  );\r
+\r
+/**\r
+   Calculates the CRC16-ANSI checksum of the given buffer.\r
+\r
+   @param[in]      Buffer        Pointer to the buffer.\r
+   @param[in]      Length        Length of the buffer, in bytes.\r
+   @param[in]      InitialValue  Initial value of the CRC.\r
+\r
+   @return The CRC16-ANSI checksum.\r
+**/\r
+UINT16\r
+EFIAPI\r
+CalculateCrc16Ansi (\r
+  IN  CONST VOID  *Buffer,\r
+  IN  UINTN       Length,\r
+  IN  UINT16      InitialValue\r
+  );\r
+\r
+/**\r
+   Calculates the CRC32c checksum of the given buffer.\r
+\r
+   @param[in]      Buffer        Pointer to the buffer.\r
+   @param[in]      Length        Length of the buffer, in bytes.\r
+   @param[in]      InitialValue  Initial value of the CRC.\r
+\r
+   @return The CRC32c checksum.\r
+**/\r
+UINT32\r
+EFIAPI\r
+CalculateCrc32c (\r
+  IN CONST VOID  *Buffer,\r
+  IN UINTN       Length,\r
+  IN UINT32      InitialValue\r
   );\r
 \r
 //\r
@@ -4960,16 +4620,14 @@ CalculateCrc32(
 \r
   @param  Context1        Context1 parameter passed into SwitchStack().\r
   @param  Context2        Context2 parameter passed into SwitchStack().\r
-\r
 **/\r
 typedef\r
 VOID\r
 (EFIAPI *SWITCH_STACK_ENTRY_POINT)(\r
-  IN      VOID                      *Context1,  OPTIONAL\r
+  IN      VOID                      *Context1   OPTIONAL,\r
   IN      VOID                      *Context2   OPTIONAL\r
   );\r
 \r
-\r
 /**\r
   Used to serialize load and store operations.\r
 \r
@@ -4983,7 +4641,6 @@ MemoryFence (
   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
@@ -5012,7 +4669,6 @@ SetJump (
   OUT     BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer\r
   );\r
 \r
-\r
 /**\r
   Restores the CPU context that was saved with SetJump().\r
 \r
@@ -5036,7 +4692,6 @@ LongJump (
   IN      UINTN                     Value\r
   );\r
 \r
-\r
 /**\r
   Enables CPU interrupts.\r
 \r
@@ -5047,7 +4702,6 @@ EnableInterrupts (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Disables CPU interrupts.\r
 \r
@@ -5058,7 +4712,6 @@ DisableInterrupts (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Disables CPU interrupts and returns the interrupt state prior to the disable\r
   operation.\r
@@ -5073,7 +4726,6 @@ SaveAndDisableInterrupts (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Enables CPU interrupts for the smallest window required to capture any\r
   pending interrupts.\r
@@ -5085,7 +4737,6 @@ EnableDisableInterrupts (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Retrieves the current CPU interrupt state.\r
 \r
@@ -5102,7 +4753,6 @@ GetInterruptState (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Set the current CPU interrupt state.\r
 \r
@@ -5120,10 +4770,9 @@ GetInterruptState (
 BOOLEAN\r
 EFIAPI\r
 SetInterruptState (\r
-  IN      BOOLEAN                   InterruptState\r
+  IN      BOOLEAN  InterruptState\r
   );\r
 \r
-\r
 /**\r
   Requests CPU to pause for a short period of time.\r
 \r
@@ -5137,7 +4786,6 @@ CpuPause (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Transfers control to a function starting with a new stack.\r
 \r
@@ -5171,13 +4819,12 @@ VOID
 EFIAPI\r
 SwitchStack (\r
   IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
-  IN      VOID                      *Context1,  OPTIONAL\r
-  IN      VOID                      *Context2,  OPTIONAL\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
@@ -5191,7 +4838,6 @@ CpuBreakpoint (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Executes an infinite loop.\r
 \r
@@ -5207,7 +4853,6 @@ CpuDeadLoop (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Uses as a barrier to stop speculative execution.\r
 \r
@@ -5221,6 +4866,157 @@ SpeculationBarrier (
   VOID\r
   );\r
 \r
+#if defined (MDE_CPU_X64) || defined (MDE_CPU_IA32)\r
+\r
+/**\r
+  The TDCALL instruction causes a VM exit to the Intel TDX module.  It is\r
+  used to call guest-side Intel TDX functions, either local or a TD exit\r
+  to the host VMM, as selected by Leaf.\r
+\r
+  @param[in]      Leaf        Leaf number of TDCALL instruction\r
+  @param[in]      Arg1        Arg1\r
+  @param[in]      Arg2        Arg2\r
+  @param[in]      Arg3        Arg3\r
+  @param[in,out]  Results  Returned result of the Leaf function\r
+\r
+  @return 0               A successful call\r
+  @return Other           See individual leaf functions\r
+**/\r
+UINTN\r
+EFIAPI\r
+TdCall (\r
+  IN UINT64    Leaf,\r
+  IN UINT64    Arg1,\r
+  IN UINT64    Arg2,\r
+  IN UINT64    Arg3,\r
+  IN OUT VOID  *Results\r
+  );\r
+\r
+/**\r
+  TDVMALL is a leaf function 0 for TDCALL. It helps invoke services from the\r
+  host VMM to pass/receive information.\r
+\r
+  @param[in]     Leaf        Number of sub-functions\r
+  @param[in]     Arg1        Arg1\r
+  @param[in]     Arg2        Arg2\r
+  @param[in]     Arg3        Arg3\r
+  @param[in]     Arg4        Arg4\r
+  @param[in,out] Results     Returned result of the sub-function\r
+\r
+  @return 0               A successful call\r
+  @return Other           See individual sub-functions\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+TdVmCall (\r
+  IN UINT64    Leaf,\r
+  IN UINT64    Arg1,\r
+  IN UINT64    Arg2,\r
+  IN UINT64    Arg3,\r
+  IN UINT64    Arg4,\r
+  IN OUT VOID  *Results\r
+  );\r
+\r
+/**\r
+  Probe if TD is enabled.\r
+\r
+  @return TRUE    TD is enabled.\r
+  @return FALSE   TD is not enabled.\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+TdIsEnabled (\r
+  VOID\r
+  );\r
+\r
+#endif\r
+\r
+#if defined (MDE_CPU_X64)\r
+//\r
+// The page size for the PVALIDATE instruction\r
+//\r
+typedef enum {\r
+  PvalidatePageSize4K = 0,\r
+  PvalidatePageSize2MB,\r
+} PVALIDATE_PAGE_SIZE;\r
+\r
+//\r
+// PVALIDATE Return Code.\r
+//\r
+#define PVALIDATE_RET_SUCCESS        0\r
+#define PVALIDATE_RET_FAIL_INPUT     1\r
+#define PVALIDATE_RET_SIZE_MISMATCH  6\r
+\r
+//\r
+// The PVALIDATE instruction did not make any changes to the RMP entry.\r
+//\r
+#define PVALIDATE_RET_NO_RMPUPDATE  255\r
+\r
+/**\r
+ Execute a PVALIDATE instruction to validate or to rescinds validation of a guest\r
+ page's RMP entry.\r
+\r
+ The instruction is available only when CPUID Fn8000_001F_EAX[SNP]=1.\r
+\r
+ The function is available on X64.\r
+\r
+ @param[in]    PageSize         The page size to use.\r
+ @param[in]    Validate         If TRUE, validate the guest virtual address\r
+                                otherwise invalidate the guest virtual address.\r
+ @param[in]    Address          The guest virtual address.\r
+\r
+ @retval PVALIDATE_RET_SUCCESS        The PVALIDATE instruction succeeded, and\r
+                                      updated the RMP entry.\r
+ @retval PVALIDATE_RET_NO_RMPUPDATE   The PVALIDATE instruction succeeded, but\r
+                                      did not update the RMP entry.\r
+ @return                              Failure code from the PVALIDATE\r
+                                      instruction.\r
+**/\r
+UINT32\r
+EFIAPI\r
+AsmPvalidate (\r
+  IN   PVALIDATE_PAGE_SIZE  PageSize,\r
+  IN   BOOLEAN              Validate,\r
+  IN   PHYSICAL_ADDRESS     Address\r
+  );\r
+\r
+//\r
+// RDX settings for RMPADJUST\r
+//\r
+#define RMPADJUST_VMPL_MAX               3\r
+#define RMPADJUST_VMPL_MASK              0xFF\r
+#define RMPADJUST_VMPL_SHIFT             0\r
+#define RMPADJUST_PERMISSION_MASK_MASK   0xFF\r
+#define RMPADJUST_PERMISSION_MASK_SHIFT  8\r
+#define RMPADJUST_VMSA_PAGE_BIT          BIT16\r
+\r
+/**\r
+  Adjusts the permissions of an SEV-SNP guest page.\r
+\r
+  Executes a RMPADJUST instruction with the register state specified by Rax,\r
+  Rcx, and Rdx. Returns Eax. This function is only available on X64.\r
+\r
+  The instruction is available only when CPUID Fn8000_001F_EAX[SNP]=1.\r
+\r
+  @param[in]  Rax   The value to load into RAX before executing the RMPADJUST\r
+                    instruction.\r
+  @param[in]  Rcx   The value to load into RCX before executing the RMPADJUST\r
+                    instruction.\r
+  @param[in]  Rdx   The value to load into RDX before executing the RMPADJUST\r
+                    instruction.\r
+\r
+  @return     Eax\r
+**/\r
+UINT32\r
+EFIAPI\r
+AsmRmpAdjust (\r
+  IN      UINT64  Rax,\r
+  IN      UINT64  Rcx,\r
+  IN      UINT64  Rdx\r
+  );\r
+\r
+#endif\r
 \r
 #if defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)\r
 ///\r
@@ -5229,21 +5025,21 @@ SpeculationBarrier (
 ///\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
@@ -5255,30 +5051,30 @@ typedef union {
 ///\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
+  UINTN    UintN;\r
 } IA32_EFLAGS32;\r
 \r
 ///\r
@@ -5288,22 +5084,22 @@ typedef union {
 ///\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
+  UINTN    UintN;\r
 } IA32_CR0;\r
 \r
 ///\r
@@ -5313,26 +5109,36 @@ typedef union {
 ///\r
 typedef union {\r
   struct {\r
-    UINT32  VME:1;          ///< Virtual-8086 Mode Extensions.\r
-    UINT32  PVI:1;          ///< Protected-Mode Virtual Interrupts.\r
-    UINT32  TSD:1;          ///< Time Stamp Disable.\r
-    UINT32  DE:1;           ///< Debugging Extensions.\r
-    UINT32  PSE:1;          ///< Page Size Extensions.\r
-    UINT32  PAE:1;          ///< Physical Address Extension.\r
-    UINT32  MCE:1;          ///< Machine Check Enable.\r
-    UINT32  PGE:1;          ///< Page Global Enable.\r
-    UINT32  PCE:1;          ///< Performance Monitoring Counter\r
-                            ///< Enable.\r
-    UINT32  OSFXSR:1;       ///< Operating System Support for\r
-                            ///< FXSAVE and FXRSTOR instructions\r
-    UINT32  OSXMMEXCPT:1;   ///< Operating System Support for\r
-                            ///< Unmasked SIMD Floating Point\r
-                            ///< Exceptions.\r
-    UINT32  Reserved_0:2;   ///< Reserved.\r
-    UINT32  VMXE:1;         ///< VMX Enable\r
-    UINT32  Reserved_1:18;  ///< Reserved.\r
+    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    UMIP       : 1; ///< User-Mode Instruction Prevention.\r
+    UINT32    LA57       : 1; ///< Linear Address 57bit.\r
+    UINT32    VMXE       : 1; ///< VMX Enable.\r
+    UINT32    SMXE       : 1; ///< SMX Enable.\r
+    UINT32    Reserved_3 : 1; ///< Reserved.\r
+    UINT32    FSGSBASE   : 1; ///< FSGSBASE Enable.\r
+    UINT32    PCIDE      : 1; ///< PCID Enable.\r
+    UINT32    OSXSAVE    : 1; ///< XSAVE and Processor Extended States Enable.\r
+    UINT32    Reserved_4 : 1; ///< Reserved.\r
+    UINT32    SMEP       : 1; ///< SMEP Enable.\r
+    UINT32    SMAP       : 1; ///< SMAP Enable.\r
+    UINT32    PKE        : 1; ///< Protection-Key Enable.\r
+    UINT32    Reserved_5 : 9; ///< Reserved.\r
   } Bits;\r
-  UINTN     UintN;\r
+  UINTN    UintN;\r
 } IA32_CR4;\r
 \r
 ///\r
@@ -5340,32 +5146,32 @@ typedef union {
 ///\r
 typedef union {\r
   struct {\r
-    UINT32  LimitLow:16;\r
-    UINT32  BaseLow:16;\r
-    UINT32  BaseMid:8;\r
-    UINT32  Type:4;\r
-    UINT32  S:1;\r
-    UINT32  DPL:2;\r
-    UINT32  P:1;\r
-    UINT32  LimitHigh:4;\r
-    UINT32  AVL:1;\r
-    UINT32  L:1;\r
-    UINT32  DB:1;\r
-    UINT32  G:1;\r
-    UINT32  BaseHigh:8;\r
+    UINT32    LimitLow  : 16;\r
+    UINT32    BaseLow   : 16;\r
+    UINT32    BaseMid   : 8;\r
+    UINT32    Type      : 4;\r
+    UINT32    S         : 1;\r
+    UINT32    DPL       : 2;\r
+    UINT32    P         : 1;\r
+    UINT32    LimitHigh : 4;\r
+    UINT32    AVL       : 1;\r
+    UINT32    L         : 1;\r
+    UINT32    DB        : 1;\r
+    UINT32    G         : 1;\r
+    UINT32    BaseHigh  : 8;\r
   } Bits;\r
-  UINT64  Uint64;\r
+  UINT64    Uint64;\r
 } IA32_SEGMENT_DESCRIPTOR;\r
 \r
 ///\r
 /// Byte packed structure for an IDTR, GDTR, LDTR descriptor.\r
 ///\r
-#pragma pack (1)\r
+  #pragma pack (1)\r
 typedef struct {\r
-  UINT16  Limit;\r
-  UINTN   Base;\r
+  UINT16    Limit;\r
+  UINTN     Base;\r
 } IA32_DESCRIPTOR;\r
-#pragma pack ()\r
+  #pragma pack ()\r
 \r
 #define IA32_IDT_GATE_TYPE_TASK          0x85\r
 #define IA32_IDT_GATE_TYPE_INTERRUPT_16  0x86\r
@@ -5373,25 +5179,25 @@ typedef struct {
 #define IA32_IDT_GATE_TYPE_INTERRUPT_32  0x8E\r
 #define IA32_IDT_GATE_TYPE_TRAP_32       0x8F\r
 \r
-#define IA32_GDT_TYPE_TSS               0x9\r
-#define IA32_GDT_ALIGNMENT              8\r
+#define IA32_GDT_TYPE_TSS   0x9\r
+#define IA32_GDT_ALIGNMENT  8\r
 \r
-#if defined (MDE_CPU_IA32)\r
+  #if defined (MDE_CPU_IA32)\r
 ///\r
 /// Byte packed structure for an IA-32 Interrupt Gate Descriptor.\r
 ///\r
 typedef union {\r
   struct {\r
-    UINT32  OffsetLow:16;   ///< Offset bits 15..0.\r
-    UINT32  Selector:16;    ///< Selector.\r
-    UINT32  Reserved_0:8;   ///< Reserved.\r
-    UINT32  GateType:8;     ///< Gate Type.  See #defines above.\r
-    UINT32  OffsetHigh:16;  ///< Offset bits 31..16.\r
+    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
+  UINT64    Uint64;\r
 } IA32_IDT_GATE_DESCRIPTOR;\r
 \r
-#pragma pack (1)\r
+    #pragma pack (1)\r
 //\r
 // IA32 Task-State Segment Definition\r
 //\r
@@ -5438,46 +5244,46 @@ typedef struct {
 \r
 typedef union {\r
   struct {\r
-    UINT32  LimitLow:16;    ///< Segment Limit 15..00\r
-    UINT32  BaseLow:16;     ///< Base Address  15..00\r
-    UINT32  BaseMid:8;      ///< Base Address  23..16\r
-    UINT32  Type:4;         ///< Type (1 0 B 1)\r
-    UINT32  Reserved_43:1;  ///< 0\r
-    UINT32  DPL:2;          ///< Descriptor Privilege Level\r
-    UINT32  P:1;            ///< Segment Present\r
-    UINT32  LimitHigh:4;    ///< Segment Limit 19..16\r
-    UINT32  AVL:1;          ///< Available for use by system software\r
-    UINT32  Reserved_52:2;  ///< 0 0\r
-    UINT32  G:1;            ///< Granularity\r
-    UINT32  BaseHigh:8;     ///< Base Address 31..24\r
+    UINT32    LimitLow    : 16; ///< Segment Limit 15..00\r
+    UINT32    BaseLow     : 16; ///< Base Address  15..00\r
+    UINT32    BaseMid     : 8;  ///< Base Address  23..16\r
+    UINT32    Type        : 4;  ///< Type (1 0 B 1)\r
+    UINT32    Reserved_43 : 1;  ///< 0\r
+    UINT32    DPL         : 2;  ///< Descriptor Privilege Level\r
+    UINT32    P           : 1;  ///< Segment Present\r
+    UINT32    LimitHigh   : 4;  ///< Segment Limit 19..16\r
+    UINT32    AVL         : 1;  ///< Available for use by system software\r
+    UINT32    Reserved_52 : 2;  ///< 0 0\r
+    UINT32    G           : 1;  ///< Granularity\r
+    UINT32    BaseHigh    : 8;  ///< Base Address 31..24\r
   } Bits;\r
-  UINT64  Uint64;\r
+  UINT64    Uint64;\r
 } IA32_TSS_DESCRIPTOR;\r
-#pragma pack ()\r
+    #pragma pack ()\r
 \r
-#endif // defined (MDE_CPU_IA32)\r
+  #endif // defined (MDE_CPU_IA32)\r
 \r
-#if defined (MDE_CPU_X64)\r
+  #if defined (MDE_CPU_X64)\r
 ///\r
 /// Byte packed structure for an x64 Interrupt Gate Descriptor.\r
 ///\r
 typedef union {\r
   struct {\r
-    UINT32  OffsetLow:16;   ///< Offset bits 15..0.\r
-    UINT32  Selector:16;    ///< Selector.\r
-    UINT32  Reserved_0:8;   ///< Reserved.\r
-    UINT32  GateType:8;     ///< Gate Type.  See #defines above.\r
-    UINT32  OffsetHigh:16;  ///< Offset bits 31..16.\r
-    UINT32  OffsetUpper:32; ///< Offset bits 63..32.\r
-    UINT32  Reserved_1:32;  ///< Reserved.\r
+    UINT32    OffsetLow   : 16; ///< Offset bits 15..0.\r
+    UINT32    Selector    : 16; ///< Selector.\r
+    UINT32    Reserved_0  : 8;  ///< Reserved.\r
+    UINT32    GateType    : 8;  ///< Gate Type.  See #defines above.\r
+    UINT32    OffsetHigh  : 16; ///< Offset bits 31..16.\r
+    UINT32    OffsetUpper : 32; ///< Offset bits 63..32.\r
+    UINT32    Reserved_1  : 32; ///< Reserved.\r
   } Bits;\r
   struct {\r
-    UINT64  Uint64;\r
-    UINT64  Uint64_1;\r
+    UINT64    Uint64;\r
+    UINT64    Uint64_1;\r
   } Uint128;\r
 } IA32_IDT_GATE_DESCRIPTOR;\r
 \r
-#pragma pack (1)\r
+    #pragma pack (1)\r
 //\r
 // IA32 Task-State Segment Definition\r
 //\r
@@ -5495,116 +5301,116 @@ typedef struct {
 \r
 typedef union {\r
   struct {\r
-    UINT32  LimitLow:16;    ///< Segment Limit 15..00\r
-    UINT32  BaseLow:16;     ///< Base Address  15..00\r
-    UINT32  BaseMidl:8;     ///< Base Address  23..16\r
-    UINT32  Type:4;         ///< Type (1 0 B 1)\r
-    UINT32  Reserved_43:1;  ///< 0\r
-    UINT32  DPL:2;          ///< Descriptor Privilege Level\r
-    UINT32  P:1;            ///< Segment Present\r
-    UINT32  LimitHigh:4;    ///< Segment Limit 19..16\r
-    UINT32  AVL:1;          ///< Available for use by system software\r
-    UINT32  Reserved_52:2;  ///< 0 0\r
-    UINT32  G:1;            ///< Granularity\r
-    UINT32  BaseMidh:8;     ///< Base Address  31..24\r
-    UINT32  BaseHigh:32;    ///< Base Address  63..32\r
-    UINT32  Reserved_96:32; ///< Reserved\r
+    UINT32    LimitLow    : 16; ///< Segment Limit 15..00\r
+    UINT32    BaseLow     : 16; ///< Base Address  15..00\r
+    UINT32    BaseMidl    : 8;  ///< Base Address  23..16\r
+    UINT32    Type        : 4;  ///< Type (1 0 B 1)\r
+    UINT32    Reserved_43 : 1;  ///< 0\r
+    UINT32    DPL         : 2;  ///< Descriptor Privilege Level\r
+    UINT32    P           : 1;  ///< Segment Present\r
+    UINT32    LimitHigh   : 4;  ///< Segment Limit 19..16\r
+    UINT32    AVL         : 1;  ///< Available for use by system software\r
+    UINT32    Reserved_52 : 2;  ///< 0 0\r
+    UINT32    G           : 1;  ///< Granularity\r
+    UINT32    BaseMidh    : 8;  ///< Base Address  31..24\r
+    UINT32    BaseHigh    : 32; ///< Base Address  63..32\r
+    UINT32    Reserved_96 : 32; ///< Reserved\r
   } Bits;\r
   struct {\r
-    UINT64  Uint64;\r
-    UINT64  Uint64_1;\r
+    UINT64    Uint64;\r
+    UINT64    Uint64_1;\r
   } Uint128;\r
 } IA32_TSS_DESCRIPTOR;\r
-#pragma pack ()\r
+    #pragma pack ()\r
 \r
-#endif // defined (MDE_CPU_X64)\r
+  #endif // defined (MDE_CPU_X64)\r
 \r
 ///\r
 /// Byte packed structure for an FP/SSE/SSE2 context.\r
 ///\r
 typedef struct {\r
-  UINT8  Buffer[512];\r
+  UINT8    Buffer[512];\r
 } IA32_FX_BUFFER;\r
 \r
 ///\r
 /// Structures for the 16-bit real mode thunks.\r
 ///\r
 typedef struct {\r
-  UINT32                            Reserved1;\r
-  UINT32                            Reserved2;\r
-  UINT32                            Reserved3;\r
-  UINT32                            Reserved4;\r
-  UINT8                             BL;\r
-  UINT8                             BH;\r
-  UINT16                            Reserved5;\r
-  UINT8                             DL;\r
-  UINT8                             DH;\r
-  UINT16                            Reserved6;\r
-  UINT8                             CL;\r
-  UINT8                             CH;\r
-  UINT16                            Reserved7;\r
-  UINT8                             AL;\r
-  UINT8                             AH;\r
-  UINT16                            Reserved8;\r
+  UINT32    Reserved1;\r
+  UINT32    Reserved2;\r
+  UINT32    Reserved3;\r
+  UINT32    Reserved4;\r
+  UINT8     BL;\r
+  UINT8     BH;\r
+  UINT16    Reserved5;\r
+  UINT8     DL;\r
+  UINT8     DH;\r
+  UINT16    Reserved6;\r
+  UINT8     CL;\r
+  UINT8     CH;\r
+  UINT16    Reserved7;\r
+  UINT8     AL;\r
+  UINT8     AH;\r
+  UINT16    Reserved8;\r
 } IA32_BYTE_REGS;\r
 \r
 typedef struct {\r
-  UINT16                            DI;\r
-  UINT16                            Reserved1;\r
-  UINT16                            SI;\r
-  UINT16                            Reserved2;\r
-  UINT16                            BP;\r
-  UINT16                            Reserved3;\r
-  UINT16                            SP;\r
-  UINT16                            Reserved4;\r
-  UINT16                            BX;\r
-  UINT16                            Reserved5;\r
-  UINT16                            DX;\r
-  UINT16                            Reserved6;\r
-  UINT16                            CX;\r
-  UINT16                            Reserved7;\r
-  UINT16                            AX;\r
-  UINT16                            Reserved8;\r
+  UINT16    DI;\r
+  UINT16    Reserved1;\r
+  UINT16    SI;\r
+  UINT16    Reserved2;\r
+  UINT16    BP;\r
+  UINT16    Reserved3;\r
+  UINT16    SP;\r
+  UINT16    Reserved4;\r
+  UINT16    BX;\r
+  UINT16    Reserved5;\r
+  UINT16    DX;\r
+  UINT16    Reserved6;\r
+  UINT16    CX;\r
+  UINT16    Reserved7;\r
+  UINT16    AX;\r
+  UINT16    Reserved8;\r
 } IA32_WORD_REGS;\r
 \r
 typedef struct {\r
-  UINT32                            EDI;\r
-  UINT32                            ESI;\r
-  UINT32                            EBP;\r
-  UINT32                            ESP;\r
-  UINT32                            EBX;\r
-  UINT32                            EDX;\r
-  UINT32                            ECX;\r
-  UINT32                            EAX;\r
-  UINT16                            DS;\r
-  UINT16                            ES;\r
-  UINT16                            FS;\r
-  UINT16                            GS;\r
-  IA32_EFLAGS32                     EFLAGS;\r
-  UINT32                            Eip;\r
-  UINT16                            CS;\r
-  UINT16                            SS;\r
+  UINT32           EDI;\r
+  UINT32           ESI;\r
+  UINT32           EBP;\r
+  UINT32           ESP;\r
+  UINT32           EBX;\r
+  UINT32           EDX;\r
+  UINT32           ECX;\r
+  UINT32           EAX;\r
+  UINT16           DS;\r
+  UINT16           ES;\r
+  UINT16           FS;\r
+  UINT16           GS;\r
+  IA32_EFLAGS32    EFLAGS;\r
+  UINT32           Eip;\r
+  UINT16           CS;\r
+  UINT16           SS;\r
 } IA32_DWORD_REGS;\r
 \r
 typedef union {\r
-  IA32_DWORD_REGS                   E;\r
-  IA32_WORD_REGS                    X;\r
-  IA32_BYTE_REGS                    H;\r
+  IA32_DWORD_REGS    E;\r
+  IA32_WORD_REGS     X;\r
+  IA32_BYTE_REGS     H;\r
 } IA32_REGISTER_SET;\r
 \r
 ///\r
 /// Byte packed structure for an 16-bit real mode thunks.\r
 ///\r
 typedef struct {\r
-  IA32_REGISTER_SET                 *RealModeState;\r
-  VOID                              *RealModeBuffer;\r
-  UINT32                            RealModeBufferSize;\r
-  UINT32                            ThunkAttributes;\r
+  IA32_REGISTER_SET    *RealModeState;\r
+  VOID                 *RealModeBuffer;\r
+  UINT32               RealModeBufferSize;\r
+  UINT32               ThunkAttributes;\r
 } THUNK_CONTEXT;\r
 \r
-#define THUNK_ATTRIBUTE_BIG_REAL_MODE             0x00000001\r
-#define THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15   0x00000002\r
-#define THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL 0x00000004\r
+#define THUNK_ATTRIBUTE_BIG_REAL_MODE              0x00000001\r
+#define THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15    0x00000002\r
+#define THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL  0x00000004\r
 \r
 ///\r
 /// Type definition for representing labels in NASM source code that allow for\r
@@ -5618,7 +5424,9 @@ typedef struct {
 /// edk2 coding style for function (or pointer-to-function) typedefs. The VOID\r
 /// return type and the VOID argument list are merely artifacts.\r
 ///\r
-typedef VOID (X86_ASSEMBLY_PATCH_LABEL) (VOID);\r
+typedef VOID (X86_ASSEMBLY_PATCH_LABEL) (\r
+  VOID\r
+  );\r
 \r
 /**\r
   Retrieves CPUID information.\r
@@ -5648,14 +5456,13 @@ typedef VOID (X86_ASSEMBLY_PATCH_LABEL) (VOID);
 UINT32\r
 EFIAPI\r
 AsmCpuid (\r
-  IN      UINT32                    Index,\r
-  OUT     UINT32                    *Eax,  OPTIONAL\r
-  OUT     UINT32                    *Ebx,  OPTIONAL\r
-  OUT     UINT32                    *Ecx,  OPTIONAL\r
-  OUT     UINT32                    *Edx   OPTIONAL\r
+  IN      UINT32  Index,\r
+  OUT     UINT32  *Eax   OPTIONAL,\r
+  OUT     UINT32  *Ebx   OPTIONAL,\r
+  OUT     UINT32  *Ecx   OPTIONAL,\r
+  OUT     UINT32  *Edx   OPTIONAL\r
   );\r
 \r
-\r
 /**\r
   Retrieves CPUID information using an extended leaf identifier.\r
 \r
@@ -5691,15 +5498,14 @@ AsmCpuid (
 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
+  IN      UINT32  Index,\r
+  IN      UINT32  SubIndex,\r
+  OUT     UINT32  *Eax   OPTIONAL,\r
+  OUT     UINT32  *Ebx   OPTIONAL,\r
+  OUT     UINT32  *Ecx   OPTIONAL,\r
+  OUT     UINT32  *Edx   OPTIONAL\r
   );\r
 \r
-\r
 /**\r
   Set CD bit and clear NW bit of CR0 followed by a WBINVD.\r
 \r
@@ -5713,7 +5519,6 @@ AsmDisableCache (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Perform a WBINVD and clear both the CD and NW bits of CR0.\r
 \r
@@ -5727,7 +5532,6 @@ AsmEnableCache (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Returns the lower 32-bits of a Machine Specific Register(MSR).\r
 \r
@@ -5745,10 +5549,9 @@ AsmEnableCache (
 UINT32\r
 EFIAPI\r
 AsmReadMsr32 (\r
-  IN      UINT32                    Index\r
+  IN      UINT32  Index\r
   );\r
 \r
-\r
 /**\r
   Writes a 32-bit value to a Machine Specific Register(MSR), and returns the value.\r
   The upper 32-bits of the MSR are set to zero.\r
@@ -5769,11 +5572,10 @@ AsmReadMsr32 (
 UINT32\r
 EFIAPI\r
 AsmWriteMsr32 (\r
-  IN      UINT32                    Index,\r
-  IN      UINT32                    Value\r
+  IN      UINT32  Index,\r
+  IN      UINT32  Value\r
   );\r
 \r
-\r
 /**\r
   Reads a 64-bit MSR, performs a bitwise OR on the lower 32-bits, and\r
   writes the result back to the 64-bit MSR.\r
@@ -5796,11 +5598,10 @@ AsmWriteMsr32 (
 UINT32\r
 EFIAPI\r
 AsmMsrOr32 (\r
-  IN      UINT32                    Index,\r
-  IN      UINT32                    OrData\r
+  IN      UINT32  Index,\r
+  IN      UINT32  OrData\r
   );\r
 \r
-\r
 /**\r
   Reads a 64-bit MSR, performs a bitwise AND on the lower 32-bits, and writes\r
   the result back to the 64-bit MSR.\r
@@ -5823,11 +5624,10 @@ AsmMsrOr32 (
 UINT32\r
 EFIAPI\r
 AsmMsrAnd32 (\r
-  IN      UINT32                    Index,\r
-  IN      UINT32                    AndData\r
+  IN      UINT32  Index,\r
+  IN      UINT32  AndData\r
   );\r
 \r
-\r
 /**\r
   Reads a 64-bit MSR, performs a bitwise AND followed by a bitwise OR\r
   on the lower 32-bits, and writes the result back to the 64-bit MSR.\r
@@ -5853,12 +5653,11 @@ AsmMsrAnd32 (
 UINT32\r
 EFIAPI\r
 AsmMsrAndThenOr32 (\r
-  IN      UINT32                    Index,\r
-  IN      UINT32                    AndData,\r
-  IN      UINT32                    OrData\r
+  IN      UINT32  Index,\r
+  IN      UINT32  AndData,\r
+  IN      UINT32  OrData\r
   );\r
 \r
-\r
 /**\r
   Reads a bit field of an MSR.\r
 \r
@@ -5884,12 +5683,11 @@ AsmMsrAndThenOr32 (
 UINT32\r
 EFIAPI\r
 AsmMsrBitFieldRead32 (\r
-  IN      UINT32                    Index,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
+  IN      UINT32  Index,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit\r
   );\r
 \r
-\r
 /**\r
   Writes a bit field to an MSR.\r
 \r
@@ -5918,13 +5716,12 @@ AsmMsrBitFieldRead32 (
 UINT32\r
 EFIAPI\r
 AsmMsrBitFieldWrite32 (\r
-  IN      UINT32                    Index,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    Value\r
+  IN      UINT32  Index,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit,\r
+  IN      UINT32  Value\r
   );\r
 \r
-\r
 /**\r
   Reads a bit field in a 64-bit MSR, performs a bitwise OR, and writes the\r
   result back to the bit field in the 64-bit MSR.\r
@@ -5955,13 +5752,12 @@ AsmMsrBitFieldWrite32 (
 UINT32\r
 EFIAPI\r
 AsmMsrBitFieldOr32 (\r
-  IN      UINT32                    Index,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    OrData\r
+  IN      UINT32  Index,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit,\r
+  IN      UINT32  OrData\r
   );\r
 \r
-\r
 /**\r
   Reads a bit field in a 64-bit MSR, performs a bitwise AND, and writes the\r
   result back to the bit field in the 64-bit MSR.\r
@@ -5992,13 +5788,12 @@ AsmMsrBitFieldOr32 (
 UINT32\r
 EFIAPI\r
 AsmMsrBitFieldAnd32 (\r
-  IN      UINT32                    Index,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    AndData\r
+  IN      UINT32  Index,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit,\r
+  IN      UINT32  AndData\r
   );\r
 \r
-\r
 /**\r
   Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a\r
   bitwise OR, and writes the result back to the bit field in the\r
@@ -6033,14 +5828,13 @@ AsmMsrBitFieldAnd32 (
 UINT32\r
 EFIAPI\r
 AsmMsrBitFieldAndThenOr32 (\r
-  IN      UINT32                    Index,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    AndData,\r
-  IN      UINT32                    OrData\r
+  IN      UINT32  Index,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit,\r
+  IN      UINT32  AndData,\r
+  IN      UINT32  OrData\r
   );\r
 \r
-\r
 /**\r
   Returns a 64-bit Machine Specific Register(MSR).\r
 \r
@@ -6058,10 +5852,9 @@ AsmMsrBitFieldAndThenOr32 (
 UINT64\r
 EFIAPI\r
 AsmReadMsr64 (\r
-  IN      UINT32                    Index\r
+  IN      UINT32  Index\r
   );\r
 \r
-\r
 /**\r
   Writes a 64-bit value to a Machine Specific Register(MSR), and returns the\r
   value.\r
@@ -6082,11 +5875,10 @@ AsmReadMsr64 (
 UINT64\r
 EFIAPI\r
 AsmWriteMsr64 (\r
-  IN      UINT32                    Index,\r
-  IN      UINT64                    Value\r
+  IN      UINT32  Index,\r
+  IN      UINT64  Value\r
   );\r
 \r
-\r
 /**\r
   Reads a 64-bit MSR, performs a bitwise OR, and writes the result\r
   back to the 64-bit MSR.\r
@@ -6108,11 +5900,10 @@ AsmWriteMsr64 (
 UINT64\r
 EFIAPI\r
 AsmMsrOr64 (\r
-  IN      UINT32                    Index,\r
-  IN      UINT64                    OrData\r
+  IN      UINT32  Index,\r
+  IN      UINT64  OrData\r
   );\r
 \r
-\r
 /**\r
   Reads a 64-bit MSR, performs a bitwise AND, and writes the result back to the\r
   64-bit MSR.\r
@@ -6134,11 +5925,10 @@ AsmMsrOr64 (
 UINT64\r
 EFIAPI\r
 AsmMsrAnd64 (\r
-  IN      UINT32                    Index,\r
-  IN      UINT64                    AndData\r
+  IN      UINT32  Index,\r
+  IN      UINT64  AndData\r
   );\r
 \r
-\r
 /**\r
   Reads a 64-bit MSR, performs a bitwise AND followed by a bitwise\r
   OR, and writes the result back to the 64-bit MSR.\r
@@ -6163,12 +5953,11 @@ AsmMsrAnd64 (
 UINT64\r
 EFIAPI\r
 AsmMsrAndThenOr64 (\r
-  IN      UINT32                    Index,\r
-  IN      UINT64                    AndData,\r
-  IN      UINT64                    OrData\r
+  IN      UINT32  Index,\r
+  IN      UINT64  AndData,\r
+  IN      UINT64  OrData\r
   );\r
 \r
-\r
 /**\r
   Reads a bit field of an MSR.\r
 \r
@@ -6194,12 +5983,11 @@ AsmMsrAndThenOr64 (
 UINT64\r
 EFIAPI\r
 AsmMsrBitFieldRead64 (\r
-  IN      UINT32                    Index,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
+  IN      UINT32  Index,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit\r
   );\r
 \r
-\r
 /**\r
   Writes a bit field to an MSR.\r
 \r
@@ -6227,13 +6015,12 @@ AsmMsrBitFieldRead64 (
 UINT64\r
 EFIAPI\r
 AsmMsrBitFieldWrite64 (\r
-  IN      UINT32                    Index,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    Value\r
+  IN      UINT32  Index,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit,\r
+  IN      UINT64  Value\r
   );\r
 \r
-\r
 /**\r
   Reads a bit field in a 64-bit MSR, performs a bitwise OR, and\r
   writes the result back to the bit field in the 64-bit MSR.\r
@@ -6264,13 +6051,12 @@ AsmMsrBitFieldWrite64 (
 UINT64\r
 EFIAPI\r
 AsmMsrBitFieldOr64 (\r
-  IN      UINT32                    Index,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    OrData\r
+  IN      UINT32  Index,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit,\r
+  IN      UINT64  OrData\r
   );\r
 \r
-\r
 /**\r
   Reads a bit field in a 64-bit MSR, performs a bitwise AND, and writes the\r
   result back to the bit field in the 64-bit MSR.\r
@@ -6301,13 +6087,12 @@ AsmMsrBitFieldOr64 (
 UINT64\r
 EFIAPI\r
 AsmMsrBitFieldAnd64 (\r
-  IN      UINT32                    Index,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    AndData\r
+  IN      UINT32  Index,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit,\r
+  IN      UINT64  AndData\r
   );\r
 \r
-\r
 /**\r
   Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a\r
   bitwise OR, and writes the result back to the bit field in the\r
@@ -6341,14 +6126,13 @@ AsmMsrBitFieldAnd64 (
 UINT64\r
 EFIAPI\r
 AsmMsrBitFieldAndThenOr64 (\r
-  IN      UINT32                    Index,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    AndData,\r
-  IN      UINT64                    OrData\r
+  IN      UINT32  Index,\r
+  IN      UINTN   StartBit,\r
+  IN      UINTN   EndBit,\r
+  IN      UINT64  AndData,\r
+  IN      UINT64  OrData\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of the EFLAGS register.\r
 \r
@@ -6365,7 +6149,6 @@ AsmReadEflags (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of the Control Register 0 (CR0).\r
 \r
@@ -6382,7 +6165,6 @@ AsmReadCr0 (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of the Control Register 2 (CR2).\r
 \r
@@ -6399,7 +6181,6 @@ AsmReadCr2 (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of the Control Register 3 (CR3).\r
 \r
@@ -6416,7 +6197,6 @@ AsmReadCr3 (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of the Control Register 4 (CR4).\r
 \r
@@ -6433,7 +6213,6 @@ AsmReadCr4 (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Writes a value to Control Register 0 (CR0).\r
 \r
@@ -6451,7 +6230,6 @@ AsmWriteCr0 (
   UINTN  Cr0\r
   );\r
 \r
-\r
 /**\r
   Writes a value to Control Register 2 (CR2).\r
 \r
@@ -6469,7 +6247,6 @@ AsmWriteCr2 (
   UINTN  Cr2\r
   );\r
 \r
-\r
 /**\r
   Writes a value to Control Register 3 (CR3).\r
 \r
@@ -6487,7 +6264,6 @@ AsmWriteCr3 (
   UINTN  Cr3\r
   );\r
 \r
-\r
 /**\r
   Writes a value to Control Register 4 (CR4).\r
 \r
@@ -6505,7 +6281,6 @@ AsmWriteCr4 (
   UINTN  Cr4\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of Debug Register 0 (DR0).\r
 \r
@@ -6522,7 +6297,6 @@ AsmReadDr0 (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of Debug Register 1 (DR1).\r
 \r
@@ -6539,7 +6313,6 @@ AsmReadDr1 (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of Debug Register 2 (DR2).\r
 \r
@@ -6556,7 +6329,6 @@ AsmReadDr2 (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of Debug Register 3 (DR3).\r
 \r
@@ -6573,7 +6345,6 @@ AsmReadDr3 (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of Debug Register 4 (DR4).\r
 \r
@@ -6590,7 +6361,6 @@ AsmReadDr4 (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of Debug Register 5 (DR5).\r
 \r
@@ -6607,7 +6377,6 @@ AsmReadDr5 (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of Debug Register 6 (DR6).\r
 \r
@@ -6624,7 +6393,6 @@ AsmReadDr6 (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of Debug Register 7 (DR7).\r
 \r
@@ -6641,7 +6409,6 @@ AsmReadDr7 (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Writes a value to Debug Register 0 (DR0).\r
 \r
@@ -6659,7 +6426,6 @@ AsmWriteDr0 (
   UINTN  Dr0\r
   );\r
 \r
-\r
 /**\r
   Writes a value to Debug Register 1 (DR1).\r
 \r
@@ -6677,7 +6443,6 @@ AsmWriteDr1 (
   UINTN  Dr1\r
   );\r
 \r
-\r
 /**\r
   Writes a value to Debug Register 2 (DR2).\r
 \r
@@ -6695,7 +6460,6 @@ AsmWriteDr2 (
   UINTN  Dr2\r
   );\r
 \r
-\r
 /**\r
   Writes a value to Debug Register 3 (DR3).\r
 \r
@@ -6713,7 +6477,6 @@ AsmWriteDr3 (
   UINTN  Dr3\r
   );\r
 \r
-\r
 /**\r
   Writes a value to Debug Register 4 (DR4).\r
 \r
@@ -6731,7 +6494,6 @@ AsmWriteDr4 (
   UINTN  Dr4\r
   );\r
 \r
-\r
 /**\r
   Writes a value to Debug Register 5 (DR5).\r
 \r
@@ -6749,7 +6511,6 @@ AsmWriteDr5 (
   UINTN  Dr5\r
   );\r
 \r
-\r
 /**\r
   Writes a value to Debug Register 6 (DR6).\r
 \r
@@ -6767,7 +6528,6 @@ AsmWriteDr6 (
   UINTN  Dr6\r
   );\r
 \r
-\r
 /**\r
   Writes a value to Debug Register 7 (DR7).\r
 \r
@@ -6785,7 +6545,6 @@ AsmWriteDr7 (
   UINTN  Dr7\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of Code Segment Register (CS).\r
 \r
@@ -6801,7 +6560,6 @@ AsmReadCs (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of Data Segment Register (DS).\r
 \r
@@ -6817,7 +6575,6 @@ AsmReadDs (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of Extra Segment Register (ES).\r
 \r
@@ -6833,7 +6590,6 @@ AsmReadEs (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of FS Data Segment Register (FS).\r
 \r
@@ -6849,7 +6605,6 @@ AsmReadFs (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of GS Data Segment Register (GS).\r
 \r
@@ -6865,7 +6620,6 @@ AsmReadGs (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of Stack Segment Register (SS).\r
 \r
@@ -6881,7 +6635,6 @@ AsmReadSs (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of Task Register (TR).\r
 \r
@@ -6897,7 +6650,6 @@ AsmReadTr (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current Global Descriptor Table Register(GDTR) descriptor.\r
 \r
@@ -6912,10 +6664,9 @@ AsmReadTr (
 VOID\r
 EFIAPI\r
 AsmReadGdtr (\r
-  OUT     IA32_DESCRIPTOR           *Gdtr\r
+  OUT     IA32_DESCRIPTOR  *Gdtr\r
   );\r
 \r
-\r
 /**\r
   Writes the current Global Descriptor Table Register (GDTR) descriptor.\r
 \r
@@ -6930,10 +6681,9 @@ AsmReadGdtr (
 VOID\r
 EFIAPI\r
 AsmWriteGdtr (\r
-  IN      CONST IA32_DESCRIPTOR     *Gdtr\r
+  IN      CONST IA32_DESCRIPTOR  *Gdtr\r
   );\r
 \r
-\r
 /**\r
   Reads the current Interrupt Descriptor Table Register(IDTR) descriptor.\r
 \r
@@ -6948,10 +6698,9 @@ AsmWriteGdtr (
 VOID\r
 EFIAPI\r
 AsmReadIdtr (\r
-  OUT     IA32_DESCRIPTOR           *Idtr\r
+  OUT     IA32_DESCRIPTOR  *Idtr\r
   );\r
 \r
-\r
 /**\r
   Writes the current Interrupt Descriptor Table Register(IDTR) descriptor.\r
 \r
@@ -6966,10 +6715,9 @@ AsmReadIdtr (
 VOID\r
 EFIAPI\r
 AsmWriteIdtr (\r
-  IN      CONST IA32_DESCRIPTOR     *Idtr\r
+  IN      CONST IA32_DESCRIPTOR  *Idtr\r
   );\r
 \r
-\r
 /**\r
   Reads the current Local Descriptor Table Register(LDTR) selector.\r
 \r
@@ -6985,7 +6733,6 @@ AsmReadLdtr (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Writes the current Local Descriptor Table Register (LDTR) selector.\r
 \r
@@ -6998,10 +6745,9 @@ AsmReadLdtr (
 VOID\r
 EFIAPI\r
 AsmWriteLdtr (\r
-  IN      UINT16                    Ldtr\r
+  IN      UINT16  Ldtr\r
   );\r
 \r
-\r
 /**\r
   Save the current floating point/SSE/SSE2 context to a buffer.\r
 \r
@@ -7018,10 +6764,9 @@ AsmWriteLdtr (
 VOID\r
 EFIAPI\r
 AsmFxSave (\r
-  OUT     IA32_FX_BUFFER            *Buffer\r
+  OUT     IA32_FX_BUFFER  *Buffer\r
   );\r
 \r
-\r
 /**\r
   Restores the current floating point/SSE/SSE2 context from a buffer.\r
 \r
@@ -7039,10 +6784,9 @@ AsmFxSave (
 VOID\r
 EFIAPI\r
 AsmFxRestore (\r
-  IN      CONST IA32_FX_BUFFER      *Buffer\r
+  IN      CONST IA32_FX_BUFFER  *Buffer\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of 64-bit MMX Register #0 (MM0).\r
 \r
@@ -7058,7 +6802,6 @@ AsmReadMm0 (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of 64-bit MMX Register #1 (MM1).\r
 \r
@@ -7074,7 +6817,6 @@ AsmReadMm1 (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of 64-bit MMX Register #2 (MM2).\r
 \r
@@ -7090,7 +6832,6 @@ AsmReadMm2 (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of 64-bit MMX Register #3 (MM3).\r
 \r
@@ -7106,7 +6847,6 @@ AsmReadMm3 (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of 64-bit MMX Register #4 (MM4).\r
 \r
@@ -7122,7 +6862,6 @@ AsmReadMm4 (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of 64-bit MMX Register #5 (MM5).\r
 \r
@@ -7138,7 +6877,6 @@ AsmReadMm5 (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of 64-bit MMX Register #6 (MM6).\r
 \r
@@ -7154,7 +6892,6 @@ AsmReadMm6 (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of 64-bit MMX Register #7 (MM7).\r
 \r
@@ -7170,7 +6907,6 @@ AsmReadMm7 (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Writes the current value of 64-bit MMX Register #0 (MM0).\r
 \r
@@ -7183,10 +6919,9 @@ AsmReadMm7 (
 VOID\r
 EFIAPI\r
 AsmWriteMm0 (\r
-  IN      UINT64                    Value\r
+  IN      UINT64  Value\r
   );\r
 \r
-\r
 /**\r
   Writes the current value of 64-bit MMX Register #1 (MM1).\r
 \r
@@ -7199,10 +6934,9 @@ AsmWriteMm0 (
 VOID\r
 EFIAPI\r
 AsmWriteMm1 (\r
-  IN      UINT64                    Value\r
+  IN      UINT64  Value\r
   );\r
 \r
-\r
 /**\r
   Writes the current value of 64-bit MMX Register #2 (MM2).\r
 \r
@@ -7215,10 +6949,9 @@ AsmWriteMm1 (
 VOID\r
 EFIAPI\r
 AsmWriteMm2 (\r
-  IN      UINT64                    Value\r
+  IN      UINT64  Value\r
   );\r
 \r
-\r
 /**\r
   Writes the current value of 64-bit MMX Register #3 (MM3).\r
 \r
@@ -7231,10 +6964,9 @@ AsmWriteMm2 (
 VOID\r
 EFIAPI\r
 AsmWriteMm3 (\r
-  IN      UINT64                    Value\r
+  IN      UINT64  Value\r
   );\r
 \r
-\r
 /**\r
   Writes the current value of 64-bit MMX Register #4 (MM4).\r
 \r
@@ -7247,10 +6979,9 @@ AsmWriteMm3 (
 VOID\r
 EFIAPI\r
 AsmWriteMm4 (\r
-  IN      UINT64                    Value\r
+  IN      UINT64  Value\r
   );\r
 \r
-\r
 /**\r
   Writes the current value of 64-bit MMX Register #5 (MM5).\r
 \r
@@ -7263,10 +6994,9 @@ AsmWriteMm4 (
 VOID\r
 EFIAPI\r
 AsmWriteMm5 (\r
-  IN      UINT64                    Value\r
+  IN      UINT64  Value\r
   );\r
 \r
-\r
 /**\r
   Writes the current value of 64-bit MMX Register #6 (MM6).\r
 \r
@@ -7279,10 +7009,9 @@ AsmWriteMm5 (
 VOID\r
 EFIAPI\r
 AsmWriteMm6 (\r
-  IN      UINT64                    Value\r
+  IN      UINT64  Value\r
   );\r
 \r
-\r
 /**\r
   Writes the current value of 64-bit MMX Register #7 (MM7).\r
 \r
@@ -7295,10 +7024,9 @@ AsmWriteMm6 (
 VOID\r
 EFIAPI\r
 AsmWriteMm7 (\r
-  IN      UINT64                    Value\r
+  IN      UINT64  Value\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of Time Stamp Counter (TSC).\r
 \r
@@ -7314,7 +7042,6 @@ AsmReadTsc (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Reads the current value of a Performance Counter (PMC).\r
 \r
@@ -7329,10 +7056,9 @@ AsmReadTsc (
 UINT64\r
 EFIAPI\r
 AsmReadPmc (\r
-  IN      UINT32                    Index\r
+  IN      UINT32  Index\r
   );\r
 \r
-\r
 /**\r
   Sets up a monitor buffer that is used by AsmMwait().\r
 \r
@@ -7352,12 +7078,11 @@ AsmReadPmc (
 UINTN\r
 EFIAPI\r
 AsmMonitor (\r
-  IN      UINTN                     Eax,\r
-  IN      UINTN                     Ecx,\r
-  IN      UINTN                     Edx\r
+  IN      UINTN  Eax,\r
+  IN      UINTN  Ecx,\r
+  IN      UINTN  Edx\r
   );\r
 \r
-\r
 /**\r
   Executes an MWAIT instruction.\r
 \r
@@ -7375,11 +7100,10 @@ AsmMonitor (
 UINTN\r
 EFIAPI\r
 AsmMwait (\r
-  IN      UINTN                     Eax,\r
-  IN      UINTN                     Ecx\r
+  IN      UINTN  Eax,\r
+  IN      UINTN  Ecx\r
   );\r
 \r
-\r
 /**\r
   Executes a WBINVD instruction.\r
 \r
@@ -7393,7 +7117,6 @@ AsmWbinvd (
   VOID\r
   );\r
 \r
-\r
 /**\r
   Executes a INVD instruction.\r
 \r
@@ -7407,7 +7130,6 @@ 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
@@ -7426,10 +7148,9 @@ AsmInvd (
 VOID *\r
 EFIAPI\r
 AsmFlushCacheLine (\r
-  IN      VOID                      *LinearAddress\r
+  IN      VOID  *LinearAddress\r
   );\r
 \r
-\r
 /**\r
   Enables the 32-bit paging mode on the CPU.\r
 \r
@@ -7471,12 +7192,11 @@ VOID
 EFIAPI\r
 AsmEnablePaging32 (\r
   IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
-  IN      VOID                      *Context1,  OPTIONAL\r
-  IN      VOID                      *Context2,  OPTIONAL\r
+  IN      VOID                      *Context1   OPTIONAL,\r
+  IN      VOID                      *Context2   OPTIONAL,\r
   IN      VOID                      *NewStack\r
   );\r
 \r
-\r
 /**\r
   Disables the 32-bit paging mode on the CPU.\r
 \r
@@ -7515,12 +7235,11 @@ VOID
 EFIAPI\r
 AsmDisablePaging32 (\r
   IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
-  IN      VOID                      *Context1,  OPTIONAL\r
-  IN      VOID                      *Context2,  OPTIONAL\r
+  IN      VOID                      *Context1   OPTIONAL,\r
+  IN      VOID                      *Context2   OPTIONAL,\r
   IN      VOID                      *NewStack\r
   );\r
 \r
-\r
 /**\r
   Enables the 64-bit paging mode on the CPU.\r
 \r
@@ -7556,14 +7275,13 @@ AsmDisablePaging32 (
 VOID\r
 EFIAPI\r
 AsmEnablePaging64 (\r
-  IN      UINT16                    Cs,\r
-  IN      UINT64                    EntryPoint,\r
-  IN      UINT64                    Context1,  OPTIONAL\r
-  IN      UINT64                    Context2,  OPTIONAL\r
-  IN      UINT64                    NewStack\r
+  IN      UINT16  Cs,\r
+  IN      UINT64  EntryPoint,\r
+  IN      UINT64  Context1   OPTIONAL,\r
+  IN      UINT64  Context2   OPTIONAL,\r
+  IN      UINT64  NewStack\r
   );\r
 \r
-\r
 /**\r
   Disables the 64-bit paging mode on the CPU.\r
 \r
@@ -7597,14 +7315,13 @@ AsmEnablePaging64 (
 VOID\r
 EFIAPI\r
 AsmDisablePaging64 (\r
-  IN      UINT16                    Cs,\r
-  IN      UINT32                    EntryPoint,\r
-  IN      UINT32                    Context1,  OPTIONAL\r
-  IN      UINT32                    Context2,  OPTIONAL\r
-  IN      UINT32                    NewStack\r
+  IN      UINT16  Cs,\r
+  IN      UINT32  EntryPoint,\r
+  IN      UINT32  Context1   OPTIONAL,\r
+  IN      UINT32  Context2   OPTIONAL,\r
+  IN      UINT32  NewStack\r
   );\r
 \r
-\r
 //\r
 // 16-bit thunking services\r
 //\r
@@ -7633,11 +7350,10 @@ AsmDisablePaging64 (
 VOID\r
 EFIAPI\r
 AsmGetThunk16Properties (\r
-  OUT     UINT32                    *RealModeBufferSize,\r
-  OUT     UINT32                    *ExtraStackSize\r
+  OUT     UINT32  *RealModeBufferSize,\r
+  OUT     UINT32  *ExtraStackSize\r
   );\r
 \r
-\r
 /**\r
   Prepares all structures a code required to use AsmThunk16().\r
 \r
@@ -7655,10 +7371,9 @@ AsmGetThunk16Properties (
 VOID\r
 EFIAPI\r
 AsmPrepareThunk16 (\r
-  IN OUT  THUNK_CONTEXT             *ThunkContext\r
+  IN OUT  THUNK_CONTEXT  *ThunkContext\r
   );\r
 \r
-\r
 /**\r
   Transfers control to a 16-bit real mode entry point and returns the results.\r
 \r
@@ -7715,10 +7430,9 @@ AsmPrepareThunk16 (
 VOID\r
 EFIAPI\r
 AsmThunk16 (\r
-  IN OUT  THUNK_CONTEXT             *ThunkContext\r
+  IN OUT  THUNK_CONTEXT  *ThunkContext\r
   );\r
 \r
-\r
 /**\r
   Prepares all structures and code for a 16-bit real mode thunk, transfers\r
   control to a 16-bit real mode entry point, and returns the results.\r
@@ -7742,7 +7456,7 @@ AsmThunk16 (
 VOID\r
 EFIAPI\r
 AsmPrepareAndThunk16 (\r
-  IN OUT  THUNK_CONTEXT             *ThunkContext\r
+  IN OUT  THUNK_CONTEXT  *ThunkContext\r
   );\r
 \r
 /**\r
@@ -7759,7 +7473,7 @@ AsmPrepareAndThunk16 (
 BOOLEAN\r
 EFIAPI\r
 AsmRdRand16 (\r
-  OUT     UINT16                    *Rand\r
+  OUT     UINT16  *Rand\r
   );\r
 \r
 /**\r
@@ -7776,7 +7490,7 @@ AsmRdRand16 (
 BOOLEAN\r
 EFIAPI\r
 AsmRdRand32 (\r
-  OUT     UINT32                    *Rand\r
+  OUT     UINT32  *Rand\r
   );\r
 \r
 /**\r
@@ -7793,7 +7507,7 @@ AsmRdRand32 (
 BOOLEAN\r
 EFIAPI\r
 AsmRdRand64  (\r
-  OUT     UINT64                    *Rand\r
+  OUT     UINT64  *Rand\r
   );\r
 \r
 /**\r
@@ -7804,7 +7518,7 @@ AsmRdRand64  (
 VOID\r
 EFIAPI\r
 AsmWriteTr (\r
-  IN UINT16 Selector\r
+  IN UINT16  Selector\r
   );\r
 \r
 /**\r
@@ -7820,6 +7534,59 @@ AsmLfence (
   VOID\r
   );\r
 \r
+/**\r
+  Executes a XGETBV instruction\r
+\r
+  Executes a XGETBV instruction. This function is only available on IA-32 and\r
+  x64.\r
+\r
+  @param[in] Index        Extended control register index\r
+\r
+  @return                 The current value of the extended control register\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmXGetBv (\r
+  IN UINT32  Index\r
+  );\r
+\r
+/**\r
+  Executes a XSETBV instruction to write a 64-bit value to a Extended Control\r
+  Register(XCR), and returns the value.\r
+\r
+  Writes the 64-bit value specified by Value to the XCR specified by Index. The\r
+  64-bit value written to the XCR is returned. No parameter checking is\r
+  performed on Index or Value, and some of these may cause CPU exceptions. The\r
+  caller must either guarantee that Index and Value are valid, or the caller\r
+  must establish proper exception handlers. This function is only available on\r
+  IA-32 and x64.\r
+\r
+  @param  Index The 32-bit XCR index to write.\r
+  @param  Value The 64-bit value to write to the XCR.\r
+\r
+  @return Value\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmXSetBv (\r
+  IN UINT32  Index,\r
+  IN UINT64  Value\r
+  );\r
+\r
+/**\r
+  Executes a VMGEXIT instruction (VMMCALL with a REP prefix)\r
+\r
+  Executes a VMGEXIT instruction. This function is only available on IA-32 and\r
+  x64.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmVmgExit (\r
+  VOID\r
+  );\r
+\r
 /**\r
   Patch the immediate operand of an IA32 or X64 instruction such that the byte,\r
   word, dword or qword operand is encoded at the end of the instruction's\r
@@ -7857,9 +7624,9 @@ AsmLfence (
 VOID\r
 EFIAPI\r
 PatchInstructionX86 (\r
-  OUT X86_ASSEMBLY_PATCH_LABEL *InstructionEnd,\r
-  IN  UINT64                   PatchValue,\r
-  IN  UINTN                    ValueSize\r
+  OUT X86_ASSEMBLY_PATCH_LABEL  *InstructionEnd,\r
+  IN  UINT64                    PatchValue,\r
+  IN  UINTN                     ValueSize\r
   );\r
 \r
 #endif // defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)\r