]> git.proxmox.com Git - mirror_edk2.git/commitdiff
1) Added BIT0, BIT1, …, BIT63 to the Base Defines
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 12 Feb 2007 02:53:23 +0000 (02:53 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 12 Feb 2007 02:53:23 +0000 (02:53 +0000)
2) Added MIN() and MAX() macros to the Base Macros
3) Added StrStr(), StrDecimalToUnitn(), StrDecimalToUint64(), StrHexToUintn(), StrHexToUintn64(), UnicodeToAscii(), AsciiStrStr(), AsciiStrDecimalToUnitn(), AsciiStrDecimalToUint64(), AsciiStrHexToUintn(), AsciiStrHexToUintn64(), and AsciiToUnicode() to the Base Library String Functions
4) Added the Base Library Checksum Functions which include CalculateSum8(), CaclculateCheckSum8(), CalculateSum16(), CalculateChecksum16(), CalculateSum32(), CalculateCheckSum32(), CalculateSum64(), CalculateChecksum64().

5) Added MMIO Buffer functions to the I/O Library including MmioReadBuffer8(), MmioReadBuffer16(), MmioReadBuffer32(), MmioReadBuffer64(), MmioWriteBuffer8(), MmioWriteBuffer16(), MmioWriteBuffer32(), MmioWriteBuffer64().

6) Changed the parameter name from SizeOfValue to SizeOfBuffer in PcdSetPtr(), PcdSetPtrEx(), PatchPcdSetPtr(), LibPcdSetPtr(), LibPcdSetPtrEx(), LibPatchPcdSetPtr()

7) Added RADIX_HEX flag to the Print Library to support the conversion of values to hexadecimal strings in UnicodeValueToString() and AsciiValueToString()

8) Added EfiGetCurrentTpl() UEFI Library.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2363 6f19259b-4bc3-4df7-8a09-765794883524

26 files changed:
MdePkg/Include/Common/BaseTypes.h
MdePkg/Include/Library/BaseLib.h
MdePkg/Include/Library/HobLib.h
MdePkg/Include/Library/IoLib.h
MdePkg/Include/Library/PcdLib.h
MdePkg/Include/Library/PrintLib.h
MdePkg/Include/Library/UefiLib.h
MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.msa
MdePkg/Library/BaseIoLibIntrinsic/IoLibIpf.c
MdePkg/Library/BaseIoLibIntrinsic/IoLibMmioBuffer.c [new file with mode: 0644]
MdePkg/Library/BaseLib/BaseLib.msa
MdePkg/Library/BaseLib/BaseLibInternals.h
MdePkg/Library/BaseLib/CheckSum.c [new file with mode: 0644]
MdePkg/Library/BaseLib/String.c
MdePkg/Library/BasePrintLib/PrintLib.c
MdePkg/Library/BasePrintLib/PrintLibInternal.c
MdePkg/Library/BasePrintLib/PrintLibInternal.h
MdePkg/Library/DxeCoreHobLib/HobLib.c
MdePkg/Library/DxeHobLib/HobLib.c
MdePkg/Library/DxeIoLibCpuIo/DxeIoLibCpuIo.msa
MdePkg/Library/DxeIoLibCpuIo/IoLibMmioBuffer.c [new file with mode: 0644]
MdePkg/Library/PeiHobLib/HobLib.c
MdePkg/Library/PeiIoLibCpuIo/IoLibMmioBuffer.c [new file with mode: 0644]
MdePkg/Library/PeiIoLibCpuIo/PeiIoLibCpuIo.msa
MdePkg/Library/UefiLib/UefiLib.c
MdePkg/MdePkg.fpd

index 3af38facbea3dc2610f3757063e0979da416134b..2849ae903a35975f408688bc1478124bcc00d25a 100644 (file)
@@ -3,7 +3,7 @@
 \r
   This file is stand alone self consistent set of definitions. \r
 \r
-  Copyright (c) 2006, Intel Corporation                                                         \r
+  Copyright (c) 2006 - 2007, Intel Corporation                                                         \r
   All rights reserved. This program and the accompanying materials                          \r
   are licensed and made available under the terms and conditions of the BSD License         \r
   which accompanies this distribution.  The full text of the license may be found at        \r
@@ -76,6 +76,71 @@ typedef struct {
 #define NULL  ((VOID *) 0)\r
 #endif\r
 \r
+#define  BIT0     0x00000001\r
+#define  BIT1     0x00000002
+#define  BIT2     0x00000004
+#define  BIT3     0x00000008
+#define  BIT4     0x00000010
+#define  BIT5     0x00000020
+#define  BIT6     0x00000040
+#define  BIT7     0x00000080
+#define  BIT8     0x00000100
+#define  BIT9     0x00000200
+#define  BIT10    0x00000400
+#define  BIT11    0x00000800
+#define  BIT12    0x00001000
+#define  BIT13    0x00002000
+#define  BIT14    0x00004000
+#define  BIT15    0x00008000
+#define  BIT16    0x00010000
+#define  BIT17    0x00020000
+#define  BIT18    0x00040000
+#define  BIT19    0x00080000
+#define  BIT20    0x00100000
+#define  BIT21    0x00200000
+#define  BIT22    0x00400000
+#define  BIT23    0x00800000
+#define  BIT24    0x01000000
+#define  BIT25    0x02000000
+#define  BIT26    0x04000000
+#define  BIT27    0x08000000
+#define  BIT28    0x10000000
+#define  BIT29    0x20000000
+#define  BIT30    0x40000000
+#define  BIT31    0x80000000
+#define  BIT32    0x0000000100000000UL\r
+#define  BIT33    0x0000000200000000UL\r
+#define  BIT34    0x0000000400000000UL\r
+#define  BIT35    0x0000000800000000UL\r
+#define  BIT36    0x0000001000000000UL\r
+#define  BIT37    0x0000002000000000UL\r
+#define  BIT38    0x0000004000000000UL\r
+#define  BIT39    0x0000008000000000UL\r
+#define  BIT40    0x0000010000000000UL\r
+#define  BIT41    0x0000020000000000UL\r
+#define  BIT42    0x0000040000000000UL\r
+#define  BIT43    0x0000080000000000UL\r
+#define  BIT44    0x0000100000000000UL\r
+#define  BIT45    0x0000200000000000UL\r
+#define  BIT46    0x0000400000000000UL\r
+#define  BIT47    0x0000800000000000UL\r
+#define  BIT48    0x0001000000000000UL\r
+#define  BIT49    0x0002000000000000UL\r
+#define  BIT50    0x0004000000000000UL\r
+#define  BIT51    0x0008000000000000UL\r
+#define  BIT52    0x0010000000000000UL\r
+#define  BIT53    0x0020000000000000UL\r
+#define  BIT54    0x0040000000000000UL\r
+#define  BIT55    0x0080000000000000UL\r
+#define  BIT56    0x0100000000000000UL\r
+#define  BIT57    0x0200000000000000UL\r
+#define  BIT58    0x0400000000000000UL\r
+#define  BIT59    0x0800000000000000UL\r
+#define  BIT60    0x1000000000000000UL\r
+#define  BIT61    0x2000000000000000UL\r
+#define  BIT62    0x4000000000000000UL\r
+#define  BIT63    0x8000000000000000UL\r
+
 //\r
 //  Support for variable length argument lists using the ANSI standard.\r
 //  \r
@@ -151,6 +216,24 @@ typedef CHAR8 *VA_LIST;
   } \\r
   (Value) = (UINTN)((UINTN) (Value) + (UINTN) (Adjustment))\r
 \r
+//\r
+// Return the maximum of two operands. \r
+// This macro returns the maximum of two operand specified by a and b.  \r
+// Both a and b must be the same numerical types, signed or unsigned.\r
+//\r
+#define MAX(a, b)                       \
+  (((a) > (b)) ? (a) : (b))
+
+\r
+//\r
+// Return the minimum of two operands. \r
+// This macro returns the minimal of two operand specified by a and b.  \r
+// Both a and b must be the same numerical types, signed or unsigned.\r
+//\r
+#define MIN(a, b)                       \
+  (((a) < (b)) ? (a) : (b))
+\r
+\r
 //\r
 // EFI Error Codes common to all execution phases\r
 //\r
index 7f494f71b5806d6cd5de0217d04cc8d639cc477c..e1d79e325ce4d0b34a7ef1f635cf189fca3c0acd 100644 (file)
-/** @file\r
-  Memory-only library functions with no library constructor/destructor\r
-\r
-  Copyright (c) 2006, Intel Corporation\r
-  All rights reserved. This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-  Module Name:  BaseLib.h\r
-\r
-**/\r
-\r
-#ifndef __BASE_LIB__\r
-#define __BASE_LIB__\r
-\r
-//\r
-// Definitions for architecture specific types\r
-// These include SPIN_LOCK and BASE_LIBRARY_JUMP_BUFFER\r
-//\r
-\r
-//\r
-// SPIN_LOCK\r
-//\r
-typedef UINTN                       SPIN_LOCK;\r
-\r
-#if   defined (MDE_CPU_IA32)\r
-//\r
-// IA32 context buffer used by SetJump() and LongJump()\r
-//\r
-typedef struct {\r
-  UINT32                            Ebx;\r
-  UINT32                            Esi;\r
-  UINT32                            Edi;\r
-  UINT32                            Ebp;\r
-  UINT32                            Esp;\r
-  UINT32                            Eip;\r
-} BASE_LIBRARY_JUMP_BUFFER;\r
-\r
-#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8\r
-\r
-#elif defined (MDE_CPU_IPF)\r
-//\r
-// IPF context buffer used by SetJump() and LongJump()\r
-//\r
-typedef struct {\r
-  UINT64                            F2[2];\r
-  UINT64                            F3[2];\r
-  UINT64                            F4[2];\r
-  UINT64                            F5[2];\r
-  UINT64                            F16[2];\r
-  UINT64                            F17[2];\r
-  UINT64                            F18[2];\r
-  UINT64                            F19[2];\r
-  UINT64                            F20[2];\r
-  UINT64                            F21[2];\r
-  UINT64                            F22[2];\r
-  UINT64                            F23[2];\r
-  UINT64                            F24[2];\r
-  UINT64                            F25[2];\r
-  UINT64                            F26[2];\r
-  UINT64                            F27[2];\r
-  UINT64                            F28[2];\r
-  UINT64                            F29[2];\r
-  UINT64                            F30[2];\r
-  UINT64                            F31[2];\r
-  UINT64                            R4;\r
-  UINT64                            R5;\r
-  UINT64                            R6;\r
-  UINT64                            R7;\r
-  UINT64                            SP;\r
-  UINT64                            BR0;\r
-  UINT64                            BR1;\r
-  UINT64                            BR2;\r
-  UINT64                            BR3;\r
-  UINT64                            BR4;\r
-  UINT64                            BR5;\r
-  UINT64                            InitialUNAT;\r
-  UINT64                            AfterSpillUNAT;\r
-  UINT64                            PFS;\r
-  UINT64                            BSP;\r
-  UINT64                            Predicates;\r
-  UINT64                            LoopCount;\r
-  UINT64                            FPSR;\r
-} BASE_LIBRARY_JUMP_BUFFER;\r
-\r
-#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 0x10\r
-\r
-#elif defined (MDE_CPU_X64)\r
-//\r
-// X64 context buffer used by SetJump() and LongJump()\r
-//\r
-typedef struct {\r
-  UINT64                            Rbx;\r
-  UINT64                            Rsp;\r
-  UINT64                            Rbp;\r
-  UINT64                            Rdi;\r
-  UINT64                            Rsi;\r
-  UINT64                            R12;\r
-  UINT64                            R13;\r
-  UINT64                            R14;\r
-  UINT64                            R15;\r
-  UINT64                            Rip;\r
-} BASE_LIBRARY_JUMP_BUFFER;\r
-\r
-#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8\r
-\r
-#elif defined (MDE_CPU_EBC)\r
-//\r
-// EBC context buffer used by SetJump() and LongJump()\r
-//\r
-typedef struct {\r
-  UINT64                            R0;\r
-  UINT64                            R1;\r
-  UINT64                            R2;\r
-  UINT64                            R3;\r
-  UINT64                            IP;\r
-} BASE_LIBRARY_JUMP_BUFFER;\r
-\r
-#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8\r
-\r
-#else\r
-#error Unknown Processor Type\r
-#endif\r
-\r
-//\r
-// String Services\r
-//\r
-\r
-/**\r
-  Copies one Null-terminated Unicode string to another Null-terminated Unicode\r
-  string and returns the new Unicode string.\r
-\r
-  This function copies the contents of the Unicode string Source to the Unicode\r
-  string Destination, and returns Destination. If Source and Destination\r
-  overlap, then the results are undefined.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  Destination Pointer to a Null-terminated Unicode string.\r
-  @param  Source      Pointer to a Null-terminated Unicode string.\r
-\r
-  @return Destiantion\r
-\r
-**/\r
-CHAR16 *\r
-EFIAPI\r
-StrCpy (\r
-  OUT     CHAR16                    *Destination,\r
-  IN      CONST CHAR16              *Source\r
-  );\r
-/**\r
-  Copies one Null-terminated Unicode string with a maximum length to another\r
-  Null-terminated Unicode string with a maximum length and returns the new\r
-  Unicode string.\r
-\r
-  This function copies the contents of the Unicode string Source to the Unicode\r
-  string Destination, and returns Destination. At most, Length Unicode\r
-  characters are copied from Source to Destination. If Length is 0, then\r
-  Destination is returned unmodified. If Length is greater that the number of\r
-  Unicode characters in Source, then Destination is padded with Null Unicode\r
-  characters. If Source and Destination overlap, then the results are\r
-  undefined.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  Destination Pointer to a Null-terminated Unicode string.\r
-  @param  Source      Pointer to a Null-terminated Unicode string.\r
-  @param  Length      Maximum number of Unicode characters to copy.\r
-\r
-  @return Destination\r
-\r
-**/\r
-CHAR16 *\r
-EFIAPI\r
-StrnCpy (\r
-  OUT     CHAR16                    *Destination,\r
-  IN      CONST CHAR16              *Source,\r
-  IN      UINTN                     Length\r
-  );\r
-/**\r
-  Returns the length of a Null-terminated Unicode string.\r
-\r
-  This function returns the number of Unicode characters in the Null-terminated\r
-  Unicode string specified by String.\r
-\r
-  If String is NULL, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  String  Pointer to a Null-terminated Unicode string.\r
-\r
-  @return The length of String.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-StrLen (\r
-  IN      CONST CHAR16              *String\r
-  );\r
-/**\r
-  Returns the size of a Null-terminated Unicode string in bytes, including the\r
-  Null terminator.\r
-\r
-  This function returns the size, in bytes, of the Null-terminated Unicode\r
-  string specified by String.\r
-\r
-  If String is NULL, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  String  Pointer to a Null-terminated Unicode string.\r
-\r
-  @return The size of String.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-StrSize (\r
-  IN      CONST CHAR16              *String\r
-  );\r
-/**\r
-  Compares two Null-terminated Unicode strings, and returns the difference\r
-  between the first mismatched Unicode characters.\r
-\r
-  This function compares the Null-terminated Unicode string FirstString to the\r
-  Null-terminated Unicode string SecondString. If FirstString is identical to\r
-  SecondString, then 0 is returned. Otherwise, the value returned is the first\r
-  mismatched Unicode character in SecondString subtracted from the first\r
-  mismatched Unicode character in FirstString.\r
-\r
-  If FirstString is NULL, then ASSERT().\r
-  If SecondString is NULL, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more\r
-  than PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more\r
-  than PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  FirstString   Pointer to a Null-terminated Unicode string.\r
-  @param  SecondString  Pointer to a Null-terminated Unicode string.\r
-\r
-  @retval 0   FirstString is identical to SecondString.\r
-  @retval !=0 FirstString is not identical to SecondString.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-StrCmp (\r
-  IN      CONST CHAR16              *FirstString,\r
-  IN      CONST CHAR16              *SecondString\r
-  );\r
-/**\r
-  Compares two Null-terminated Unicode strings with maximum lengths, and\r
-  returns the difference between the first mismatched Unicode characters.\r
-\r
-  This function compares the Null-terminated Unicode string FirstString to the\r
-  Null-terminated Unicode string SecondString. At most, Length Unicode\r
-  characters will be compared. If Length is 0, then 0 is returned. If\r
-  FirstString is identical to SecondString, then 0 is returned. Otherwise, the\r
-  value returned is the first mismatched Unicode character in SecondString\r
-  subtracted from the first mismatched Unicode character in FirstString.\r
-\r
-  If FirstString is NULL, then ASSERT().\r
-  If SecondString is NULL, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more\r
-  than PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more\r
-  than PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  FirstString   Pointer to a Null-terminated Unicode string.\r
-  @param  SecondString  Pointer to a Null-terminated Unicode string.\r
-  @param  Length        Maximum number of Unicode characters to compare.\r
-\r
-  @retval 0   FirstString is identical to SecondString.\r
-  @retval !=0 FirstString is not identical to SecondString.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-StrnCmp (\r
-  IN      CONST CHAR16              *FirstString,\r
-  IN      CONST CHAR16              *SecondString,\r
-  IN      UINTN                     Length\r
-  );\r
-/**\r
-  Concatenates one Null-terminated Unicode string to another Null-terminated\r
-  Unicode string, and returns the concatenated Unicode string.\r
-\r
-  This function concatenates two Null-terminated Unicode strings. The contents\r
-  of Null-terminated Unicode string Source are concatenated to the end of\r
-  Null-terminated Unicode string Destination. The Null-terminated concatenated\r
-  Unicode String is returned. If Source and Destination overlap, then the\r
-  results are undefined.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and Destination contains more\r
-  than PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination\r
-  and Source results in a Unicode string with more than\r
-  PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  Destination Pointer to a Null-terminated Unicode string.\r
-  @param  Source      Pointer to a Null-terminated Unicode string.\r
-\r
-  @return Destination\r
-\r
-**/\r
-CHAR16 *\r
-EFIAPI\r
-StrCat (\r
-  IN OUT  CHAR16                    *Destination,\r
-  IN      CONST CHAR16              *Source\r
-  );\r
-/**\r
-  Concatenates one Null-terminated Unicode string with a maximum length to the\r
-  end of another Null-terminated Unicode string, and returns the concatenated\r
-  Unicode string.\r
-\r
-  This function concatenates two Null-terminated Unicode strings. The contents\r
-  of Null-terminated Unicode string Source are concatenated to the end of\r
-  Null-terminated Unicode string Destination, and Destination is returned. At\r
-  most, Length Unicode characters are concatenated from Source to the end of\r
-  Destination, and Destination is always Null-terminated. If Length is 0, then\r
-  Destination is returned unmodified. If Source and Destination overlap, then\r
-  the results are undefined.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and Destination contains more\r
-  than PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination\r
-  and Source results in a Unicode string with more than\r
-  PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  Destination Pointer to a Null-terminated Unicode string.\r
-  @param  Source      Pointer to a Null-terminated Unicode string.\r
-  @param  Length      Maximum number of Unicode characters to concatenate from\r
-                      Source.\r
-\r
-  @return Destination\r
-\r
-**/\r
-CHAR16 *\r
-EFIAPI\r
-StrnCat (\r
-  IN OUT  CHAR16                    *Destination,\r
-  IN      CONST CHAR16              *Source,\r
-  IN      UINTN                     Length\r
-  );\r
-/**\r
-  Copies one Null-terminated ASCII string to another Null-terminated ASCII\r
-  string and returns the new ASCII string.\r
-\r
-  This function copies the contents of the ASCII string Source to the ASCII\r
-  string Destination, and returns Destination. If Source and Destination\r
-  overlap, then the results are undefined.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and Source contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-\r
-  @param  Destination Pointer to a Null-terminated ASCII string.\r
-  @param  Source      Pointer to a Null-terminated ASCII string.\r
-\r
-  @return Destination\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-AsciiStrCpy (\r
-  OUT     CHAR8                     *Destination,\r
-  IN      CONST CHAR8               *Source\r
-  );\r
-/**\r
-  Copies one Null-terminated ASCII string with a maximum length to another\r
-  Null-terminated ASCII string with a maximum length and returns the new ASCII\r
-  string.\r
-\r
-  This function copies the contents of the ASCII string Source to the ASCII\r
-  string Destination, and returns Destination. At most, Length ASCII characters\r
-  are copied from Source to Destination. If Length is 0, then Destination is\r
-  returned unmodified. If Length is greater that the number of ASCII characters\r
-  in Source, then Destination is padded with Null ASCII characters. If Source\r
-  and Destination overlap, then the results are undefined.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and Source contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-\r
-  @param  Destination Pointer to a Null-terminated ASCII string.\r
-  @param  Source      Pointer to a Null-terminated ASCII string.\r
-  @param  Length      Maximum number of ASCII characters to copy.\r
-\r
-  @return Destination\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-AsciiStrnCpy (\r
-  OUT     CHAR8                     *Destination,\r
-  IN      CONST CHAR8               *Source,\r
-  IN      UINTN                     Length\r
-  );\r
-/**\r
-  Returns the length of a Null-terminated ASCII string.\r
-\r
-  This function returns the number of ASCII characters in the Null-terminated\r
-  ASCII string specified by String.\r
-\r
-  If String is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and String contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-\r
-  @param  String  Pointer to a Null-terminated ASCII string.\r
-\r
-  @return The length of String.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsciiStrLen (\r
-  IN      CONST CHAR8               *String\r
-  );\r
-/**\r
-  Returns the size of a Null-terminated ASCII string in bytes, including the\r
-  Null terminator.\r
-\r
-  This function returns the size, in bytes, of the Null-terminated ASCII string\r
-  specified by String.\r
-\r
-  If String is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and String contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-\r
-  @param  String  Pointer to a Null-terminated ASCII string.\r
-\r
-  @return The size of String.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsciiStrSize (\r
-  IN      CONST CHAR8               *String\r
-  );\r
-/**\r
-  Compares two Null-terminated ASCII strings, and returns the difference\r
-  between the first mismatched ASCII characters.\r
-\r
-  This function compares the Null-terminated ASCII string FirstString to the\r
-  Null-terminated ASCII string SecondString. If FirstString is identical to\r
-  SecondString, then 0 is returned. Otherwise, the value returned is the first\r
-  mismatched ASCII character in SecondString subtracted from the first\r
-  mismatched ASCII character in FirstString.\r
-\r
-  If FirstString is NULL, then ASSERT().\r
-  If SecondString is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and FirstString contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and SecondString contains more\r
-  than PcdMaximumAsciiStringLength ASCII characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  FirstString   Pointer to a Null-terminated ASCII string.\r
-  @param  SecondString  Pointer to a Null-terminated ASCII string.\r
-\r
-  @retval 0   FirstString is identical to SecondString.\r
-  @retval !=0 FirstString is not identical to SecondString.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-AsciiStrCmp (\r
-  IN      CONST CHAR8               *FirstString,\r
-  IN      CONST CHAR8               *SecondString\r
-  );\r
-/**\r
-  Performs a case insensitive comparison of two Null-terminated ASCII strings,\r
-  and returns the difference between the first mismatched ASCII characters.\r
-\r
-  This function performs a case insensitive comparison of the Null-terminated\r
-  ASCII string FirstString to the Null-terminated ASCII string SecondString. If\r
-  FirstString is identical to SecondString, then 0 is returned. Otherwise, the\r
-  value returned is the first mismatched lower case ASCII character in\r
-  SecondString subtracted from the first mismatched lower case ASCII character\r
-  in FirstString.\r
-\r
-  If FirstString is NULL, then ASSERT().\r
-  If SecondString is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and FirstString contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and SecondString contains more\r
-  than PcdMaximumAsciiStringLength ASCII characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  FirstString   Pointer to a Null-terminated ASCII string.\r
-  @param  SecondString  Pointer to a Null-terminated ASCII string.\r
-\r
-  @retval 0   FirstString is identical to SecondString using case insensitive\r
-              comparisons.\r
-  @retval !=0 FirstString is not identical to SecondString using case\r
-              insensitive comparisons.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-AsciiStriCmp (\r
-  IN      CONST CHAR8               *FirstString,\r
-  IN      CONST CHAR8               *SecondString\r
-  );\r
-/**\r
-  Compares two Null-terminated ASCII strings with maximum lengths, and returns\r
-  the difference between the first mismatched ASCII characters.\r
-\r
-  This function compares the Null-terminated ASCII string FirstString to the\r
-  Null-terminated ASCII  string SecondString. At most, Length ASCII characters\r
-  will be compared. If Length is 0, then 0 is returned. If FirstString is\r
-  identical to SecondString, then 0 is returned. Otherwise, the value returned\r
-  is the first mismatched ASCII character in SecondString subtracted from the\r
-  first mismatched ASCII character in FirstString.\r
-\r
-  If FirstString is NULL, then ASSERT().\r
-  If SecondString is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and FirstString contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and SecondString contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-\r
-  @param  FirstString   Pointer to a Null-terminated ASCII string.\r
-  @param  SecondString  Pointer to a Null-terminated ASCII string.\r
-\r
-  @retval 0   FirstString is identical to SecondString.\r
-  @retval !=0 FirstString is not identical to SecondString.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-AsciiStrnCmp (\r
-  IN      CONST CHAR8               *FirstString,\r
-  IN      CONST CHAR8               *SecondString,\r
-  IN      UINTN                     Length\r
-  );\r
-/**\r
-  Concatenates one Null-terminated ASCII string to another Null-terminated\r
-  ASCII string, and returns the concatenated ASCII string.\r
-\r
-  This function concatenates two Null-terminated ASCII strings. The contents of\r
-  Null-terminated ASCII string Source are concatenated to the end of Null-\r
-  terminated ASCII string Destination. The Null-terminated concatenated ASCII\r
-  String is returned.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and Destination contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and Source contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and concatenating Destination and\r
-  Source results in a ASCII string with more than PcdMaximumAsciiStringLength\r
-  ASCII characters, then ASSERT().\r
-\r
-  @param  Destination Pointer to a Null-terminated ASCII string.\r
-  @param  Source      Pointer to a Null-terminated ASCII string.\r
-\r
-  @return Destination\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-AsciiStrCat (\r
-  IN OUT CHAR8    *Destination,\r
-  IN CONST CHAR8  *Source\r
-  );\r
-/**\r
-  Concatenates one Null-terminated ASCII string with a maximum length to the\r
-  end of another Null-terminated ASCII string, and returns the concatenated\r
-  ASCII string.\r
-\r
-  This function concatenates two Null-terminated ASCII strings. The contents\r
-  of Null-terminated ASCII string Source are concatenated to the end of Null-\r
-  terminated ASCII string Destination, and Destination is returned. At most,\r
-  Length ASCII characters are concatenated from Source to the end of\r
-  Destination, and Destination is always Null-terminated. If Length is 0, then\r
-  Destination is returned unmodified. If Source and Destination overlap, then\r
-  the results are undefined.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and Destination contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and Source contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and concatenating Destination and\r
-  Source results in a ASCII string with more than PcdMaximumAsciiStringLength\r
-  ASCII characters not including the Null-terminator, then ASSERT().\r
-\r
-  @param  Destination Pointer to a Null-terminated ASCII string.\r
-  @param  Source      Pointer to a Null-terminated ASCII string.\r
-  @param  Length      Maximum number of ASCII characters to concatenate from\r
-                      Source.\r
-\r
-  @return Destination\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-AsciiStrnCat (\r
-  IN OUT  CHAR8                     *Destination,\r
-  IN      CONST CHAR8               *Source,\r
-  IN      UINTN                     Length\r
-  );\r
-/**\r
-  Converts an 8-bit value to an 8-bit BCD value.\r
-\r
-  Converts the 8-bit value specified by Value to BCD. The BCD value is\r
-  returned.\r
-\r
-  If Value >= 100, then ASSERT().\r
-\r
-  @param  Value The 8-bit value to convert to BCD. Range 0..99.\r
-\r
-  @return The BCD value\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-DecimalToBcd8 (\r
-  IN      UINT8                     Value\r
-  );\r
-\r
-/**\r
-  Converts an 8-bit BCD value to an 8-bit value.\r
-\r
-  Converts the 8-bit BCD value specified by Value to an 8-bit value. The 8-bit\r
-  value is returned.\r
-\r
-  If Value >= 0xA0, then ASSERT().\r
-  If (Value & 0x0F) >= 0x0A, then ASSERT().\r
-\r
-  @param  Value The 8-bit BCD value to convert to an 8-bit value.\r
-\r
-  @return The 8-bit value is returned.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-BcdToDecimal8 (\r
-  IN      UINT8                     Value\r
-  );\r
-\r
-//\r
-// Linked List Functions and Macros\r
-//\r
-\r
-/**\r
-  Initializes the head node of a doubly linked list that is declared as a\r
-  global variable in a module.\r
-\r
-  Initializes the forward and backward links of a new linked list. After\r
-  initializing a linked list with this macro, the other linked list functions\r
-  may be used to add and remove nodes from the linked list. This macro results\r
-  in smaller executables by initializing the linked list in the data section,\r
-  instead if calling the InitializeListHead() function to perform the\r
-  equivalent operation.\r
-\r
-  @param  ListHead  The head note of a list to initiailize.\r
-\r
-**/\r
-#define INITIALIZE_LIST_HEAD_VARIABLE(ListHead)  {&ListHead, &ListHead}\r
-\r
-/**\r
-  Initializes the head node of a doubly linked list, and returns the pointer to\r
-  the head node of the doubly linked list.\r
-\r
-  Initializes the forward and backward links of a new linked list. After\r
-  initializing a linked list with this function, the other linked list\r
-  functions may be used to add and remove nodes from the linked list. It is up\r
-  to the caller of this function to allocate the memory for ListHead.\r
-\r
-  If ListHead is NULL, then ASSERT().\r
-\r
-  @param  ListHead  A pointer to the head node of a new doubly linked list.\r
-\r
-  @return ListHead\r
-\r
-**/\r
-LIST_ENTRY *\r
-EFIAPI\r
-InitializeListHead (\r
-  IN      LIST_ENTRY                *ListHead\r
-  );\r
-\r
-/**\r
-  Adds a node to the beginning of a doubly linked list, and returns the pointer\r
-  to the head node of the doubly linked list.\r
-\r
-  Adds the node Entry at the beginning of the doubly linked list denoted by\r
-  ListHead, and returns ListHead.\r
-\r
-  If ListHead is NULL, then ASSERT().\r
-  If Entry is NULL, then ASSERT().\r
-  If ListHead was not initialized with InitializeListHead(), then ASSERT().\r
-  If PcdMaximumLinkedListLenth is not zero, and prior to insertion the number\r
-  of nodes in ListHead, including the ListHead node, is greater than or\r
-  equal to PcdMaximumLinkedListLength, then ASSERT().\r
-\r
-  @param  ListHead  A pointer to the head node of a doubly linked list.\r
-  @param  Entry     A pointer to a node that is to be inserted at the beginning\r
-                    of a doubly linked list.\r
-\r
-  @return ListHead\r
-\r
-**/\r
-LIST_ENTRY *\r
-EFIAPI\r
-InsertHeadList (\r
-  IN      LIST_ENTRY                *ListHead,\r
-  IN      LIST_ENTRY                *Entry\r
-  );\r
-\r
-/**\r
-  Adds a node to the end of a doubly linked list, and returns the pointer to\r
-  the head node of the doubly linked list.\r
-\r
-  Adds the node Entry to the end of the doubly linked list denoted by ListHead,\r
-  and returns ListHead.\r
-\r
-  If ListHead is NULL, then ASSERT().\r
-  If Entry is NULL, then ASSERT().\r
-  If ListHead was not initialized with InitializeListHead(), then ASSERT().\r
-  If PcdMaximumLinkedListLenth is not zero, and prior to insertion the number\r
-  of nodes in ListHead, including the ListHead node, is greater than or\r
-  equal to PcdMaximumLinkedListLength, then ASSERT().\r
-\r
-  @param  ListHead  A pointer to the head node of a doubly linked list.\r
-  @param  Entry     A pointer to a node that is to be added at the end of the\r
-                    doubly linked list.\r
-\r
-  @return ListHead\r
-\r
-**/\r
-LIST_ENTRY *\r
-EFIAPI\r
-InsertTailList (\r
-  IN      LIST_ENTRY                *ListHead,\r
-  IN      LIST_ENTRY                *Entry\r
-  );\r
-\r
-/**\r
-  Retrieves the first node of a doubly linked list.\r
-\r
-  Returns the first node of a doubly linked list. List must have been\r
-  initialized with InitializeListHead(). If List is empty, then NULL is\r
-  returned.\r
-\r
-  If List is NULL, then ASSERT().\r
-  If List was not initialized with InitializeListHead(), then ASSERT().\r
-  If PcdMaximumLinkedListLenth is not zero, and the number of nodes\r
-  in List, including the List node, is greater than or equal to\r
-  PcdMaximumLinkedListLength, then ASSERT().\r
-\r
-  @param  List  A pointer to the head node of a doubly linked list.\r
-\r
-  @return The first node of a doubly linked list.\r
-  @retval NULL  The list is empty.\r
-\r
-**/\r
-LIST_ENTRY *\r
-EFIAPI\r
-GetFirstNode (\r
-  IN      CONST LIST_ENTRY          *List\r
-  );\r
-\r
-/**\r
-  Retrieves the next node of a doubly linked list.\r
-\r
-  Returns the node of a doubly linked list that follows Node. List must have\r
-  been initialized with InitializeListHead(). If List is empty, then List is\r
-  returned.\r
-\r
-  If List is NULL, then ASSERT().\r
-  If Node is NULL, then ASSERT().\r
-  If List was not initialized with InitializeListHead(), then ASSERT().\r
-  If PcdMaximumLinkedListLenth is not zero, and List contains more than\r
-  PcdMaximumLinkedListLenth nodes, then ASSERT().\r
-  If Node is not a node in List, then ASSERT().\r
-\r
-  @param  List  A pointer to the head node of a doubly linked list.\r
-  @param  Node  A pointer to a node in the doubly linked list.\r
-\r
-  @return Pointer to the next node if one exists. Otherwise a null value which\r
-          is actually List is returned.\r
-\r
-**/\r
-LIST_ENTRY *\r
-EFIAPI\r
-GetNextNode (\r
-  IN      CONST LIST_ENTRY          *List,\r
-  IN      CONST LIST_ENTRY          *Node\r
-  );\r
-\r
-/**\r
-  Checks to see if a doubly linked list is empty or not.\r
-\r
-  Checks to see if the doubly linked list is empty. If the linked list contains\r
-  zero nodes, this function returns TRUE. Otherwise, it returns FALSE.\r
-\r
-  If ListHead is NULL, then ASSERT().\r
-  If ListHead was not initialized with InitializeListHead(), then ASSERT().\r
-  If PcdMaximumLinkedListLenth is not zero, and the number of nodes\r
-  in List, including the List node, is greater than or equal to\r
-  PcdMaximumLinkedListLength, then ASSERT().\r
-\r
-  @param  ListHead  A pointer to the head node of a doubly linked list.\r
-\r
-  @retval TRUE  The linked list is empty.\r
-  @retval FALSE The linked list is not empty.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-IsListEmpty (\r
-  IN      CONST LIST_ENTRY          *ListHead\r
-  );\r
-\r
-/**\r
-  Determines if a node in a doubly linked list is null.\r
-\r
-  Returns FALSE if Node is one of the nodes in the doubly linked list specified\r
-  by List. Otherwise, TRUE is returned. List must have been initialized with\r
-  InitializeListHead().\r
-\r
-  If List is NULL, then ASSERT().\r
-  If Node is NULL, then ASSERT().\r
-  If List was not initialized with InitializeListHead(), then ASSERT().\r
-  If PcdMaximumLinkedListLenth is not zero, and the number of nodes\r
-  in List, including the List node, is greater than or equal to\r
-  PcdMaximumLinkedListLength, then ASSERT().\r
-  If Node is not a node in List and Node is not equal to List, then ASSERT().\r
-\r
-  @param  List  A pointer to the head node of a doubly linked list.\r
-  @param  Node  A pointer to a node in the doubly linked list.\r
-\r
-  @retval TRUE  Node is one of the nodes in the doubly linked list.\r
-  @retval FALSE Node is not one of the nodes in the doubly linked list.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-IsNull (\r
-  IN      CONST LIST_ENTRY          *List,\r
-  IN      CONST LIST_ENTRY          *Node\r
-  );\r
-\r
-/**\r
-  Determines if a node the last node in a doubly linked list.\r
-\r
-  Returns TRUE if Node is the last node in the doubly linked list specified by\r
-  List. Otherwise, FALSE is returned. List must have been initialized with\r
-  InitializeListHead().\r
-\r
-  If List is NULL, then ASSERT().\r
-  If Node is NULL, then ASSERT().\r
-  If List was not initialized with InitializeListHead(), then ASSERT().\r
-  If PcdMaximumLinkedListLenth is not zero, and the number of nodes\r
-  in List, including the List node, is greater than or equal to\r
-  PcdMaximumLinkedListLength, then ASSERT().\r
-  If Node is not a node in List, then ASSERT().\r
-\r
-  @param  List  A pointer to the head node of a doubly linked list.\r
-  @param  Node  A pointer to a node in the doubly linked list.\r
-\r
-  @retval TRUE  Node is the last node in the linked list.\r
-  @retval FALSE Node is not the last node in the linked list.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-IsNodeAtEnd (\r
-  IN      CONST LIST_ENTRY          *List,\r
-  IN      CONST LIST_ENTRY          *Node\r
-  );\r
-\r
-/**\r
-  Swaps the location of two nodes in a doubly linked list, and returns the\r
-  first node after the swap.\r
-\r
-  If FirstEntry is identical to SecondEntry, then SecondEntry is returned.\r
-  Otherwise, the location of the FirstEntry node is swapped with the location\r
-  of the SecondEntry node in a doubly linked list. SecondEntry must be in the\r
-  same double linked list as FirstEntry and that double linked list must have\r
-  been initialized with InitializeListHead(). SecondEntry is returned after the\r
-  nodes are swapped.\r
-\r
-  If FirstEntry is NULL, then ASSERT().\r
-  If SecondEntry is NULL, then ASSERT().\r
-  If SecondEntry and FirstEntry are not in the same linked list, then ASSERT().\r
-  If PcdMaximumLinkedListLength is not zero, and the number of nodes in the\r
-  linked list containing the FirstEntry and SecondEntry nodes, including\r
-  the FirstEntry and SecondEntry nodes, is greater than or equal to\r
-  PcdMaximumLinkedListLength, then ASSERT().\r
-\r
-  @param  FirstEntry  A pointer to a node in a linked list.\r
-  @param  SecondEntry A pointer to another node in the same linked list.\r
-\r
-**/\r
-LIST_ENTRY *\r
-EFIAPI\r
-SwapListEntries (\r
-  IN      LIST_ENTRY                *FirstEntry,\r
-  IN      LIST_ENTRY                *SecondEntry\r
-  );\r
-\r
-/**\r
-  Removes a node from a doubly linked list, and returns the node that follows\r
-  the removed node.\r
-\r
-  Removes the node Entry from a doubly linked list. It is up to the caller of\r
-  this function to release the memory used by this node if that is required. On\r
-  exit, the node following Entry in the doubly linked list is returned. If\r
-  Entry is the only node in the linked list, then the head node of the linked\r
-  list is returned.\r
-\r
-  If Entry is NULL, then ASSERT().\r
-  If Entry is the head node of an empty list, then ASSERT().\r
-  If PcdMaximumLinkedListLength is not zero, and the number of nodes in the\r
-  linked list containing Entry, including the Entry node, is greater than\r
-  or equal to PcdMaximumLinkedListLength, then ASSERT().\r
-\r
-  @param  Entry A pointer to a node in a linked list\r
-\r
-  @return Entry\r
-\r
-**/\r
-LIST_ENTRY *\r
-EFIAPI\r
-RemoveEntryList (\r
-  IN      CONST LIST_ENTRY          *Entry\r
-  );\r
-\r
-//\r
-// Math Services\r
-//\r
-\r
-/**\r
-  Shifts a 64-bit integer left between 0 and 63 bits. The low bits are filled\r
-  with zeros. The shifted value is returned.\r
-\r
-  This function shifts the 64-bit value Operand to the left by Count bits. The\r
-  low Count bits are set to zero. The shifted value is returned.\r
-\r
-  If Count is greater than 63, then ASSERT().\r
-\r
-  @param  Operand The 64-bit operand to shift left.\r
-  @param  Count   The number of bits to shift left.\r
-\r
-  @return Operand << Count\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-LShiftU64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     Count\r
-  );\r
-\r
-/**\r
-  Shifts a 64-bit integer right between 0 and 63 bits. This high bits are\r
-  filled with zeros. The shifted value is returned.\r
-\r
-  This function shifts the 64-bit value Operand to the right by Count bits. The\r
-  high Count bits are set to zero. The shifted value is returned.\r
-\r
-  If Count is greater than 63, then ASSERT().\r
-\r
-  @param  Operand The 64-bit operand to shift right.\r
-  @param  Count   The number of bits to shift right.\r
-\r
-  @return Operand >> Count\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-RShiftU64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     Count\r
-  );\r
-\r
-/**\r
-  Shifts a 64-bit integer right between 0 and 63 bits. The high bits are filled\r
-  with original integer's bit 63. The shifted value is returned.\r
-\r
-  This function shifts the 64-bit value Operand to the right by Count bits. The\r
-  high Count bits are set to bit 63 of Operand.  The shifted value is returned.\r
-\r
-  If Count is greater than 63, then ASSERT().\r
-\r
-  @param  Operand The 64-bit operand to shift right.\r
-  @param  Count   The number of bits to shift right.\r
-\r
-  @return Operand >> Count\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-ARShiftU64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     Count\r
-  );\r
-\r
-/**\r
-  Rotates a 32-bit integer left between 0 and 31 bits, filling the low bits\r
-  with the high bits that were rotated.\r
-\r
-  This function rotates the 32-bit value Operand to the left by Count bits. The\r
-  low Count bits are fill with the high Count bits of Operand. The rotated\r
-  value is returned.\r
-\r
-  If Count is greater than 31, then ASSERT().\r
-\r
-  @param  Operand The 32-bit operand to rotate left.\r
-  @param  Count   The number of bits to rotate left.\r
-\r
-  @return Operand <<< Count\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-LRotU32 (\r
-  IN      UINT32                    Operand,\r
-  IN      UINTN                     Count\r
-  );\r
-\r
-/**\r
-  Rotates a 32-bit integer right between 0 and 31 bits, filling the high bits\r
-  with the low bits that were rotated.\r
-\r
-  This function rotates the 32-bit value Operand to the right by Count bits.\r
-  The high Count bits are fill with the low Count bits of Operand. The rotated\r
-  value is returned.\r
-\r
-  If Count is greater than 31, then ASSERT().\r
-\r
-  @param  Operand The 32-bit operand to rotate right.\r
-  @param  Count   The number of bits to rotate right.\r
-\r
-  @return Operand >>> Count\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-RRotU32 (\r
-  IN      UINT32                    Operand,\r
-  IN      UINTN                     Count\r
-  );\r
-\r
-/**\r
-  Rotates a 64-bit integer left between 0 and 63 bits, filling the low bits\r
-  with the high bits that were rotated.\r
-\r
-  This function rotates the 64-bit value Operand to the left by Count bits. The\r
-  low Count bits are fill with the high Count bits of Operand. The rotated\r
-  value is returned.\r
-\r
-  If Count is greater than 63, then ASSERT().\r
-\r
-  @param  Operand The 64-bit operand to rotate left.\r
-  @param  Count   The number of bits to rotate left.\r
-\r
-  @return Operand <<< Count\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-LRotU64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     Count\r
-  );\r
-\r
-/**\r
-  Rotates a 64-bit integer right between 0 and 63 bits, filling the high bits\r
-  with the high low bits that were rotated.\r
-\r
-  This function rotates the 64-bit value Operand to the right by Count bits.\r
-  The high Count bits are fill with the low Count bits of Operand. The rotated\r
-  value is returned.\r
-\r
-  If Count is greater than 63, then ASSERT().\r
-\r
-  @param  Operand The 64-bit operand to rotate right.\r
-  @param  Count   The number of bits to rotate right.\r
-\r
-  @return Operand >>> Count\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-RRotU64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     Count\r
-  );\r
-\r
-/**\r
-  Returns the bit position of the lowest bit set in a 32-bit value.\r
-\r
-  This function computes the bit position of the lowest bit set in the 32-bit\r
-  value specified by Operand. If Operand is zero, then -1 is returned.\r
-  Otherwise, a value between 0 and 31 is returned.\r
-\r
-  @param  Operand The 32-bit operand to evaluate.\r
-\r
-  @return Position of the lowest bit set in Operand if found.\r
-  @retval -1 Operand is zero.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-LowBitSet32 (\r
-  IN      UINT32                    Operand\r
-  );\r
-\r
-/**\r
-  Returns the bit position of the lowest bit set in a 64-bit value.\r
-\r
-  This function computes the bit position of the lowest bit set in the 64-bit\r
-  value specified by Operand. If Operand is zero, then -1 is returned.\r
-  Otherwise, a value between 0 and 63 is returned.\r
-\r
-  @param  Operand The 64-bit operand to evaluate.\r
-\r
-  @return Position of the lowest bit set in Operand if found.\r
-  @retval -1  Operand is zero.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-LowBitSet64 (\r
-  IN      UINT64                    Operand\r
-  );\r
-\r
-/**\r
-  Returns the bit position of the highest bit set in a 32-bit value. Equivalent\r
-  to log2(x).\r
-\r
-  This function computes the bit position of the highest bit set in the 32-bit\r
-  value specified by Operand. If Operand is zero, then -1 is returned.\r
-  Otherwise, a value between 0 and 31 is returned.\r
-\r
-  @param  Operand The 32-bit operand to evaluate.\r
-\r
-  @return Position of the highest bit set in Operand if found.\r
-  @retval -1  Operand is zero.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-HighBitSet32 (\r
-  IN      UINT32                    Operand\r
-  );\r
-\r
-/**\r
-  Returns the bit position of the highest bit set in a 64-bit value. Equivalent\r
-  to log2(x).\r
-\r
-  This function computes the bit position of the highest bit set in the 64-bit\r
-  value specified by Operand. If Operand is zero, then -1 is returned.\r
-  Otherwise, a value between 0 and 63 is returned.\r
-\r
-  @param  Operand The 64-bit operand to evaluate.\r
-\r
-  @return Position of the highest bit set in Operand if found.\r
-  @retval -1  Operand is zero.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-HighBitSet64 (\r
-  IN      UINT64                    Operand\r
-  );\r
-\r
-/**\r
-  Returns the value of the highest bit set in a 32-bit value. Equivalent to\r
-  1 << HighBitSet32(x).\r
-\r
-  This function computes the value of the highest bit set in the 32-bit value\r
-  specified by Operand. If Operand is zero, then zero is returned.\r
-\r
-  @param  Operand The 32-bit operand to evaluate.\r
-\r
-  @return 1 << HighBitSet32(Operand)\r
-  @retval 0 Operand is zero.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-GetPowerOfTwo32 (\r
-  IN      UINT32                    Operand\r
-  );\r
-\r
-/**\r
-  Returns the value of the highest bit set in a 64-bit value. Equivalent to\r
-  1 << HighBitSet64(x).\r
-\r
-  This function computes the value of the highest bit set in the 64-bit value\r
-  specified by Operand. If Operand is zero, then zero is returned.\r
-\r
-  @param  Operand The 64-bit operand to evaluate.\r
-\r
-  @return 1 << HighBitSet64(Operand)\r
-  @retval 0 Operand is zero.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-GetPowerOfTwo64 (\r
-  IN      UINT64                    Operand\r
-  );\r
-\r
-/**\r
-  Switches the endianess of a 16-bit integer.\r
-\r
-  This function swaps the bytes in a 16-bit unsigned value to switch the value\r
-  from little endian to big endian or vice versa. The byte swapped value is\r
-  returned.\r
-\r
-  @param  Operand A 16-bit unsigned value.\r
-\r
-  @return The byte swaped Operand.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-SwapBytes16 (\r
-  IN      UINT16                    Value\r
-  );\r
-\r
-/**\r
-  Switches the endianess of a 32-bit integer.\r
-\r
-  This function swaps the bytes in a 32-bit unsigned value to switch the value\r
-  from little endian to big endian or vice versa. The byte swapped value is\r
-  returned.\r
-\r
-  @param  Operand A 32-bit unsigned value.\r
-\r
-  @return The byte swaped Operand.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-SwapBytes32 (\r
-  IN      UINT32                    Value\r
-  );\r
-\r
-/**\r
-  Switches the endianess of a 64-bit integer.\r
-\r
-  This function swaps the bytes in a 64-bit unsigned value to switch the value\r
-  from little endian to big endian or vice versa. The byte swapped value is\r
-  returned.\r
-\r
-  @param  Operand A 64-bit unsigned value.\r
-\r
-  @return The byte swaped Operand.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-SwapBytes64 (\r
-  IN      UINT64                    Value\r
-  );\r
-\r
-/**\r
-  Multiples a 64-bit unsigned integer by a 32-bit unsigned integer and\r
-  generates a 64-bit unsigned result.\r
-\r
-  This function multiples the 64-bit unsigned value Multiplicand by the 32-bit\r
-  unsigned value Multiplier and generates a 64-bit unsigned result. This 64-\r
-  bit unsigned result is returned.\r
-\r
-  If the result overflows, then ASSERT().\r
-\r
-  @param  Multiplicand  A 64-bit unsigned value.\r
-  @param  Multiplier    A 32-bit unsigned value.\r
-\r
-  @return Multiplicand * Multiplier\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MultU64x32 (\r
-  IN      UINT64                    Multiplicand,\r
-  IN      UINT32                    Multiplier\r
-  );\r
-\r
-/**\r
-  Multiples a 64-bit unsigned integer by a 64-bit unsigned integer and\r
-  generates a 64-bit unsigned result.\r
-\r
-  This function multiples the 64-bit unsigned value Multiplicand by the 64-bit\r
-  unsigned value Multiplier and generates a 64-bit unsigned result. This 64-\r
-  bit unsigned result is returned.\r
-\r
-  If the result overflows, then ASSERT().\r
-\r
-  @param  Multiplicand  A 64-bit unsigned value.\r
-  @param  Multiplier    A 64-bit unsigned value.\r
-\r
-  @return Multiplicand * Multiplier\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MultU64x64 (\r
-  IN      UINT64                    Multiplicand,\r
-  IN      UINT64                    Multiplier\r
-  );\r
-\r
-/**\r
-  Multiples a 64-bit signed integer by a 64-bit signed integer and generates a\r
-  64-bit signed result.\r
-\r
-  This function multiples the 64-bit signed value Multiplicand by the 64-bit\r
-  signed value Multiplier and generates a 64-bit signed result. This 64-bit\r
-  signed result is returned.\r
-\r
-  If the result overflows, then ASSERT().\r
-\r
-  @param  Multiplicand  A 64-bit signed value.\r
-  @param  Multiplier    A 64-bit signed value.\r
-\r
-  @return Multiplicand * Multiplier\r
-\r
-**/\r
-INT64\r
-EFIAPI\r
-MultS64x64 (\r
-  IN      INT64                     Multiplicand,\r
-  IN      INT64                     Multiplier\r
-  );\r
-\r
-/**\r
-  Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates\r
-  a 64-bit unsigned result.\r
-\r
-  This function divides the 64-bit unsigned value Dividend by the 32-bit\r
-  unsigned value Divisor and generates a 64-bit unsigned quotient. This\r
-  function returns the 64-bit unsigned quotient.\r
-\r
-  If Divisor is 0, then ASSERT().\r
-\r
-  @param  Dividend  A 64-bit unsigned value.\r
-  @param  Divisor   A 32-bit unsigned value.\r
-\r
-  @return Dividend / Divisor\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-DivU64x32 (\r
-  IN      UINT64                    Dividend,\r
-  IN      UINT32                    Divisor\r
-  );\r
-\r
-/**\r
-  Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates\r
-  a 32-bit unsigned remainder.\r
-\r
-  This function divides the 64-bit unsigned value Dividend by the 32-bit\r
-  unsigned value Divisor and generates a 32-bit remainder. This function\r
-  returns the 32-bit unsigned remainder.\r
-\r
-  If Divisor is 0, then ASSERT().\r
-\r
-  @param  Dividend  A 64-bit unsigned value.\r
-  @param  Divisor   A 32-bit unsigned value.\r
-\r
-  @return Dividend % Divisor\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-ModU64x32 (\r
-  IN      UINT64                    Dividend,\r
-  IN      UINT32                    Divisor\r
-  );\r
-\r
-/**\r
-  Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates\r
-  a 64-bit unsigned result and an optional 32-bit unsigned remainder.\r
-\r
-  This function divides the 64-bit unsigned value Dividend by the 32-bit\r
-  unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder\r
-  is not NULL, then the 32-bit unsigned remainder is returned in Remainder.\r
-  This function returns the 64-bit unsigned quotient.\r
-\r
-  If Divisor is 0, then ASSERT().\r
-\r
-  @param  Dividend  A 64-bit unsigned value.\r
-  @param  Divisor   A 32-bit unsigned value.\r
-  @param  Remainder A pointer to a 32-bit unsigned value. This parameter is\r
-                    optional and may be NULL.\r
-\r
-  @return Dividend / Divisor\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-DivU64x32Remainder (\r
-  IN      UINT64                    Dividend,\r
-  IN      UINT32                    Divisor,\r
-  OUT     UINT32                    *Remainder  OPTIONAL\r
-  );\r
-\r
-/**\r
-  Divides a 64-bit unsigned integer by a 64-bit unsigned integer and generates\r
-  a 64-bit unsigned result and an optional 64-bit unsigned remainder.\r
-\r
-  This function divides the 64-bit unsigned value Dividend by the 64-bit\r
-  unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder\r
-  is not NULL, then the 64-bit unsigned remainder is returned in Remainder.\r
-  This function returns the 64-bit unsigned quotient.\r
-\r
-  If Divisor is 0, then ASSERT().\r
-\r
-  @param  Dividend  A 64-bit unsigned value.\r
-  @param  Divisor   A 64-bit unsigned value.\r
-  @param  Remainder A pointer to a 64-bit unsigned value. This parameter is\r
-                    optional and may be NULL.\r
-\r
-  @return Dividend / Divisor\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-DivU64x64Remainder (\r
-  IN      UINT64                    Dividend,\r
-  IN      UINT64                    Divisor,\r
-  OUT     UINT64                    *Remainder  OPTIONAL\r
-  );\r
-\r
-/**\r
-  Divides a 64-bit signed integer by a 64-bit signed integer and generates a\r
-  64-bit signed result and a optional 64-bit signed remainder.\r
-\r
-  This function divides the 64-bit signed value Dividend by the 64-bit signed\r
-  value Divisor and generates a 64-bit signed quotient. If Remainder is not\r
-  NULL, then the 64-bit signed remainder is returned in Remainder. This\r
-  function returns the 64-bit signed quotient.\r
-\r
-  If Divisor is 0, then ASSERT().\r
-\r
-  @param  Dividend  A 64-bit signed value.\r
-  @param  Divisor   A 64-bit signed value.\r
-  @param  Remainder A pointer to a 64-bit signed value. This parameter is\r
-                    optional and may be NULL.\r
-\r
-  @return Dividend / Divisor\r
-\r
-**/\r
-INT64\r
-EFIAPI\r
-DivS64x64Remainder (\r
-  IN      INT64                     Dividend,\r
-  IN      INT64                     Divisor,\r
-  OUT     INT64                     *Remainder  OPTIONAL\r
-  );\r
-\r
-/**\r
-  Reads a 16-bit value from memory that may be unaligned.\r
-\r
-  This function returns the 16-bit value pointed to by Buffer. The function\r
-  guarantees that the read operation does not produce an alignment fault.\r
-\r
-  If the Buffer is NULL, then ASSERT().\r
-\r
-  @param  Buffer  Pointer to a 16-bit value that may be unaligned.\r
-\r
-  @return *Uint16\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-ReadUnaligned16 (\r
-  IN      CONST UINT16              *Uint16\r
-  );\r
-\r
-/**\r
-  Writes a 16-bit value to memory that may be unaligned.\r
-\r
-  This function writes the 16-bit value specified by Value to Buffer. Value is\r
-  returned. The function guarantees that the write operation does not produce\r
-  an alignment fault.\r
-\r
-  If the Buffer is NULL, then ASSERT().\r
-\r
-  @param  Buffer  Pointer to a 16-bit value that may be unaligned.\r
-  @param  Value   16-bit value to write to Buffer.\r
-\r
-  @return Value\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-WriteUnaligned16 (\r
-  OUT     UINT16                    *Uint16,\r
-  IN      UINT16                    Value\r
-  );\r
-\r
-/**\r
-  Reads a 24-bit value from memory that may be unaligned.\r
-\r
-  This function returns the 24-bit value pointed to by Buffer. The function\r
-  guarantees that the read operation does not produce an alignment fault.\r
-\r
-  If the Buffer is NULL, then ASSERT().\r
-\r
-  @param  Buffer  Pointer to a 24-bit value that may be unaligned.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-ReadUnaligned24 (\r
-  IN      CONST UINT32              *Buffer\r
-  );\r
-\r
-/**\r
-  Writes a 24-bit value to memory that may be unaligned.\r
-\r
-  This function writes the 24-bit value specified by Value to Buffer. Value is\r
-  returned. The function guarantees that the write operation does not produce\r
-  an alignment fault.\r
-\r
-  If the Buffer is NULL, then ASSERT().\r
-\r
-  @param  Buffer  Pointer to a 24-bit value that may be unaligned.\r
-  @param  Value   24-bit value to write to Buffer.\r
-\r
-  @return The value written.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-WriteUnaligned24 (\r
-  OUT     UINT32                    *Buffer,\r
-  IN      UINT32                    Value\r
-  );\r
-\r
-/**\r
-  Reads a 32-bit value from memory that may be unaligned.\r
-\r
-  This function returns the 32-bit value pointed to by Buffer. The function\r
-  guarantees that the read operation does not produce an alignment fault.\r
-\r
-  If the Buffer is NULL, then ASSERT().\r
-\r
-  @param  Buffer  Pointer to a 32-bit value that may be unaligned.\r
-\r
-  @return *Uint32\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-ReadUnaligned32 (\r
-  IN      CONST UINT32              *Uint32\r
-  );\r
-\r
-/**\r
-  Writes a 32-bit value to memory that may be unaligned.\r
-\r
-  This function writes the 32-bit value specified by Value to Buffer. Value is\r
-  returned. The function guarantees that the write operation does not produce\r
-  an alignment fault.\r
-\r
-  If the Buffer is NULL, then ASSERT().\r
-\r
-  @param  Buffer  Pointer to a 32-bit value that may be unaligned.\r
-  @param  Value   32-bit value to write to Buffer.\r
-\r
-  @return Value\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-WriteUnaligned32 (\r
-  OUT     UINT32                    *Uint32,\r
-  IN      UINT32                    Value\r
-  );\r
-\r
-/**\r
-  Reads a 64-bit value from memory that may be unaligned.\r
-\r
-  This function returns the 64-bit value pointed to by Buffer. The function\r
-  guarantees that the read operation does not produce an alignment fault.\r
-\r
-  If the Buffer is NULL, then ASSERT().\r
-\r
-  @param  Buffer  Pointer to a 64-bit value that may be unaligned.\r
-\r
-  @return *Uint64\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-ReadUnaligned64 (\r
-  IN      CONST UINT64              *Uint64\r
-  );\r
-\r
-/**\r
-  Writes a 64-bit value to memory that may be unaligned.\r
-\r
-  This function writes the 64-bit value specified by Value to Buffer. Value is\r
-  returned. The function guarantees that the write operation does not produce\r
-  an alignment fault.\r
-\r
-  If the Buffer is NULL, then ASSERT().\r
-\r
-  @param  Buffer  Pointer to a 64-bit value that may be unaligned.\r
-  @param  Value   64-bit value to write to Buffer.\r
-\r
-  @return Value\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-WriteUnaligned64 (\r
-  OUT     UINT64                    *Uint64,\r
-  IN      UINT64                    Value\r
-  );\r
-\r
-//\r
-// Bit Field Functions\r
-//\r
-\r
-/**\r
-  Returns a bit field from an 8-bit value.\r
-\r
-  Returns the bitfield specified by the StartBit and the EndBit from Operand.\r
-\r
-  If 8-bit operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-\r
-  @return The bit field read.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-BitFieldRead8 (\r
-  IN      UINT8                     Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  );\r
-\r
-/**\r
-  Writes a bit field to an 8-bit value, and returns the result.\r
-\r
-  Writes Value to the bit field specified by the StartBit and the EndBit in\r
-  Operand. All other bits in Operand are preserved. The new 8-bit value is\r
-  returned.\r
-\r
-  If 8-bit operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  Value     New value of the bit field.\r
-\r
-  @return The new 8-bit value.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-BitFieldWrite8 (\r
-  IN      UINT8                     Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     Value\r
-  );\r
-\r
-/**\r
-  Reads a bit field from an 8-bit value, performs a bitwise OR, and returns the\r
-  result.\r
-\r
-  Performs a bitwise inclusive OR between the bit field specified by StartBit\r
-  and EndBit in Operand and the value specified by OrData. All other bits in\r
-  Operand are preserved. The new 8-bit value is returned.\r
-\r
-  If 8-bit operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  OrData    The value to OR with the read value from the value\r
-\r
-  @return The new 8-bit value.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-BitFieldOr8 (\r
-  IN      UINT8                     Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field from an 8-bit value, performs a bitwise AND, and returns\r
-  the result.\r
-\r
-  Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
-  in Operand and the value specified by AndData. All other bits in Operand are\r
-  preserved. The new 8-bit value is returned.\r
-\r
-  If 8-bit operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  AndData   The value to AND with the read value from the value.\r
-\r
-  @return The new 8-bit value.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-BitFieldAnd8 (\r
-  IN      UINT8                     Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     AndData\r
-  );\r
-\r
-/**\r
-  Reads a bit field from an 8-bit value, performs a bitwise AND followed by a\r
-  bitwise OR, and returns the result.\r
-\r
-  Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
-  in Operand and the value specified by AndData, followed by a bitwise\r
-  inclusive OR with value specified by OrData. All other bits in Operand are\r
-  preserved. The new 8-bit value is returned.\r
-\r
-  If 8-bit operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  AndData   The value to AND with the read value from the value.\r
-  @param  OrData    The value to OR with the result of the AND operation.\r
-\r
-  @return The new 8-bit value.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-BitFieldAndThenOr8 (\r
-  IN      UINT8                     Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     AndData,\r
-  IN      UINT8                     OrData\r
-  );\r
-\r
-/**\r
-  Returns a bit field from a 16-bit value.\r
-\r
-  Returns the bitfield specified by the StartBit and the EndBit from Operand.\r
-\r
-  If 16-bit operations are not supported, then ASSERT().\r
-  If StartBit is greater than 15, then ASSERT().\r
-  If EndBit is greater than 15, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-\r
-  @return The bit field read.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-BitFieldRead16 (\r
-  IN      UINT16                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  );\r
-\r
-/**\r
-  Writes a bit field to a 16-bit value, and returns the result.\r
-\r
-  Writes Value to the bit field specified by the StartBit and the EndBit in\r
-  Operand. All other bits in Operand are preserved. The new 16-bit value is\r
-  returned.\r
-\r
-  If 16-bit operations are not supported, then ASSERT().\r
-  If StartBit is greater than 15, then ASSERT().\r
-  If EndBit is greater than 15, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  Value     New value of the bit field.\r
-\r
-  @return The new 16-bit value.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-BitFieldWrite16 (\r
-  IN      UINT16                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    Value\r
-  );\r
-\r
-/**\r
-  Reads a bit field from a 16-bit value, performs a bitwise OR, and returns the\r
-  result.\r
-\r
-  Performs a bitwise inclusive OR between the bit field specified by StartBit\r
-  and EndBit in Operand and the value specified by OrData. All other bits in\r
-  Operand are preserved. The new 16-bit value is returned.\r
-\r
-  If 16-bit operations are not supported, then ASSERT().\r
-  If StartBit is greater than 15, then ASSERT().\r
-  If EndBit is greater than 15, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  OrData    The value to OR with the read value from the value\r
-\r
-  @return The new 16-bit value.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-BitFieldOr16 (\r
-  IN      UINT16                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field from a 16-bit value, performs a bitwise AND, and returns\r
-  the result.\r
-\r
-  Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
-  in Operand and the value specified by AndData. All other bits in Operand are\r
-  preserved. The new 16-bit value is returned.\r
-\r
-  If 16-bit operations are not supported, then ASSERT().\r
-  If StartBit is greater than 15, then ASSERT().\r
-  If EndBit is greater than 15, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  AndData   The value to AND with the read value from the value\r
-\r
-  @return The new 16-bit value.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-BitFieldAnd16 (\r
-  IN      UINT16                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    AndData\r
-  );\r
-\r
-/**\r
-  Reads a bit field from a 16-bit value, performs a bitwise AND followed by a\r
-  bitwise OR, and returns the result.\r
-\r
-  Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
-  in Operand and the value specified by AndData, followed by a bitwise\r
-  inclusive OR with value specified by OrData. All other bits in Operand are\r
-  preserved. The new 16-bit value is returned.\r
-\r
-  If 16-bit operations are not supported, then ASSERT().\r
-  If StartBit is greater than 15, then ASSERT().\r
-  If EndBit is greater than 15, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  AndData   The value to AND with the read value from the value.\r
-  @param  OrData    The value to OR with the result of the AND operation.\r
-\r
-  @return The new 16-bit value.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-BitFieldAndThenOr16 (\r
-  IN      UINT16                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    AndData,\r
-  IN      UINT16                    OrData\r
-  );\r
-\r
-/**\r
-  Returns a bit field from a 32-bit value.\r
-\r
-  Returns the bitfield specified by the StartBit and the EndBit from Operand.\r
-\r
-  If 32-bit operations are not supported, then ASSERT().\r
-  If StartBit is greater than 31, then ASSERT().\r
-  If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-\r
-  @return The bit field read.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-BitFieldRead32 (\r
-  IN      UINT32                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  );\r
-\r
-/**\r
-  Writes a bit field to a 32-bit value, and returns the result.\r
-\r
-  Writes Value to the bit field specified by the StartBit and the EndBit in\r
-  Operand. All other bits in Operand are preserved. The new 32-bit value is\r
-  returned.\r
-\r
-  If 32-bit operations are not supported, then ASSERT().\r
-  If StartBit is greater than 31, then ASSERT().\r
-  If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  Value     New value of the bit field.\r
-\r
-  @return The new 32-bit value.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-BitFieldWrite32 (\r
-  IN      UINT32                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    Value\r
-  );\r
-\r
-/**\r
-  Reads a bit field from a 32-bit value, performs a bitwise OR, and returns the\r
-  result.\r
-\r
-  Performs a bitwise inclusive OR between the bit field specified by StartBit\r
-  and EndBit in Operand and the value specified by OrData. All other bits in\r
-  Operand are preserved. The new 32-bit value is returned.\r
-\r
-  If 32-bit operations are not supported, then ASSERT().\r
-  If StartBit is greater than 31, then ASSERT().\r
-  If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  OrData    The value to OR with the read value from the value\r
-\r
-  @return The new 32-bit value.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-BitFieldOr32 (\r
-  IN      UINT32                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field from a 32-bit value, performs a bitwise AND, and returns\r
-  the result.\r
-\r
-  Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
-  in Operand and the value specified by AndData. All other bits in Operand are\r
-  preserved. The new 32-bit value is returned.\r
-\r
-  If 32-bit operations are not supported, then ASSERT().\r
-  If StartBit is greater than 31, then ASSERT().\r
-  If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  AndData   The value to AND with the read value from the value\r
-\r
-  @return The new 32-bit value.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-BitFieldAnd32 (\r
-  IN      UINT32                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    AndData\r
-  );\r
-\r
-/**\r
-  Reads a bit field from a 32-bit value, performs a bitwise AND followed by a\r
-  bitwise OR, and returns the result.\r
-\r
-  Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
-  in Operand and the value specified by AndData, followed by a bitwise\r
-  inclusive OR with value specified by OrData. All other bits in Operand are\r
-  preserved. The new 32-bit value is returned.\r
-\r
-  If 32-bit operations are not supported, then ASSERT().\r
-  If StartBit is greater than 31, then ASSERT().\r
-  If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  AndData   The value to AND with the read value from the value.\r
-  @param  OrData    The value to OR with the result of the AND operation.\r
-\r
-  @return The new 32-bit value.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-BitFieldAndThenOr32 (\r
-  IN      UINT32                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    AndData,\r
-  IN      UINT32                    OrData\r
-  );\r
-\r
-/**\r
-  Returns a bit field from a 64-bit value.\r
-\r
-  Returns the bitfield specified by the StartBit and the EndBit from Operand.\r
-\r
-  If 64-bit operations are not supported, then ASSERT().\r
-  If StartBit is greater than 63, then ASSERT().\r
-  If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-\r
-  @return The bit field read.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-BitFieldRead64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  );\r
-\r
-/**\r
-  Writes a bit field to a 64-bit value, and returns the result.\r
-\r
-  Writes Value to the bit field specified by the StartBit and the EndBit in\r
-  Operand. All other bits in Operand are preserved. The new 64-bit value is\r
-  returned.\r
-\r
-  If 64-bit operations are not supported, then ASSERT().\r
-  If StartBit is greater than 63, then ASSERT().\r
-  If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  Value     New value of the bit field.\r
-\r
-  @return The new 64-bit value.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-BitFieldWrite64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    Value\r
-  );\r
-\r
-/**\r
-  Reads a bit field from a 64-bit value, performs a bitwise OR, and returns the\r
-  result.\r
-\r
-  Performs a bitwise inclusive OR between the bit field specified by StartBit\r
-  and EndBit in Operand and the value specified by OrData. All other bits in\r
-  Operand are preserved. The new 64-bit value is returned.\r
-\r
-  If 64-bit operations are not supported, then ASSERT().\r
-  If StartBit is greater than 63, then ASSERT().\r
-  If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  OrData    The value to OR with the read value from the value\r
-\r
-  @return The new 64-bit value.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-BitFieldOr64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field from a 64-bit value, performs a bitwise AND, and returns\r
-  the result.\r
-\r
-  Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
-  in Operand and the value specified by AndData. All other bits in Operand are\r
-  preserved. The new 64-bit value is returned.\r
-\r
-  If 64-bit operations are not supported, then ASSERT().\r
-  If StartBit is greater than 63, then ASSERT().\r
-  If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  AndData   The value to AND with the read value from the value\r
-\r
-  @return The new 64-bit value.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-BitFieldAnd64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    AndData\r
-  );\r
-\r
-/**\r
-  Reads a bit field from a 64-bit value, performs a bitwise AND followed by a\r
-  bitwise OR, and returns the result.\r
-\r
-  Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
-  in Operand and the value specified by AndData, followed by a bitwise\r
-  inclusive OR with value specified by OrData. All other bits in Operand are\r
-  preserved. The new 64-bit value is returned.\r
-\r
-  If 64-bit operations are not supported, then ASSERT().\r
-  If StartBit is greater than 63, then ASSERT().\r
-  If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  AndData   The value to AND with the read value from the value.\r
-  @param  OrData    The value to OR with the result of the AND operation.\r
-\r
-  @return The new 64-bit value.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-BitFieldAndThenOr64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    AndData,\r
-  IN      UINT64                    OrData\r
-  );\r
-\r
-//\r
-// Base Library Synchronization Functions\r
-//\r
-\r
-/**\r
-  Retrieves the architecture specific spin lock alignment requirements for\r
-  optimal spin lock performance.\r
-\r
-  This function retrieves the spin lock alignment requirements for optimal\r
-  performance on a given CPU architecture. The spin lock alignment must be a\r
-  power of two and is returned by this function. If there are no alignment\r
-  requirements, then 1 must be returned. The spin lock synchronization\r
-  functions must function correctly if the spin lock size and alignment values\r
-  returned by this function are not used at all. These values are hints to the\r
-  consumers of the spin lock synchronization functions to obtain optimal spin\r
-  lock performance.\r
-\r
-  @return The architecture specific spin lock alignment.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-GetSpinLockProperties (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Initializes a spin lock to the released state and returns the spin lock.\r
-\r
-  This function initializes the spin lock specified by SpinLock to the released\r
-  state, and returns SpinLock. Optimal performance can be achieved by calling\r
-  GetSpinLockProperties() to determine the size and alignment requirements for\r
-  SpinLock.\r
-\r
-  If SpinLock is NULL, then ASSERT().\r
-\r
-  @param  SpinLock  A pointer to the spin lock to initialize to the released\r
-                    state.\r
-\r
-  @return SpinLock\r
-\r
-**/\r
-SPIN_LOCK *\r
-EFIAPI\r
-InitializeSpinLock (\r
-  IN      SPIN_LOCK                 *SpinLock\r
-  );\r
-\r
-/**\r
-  Waits until a spin lock can be placed in the acquired state.\r
-\r
-  This function checks the state of the spin lock specified by SpinLock. If\r
-  SpinLock is in the released state, then this function places SpinLock in the\r
-  acquired state and returns SpinLock. Otherwise, this function waits\r
-  indefinitely for the spin lock to be released, and then places it in the\r
-  acquired state and returns SpinLock. All state transitions of SpinLock must\r
-  be performed using MP safe mechanisms.\r
-\r
-  If SpinLock is NULL, then ASSERT().\r
-  If SpinLock was not initialized with InitializeSpinLock(), then ASSERT().\r
-  If PcdSpinLockTimeout is not zero, and SpinLock is can not be acquired in\r
-  PcdSpinLockTimeout microseconds, then ASSERT().\r
-\r
-  @param  SpinLock  A pointer to the spin lock to place in the acquired state.\r
-\r
-  @return SpinLock\r
-\r
-**/\r
-SPIN_LOCK *\r
-EFIAPI\r
-AcquireSpinLock (\r
-  IN      SPIN_LOCK                 *SpinLock\r
-  );\r
-\r
-/**\r
-  Attempts to place a spin lock in the acquired state.\r
-\r
-  This function checks the state of the spin lock specified by SpinLock. If\r
-  SpinLock is in the released state, then this function places SpinLock in the\r
-  acquired state and returns TRUE. Otherwise, FALSE is returned. All state\r
-  transitions of SpinLock must be performed using MP safe mechanisms.\r
-\r
-  If SpinLock is NULL, then ASSERT().\r
-  If SpinLock was not initialized with InitializeSpinLock(), then ASSERT().\r
-\r
-  @param  SpinLock  A pointer to the spin lock to place in the acquired state.\r
-\r
-  @retval TRUE  SpinLock was placed in the acquired state.\r
-  @retval FALSE SpinLock could not be acquired.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-AcquireSpinLockOrFail (\r
-  IN      SPIN_LOCK                 *SpinLock\r
-  );\r
-\r
-/**\r
-  Releases a spin lock.\r
-\r
-  This function places the spin lock specified by SpinLock in the release state\r
-  and returns SpinLock.\r
-\r
-  If SpinLock is NULL, then ASSERT().\r
-  If SpinLock was not initialized with InitializeSpinLock(), then ASSERT().\r
-\r
-  @param  SpinLock  A pointer to the spin lock to release.\r
-\r
-  @return SpinLock\r
-\r
-**/\r
-SPIN_LOCK *\r
-EFIAPI\r
-ReleaseSpinLock (\r
-  IN      SPIN_LOCK                 *SpinLock\r
-  );\r
-\r
-/**\r
-  Performs an atomic increment of an 32-bit unsigned integer.\r
-\r
-  Performs an atomic increment of the 32-bit unsigned integer specified by\r
-  Value and returns the incremented value. The increment operation must be\r
-  performed using MP safe mechanisms. The state of the return value is not\r
-  guaranteed to be MP safe.\r
-\r
-  If Value is NULL, then ASSERT().\r
-\r
-  @param  Value A pointer to the 32-bit value to increment.\r
-\r
-  @return The incremented value.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-InterlockedIncrement (\r
-  IN      UINT32                    *Value\r
-  );\r
-\r
-/**\r
-  Performs an atomic decrement of an 32-bit unsigned integer.\r
-\r
-  Performs an atomic decrement of the 32-bit unsigned integer specified by\r
-  Value and returns the decremented value. The decrement operation must be\r
-  performed using MP safe mechanisms. The state of the return value is not\r
-  guaranteed to be MP safe.\r
-\r
-  If Value is NULL, then ASSERT().\r
-\r
-  @param  Value A pointer to the 32-bit value to decrement.\r
-\r
-  @return The decremented value.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-InterlockedDecrement (\r
-  IN      UINT32                    *Value\r
-  );\r
-\r
-/**\r
-  Performs an atomic compare exchange operation on a 32-bit unsigned integer.\r
-\r
-  Performs an atomic compare exchange operation on the 32-bit unsigned integer\r
-  specified by Value.  If Value is equal to CompareValue, then Value is set to\r
-  ExchangeValue and CompareValue is returned.  If Value is not equal to CompareValue,\r
-  then Value is returned.  The compare exchange operation must be performed using\r
-  MP safe mechanisms.\r
-\r
-  If Value is NULL, then ASSERT().\r
-\r
-  @param  Value         A pointer to the 32-bit value for the compare exchange\r
-                        operation.\r
-  @param  CompareValue  32-bit value used in compare operation.\r
-  @param  ExchangeValue 32-bit value used in exchange operation.\r
-\r
-  @return The original *Value before exchange.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-InterlockedCompareExchange32 (\r
-  IN OUT  UINT32                    *Value,\r
-  IN      UINT32                    CompareValue,\r
-  IN      UINT32                    ExchangeValue\r
-  );\r
-\r
-/**\r
-  Performs an atomic compare exchange operation on a 64-bit unsigned integer.\r
-\r
-  Performs an atomic compare exchange operation on the 64-bit unsigned integer specified\r
-  by Value.  If Value is equal to CompareValue, then Value is set to ExchangeValue and\r
-  CompareValue is returned.  If Value is not equal to CompareValue, then Value is returned.\r
-  The compare exchange operation must be performed using MP safe mechanisms.\r
-\r
-  If Value is NULL, then ASSERT().\r
-\r
-  @param  Value         A pointer to the 64-bit value for the compare exchange\r
-                        operation.\r
-  @param  CompareValue  64-bit value used in compare operation.\r
-  @param  ExchangeValue 64-bit value used in exchange operation.\r
-\r
-  @return The original *Value before exchange.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InterlockedCompareExchange64 (\r
-  IN OUT  UINT64                    *Value,\r
-  IN      UINT64                    CompareValue,\r
-  IN      UINT64                    ExchangeValue\r
-  );\r
-\r
-/**\r
-  Performs an atomic compare exchange operation on a pointer value.\r
-\r
-  Performs an atomic compare exchange operation on the pointer value specified\r
-  by Value. If Value is equal to CompareValue, then Value is set to\r
-  ExchangeValue and CompareValue is returned. If Value is not equal to\r
-  CompareValue, then Value is returned. The compare exchange operation must be\r
-  performed using MP safe mechanisms.\r
-\r
-  If Value is NULL, then ASSERT().\r
-\r
-  @param  Value         A pointer to the pointer value for the compare exchange\r
-                        operation.\r
-  @param  CompareValue  Pointer value used in compare operation.\r
-  @param  ExchangeValue Pointer value used in exchange operation.\r
-\r
-**/\r
-VOID *\r
-EFIAPI\r
-InterlockedCompareExchangePointer (\r
-  IN OUT  VOID                      **Value,\r
-  IN      VOID                      *CompareValue,\r
-  IN      VOID                      *ExchangeValue\r
-  );\r
-\r
-//\r
-// Base Library CPU Functions\r
-//\r
-typedef\r
-VOID\r
-(EFIAPI *SWITCH_STACK_ENTRY_POINT) (\r
-  IN      VOID                      *Context1,  OPTIONAL\r
-  IN      VOID                      *Context2   OPTIONAL\r
-  );\r
-\r
-/**\r
-  Used to serialize load and store operations.\r
-\r
-  All loads and stores that proceed calls to this function are guaranteed to be\r
-  globally visible when this function returns.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-MemoryFence (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Saves the current CPU context that can be restored with a call to LongJump()\r
-  and returns 0.\r
-\r
-  Saves the current CPU context in the buffer specified by JumpBuffer and\r
-  returns 0. The initial call to SetJump() must always return 0. Subsequent\r
-  calls to LongJump() cause a non-zero value to be returned by SetJump().\r
-\r
-  If JumpBuffer is NULL, then ASSERT().\r
-  For IPF CPUs, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().\r
-\r
-  @param  JumpBuffer  A pointer to CPU context buffer.\r
-\r
-  @retval 0 Indicates a return from SetJump().\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-SetJump (\r
-  OUT     BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer\r
-  );\r
-\r
-/**\r
-  Restores the CPU context that was saved with SetJump().\r
-\r
-  Restores the CPU context from the buffer specified by JumpBuffer. This\r
-  function never returns to the caller. Instead is resumes execution based on\r
-  the state of JumpBuffer.\r
-\r
-  If JumpBuffer is NULL, then ASSERT().\r
-  For IPF CPUs, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().\r
-  If Value is 0, then ASSERT().\r
-\r
-  @param  JumpBuffer  A pointer to CPU context buffer.\r
-  @param  Value       The value to return when the SetJump() context is\r
-                      restored and must be non-zero.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-LongJump (\r
-  IN      BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer,\r
-  IN      UINTN                     Value\r
-  );\r
-\r
-/**\r
-  Enables CPU interrupts.\r
-\r
-  Enables CPU interrupts.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-EnableInterrupts (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Disables CPU interrupts.\r
-\r
-  Disables CPU interrupts.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-DisableInterrupts (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Disables CPU interrupts and returns the interrupt state prior to the disable\r
-  operation.\r
-\r
-  Disables CPU interrupts and returns the interrupt state prior to the disable\r
-  operation.\r
-\r
-  @retval TRUE  CPU interrupts were enabled on entry to this call.\r
-  @retval FALSE CPU interrupts were disabled on entry to this call.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-SaveAndDisableInterrupts (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Enables CPU interrupts for the smallest window required to capture any\r
-  pending interrupts.\r
-\r
-  Enables CPU interrupts for the smallest window required to capture any\r
-  pending interrupts.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-EnableDisableInterrupts (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Retrieves the current CPU interrupt state.\r
-\r
-  Retrieves the current CPU interrupt state. Returns TRUE is interrupts are\r
-  currently enabled. Otherwise returns FALSE.\r
-\r
-  @retval TRUE  CPU interrupts are enabled.\r
-  @retval FALSE CPU interrupts are disabled.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-GetInterruptState (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Set the current CPU interrupt state.\r
-\r
-  Sets the current CPU interrupt state to the state specified by\r
-  InterruptState. If InterruptState is TRUE, then interrupts are enabled. If\r
-  InterruptState is FALSE, then interrupts are disabled. InterruptState is\r
-  returned.\r
-\r
-  @param  InterruptState  TRUE if interrupts should enabled. FALSE if\r
-                          interrupts should be disabled.\r
-\r
-  @return InterruptState\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-SetInterruptState (\r
-  IN      BOOLEAN                   InterruptState\r
-  );\r
-\r
-/**\r
-  Places the CPU in a sleep state until an interrupt is received.\r
-\r
-  Places the CPU in a sleep state until an interrupt is received. If interrupts\r
-  are disabled prior to calling this function, then the CPU will be placed in a\r
-  sleep state indefinitely.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-CpuSleep (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Requests CPU to pause for a short period of time.\r
-\r
-  Requests CPU to pause for a short period of time. Typically used in MP\r
-  systems to prevent memory starvation while waiting for a spin lock.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-CpuPause (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Flushes all the Translation Lookaside Buffers(TLB) entries in a CPU.\r
-\r
-  Flushes all the Translation Lookaside Buffers(TLB) entries in a CPU.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-CpuFlushTlb (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Transfers control to a function starting with a new stack.\r
-\r
-  Transfers control to the function specified by EntryPoint using the new stack\r
-  specified by NewStack and passing in the parameters specified by Context1 and\r
-  Context2. Context1 and Context2 are optional and may be NULL. The function\r
-  EntryPoint must never return.\r
-\r
-  If EntryPoint is NULL, then ASSERT().\r
-  If NewStack is NULL, then ASSERT().\r
-\r
-  @param  EntryPoint  A pointer to function to call with the new stack.\r
-  @param  Context1    A pointer to the context to pass into the EntryPoint\r
-                      function.\r
-  @param  Context2    A pointer to the context to pass into the EntryPoint\r
-                      function.\r
-  @param  NewStack    A pointer to the new stack to use for the EntryPoint\r
-                      function.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-SwitchStack (\r
-  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
-  IN      VOID                      *Context1,  OPTIONAL\r
-  IN      VOID                      *Context2,  OPTIONAL\r
-  IN      VOID                      *NewStack\r
-  );\r
-\r
-/**\r
-  Generates a breakpoint on the CPU.\r
-\r
-  Generates a breakpoint on the CPU. The breakpoint must be implemented such\r
-  that code can resume normal execution after the breakpoint.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-CpuBreakpoint (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Executes an infinite loop.\r
-\r
-  Forces the CPU to execute an infinite loop. A debugger may be used to skip\r
-  past the loop and the code that follows the loop must execute properly. This\r
-  implies that the infinite loop must not cause the code that follow it to be\r
-  optimized away.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-CpuDeadLoop (\r
-  VOID\r
-  );\r
-\r
-//\r
-// IA32 and X64 Specific Functions\r
-//\r
-//\r
-// Byte packed structure for 16-bit Real Mode EFLAGS\r
-//\r
-typedef union {\r
-  struct {\r
-    UINT32  CF:1;           // Carry Flag\r
-    UINT32  Reserved_0:1;   // Reserved\r
-    UINT32  PF:1;           // Parity Flag\r
-    UINT32  Reserved_1:1;   // Reserved\r
-    UINT32  AF:1;           // Auxiliary Carry Flag\r
-    UINT32  Reserved_2:1;   // Reserved\r
-    UINT32  ZF:1;           // Zero Flag\r
-    UINT32  SF:1;           // Sign Flag\r
-    UINT32  TF:1;           // Trap Flag\r
-    UINT32  IF:1;           // Interrupt Enable Flag\r
-    UINT32  DF:1;           // Direction Flag\r
-    UINT32  OF:1;           // Overflow Flag\r
-    UINT32  IOPL:2;         // I/O Privilege Level\r
-    UINT32  NT:1;           // Nested Task\r
-    UINT32  Reserved_3:1;   // Reserved\r
-  } Bits;\r
-  UINT16    Uint16;\r
-} IA32_FLAGS16;\r
-\r
-//\r
-// Byte packed structure for EFLAGS/RFLAGS\r
-// 32-bits on IA-32\r
-// 64-bits on X64.  The upper 32-bits on X64 are reserved\r
-//\r
-typedef union {\r
-  struct {\r
-    UINT32  CF:1;           // Carry Flag\r
-    UINT32  Reserved_0:1;   // Reserved\r
-    UINT32  PF:1;           // Parity Flag\r
-    UINT32  Reserved_1:1;   // Reserved\r
-    UINT32  AF:1;           // Auxiliary Carry Flag\r
-    UINT32  Reserved_2:1;   // Reserved\r
-    UINT32  ZF:1;           // Zero Flag\r
-    UINT32  SF:1;           // Sign Flag\r
-    UINT32  TF:1;           // Trap Flag\r
-    UINT32  IF:1;           // Interrupt Enable Flag\r
-    UINT32  DF:1;           // Direction Flag\r
-    UINT32  OF:1;           // Overflow Flag\r
-    UINT32  IOPL:2;         // I/O Privilege Level\r
-    UINT32  NT:1;           // Nested Task\r
-    UINT32  Reserved_3:1;   // Reserved\r
-    UINT32  RF:1;           // Resume Flag\r
-    UINT32  VM:1;           // Virtual 8086 Mode\r
-    UINT32  AC:1;           // Alignment Check\r
-    UINT32  VIF:1;          // Virtual Interrupt Flag\r
-    UINT32  VIP:1;          // Virtual Interrupt Pending\r
-    UINT32  ID:1;           // ID Flag\r
-    UINT32  Reserved_4:10;  // Reserved\r
-  } Bits;\r
-  UINTN     UintN;\r
-} IA32_EFLAGS32;\r
-\r
-//\r
-// Byte packed structure for Control Register 0 (CR0)\r
-// 32-bits on IA-32\r
-// 64-bits on X64.  The upper 32-bits on X64 are reserved\r
-//\r
-typedef union {\r
-  struct {\r
-    UINT32  PE:1;           // Protection Enable\r
-    UINT32  MP:1;           // Monitor Coprocessor\r
-    UINT32  EM:1;           // Emulation\r
-    UINT32  TS:1;           // Task Switched\r
-    UINT32  ET:1;           // Extension Type\r
-    UINT32  NE:1;           // Numeric Error\r
-    UINT32  Reserved_0:10;  // Reserved\r
-    UINT32  WP:1;           // Write Protect\r
-    UINT32  Reserved_1:1;   // Reserved\r
-    UINT32  AM:1;           // Alignment Mask\r
-    UINT32  Reserved_2:10;  // Reserved\r
-    UINT32  NW:1;           // Mot Write-through\r
-    UINT32  CD:1;           // Cache Disable\r
-    UINT32  PG:1;           // Paging\r
-  } Bits;\r
-  UINTN     UintN;\r
-} IA32_CR0;\r
-\r
-//\r
-// Byte packed structure for Control Register 4 (CR4)\r
-// 32-bits on IA-32\r
-// 64-bits on X64.  The upper 32-bits on X64 are reserved\r
-//\r
-typedef union {\r
-  struct {\r
-    UINT32  VME:1;          // Virtual-8086 Mode Extensions\r
-    UINT32  PVI:1;          // Protected-Mode Virtual Interrupts\r
-    UINT32  TSD:1;          // Time Stamp Disable\r
-    UINT32  DE:1;           // Debugging Extensions\r
-    UINT32  PSE:1;          // Page Size Extensions\r
-    UINT32  PAE:1;          // Physical Address Extension\r
-    UINT32  MCE:1;          // Machine Check Enable\r
-    UINT32  PGE:1;          // Page Global Enable\r
-    UINT32  PCE:1;          // Performance Monitoring Counter\r
-                            // Enable\r
-    UINT32  OSFXSR:1;       // Operating System Support for\r
-                            // FXSAVE and FXRSTOR instructions\r
-    UINT32  OSXMMEXCPT:1;   // Operating System Support for\r
-                            // Unmasked SIMD Floating Point\r
-                            // Exceptions\r
-    UINT32  Reserved_0:2;   // Reserved\r
-    UINT32  VMXE:1;         // VMX Enable\r
-    UINT32  Reserved_1:18;  // Reseved\r
-  } Bits;\r
-  UINTN     UintN;\r
-} IA32_CR4;\r
-\r
-//\r
-// Byte packed structure for an IDTR, GDTR, LDTR descriptor\r
-/// @bug  How to make this structure byte-packed in a compiler independent way?\r
-//\r
-#pragma pack (1)\r
-typedef struct {\r
-  UINT16  Limit;\r
-  UINTN   Base;\r
-} IA32_DESCRIPTOR;\r
-#pragma pack ()\r
-\r
-#define IA32_IDT_GATE_TYPE_TASK          0x85\r
-#define IA32_IDT_GATE_TYPE_INTERRUPT_16  0x86\r
-#define IA32_IDT_GATE_TYPE_TRAP_16       0x87\r
-#define IA32_IDT_GATE_TYPE_INTERRUPT_32  0x8E\r
-#define IA32_IDT_GATE_TYPE_TRAP_32       0x8F\r
-\r
-//\r
-// Byte packed structure for an Interrupt Gate Descriptor\r
-//\r
-typedef union {\r
-  struct {\r
-    UINT32  OffsetLow:16;   // Offset bits 15..0\r
-    UINT32  Selector:16;    // Selector\r
-    UINT32  Reserved_0:8;   // Reserved\r
-    UINT32  GateType:8;     // Gate Type.  See #defines above\r
-    UINT32  OffsetHigh:16;  // Offset bits 31..16\r
-  } Bits;\r
-  UINT64  Uint64;\r
-} IA32_IDT_GATE_DESCRIPTOR;\r
-\r
-//\r
-// Byte packed structure for an FP/SSE/SSE2 context\r
-//\r
-typedef struct {\r
-  UINT8  Buffer[512];\r
-} IA32_FX_BUFFER;\r
-\r
-//\r
-// Structures for the 16-bit real mode thunks\r
-//\r
-typedef struct {\r
-  UINT32                            Reserved1;\r
-  UINT32                            Reserved2;\r
-  UINT32                            Reserved3;\r
-  UINT32                            Reserved4;\r
-  UINT8                             BL;\r
-  UINT8                             BH;\r
-  UINT16                            Reserved5;\r
-  UINT8                             DL;\r
-  UINT8                             DH;\r
-  UINT16                            Reserved6;\r
-  UINT8                             CL;\r
-  UINT8                             CH;\r
-  UINT16                            Reserved7;\r
-  UINT8                             AL;\r
-  UINT8                             AH;\r
-  UINT16                            Reserved8;\r
-} IA32_BYTE_REGS;\r
-\r
-typedef struct {\r
-  UINT16                            DI;\r
-  UINT16                            Reserved1;\r
-  UINT16                            SI;\r
-  UINT16                            Reserved2;\r
-  UINT16                            BP;\r
-  UINT16                            Reserved3;\r
-  UINT16                            SP;\r
-  UINT16                            Reserved4;\r
-  UINT16                            BX;\r
-  UINT16                            Reserved5;\r
-  UINT16                            DX;\r
-  UINT16                            Reserved6;\r
-  UINT16                            CX;\r
-  UINT16                            Reserved7;\r
-  UINT16                            AX;\r
-  UINT16                            Reserved8;\r
-} IA32_WORD_REGS;\r
-\r
-typedef struct {\r
-  UINT32                            EDI;\r
-  UINT32                            ESI;\r
-  UINT32                            EBP;\r
-  UINT32                            ESP;\r
-  UINT32                            EBX;\r
-  UINT32                            EDX;\r
-  UINT32                            ECX;\r
-  UINT32                            EAX;\r
-  UINT16                            DS;\r
-  UINT16                            ES;\r
-  UINT16                            FS;\r
-  UINT16                            GS;\r
-  IA32_EFLAGS32                     EFLAGS;\r
-  UINT32                            Eip;\r
-  UINT16                            CS;\r
-  UINT16                            SS;\r
-} IA32_DWORD_REGS;\r
-\r
-typedef union {\r
-  IA32_DWORD_REGS                   E;\r
-  IA32_WORD_REGS                    X;\r
-  IA32_BYTE_REGS                    H;\r
-} IA32_REGISTER_SET;\r
-\r
-//\r
-// Byte packed structure for an 16-bit real mode thunks\r
-//\r
-typedef struct {\r
-  IA32_REGISTER_SET                 *RealModeState;\r
-  VOID                              *RealModeBuffer;\r
-  UINT32                            RealModeBufferSize;\r
-  UINT32                            ThunkAttributes;\r
-} THUNK_CONTEXT;\r
-\r
-#define THUNK_ATTRIBUTE_BIG_REAL_MODE             0x00000001\r
-#define THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15   0x00000002\r
-#define THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL 0x00000004\r
-\r
-/**\r
-  Retrieves CPUID information.\r
-\r
-  Executes the CPUID instruction with EAX set to the value specified by Index.\r
-  This function always returns Index.\r
-  If Eax is not NULL, then the value of EAX after CPUID is returned in Eax.\r
-  If Ebx is not NULL, then the value of EBX after CPUID is returned in Ebx.\r
-  If Ecx is not NULL, then the value of ECX after CPUID is returned in Ecx.\r
-  If Edx is not NULL, then the value of EDX after CPUID is returned in Edx.\r
-  This function is only available on IA-32 and X64.\r
-\r
-  @param  Index The 32-bit value to load into EAX prior to invoking the CPUID\r
-                instruction.\r
-  @param  Eax   Pointer to the 32-bit EAX value returned by the CPUID\r
-                instruction. This is an optional parameter that may be NULL.\r
-  @param  Ebx   Pointer to the 32-bit EBX value returned by the CPUID\r
-                instruction. This is an optional parameter that may be NULL.\r
-  @param  Ecx   Pointer to the 32-bit ECX value returned by the CPUID\r
-                instruction. This is an optional parameter that may be NULL.\r
-  @param  Edx   Pointer to the 32-bit EDX value returned by the CPUID\r
-                instruction. This is an optional parameter that may be NULL.\r
-\r
-  @return Index\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-AsmCpuid (\r
-  IN      UINT32                    Index,\r
-  OUT     UINT32                    *Eax,  OPTIONAL\r
-  OUT     UINT32                    *Ebx,  OPTIONAL\r
-  OUT     UINT32                    *Ecx,  OPTIONAL\r
-  OUT     UINT32                    *Edx   OPTIONAL\r
-  );\r
-\r
-/**\r
-  Retrieves CPUID information using an extended leaf identifier.\r
-\r
-  Executes the CPUID instruction with EAX set to the value specified by Index\r
-  and ECX set to the value specified by SubIndex. This function always returns\r
-  Index. This function is only available on IA-32 and x64.\r
-\r
-  If Eax is not NULL, then the value of EAX after CPUID is returned in Eax.\r
-  If Ebx is not NULL, then the value of EBX after CPUID is returned in Ebx.\r
-  If Ecx is not NULL, then the value of ECX after CPUID is returned in Ecx.\r
-  If Edx is not NULL, then the value of EDX after CPUID is returned in Edx.\r
-\r
-  @param  Index     The 32-bit value to load into EAX prior to invoking the\r
-                    CPUID instruction.\r
-  @param  SubIndex  The 32-bit value to load into ECX prior to invoking the\r
-                    CPUID instruction.\r
-  @param  Eax       Pointer to the 32-bit EAX value returned by the CPUID\r
-                    instruction. This is an optional parameter that may be\r
-                    NULL.\r
-  @param  Ebx       Pointer to the 32-bit EBX value returned by the CPUID\r
-                    instruction. This is an optional parameter that may be\r
-                    NULL.\r
-  @param  Ecx       Pointer to the 32-bit ECX value returned by the CPUID\r
-                    instruction. This is an optional parameter that may be\r
-                    NULL.\r
-  @param  Edx       Pointer to the 32-bit EDX value returned by the CPUID\r
-                    instruction. This is an optional parameter that may be\r
-                    NULL.\r
-\r
-  @return Index\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-AsmCpuidEx (\r
-  IN      UINT32                    Index,\r
-  IN      UINT32                    SubIndex,\r
-  OUT     UINT32                    *Eax,  OPTIONAL\r
-  OUT     UINT32                    *Ebx,  OPTIONAL\r
-  OUT     UINT32                    *Ecx,  OPTIONAL\r
-  OUT     UINT32                    *Edx   OPTIONAL\r
-  );\r
-\r
-/**\r
-  Returns the lower 32-bits of a Machine Specific Register(MSR).\r
-\r
-  Reads and returns the lower 32-bits of the MSR specified by Index.\r
-  No parameter checking is performed on Index, and some Index values may cause\r
-  CPU exceptions. The caller must either guarantee that Index is valid, or the\r
-  caller must set up exception handlers to catch the exceptions. This function\r
-  is only available on IA-32 and X64.\r
-\r
-  @param  Index The 32-bit MSR index to read.\r
-\r
-  @return The lower 32 bits of the MSR identified by Index.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-AsmReadMsr32 (\r
-  IN      UINT32                    Index\r
-  );\r
-\r
-/**\r
-  Zero-extend a 32-bit value and writes it to a Machine Specific Register(MSR).\r
-\r
-  Writes the 32-bit value specified by Value to the MSR specified by Index. The\r
-  upper 32-bits of the MSR write are set to zero. The 32-bit value written to\r
-  the MSR is returned. No parameter checking is performed on Index or Value,\r
-  and some of these may cause CPU exceptions. The caller must either guarantee\r
-  that Index and Value are valid, or the caller must establish proper exception\r
-  handlers. This function is only available on IA-32 and X64.\r
-\r
-  @param  Index The 32-bit MSR index to write.\r
-  @param  Value The 32-bit value to write to the MSR.\r
-\r
-  @return Value\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-AsmWriteMsr32 (\r
-  IN      UINT32                    Index,\r
-  IN      UINT32                    Value\r
-  );\r
-\r
-/**\r
-  Reads a 64-bit MSR, performs a bitwise inclusive OR on the lower 32-bits, and\r
-  writes the result back to the 64-bit MSR.\r
-\r
-  Reads the 64-bit MSR specified by Index, performs a bitwise inclusive OR\r
-  between the lower 32-bits of the read result and the value specified by\r
-  OrData, and writes the result to the 64-bit MSR specified by Index. The lower\r
-  32-bits of the value written to the MSR is returned. No parameter checking is\r
-  performed on Index or OrData, and some of these may cause CPU exceptions. The\r
-  caller must either guarantee that Index and OrData are valid, or the caller\r
-  must establish proper exception handlers. This function is only available on\r
-  IA-32 and X64.\r
-\r
-  @param  Index   The 32-bit MSR index to write.\r
-  @param  OrData  The value to OR with the read value from the MSR.\r
-\r
-  @return The lower 32-bit value written to the MSR.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-AsmMsrOr32 (\r
-  IN      UINT32                    Index,\r
-  IN      UINT32                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a 64-bit MSR, performs a bitwise AND on the lower 32-bits, and writes\r
-  the result back to the 64-bit MSR.\r
-\r
-  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the\r
-  lower 32-bits of the read result and the value specified by AndData, and\r
-  writes the result to the 64-bit MSR specified by Index. The lower 32-bits of\r
-  the value written to the MSR is returned. No parameter checking is performed\r
-  on Index or AndData, and some of these may cause CPU exceptions. The caller\r
-  must either guarantee that Index and AndData are valid, or the caller must\r
-  establish proper exception handlers. This function is only available on IA-32\r
-  and X64.\r
-\r
-  @param  Index   The 32-bit MSR index to write.\r
-  @param  AndData The value to AND with the read value from the MSR.\r
-\r
-  @return The lower 32-bit value written to the MSR.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-AsmMsrAnd32 (\r
-  IN      UINT32                    Index,\r
-  IN      UINT32                    AndData\r
-  );\r
-\r
-/**\r
-  Reads a 64-bit MSR, performs a bitwise AND followed by a bitwise inclusive OR\r
-  on the lower 32-bits, and writes the result back to the 64-bit MSR.\r
-\r
-  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the\r
-  lower 32-bits of the read result and the value specified by AndData\r
-  preserving the upper 32-bits, performs a bitwise inclusive OR between the\r
-  result of the AND operation and the value specified by OrData, and writes the\r
-  result to the 64-bit MSR specified by Address. The lower 32-bits of the value\r
-  written to the MSR is returned. No parameter checking is performed on Index,\r
-  AndData, or OrData, and some of these may cause CPU exceptions. The caller\r
-  must either guarantee that Index, AndData, and OrData are valid, or the\r
-  caller must establish proper exception handlers. This function is only\r
-  available on IA-32 and X64.\r
-\r
-  @param  Index   The 32-bit MSR index to write.\r
-  @param  AndData The value to AND with the read value from the MSR.\r
-  @param  OrData  The value to OR with the result of the AND operation.\r
-\r
-  @return The lower 32-bit value written to the MSR.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-AsmMsrAndThenOr32 (\r
-  IN      UINT32                    Index,\r
-  IN      UINT32                    AndData,\r
-  IN      UINT32                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field of an MSR.\r
-\r
-  Reads the bit field in the lower 32-bits of a 64-bit MSR. The bit field is\r
-  specified by the StartBit and the EndBit. The value of the bit field is\r
-  returned. The caller must either guarantee that Index is valid, or the caller\r
-  must set up exception handlers to catch the exceptions. This function is only\r
-  available on IA-32 and X64.\r
-\r
-  If StartBit is greater than 31, then ASSERT().\r
-  If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Index     The 32-bit MSR index to read.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-\r
-  @return The bit field read from the MSR.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-AsmMsrBitFieldRead32 (\r
-  IN      UINT32                    Index,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  );\r
-\r
-/**\r
-  Writes a bit field to an MSR.\r
-\r
-  Writes Value to a bit field in the lower 32-bits of a  64-bit MSR. The bit\r
-  field is specified by the StartBit and the EndBit. All other bits in the\r
-  destination MSR are preserved. The lower 32-bits of the MSR written is\r
-  returned. Extra left bits in Value are stripped. The caller must either\r
-  guarantee that Index and the data written is valid, or the caller must set up\r
-  exception handlers to catch the exceptions. This function is only available\r
-  on IA-32 and X64.\r
-\r
-  If StartBit is greater than 31, then ASSERT().\r
-  If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Index     The 32-bit MSR index to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  Value     New value of the bit field.\r
-\r
-  @return The lower 32-bit of the value written to the MSR.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-AsmMsrBitFieldWrite32 (\r
-  IN      UINT32                    Index,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    Value\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 64-bit MSR, performs a bitwise OR, and writes the\r
-  result back to the bit field in the 64-bit MSR.\r
-\r
-  Reads the 64-bit MSR specified by Index, performs a bitwise inclusive OR\r
-  between the read result and the value specified by OrData, and writes the\r
-  result to the 64-bit MSR specified by Index. The lower 32-bits of the value\r
-  written to the MSR are returned. Extra left bits in OrData are stripped. The\r
-  caller must either guarantee that Index and the data written is valid, or\r
-  the caller must set up exception handlers to catch the exceptions. This\r
-  function is only available on IA-32 and X64.\r
-\r
-  If StartBit is greater than 31, then ASSERT().\r
-  If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Index     The 32-bit MSR index to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  OrData    The value to OR with the read value from the MSR.\r
-\r
-  @return The lower 32-bit of the value written to the MSR.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-AsmMsrBitFieldOr32 (\r
-  IN      UINT32                    Index,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 64-bit MSR, performs a bitwise AND, and writes the\r
-  result back to the bit field in the 64-bit MSR.\r
-\r
-  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the\r
-  read result and the value specified by AndData, and writes the result to the\r
-  64-bit MSR specified by Index. The lower 32-bits of the value written to the\r
-  MSR are returned. Extra left bits in AndData are stripped. The caller must\r
-  either guarantee that Index and the data written is valid, or the caller must\r
-  set up exception handlers to catch the exceptions. This function is only\r
-  available on IA-32 and X64.\r
-\r
-  If StartBit is greater than 31, then ASSERT().\r
-  If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Index     The 32-bit MSR index to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  AndData   The value to AND with the read value from the MSR.\r
-\r
-  @return The lower 32-bit of the value written to the MSR.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-AsmMsrBitFieldAnd32 (\r
-  IN      UINT32                    Index,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    AndData\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a\r
-  bitwise inclusive OR, and writes the result back to the bit field in the\r
-  64-bit MSR.\r
-\r
-  Reads the 64-bit MSR specified by Index, performs a bitwise AND followed by a\r
-  bitwise inclusive OR between the read result and the value specified by\r
-  AndData, and writes the result to the 64-bit MSR specified by Index. The\r
-  lower 32-bits of the value written to the MSR are returned. Extra left bits\r
-  in both AndData and OrData are stripped. The caller must either guarantee\r
-  that Index and the data written is valid, or the caller must set up exception\r
-  handlers to catch the exceptions. This function is only available on IA-32\r
-  and X64.\r
-\r
-  If StartBit is greater than 31, then ASSERT().\r
-  If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Index     The 32-bit MSR index to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  AndData   The value to AND with the read value from the MSR.\r
-  @param  OrData    The value to OR with the result of the AND operation.\r
-\r
-  @return The lower 32-bit of the value written to the MSR.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-AsmMsrBitFieldAndThenOr32 (\r
-  IN      UINT32                    Index,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    AndData,\r
-  IN      UINT32                    OrData\r
-  );\r
-\r
-/**\r
-  Returns a 64-bit Machine Specific Register(MSR).\r
-\r
-  Reads and returns the 64-bit MSR specified by Index. No parameter checking is\r
-  performed on Index, and some Index values may cause CPU exceptions. The\r
-  caller must either guarantee that Index is valid, or the caller must set up\r
-  exception handlers to catch the exceptions. This function is only available\r
-  on IA-32 and X64.\r
-\r
-  @param  Index The 32-bit MSR index to read.\r
-\r
-  @return The value of the MSR identified by Index.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsmReadMsr64 (\r
-  IN      UINT32                    Index\r
-  );\r
-\r
-/**\r
-  Writes a 64-bit value to a Machine Specific Register(MSR), and returns the\r
-  value.\r
-\r
-  Writes the 64-bit value specified by Value to the MSR specified by Index. The\r
-  64-bit value written to the MSR is returned. No parameter checking is\r
-  performed on Index or Value, and some of these may cause CPU exceptions. The\r
-  caller must either guarantee that Index and Value are valid, or the caller\r
-  must establish proper exception handlers. This function is only available on\r
-  IA-32 and X64.\r
-\r
-  @param  Index The 32-bit MSR index to write.\r
-  @param  Value The 64-bit value to write to the MSR.\r
-\r
-  @return Value\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsmWriteMsr64 (\r
-  IN      UINT32                    Index,\r
-  IN      UINT64                    Value\r
-  );\r
-\r
-/**\r
-  Reads a 64-bit MSR, performs a bitwise inclusive OR, and writes the result\r
-  back to the 64-bit MSR.\r
-\r
-  Reads the 64-bit MSR specified by Index, performs a bitwise inclusive OR\r
-  between the read result and the value specified by OrData, and writes the\r
-  result to the 64-bit MSR specified by Index. The value written to the MSR is\r
-  returned. No parameter checking is performed on Index or OrData, and some of\r
-  these may cause CPU exceptions. The caller must either guarantee that Index\r
-  and OrData are valid, or the caller must establish proper exception handlers.\r
-  This function is only available on IA-32 and X64.\r
-\r
-  @param  Index   The 32-bit MSR index to write.\r
-  @param  OrData  The value to OR with the read value from the MSR.\r
-\r
-  @return The value written back to the MSR.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsmMsrOr64 (\r
-  IN      UINT32                    Index,\r
-  IN      UINT64                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a 64-bit MSR, performs a bitwise AND, and writes the result back to the\r
-  64-bit MSR.\r
-\r
-  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the\r
-  read result and the value specified by OrData, and writes the result to the\r
-  64-bit MSR specified by Index. The value written to the MSR is returned. No\r
-  parameter checking is performed on Index or OrData, and some of these may\r
-  cause CPU exceptions. The caller must either guarantee that Index and OrData\r
-  are valid, or the caller must establish proper exception handlers. This\r
-  function is only available on IA-32 and X64.\r
-\r
-  @param  Index   The 32-bit MSR index to write.\r
-  @param  AndData The value to AND with the read value from the MSR.\r
-\r
-  @return The value written back to the MSR.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsmMsrAnd64 (\r
-  IN      UINT32                    Index,\r
-  IN      UINT64                    AndData\r
-  );\r
-\r
-/**\r
-  Reads a 64-bit MSR, performs a bitwise AND followed by a bitwise inclusive\r
-  OR, and writes the result back to the 64-bit MSR.\r
-\r
-  Reads the 64-bit MSR specified by Index, performs a bitwise AND between read\r
-  result and the value specified by AndData, performs a bitwise inclusive OR\r
-  between the result of the AND operation and the value specified by OrData,\r
-  and writes the result to the 64-bit MSR specified by Index. The value written\r
-  to the MSR is returned. No parameter checking is performed on Index, AndData,\r
-  or OrData, and some of these may cause CPU exceptions. The caller must either\r
-  guarantee that Index, AndData, and OrData are valid, or the caller must\r
-  establish proper exception handlers. This function is only available on IA-32\r
-  and X64.\r
-\r
-  @param  Index   The 32-bit MSR index to write.\r
-  @param  AndData The value to AND with the read value from the MSR.\r
-  @param  OrData  The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the MSR.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsmMsrAndThenOr64 (\r
-  IN      UINT32                    Index,\r
-  IN      UINT64                    AndData,\r
-  IN      UINT64                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field of an MSR.\r
-\r
-  Reads the bit field in the 64-bit MSR. The bit field is specified by the\r
-  StartBit and the EndBit. The value of the bit field is returned. The caller\r
-  must either guarantee that Index is valid, or the caller must set up\r
-  exception handlers to catch the exceptions. This function is only available\r
-  on IA-32 and X64.\r
-\r
-  If StartBit is greater than 63, then ASSERT().\r
-  If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Index     The 32-bit MSR index to read.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-\r
-  @return The value read from the MSR.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsmMsrBitFieldRead64 (\r
-  IN      UINT32                    Index,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  );\r
-\r
-/**\r
-  Writes a bit field to an MSR.\r
-\r
-  Writes Value to a bit field in a 64-bit MSR. The bit field is specified by\r
-  the StartBit and the EndBit. All other bits in the destination MSR are\r
-  preserved. The MSR written is returned. Extra left bits in Value are\r
-  stripped. The caller must either guarantee that Index and the data written is\r
-  valid, or the caller must set up exception handlers to catch the exceptions.\r
-  This function is only available on IA-32 and X64.\r
-\r
-  If StartBit is greater than 63, then ASSERT().\r
-  If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Index     The 32-bit MSR index to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  Value     New value of the bit field.\r
-\r
-  @return The value written back to the MSR.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsmMsrBitFieldWrite64 (\r
-  IN      UINT32                    Index,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    Value\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 64-bit MSR, performs a bitwise inclusive OR, and\r
-  writes the result back to the bit field in the 64-bit MSR.\r
-\r
-  Reads the 64-bit MSR specified by Index, performs a bitwise inclusive OR\r
-  between the read result and the value specified by OrData, and writes the\r
-  result to the 64-bit MSR specified by Index. The value written to the MSR is\r
-  returned. Extra left bits in OrData are stripped. The caller must either\r
-  guarantee that Index and the data written is valid, or the caller must set up\r
-  exception handlers to catch the exceptions. This function is only available\r
-  on IA-32 and X64.\r
-\r
-  If StartBit is greater than 63, then ASSERT().\r
-  If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Index     The 32-bit MSR index to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  OrData    The value to OR with the read value from the bit field.\r
-\r
-  @return The value written back to the MSR.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsmMsrBitFieldOr64 (\r
-  IN      UINT32                    Index,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 64-bit MSR, performs a bitwise AND, and writes the\r
-  result back to the bit field in the 64-bit MSR.\r
-\r
-  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the\r
-  read result and the value specified by AndData, and writes the result to the\r
-  64-bit MSR specified by Index. The value written to the MSR is returned.\r
-  Extra left bits in AndData are stripped. The caller must either guarantee\r
-  that Index and the data written is valid, or the caller must set up exception\r
-  handlers to catch the exceptions. This function is only available on IA-32\r
-  and X64.\r
-\r
-  If StartBit is greater than 63, then ASSERT().\r
-  If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Index     The 32-bit MSR index to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  AndData   The value to AND with the read value from the bit field.\r
-\r
-  @return The value written back to the MSR.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsmMsrBitFieldAnd64 (\r
-  IN      UINT32                    Index,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    AndData\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a\r
-  bitwise inclusive OR, and writes the result back to the bit field in the\r
-  64-bit MSR.\r
-\r
-  Reads the 64-bit MSR specified by Index, performs a bitwise AND followed by\r
-  a bitwise inclusive OR between the read result and the value specified by\r
-  AndData, and writes the result to the 64-bit MSR specified by Index. The\r
-  value written to the MSR is returned. Extra left bits in both AndData and\r
-  OrData are stripped. The caller must either guarantee that Index and the data\r
-  written is valid, or the caller must set up exception handlers to catch the\r
-  exceptions. This function is only available on IA-32 and X64.\r
-\r
-  If StartBit is greater than 63, then ASSERT().\r
-  If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Index     The 32-bit MSR index to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  AndData   The value to AND with the read value from the bit field.\r
-  @param  OrData    The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the MSR.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsmMsrBitFieldAndThenOr64 (\r
-  IN      UINT32                    Index,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    AndData,\r
-  IN      UINT64                    OrData\r
-  );\r
-\r
-/**\r
-  Reads the current value of the EFLAGS register.\r
-\r
-  Reads and returns the current value of the EFLAGS register. This function is\r
-  only available on IA-32 and X64. This returns a 32-bit value on IA-32 and a\r
-  64-bit value on X64.\r
-\r
-  @return EFLAGS on IA-32 or RFLAGS on X64.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmReadEflags (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of the Control Register 0 (CR0).\r
-\r
-  Reads and returns the current value of CR0. This function is only available\r
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
-  X64.\r
-\r
-  @return The value of the Control Register 0 (CR0).\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmReadCr0 (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of the Control Register 2 (CR2).\r
-\r
-  Reads and returns the current value of CR2. This function is only available\r
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
-  X64.\r
-\r
-  @return The value of the Control Register 2 (CR2).\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmReadCr2 (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of the Control Register 3 (CR3).\r
-\r
-  Reads and returns the current value of CR3. This function is only available\r
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
-  X64.\r
-\r
-  @return The value of the Control Register 3 (CR3).\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmReadCr3 (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of the Control Register 4 (CR4).\r
-\r
-  Reads and returns the current value of CR4. This function is only available\r
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
-  X64.\r
-\r
-  @return The value of the Control Register 4 (CR4).\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmReadCr4 (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Writes a value to Control Register 0 (CR0).\r
-\r
-  Writes and returns a new value to CR0. This function is only available on\r
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.\r
-\r
-  @param  Cr0 The value to write to CR0.\r
-\r
-  @return The value written to CR0.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmWriteCr0 (\r
-  UINTN  Cr0\r
-  );\r
-\r
-/**\r
-  Writes a value to Control Register 2 (CR2).\r
-\r
-  Writes and returns a new value to CR2. This function is only available on\r
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.\r
-\r
-  @param  Cr2 The value to write to CR2.\r
-\r
-  @return The value written to CR2.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmWriteCr2 (\r
-  UINTN  Cr2\r
-  );\r
-\r
-/**\r
-  Writes a value to Control Register 3 (CR3).\r
-\r
-  Writes and returns a new value to CR3. This function is only available on\r
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.\r
-\r
-  @param  Cr3 The value to write to CR3.\r
-\r
-  @return The value written to CR3.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmWriteCr3 (\r
-  UINTN  Cr3\r
-  );\r
-\r
-/**\r
-  Writes a value to Control Register 4 (CR4).\r
-\r
-  Writes and returns a new value to CR4. This function is only available on\r
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.\r
-\r
-  @param  Cr4 The value to write to CR4.\r
-\r
-  @return The value written to CR4.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmWriteCr4 (\r
-  UINTN  Cr4\r
-  );\r
-\r
-/**\r
-  Reads the current value of Debug Register 0 (DR0).\r
-\r
-  Reads and returns the current value of DR0. This function is only available\r
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
-  X64.\r
-\r
-  @return The value of Debug Register 0 (DR0).\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmReadDr0 (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of Debug Register 1 (DR1).\r
-\r
-  Reads and returns the current value of DR1. This function is only available\r
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
-  X64.\r
-\r
-  @return The value of Debug Register 1 (DR1).\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmReadDr1 (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of Debug Register 2 (DR2).\r
-\r
-  Reads and returns the current value of DR2. This function is only available\r
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
-  X64.\r
-\r
-  @return The value of Debug Register 2 (DR2).\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmReadDr2 (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of Debug Register 3 (DR3).\r
-\r
-  Reads and returns the current value of DR3. This function is only available\r
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
-  X64.\r
-\r
-  @return The value of Debug Register 3 (DR3).\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmReadDr3 (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of Debug Register 4 (DR4).\r
-\r
-  Reads and returns the current value of DR4. This function is only available\r
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
-  X64.\r
-\r
-  @return The value of Debug Register 4 (DR4).\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmReadDr4 (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of Debug Register 5 (DR5).\r
-\r
-  Reads and returns the current value of DR5. This function is only available\r
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
-  X64.\r
-\r
-  @return The value of Debug Register 5 (DR5).\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmReadDr5 (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of Debug Register 6 (DR6).\r
-\r
-  Reads and returns the current value of DR6. This function is only available\r
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
-  X64.\r
-\r
-  @return The value of Debug Register 6 (DR6).\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmReadDr6 (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of Debug Register 7 (DR7).\r
-\r
-  Reads and returns the current value of DR7. This function is only available\r
-  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on\r
-  X64.\r
-\r
-  @return The value of Debug Register 7 (DR7).\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmReadDr7 (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Writes a value to Debug Register 0 (DR0).\r
-\r
-  Writes and returns a new value to DR0. This function is only available on\r
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.\r
-\r
-  @param  Dr0 The value to write to Dr0.\r
-\r
-  @return The value written to Debug Register 0 (DR0).\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmWriteDr0 (\r
-  UINTN  Dr0\r
-  );\r
-\r
-/**\r
-  Writes a value to Debug Register 1 (DR1).\r
-\r
-  Writes and returns a new value to DR1. This function is only available on\r
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.\r
-\r
-  @param  Dr1 The value to write to Dr1.\r
-\r
-  @return The value written to Debug Register 1 (DR1).\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmWriteDr1 (\r
-  UINTN  Dr1\r
-  );\r
-\r
-/**\r
-  Writes a value to Debug Register 2 (DR2).\r
-\r
-  Writes and returns a new value to DR2. This function is only available on\r
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.\r
-\r
-  @param  Dr2 The value to write to Dr2.\r
-\r
-  @return The value written to Debug Register 2 (DR2).\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmWriteDr2 (\r
-  UINTN  Dr2\r
-  );\r
-\r
-/**\r
-  Writes a value to Debug Register 3 (DR3).\r
-\r
-  Writes and returns a new value to DR3. This function is only available on\r
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.\r
-\r
-  @param  Dr3 The value to write to Dr3.\r
-\r
-  @return The value written to Debug Register 3 (DR3).\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmWriteDr3 (\r
-  UINTN  Dr3\r
-  );\r
-\r
-/**\r
-  Writes a value to Debug Register 4 (DR4).\r
-\r
-  Writes and returns a new value to DR4. This function is only available on\r
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.\r
-\r
-  @param  Dr4 The value to write to Dr4.\r
-\r
-  @return The value written to Debug Register 4 (DR4).\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmWriteDr4 (\r
-  UINTN  Dr4\r
-  );\r
-\r
-/**\r
-  Writes a value to Debug Register 5 (DR5).\r
-\r
-  Writes and returns a new value to DR5. This function is only available on\r
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.\r
-\r
-  @param  Dr5 The value to write to Dr5.\r
-\r
-  @return The value written to Debug Register 5 (DR5).\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmWriteDr5 (\r
-  UINTN  Dr5\r
-  );\r
-\r
-/**\r
-  Writes a value to Debug Register 6 (DR6).\r
-\r
-  Writes and returns a new value to DR6. This function is only available on\r
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.\r
-\r
-  @param  Dr6 The value to write to Dr6.\r
-\r
-  @return The value written to Debug Register 6 (DR6).\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmWriteDr6 (\r
-  UINTN  Dr6\r
-  );\r
-\r
-/**\r
-  Writes a value to Debug Register 7 (DR7).\r
-\r
-  Writes and returns a new value to DR7. This function is only available on\r
-  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.\r
-\r
-  @param  Dr7 The value to write to Dr7.\r
-\r
-  @return The value written to Debug Register 7 (DR7).\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmWriteDr7 (\r
-  UINTN  Dr7\r
-  );\r
-\r
-/**\r
-  Reads the current value of Code Segment Register (CS).\r
-\r
-  Reads and returns the current value of CS. This function is only available on\r
-  IA-32 and X64.\r
-\r
-  @return The current value of CS.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-AsmReadCs (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of Data Segment Register (DS).\r
-\r
-  Reads and returns the current value of DS. This function is only available on\r
-  IA-32 and X64.\r
-\r
-  @return The current value of DS.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-AsmReadDs (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of Extra Segment Register (ES).\r
-\r
-  Reads and returns the current value of ES. This function is only available on\r
-  IA-32 and X64.\r
-\r
-  @return The current value of ES.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-AsmReadEs (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of FS Data Segment Register (FS).\r
-\r
-  Reads and returns the current value of FS. This function is only available on\r
-  IA-32 and X64.\r
-\r
-  @return The current value of FS.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-AsmReadFs (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of GS Data Segment Register (GS).\r
-\r
-  Reads and returns the current value of GS. This function is only available on\r
-  IA-32 and X64.\r
-\r
-  @return The current value of GS.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-AsmReadGs (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of Stack Segment Register (SS).\r
-\r
-  Reads and returns the current value of SS. This function is only available on\r
-  IA-32 and X64.\r
-\r
-  @return The current value of SS.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-AsmReadSs (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of Task Register (TR).\r
-\r
-  Reads and returns the current value of TR. This function is only available on\r
-  IA-32 and X64.\r
-\r
-  @return The current value of TR.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-AsmReadTr (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current Global Descriptor Table Register(GDTR) descriptor.\r
-\r
-  Reads and returns the current GDTR descriptor and returns it in Gdtr. This\r
-  function is only available on IA-32 and X64.\r
-\r
-  If Gdtr is NULL, then ASSERT().\r
-\r
-  @param  Gdtr  Pointer to a GDTR descriptor.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmReadGdtr (\r
-  OUT     IA32_DESCRIPTOR           *Gdtr\r
-  );\r
-\r
-/**\r
-  Writes the current Global Descriptor Table Register (GDTR) descriptor.\r
-\r
-  Writes and the current GDTR descriptor specified by Gdtr. This function is\r
-  only available on IA-32 and X64.\r
-\r
-  If Gdtr is NULL, then ASSERT().\r
-\r
-  @param  Gdtr  Pointer to a GDTR descriptor.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmWriteGdtr (\r
-  IN      CONST IA32_DESCRIPTOR     *Gdtr\r
-  );\r
-\r
-/**\r
-  Reads the current Interrupt Descriptor Table Register(GDTR) descriptor.\r
-\r
-  Reads and returns the current IDTR descriptor and returns it in Idtr. This\r
-  function is only available on IA-32 and X64.\r
-\r
-  If Idtr is NULL, then ASSERT().\r
-\r
-  @param  Idtr  Pointer to a IDTR descriptor.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmReadIdtr (\r
-  OUT     IA32_DESCRIPTOR           *Idtr\r
-  );\r
-\r
-/**\r
-  Writes the current Interrupt Descriptor Table Register(GDTR) descriptor.\r
-\r
-  Writes the current IDTR descriptor and returns it in Idtr. This function is\r
-  only available on IA-32 and X64.\r
-\r
-  If Idtr is NULL, then ASSERT().\r
-\r
-  @param  Idtr  Pointer to a IDTR descriptor.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmWriteIdtr (\r
-  IN      CONST IA32_DESCRIPTOR     *Idtr\r
-  );\r
-\r
-/**\r
-  Reads the current Local Descriptor Table Register(LDTR) selector.\r
-\r
-  Reads and returns the current 16-bit LDTR descriptor value. This function is\r
-  only available on IA-32 and X64.\r
-\r
-  @return The current selector of LDT.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-AsmReadLdtr (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Writes the current Local Descriptor Table Register (GDTR) selector.\r
-\r
-  Writes and the current LDTR descriptor specified by Ldtr. This function is\r
-  only available on IA-32 and X64.\r
-\r
-  @param  Ldtr  16-bit LDTR selector value.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmWriteLdtr (\r
-  IN      UINT16                    Ldtr\r
-  );\r
-\r
-/**\r
-  Save the current floating point/SSE/SSE2 context to a buffer.\r
-\r
-  Saves the current floating point/SSE/SSE2 state to the buffer specified by\r
-  Buffer. Buffer must be aligned on a 16-byte boundary. This function is only\r
-  available on IA-32 and X64.\r
-\r
-  If Buffer is NULL, then ASSERT().\r
-  If Buffer is not aligned on a 16-byte boundary, then ASSERT().\r
-\r
-  @param  Buffer  Pointer to a buffer to save the floating point/SSE/SSE2 context.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmFxSave (\r
-  OUT     IA32_FX_BUFFER            *Buffer\r
-  );\r
-\r
-/**\r
-  Restores the current floating point/SSE/SSE2 context from a buffer.\r
-\r
-  Restores the current floating point/SSE/SSE2 state from the buffer specified\r
-  by Buffer. Buffer must be aligned on a 16-byte boundary. This function is\r
-  only available on IA-32 and X64.\r
-\r
-  If Buffer is NULL, then ASSERT().\r
-  If Buffer is not aligned on a 16-byte boundary, then ASSERT().\r
-  If Buffer was not saved with AsmFxSave(), then ASSERT().\r
-\r
-  @param  Buffer  Pointer to a buffer to save the floating point/SSE/SSE2 context.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmFxRestore (\r
-  IN      CONST IA32_FX_BUFFER      *Buffer\r
-  );\r
-\r
-/**\r
-  Reads the current value of 64-bit MMX Register #0 (MM0).\r
-\r
-  Reads and returns the current value of MM0. This function is only available\r
-  on IA-32 and X64.\r
-\r
-  @return The current value of MM0.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsmReadMm0 (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of 64-bit MMX Register #1 (MM1).\r
-\r
-  Reads and returns the current value of MM1. This function is only available\r
-  on IA-32 and X64.\r
-\r
-  @return The current value of MM1.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsmReadMm1 (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of 64-bit MMX Register #2 (MM2).\r
-\r
-  Reads and returns the current value of MM2. This function is only available\r
-  on IA-32 and X64.\r
-\r
-  @return The current value of MM2.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsmReadMm2 (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of 64-bit MMX Register #3 (MM3).\r
-\r
-  Reads and returns the current value of MM3. This function is only available\r
-  on IA-32 and X64.\r
-\r
-  @return The current value of MM3.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsmReadMm3 (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of 64-bit MMX Register #4 (MM4).\r
-\r
-  Reads and returns the current value of MM4. This function is only available\r
-  on IA-32 and X64.\r
-\r
-  @return The current value of MM4.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsmReadMm4 (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of 64-bit MMX Register #5 (MM5).\r
-\r
-  Reads and returns the current value of MM5. This function is only available\r
-  on IA-32 and X64.\r
-\r
-  @return The current value of MM5.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsmReadMm5 (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of 64-bit MMX Register #6 (MM6).\r
-\r
-  Reads and returns the current value of MM6. This function is only available\r
-  on IA-32 and X64.\r
-\r
-  @return The current value of MM6.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsmReadMm6 (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of 64-bit MMX Register #7 (MM7).\r
-\r
-  Reads and returns the current value of MM7. This function is only available\r
-  on IA-32 and X64.\r
-\r
-  @return The current value of MM7.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsmReadMm7 (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Writes the current value of 64-bit MMX Register #0 (MM0).\r
-\r
-  Writes the current value of MM0. This function is only available on IA32 and\r
-  X64.\r
-\r
-  @param  Value The 64-bit value to write to MM0.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmWriteMm0 (\r
-  IN      UINT64                    Value\r
-  );\r
-\r
-/**\r
-  Writes the current value of 64-bit MMX Register #1 (MM1).\r
-\r
-  Writes the current value of MM1. This function is only available on IA32 and\r
-  X64.\r
-\r
-  @param  Value The 64-bit value to write to MM1.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmWriteMm1 (\r
-  IN      UINT64                    Value\r
-  );\r
-\r
-/**\r
-  Writes the current value of 64-bit MMX Register #2 (MM2).\r
-\r
-  Writes the current value of MM2. This function is only available on IA32 and\r
-  X64.\r
-\r
-  @param  Value The 64-bit value to write to MM2.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmWriteMm2 (\r
-  IN      UINT64                    Value\r
-  );\r
-\r
-/**\r
-  Writes the current value of 64-bit MMX Register #3 (MM3).\r
-\r
-  Writes the current value of MM3. This function is only available on IA32 and\r
-  X64.\r
-\r
-  @param  Value The 64-bit value to write to MM3.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmWriteMm3 (\r
-  IN      UINT64                    Value\r
-  );\r
-\r
-/**\r
-  Writes the current value of 64-bit MMX Register #4 (MM4).\r
-\r
-  Writes the current value of MM4. This function is only available on IA32 and\r
-  X64.\r
-\r
-  @param  Value The 64-bit value to write to MM4.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmWriteMm4 (\r
-  IN      UINT64                    Value\r
-  );\r
-\r
-/**\r
-  Writes the current value of 64-bit MMX Register #5 (MM5).\r
-\r
-  Writes the current value of MM5. This function is only available on IA32 and\r
-  X64.\r
-\r
-  @param  Value The 64-bit value to write to MM5.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmWriteMm5 (\r
-  IN      UINT64                    Value\r
-  );\r
-\r
-/**\r
-  Writes the current value of 64-bit MMX Register #6 (MM6).\r
-\r
-  Writes the current value of MM6. This function is only available on IA32 and\r
-  X64.\r
-\r
-  @param  Value The 64-bit value to write to MM6.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmWriteMm6 (\r
-  IN      UINT64                    Value\r
-  );\r
-\r
-/**\r
-  Writes the current value of 64-bit MMX Register #7 (MM7).\r
-\r
-  Writes the current value of MM7. This function is only available on IA32 and\r
-  X64.\r
-\r
-  @param  Value The 64-bit value to write to MM7.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmWriteMm7 (\r
-  IN      UINT64                    Value\r
-  );\r
-\r
-/**\r
-  Reads the current value of Time Stamp Counter (TSC).\r
-\r
-  Reads and returns the current value of TSC. This function is only available\r
-  on IA-32 and X64.\r
-\r
-  @return The current value of TSC\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsmReadTsc (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Reads the current value of a Performance Counter (PMC).\r
-\r
-  Reads and returns the current value of performance counter specified by\r
-  Index. This function is only available on IA-32 and X64.\r
-\r
-  @param  Index The 32-bit Performance Counter index to read.\r
-\r
-  @return The value of the PMC specified by Index.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-AsmReadPmc (\r
-  IN      UINT32                    Index\r
-  );\r
-\r
-/**\r
-  Sets up a monitor buffer that is used by AsmMwait().\r
-\r
-  Executes a MONITOR instruction with the register state specified by Eax, Ecx\r
-  and Edx. Returns Eax. This function is only available on IA-32 and X64.\r
-\r
-  @param  Eax The value to load into EAX or RAX before executing the MONITOR\r
-              instruction.\r
-  @param  Ecx The value to load into ECX or RCX before executing the MONITOR\r
-              instruction.\r
-  @param  Edx The value to load into EDX or RDX before executing the MONITOR\r
-              instruction.\r
-\r
-  @return Eax\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmMonitor (\r
-  IN      UINTN                     Eax,\r
-  IN      UINTN                     Ecx,\r
-  IN      UINTN                     Edx\r
-  );\r
-\r
-/**\r
-  Executes an MWAIT instruction.\r
-\r
-  Executes an MWAIT instruction with the register state specified by Eax and\r
-  Ecx. Returns Eax. This function is only available on IA-32 and X64.\r
-\r
-  @param  Eax The value to load into EAX or RAX before executing the MONITOR\r
-              instruction.\r
-  @param  Ecx The value to load into ECX or RCX before executing the MONITOR\r
-              instruction.\r
-\r
-  @return Eax\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsmMwait (\r
-  IN      UINTN                     Eax,\r
-  IN      UINTN                     Ecx\r
-  );\r
-\r
-/**\r
-  Executes a WBINVD instruction.\r
-\r
-  Executes a WBINVD instruction. This function is only available on IA-32 and\r
-  X64.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmWbinvd (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Executes a INVD instruction.\r
-\r
-  Executes a INVD instruction. This function is only available on IA-32 and\r
-  X64.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmInvd (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Flushes a cache line from all the instruction and data caches within the\r
-  coherency domain of the CPU.\r
-\r
-  Flushed the cache line specified by LinearAddress, and returns LinearAddress.\r
-  This function is only available on IA-32 and X64.\r
-\r
-  @param  LinearAddress The address of the cache line to flush. If the CPU is\r
-                        in a physical addressing mode, then LinearAddress is a\r
-                        physical address. If the CPU is in a virtual\r
-                        addressing mode, then LinearAddress is a virtual\r
-                        address.\r
-\r
-  @return LinearAddress\r
-**/\r
-VOID *\r
-EFIAPI\r
-AsmFlushCacheLine (\r
-  IN      VOID                      *LinearAddress\r
-  );\r
-\r
-/**\r
-  Enables the 32-bit paging mode on the CPU.\r
-\r
-  Enables the 32-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables\r
-  must be properly initialized prior to calling this service. This function\r
-  assumes the current execution mode is 32-bit protected mode. This function is\r
-  only available on IA-32. After the 32-bit paging mode is enabled, control is\r
-  transferred to the function specified by EntryPoint using the new stack\r
-  specified by NewStack and passing in the parameters specified by Context1 and\r
-  Context2. Context1 and Context2 are optional and may be NULL. The function\r
-  EntryPoint must never return.\r
-\r
-  If the current execution mode is not 32-bit protected mode, then ASSERT().\r
-  If EntryPoint is NULL, then ASSERT().\r
-  If NewStack is NULL, then ASSERT().\r
-\r
-  There are a number of constraints that must be followed before calling this\r
-  function:\r
-  1)  Interrupts must be disabled.\r
-  2)  The caller must be in 32-bit protected mode with flat descriptors. This\r
-      means all descriptors must have a base of 0 and a limit of 4GB.\r
-  3)  CR0 and CR4 must be compatible with 32-bit protected mode with flat\r
-      descriptors.\r
-  4)  CR3 must point to valid page tables that will be used once the transition\r
-      is complete, and those page tables must guarantee that the pages for this\r
-      function and the stack are identity mapped.\r
-\r
-  @param  EntryPoint  A pointer to function to call with the new stack after\r
-                      paging is enabled.\r
-  @param  Context1    A pointer to the context to pass into the EntryPoint\r
-                      function as the first parameter after paging is enabled.\r
-  @param  Context2    A pointer to the context to pass into the EntryPoint\r
-                      function as the second parameter after paging is enabled.\r
-  @param  NewStack    A pointer to the new stack to use for the EntryPoint\r
-                      function after paging is enabled.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmEnablePaging32 (\r
-  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
-  IN      VOID                      *Context1,  OPTIONAL\r
-  IN      VOID                      *Context2,  OPTIONAL\r
-  IN      VOID                      *NewStack\r
-  );\r
-\r
-/**\r
-  Disables the 32-bit paging mode on the CPU.\r
-\r
-  Disables the 32-bit paging mode on the CPU and returns to 32-bit protected\r
-  mode. This function assumes the current execution mode is 32-paged protected\r
-  mode. This function is only available on IA-32. After the 32-bit paging mode\r
-  is disabled, control is transferred to the function specified by EntryPoint\r
-  using the new stack specified by NewStack and passing in the parameters\r
-  specified by Context1 and Context2. Context1 and Context2 are optional and\r
-  may be NULL. The function EntryPoint must never return.\r
-\r
-  If the current execution mode is not 32-bit paged mode, then ASSERT().\r
-  If EntryPoint is NULL, then ASSERT().\r
-  If NewStack is NULL, then ASSERT().\r
-\r
-  There are a number of constraints that must be followed before calling this\r
-  function:\r
-  1)  Interrupts must be disabled.\r
-  2)  The caller must be in 32-bit paged mode.\r
-  3)  CR0, CR3, and CR4 must be compatible with 32-bit paged mode.\r
-  4)  CR3 must point to valid page tables that guarantee that the pages for\r
-      this function and the stack are identity mapped.\r
-\r
-  @param  EntryPoint  A pointer to function to call with the new stack after\r
-                      paging is disabled.\r
-  @param  Context1    A pointer to the context to pass into the EntryPoint\r
-                      function as the first parameter after paging is disabled.\r
-  @param  Context2    A pointer to the context to pass into the EntryPoint\r
-                      function as the second parameter after paging is\r
-                      disabled.\r
-  @param  NewStack    A pointer to the new stack to use for the EntryPoint\r
-                      function after paging is disabled.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmDisablePaging32 (\r
-  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
-  IN      VOID                      *Context1,  OPTIONAL\r
-  IN      VOID                      *Context2,  OPTIONAL\r
-  IN      VOID                      *NewStack\r
-  );\r
-\r
-/**\r
-  Enables the 64-bit paging mode on the CPU.\r
-\r
-  Enables the 64-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables\r
-  must be properly initialized prior to calling this service. This function\r
-  assumes the current execution mode is 32-bit protected mode with flat\r
-  descriptors. This function is only available on IA-32. After the 64-bit\r
-  paging mode is enabled, control is transferred to the function specified by\r
-  EntryPoint using the new stack specified by NewStack and passing in the\r
-  parameters specified by Context1 and Context2. Context1 and Context2 are\r
-  optional and may be 0. The function EntryPoint must never return.\r
-\r
-  If the current execution mode is not 32-bit protected mode with flat\r
-  descriptors, then ASSERT().\r
-  If EntryPoint is 0, then ASSERT().\r
-  If NewStack is 0, then ASSERT().\r
-\r
-  @param  Cs          The 16-bit selector to load in the CS before EntryPoint\r
-                      is called. The descriptor in the GDT that this selector\r
-                      references must be setup for long mode.\r
-  @param  EntryPoint  The 64-bit virtual address of the function to call with\r
-                      the new stack after paging is enabled.\r
-  @param  Context1    The 64-bit virtual address of the context to pass into\r
-                      the EntryPoint function as the first parameter after\r
-                      paging is enabled.\r
-  @param  Context2    The 64-bit virtual address of the context to pass into\r
-                      the EntryPoint function as the second parameter after\r
-                      paging is enabled.\r
-  @param  NewStack    The 64-bit virtual address of the new stack to use for\r
-                      the EntryPoint function after paging is enabled.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmEnablePaging64 (\r
-  IN      UINT16                    CodeSelector,\r
-  IN      UINT64                    EntryPoint,\r
-  IN      UINT64                    Context1,  OPTIONAL\r
-  IN      UINT64                    Context2,  OPTIONAL\r
-  IN      UINT64                    NewStack\r
-  );\r
-\r
-/**\r
-  Disables the 64-bit paging mode on the CPU.\r
-\r
-  Disables the 64-bit paging mode on the CPU and returns to 32-bit protected\r
-  mode. This function assumes the current execution mode is 64-paging mode.\r
-  This function is only available on X64. After the 64-bit paging mode is\r
-  disabled, control is transferred to the function specified by EntryPoint\r
-  using the new stack specified by NewStack and passing in the parameters\r
-  specified by Context1 and Context2. Context1 and Context2 are optional and\r
-  may be 0. The function EntryPoint must never return.\r
-\r
-  If the current execution mode is not 64-bit paged mode, then ASSERT().\r
-  If EntryPoint is 0, then ASSERT().\r
-  If NewStack is 0, then ASSERT().\r
-\r
-  @param  Cs          The 16-bit selector to load in the CS before EntryPoint\r
-                      is called. The descriptor in the GDT that this selector\r
-                      references must be setup for 32-bit protected mode.\r
-  @param  EntryPoint  The 64-bit virtual address of the function to call with\r
-                      the new stack after paging is disabled.\r
-  @param  Context1    The 64-bit virtual address of the context to pass into\r
-                      the EntryPoint function as the first parameter after\r
-                      paging is disabled.\r
-  @param  Context2    The 64-bit virtual address of the context to pass into\r
-                      the EntryPoint function as the second parameter after\r
-                      paging is disabled.\r
-  @param  NewStack    The 64-bit virtual address of the new stack to use for\r
-                      the EntryPoint function after paging is disabled.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmDisablePaging64 (\r
-  IN      UINT16                    CodeSelector,\r
-  IN      UINT32                    EntryPoint,\r
-  IN      UINT32                    Context1,  OPTIONAL\r
-  IN      UINT32                    Context2,  OPTIONAL\r
-  IN      UINT32                    NewStack\r
-  );\r
-\r
-//\r
-// 16-bit thunking services\r
-//\r
-\r
-/**\r
-  Retrieves the properties for 16-bit thunk functions.\r
-\r
-  Computes the size of the buffer and stack below 1MB required to use the\r
-  AsmPrepareThunk16(), AsmThunk16() and AsmPrepareAndThunk16() functions. This\r
-  buffer size is returned in RealModeBufferSize, and the stack size is returned\r
-  in ExtraStackSize. If parameters are passed to the 16-bit real mode code,\r
-  then the actual minimum stack size is ExtraStackSize plus the maximum number\r
-  of bytes that need to be passed to the 16-bit real mode code.\r
-\r
-  If RealModeBufferSize is NULL, then ASSERT().\r
-  If ExtraStackSize is NULL, then ASSERT().\r
-\r
-  @param  RealModeBufferSize  A pointer to the size of the buffer below 1MB\r
-                              required to use the 16-bit thunk functions.\r
-  @param  ExtraStackSize      A pointer to the extra size of stack below 1MB\r
-                              that the 16-bit thunk functions require for\r
-                              temporary storage in the transition to and from\r
-                              16-bit real mode.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmGetThunk16Properties (\r
-  OUT     UINT32                    *RealModeBufferSize,\r
-  OUT     UINT32                    *ExtraStackSize\r
-  );\r
-\r
-/**\r
-  Prepares all structures a code required to use AsmThunk16().\r
-\r
-  Prepares all structures and code required to use AsmThunk16().\r
-\r
-  If ThunkContext is NULL, then ASSERT().\r
-\r
-  @param  ThunkContext  A pointer to the context structure that describes the\r
-                        16-bit real mode code to call.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmPrepareThunk16 (\r
-  OUT     THUNK_CONTEXT             *ThunkContext\r
-  );\r
-\r
-/**\r
-  Transfers control to a 16-bit real mode entry point and returns the results.\r
-\r
-  Transfers control to a 16-bit real mode entry point and returns the results.\r
-  AsmPrepareThunk16() must be called with ThunkContext before this function is\r
-  used.\r
-\r
-  If ThunkContext is NULL, then ASSERT().\r
-  If AsmPrepareThunk16() was not previously called with ThunkContext, then ASSERT().\r
-\r
-  @param  ThunkContext  A pointer to the context structure that describes the\r
-                        16-bit real mode code to call.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmThunk16 (\r
-  IN OUT  THUNK_CONTEXT             *ThunkContext\r
-  );\r
-\r
-/**\r
-  Prepares all structures and code for a 16-bit real mode thunk, transfers\r
-  control to a 16-bit real mode entry point, and returns the results.\r
-\r
-  Prepares all structures and code for a 16-bit real mode thunk, transfers\r
-  control to a 16-bit real mode entry point, and returns the results. If the\r
-  caller only need to perform a single 16-bit real mode thunk, then this\r
-  service should be used. If the caller intends to make more than one 16-bit\r
-  real mode thunk, then it is more efficient if AsmPrepareThunk16() is called\r
-  once and AsmThunk16() can be called for each 16-bit real mode thunk.\r
-\r
-  If ThunkContext is NULL, then ASSERT().\r
-\r
-  @param  ThunkContext  A pointer to the context structure that describes the\r
-                        16-bit real mode code to call.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmPrepareAndThunk16 (\r
-  IN OUT  THUNK_CONTEXT             *ThunkContext\r
-  );\r
-\r
-/**\r
-  Transfers control to a function starting with a new stack.\r
-\r
-  Transfers control to the function specified by EntryPoint using the new stack\r
-  specified by NewStack and passing in the parameters specified by Context1 and\r
-  Context2. Context1 and Context2 are optional and may be NULL. The function\r
-  EntryPoint must never return.\r
-\r
-  If EntryPoint is NULL, then ASSERT().\r
-  If NewStack is NULL, then ASSERT().\r
-\r
-  @param  EntryPoint  A pointer to function to call with the new stack.\r
-  @param  Context1    A pointer to the context to pass into the EntryPoint\r
-                      function.\r
-  @param  Context2    A pointer to the context to pass into the EntryPoint\r
-                      function.\r
-  @param  NewStack    A pointer to the new stack to use for the EntryPoint\r
-                      function.\r
-  @param  NewBsp      A pointer to the new memory location for RSE backing\r
-                      store.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-AsmSwitchStackAndBackingStore (\r
-  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
-  IN      VOID                      *Context1,  OPTIONAL\r
-  IN      VOID                      *Context2,  OPTIONAL\r
-  IN      VOID                      *NewStack,\r
-  IN      VOID                      *NewBsp\r
-  );\r
-\r
-typedef struct {\r
-  UINT64                            Status;\r
-  UINT64                            r9;\r
-  UINT64                            r10;\r
-  UINT64                            r11;\r
-} PAL_PROC_RETURN;\r
-\r
-//\r
-// IPF Specific functions\r
-//\r
-\r
-\r
-/**\r
-  Performs a PAL call using static calling convention.\r
-\r
-  An internal function to perform a PAL call using static calling convention.\r
-\r
-  @param  PalEntryPoint The entry point address of PAL. The address in ar.kr5\r
-                        would be used if this parameter were NULL on input.\r
-  @param  Arg1          The first argument of a PAL call.\r
-  @param  Arg1          The second argument of a PAL call.\r
-  @param  Arg1          The third argument of a PAL call.\r
-  @param  Arg1          The fourth argument of a PAL call.\r
-\r
-  @return The values returned in r8, r9, r10 and r11.\r
-\r
-**/\r
-PAL_PROC_RETURN\r
-PalCallStatic (\r
-  IN      CONST VOID                *PalEntryPoint,\r
-  IN      UINT64                    Arg1,\r
-  IN      UINT64                    Arg2,\r
-  IN      UINT64                    Arg3,\r
-  IN      UINT64                    Arg4\r
-  );\r
-\r
-\r
-/**\r
-  Returns the current value of ar.itc.\r
-\r
-  An internal function to return the current value of ar.itc, which is the\r
-  timer tick on IPF.\r
-\r
-  @return The currect value of ar.itc\r
-\r
-**/\r
-INT64\r
-IpfReadItc (\r
-  VOID\r
-  );\r
-\r
-\r
-/**\r
-  Flush a range of  cache lines in the cache coherency domain of the calling \r
-  CPU.\r
-\r
-  Invalidates the  cache lines specified by Address and Length. If Address is \r
-  not aligned on a cache line boundary, then entire cache line containing \r
-  Address is invalidated. If Address + Length is not aligned on a cache line \r
-  boundary, then the entire instruction cache line containing Address + Length\r
-  -1 is invalidated. This function may choose to invalidate the entire \r
-  instruction cache if that is more efficient than invalidating the specified \r
-  range. If Length is 0, the no instruction cache lines are invalidated. \r
-  Address is returned.\r
-\r
-  If Length is greater than (MAX_ADDRESS - Address + 1), then ASSERT().\r
-\r
-  @param  Address The base address of the instruction lines to invalidate. If \r
-                  the CPU is in a physical addressing mode, then Address is a\r
-                  physical address. If the CPU is in a virtual addressing mode,\r
-                  then Address is a virtual address.\r
-\r
-  @param  Length  The number of bytes to invalidate from the instruction cache.\r
-\r
-  @return Address\r
-\r
-**/\r
-VOID *\r
-EFIAPI\r
-IpfFlushCacheRange (\r
-  IN      VOID                      *Address,\r
-  IN      UINTN                     Length\r
-  );\r
-\r
-#endif\r
+/** @file
+  Memory-only library functions with no library constructor/destructor
+
+  Copyright (c) 2006 - 2007, Intel Corporation
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Module Name:  BaseLib.h
+
+**/
+
+#ifndef __BASE_LIB__
+#define __BASE_LIB__
+
+//
+// Definitions for architecture specific types
+// These include SPIN_LOCK and BASE_LIBRARY_JUMP_BUFFER
+//
+
+//
+// SPIN_LOCK
+//
+typedef UINTN                       SPIN_LOCK;
+
+#if   defined (MDE_CPU_IA32)
+//
+// IA32 context buffer used by SetJump() and LongJump()
+//
+typedef struct {
+  UINT32                            Ebx;
+  UINT32                            Esi;
+  UINT32                            Edi;
+  UINT32                            Ebp;
+  UINT32                            Esp;
+  UINT32                            Eip;
+} BASE_LIBRARY_JUMP_BUFFER;
+
+#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8
+
+#elif defined (MDE_CPU_IPF)
+//
+// IPF context buffer used by SetJump() and LongJump()
+//
+typedef struct {
+  UINT64                            F2[2];
+  UINT64                            F3[2];
+  UINT64                            F4[2];
+  UINT64                            F5[2];
+  UINT64                            F16[2];
+  UINT64                            F17[2];
+  UINT64                            F18[2];
+  UINT64                            F19[2];
+  UINT64                            F20[2];
+  UINT64                            F21[2];
+  UINT64                            F22[2];
+  UINT64                            F23[2];
+  UINT64                            F24[2];
+  UINT64                            F25[2];
+  UINT64                            F26[2];
+  UINT64                            F27[2];
+  UINT64                            F28[2];
+  UINT64                            F29[2];
+  UINT64                            F30[2];
+  UINT64                            F31[2];
+  UINT64                            R4;
+  UINT64                            R5;
+  UINT64                            R6;
+  UINT64                            R7;
+  UINT64                            SP;
+  UINT64                            BR0;
+  UINT64                            BR1;
+  UINT64                            BR2;
+  UINT64                            BR3;
+  UINT64                            BR4;
+  UINT64                            BR5;
+  UINT64                            InitialUNAT;
+  UINT64                            AfterSpillUNAT;
+  UINT64                            PFS;
+  UINT64                            BSP;
+  UINT64                            Predicates;
+  UINT64                            LoopCount;
+  UINT64                            FPSR;
+} BASE_LIBRARY_JUMP_BUFFER;
+
+#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 0x10
+
+#elif defined (MDE_CPU_X64)
+//
+// X64 context buffer used by SetJump() and LongJump()
+//
+typedef struct {
+  UINT64                            Rbx;
+  UINT64                            Rsp;
+  UINT64                            Rbp;
+  UINT64                            Rdi;
+  UINT64                            Rsi;
+  UINT64                            R12;
+  UINT64                            R13;
+  UINT64                            R14;
+  UINT64                            R15;
+  UINT64                            Rip;
+} BASE_LIBRARY_JUMP_BUFFER;
+
+#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8
+
+#elif defined (MDE_CPU_EBC)
+//
+// EBC context buffer used by SetJump() and LongJump()
+//
+typedef struct {
+  UINT64                            R0;
+  UINT64                            R1;
+  UINT64                            R2;
+  UINT64                            R3;
+  UINT64                            IP;
+} BASE_LIBRARY_JUMP_BUFFER;
+
+#define BASE_LIBRARY_JUMP_BUFFER_ALIGNMENT 8
+
+#else
+#error Unknown Processor Type
+#endif
+
+//
+// String Services
+//
+
+/**
+  Copies one Null-terminated Unicode string to another Null-terminated Unicode
+  string and returns the new Unicode string.
+
+  This function copies the contents of the Unicode string Source to the Unicode
+  string Destination, and returns Destination. If Source and Destination
+  overlap, then the results are undefined.
+
+  If Destination is NULL, then ASSERT().
+  If Source is NULL, then ASSERT().
+  If Source and Destination overlap, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
+  PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  Destination Pointer to a Null-terminated Unicode string.
+  @param  Source      Pointer to a Null-terminated Unicode string.
+
+  @return Destiantion
+
+**/
+CHAR16 *
+EFIAPI
+StrCpy (
+  OUT     CHAR16                    *Destination,
+  IN      CONST CHAR16              *Source
+  );
+/**
+  Copies one Null-terminated Unicode string with a maximum length to another
+  Null-terminated Unicode string with a maximum length and returns the new
+  Unicode string.
+
+  This function copies the contents of the Unicode string Source to the Unicode
+  string Destination, and returns Destination. At most, Length Unicode
+  characters are copied from Source to Destination. If Length is 0, then
+  Destination is returned unmodified. If Length is greater that the number of
+  Unicode characters in Source, then Destination is padded with Null Unicode
+  characters. If Source and Destination overlap, then the results are
+  undefined.
+
+  If Destination is NULL, then ASSERT().
+  If Source is NULL, then ASSERT().
+  If Source and Destination overlap, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
+  PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  Destination Pointer to a Null-terminated Unicode string.
+  @param  Source      Pointer to a Null-terminated Unicode string.
+  @param  Length      Maximum number of Unicode characters to copy.
+
+  @return Destination
+
+**/
+CHAR16 *
+EFIAPI
+StrnCpy (
+  OUT     CHAR16                    *Destination,
+  IN      CONST CHAR16              *Source,
+  IN      UINTN                     Length
+  );
+/**
+  Returns the length of a Null-terminated Unicode string.
+
+  This function returns the number of Unicode characters in the Null-terminated
+  Unicode string specified by String.
+
+  If String is NULL, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than
+  PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  String  Pointer to a Null-terminated Unicode string.
+
+  @return The length of String.
+
+**/
+UINTN
+EFIAPI
+StrLen (
+  IN      CONST CHAR16              *String
+  );
+/**
+  Returns the size of a Null-terminated Unicode string in bytes, including the
+  Null terminator.
+
+  This function returns the size, in bytes, of the Null-terminated Unicode
+  string specified by String.
+
+  If String is NULL, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than
+  PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  String  Pointer to a Null-terminated Unicode string.
+
+  @return The size of String.
+
+**/
+UINTN
+EFIAPI
+StrSize (
+  IN      CONST CHAR16              *String
+  );
+/**
+  Compares two Null-terminated Unicode strings, and returns the difference
+  between the first mismatched Unicode characters.
+
+  This function compares the Null-terminated Unicode string FirstString to the
+  Null-terminated Unicode string SecondString. If FirstString is identical to
+  SecondString, then 0 is returned. Otherwise, the value returned is the first
+  mismatched Unicode character in SecondString subtracted from the first
+  mismatched Unicode character in FirstString.
+
+  If FirstString is NULL, then ASSERT().
+  If SecondString is NULL, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more
+  than PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more
+  than PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  FirstString   Pointer to a Null-terminated Unicode string.
+  @param  SecondString  Pointer to a Null-terminated Unicode string.
+
+  @retval 0   FirstString is identical to SecondString.
+  @retval !=0 FirstString is not identical to SecondString.
+
+**/
+INTN
+EFIAPI
+StrCmp (
+  IN      CONST CHAR16              *FirstString,
+  IN      CONST CHAR16              *SecondString
+  );
+/**
+  Compares two Null-terminated Unicode strings with maximum lengths, and
+  returns the difference between the first mismatched Unicode characters.
+
+  This function compares the Null-terminated Unicode string FirstString to the
+  Null-terminated Unicode string SecondString. At most, Length Unicode
+  characters will be compared. If Length is 0, then 0 is returned. If
+  FirstString is identical to SecondString, then 0 is returned. Otherwise, the
+  value returned is the first mismatched Unicode character in SecondString
+  subtracted from the first mismatched Unicode character in FirstString.
+
+  If FirstString is NULL, then ASSERT().
+  If SecondString is NULL, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more
+  than PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more
+  than PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  FirstString   Pointer to a Null-terminated Unicode string.
+  @param  SecondString  Pointer to a Null-terminated Unicode string.
+  @param  Length        Maximum number of Unicode characters to compare.
+
+  @retval 0   FirstString is identical to SecondString.
+  @retval !=0 FirstString is not identical to SecondString.
+
+**/
+INTN
+EFIAPI
+StrnCmp (
+  IN      CONST CHAR16              *FirstString,
+  IN      CONST CHAR16              *SecondString,
+  IN      UINTN                     Length
+  );
+/**
+  Concatenates one Null-terminated Unicode string to another Null-terminated
+  Unicode string, and returns the concatenated Unicode string.
+
+  This function concatenates two Null-terminated Unicode strings. The contents
+  of Null-terminated Unicode string Source are concatenated to the end of
+  Null-terminated Unicode string Destination. The Null-terminated concatenated
+  Unicode String is returned. If Source and Destination overlap, then the
+  results are undefined.
+
+  If Destination is NULL, then ASSERT().
+  If Source is NULL, then ASSERT().
+  If Source and Destination overlap, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and Destination contains more
+  than PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
+  PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination
+  and Source results in a Unicode string with more than
+  PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  Destination Pointer to a Null-terminated Unicode string.
+  @param  Source      Pointer to a Null-terminated Unicode string.
+
+  @return Destination
+
+**/
+CHAR16 *
+EFIAPI
+StrCat (
+  IN OUT  CHAR16                    *Destination,
+  IN      CONST CHAR16              *Source
+  );
+/**
+  Concatenates one Null-terminated Unicode string with a maximum length to the
+  end of another Null-terminated Unicode string, and returns the concatenated
+  Unicode string.
+
+  This function concatenates two Null-terminated Unicode strings. The contents
+  of Null-terminated Unicode string Source are concatenated to the end of
+  Null-terminated Unicode string Destination, and Destination is returned. At
+  most, Length Unicode characters are concatenated from Source to the end of
+  Destination, and Destination is always Null-terminated. If Length is 0, then
+  Destination is returned unmodified. If Source and Destination overlap, then
+  the results are undefined.
+
+  If Destination is NULL, then ASSERT().
+  If Source is NULL, then ASSERT().
+  If Source and Destination overlap, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and Destination contains more
+  than PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
+  PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination
+  and Source results in a Unicode string with more than
+  PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  Destination Pointer to a Null-terminated Unicode string.
+  @param  Source      Pointer to a Null-terminated Unicode string.
+  @param  Length      Maximum number of Unicode characters to concatenate from
+                      Source.
+
+  @return Destination
+
+**/
+CHAR16 *
+EFIAPI
+StrnCat (
+  IN OUT  CHAR16                    *Destination,
+  IN      CONST CHAR16              *Source,
+  IN      UINTN                     Length
+  );
+
+/**
+  Returns the first occurance of a Null-terminated Unicode sub-string 
+  in a Null-terminated Unicode string.
+
+  This function scans the contents of the Null-terminated Unicode string 
+  specified by String and returns the first occurrence of SearchString.  
+  If SearchString is not found in String, then NULL is returned.  If 
+  the length of SearchString is zero, then String is 
+  returned.
+  
+  If String is NULL, then ASSERT().
+  If String is not aligned on a 16-bit boundary, then ASSERT().
+  If SearchString is NULL, then ASSERT().
+  If SearchString is not aligned on a 16-bit boundary, then ASSERT().
+
+  If PcdMaximumUnicodeStringLength is not zero, and SearchString 
+  or String contains more than PcdMaximumUnicodeStringLength Unicode 
+  characters not including the Null-terminator, then ASSERT().
+
+  @param  String                                 Pointer to a Null-terminated Unicode string.
+  @param  SearchString Pointer to a Null-terminated Unicode string to search for.
+
+  @retval NULL            If the SearchString does not appear in String.
+  @retval !NULL           If there is a match.
+
+**/
+CHAR16 *
+EFIAPI
+StrStr (
+  IN      CONST CHAR16               *String,
+  IN      CONST CHAR16               *SearchString
+  );
+
+/**
+  Convert a Null-terminated Unicode decimal string to a value of 
+  type UINTN.
+
+  This function returns a value of type UINTN by interpreting the contents 
+  of the Unicode string specified by String as a decimal number. The format 
+  of the input Unicode string String is:
+  
+                  [spaces] [decimal digits].
+                  
+  The valid decimal digit character is in the range [0-9]. The 
+  function will ignore the pad space, which includes spaces or 
+  tab characters, before [decimal digits]. The running zero in the 
+  beginning of [decimal digits] will be ignored. Then, the function 
+  stops at the first character that is a not a valid decimal character 
+  or a Null-terminator, whichever one comes first. 
+  
+  If String is NULL, then ASSERT().
+  If String is not aligned in a 16-bit boundary, then ASSERT().  
+  If String has only pad spaces, then 0 is returned.
+  If String has no pad spaces or valid decimal digits, 
+  then 0 is returned.
+  If the number represented by String overflows according 
+  to the range defined by UINTN, then ASSERT().
+  
+  If PcdMaximumUnicodeStringLength is not zero, and String contains 
+  more than PcdMaximumUnicodeStringLength Unicode characters not including 
+  the Null-terminator, then ASSERT().
+
+  @param  String                           Pointer to a Null-terminated Unicode string.
+
+  @retval UINTN           
+
+**/
+UINTN
+EFIAPI
+StrDecimalToUintn (
+  IN      CONST CHAR16               *String
+  );
+
+/**
+  Convert a Null-terminated Unicode decimal string to a value of 
+  type UINT64.
+
+  This function returns a value of type UINT64 by interpreting the contents 
+  of the Unicode string specified by String as a decimal number. The format 
+  of the input Unicode string String is:
+  
+                  [spaces] [decimal digits].
+                  
+  The valid decimal digit character is in the range [0-9]. The 
+  function will ignore the pad space, which includes spaces or 
+  tab characters, before [decimal digits]. The running zero in the 
+  beginning of [decimal digits] will be ignored. Then, the function 
+  stops at the first character that is a not a valid decimal character 
+  or a Null-terminator, whichever one comes first. 
+  
+  If String is NULL, then ASSERT().
+  If String is not aligned in a 16-bit boundary, then ASSERT().  
+  If String has only pad spaces, then 0 is returned.
+  If String has no pad spaces or valid decimal digits, 
+  then 0 is returned.
+  If the number represented by String overflows according 
+  to the range defined by UINT64, then ASSERT().
+  
+  If PcdMaximumUnicodeStringLength is not zero, and String contains 
+  more than PcdMaximumUnicodeStringLength Unicode characters not including 
+  the Null-terminator, then ASSERT().
+
+  @param  String                           Pointer to a Null-terminated Unicode string.
+
+  @retval UINT64           
+
+**/
+UINT64
+EFIAPI
+StrDecimalToUint64 (
+  IN      CONST CHAR16               *String
+  );
+
+/**
+  Convert a Null-terminated Unicode hexadecimal string to a value of type UINTN.
+
+  This function returns a value of type UINTN by interpreting the contents 
+  of the Unicode string specified by String as a hexadecimal number. 
+  The format of the input Unicode string String is:
+  
+                  [spaces][zeros][x][hexadecimal digits]. 
+
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. 
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. 
+  If "x" appears in the input string, it must be prefixed with at least one 0. 
+  The function will ignore the pad space, which includes spaces or tab characters, 
+  before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or 
+  [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the 
+  first valid hexadecimal digit. Then, the function stops at the first character that is 
+  a not a valid hexadecimal character or NULL, whichever one comes first.
+
+  If String is NULL, then ASSERT().
+  If String is not aligned in a 16-bit boundary, then ASSERT().
+  If String has only pad spaces, then zero is returned.
+  If String has no leading pad spaces, leading zeros or valid hexadecimal digits, 
+  then zero is returned.
+  If the number represented by String overflows according to the range defined by 
+  UINTN, then ASSERT().
+
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than 
+  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, 
+  then ASSERT().
+
+  @param  String                           Pointer to a Null-terminated Unicode string.
+
+  @retval UINTN
+
+**/
+UINTN
+EFIAPI
+StrHexToUintn (
+  IN      CONST CHAR16               *String
+  );
+
+/**
+  Convert a Null-terminated Unicode hexadecimal string to a value of type UINT64.
+
+  This function returns a value of type UINT64 by interpreting the contents 
+  of the Unicode string specified by String as a hexadecimal number. 
+  The format of the input Unicode string String is 
+  
+                  [spaces][zeros][x][hexadecimal digits]. 
+
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. 
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. 
+  If "x" appears in the input string, it must be prefixed with at least one 0. 
+  The function will ignore the pad space, which includes spaces or tab characters, 
+  before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or 
+  [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the 
+  first valid hexadecimal digit. Then, the function stops at the first character that is 
+  a not a valid hexadecimal character or NULL, whichever one comes first.
+
+  If String is NULL, then ASSERT().
+  If String is not aligned in a 16-bit boundary, then ASSERT().
+  If String has only pad spaces, then zero is returned.
+  If String has no leading pad spaces, leading zeros or valid hexadecimal digits, 
+  then zero is returned.
+  If the number represented by String overflows according to the range defined by 
+  UINT64, then ASSERT().
+
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than 
+  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, 
+  then ASSERT().
+
+  @param  String                           Pointer to a Null-terminated Unicode string.
+
+  @retval UINT64
+
+**/
+UINT64
+EFIAPI
+StrHexToUint64 (
+  IN      CONST CHAR16               *String
+  );
+
+/**
+  Convert one Null-terminated Unicode string to a Null-terminated 
+  ASCII string and returns the ASCII string.
+  
+  This function converts the content of the Unicode string Source 
+  to the ASCII string Destination by copying the lower 8 bits of 
+  each Unicode character. It returns Destination. 
+
+  If any Unicode characters in Source contain non-zero value in 
+  the upper 8 bits, then ASSERT().
+  
+  If Destination is NULL, then ASSERT().
+  If Source is NULL, then ASSERT().
+  If Source and Destination overlap, then ASSERT().
+  
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains 
+  more than PcdMaximumUnicodeStringLength Unicode characters not including 
+  the Null-terminator, then ASSERT().
+  
+  If PcdMaximumAsciiStringLength is not zero, and Source contains more 
+  than PcdMaximumAsciiStringLength Unicode characters not including the 
+  Null-terminator, then ASSERT().
+
+  @param  Source        Pointer to a Null-terminated Unicode string.
+  @param  Destination   Pointer to a Null-terminated ASCII string.
+
+  @reture Destination
+
+**/
+CHAR8 *
+EFIAPI
+UnicodeStrToAsciiStr (
+  IN      CONST CHAR16               *Source,
+  OUT    CHAR8                           *Destination
+  );
+
+/**
+  Copies one Null-terminated ASCII string to another Null-terminated ASCII
+  string and returns the new ASCII string.
+
+  This function copies the contents of the ASCII string Source to the ASCII
+  string Destination, and returns Destination. If Source and Destination
+  overlap, then the results are undefined.
+
+  If Destination is NULL, then ASSERT().
+  If Source is NULL, then ASSERT().
+  If Source and Destination overlap, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and Source contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+
+  @param  Destination Pointer to a Null-terminated ASCII string.
+  @param  Source      Pointer to a Null-terminated ASCII string.
+
+  @return Destination
+
+**/
+CHAR8 *
+EFIAPI
+AsciiStrCpy (
+  OUT     CHAR8                     *Destination,
+  IN      CONST CHAR8               *Source
+  );
+/**
+  Copies one Null-terminated ASCII string with a maximum length to another
+  Null-terminated ASCII string with a maximum length and returns the new ASCII
+  string.
+
+  This function copies the contents of the ASCII string Source to the ASCII
+  string Destination, and returns Destination. At most, Length ASCII characters
+  are copied from Source to Destination. If Length is 0, then Destination is
+  returned unmodified. If Length is greater that the number of ASCII characters
+  in Source, then Destination is padded with Null ASCII characters. If Source
+  and Destination overlap, then the results are undefined.
+
+  If Destination is NULL, then ASSERT().
+  If Source is NULL, then ASSERT().
+  If Source and Destination overlap, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and Source contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+
+  @param  Destination Pointer to a Null-terminated ASCII string.
+  @param  Source      Pointer to a Null-terminated ASCII string.
+  @param  Length      Maximum number of ASCII characters to copy.
+
+  @return Destination
+
+**/
+CHAR8 *
+EFIAPI
+AsciiStrnCpy (
+  OUT     CHAR8                     *Destination,
+  IN      CONST CHAR8               *Source,
+  IN      UINTN                     Length
+  );
+/**
+  Returns the length of a Null-terminated ASCII string.
+
+  This function returns the number of ASCII characters in the Null-terminated
+  ASCII string specified by String.
+
+  If String is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and String contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+
+  @param  String  Pointer to a Null-terminated ASCII string.
+
+  @return The length of String.
+
+**/
+UINTN
+EFIAPI
+AsciiStrLen (
+  IN      CONST CHAR8               *String
+  );
+/**
+  Returns the size of a Null-terminated ASCII string in bytes, including the
+  Null terminator.
+
+  This function returns the size, in bytes, of the Null-terminated ASCII string
+  specified by String.
+
+  If String is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and String contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+
+  @param  String  Pointer to a Null-terminated ASCII string.
+
+  @return The size of String.
+
+**/
+UINTN
+EFIAPI
+AsciiStrSize (
+  IN      CONST CHAR8               *String
+  );
+/**
+  Compares two Null-terminated ASCII strings, and returns the difference
+  between the first mismatched ASCII characters.
+
+  This function compares the Null-terminated ASCII string FirstString to the
+  Null-terminated ASCII string SecondString. If FirstString is identical to
+  SecondString, then 0 is returned. Otherwise, the value returned is the first
+  mismatched ASCII character in SecondString subtracted from the first
+  mismatched ASCII character in FirstString.
+
+  If FirstString is NULL, then ASSERT().
+  If SecondString is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and FirstString contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and SecondString contains more
+  than PcdMaximumAsciiStringLength ASCII characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  FirstString   Pointer to a Null-terminated ASCII string.
+  @param  SecondString  Pointer to a Null-terminated ASCII string.
+
+  @retval 0   FirstString is identical to SecondString.
+  @retval !=0 FirstString is not identical to SecondString.
+
+**/
+INTN
+EFIAPI
+AsciiStrCmp (
+  IN      CONST CHAR8               *FirstString,
+  IN      CONST CHAR8               *SecondString
+  );
+/**
+  Performs a case insensitive comparison of two Null-terminated ASCII strings,
+  and returns the difference between the first mismatched ASCII characters.
+
+  This function performs a case insensitive comparison of the Null-terminated
+  ASCII string FirstString to the Null-terminated ASCII string SecondString. If
+  FirstString is identical to SecondString, then 0 is returned. Otherwise, the
+  value returned is the first mismatched lower case ASCII character in
+  SecondString subtracted from the first mismatched lower case ASCII character
+  in FirstString.
+
+  If FirstString is NULL, then ASSERT().
+  If SecondString is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and FirstString contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and SecondString contains more
+  than PcdMaximumAsciiStringLength ASCII characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  FirstString   Pointer to a Null-terminated ASCII string.
+  @param  SecondString  Pointer to a Null-terminated ASCII string.
+
+  @retval 0   FirstString is identical to SecondString using case insensitive
+              comparisons.
+  @retval !=0 FirstString is not identical to SecondString using case
+              insensitive comparisons.
+
+**/
+INTN
+EFIAPI
+AsciiStriCmp (
+  IN      CONST CHAR8               *FirstString,
+  IN      CONST CHAR8               *SecondString
+  );
+/**
+  Compares two Null-terminated ASCII strings with maximum lengths, and returns
+  the difference between the first mismatched ASCII characters.
+
+  This function compares the Null-terminated ASCII string FirstString to the
+  Null-terminated ASCII  string SecondString. At most, Length ASCII characters
+  will be compared. If Length is 0, then 0 is returned. If FirstString is
+  identical to SecondString, then 0 is returned. Otherwise, the value returned
+  is the first mismatched ASCII character in SecondString subtracted from the
+  first mismatched ASCII character in FirstString.
+
+  If FirstString is NULL, then ASSERT().
+  If SecondString is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and FirstString contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and SecondString contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+
+  @param  FirstString   Pointer to a Null-terminated ASCII string.
+  @param  SecondString  Pointer to a Null-terminated ASCII string.
+
+  @retval 0   FirstString is identical to SecondString.
+  @retval !=0 FirstString is not identical to SecondString.
+
+**/
+INTN
+EFIAPI
+AsciiStrnCmp (
+  IN      CONST CHAR8               *FirstString,
+  IN      CONST CHAR8               *SecondString,
+  IN      UINTN                     Length
+  );
+/**
+  Concatenates one Null-terminated ASCII string to another Null-terminated
+  ASCII string, and returns the concatenated ASCII string.
+
+  This function concatenates two Null-terminated ASCII strings. The contents of
+  Null-terminated ASCII string Source are concatenated to the end of Null-
+  terminated ASCII string Destination. The Null-terminated concatenated ASCII
+  String is returned.
+
+  If Destination is NULL, then ASSERT().
+  If Source is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and Destination contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and Source contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and concatenating Destination and
+  Source results in a ASCII string with more than PcdMaximumAsciiStringLength
+  ASCII characters, then ASSERT().
+
+  @param  Destination Pointer to a Null-terminated ASCII string.
+  @param  Source      Pointer to a Null-terminated ASCII string.
+
+  @return Destination
+
+**/
+CHAR8 *
+EFIAPI
+AsciiStrCat (
+  IN OUT CHAR8    *Destination,
+  IN CONST CHAR8  *Source
+  );
+/**
+  Concatenates one Null-terminated ASCII string with a maximum length to the
+  end of another Null-terminated ASCII string, and returns the concatenated
+  ASCII string.
+
+  This function concatenates two Null-terminated ASCII strings. The contents
+  of Null-terminated ASCII string Source are concatenated to the end of Null-
+  terminated ASCII string Destination, and Destination is returned. At most,
+  Length ASCII characters are concatenated from Source to the end of
+  Destination, and Destination is always Null-terminated. If Length is 0, then
+  Destination is returned unmodified. If Source and Destination overlap, then
+  the results are undefined.
+
+  If Destination is NULL, then ASSERT().
+  If Source is NULL, then ASSERT().
+  If Source and Destination overlap, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and Destination contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and Source contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and concatenating Destination and
+  Source results in a ASCII string with more than PcdMaximumAsciiStringLength
+  ASCII characters not including the Null-terminator, then ASSERT().
+
+  @param  Destination Pointer to a Null-terminated ASCII string.
+  @param  Source      Pointer to a Null-terminated ASCII string.
+  @param  Length      Maximum number of ASCII characters to concatenate from
+                      Source.
+
+  @return Destination
+
+**/
+CHAR8 *
+EFIAPI
+AsciiStrnCat (
+  IN OUT  CHAR8                     *Destination,
+  IN      CONST CHAR8               *Source,
+  IN      UINTN                     Length
+  );
+
+/**
+  Returns the first occurance of a Null-terminated ASCII sub-string 
+  in a Null-terminated ASCII string.
+
+  This function scans the contents of the ASCII string specified by String 
+  and returns the first occurrence of SearchString. If SearchString is not 
+  found in String, then NULL is returned. If the length of SearchString is zero, 
+  then String is returned.
+  
+  If String is NULL, then ASSERT().
+  If SearchString is NULL, then ASSERT().
+
+  If PcdMaximumAsciiStringLength is not zero, and SearchString or 
+  String contains more than PcdMaximumAsciiStringLength Unicode characters 
+  not including the Null-terminator, then ASSERT().
+
+  @param  String                                 Pointer to a Null-terminated ASCII string.
+  @param  SearchString   Pointer to a Null-terminated ASCII string to search for.
+
+  @retval NULL            If the SearchString does not appear in String.
+  @retval !NULL           If there is a match.
+
+**/
+CHAR8 *
+EFIAPI
+AsciiStrStr (
+  IN      CONST CHAR8                  *String,
+  IN      CONST CHAR8                  *SearchString
+  );
+
+/**
+  Convert a Null-terminated ASCII decimal string to a value of type 
+  UINTN.
+
+  This function returns a value of type UINTN by interpreting the contents 
+  of the ASCII string String as a decimal number. The format of the input 
+  ASCII string String is:
+  
+                    [spaces] [decimal digits].
+  
+  The valid decimal digit character is in the range [0-9]. The function will 
+  ignore the pad space, which includes spaces or tab characters, before the digits. 
+  The running zero in the beginning of [decimal digits] will be ignored. Then, the 
+  function stops at the first character that is a not a valid decimal character or 
+  Null-terminator, whichever on comes first.
+  
+  If String has only pad spaces, then 0 is returned.
+  If String has no pad spaces or valid decimal digits, then 0 is returned.
+  If the number represented by String overflows according to the range defined by 
+  UINTN, then ASSERT().
+  If String is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and String contains more than 
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, 
+  then ASSERT().
+
+  @param  String                           Pointer to a Null-terminated ASCII string.
+
+  @retval UINTN           
+
+**/
+UINTN
+EFIAPI
+AsciiStrDecimalToUintn (
+  IN      CONST CHAR8               *String
+  );
+
+/**
+  Convert a Null-terminated ASCII decimal string to a value of type 
+  UINT64.
+
+  This function returns a value of type UINT64 by interpreting the contents 
+  of the ASCII string String as a decimal number. The format of the input 
+  ASCII string String is:
+  
+                    [spaces] [decimal digits].
+  
+  The valid decimal digit character is in the range [0-9]. The function will 
+  ignore the pad space, which includes spaces or tab characters, before the digits. 
+  The running zero in the beginning of [decimal digits] will be ignored. Then, the 
+  function stops at the first character that is a not a valid decimal character or 
+  Null-terminator, whichever on comes first.
+  
+  If String has only pad spaces, then 0 is returned.
+  If String has no pad spaces or valid decimal digits, then 0 is returned.
+  If the number represented by String overflows according to the range defined by 
+  UINT64, then ASSERT().
+  If String is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and String contains more than 
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, 
+  then ASSERT().
+
+  @param  String                           Pointer to a Null-terminated ASCII string.
+
+  @retval UINT64           
+
+**/
+UINT64
+EFIAPI
+AsciiStrDecimalToUint64 (
+  IN      CONST CHAR8                *String
+  );
+
+/**
+  Convert a Null-terminated ASCII hexadecimal string to a value of type UINTN.
+
+  This function returns a value of type UINTN by interpreting the contents of 
+  the ASCII string String as a hexadecimal number. The format of the input ASCII 
+  string String is:
+  
+                  [spaces][zeros][x][hexadecimal digits].
+                  
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. 
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x" 
+  appears in the input string, it must be prefixed with at least one 0. The function 
+  will ignore the pad space, which includes spaces or tab characters, before [zeros], 
+  [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits] 
+  will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal 
+  digit. Then, the function stops at the first character that is a not a valid 
+  hexadecimal character or Null-terminator, whichever on comes first.
+  
+  If String has only pad spaces, then 0 is returned.
+  If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then
+  0 is returned.
+
+  If the number represented by String overflows according to the range defined by UINTN, 
+  then ASSERT().
+  If String is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, 
+  and String contains more than PcdMaximumAsciiStringLength ASCII characters not including 
+  the Null-terminator, then ASSERT().
+
+  @param  String                           Pointer to a Null-terminated ASCII string.
+
+  @retval UINTN
+
+**/
+UINTN
+EFIAPI
+AsciiStrHexToUintn (
+  IN      CONST CHAR8                *String
+  );
+
+/**
+  Convert a Null-terminated ASCII hexadecimal string to a value of type UINT64.
+
+  This function returns a value of type UINT64 by interpreting the contents of 
+  the ASCII string String as a hexadecimal number. The format of the input ASCII 
+  string String is:
+  
+                  [spaces][zeros][x][hexadecimal digits].
+                  
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. 
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x" 
+  appears in the input string, it must be prefixed with at least one 0. The function 
+  will ignore the pad space, which includes spaces or tab characters, before [zeros], 
+  [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits] 
+  will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal 
+  digit. Then, the function stops at the first character that is a not a valid 
+  hexadecimal character or Null-terminator, whichever on comes first.
+  
+  If String has only pad spaces, then 0 is returned.
+  If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then
+  0 is returned.
+
+  If the number represented by String overflows according to the range defined by UINT64, 
+  then ASSERT().
+  If String is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, 
+  and String contains more than PcdMaximumAsciiStringLength ASCII characters not including 
+  the Null-terminator, then ASSERT().
+
+  @param  String                           Pointer to a Null-terminated ASCII string.
+
+  @retval UINT64
+
+**/
+UINT64
+EFIAPI
+AsciiStrHexToUint64 (
+  IN      CONST CHAR8                  *String
+  );
+
+/**
+  Convert one Null-terminated ASCII string to a Null-terminated 
+  Unicode string and returns the Unicode string.
+
+  This function converts the contents of the ASCII string Source to the Unicode 
+  string Destination, and returns Destination.  The function terminates the 
+  Unicode string Destination by appending a Null-terminator character at the end. 
+  The caller is responsible to make sure Destination points to a buffer with size 
+  equal or greater than ((AsciiStrLen (Source) + 1) * sizeof (CHAR16)) in bytes.
+  
+  If Destination is NULL, then ASSERT().
+  If Destination is not aligned on a 16-bit boundary, then ASSERT().
+  If Source is NULL, then ASSERT().
+  If Source and Destination overlap, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and Source contains more than 
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, 
+  then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than 
+  PcdMaximumUnicodeStringLength ASCII characters not including the 
+  Null-terminator, then ASSERT().
+
+  @param  Source        Pointer to a Null-terminated ASCII string.
+  @param  Destination   Pointer to a Null-terminated Unicode string.
+
+  @reture Destination
+
+**/
+CHAR16 *
+EFIAPI
+AsciiStrToUnicodeStr (
+  IN      CONST CHAR8                *Source,
+  OUT    CHAR16                        *Destination
+  );
+
+/**
+  Converts an 8-bit value to an 8-bit BCD value.
+
+  Converts the 8-bit value specified by Value to BCD. The BCD value is
+  returned.
+
+  If Value >= 100, then ASSERT().
+
+  @param  Value The 8-bit value to convert to BCD. Range 0..99.
+
+  @return The BCD value
+
+**/
+UINT8
+EFIAPI
+DecimalToBcd8 (
+  IN      UINT8                     Value
+  );
+
+/**
+  Converts an 8-bit BCD value to an 8-bit value.
+
+  Converts the 8-bit BCD value specified by Value to an 8-bit value. The 8-bit
+  value is returned.
+
+  If Value >= 0xA0, then ASSERT().
+  If (Value & 0x0F) >= 0x0A, then ASSERT().
+
+  @param  Value The 8-bit BCD value to convert to an 8-bit value.
+
+  @return The 8-bit value is returned.
+
+**/
+UINT8
+EFIAPI
+BcdToDecimal8 (
+  IN      UINT8                     Value
+  );
+
+
+//
+// Linked List Functions and Macros
+//
+
+/**
+  Initializes the head node of a doubly linked list that is declared as a
+  global variable in a module.
+
+  Initializes the forward and backward links of a new linked list. After
+  initializing a linked list with this macro, the other linked list functions
+  may be used to add and remove nodes from the linked list. This macro results
+  in smaller executables by initializing the linked list in the data section,
+  instead if calling the InitializeListHead() function to perform the
+  equivalent operation.
+
+  @param  ListHead  The head note of a list to initiailize.
+
+**/
+#define INITIALIZE_LIST_HEAD_VARIABLE(ListHead)  {&ListHead, &ListHead}
+
+/**
+  Initializes the head node of a doubly linked list, and returns the pointer to
+  the head node of the doubly linked list.
+
+  Initializes the forward and backward links of a new linked list. After
+  initializing a linked list with this function, the other linked list
+  functions may be used to add and remove nodes from the linked list. It is up
+  to the caller of this function to allocate the memory for ListHead.
+
+  If ListHead is NULL, then ASSERT().
+
+  @param  ListHead  A pointer to the head node of a new doubly linked list.
+
+  @return ListHead
+
+**/
+LIST_ENTRY *
+EFIAPI
+InitializeListHead (
+  IN      LIST_ENTRY                *ListHead
+  );
+
+/**
+  Adds a node to the beginning of a doubly linked list, and returns the pointer
+  to the head node of the doubly linked list.
+
+  Adds the node Entry at the beginning of the doubly linked list denoted by
+  ListHead, and returns ListHead.
+
+  If ListHead is NULL, then ASSERT().
+  If Entry is NULL, then ASSERT().
+  If ListHead was not initialized with InitializeListHead(), then ASSERT().
+  If PcdMaximumLinkedListLenth is not zero, and prior to insertion the number
+  of nodes in ListHead, including the ListHead node, is greater than or
+  equal to PcdMaximumLinkedListLength, then ASSERT().
+
+  @param  ListHead  A pointer to the head node of a doubly linked list.
+  @param  Entry     A pointer to a node that is to be inserted at the beginning
+                    of a doubly linked list.
+
+  @return ListHead
+
+**/
+LIST_ENTRY *
+EFIAPI
+InsertHeadList (
+  IN      LIST_ENTRY                *ListHead,
+  IN      LIST_ENTRY                *Entry
+  );
+
+/**
+  Adds a node to the end of a doubly linked list, and returns the pointer to
+  the head node of the doubly linked list.
+
+  Adds the node Entry to the end of the doubly linked list denoted by ListHead,
+  and returns ListHead.
+
+  If ListHead is NULL, then ASSERT().
+  If Entry is NULL, then ASSERT().
+  If ListHead was not initialized with InitializeListHead(), then ASSERT().
+  If PcdMaximumLinkedListLenth is not zero, and prior to insertion the number
+  of nodes in ListHead, including the ListHead node, is greater than or
+  equal to PcdMaximumLinkedListLength, then ASSERT().
+
+  @param  ListHead  A pointer to the head node of a doubly linked list.
+  @param  Entry     A pointer to a node that is to be added at the end of the
+                    doubly linked list.
+
+  @return ListHead
+
+**/
+LIST_ENTRY *
+EFIAPI
+InsertTailList (
+  IN      LIST_ENTRY                *ListHead,
+  IN      LIST_ENTRY                *Entry
+  );
+
+/**
+  Retrieves the first node of a doubly linked list.
+
+  Returns the first node of a doubly linked list. List must have been
+  initialized with InitializeListHead(). If List is empty, then NULL is
+  returned.
+
+  If List is NULL, then ASSERT().
+  If List was not initialized with InitializeListHead(), then ASSERT().
+  If PcdMaximumLinkedListLenth is not zero, and the number of nodes
+  in List, including the List node, is greater than or equal to
+  PcdMaximumLinkedListLength, then ASSERT().
+
+  @param  List  A pointer to the head node of a doubly linked list.
+
+  @return The first node of a doubly linked list.
+  @retval NULL  The list is empty.
+
+**/
+LIST_ENTRY *
+EFIAPI
+GetFirstNode (
+  IN      CONST LIST_ENTRY          *List
+  );
+
+/**
+  Retrieves the next node of a doubly linked list.
+
+  Returns the node of a doubly linked list that follows Node. List must have
+  been initialized with InitializeListHead(). If List is empty, then List is
+  returned.
+
+  If List is NULL, then ASSERT().
+  If Node is NULL, then ASSERT().
+  If List was not initialized with InitializeListHead(), then ASSERT().
+  If PcdMaximumLinkedListLenth is not zero, and List contains more than
+  PcdMaximumLinkedListLenth nodes, then ASSERT().
+  If Node is not a node in List, then ASSERT().
+
+  @param  List  A pointer to the head node of a doubly linked list.
+  @param  Node  A pointer to a node in the doubly linked list.
+
+  @return Pointer to the next node if one exists. Otherwise a null value which
+          is actually List is returned.
+
+**/
+LIST_ENTRY *
+EFIAPI
+GetNextNode (
+  IN      CONST LIST_ENTRY          *List,
+  IN      CONST LIST_ENTRY          *Node
+  );
+
+/**
+  Checks to see if a doubly linked list is empty or not.
+
+  Checks to see if the doubly linked list is empty. If the linked list contains
+  zero nodes, this function returns TRUE. Otherwise, it returns FALSE.
+
+  If ListHead is NULL, then ASSERT().
+  If ListHead was not initialized with InitializeListHead(), then ASSERT().
+  If PcdMaximumLinkedListLenth is not zero, and the number of nodes
+  in List, including the List node, is greater than or equal to
+  PcdMaximumLinkedListLength, then ASSERT().
+
+  @param  ListHead  A pointer to the head node of a doubly linked list.
+
+  @retval TRUE  The linked list is empty.
+  @retval FALSE The linked list is not empty.
+
+**/
+BOOLEAN
+EFIAPI
+IsListEmpty (
+  IN      CONST LIST_ENTRY          *ListHead
+  );
+
+/**
+  Determines if a node in a doubly linked list is null.
+
+  Returns FALSE if Node is one of the nodes in the doubly linked list specified
+  by List. Otherwise, TRUE is returned. List must have been initialized with
+  InitializeListHead().
+
+  If List is NULL, then ASSERT().
+  If Node is NULL, then ASSERT().
+  If List was not initialized with InitializeListHead(), then ASSERT().
+  If PcdMaximumLinkedListLenth is not zero, and the number of nodes
+  in List, including the List node, is greater than or equal to
+  PcdMaximumLinkedListLength, then ASSERT().
+  If Node is not a node in List and Node is not equal to List, then ASSERT().
+
+  @param  List  A pointer to the head node of a doubly linked list.
+  @param  Node  A pointer to a node in the doubly linked list.
+
+  @retval TRUE  Node is one of the nodes in the doubly linked list.
+  @retval FALSE Node is not one of the nodes in the doubly linked list.
+
+**/
+BOOLEAN
+EFIAPI
+IsNull (
+  IN      CONST LIST_ENTRY          *List,
+  IN      CONST LIST_ENTRY          *Node
+  );
+
+/**
+  Determines if a node the last node in a doubly linked list.
+
+  Returns TRUE if Node is the last node in the doubly linked list specified by
+  List. Otherwise, FALSE is returned. List must have been initialized with
+  InitializeListHead().
+
+  If List is NULL, then ASSERT().
+  If Node is NULL, then ASSERT().
+  If List was not initialized with InitializeListHead(), then ASSERT().
+  If PcdMaximumLinkedListLenth is not zero, and the number of nodes
+  in List, including the List node, is greater than or equal to
+  PcdMaximumLinkedListLength, then ASSERT().
+  If Node is not a node in List, then ASSERT().
+
+  @param  List  A pointer to the head node of a doubly linked list.
+  @param  Node  A pointer to a node in the doubly linked list.
+
+  @retval TRUE  Node is the last node in the linked list.
+  @retval FALSE Node is not the last node in the linked list.
+
+**/
+BOOLEAN
+EFIAPI
+IsNodeAtEnd (
+  IN      CONST LIST_ENTRY          *List,
+  IN      CONST LIST_ENTRY          *Node
+  );
+
+/**
+  Swaps the location of two nodes in a doubly linked list, and returns the
+  first node after the swap.
+
+  If FirstEntry is identical to SecondEntry, then SecondEntry is returned.
+  Otherwise, the location of the FirstEntry node is swapped with the location
+  of the SecondEntry node in a doubly linked list. SecondEntry must be in the
+  same double linked list as FirstEntry and that double linked list must have
+  been initialized with InitializeListHead(). SecondEntry is returned after the
+  nodes are swapped.
+
+  If FirstEntry is NULL, then ASSERT().
+  If SecondEntry is NULL, then ASSERT().
+  If SecondEntry and FirstEntry are not in the same linked list, then ASSERT().
+  If PcdMaximumLinkedListLength is not zero, and the number of nodes in the
+  linked list containing the FirstEntry and SecondEntry nodes, including
+  the FirstEntry and SecondEntry nodes, is greater than or equal to
+  PcdMaximumLinkedListLength, then ASSERT().
+
+  @param  FirstEntry  A pointer to a node in a linked list.
+  @param  SecondEntry A pointer to another node in the same linked list.
+
+**/
+LIST_ENTRY *
+EFIAPI
+SwapListEntries (
+  IN      LIST_ENTRY                *FirstEntry,
+  IN      LIST_ENTRY                *SecondEntry
+  );
+
+/**
+  Removes a node from a doubly linked list, and returns the node that follows
+  the removed node.
+
+  Removes the node Entry from a doubly linked list. It is up to the caller of
+  this function to release the memory used by this node if that is required. On
+  exit, the node following Entry in the doubly linked list is returned. If
+  Entry is the only node in the linked list, then the head node of the linked
+  list is returned.
+
+  If Entry is NULL, then ASSERT().
+  If Entry is the head node of an empty list, then ASSERT().
+  If PcdMaximumLinkedListLength is not zero, and the number of nodes in the
+  linked list containing Entry, including the Entry node, is greater than
+  or equal to PcdMaximumLinkedListLength, then ASSERT().
+
+  @param  Entry A pointer to a node in a linked list
+
+  @return Entry
+
+**/
+LIST_ENTRY *
+EFIAPI
+RemoveEntryList (
+  IN      CONST LIST_ENTRY          *Entry
+  );
+
+//
+// Math Services
+//
+
+/**
+  Shifts a 64-bit integer left between 0 and 63 bits. The low bits are filled
+  with zeros. The shifted value is returned.
+
+  This function shifts the 64-bit value Operand to the left by Count bits. The
+  low Count bits are set to zero. The shifted value is returned.
+
+  If Count is greater than 63, then ASSERT().
+
+  @param  Operand The 64-bit operand to shift left.
+  @param  Count   The number of bits to shift left.
+
+  @return Operand << Count
+
+**/
+UINT64
+EFIAPI
+LShiftU64 (
+  IN      UINT64                    Operand,
+  IN      UINTN                     Count
+  );
+
+/**
+  Shifts a 64-bit integer right between 0 and 63 bits. This high bits are
+  filled with zeros. The shifted value is returned.
+
+  This function shifts the 64-bit value Operand to the right by Count bits. The
+  high Count bits are set to zero. The shifted value is returned.
+
+  If Count is greater than 63, then ASSERT().
+
+  @param  Operand The 64-bit operand to shift right.
+  @param  Count   The number of bits to shift right.
+
+  @return Operand >> Count
+
+**/
+UINT64
+EFIAPI
+RShiftU64 (
+  IN      UINT64                    Operand,
+  IN      UINTN                     Count
+  );
+
+/**
+  Shifts a 64-bit integer right between 0 and 63 bits. The high bits are filled
+  with original integer's bit 63. The shifted value is returned.
+
+  This function shifts the 64-bit value Operand to the right by Count bits. The
+  high Count bits are set to bit 63 of Operand.  The shifted value is returned.
+
+  If Count is greater than 63, then ASSERT().
+
+  @param  Operand The 64-bit operand to shift right.
+  @param  Count   The number of bits to shift right.
+
+  @return Operand >> Count
+
+**/
+UINT64
+EFIAPI
+ARShiftU64 (
+  IN      UINT64                    Operand,
+  IN      UINTN                     Count
+  );
+
+/**
+  Rotates a 32-bit integer left between 0 and 31 bits, filling the low bits
+  with the high bits that were rotated.
+
+  This function rotates the 32-bit value Operand to the left by Count bits. The
+  low Count bits are fill with the high Count bits of Operand. The rotated
+  value is returned.
+
+  If Count is greater than 31, then ASSERT().
+
+  @param  Operand The 32-bit operand to rotate left.
+  @param  Count   The number of bits to rotate left.
+
+  @return Operand <<< Count
+
+**/
+UINT32
+EFIAPI
+LRotU32 (
+  IN      UINT32                    Operand,
+  IN      UINTN                     Count
+  );
+
+/**
+  Rotates a 32-bit integer right between 0 and 31 bits, filling the high bits
+  with the low bits that were rotated.
+
+  This function rotates the 32-bit value Operand to the right by Count bits.
+  The high Count bits are fill with the low Count bits of Operand. The rotated
+  value is returned.
+
+  If Count is greater than 31, then ASSERT().
+
+  @param  Operand The 32-bit operand to rotate right.
+  @param  Count   The number of bits to rotate right.
+
+  @return Operand >>> Count
+
+**/
+UINT32
+EFIAPI
+RRotU32 (
+  IN      UINT32                    Operand,
+  IN      UINTN                     Count
+  );
+
+/**
+  Rotates a 64-bit integer left between 0 and 63 bits, filling the low bits
+  with the high bits that were rotated.
+
+  This function rotates the 64-bit value Operand to the left by Count bits. The
+  low Count bits are fill with the high Count bits of Operand. The rotated
+  value is returned.
+
+  If Count is greater than 63, then ASSERT().
+
+  @param  Operand The 64-bit operand to rotate left.
+  @param  Count   The number of bits to rotate left.
+
+  @return Operand <<< Count
+
+**/
+UINT64
+EFIAPI
+LRotU64 (
+  IN      UINT64                    Operand,
+  IN      UINTN                     Count
+  );
+
+/**
+  Rotates a 64-bit integer right between 0 and 63 bits, filling the high bits
+  with the high low bits that were rotated.
+
+  This function rotates the 64-bit value Operand to the right by Count bits.
+  The high Count bits are fill with the low Count bits of Operand. The rotated
+  value is returned.
+
+  If Count is greater than 63, then ASSERT().
+
+  @param  Operand The 64-bit operand to rotate right.
+  @param  Count   The number of bits to rotate right.
+
+  @return Operand >>> Count
+
+**/
+UINT64
+EFIAPI
+RRotU64 (
+  IN      UINT64                    Operand,
+  IN      UINTN                     Count
+  );
+
+/**
+  Returns the bit position of the lowest bit set in a 32-bit value.
+
+  This function computes the bit position of the lowest bit set in the 32-bit
+  value specified by Operand. If Operand is zero, then -1 is returned.
+  Otherwise, a value between 0 and 31 is returned.
+
+  @param  Operand The 32-bit operand to evaluate.
+
+  @return Position of the lowest bit set in Operand if found.
+  @retval -1 Operand is zero.
+
+**/
+INTN
+EFIAPI
+LowBitSet32 (
+  IN      UINT32                    Operand
+  );
+
+/**
+  Returns the bit position of the lowest bit set in a 64-bit value.
+
+  This function computes the bit position of the lowest bit set in the 64-bit
+  value specified by Operand. If Operand is zero, then -1 is returned.
+  Otherwise, a value between 0 and 63 is returned.
+
+  @param  Operand The 64-bit operand to evaluate.
+
+  @return Position of the lowest bit set in Operand if found.
+  @retval -1  Operand is zero.
+
+**/
+INTN
+EFIAPI
+LowBitSet64 (
+  IN      UINT64                    Operand
+  );
+
+/**
+  Returns the bit position of the highest bit set in a 32-bit value. Equivalent
+  to log2(x).
+
+  This function computes the bit position of the highest bit set in the 32-bit
+  value specified by Operand. If Operand is zero, then -1 is returned.
+  Otherwise, a value between 0 and 31 is returned.
+
+  @param  Operand The 32-bit operand to evaluate.
+
+  @return Position of the highest bit set in Operand if found.
+  @retval -1  Operand is zero.
+
+**/
+INTN
+EFIAPI
+HighBitSet32 (
+  IN      UINT32                    Operand
+  );
+
+/**
+  Returns the bit position of the highest bit set in a 64-bit value. Equivalent
+  to log2(x).
+
+  This function computes the bit position of the highest bit set in the 64-bit
+  value specified by Operand. If Operand is zero, then -1 is returned.
+  Otherwise, a value between 0 and 63 is returned.
+
+  @param  Operand The 64-bit operand to evaluate.
+
+  @return Position of the highest bit set in Operand if found.
+  @retval -1  Operand is zero.
+
+**/
+INTN
+EFIAPI
+HighBitSet64 (
+  IN      UINT64                    Operand
+  );
+
+/**
+  Returns the value of the highest bit set in a 32-bit value. Equivalent to
+  1 << HighBitSet32(x).
+
+  This function computes the value of the highest bit set in the 32-bit value
+  specified by Operand. If Operand is zero, then zero is returned.
+
+  @param  Operand The 32-bit operand to evaluate.
+
+  @return 1 << HighBitSet32(Operand)
+  @retval 0 Operand is zero.
+
+**/
+UINT32
+EFIAPI
+GetPowerOfTwo32 (
+  IN      UINT32                    Operand
+  );
+
+/**
+  Returns the value of the highest bit set in a 64-bit value. Equivalent to
+  1 << HighBitSet64(x).
+
+  This function computes the value of the highest bit set in the 64-bit value
+  specified by Operand. If Operand is zero, then zero is returned.
+
+  @param  Operand The 64-bit operand to evaluate.
+
+  @return 1 << HighBitSet64(Operand)
+  @retval 0 Operand is zero.
+
+**/
+UINT64
+EFIAPI
+GetPowerOfTwo64 (
+  IN      UINT64                    Operand
+  );
+
+/**
+  Switches the endianess of a 16-bit integer.
+
+  This function swaps the bytes in a 16-bit unsigned value to switch the value
+  from little endian to big endian or vice versa. The byte swapped value is
+  returned.
+
+  @param  Operand A 16-bit unsigned value.
+
+  @return The byte swaped Operand.
+
+**/
+UINT16
+EFIAPI
+SwapBytes16 (
+  IN      UINT16                    Value
+  );
+
+/**
+  Switches the endianess of a 32-bit integer.
+
+  This function swaps the bytes in a 32-bit unsigned value to switch the value
+  from little endian to big endian or vice versa. The byte swapped value is
+  returned.
+
+  @param  Operand A 32-bit unsigned value.
+
+  @return The byte swaped Operand.
+
+**/
+UINT32
+EFIAPI
+SwapBytes32 (
+  IN      UINT32                    Value
+  );
+
+/**
+  Switches the endianess of a 64-bit integer.
+
+  This function swaps the bytes in a 64-bit unsigned value to switch the value
+  from little endian to big endian or vice versa. The byte swapped value is
+  returned.
+
+  @param  Operand A 64-bit unsigned value.
+
+  @return The byte swaped Operand.
+
+**/
+UINT64
+EFIAPI
+SwapBytes64 (
+  IN      UINT64                    Value
+  );
+
+/**
+  Multiples a 64-bit unsigned integer by a 32-bit unsigned integer and
+  generates a 64-bit unsigned result.
+
+  This function multiples the 64-bit unsigned value Multiplicand by the 32-bit
+  unsigned value Multiplier and generates a 64-bit unsigned result. This 64-
+  bit unsigned result is returned.
+
+  If the result overflows, then ASSERT().
+
+  @param  Multiplicand  A 64-bit unsigned value.
+  @param  Multiplier    A 32-bit unsigned value.
+
+  @return Multiplicand * Multiplier
+
+**/
+UINT64
+EFIAPI
+MultU64x32 (
+  IN      UINT64                    Multiplicand,
+  IN      UINT32                    Multiplier
+  );
+
+/**
+  Multiples a 64-bit unsigned integer by a 64-bit unsigned integer and
+  generates a 64-bit unsigned result.
+
+  This function multiples the 64-bit unsigned value Multiplicand by the 64-bit
+  unsigned value Multiplier and generates a 64-bit unsigned result. This 64-
+  bit unsigned result is returned.
+
+  If the result overflows, then ASSERT().
+
+  @param  Multiplicand  A 64-bit unsigned value.
+  @param  Multiplier    A 64-bit unsigned value.
+
+  @return Multiplicand * Multiplier
+
+**/
+UINT64
+EFIAPI
+MultU64x64 (
+  IN      UINT64                    Multiplicand,
+  IN      UINT64                    Multiplier
+  );
+
+/**
+  Multiples a 64-bit signed integer by a 64-bit signed integer and generates a
+  64-bit signed result.
+
+  This function multiples the 64-bit signed value Multiplicand by the 64-bit
+  signed value Multiplier and generates a 64-bit signed result. This 64-bit
+  signed result is returned.
+
+  If the result overflows, then ASSERT().
+
+  @param  Multiplicand  A 64-bit signed value.
+  @param  Multiplier    A 64-bit signed value.
+
+  @return Multiplicand * Multiplier
+
+**/
+INT64
+EFIAPI
+MultS64x64 (
+  IN      INT64                     Multiplicand,
+  IN      INT64                     Multiplier
+  );
+
+/**
+  Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates
+  a 64-bit unsigned result.
+
+  This function divides the 64-bit unsigned value Dividend by the 32-bit
+  unsigned value Divisor and generates a 64-bit unsigned quotient. This
+  function returns the 64-bit unsigned quotient.
+
+  If Divisor is 0, then ASSERT().
+
+  @param  Dividend  A 64-bit unsigned value.
+  @param  Divisor   A 32-bit unsigned value.
+
+  @return Dividend / Divisor
+
+**/
+UINT64
+EFIAPI
+DivU64x32 (
+  IN      UINT64                    Dividend,
+  IN      UINT32                    Divisor
+  );
+
+/**
+  Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates
+  a 32-bit unsigned remainder.
+
+  This function divides the 64-bit unsigned value Dividend by the 32-bit
+  unsigned value Divisor and generates a 32-bit remainder. This function
+  returns the 32-bit unsigned remainder.
+
+  If Divisor is 0, then ASSERT().
+
+  @param  Dividend  A 64-bit unsigned value.
+  @param  Divisor   A 32-bit unsigned value.
+
+  @return Dividend % Divisor
+
+**/
+UINT32
+EFIAPI
+ModU64x32 (
+  IN      UINT64                    Dividend,
+  IN      UINT32                    Divisor
+  );
+
+/**
+  Divides a 64-bit unsigned integer by a 32-bit unsigned integer and generates
+  a 64-bit unsigned result and an optional 32-bit unsigned remainder.
+
+  This function divides the 64-bit unsigned value Dividend by the 32-bit
+  unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder
+  is not NULL, then the 32-bit unsigned remainder is returned in Remainder.
+  This function returns the 64-bit unsigned quotient.
+
+  If Divisor is 0, then ASSERT().
+
+  @param  Dividend  A 64-bit unsigned value.
+  @param  Divisor   A 32-bit unsigned value.
+  @param  Remainder A pointer to a 32-bit unsigned value. This parameter is
+                    optional and may be NULL.
+
+  @return Dividend / Divisor
+
+**/
+UINT64
+EFIAPI
+DivU64x32Remainder (
+  IN      UINT64                    Dividend,
+  IN      UINT32                    Divisor,
+  OUT     UINT32                    *Remainder  OPTIONAL
+  );
+
+/**
+  Divides a 64-bit unsigned integer by a 64-bit unsigned integer and generates
+  a 64-bit unsigned result and an optional 64-bit unsigned remainder.
+
+  This function divides the 64-bit unsigned value Dividend by the 64-bit
+  unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder
+  is not NULL, then the 64-bit unsigned remainder is returned in Remainder.
+  This function returns the 64-bit unsigned quotient.
+
+  If Divisor is 0, then ASSERT().
+
+  @param  Dividend  A 64-bit unsigned value.
+  @param  Divisor   A 64-bit unsigned value.
+  @param  Remainder A pointer to a 64-bit unsigned value. This parameter is
+                    optional and may be NULL.
+
+  @return Dividend / Divisor
+
+**/
+UINT64
+EFIAPI
+DivU64x64Remainder (
+  IN      UINT64                    Dividend,
+  IN      UINT64                    Divisor,
+  OUT     UINT64                    *Remainder  OPTIONAL
+  );
+
+/**
+  Divides a 64-bit signed integer by a 64-bit signed integer and generates a
+  64-bit signed result and a optional 64-bit signed remainder.
+
+  This function divides the 64-bit signed value Dividend by the 64-bit signed
+  value Divisor and generates a 64-bit signed quotient. If Remainder is not
+  NULL, then the 64-bit signed remainder is returned in Remainder. This
+  function returns the 64-bit signed quotient.
+
+  If Divisor is 0, then ASSERT().
+
+  @param  Dividend  A 64-bit signed value.
+  @param  Divisor   A 64-bit signed value.
+  @param  Remainder A pointer to a 64-bit signed value. This parameter is
+                    optional and may be NULL.
+
+  @return Dividend / Divisor
+
+**/
+INT64
+EFIAPI
+DivS64x64Remainder (
+  IN      INT64                     Dividend,
+  IN      INT64                     Divisor,
+  OUT     INT64                     *Remainder  OPTIONAL
+  );
+
+/**
+  Reads a 16-bit value from memory that may be unaligned.
+
+  This function returns the 16-bit value pointed to by Buffer. The function
+  guarantees that the read operation does not produce an alignment fault.
+
+  If the Buffer is NULL, then ASSERT().
+
+  @param  Buffer  Pointer to a 16-bit value that may be unaligned.
+
+  @return *Uint16
+
+**/
+UINT16
+EFIAPI
+ReadUnaligned16 (
+  IN      CONST UINT16              *Uint16
+  );
+
+/**
+  Writes a 16-bit value to memory that may be unaligned.
+
+  This function writes the 16-bit value specified by Value to Buffer. Value is
+  returned. The function guarantees that the write operation does not produce
+  an alignment fault.
+
+  If the Buffer is NULL, then ASSERT().
+
+  @param  Buffer  Pointer to a 16-bit value that may be unaligned.
+  @param  Value   16-bit value to write to Buffer.
+
+  @return Value
+
+**/
+UINT16
+EFIAPI
+WriteUnaligned16 (
+  OUT     UINT16                    *Uint16,
+  IN      UINT16                    Value
+  );
+
+/**
+  Reads a 24-bit value from memory that may be unaligned.
+
+  This function returns the 24-bit value pointed to by Buffer. The function
+  guarantees that the read operation does not produce an alignment fault.
+
+  If the Buffer is NULL, then ASSERT().
+
+  @param  Buffer  Pointer to a 24-bit value that may be unaligned.
+
+  @return The value read.
+
+**/
+UINT32
+EFIAPI
+ReadUnaligned24 (
+  IN      CONST UINT32              *Buffer
+  );
+
+/**
+  Writes a 24-bit value to memory that may be unaligned.
+
+  This function writes the 24-bit value specified by Value to Buffer. Value is
+  returned. The function guarantees that the write operation does not produce
+  an alignment fault.
+
+  If the Buffer is NULL, then ASSERT().
+
+  @param  Buffer  Pointer to a 24-bit value that may be unaligned.
+  @param  Value   24-bit value to write to Buffer.
+
+  @return The value written.
+
+**/
+UINT32
+EFIAPI
+WriteUnaligned24 (
+  OUT     UINT32                    *Buffer,
+  IN      UINT32                    Value
+  );
+
+/**
+  Reads a 32-bit value from memory that may be unaligned.
+
+  This function returns the 32-bit value pointed to by Buffer. The function
+  guarantees that the read operation does not produce an alignment fault.
+
+  If the Buffer is NULL, then ASSERT().
+
+  @param  Buffer  Pointer to a 32-bit value that may be unaligned.
+
+  @return *Uint32
+
+**/
+UINT32
+EFIAPI
+ReadUnaligned32 (
+  IN      CONST UINT32              *Uint32
+  );
+
+/**
+  Writes a 32-bit value to memory that may be unaligned.
+
+  This function writes the 32-bit value specified by Value to Buffer. Value is
+  returned. The function guarantees that the write operation does not produce
+  an alignment fault.
+
+  If the Buffer is NULL, then ASSERT().
+
+  @param  Buffer  Pointer to a 32-bit value that may be unaligned.
+  @param  Value   32-bit value to write to Buffer.
+
+  @return Value
+
+**/
+UINT32
+EFIAPI
+WriteUnaligned32 (
+  OUT     UINT32                    *Uint32,
+  IN      UINT32                    Value
+  );
+
+/**
+  Reads a 64-bit value from memory that may be unaligned.
+
+  This function returns the 64-bit value pointed to by Buffer. The function
+  guarantees that the read operation does not produce an alignment fault.
+
+  If the Buffer is NULL, then ASSERT().
+
+  @param  Buffer  Pointer to a 64-bit value that may be unaligned.
+
+  @return *Uint64
+
+**/
+UINT64
+EFIAPI
+ReadUnaligned64 (
+  IN      CONST UINT64              *Uint64
+  );
+
+/**
+  Writes a 64-bit value to memory that may be unaligned.
+
+  This function writes the 64-bit value specified by Value to Buffer. Value is
+  returned. The function guarantees that the write operation does not produce
+  an alignment fault.
+
+  If the Buffer is NULL, then ASSERT().
+
+  @param  Buffer  Pointer to a 64-bit value that may be unaligned.
+  @param  Value   64-bit value to write to Buffer.
+
+  @return Value
+
+**/
+UINT64
+EFIAPI
+WriteUnaligned64 (
+  OUT     UINT64                    *Uint64,
+  IN      UINT64                    Value
+  );
+
+//
+// Bit Field Functions
+//
+
+/**
+  Returns a bit field from an 8-bit value.
+
+  Returns the bitfield specified by the StartBit and the EndBit from Operand.
+
+  If 8-bit operations are not supported, then ASSERT().
+  If StartBit is greater than 7, then ASSERT().
+  If EndBit is greater than 7, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..7.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..7.
+
+  @return The bit field read.
+
+**/
+UINT8
+EFIAPI
+BitFieldRead8 (
+  IN      UINT8                     Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit
+  );
+
+/**
+  Writes a bit field to an 8-bit value, and returns the result.
+
+  Writes Value to the bit field specified by the StartBit and the EndBit in
+  Operand. All other bits in Operand are preserved. The new 8-bit value is
+  returned.
+
+  If 8-bit operations are not supported, then ASSERT().
+  If StartBit is greater than 7, then ASSERT().
+  If EndBit is greater than 7, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..7.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..7.
+  @param  Value     New value of the bit field.
+
+  @return The new 8-bit value.
+
+**/
+UINT8
+EFIAPI
+BitFieldWrite8 (
+  IN      UINT8                     Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT8                     Value
+  );
+
+/**
+  Reads a bit field from an 8-bit value, performs a bitwise OR, and returns the
+  result.
+
+  Performs a bitwise inclusive OR between the bit field specified by StartBit
+  and EndBit in Operand and the value specified by OrData. All other bits in
+  Operand are preserved. The new 8-bit value is returned.
+
+  If 8-bit operations are not supported, then ASSERT().
+  If StartBit is greater than 7, then ASSERT().
+  If EndBit is greater than 7, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..7.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..7.
+  @param  OrData    The value to OR with the read value from the value
+
+  @return The new 8-bit value.
+
+**/
+UINT8
+EFIAPI
+BitFieldOr8 (
+  IN      UINT8                     Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT8                     OrData
+  );
+
+/**
+  Reads a bit field from an 8-bit value, performs a bitwise AND, and returns
+  the result.
+
+  Performs a bitwise AND between the bit field specified by StartBit and EndBit
+  in Operand and the value specified by AndData. All other bits in Operand are
+  preserved. The new 8-bit value is returned.
+
+  If 8-bit operations are not supported, then ASSERT().
+  If StartBit is greater than 7, then ASSERT().
+  If EndBit is greater than 7, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..7.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..7.
+  @param  AndData   The value to AND with the read value from the value.
+
+  @return The new 8-bit value.
+
+**/
+UINT8
+EFIAPI
+BitFieldAnd8 (
+  IN      UINT8                     Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT8                     AndData
+  );
+
+/**
+  Reads a bit field from an 8-bit value, performs a bitwise AND followed by a
+  bitwise OR, and returns the result.
+
+  Performs a bitwise AND between the bit field specified by StartBit and EndBit
+  in Operand and the value specified by AndData, followed by a bitwise
+  inclusive OR with value specified by OrData. All other bits in Operand are
+  preserved. The new 8-bit value is returned.
+
+  If 8-bit operations are not supported, then ASSERT().
+  If StartBit is greater than 7, then ASSERT().
+  If EndBit is greater than 7, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..7.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..7.
+  @param  AndData   The value to AND with the read value from the value.
+  @param  OrData    The value to OR with the result of the AND operation.
+
+  @return The new 8-bit value.
+
+**/
+UINT8
+EFIAPI
+BitFieldAndThenOr8 (
+  IN      UINT8                     Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT8                     AndData,
+  IN      UINT8                     OrData
+  );
+
+/**
+  Returns a bit field from a 16-bit value.
+
+  Returns the bitfield specified by the StartBit and the EndBit from Operand.
+
+  If 16-bit operations are not supported, then ASSERT().
+  If StartBit is greater than 15, then ASSERT().
+  If EndBit is greater than 15, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..15.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..15.
+
+  @return The bit field read.
+
+**/
+UINT16
+EFIAPI
+BitFieldRead16 (
+  IN      UINT16                    Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit
+  );
+
+/**
+  Writes a bit field to a 16-bit value, and returns the result.
+
+  Writes Value to the bit field specified by the StartBit and the EndBit in
+  Operand. All other bits in Operand are preserved. The new 16-bit value is
+  returned.
+
+  If 16-bit operations are not supported, then ASSERT().
+  If StartBit is greater than 15, then ASSERT().
+  If EndBit is greater than 15, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..15.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..15.
+  @param  Value     New value of the bit field.
+
+  @return The new 16-bit value.
+
+**/
+UINT16
+EFIAPI
+BitFieldWrite16 (
+  IN      UINT16                    Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT16                    Value
+  );
+
+/**
+  Reads a bit field from a 16-bit value, performs a bitwise OR, and returns the
+  result.
+
+  Performs a bitwise inclusive OR between the bit field specified by StartBit
+  and EndBit in Operand and the value specified by OrData. All other bits in
+  Operand are preserved. The new 16-bit value is returned.
+
+  If 16-bit operations are not supported, then ASSERT().
+  If StartBit is greater than 15, then ASSERT().
+  If EndBit is greater than 15, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..15.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..15.
+  @param  OrData    The value to OR with the read value from the value
+
+  @return The new 16-bit value.
+
+**/
+UINT16
+EFIAPI
+BitFieldOr16 (
+  IN      UINT16                    Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT16                    OrData
+  );
+
+/**
+  Reads a bit field from a 16-bit value, performs a bitwise AND, and returns
+  the result.
+
+  Performs a bitwise AND between the bit field specified by StartBit and EndBit
+  in Operand and the value specified by AndData. All other bits in Operand are
+  preserved. The new 16-bit value is returned.
+
+  If 16-bit operations are not supported, then ASSERT().
+  If StartBit is greater than 15, then ASSERT().
+  If EndBit is greater than 15, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..15.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..15.
+  @param  AndData   The value to AND with the read value from the value
+
+  @return The new 16-bit value.
+
+**/
+UINT16
+EFIAPI
+BitFieldAnd16 (
+  IN      UINT16                    Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT16                    AndData
+  );
+
+/**
+  Reads a bit field from a 16-bit value, performs a bitwise AND followed by a
+  bitwise OR, and returns the result.
+
+  Performs a bitwise AND between the bit field specified by StartBit and EndBit
+  in Operand and the value specified by AndData, followed by a bitwise
+  inclusive OR with value specified by OrData. All other bits in Operand are
+  preserved. The new 16-bit value is returned.
+
+  If 16-bit operations are not supported, then ASSERT().
+  If StartBit is greater than 15, then ASSERT().
+  If EndBit is greater than 15, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..15.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..15.
+  @param  AndData   The value to AND with the read value from the value.
+  @param  OrData    The value to OR with the result of the AND operation.
+
+  @return The new 16-bit value.
+
+**/
+UINT16
+EFIAPI
+BitFieldAndThenOr16 (
+  IN      UINT16                    Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT16                    AndData,
+  IN      UINT16                    OrData
+  );
+
+/**
+  Returns a bit field from a 32-bit value.
+
+  Returns the bitfield specified by the StartBit and the EndBit from Operand.
+
+  If 32-bit operations are not supported, then ASSERT().
+  If StartBit is greater than 31, then ASSERT().
+  If EndBit is greater than 31, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..31.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..31.
+
+  @return The bit field read.
+
+**/
+UINT32
+EFIAPI
+BitFieldRead32 (
+  IN      UINT32                    Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit
+  );
+
+/**
+  Writes a bit field to a 32-bit value, and returns the result.
+
+  Writes Value to the bit field specified by the StartBit and the EndBit in
+  Operand. All other bits in Operand are preserved. The new 32-bit value is
+  returned.
+
+  If 32-bit operations are not supported, then ASSERT().
+  If StartBit is greater than 31, then ASSERT().
+  If EndBit is greater than 31, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..31.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..31.
+  @param  Value     New value of the bit field.
+
+  @return The new 32-bit value.
+
+**/
+UINT32
+EFIAPI
+BitFieldWrite32 (
+  IN      UINT32                    Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT32                    Value
+  );
+
+/**
+  Reads a bit field from a 32-bit value, performs a bitwise OR, and returns the
+  result.
+
+  Performs a bitwise inclusive OR between the bit field specified by StartBit
+  and EndBit in Operand and the value specified by OrData. All other bits in
+  Operand are preserved. The new 32-bit value is returned.
+
+  If 32-bit operations are not supported, then ASSERT().
+  If StartBit is greater than 31, then ASSERT().
+  If EndBit is greater than 31, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..31.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..31.
+  @param  OrData    The value to OR with the read value from the value
+
+  @return The new 32-bit value.
+
+**/
+UINT32
+EFIAPI
+BitFieldOr32 (
+  IN      UINT32                    Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT32                    OrData
+  );
+
+/**
+  Reads a bit field from a 32-bit value, performs a bitwise AND, and returns
+  the result.
+
+  Performs a bitwise AND between the bit field specified by StartBit and EndBit
+  in Operand and the value specified by AndData. All other bits in Operand are
+  preserved. The new 32-bit value is returned.
+
+  If 32-bit operations are not supported, then ASSERT().
+  If StartBit is greater than 31, then ASSERT().
+  If EndBit is greater than 31, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..31.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..31.
+  @param  AndData   The value to AND with the read value from the value
+
+  @return The new 32-bit value.
+
+**/
+UINT32
+EFIAPI
+BitFieldAnd32 (
+  IN      UINT32                    Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT32                    AndData
+  );
+
+/**
+  Reads a bit field from a 32-bit value, performs a bitwise AND followed by a
+  bitwise OR, and returns the result.
+
+  Performs a bitwise AND between the bit field specified by StartBit and EndBit
+  in Operand and the value specified by AndData, followed by a bitwise
+  inclusive OR with value specified by OrData. All other bits in Operand are
+  preserved. The new 32-bit value is returned.
+
+  If 32-bit operations are not supported, then ASSERT().
+  If StartBit is greater than 31, then ASSERT().
+  If EndBit is greater than 31, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..31.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..31.
+  @param  AndData   The value to AND with the read value from the value.
+  @param  OrData    The value to OR with the result of the AND operation.
+
+  @return The new 32-bit value.
+
+**/
+UINT32
+EFIAPI
+BitFieldAndThenOr32 (
+  IN      UINT32                    Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT32                    AndData,
+  IN      UINT32                    OrData
+  );
+
+/**
+  Returns a bit field from a 64-bit value.
+
+  Returns the bitfield specified by the StartBit and the EndBit from Operand.
+
+  If 64-bit operations are not supported, then ASSERT().
+  If StartBit is greater than 63, then ASSERT().
+  If EndBit is greater than 63, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..63.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..63.
+
+  @return The bit field read.
+
+**/
+UINT64
+EFIAPI
+BitFieldRead64 (
+  IN      UINT64                    Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit
+  );
+
+/**
+  Writes a bit field to a 64-bit value, and returns the result.
+
+  Writes Value to the bit field specified by the StartBit and the EndBit in
+  Operand. All other bits in Operand are preserved. The new 64-bit value is
+  returned.
+
+  If 64-bit operations are not supported, then ASSERT().
+  If StartBit is greater than 63, then ASSERT().
+  If EndBit is greater than 63, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..63.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..63.
+  @param  Value     New value of the bit field.
+
+  @return The new 64-bit value.
+
+**/
+UINT64
+EFIAPI
+BitFieldWrite64 (
+  IN      UINT64                    Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT64                    Value
+  );
+
+/**
+  Reads a bit field from a 64-bit value, performs a bitwise OR, and returns the
+  result.
+
+  Performs a bitwise inclusive OR between the bit field specified by StartBit
+  and EndBit in Operand and the value specified by OrData. All other bits in
+  Operand are preserved. The new 64-bit value is returned.
+
+  If 64-bit operations are not supported, then ASSERT().
+  If StartBit is greater than 63, then ASSERT().
+  If EndBit is greater than 63, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..63.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..63.
+  @param  OrData    The value to OR with the read value from the value
+
+  @return The new 64-bit value.
+
+**/
+UINT64
+EFIAPI
+BitFieldOr64 (
+  IN      UINT64                    Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT64                    OrData
+  );
+
+/**
+  Reads a bit field from a 64-bit value, performs a bitwise AND, and returns
+  the result.
+
+  Performs a bitwise AND between the bit field specified by StartBit and EndBit
+  in Operand and the value specified by AndData. All other bits in Operand are
+  preserved. The new 64-bit value is returned.
+
+  If 64-bit operations are not supported, then ASSERT().
+  If StartBit is greater than 63, then ASSERT().
+  If EndBit is greater than 63, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..63.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..63.
+  @param  AndData   The value to AND with the read value from the value
+
+  @return The new 64-bit value.
+
+**/
+UINT64
+EFIAPI
+BitFieldAnd64 (
+  IN      UINT64                    Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT64                    AndData
+  );
+
+/**
+  Reads a bit field from a 64-bit value, performs a bitwise AND followed by a
+  bitwise OR, and returns the result.
+
+  Performs a bitwise AND between the bit field specified by StartBit and EndBit
+  in Operand and the value specified by AndData, followed by a bitwise
+  inclusive OR with value specified by OrData. All other bits in Operand are
+  preserved. The new 64-bit value is returned.
+
+  If 64-bit operations are not supported, then ASSERT().
+  If StartBit is greater than 63, then ASSERT().
+  If EndBit is greater than 63, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..63.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..63.
+  @param  AndData   The value to AND with the read value from the value.
+  @param  OrData    The value to OR with the result of the AND operation.
+
+  @return The new 64-bit value.
+
+**/
+UINT64
+EFIAPI
+BitFieldAndThenOr64 (
+  IN      UINT64                    Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT64                    AndData,
+  IN      UINT64                    OrData
+  );
+
+//
+// Base Library Synchronization Functions
+//
+
+/**
+  Retrieves the architecture specific spin lock alignment requirements for
+  optimal spin lock performance.
+
+  This function retrieves the spin lock alignment requirements for optimal
+  performance on a given CPU architecture. The spin lock alignment must be a
+  power of two and is returned by this function. If there are no alignment
+  requirements, then 1 must be returned. The spin lock synchronization
+  functions must function correctly if the spin lock size and alignment values
+  returned by this function are not used at all. These values are hints to the
+  consumers of the spin lock synchronization functions to obtain optimal spin
+  lock performance.
+
+  @return The architecture specific spin lock alignment.
+
+**/
+UINTN
+EFIAPI
+GetSpinLockProperties (
+  VOID
+  );
+
+/**
+  Initializes a spin lock to the released state and returns the spin lock.
+
+  This function initializes the spin lock specified by SpinLock to the released
+  state, and returns SpinLock. Optimal performance can be achieved by calling
+  GetSpinLockProperties() to determine the size and alignment requirements for
+  SpinLock.
+
+  If SpinLock is NULL, then ASSERT().
+
+  @param  SpinLock  A pointer to the spin lock to initialize to the released
+                    state.
+
+  @return SpinLock
+
+**/
+SPIN_LOCK *
+EFIAPI
+InitializeSpinLock (
+  IN      SPIN_LOCK                 *SpinLock
+  );
+
+/**
+  Waits until a spin lock can be placed in the acquired state.
+
+  This function checks the state of the spin lock specified by SpinLock. If
+  SpinLock is in the released state, then this function places SpinLock in the
+  acquired state and returns SpinLock. Otherwise, this function waits
+  indefinitely for the spin lock to be released, and then places it in the
+  acquired state and returns SpinLock. All state transitions of SpinLock must
+  be performed using MP safe mechanisms.
+
+  If SpinLock is NULL, then ASSERT().
+  If SpinLock was not initialized with InitializeSpinLock(), then ASSERT().
+  If PcdSpinLockTimeout is not zero, and SpinLock is can not be acquired in
+  PcdSpinLockTimeout microseconds, then ASSERT().
+
+  @param  SpinLock  A pointer to the spin lock to place in the acquired state.
+
+  @return SpinLock
+
+**/
+SPIN_LOCK *
+EFIAPI
+AcquireSpinLock (
+  IN      SPIN_LOCK                 *SpinLock
+  );
+
+/**
+  Attempts to place a spin lock in the acquired state.
+
+  This function checks the state of the spin lock specified by SpinLock. If
+  SpinLock is in the released state, then this function places SpinLock in the
+  acquired state and returns TRUE. Otherwise, FALSE is returned. All state
+  transitions of SpinLock must be performed using MP safe mechanisms.
+
+  If SpinLock is NULL, then ASSERT().
+  If SpinLock was not initialized with InitializeSpinLock(), then ASSERT().
+
+  @param  SpinLock  A pointer to the spin lock to place in the acquired state.
+
+  @retval TRUE  SpinLock was placed in the acquired state.
+  @retval FALSE SpinLock could not be acquired.
+
+**/
+BOOLEAN
+EFIAPI
+AcquireSpinLockOrFail (
+  IN      SPIN_LOCK                 *SpinLock
+  );
+
+/**
+  Releases a spin lock.
+
+  This function places the spin lock specified by SpinLock in the release state
+  and returns SpinLock.
+
+  If SpinLock is NULL, then ASSERT().
+  If SpinLock was not initialized with InitializeSpinLock(), then ASSERT().
+
+  @param  SpinLock  A pointer to the spin lock to release.
+
+  @return SpinLock
+
+**/
+SPIN_LOCK *
+EFIAPI
+ReleaseSpinLock (
+  IN      SPIN_LOCK                 *SpinLock
+  );
+
+/**
+  Performs an atomic increment of an 32-bit unsigned integer.
+
+  Performs an atomic increment of the 32-bit unsigned integer specified by
+  Value and returns the incremented value. The increment operation must be
+  performed using MP safe mechanisms. The state of the return value is not
+  guaranteed to be MP safe.
+
+  If Value is NULL, then ASSERT().
+
+  @param  Value A pointer to the 32-bit value to increment.
+
+  @return The incremented value.
+
+**/
+UINT32
+EFIAPI
+InterlockedIncrement (
+  IN      UINT32                    *Value
+  );
+
+/**
+  Performs an atomic decrement of an 32-bit unsigned integer.
+
+  Performs an atomic decrement of the 32-bit unsigned integer specified by
+  Value and returns the decremented value. The decrement operation must be
+  performed using MP safe mechanisms. The state of the return value is not
+  guaranteed to be MP safe.
+
+  If Value is NULL, then ASSERT().
+
+  @param  Value A pointer to the 32-bit value to decrement.
+
+  @return The decremented value.
+
+**/
+UINT32
+EFIAPI
+InterlockedDecrement (
+  IN      UINT32                    *Value
+  );
+
+/**
+  Performs an atomic compare exchange operation on a 32-bit unsigned integer.
+
+  Performs an atomic compare exchange operation on the 32-bit unsigned integer
+  specified by Value.  If Value is equal to CompareValue, then Value is set to
+  ExchangeValue and CompareValue is returned.  If Value is not equal to CompareValue,
+  then Value is returned.  The compare exchange operation must be performed using
+  MP safe mechanisms.
+
+  If Value is NULL, then ASSERT().
+
+  @param  Value         A pointer to the 32-bit value for the compare exchange
+                        operation.
+  @param  CompareValue  32-bit value used in compare operation.
+  @param  ExchangeValue 32-bit value used in exchange operation.
+
+  @return The original *Value before exchange.
+
+**/
+UINT32
+EFIAPI
+InterlockedCompareExchange32 (
+  IN OUT  UINT32                    *Value,
+  IN      UINT32                    CompareValue,
+  IN      UINT32                    ExchangeValue
+  );
+
+/**
+  Performs an atomic compare exchange operation on a 64-bit unsigned integer.
+
+  Performs an atomic compare exchange operation on the 64-bit unsigned integer specified
+  by Value.  If Value is equal to CompareValue, then Value is set to ExchangeValue and
+  CompareValue is returned.  If Value is not equal to CompareValue, then Value is returned.
+  The compare exchange operation must be performed using MP safe mechanisms.
+
+  If Value is NULL, then ASSERT().
+
+  @param  Value         A pointer to the 64-bit value for the compare exchange
+                        operation.
+  @param  CompareValue  64-bit value used in compare operation.
+  @param  ExchangeValue 64-bit value used in exchange operation.
+
+  @return The original *Value before exchange.
+
+**/
+UINT64
+EFIAPI
+InterlockedCompareExchange64 (
+  IN OUT  UINT64                    *Value,
+  IN      UINT64                    CompareValue,
+  IN      UINT64                    ExchangeValue
+  );
+
+/**
+  Performs an atomic compare exchange operation on a pointer value.
+
+  Performs an atomic compare exchange operation on the pointer value specified
+  by Value. If Value is equal to CompareValue, then Value is set to
+  ExchangeValue and CompareValue is returned. If Value is not equal to
+  CompareValue, then Value is returned. The compare exchange operation must be
+  performed using MP safe mechanisms.
+
+  If Value is NULL, then ASSERT().
+
+  @param  Value         A pointer to the pointer value for the compare exchange
+                        operation.
+  @param  CompareValue  Pointer value used in compare operation.
+  @param  ExchangeValue Pointer value used in exchange operation.
+
+**/
+VOID *
+EFIAPI
+InterlockedCompareExchangePointer (
+  IN OUT  VOID                      **Value,
+  IN      VOID                      *CompareValue,
+  IN      VOID                      *ExchangeValue
+  );
+
+//
+// Base Library Checksum Functions
+//
+
+/**
+  Calculate the sum of all elements in a buffer in unit of UINT8. 
+  During calculation, the carry bits are dropped.
+
+  This function calculates the sum of all elements in a buffer 
+  in unit of UINT8. The carry bits in result of addition are dropped. 
+  The result is returned as UINT8. If Length is Zero, then Zero is 
+  returned.
+  
+  If Buffer is NULL, then ASSERT().
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). 
+
+  @param  Buffer                       Pointer to the buffer to carry out the sum operation.
+  @param  Length           The size, in bytes, of Buffer .
+
+  @return Sum         The sum of Buffer with carry bits dropped during additions.
+
+**/
+UINT8
+EFIAPI
+CalculateSum8 (
+  IN      CONST UINT8                  *Buffer,
+  IN      UINTN                                      Length
+  );
+
+
+/**
+  Returns the two's complement checksum of all elements in a buffer 
+  of 8-bit values.
+
+  This function first calculates the sum of the 8-bit values in the 
+  buffer specified by Buffer and Length.  The carry bits in the result 
+  of addition are dropped. Then, the two's complement of the sum is 
+  returned.  If Length is 0, then 0 is returned.
+  
+  If Buffer is NULL, then ASSERT().
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
+
+
+  @param  Buffer                       Pointer to the buffer to carry out the checksum operation.
+  @param  Length           The size, in bytes, of Buffer.
+
+  @return Checksum       The 2's complement checksum of Buffer.
+
+**/
+UINT8
+EFIAPI
+CalculateCheckSum8 (
+  IN      CONST UINT8                  *Buffer,
+  IN      UINTN                                      Length
+  );
+
+/**
+  Returns the sum of all elements in a buffer of 16-bit values.  During 
+  calculation, the carry bits are dropped.
+
+  This function calculates the sum of the 16-bit values in the buffer 
+  specified by Buffer and Length. The carry bits in result of addition are dropped. 
+  The 16-bit result is returned.  If Length is 0, then 0 is returned.  
+  
+  If Buffer is NULL, then ASSERT().
+  If Buffer is not aligned on a 16-bit boundary, then ASSERT().
+  If Length is not aligned on a 16-bit boundary, then ASSERT().
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
+
+  @param  Buffer                       Pointer to the buffer to carry out the sum operation.
+  @param  Length           The size, in bytes, of Buffer.
+
+  @return Sum         The sum of Buffer with carry bits dropped during additions.
+
+**/
+UINT16
+EFIAPI
+CalculateSum16 (
+  IN      CONST UINT16                 *Buffer,
+  IN      UINTN                                      Length
+  );
+
+/**
+  Returns the two's complement checksum of all elements in a buffer of 
+  16-bit values.
+
+  This function first calculates the sum of the 16-bit values in the buffer 
+  specified by Buffer and Length.  The carry bits in the result of addition 
+  are dropped. Then, the two's complement of the sum is returned.  If Length 
+  is 0, then 0 is returned.
+  
+  If Buffer is NULL, then ASSERT().
+  If Buffer is not aligned on a 16-bit boundary, then ASSERT().
+  If Length is not aligned on a 16-bit boundary, then ASSERT().
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). 
+
+  @param  Buffer                       Pointer to the buffer to carry out the checksum operation.
+  @param  Length           The size, in bytes, of Buffer.
+
+  @return Checksum       The 2's complement checksum of Buffer.
+
+**/
+UINT16
+EFIAPI
+CalculateCheckSum16 (
+  IN      CONST UINT16                 *Buffer,
+  IN      UINTN                                      Length
+  );
+
+/**
+  Returns the sum of all elements in a buffer of 32-bit values.  During 
+  calculation, the carry bits are dropped.
+
+  This function calculates the sum of the 32-bit values in the buffer 
+  specified by Buffer and Length. The carry bits in result of addition are dropped. 
+  The 32-bit result is returned.  If Length is 0, then 0 is returned.  
+  
+  If Buffer is NULL, then ASSERT().
+  If Buffer is not aligned on a 32-bit boundary, then ASSERT().
+  If Length is not aligned on a 32-bit boundary, then ASSERT().
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
+
+  @param  Buffer                       Pointer to the buffer to carry out the sum operation.
+  @param  Length           The size, in bytes, of Buffer.
+
+  @return Sum         The sum of Buffer with carry bits dropped during additions.
+
+**/
+UINT32
+EFIAPI
+CalculateSum32 (
+  IN      CONST UINT32                 *Buffer,
+  IN      UINTN                                      Length
+  );
+
+/**
+  Returns the two's complement checksum of all elements in a buffer of 
+  32-bit values.
+
+  This function first calculates the sum of the 32-bit values in the buffer 
+  specified by Buffer and Length.  The carry bits in the result of addition 
+  are dropped. Then, the two's complement of the sum is returned.  If Length 
+  is 0, then 0 is returned.
+  
+  If Buffer is NULL, then ASSERT().
+  If Buffer is not aligned on a 32-bit boundary, then ASSERT().
+  If Length is not aligned on a 32-bit boundary, then ASSERT().
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). 
+
+  @param  Buffer                       Pointer to the buffer to carry out the checksum operation.
+  @param  Length           The size, in bytes, of Buffer.
+
+  @return Checksum       The 2's complement checksum of Buffer.
+
+**/
+UINT32
+EFIAPI
+CalculateCheckSum32 (
+  IN      CONST UINT32                 *Buffer,
+  IN      UINTN                                      Length
+  );
+
+/**
+  Returns the sum of all elements in a buffer of 64-bit values.  During 
+  calculation, the carry bits are dropped.
+
+  This function calculates the sum of the 64-bit values in the buffer 
+  specified by Buffer and Length. The carry bits in result of addition are dropped. 
+  The 64-bit result is returned.  If Length is 0, then 0 is returned.  
+  
+  If Buffer is NULL, then ASSERT().
+  If Buffer is not aligned on a 64-bit boundary, then ASSERT().
+  If Length is not aligned on a 64-bit boundary, then ASSERT().
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
+
+  @param  Buffer                       Pointer to the buffer to carry out the sum operation.
+  @param  Length           The size, in bytes, of Buffer.
+
+  @return Sum         The sum of Buffer with carry bits dropped during additions.
+
+**/
+UINT64
+EFIAPI
+CalculateSum64 (
+  IN      CONST UINT64                 *Buffer,
+  IN      UINTN                                      Length
+  );
+
+/**
+  Returns the two's complement checksum of all elements in a buffer of 
+  64-bit values.
+
+  This function first calculates the sum of the 64-bit values in the buffer 
+  specified by Buffer and Length.  The carry bits in the result of addition 
+  are dropped. Then, the two's complement of the sum is returned.  If Length 
+  is 0, then 0 is returned.
+  
+  If Buffer is NULL, then ASSERT().
+  If Buffer is not aligned on a 64-bit boundary, then ASSERT().
+  If Length is not aligned on a 64-bit boundary, then ASSERT().
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). 
+
+  @param  Buffer                       Pointer to the buffer to carry out the checksum operation.
+  @param  Length           The size, in bytes, of Buffer.
+
+  @return Checksum       The 2's complement checksum of Buffer.
+
+**/
+UINT64
+EFIAPI
+CalculateCheckSum64 (
+  IN      CONST UINT64                 *Buffer,
+  IN      UINTN                                      Length
+  );
+
+//
+// Base Library CPU Functions
+//
+typedef
+VOID
+(EFIAPI *SWITCH_STACK_ENTRY_POINT) (
+  IN      VOID                      *Context1,  OPTIONAL
+  IN      VOID                      *Context2   OPTIONAL
+  );
+
+/**
+  Used to serialize load and store operations.
+
+  All loads and stores that proceed calls to this function are guaranteed to be
+  globally visible when this function returns.
+
+**/
+VOID
+EFIAPI
+MemoryFence (
+  VOID
+  );
+
+/**
+  Saves the current CPU context that can be restored with a call to LongJump()
+  and returns 0.
+
+  Saves the current CPU context in the buffer specified by JumpBuffer and
+  returns 0. The initial call to SetJump() must always return 0. Subsequent
+  calls to LongJump() cause a non-zero value to be returned by SetJump().
+
+  If JumpBuffer is NULL, then ASSERT().
+  For IPF CPUs, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().
+
+  @param  JumpBuffer  A pointer to CPU context buffer.
+
+  @retval 0 Indicates a return from SetJump().
+
+**/
+UINTN
+EFIAPI
+SetJump (
+  OUT     BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer
+  );
+
+/**
+  Restores the CPU context that was saved with SetJump().
+
+  Restores the CPU context from the buffer specified by JumpBuffer. This
+  function never returns to the caller. Instead is resumes execution based on
+  the state of JumpBuffer.
+
+  If JumpBuffer is NULL, then ASSERT().
+  For IPF CPUs, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().
+  If Value is 0, then ASSERT().
+
+  @param  JumpBuffer  A pointer to CPU context buffer.
+  @param  Value       The value to return when the SetJump() context is
+                      restored and must be non-zero.
+
+**/
+VOID
+EFIAPI
+LongJump (
+  IN      BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer,
+  IN      UINTN                     Value
+  );
+
+/**
+  Enables CPU interrupts.
+
+  Enables CPU interrupts.
+
+**/
+VOID
+EFIAPI
+EnableInterrupts (
+  VOID
+  );
+
+/**
+  Disables CPU interrupts.
+
+  Disables CPU interrupts.
+
+**/
+VOID
+EFIAPI
+DisableInterrupts (
+  VOID
+  );
+
+/**
+  Disables CPU interrupts and returns the interrupt state prior to the disable
+  operation.
+
+  Disables CPU interrupts and returns the interrupt state prior to the disable
+  operation.
+
+  @retval TRUE  CPU interrupts were enabled on entry to this call.
+  @retval FALSE CPU interrupts were disabled on entry to this call.
+
+**/
+BOOLEAN
+EFIAPI
+SaveAndDisableInterrupts (
+  VOID
+  );
+
+/**
+  Enables CPU interrupts for the smallest window required to capture any
+  pending interrupts.
+
+  Enables CPU interrupts for the smallest window required to capture any
+  pending interrupts.
+
+**/
+VOID
+EFIAPI
+EnableDisableInterrupts (
+  VOID
+  );
+
+/**
+  Retrieves the current CPU interrupt state.
+
+  Retrieves the current CPU interrupt state. Returns TRUE is interrupts are
+  currently enabled. Otherwise returns FALSE.
+
+  @retval TRUE  CPU interrupts are enabled.
+  @retval FALSE CPU interrupts are disabled.
+
+**/
+BOOLEAN
+EFIAPI
+GetInterruptState (
+  VOID
+  );
+
+/**
+  Set the current CPU interrupt state.
+
+  Sets the current CPU interrupt state to the state specified by
+  InterruptState. If InterruptState is TRUE, then interrupts are enabled. If
+  InterruptState is FALSE, then interrupts are disabled. InterruptState is
+  returned.
+
+  @param  InterruptState  TRUE if interrupts should enabled. FALSE if
+                          interrupts should be disabled.
+
+  @return InterruptState
+
+**/
+BOOLEAN
+EFIAPI
+SetInterruptState (
+  IN      BOOLEAN                   InterruptState
+  );
+
+/**
+  Places the CPU in a sleep state until an interrupt is received.
+
+  Places the CPU in a sleep state until an interrupt is received. If interrupts
+  are disabled prior to calling this function, then the CPU will be placed in a
+  sleep state indefinitely.
+
+**/
+VOID
+EFIAPI
+CpuSleep (
+  VOID
+  );
+
+/**
+  Requests CPU to pause for a short period of time.
+
+  Requests CPU to pause for a short period of time. Typically used in MP
+  systems to prevent memory starvation while waiting for a spin lock.
+
+**/
+VOID
+EFIAPI
+CpuPause (
+  VOID
+  );
+
+/**
+  Flushes all the Translation Lookaside Buffers(TLB) entries in a CPU.
+
+  Flushes all the Translation Lookaside Buffers(TLB) entries in a CPU.
+
+**/
+VOID
+EFIAPI
+CpuFlushTlb (
+  VOID
+  );
+
+/**
+  Transfers control to a function starting with a new stack.
+
+  Transfers control to the function specified by EntryPoint using the new stack
+  specified by NewStack and passing in the parameters specified by Context1 and
+  Context2. Context1 and Context2 are optional and may be NULL. The function
+  EntryPoint must never return.
+
+  If EntryPoint is NULL, then ASSERT().
+  If NewStack is NULL, then ASSERT().
+
+  @param  EntryPoint  A pointer to function to call with the new stack.
+  @param  Context1    A pointer to the context to pass into the EntryPoint
+                      function.
+  @param  Context2    A pointer to the context to pass into the EntryPoint
+                      function.
+  @param  NewStack    A pointer to the new stack to use for the EntryPoint
+                      function.
+
+**/
+VOID
+EFIAPI
+SwitchStack (
+  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
+  IN      VOID                      *Context1,  OPTIONAL
+  IN      VOID                      *Context2,  OPTIONAL
+  IN      VOID                      *NewStack
+  );
+
+/**
+  Generates a breakpoint on the CPU.
+
+  Generates a breakpoint on the CPU. The breakpoint must be implemented such
+  that code can resume normal execution after the breakpoint.
+
+**/
+VOID
+EFIAPI
+CpuBreakpoint (
+  VOID
+  );
+
+/**
+  Executes an infinite loop.
+
+  Forces the CPU to execute an infinite loop. A debugger may be used to skip
+  past the loop and the code that follows the loop must execute properly. This
+  implies that the infinite loop must not cause the code that follow it to be
+  optimized away.
+
+**/
+VOID
+EFIAPI
+CpuDeadLoop (
+  VOID
+  );
+
+//
+// IA32 and X64 Specific Functions
+//
+//
+// Byte packed structure for 16-bit Real Mode EFLAGS
+//
+typedef union {
+  struct {
+    UINT32  CF:1;           // Carry Flag
+    UINT32  Reserved_0:1;   // Reserved
+    UINT32  PF:1;           // Parity Flag
+    UINT32  Reserved_1:1;   // Reserved
+    UINT32  AF:1;           // Auxiliary Carry Flag
+    UINT32  Reserved_2:1;   // Reserved
+    UINT32  ZF:1;           // Zero Flag
+    UINT32  SF:1;           // Sign Flag
+    UINT32  TF:1;           // Trap Flag
+    UINT32  IF:1;           // Interrupt Enable Flag
+    UINT32  DF:1;           // Direction Flag
+    UINT32  OF:1;           // Overflow Flag
+    UINT32  IOPL:2;         // I/O Privilege Level
+    UINT32  NT:1;           // Nested Task
+    UINT32  Reserved_3:1;   // Reserved
+  } Bits;
+  UINT16    Uint16;
+} IA32_FLAGS16;
+
+//
+// Byte packed structure for EFLAGS/RFLAGS
+// 32-bits on IA-32
+// 64-bits on X64.  The upper 32-bits on X64 are reserved
+//
+typedef union {
+  struct {
+    UINT32  CF:1;           // Carry Flag
+    UINT32  Reserved_0:1;   // Reserved
+    UINT32  PF:1;           // Parity Flag
+    UINT32  Reserved_1:1;   // Reserved
+    UINT32  AF:1;           // Auxiliary Carry Flag
+    UINT32  Reserved_2:1;   // Reserved
+    UINT32  ZF:1;           // Zero Flag
+    UINT32  SF:1;           // Sign Flag
+    UINT32  TF:1;           // Trap Flag
+    UINT32  IF:1;           // Interrupt Enable Flag
+    UINT32  DF:1;           // Direction Flag
+    UINT32  OF:1;           // Overflow Flag
+    UINT32  IOPL:2;         // I/O Privilege Level
+    UINT32  NT:1;           // Nested Task
+    UINT32  Reserved_3:1;   // Reserved
+    UINT32  RF:1;           // Resume Flag
+    UINT32  VM:1;           // Virtual 8086 Mode
+    UINT32  AC:1;           // Alignment Check
+    UINT32  VIF:1;          // Virtual Interrupt Flag
+    UINT32  VIP:1;          // Virtual Interrupt Pending
+    UINT32  ID:1;           // ID Flag
+    UINT32  Reserved_4:10;  // Reserved
+  } Bits;
+  UINTN     UintN;
+} IA32_EFLAGS32;
+
+//
+// Byte packed structure for Control Register 0 (CR0)
+// 32-bits on IA-32
+// 64-bits on X64.  The upper 32-bits on X64 are reserved
+//
+typedef union {
+  struct {
+    UINT32  PE:1;           // Protection Enable
+    UINT32  MP:1;           // Monitor Coprocessor
+    UINT32  EM:1;           // Emulation
+    UINT32  TS:1;           // Task Switched
+    UINT32  ET:1;           // Extension Type
+    UINT32  NE:1;           // Numeric Error
+    UINT32  Reserved_0:10;  // Reserved
+    UINT32  WP:1;           // Write Protect
+    UINT32  Reserved_1:1;   // Reserved
+    UINT32  AM:1;           // Alignment Mask
+    UINT32  Reserved_2:10;  // Reserved
+    UINT32  NW:1;           // Mot Write-through
+    UINT32  CD:1;           // Cache Disable
+    UINT32  PG:1;           // Paging
+  } Bits;
+  UINTN     UintN;
+} IA32_CR0;
+
+//
+// Byte packed structure for Control Register 4 (CR4)
+// 32-bits on IA-32
+// 64-bits on X64.  The upper 32-bits on X64 are reserved
+//
+typedef union {
+  struct {
+    UINT32  VME:1;          // Virtual-8086 Mode Extensions
+    UINT32  PVI:1;          // Protected-Mode Virtual Interrupts
+    UINT32  TSD:1;          // Time Stamp Disable
+    UINT32  DE:1;           // Debugging Extensions
+    UINT32  PSE:1;          // Page Size Extensions
+    UINT32  PAE:1;          // Physical Address Extension
+    UINT32  MCE:1;          // Machine Check Enable
+    UINT32  PGE:1;          // Page Global Enable
+    UINT32  PCE:1;          // Performance Monitoring Counter
+                            // Enable
+    UINT32  OSFXSR:1;       // Operating System Support for
+                            // FXSAVE and FXRSTOR instructions
+    UINT32  OSXMMEXCPT:1;   // Operating System Support for
+                            // Unmasked SIMD Floating Point
+                            // Exceptions
+    UINT32  Reserved_0:2;   // Reserved
+    UINT32  VMXE:1;         // VMX Enable
+    UINT32  Reserved_1:18;  // Reseved
+  } Bits;
+  UINTN     UintN;
+} IA32_CR4;
+
+//
+// Byte packed structure for an IDTR, GDTR, LDTR descriptor
+/// @bug  How to make this structure byte-packed in a compiler independent way?
+//
+#pragma pack (1)
+typedef struct {
+  UINT16  Limit;
+  UINTN   Base;
+} IA32_DESCRIPTOR;
+#pragma pack ()
+
+#define IA32_IDT_GATE_TYPE_TASK          0x85
+#define IA32_IDT_GATE_TYPE_INTERRUPT_16  0x86
+#define IA32_IDT_GATE_TYPE_TRAP_16       0x87
+#define IA32_IDT_GATE_TYPE_INTERRUPT_32  0x8E
+#define IA32_IDT_GATE_TYPE_TRAP_32       0x8F
+
+//
+// Byte packed structure for an Interrupt Gate Descriptor
+//
+typedef union {
+  struct {
+    UINT32  OffsetLow:16;   // Offset bits 15..0
+    UINT32  Selector:16;    // Selector
+    UINT32  Reserved_0:8;   // Reserved
+    UINT32  GateType:8;     // Gate Type.  See #defines above
+    UINT32  OffsetHigh:16;  // Offset bits 31..16
+  } Bits;
+  UINT64  Uint64;
+} IA32_IDT_GATE_DESCRIPTOR;
+
+//
+// Byte packed structure for an FP/SSE/SSE2 context
+//
+typedef struct {
+  UINT8  Buffer[512];
+} IA32_FX_BUFFER;
+
+//
+// Structures for the 16-bit real mode thunks
+//
+typedef struct {
+  UINT32                            Reserved1;
+  UINT32                            Reserved2;
+  UINT32                            Reserved3;
+  UINT32                            Reserved4;
+  UINT8                             BL;
+  UINT8                             BH;
+  UINT16                            Reserved5;
+  UINT8                             DL;
+  UINT8                             DH;
+  UINT16                            Reserved6;
+  UINT8                             CL;
+  UINT8                             CH;
+  UINT16                            Reserved7;
+  UINT8                             AL;
+  UINT8                             AH;
+  UINT16                            Reserved8;
+} IA32_BYTE_REGS;
+
+typedef struct {
+  UINT16                            DI;
+  UINT16                            Reserved1;
+  UINT16                            SI;
+  UINT16                            Reserved2;
+  UINT16                            BP;
+  UINT16                            Reserved3;
+  UINT16                            SP;
+  UINT16                            Reserved4;
+  UINT16                            BX;
+  UINT16                            Reserved5;
+  UINT16                            DX;
+  UINT16                            Reserved6;
+  UINT16                            CX;
+  UINT16                            Reserved7;
+  UINT16                            AX;
+  UINT16                            Reserved8;
+} IA32_WORD_REGS;
+
+typedef struct {
+  UINT32                            EDI;
+  UINT32                            ESI;
+  UINT32                            EBP;
+  UINT32                            ESP;
+  UINT32                            EBX;
+  UINT32                            EDX;
+  UINT32                            ECX;
+  UINT32                            EAX;
+  UINT16                            DS;
+  UINT16                            ES;
+  UINT16                            FS;
+  UINT16                            GS;
+  IA32_EFLAGS32                     EFLAGS;
+  UINT32                            Eip;
+  UINT16                            CS;
+  UINT16                            SS;
+} IA32_DWORD_REGS;
+
+typedef union {
+  IA32_DWORD_REGS                   E;
+  IA32_WORD_REGS                    X;
+  IA32_BYTE_REGS                    H;
+} IA32_REGISTER_SET;
+
+//
+// Byte packed structure for an 16-bit real mode thunks
+//
+typedef struct {
+  IA32_REGISTER_SET                 *RealModeState;
+  VOID                              *RealModeBuffer;
+  UINT32                            RealModeBufferSize;
+  UINT32                            ThunkAttributes;
+} THUNK_CONTEXT;
+
+#define THUNK_ATTRIBUTE_BIG_REAL_MODE             0x00000001
+#define THUNK_ATTRIBUTE_DISABLE_A20_MASK_INT_15   0x00000002
+#define THUNK_ATTRIBUTE_DISABLE_A20_MASK_KBD_CTRL 0x00000004
+
+/**
+  Retrieves CPUID information.
+
+  Executes the CPUID instruction with EAX set to the value specified by Index.
+  This function always returns Index.
+  If Eax is not NULL, then the value of EAX after CPUID is returned in Eax.
+  If Ebx is not NULL, then the value of EBX after CPUID is returned in Ebx.
+  If Ecx is not NULL, then the value of ECX after CPUID is returned in Ecx.
+  If Edx is not NULL, then the value of EDX after CPUID is returned in Edx.
+  This function is only available on IA-32 and X64.
+
+  @param  Index The 32-bit value to load into EAX prior to invoking the CPUID
+                instruction.
+  @param  Eax   Pointer to the 32-bit EAX value returned by the CPUID
+                instruction. This is an optional parameter that may be NULL.
+  @param  Ebx   Pointer to the 32-bit EBX value returned by the CPUID
+                instruction. This is an optional parameter that may be NULL.
+  @param  Ecx   Pointer to the 32-bit ECX value returned by the CPUID
+                instruction. This is an optional parameter that may be NULL.
+  @param  Edx   Pointer to the 32-bit EDX value returned by the CPUID
+                instruction. This is an optional parameter that may be NULL.
+
+  @return Index
+
+**/
+UINT32
+EFIAPI
+AsmCpuid (
+  IN      UINT32                    Index,
+  OUT     UINT32                    *Eax,  OPTIONAL
+  OUT     UINT32                    *Ebx,  OPTIONAL
+  OUT     UINT32                    *Ecx,  OPTIONAL
+  OUT     UINT32                    *Edx   OPTIONAL
+  );
+
+/**
+  Retrieves CPUID information using an extended leaf identifier.
+
+  Executes the CPUID instruction with EAX set to the value specified by Index
+  and ECX set to the value specified by SubIndex. This function always returns
+  Index. This function is only available on IA-32 and x64.
+
+  If Eax is not NULL, then the value of EAX after CPUID is returned in Eax.
+  If Ebx is not NULL, then the value of EBX after CPUID is returned in Ebx.
+  If Ecx is not NULL, then the value of ECX after CPUID is returned in Ecx.
+  If Edx is not NULL, then the value of EDX after CPUID is returned in Edx.
+
+  @param  Index     The 32-bit value to load into EAX prior to invoking the
+                    CPUID instruction.
+  @param  SubIndex  The 32-bit value to load into ECX prior to invoking the
+                    CPUID instruction.
+  @param  Eax       Pointer to the 32-bit EAX value returned by the CPUID
+                    instruction. This is an optional parameter that may be
+                    NULL.
+  @param  Ebx       Pointer to the 32-bit EBX value returned by the CPUID
+                    instruction. This is an optional parameter that may be
+                    NULL.
+  @param  Ecx       Pointer to the 32-bit ECX value returned by the CPUID
+                    instruction. This is an optional parameter that may be
+                    NULL.
+  @param  Edx       Pointer to the 32-bit EDX value returned by the CPUID
+                    instruction. This is an optional parameter that may be
+                    NULL.
+
+  @return Index
+
+**/
+UINT32
+EFIAPI
+AsmCpuidEx (
+  IN      UINT32                    Index,
+  IN      UINT32                    SubIndex,
+  OUT     UINT32                    *Eax,  OPTIONAL
+  OUT     UINT32                    *Ebx,  OPTIONAL
+  OUT     UINT32                    *Ecx,  OPTIONAL
+  OUT     UINT32                    *Edx   OPTIONAL
+  );
+
+/**
+  Returns the lower 32-bits of a Machine Specific Register(MSR).
+
+  Reads and returns the lower 32-bits of the MSR specified by Index.
+  No parameter checking is performed on Index, and some Index values may cause
+  CPU exceptions. The caller must either guarantee that Index is valid, or the
+  caller must set up exception handlers to catch the exceptions. This function
+  is only available on IA-32 and X64.
+
+  @param  Index The 32-bit MSR index to read.
+
+  @return The lower 32 bits of the MSR identified by Index.
+
+**/
+UINT32
+EFIAPI
+AsmReadMsr32 (
+  IN      UINT32                    Index
+  );
+
+/**
+  Zero-extend a 32-bit value and writes it to a Machine Specific Register(MSR).
+
+  Writes the 32-bit value specified by Value to the MSR specified by Index. The
+  upper 32-bits of the MSR write are set to zero. The 32-bit value written to
+  the MSR is returned. No parameter checking is performed on Index or Value,
+  and some of these may cause CPU exceptions. The caller must either guarantee
+  that Index and Value are valid, or the caller must establish proper exception
+  handlers. This function is only available on IA-32 and X64.
+
+  @param  Index The 32-bit MSR index to write.
+  @param  Value The 32-bit value to write to the MSR.
+
+  @return Value
+
+**/
+UINT32
+EFIAPI
+AsmWriteMsr32 (
+  IN      UINT32                    Index,
+  IN      UINT32                    Value
+  );
+
+/**
+  Reads a 64-bit MSR, performs a bitwise inclusive OR on the lower 32-bits, and
+  writes the result back to the 64-bit MSR.
+
+  Reads the 64-bit MSR specified by Index, performs a bitwise inclusive OR
+  between the lower 32-bits of the read result and the value specified by
+  OrData, and writes the result to the 64-bit MSR specified by Index. The lower
+  32-bits of the value written to the MSR is returned. No parameter checking is
+  performed on Index or OrData, and some of these may cause CPU exceptions. The
+  caller must either guarantee that Index and OrData are valid, or the caller
+  must establish proper exception handlers. This function is only available on
+  IA-32 and X64.
+
+  @param  Index   The 32-bit MSR index to write.
+  @param  OrData  The value to OR with the read value from the MSR.
+
+  @return The lower 32-bit value written to the MSR.
+
+**/
+UINT32
+EFIAPI
+AsmMsrOr32 (
+  IN      UINT32                    Index,
+  IN      UINT32                    OrData
+  );
+
+/**
+  Reads a 64-bit MSR, performs a bitwise AND on the lower 32-bits, and writes
+  the result back to the 64-bit MSR.
+
+  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
+  lower 32-bits of the read result and the value specified by AndData, and
+  writes the result to the 64-bit MSR specified by Index. The lower 32-bits of
+  the value written to the MSR is returned. No parameter checking is performed
+  on Index or AndData, and some of these may cause CPU exceptions. The caller
+  must either guarantee that Index and AndData are valid, or the caller must
+  establish proper exception handlers. This function is only available on IA-32
+  and X64.
+
+  @param  Index   The 32-bit MSR index to write.
+  @param  AndData The value to AND with the read value from the MSR.
+
+  @return The lower 32-bit value written to the MSR.
+
+**/
+UINT32
+EFIAPI
+AsmMsrAnd32 (
+  IN      UINT32                    Index,
+  IN      UINT32                    AndData
+  );
+
+/**
+  Reads a 64-bit MSR, performs a bitwise AND followed by a bitwise inclusive OR
+  on the lower 32-bits, and writes the result back to the 64-bit MSR.
+
+  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
+  lower 32-bits of the read result and the value specified by AndData
+  preserving the upper 32-bits, performs a bitwise inclusive OR between the
+  result of the AND operation and the value specified by OrData, and writes the
+  result to the 64-bit MSR specified by Address. The lower 32-bits of the value
+  written to the MSR is returned. No parameter checking is performed on Index,
+  AndData, or OrData, and some of these may cause CPU exceptions. The caller
+  must either guarantee that Index, AndData, and OrData are valid, or the
+  caller must establish proper exception handlers. This function is only
+  available on IA-32 and X64.
+
+  @param  Index   The 32-bit MSR index to write.
+  @param  AndData The value to AND with the read value from the MSR.
+  @param  OrData  The value to OR with the result of the AND operation.
+
+  @return The lower 32-bit value written to the MSR.
+
+**/
+UINT32
+EFIAPI
+AsmMsrAndThenOr32 (
+  IN      UINT32                    Index,
+  IN      UINT32                    AndData,
+  IN      UINT32                    OrData
+  );
+
+/**
+  Reads a bit field of an MSR.
+
+  Reads the bit field in the lower 32-bits of a 64-bit MSR. The bit field is
+  specified by the StartBit and the EndBit. The value of the bit field is
+  returned. The caller must either guarantee that Index is valid, or the caller
+  must set up exception handlers to catch the exceptions. This function is only
+  available on IA-32 and X64.
+
+  If StartBit is greater than 31, then ASSERT().
+  If EndBit is greater than 31, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Index     The 32-bit MSR index to read.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..31.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..31.
+
+  @return The bit field read from the MSR.
+
+**/
+UINT32
+EFIAPI
+AsmMsrBitFieldRead32 (
+  IN      UINT32                    Index,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit
+  );
+
+/**
+  Writes a bit field to an MSR.
+
+  Writes Value to a bit field in the lower 32-bits of a  64-bit MSR. The bit
+  field is specified by the StartBit and the EndBit. All other bits in the
+  destination MSR are preserved. The lower 32-bits of the MSR written is
+  returned. Extra left bits in Value are stripped. The caller must either
+  guarantee that Index and the data written is valid, or the caller must set up
+  exception handlers to catch the exceptions. This function is only available
+  on IA-32 and X64.
+
+  If StartBit is greater than 31, then ASSERT().
+  If EndBit is greater than 31, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Index     The 32-bit MSR index to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..31.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..31.
+  @param  Value     New value of the bit field.
+
+  @return The lower 32-bit of the value written to the MSR.
+
+**/
+UINT32
+EFIAPI
+AsmMsrBitFieldWrite32 (
+  IN      UINT32                    Index,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT32                    Value
+  );
+
+/**
+  Reads a bit field in a 64-bit MSR, performs a bitwise OR, and writes the
+  result back to the bit field in the 64-bit MSR.
+
+  Reads the 64-bit MSR specified by Index, performs a bitwise inclusive OR
+  between the read result and the value specified by OrData, and writes the
+  result to the 64-bit MSR specified by Index. The lower 32-bits of the value
+  written to the MSR are returned. Extra left bits in OrData are stripped. The
+  caller must either guarantee that Index and the data written is valid, or
+  the caller must set up exception handlers to catch the exceptions. This
+  function is only available on IA-32 and X64.
+
+  If StartBit is greater than 31, then ASSERT().
+  If EndBit is greater than 31, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Index     The 32-bit MSR index to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..31.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..31.
+  @param  OrData    The value to OR with the read value from the MSR.
+
+  @return The lower 32-bit of the value written to the MSR.
+
+**/
+UINT32
+EFIAPI
+AsmMsrBitFieldOr32 (
+  IN      UINT32                    Index,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT32                    OrData
+  );
+
+/**
+  Reads a bit field in a 64-bit MSR, performs a bitwise AND, and writes the
+  result back to the bit field in the 64-bit MSR.
+
+  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
+  read result and the value specified by AndData, and writes the result to the
+  64-bit MSR specified by Index. The lower 32-bits of the value written to the
+  MSR are returned. Extra left bits in AndData are stripped. The caller must
+  either guarantee that Index and the data written is valid, or the caller must
+  set up exception handlers to catch the exceptions. This function is only
+  available on IA-32 and X64.
+
+  If StartBit is greater than 31, then ASSERT().
+  If EndBit is greater than 31, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Index     The 32-bit MSR index to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..31.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..31.
+  @param  AndData   The value to AND with the read value from the MSR.
+
+  @return The lower 32-bit of the value written to the MSR.
+
+**/
+UINT32
+EFIAPI
+AsmMsrBitFieldAnd32 (
+  IN      UINT32                    Index,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT32                    AndData
+  );
+
+/**
+  Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a
+  bitwise inclusive OR, and writes the result back to the bit field in the
+  64-bit MSR.
+
+  Reads the 64-bit MSR specified by Index, performs a bitwise AND followed by a
+  bitwise inclusive OR between the read result and the value specified by
+  AndData, and writes the result to the 64-bit MSR specified by Index. The
+  lower 32-bits of the value written to the MSR are returned. Extra left bits
+  in both AndData and OrData are stripped. The caller must either guarantee
+  that Index and the data written is valid, or the caller must set up exception
+  handlers to catch the exceptions. This function is only available on IA-32
+  and X64.
+
+  If StartBit is greater than 31, then ASSERT().
+  If EndBit is greater than 31, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Index     The 32-bit MSR index to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..31.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..31.
+  @param  AndData   The value to AND with the read value from the MSR.
+  @param  OrData    The value to OR with the result of the AND operation.
+
+  @return The lower 32-bit of the value written to the MSR.
+
+**/
+UINT32
+EFIAPI
+AsmMsrBitFieldAndThenOr32 (
+  IN      UINT32                    Index,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT32                    AndData,
+  IN      UINT32                    OrData
+  );
+
+/**
+  Returns a 64-bit Machine Specific Register(MSR).
+
+  Reads and returns the 64-bit MSR specified by Index. No parameter checking is
+  performed on Index, and some Index values may cause CPU exceptions. The
+  caller must either guarantee that Index is valid, or the caller must set up
+  exception handlers to catch the exceptions. This function is only available
+  on IA-32 and X64.
+
+  @param  Index The 32-bit MSR index to read.
+
+  @return The value of the MSR identified by Index.
+
+**/
+UINT64
+EFIAPI
+AsmReadMsr64 (
+  IN      UINT32                    Index
+  );
+
+/**
+  Writes a 64-bit value to a Machine Specific Register(MSR), and returns the
+  value.
+
+  Writes the 64-bit value specified by Value to the MSR specified by Index. The
+  64-bit value written to the MSR is returned. No parameter checking is
+  performed on Index or Value, and some of these may cause CPU exceptions. The
+  caller must either guarantee that Index and Value are valid, or the caller
+  must establish proper exception handlers. This function is only available on
+  IA-32 and X64.
+
+  @param  Index The 32-bit MSR index to write.
+  @param  Value The 64-bit value to write to the MSR.
+
+  @return Value
+
+**/
+UINT64
+EFIAPI
+AsmWriteMsr64 (
+  IN      UINT32                    Index,
+  IN      UINT64                    Value
+  );
+
+/**
+  Reads a 64-bit MSR, performs a bitwise inclusive OR, and writes the result
+  back to the 64-bit MSR.
+
+  Reads the 64-bit MSR specified by Index, performs a bitwise inclusive OR
+  between the read result and the value specified by OrData, and writes the
+  result to the 64-bit MSR specified by Index. The value written to the MSR is
+  returned. No parameter checking is performed on Index or OrData, and some of
+  these may cause CPU exceptions. The caller must either guarantee that Index
+  and OrData are valid, or the caller must establish proper exception handlers.
+  This function is only available on IA-32 and X64.
+
+  @param  Index   The 32-bit MSR index to write.
+  @param  OrData  The value to OR with the read value from the MSR.
+
+  @return The value written back to the MSR.
+
+**/
+UINT64
+EFIAPI
+AsmMsrOr64 (
+  IN      UINT32                    Index,
+  IN      UINT64                    OrData
+  );
+
+/**
+  Reads a 64-bit MSR, performs a bitwise AND, and writes the result back to the
+  64-bit MSR.
+
+  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
+  read result and the value specified by OrData, and writes the result to the
+  64-bit MSR specified by Index. The value written to the MSR is returned. No
+  parameter checking is performed on Index or OrData, and some of these may
+  cause CPU exceptions. The caller must either guarantee that Index and OrData
+  are valid, or the caller must establish proper exception handlers. This
+  function is only available on IA-32 and X64.
+
+  @param  Index   The 32-bit MSR index to write.
+  @param  AndData The value to AND with the read value from the MSR.
+
+  @return The value written back to the MSR.
+
+**/
+UINT64
+EFIAPI
+AsmMsrAnd64 (
+  IN      UINT32                    Index,
+  IN      UINT64                    AndData
+  );
+
+/**
+  Reads a 64-bit MSR, performs a bitwise AND followed by a bitwise inclusive
+  OR, and writes the result back to the 64-bit MSR.
+
+  Reads the 64-bit MSR specified by Index, performs a bitwise AND between read
+  result and the value specified by AndData, performs a bitwise inclusive OR
+  between the result of the AND operation and the value specified by OrData,
+  and writes the result to the 64-bit MSR specified by Index. The value written
+  to the MSR is returned. No parameter checking is performed on Index, AndData,
+  or OrData, and some of these may cause CPU exceptions. The caller must either
+  guarantee that Index, AndData, and OrData are valid, or the caller must
+  establish proper exception handlers. This function is only available on IA-32
+  and X64.
+
+  @param  Index   The 32-bit MSR index to write.
+  @param  AndData The value to AND with the read value from the MSR.
+  @param  OrData  The value to OR with the result of the AND operation.
+
+  @return The value written back to the MSR.
+
+**/
+UINT64
+EFIAPI
+AsmMsrAndThenOr64 (
+  IN      UINT32                    Index,
+  IN      UINT64                    AndData,
+  IN      UINT64                    OrData
+  );
+
+/**
+  Reads a bit field of an MSR.
+
+  Reads the bit field in the 64-bit MSR. The bit field is specified by the
+  StartBit and the EndBit. The value of the bit field is returned. The caller
+  must either guarantee that Index is valid, or the caller must set up
+  exception handlers to catch the exceptions. This function is only available
+  on IA-32 and X64.
+
+  If StartBit is greater than 63, then ASSERT().
+  If EndBit is greater than 63, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Index     The 32-bit MSR index to read.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..63.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..63.
+
+  @return The value read from the MSR.
+
+**/
+UINT64
+EFIAPI
+AsmMsrBitFieldRead64 (
+  IN      UINT32                    Index,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit
+  );
+
+/**
+  Writes a bit field to an MSR.
+
+  Writes Value to a bit field in a 64-bit MSR. The bit field is specified by
+  the StartBit and the EndBit. All other bits in the destination MSR are
+  preserved. The MSR written is returned. Extra left bits in Value are
+  stripped. The caller must either guarantee that Index and the data written is
+  valid, or the caller must set up exception handlers to catch the exceptions.
+  This function is only available on IA-32 and X64.
+
+  If StartBit is greater than 63, then ASSERT().
+  If EndBit is greater than 63, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Index     The 32-bit MSR index to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..63.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..63.
+  @param  Value     New value of the bit field.
+
+  @return The value written back to the MSR.
+
+**/
+UINT64
+EFIAPI
+AsmMsrBitFieldWrite64 (
+  IN      UINT32                    Index,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT64                    Value
+  );
+
+/**
+  Reads a bit field in a 64-bit MSR, performs a bitwise inclusive OR, and
+  writes the result back to the bit field in the 64-bit MSR.
+
+  Reads the 64-bit MSR specified by Index, performs a bitwise inclusive OR
+  between the read result and the value specified by OrData, and writes the
+  result to the 64-bit MSR specified by Index. The value written to the MSR is
+  returned. Extra left bits in OrData are stripped. The caller must either
+  guarantee that Index and the data written is valid, or the caller must set up
+  exception handlers to catch the exceptions. This function is only available
+  on IA-32 and X64.
+
+  If StartBit is greater than 63, then ASSERT().
+  If EndBit is greater than 63, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Index     The 32-bit MSR index to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..63.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..63.
+  @param  OrData    The value to OR with the read value from the bit field.
+
+  @return The value written back to the MSR.
+
+**/
+UINT64
+EFIAPI
+AsmMsrBitFieldOr64 (
+  IN      UINT32                    Index,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT64                    OrData
+  );
+
+/**
+  Reads a bit field in a 64-bit MSR, performs a bitwise AND, and writes the
+  result back to the bit field in the 64-bit MSR.
+
+  Reads the 64-bit MSR specified by Index, performs a bitwise AND between the
+  read result and the value specified by AndData, and writes the result to the
+  64-bit MSR specified by Index. The value written to the MSR is returned.
+  Extra left bits in AndData are stripped. The caller must either guarantee
+  that Index and the data written is valid, or the caller must set up exception
+  handlers to catch the exceptions. This function is only available on IA-32
+  and X64.
+
+  If StartBit is greater than 63, then ASSERT().
+  If EndBit is greater than 63, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Index     The 32-bit MSR index to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..63.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..63.
+  @param  AndData   The value to AND with the read value from the bit field.
+
+  @return The value written back to the MSR.
+
+**/
+UINT64
+EFIAPI
+AsmMsrBitFieldAnd64 (
+  IN      UINT32                    Index,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT64                    AndData
+  );
+
+/**
+  Reads a bit field in a 64-bit MSR, performs a bitwise AND followed by a
+  bitwise inclusive OR, and writes the result back to the bit field in the
+  64-bit MSR.
+
+  Reads the 64-bit MSR specified by Index, performs a bitwise AND followed by
+  a bitwise inclusive OR between the read result and the value specified by
+  AndData, and writes the result to the 64-bit MSR specified by Index. The
+  value written to the MSR is returned. Extra left bits in both AndData and
+  OrData are stripped. The caller must either guarantee that Index and the data
+  written is valid, or the caller must set up exception handlers to catch the
+  exceptions. This function is only available on IA-32 and X64.
+
+  If StartBit is greater than 63, then ASSERT().
+  If EndBit is greater than 63, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Index     The 32-bit MSR index to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..63.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..63.
+  @param  AndData   The value to AND with the read value from the bit field.
+  @param  OrData    The value to OR with the result of the AND operation.
+
+  @return The value written back to the MSR.
+
+**/
+UINT64
+EFIAPI
+AsmMsrBitFieldAndThenOr64 (
+  IN      UINT32                    Index,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT64                    AndData,
+  IN      UINT64                    OrData
+  );
+
+/**
+  Reads the current value of the EFLAGS register.
+
+  Reads and returns the current value of the EFLAGS register. This function is
+  only available on IA-32 and X64. This returns a 32-bit value on IA-32 and a
+  64-bit value on X64.
+
+  @return EFLAGS on IA-32 or RFLAGS on X64.
+
+**/
+UINTN
+EFIAPI
+AsmReadEflags (
+  VOID
+  );
+
+/**
+  Reads the current value of the Control Register 0 (CR0).
+
+  Reads and returns the current value of CR0. This function is only available
+  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
+  X64.
+
+  @return The value of the Control Register 0 (CR0).
+
+**/
+UINTN
+EFIAPI
+AsmReadCr0 (
+  VOID
+  );
+
+/**
+  Reads the current value of the Control Register 2 (CR2).
+
+  Reads and returns the current value of CR2. This function is only available
+  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
+  X64.
+
+  @return The value of the Control Register 2 (CR2).
+
+**/
+UINTN
+EFIAPI
+AsmReadCr2 (
+  VOID
+  );
+
+/**
+  Reads the current value of the Control Register 3 (CR3).
+
+  Reads and returns the current value of CR3. This function is only available
+  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
+  X64.
+
+  @return The value of the Control Register 3 (CR3).
+
+**/
+UINTN
+EFIAPI
+AsmReadCr3 (
+  VOID
+  );
+
+/**
+  Reads the current value of the Control Register 4 (CR4).
+
+  Reads and returns the current value of CR4. This function is only available
+  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
+  X64.
+
+  @return The value of the Control Register 4 (CR4).
+
+**/
+UINTN
+EFIAPI
+AsmReadCr4 (
+  VOID
+  );
+
+/**
+  Writes a value to Control Register 0 (CR0).
+
+  Writes and returns a new value to CR0. This function is only available on
+  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
+
+  @param  Cr0 The value to write to CR0.
+
+  @return The value written to CR0.
+
+**/
+UINTN
+EFIAPI
+AsmWriteCr0 (
+  UINTN  Cr0
+  );
+
+/**
+  Writes a value to Control Register 2 (CR2).
+
+  Writes and returns a new value to CR2. This function is only available on
+  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
+
+  @param  Cr2 The value to write to CR2.
+
+  @return The value written to CR2.
+
+**/
+UINTN
+EFIAPI
+AsmWriteCr2 (
+  UINTN  Cr2
+  );
+
+/**
+  Writes a value to Control Register 3 (CR3).
+
+  Writes and returns a new value to CR3. This function is only available on
+  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
+
+  @param  Cr3 The value to write to CR3.
+
+  @return The value written to CR3.
+
+**/
+UINTN
+EFIAPI
+AsmWriteCr3 (
+  UINTN  Cr3
+  );
+
+/**
+  Writes a value to Control Register 4 (CR4).
+
+  Writes and returns a new value to CR4. This function is only available on
+  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
+
+  @param  Cr4 The value to write to CR4.
+
+  @return The value written to CR4.
+
+**/
+UINTN
+EFIAPI
+AsmWriteCr4 (
+  UINTN  Cr4
+  );
+
+/**
+  Reads the current value of Debug Register 0 (DR0).
+
+  Reads and returns the current value of DR0. This function is only available
+  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
+  X64.
+
+  @return The value of Debug Register 0 (DR0).
+
+**/
+UINTN
+EFIAPI
+AsmReadDr0 (
+  VOID
+  );
+
+/**
+  Reads the current value of Debug Register 1 (DR1).
+
+  Reads and returns the current value of DR1. This function is only available
+  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
+  X64.
+
+  @return The value of Debug Register 1 (DR1).
+
+**/
+UINTN
+EFIAPI
+AsmReadDr1 (
+  VOID
+  );
+
+/**
+  Reads the current value of Debug Register 2 (DR2).
+
+  Reads and returns the current value of DR2. This function is only available
+  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
+  X64.
+
+  @return The value of Debug Register 2 (DR2).
+
+**/
+UINTN
+EFIAPI
+AsmReadDr2 (
+  VOID
+  );
+
+/**
+  Reads the current value of Debug Register 3 (DR3).
+
+  Reads and returns the current value of DR3. This function is only available
+  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
+  X64.
+
+  @return The value of Debug Register 3 (DR3).
+
+**/
+UINTN
+EFIAPI
+AsmReadDr3 (
+  VOID
+  );
+
+/**
+  Reads the current value of Debug Register 4 (DR4).
+
+  Reads and returns the current value of DR4. This function is only available
+  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
+  X64.
+
+  @return The value of Debug Register 4 (DR4).
+
+**/
+UINTN
+EFIAPI
+AsmReadDr4 (
+  VOID
+  );
+
+/**
+  Reads the current value of Debug Register 5 (DR5).
+
+  Reads and returns the current value of DR5. This function is only available
+  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
+  X64.
+
+  @return The value of Debug Register 5 (DR5).
+
+**/
+UINTN
+EFIAPI
+AsmReadDr5 (
+  VOID
+  );
+
+/**
+  Reads the current value of Debug Register 6 (DR6).
+
+  Reads and returns the current value of DR6. This function is only available
+  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
+  X64.
+
+  @return The value of Debug Register 6 (DR6).
+
+**/
+UINTN
+EFIAPI
+AsmReadDr6 (
+  VOID
+  );
+
+/**
+  Reads the current value of Debug Register 7 (DR7).
+
+  Reads and returns the current value of DR7. This function is only available
+  on IA-32 and X64. This returns a 32-bit value on IA-32 and a 64-bit value on
+  X64.
+
+  @return The value of Debug Register 7 (DR7).
+
+**/
+UINTN
+EFIAPI
+AsmReadDr7 (
+  VOID
+  );
+
+/**
+  Writes a value to Debug Register 0 (DR0).
+
+  Writes and returns a new value to DR0. This function is only available on
+  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
+
+  @param  Dr0 The value to write to Dr0.
+
+  @return The value written to Debug Register 0 (DR0).
+
+**/
+UINTN
+EFIAPI
+AsmWriteDr0 (
+  UINTN  Dr0
+  );
+
+/**
+  Writes a value to Debug Register 1 (DR1).
+
+  Writes and returns a new value to DR1. This function is only available on
+  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
+
+  @param  Dr1 The value to write to Dr1.
+
+  @return The value written to Debug Register 1 (DR1).
+
+**/
+UINTN
+EFIAPI
+AsmWriteDr1 (
+  UINTN  Dr1
+  );
+
+/**
+  Writes a value to Debug Register 2 (DR2).
+
+  Writes and returns a new value to DR2. This function is only available on
+  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
+
+  @param  Dr2 The value to write to Dr2.
+
+  @return The value written to Debug Register 2 (DR2).
+
+**/
+UINTN
+EFIAPI
+AsmWriteDr2 (
+  UINTN  Dr2
+  );
+
+/**
+  Writes a value to Debug Register 3 (DR3).
+
+  Writes and returns a new value to DR3. This function is only available on
+  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
+
+  @param  Dr3 The value to write to Dr3.
+
+  @return The value written to Debug Register 3 (DR3).
+
+**/
+UINTN
+EFIAPI
+AsmWriteDr3 (
+  UINTN  Dr3
+  );
+
+/**
+  Writes a value to Debug Register 4 (DR4).
+
+  Writes and returns a new value to DR4. This function is only available on
+  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
+
+  @param  Dr4 The value to write to Dr4.
+
+  @return The value written to Debug Register 4 (DR4).
+
+**/
+UINTN
+EFIAPI
+AsmWriteDr4 (
+  UINTN  Dr4
+  );
+
+/**
+  Writes a value to Debug Register 5 (DR5).
+
+  Writes and returns a new value to DR5. This function is only available on
+  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
+
+  @param  Dr5 The value to write to Dr5.
+
+  @return The value written to Debug Register 5 (DR5).
+
+**/
+UINTN
+EFIAPI
+AsmWriteDr5 (
+  UINTN  Dr5
+  );
+
+/**
+  Writes a value to Debug Register 6 (DR6).
+
+  Writes and returns a new value to DR6. This function is only available on
+  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
+
+  @param  Dr6 The value to write to Dr6.
+
+  @return The value written to Debug Register 6 (DR6).
+
+**/
+UINTN
+EFIAPI
+AsmWriteDr6 (
+  UINTN  Dr6
+  );
+
+/**
+  Writes a value to Debug Register 7 (DR7).
+
+  Writes and returns a new value to DR7. This function is only available on
+  IA-32 and X64. This writes a 32-bit value on IA-32 and a 64-bit value on X64.
+
+  @param  Dr7 The value to write to Dr7.
+
+  @return The value written to Debug Register 7 (DR7).
+
+**/
+UINTN
+EFIAPI
+AsmWriteDr7 (
+  UINTN  Dr7
+  );
+
+/**
+  Reads the current value of Code Segment Register (CS).
+
+  Reads and returns the current value of CS. This function is only available on
+  IA-32 and X64.
+
+  @return The current value of CS.
+
+**/
+UINT16
+EFIAPI
+AsmReadCs (
+  VOID
+  );
+
+/**
+  Reads the current value of Data Segment Register (DS).
+
+  Reads and returns the current value of DS. This function is only available on
+  IA-32 and X64.
+
+  @return The current value of DS.
+
+**/
+UINT16
+EFIAPI
+AsmReadDs (
+  VOID
+  );
+
+/**
+  Reads the current value of Extra Segment Register (ES).
+
+  Reads and returns the current value of ES. This function is only available on
+  IA-32 and X64.
+
+  @return The current value of ES.
+
+**/
+UINT16
+EFIAPI
+AsmReadEs (
+  VOID
+  );
+
+/**
+  Reads the current value of FS Data Segment Register (FS).
+
+  Reads and returns the current value of FS. This function is only available on
+  IA-32 and X64.
+
+  @return The current value of FS.
+
+**/
+UINT16
+EFIAPI
+AsmReadFs (
+  VOID
+  );
+
+/**
+  Reads the current value of GS Data Segment Register (GS).
+
+  Reads and returns the current value of GS. This function is only available on
+  IA-32 and X64.
+
+  @return The current value of GS.
+
+**/
+UINT16
+EFIAPI
+AsmReadGs (
+  VOID
+  );
+
+/**
+  Reads the current value of Stack Segment Register (SS).
+
+  Reads and returns the current value of SS. This function is only available on
+  IA-32 and X64.
+
+  @return The current value of SS.
+
+**/
+UINT16
+EFIAPI
+AsmReadSs (
+  VOID
+  );
+
+/**
+  Reads the current value of Task Register (TR).
+
+  Reads and returns the current value of TR. This function is only available on
+  IA-32 and X64.
+
+  @return The current value of TR.
+
+**/
+UINT16
+EFIAPI
+AsmReadTr (
+  VOID
+  );
+
+/**
+  Reads the current Global Descriptor Table Register(GDTR) descriptor.
+
+  Reads and returns the current GDTR descriptor and returns it in Gdtr. This
+  function is only available on IA-32 and X64.
+
+  If Gdtr is NULL, then ASSERT().
+
+  @param  Gdtr  Pointer to a GDTR descriptor.
+
+**/
+VOID
+EFIAPI
+AsmReadGdtr (
+  OUT     IA32_DESCRIPTOR           *Gdtr
+  );
+
+/**
+  Writes the current Global Descriptor Table Register (GDTR) descriptor.
+
+  Writes and the current GDTR descriptor specified by Gdtr. This function is
+  only available on IA-32 and X64.
+
+  If Gdtr is NULL, then ASSERT().
+
+  @param  Gdtr  Pointer to a GDTR descriptor.
+
+**/
+VOID
+EFIAPI
+AsmWriteGdtr (
+  IN      CONST IA32_DESCRIPTOR     *Gdtr
+  );
+
+/**
+  Reads the current Interrupt Descriptor Table Register(GDTR) descriptor.
+
+  Reads and returns the current IDTR descriptor and returns it in Idtr. This
+  function is only available on IA-32 and X64.
+
+  If Idtr is NULL, then ASSERT().
+
+  @param  Idtr  Pointer to a IDTR descriptor.
+
+**/
+VOID
+EFIAPI
+AsmReadIdtr (
+  OUT     IA32_DESCRIPTOR           *Idtr
+  );
+
+/**
+  Writes the current Interrupt Descriptor Table Register(GDTR) descriptor.
+
+  Writes the current IDTR descriptor and returns it in Idtr. This function is
+  only available on IA-32 and X64.
+
+  If Idtr is NULL, then ASSERT().
+
+  @param  Idtr  Pointer to a IDTR descriptor.
+
+**/
+VOID
+EFIAPI
+AsmWriteIdtr (
+  IN      CONST IA32_DESCRIPTOR     *Idtr
+  );
+
+/**
+  Reads the current Local Descriptor Table Register(LDTR) selector.
+
+  Reads and returns the current 16-bit LDTR descriptor value. This function is
+  only available on IA-32 and X64.
+
+  @return The current selector of LDT.
+
+**/
+UINT16
+EFIAPI
+AsmReadLdtr (
+  VOID
+  );
+
+/**
+  Writes the current Local Descriptor Table Register (GDTR) selector.
+
+  Writes and the current LDTR descriptor specified by Ldtr. This function is
+  only available on IA-32 and X64.
+
+  @param  Ldtr  16-bit LDTR selector value.
+
+**/
+VOID
+EFIAPI
+AsmWriteLdtr (
+  IN      UINT16                    Ldtr
+  );
+
+/**
+  Save the current floating point/SSE/SSE2 context to a buffer.
+
+  Saves the current floating point/SSE/SSE2 state to the buffer specified by
+  Buffer. Buffer must be aligned on a 16-byte boundary. This function is only
+  available on IA-32 and X64.
+
+  If Buffer is NULL, then ASSERT().
+  If Buffer is not aligned on a 16-byte boundary, then ASSERT().
+
+  @param  Buffer  Pointer to a buffer to save the floating point/SSE/SSE2 context.
+
+**/
+VOID
+EFIAPI
+AsmFxSave (
+  OUT     IA32_FX_BUFFER            *Buffer
+  );
+
+/**
+  Restores the current floating point/SSE/SSE2 context from a buffer.
+
+  Restores the current floating point/SSE/SSE2 state from the buffer specified
+  by Buffer. Buffer must be aligned on a 16-byte boundary. This function is
+  only available on IA-32 and X64.
+
+  If Buffer is NULL, then ASSERT().
+  If Buffer is not aligned on a 16-byte boundary, then ASSERT().
+  If Buffer was not saved with AsmFxSave(), then ASSERT().
+
+  @param  Buffer  Pointer to a buffer to save the floating point/SSE/SSE2 context.
+
+**/
+VOID
+EFIAPI
+AsmFxRestore (
+  IN      CONST IA32_FX_BUFFER      *Buffer
+  );
+
+/**
+  Reads the current value of 64-bit MMX Register #0 (MM0).
+
+  Reads and returns the current value of MM0. This function is only available
+  on IA-32 and X64.
+
+  @return The current value of MM0.
+
+**/
+UINT64
+EFIAPI
+AsmReadMm0 (
+  VOID
+  );
+
+/**
+  Reads the current value of 64-bit MMX Register #1 (MM1).
+
+  Reads and returns the current value of MM1. This function is only available
+  on IA-32 and X64.
+
+  @return The current value of MM1.
+
+**/
+UINT64
+EFIAPI
+AsmReadMm1 (
+  VOID
+  );
+
+/**
+  Reads the current value of 64-bit MMX Register #2 (MM2).
+
+  Reads and returns the current value of MM2. This function is only available
+  on IA-32 and X64.
+
+  @return The current value of MM2.
+
+**/
+UINT64
+EFIAPI
+AsmReadMm2 (
+  VOID
+  );
+
+/**
+  Reads the current value of 64-bit MMX Register #3 (MM3).
+
+  Reads and returns the current value of MM3. This function is only available
+  on IA-32 and X64.
+
+  @return The current value of MM3.
+
+**/
+UINT64
+EFIAPI
+AsmReadMm3 (
+  VOID
+  );
+
+/**
+  Reads the current value of 64-bit MMX Register #4 (MM4).
+
+  Reads and returns the current value of MM4. This function is only available
+  on IA-32 and X64.
+
+  @return The current value of MM4.
+
+**/
+UINT64
+EFIAPI
+AsmReadMm4 (
+  VOID
+  );
+
+/**
+  Reads the current value of 64-bit MMX Register #5 (MM5).
+
+  Reads and returns the current value of MM5. This function is only available
+  on IA-32 and X64.
+
+  @return The current value of MM5.
+
+**/
+UINT64
+EFIAPI
+AsmReadMm5 (
+  VOID
+  );
+
+/**
+  Reads the current value of 64-bit MMX Register #6 (MM6).
+
+  Reads and returns the current value of MM6. This function is only available
+  on IA-32 and X64.
+
+  @return The current value of MM6.
+
+**/
+UINT64
+EFIAPI
+AsmReadMm6 (
+  VOID
+  );
+
+/**
+  Reads the current value of 64-bit MMX Register #7 (MM7).
+
+  Reads and returns the current value of MM7. This function is only available
+  on IA-32 and X64.
+
+  @return The current value of MM7.
+
+**/
+UINT64
+EFIAPI
+AsmReadMm7 (
+  VOID
+  );
+
+/**
+  Writes the current value of 64-bit MMX Register #0 (MM0).
+
+  Writes the current value of MM0. This function is only available on IA32 and
+  X64.
+
+  @param  Value The 64-bit value to write to MM0.
+
+**/
+VOID
+EFIAPI
+AsmWriteMm0 (
+  IN      UINT64                    Value
+  );
+
+/**
+  Writes the current value of 64-bit MMX Register #1 (MM1).
+
+  Writes the current value of MM1. This function is only available on IA32 and
+  X64.
+
+  @param  Value The 64-bit value to write to MM1.
+
+**/
+VOID
+EFIAPI
+AsmWriteMm1 (
+  IN      UINT64                    Value
+  );
+
+/**
+  Writes the current value of 64-bit MMX Register #2 (MM2).
+
+  Writes the current value of MM2. This function is only available on IA32 and
+  X64.
+
+  @param  Value The 64-bit value to write to MM2.
+
+**/
+VOID
+EFIAPI
+AsmWriteMm2 (
+  IN      UINT64                    Value
+  );
+
+/**
+  Writes the current value of 64-bit MMX Register #3 (MM3).
+
+  Writes the current value of MM3. This function is only available on IA32 and
+  X64.
+
+  @param  Value The 64-bit value to write to MM3.
+
+**/
+VOID
+EFIAPI
+AsmWriteMm3 (
+  IN      UINT64                    Value
+  );
+
+/**
+  Writes the current value of 64-bit MMX Register #4 (MM4).
+
+  Writes the current value of MM4. This function is only available on IA32 and
+  X64.
+
+  @param  Value The 64-bit value to write to MM4.
+
+**/
+VOID
+EFIAPI
+AsmWriteMm4 (
+  IN      UINT64                    Value
+  );
+
+/**
+  Writes the current value of 64-bit MMX Register #5 (MM5).
+
+  Writes the current value of MM5. This function is only available on IA32 and
+  X64.
+
+  @param  Value The 64-bit value to write to MM5.
+
+**/
+VOID
+EFIAPI
+AsmWriteMm5 (
+  IN      UINT64                    Value
+  );
+
+/**
+  Writes the current value of 64-bit MMX Register #6 (MM6).
+
+  Writes the current value of MM6. This function is only available on IA32 and
+  X64.
+
+  @param  Value The 64-bit value to write to MM6.
+
+**/
+VOID
+EFIAPI
+AsmWriteMm6 (
+  IN      UINT64                    Value
+  );
+
+/**
+  Writes the current value of 64-bit MMX Register #7 (MM7).
+
+  Writes the current value of MM7. This function is only available on IA32 and
+  X64.
+
+  @param  Value The 64-bit value to write to MM7.
+
+**/
+VOID
+EFIAPI
+AsmWriteMm7 (
+  IN      UINT64                    Value
+  );
+
+/**
+  Reads the current value of Time Stamp Counter (TSC).
+
+  Reads and returns the current value of TSC. This function is only available
+  on IA-32 and X64.
+
+  @return The current value of TSC
+
+**/
+UINT64
+EFIAPI
+AsmReadTsc (
+  VOID
+  );
+
+/**
+  Reads the current value of a Performance Counter (PMC).
+
+  Reads and returns the current value of performance counter specified by
+  Index. This function is only available on IA-32 and X64.
+
+  @param  Index The 32-bit Performance Counter index to read.
+
+  @return The value of the PMC specified by Index.
+
+**/
+UINT64
+EFIAPI
+AsmReadPmc (
+  IN      UINT32                    Index
+  );
+
+/**
+  Sets up a monitor buffer that is used by AsmMwait().
+
+  Executes a MONITOR instruction with the register state specified by Eax, Ecx
+  and Edx. Returns Eax. This function is only available on IA-32 and X64.
+
+  @param  Eax The value to load into EAX or RAX before executing the MONITOR
+              instruction.
+  @param  Ecx The value to load into ECX or RCX before executing the MONITOR
+              instruction.
+  @param  Edx The value to load into EDX or RDX before executing the MONITOR
+              instruction.
+
+  @return Eax
+
+**/
+UINTN
+EFIAPI
+AsmMonitor (
+  IN      UINTN                     Eax,
+  IN      UINTN                     Ecx,
+  IN      UINTN                     Edx
+  );
+
+/**
+  Executes an MWAIT instruction.
+
+  Executes an MWAIT instruction with the register state specified by Eax and
+  Ecx. Returns Eax. This function is only available on IA-32 and X64.
+
+  @param  Eax The value to load into EAX or RAX before executing the MONITOR
+              instruction.
+  @param  Ecx The value to load into ECX or RCX before executing the MONITOR
+              instruction.
+
+  @return Eax
+
+**/
+UINTN
+EFIAPI
+AsmMwait (
+  IN      UINTN                     Eax,
+  IN      UINTN                     Ecx
+  );
+
+/**
+  Executes a WBINVD instruction.
+
+  Executes a WBINVD instruction. This function is only available on IA-32 and
+  X64.
+
+**/
+VOID
+EFIAPI
+AsmWbinvd (
+  VOID
+  );
+
+/**
+  Executes a INVD instruction.
+
+  Executes a INVD instruction. This function is only available on IA-32 and
+  X64.
+
+**/
+VOID
+EFIAPI
+AsmInvd (
+  VOID
+  );
+
+/**
+  Flushes a cache line from all the instruction and data caches within the
+  coherency domain of the CPU.
+
+  Flushed the cache line specified by LinearAddress, and returns LinearAddress.
+  This function is only available on IA-32 and X64.
+
+  @param  LinearAddress The address of the cache line to flush. If the CPU is
+                        in a physical addressing mode, then LinearAddress is a
+                        physical address. If the CPU is in a virtual
+                        addressing mode, then LinearAddress is a virtual
+                        address.
+
+  @return LinearAddress
+**/
+VOID *
+EFIAPI
+AsmFlushCacheLine (
+  IN      VOID                      *LinearAddress
+  );
+
+/**
+  Enables the 32-bit paging mode on the CPU.
+
+  Enables the 32-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables
+  must be properly initialized prior to calling this service. This function
+  assumes the current execution mode is 32-bit protected mode. This function is
+  only available on IA-32. After the 32-bit paging mode is enabled, control is
+  transferred to the function specified by EntryPoint using the new stack
+  specified by NewStack and passing in the parameters specified by Context1 and
+  Context2. Context1 and Context2 are optional and may be NULL. The function
+  EntryPoint must never return.
+
+  If the current execution mode is not 32-bit protected mode, then ASSERT().
+  If EntryPoint is NULL, then ASSERT().
+  If NewStack is NULL, then ASSERT().
+
+  There are a number of constraints that must be followed before calling this
+  function:
+  1)  Interrupts must be disabled.
+  2)  The caller must be in 32-bit protected mode with flat descriptors. This
+      means all descriptors must have a base of 0 and a limit of 4GB.
+  3)  CR0 and CR4 must be compatible with 32-bit protected mode with flat
+      descriptors.
+  4)  CR3 must point to valid page tables that will be used once the transition
+      is complete, and those page tables must guarantee that the pages for this
+      function and the stack are identity mapped.
+
+  @param  EntryPoint  A pointer to function to call with the new stack after
+                      paging is enabled.
+  @param  Context1    A pointer to the context to pass into the EntryPoint
+                      function as the first parameter after paging is enabled.
+  @param  Context2    A pointer to the context to pass into the EntryPoint
+                      function as the second parameter after paging is enabled.
+  @param  NewStack    A pointer to the new stack to use for the EntryPoint
+                      function after paging is enabled.
+
+**/
+VOID
+EFIAPI
+AsmEnablePaging32 (
+  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
+  IN      VOID                      *Context1,  OPTIONAL
+  IN      VOID                      *Context2,  OPTIONAL
+  IN      VOID                      *NewStack
+  );
+
+/**
+  Disables the 32-bit paging mode on the CPU.
+
+  Disables the 32-bit paging mode on the CPU and returns to 32-bit protected
+  mode. This function assumes the current execution mode is 32-paged protected
+  mode. This function is only available on IA-32. After the 32-bit paging mode
+  is disabled, control is transferred to the function specified by EntryPoint
+  using the new stack specified by NewStack and passing in the parameters
+  specified by Context1 and Context2. Context1 and Context2 are optional and
+  may be NULL. The function EntryPoint must never return.
+
+  If the current execution mode is not 32-bit paged mode, then ASSERT().
+  If EntryPoint is NULL, then ASSERT().
+  If NewStack is NULL, then ASSERT().
+
+  There are a number of constraints that must be followed before calling this
+  function:
+  1)  Interrupts must be disabled.
+  2)  The caller must be in 32-bit paged mode.
+  3)  CR0, CR3, and CR4 must be compatible with 32-bit paged mode.
+  4)  CR3 must point to valid page tables that guarantee that the pages for
+      this function and the stack are identity mapped.
+
+  @param  EntryPoint  A pointer to function to call with the new stack after
+                      paging is disabled.
+  @param  Context1    A pointer to the context to pass into the EntryPoint
+                      function as the first parameter after paging is disabled.
+  @param  Context2    A pointer to the context to pass into the EntryPoint
+                      function as the second parameter after paging is
+                      disabled.
+  @param  NewStack    A pointer to the new stack to use for the EntryPoint
+                      function after paging is disabled.
+
+**/
+VOID
+EFIAPI
+AsmDisablePaging32 (
+  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
+  IN      VOID                      *Context1,  OPTIONAL
+  IN      VOID                      *Context2,  OPTIONAL
+  IN      VOID                      *NewStack
+  );
+
+/**
+  Enables the 64-bit paging mode on the CPU.
+
+  Enables the 64-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables
+  must be properly initialized prior to calling this service. This function
+  assumes the current execution mode is 32-bit protected mode with flat
+  descriptors. This function is only available on IA-32. After the 64-bit
+  paging mode is enabled, control is transferred to the function specified by
+  EntryPoint using the new stack specified by NewStack and passing in the
+  parameters specified by Context1 and Context2. Context1 and Context2 are
+  optional and may be 0. The function EntryPoint must never return.
+
+  If the current execution mode is not 32-bit protected mode with flat
+  descriptors, then ASSERT().
+  If EntryPoint is 0, then ASSERT().
+  If NewStack is 0, then ASSERT().
+
+  @param  Cs          The 16-bit selector to load in the CS before EntryPoint
+                      is called. The descriptor in the GDT that this selector
+                      references must be setup for long mode.
+  @param  EntryPoint  The 64-bit virtual address of the function to call with
+                      the new stack after paging is enabled.
+  @param  Context1    The 64-bit virtual address of the context to pass into
+                      the EntryPoint function as the first parameter after
+                      paging is enabled.
+  @param  Context2    The 64-bit virtual address of the context to pass into
+                      the EntryPoint function as the second parameter after
+                      paging is enabled.
+  @param  NewStack    The 64-bit virtual address of the new stack to use for
+                      the EntryPoint function after paging is enabled.
+
+**/
+VOID
+EFIAPI
+AsmEnablePaging64 (
+  IN      UINT16                    CodeSelector,
+  IN      UINT64                    EntryPoint,
+  IN      UINT64                    Context1,  OPTIONAL
+  IN      UINT64                    Context2,  OPTIONAL
+  IN      UINT64                    NewStack
+  );
+
+/**
+  Disables the 64-bit paging mode on the CPU.
+
+  Disables the 64-bit paging mode on the CPU and returns to 32-bit protected
+  mode. This function assumes the current execution mode is 64-paging mode.
+  This function is only available on X64. After the 64-bit paging mode is
+  disabled, control is transferred to the function specified by EntryPoint
+  using the new stack specified by NewStack and passing in the parameters
+  specified by Context1 and Context2. Context1 and Context2 are optional and
+  may be 0. The function EntryPoint must never return.
+
+  If the current execution mode is not 64-bit paged mode, then ASSERT().
+  If EntryPoint is 0, then ASSERT().
+  If NewStack is 0, then ASSERT().
+
+  @param  Cs          The 16-bit selector to load in the CS before EntryPoint
+                      is called. The descriptor in the GDT that this selector
+                      references must be setup for 32-bit protected mode.
+  @param  EntryPoint  The 64-bit virtual address of the function to call with
+                      the new stack after paging is disabled.
+  @param  Context1    The 64-bit virtual address of the context to pass into
+                      the EntryPoint function as the first parameter after
+                      paging is disabled.
+  @param  Context2    The 64-bit virtual address of the context to pass into
+                      the EntryPoint function as the second parameter after
+                      paging is disabled.
+  @param  NewStack    The 64-bit virtual address of the new stack to use for
+                      the EntryPoint function after paging is disabled.
+
+**/
+VOID
+EFIAPI
+AsmDisablePaging64 (
+  IN      UINT16                    CodeSelector,
+  IN      UINT32                    EntryPoint,
+  IN      UINT32                    Context1,  OPTIONAL
+  IN      UINT32                    Context2,  OPTIONAL
+  IN      UINT32                    NewStack
+  );
+
+//
+// 16-bit thunking services
+//
+
+/**
+  Retrieves the properties for 16-bit thunk functions.
+
+  Computes the size of the buffer and stack below 1MB required to use the
+  AsmPrepareThunk16(), AsmThunk16() and AsmPrepareAndThunk16() functions. This
+  buffer size is returned in RealModeBufferSize, and the stack size is returned
+  in ExtraStackSize. If parameters are passed to the 16-bit real mode code,
+  then the actual minimum stack size is ExtraStackSize plus the maximum number
+  of bytes that need to be passed to the 16-bit real mode code.
+
+  If RealModeBufferSize is NULL, then ASSERT().
+  If ExtraStackSize is NULL, then ASSERT().
+
+  @param  RealModeBufferSize  A pointer to the size of the buffer below 1MB
+                              required to use the 16-bit thunk functions.
+  @param  ExtraStackSize      A pointer to the extra size of stack below 1MB
+                              that the 16-bit thunk functions require for
+                              temporary storage in the transition to and from
+                              16-bit real mode.
+
+**/
+VOID
+EFIAPI
+AsmGetThunk16Properties (
+  OUT     UINT32                    *RealModeBufferSize,
+  OUT     UINT32                    *ExtraStackSize
+  );
+
+/**
+  Prepares all structures a code required to use AsmThunk16().
+
+  Prepares all structures and code required to use AsmThunk16().
+
+  If ThunkContext is NULL, then ASSERT().
+
+  @param  ThunkContext  A pointer to the context structure that describes the
+                        16-bit real mode code to call.
+
+**/
+VOID
+EFIAPI
+AsmPrepareThunk16 (
+  OUT     THUNK_CONTEXT             *ThunkContext
+  );
+
+/**
+  Transfers control to a 16-bit real mode entry point and returns the results.
+
+  Transfers control to a 16-bit real mode entry point and returns the results.
+  AsmPrepareThunk16() must be called with ThunkContext before this function is
+  used.
+
+  If ThunkContext is NULL, then ASSERT().
+  If AsmPrepareThunk16() was not previously called with ThunkContext, then ASSERT().
+
+  @param  ThunkContext  A pointer to the context structure that describes the
+                        16-bit real mode code to call.
+
+**/
+VOID
+EFIAPI
+AsmThunk16 (
+  IN OUT  THUNK_CONTEXT             *ThunkContext
+  );
+
+/**
+  Prepares all structures and code for a 16-bit real mode thunk, transfers
+  control to a 16-bit real mode entry point, and returns the results.
+
+  Prepares all structures and code for a 16-bit real mode thunk, transfers
+  control to a 16-bit real mode entry point, and returns the results. If the
+  caller only need to perform a single 16-bit real mode thunk, then this
+  service should be used. If the caller intends to make more than one 16-bit
+  real mode thunk, then it is more efficient if AsmPrepareThunk16() is called
+  once and AsmThunk16() can be called for each 16-bit real mode thunk.
+
+  If ThunkContext is NULL, then ASSERT().
+
+  @param  ThunkContext  A pointer to the context structure that describes the
+                        16-bit real mode code to call.
+
+**/
+VOID
+EFIAPI
+AsmPrepareAndThunk16 (
+  IN OUT  THUNK_CONTEXT             *ThunkContext
+  );
+
+/**
+  Transfers control to a function starting with a new stack.
+
+  Transfers control to the function specified by EntryPoint using the new stack
+  specified by NewStack and passing in the parameters specified by Context1 and
+  Context2. Context1 and Context2 are optional and may be NULL. The function
+  EntryPoint must never return.
+
+  If EntryPoint is NULL, then ASSERT().
+  If NewStack is NULL, then ASSERT().
+
+  @param  EntryPoint  A pointer to function to call with the new stack.
+  @param  Context1    A pointer to the context to pass into the EntryPoint
+                      function.
+  @param  Context2    A pointer to the context to pass into the EntryPoint
+                      function.
+  @param  NewStack    A pointer to the new stack to use for the EntryPoint
+                      function.
+  @param  NewBsp      A pointer to the new memory location for RSE backing
+                      store.
+
+**/
+VOID
+EFIAPI
+AsmSwitchStackAndBackingStore (
+  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
+  IN      VOID                      *Context1,  OPTIONAL
+  IN      VOID                      *Context2,  OPTIONAL
+  IN      VOID                      *NewStack,
+  IN      VOID                      *NewBsp
+  );
+
+typedef struct {
+  UINT64                            Status;
+  UINT64                            r9;
+  UINT64                            r10;
+  UINT64                            r11;
+} PAL_PROC_RETURN;
+
+//
+// IPF Specific functions
+//
+
+
+/**
+  Performs a PAL call using static calling convention.
+
+  An internal function to perform a PAL call using static calling convention.
+
+  @param  PalEntryPoint The entry point address of PAL. The address in ar.kr5
+                        would be used if this parameter were NULL on input.
+  @param  Arg1          The first argument of a PAL call.
+  @param  Arg1          The second argument of a PAL call.
+  @param  Arg1          The third argument of a PAL call.
+  @param  Arg1          The fourth argument of a PAL call.
+
+  @return The values returned in r8, r9, r10 and r11.
+
+**/
+PAL_PROC_RETURN
+PalCallStatic (
+  IN      CONST VOID                *PalEntryPoint,
+  IN      UINT64                    Arg1,
+  IN      UINT64                    Arg2,
+  IN      UINT64                    Arg3,
+  IN      UINT64                    Arg4
+  );
+
+
+/**
+  Returns the current value of ar.itc.
+
+  An internal function to return the current value of ar.itc, which is the
+  timer tick on IPF.
+
+  @return The currect value of ar.itc
+
+**/
+INT64
+IpfReadItc (
+  VOID
+  );
+
+
+/**
+  Flush a range of  cache lines in the cache coherency domain of the calling 
+  CPU.
+
+  Invalidates the  cache lines specified by Address and Length. If Address is 
+  not aligned on a cache line boundary, then entire cache line containing 
+  Address is invalidated. If Address + Length is not aligned on a cache line 
+  boundary, then the entire instruction cache line containing Address + Length
+  -1 is invalidated. This function may choose to invalidate the entire 
+  instruction cache if that is more efficient than invalidating the specified 
+  range. If Length is 0, the no instruction cache lines are invalidated. 
+  Address is returned.
+
+  If Length is greater than (MAX_ADDRESS - Address + 1), then ASSERT().
+
+  @param  Address The base address of the instruction lines to invalidate. If 
+                  the CPU is in a physical addressing mode, then Address is a
+                  physical address. If the CPU is in a virtual addressing mode,
+                  then Address is a virtual address.
+
+  @param  Length  The number of bytes to invalidate from the instruction cache.
+
+  @return Address
+
+**/
+VOID *
+EFIAPI
+IpfFlushCacheRange (
+  IN      VOID                      *Address,
+  IN      UINTN                     Length
+  );
+
+#endif
+
index b367b02cd450ebe9918798b66699da00fa625e4e..3b753a7af149968dd94bf6877ee6eba5dd75e49f 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Public include file for the HOB Library\r
 \r
-  Copyright (c) 2006, Intel Corporation                                                         \r
+  Copyright (c) 2006 - 2007, Intel Corporation                                                         \r
   All rights reserved. This program and the accompanying materials                          \r
   are licensed and made available under the terms and conditions of the BSD License         \r
   which accompanies this distribution.  The full text of the license may be found at        \r
@@ -122,6 +122,24 @@ GetFirstGuidHob (
   )\r
 ;\r
 \r
+/**\r
+  Get the Boot Mode from the HOB list.\r
+\r
+  This function returns the system boot mode information from the \r
+  PHIT HOB in HOB list.\r
+\r
+  @param  VOID\r
+\r
+  @return The Boot Mode.\r
+\r
+**/\r
+EFI_BOOT_MODE\r
+EFIAPI\r
+GetBootModeHob (\r
+  VOID\r
+  )\r
+;\r
+\r
 /**\r
   Builds a HOB for a loaded PE32 module.\r
 \r
index 4e9b7f5652efe434bc1ad72e1cf5fe9564378b4a..e86068c5f1a1c40811e3d2ff1ecbc7409cdfcf22 100644 (file)
-/** @file\r
-  I/O and MMIO Library Services\r
-\r
-  Copyright (c) 2006, Intel Corporation\r
-  All rights reserved. This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-  Module Name:  IoLib.h\r
-\r
-**/\r
-\r
-#ifndef __IO_LIB_H__\r
-#define __IO_LIB_H__\r
-\r
-#define IO_LIB_ADDRESS(Segment,Port) \\r
-  ( ((Port) & 0xffff) | (((Segment) & 0xffff) << 16) )\r
-\r
-/**\r
-  Reads an 8-bit I/O port.\r
-\r
-  Reads the 8-bit I/O port specified by Port. The 8-bit read value is returned.\r
-  This function must guarantee that all I/O read and write operations are\r
-  serialized.\r
-\r
-  If 8-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port  The I/O port to read.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-IoRead8 (\r
-  IN      UINTN                     Port\r
-  );\r
-\r
-/**\r
-  Writes an 8-bit I/O port.\r
-\r
-  Writes the 8-bit I/O port specified by Port with the value specified by Value\r
-  and returns Value. This function must guarantee that all I/O read and write\r
-  operations are serialized.\r
-\r
-  If 8-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port  The I/O port to write.\r
-  @param  Value The value to write to the I/O port.\r
-\r
-  @return The value written the I/O port.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-IoWrite8 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT8                     Value\r
-  );\r
-\r
-/**\r
-  Reads an 8-bit I/O port, performs a bitwise inclusive OR, and writes the\r
-  result back to the 8-bit I/O port.\r
-\r
-  Reads the 8-bit I/O port specified by Port, performs a bitwise inclusive OR\r
-  between the read result and the value specified by OrData, and writes the\r
-  result to the 8-bit I/O port specified by Port. The value written to the I/O\r
-  port is returned. This function must guarantee that all I/O read and write\r
-  operations are serialized.\r
-\r
-  If 8-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port    The I/O port to write.\r
-  @param  OrData  The value to OR with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-IoOr8 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT8                     OrData\r
-  );\r
-\r
-/**\r
-  Reads an 8-bit I/O port, performs a bitwise AND, and writes the result back\r
-  to the 8-bit I/O port.\r
-\r
-  Reads the 8-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, and writes the result to\r
-  the 8-bit I/O port specified by Port. The value written to the I/O port is\r
-  returned. This function must guarantee that all I/O read and write operations\r
-  are serialized.\r
-\r
-  If 8-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port    The I/O port to write.\r
-  @param  AndData The value to AND with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-IoAnd8 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT8                     AndData\r
-  );\r
-\r
-/**\r
-  Reads an 8-bit I/O port, performs a bitwise AND followed by a bitwise\r
-  inclusive OR, and writes the result back to the 8-bit I/O port.\r
-\r
-  Reads the 8-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, performs a bitwise OR\r
-  between the result of the AND operation and the value specified by OrData,\r
-  and writes the result to the 8-bit I/O port specified by Port. The value\r
-  written to the I/O port is returned. This function must guarantee that all\r
-  I/O read and write operations are serialized.\r
-\r
-  If 8-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port    The I/O port to write.\r
-  @param  AndData The value to AND with the read value from the I/O port.\r
-  @param  OrData  The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-IoAndThenOr8 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT8                     AndData,\r
-  IN      UINT8                     OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field of an I/O register.\r
-\r
-  Reads the bit field in an 8-bit I/O register. The bit field is specified by\r
-  the StartBit and the EndBit. The value of the bit field is returned.\r
-\r
-  If 8-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to read.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-IoBitFieldRead8 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  );\r
-\r
-/**\r
-  Writes a bit field to an I/O register.\r
-\r
-  Writes Value to the bit field of the I/O register. The bit field is specified\r
-  by the StartBit and the EndBit. All other bits in the destination I/O\r
-  register are preserved. The value written to the I/O port is returned. Extra\r
-  left bits in Value are stripped.\r
-\r
-  If 8-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  Value     New value of the bit field.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-IoBitFieldWrite8 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     Value\r
-  );\r
-\r
-/**\r
-  Reads a bit field in an 8-bit port, performs a bitwise OR, and writes the\r
-  result back to the bit field in the 8-bit port.\r
-\r
-  Reads the 8-bit I/O port specified by Port, performs a bitwise inclusive OR\r
-  between the read result and the value specified by OrData, and writes the\r
-  result to the 8-bit I/O port specified by Port. The value written to the I/O\r
-  port is returned. This function must guarantee that all I/O read and write\r
-  operations are serialized. Extra left bits in OrData are stripped.\r
-\r
-  If 8-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  OrData    The value to OR with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-IoBitFieldOr8 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field in an 8-bit port, performs a bitwise AND, and writes the\r
-  result back to the bit field in the 8-bit port.\r
-\r
-  Reads the 8-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, and writes the result to\r
-  the 8-bit I/O port specified by Port. The value written to the I/O port is\r
-  returned. This function must guarantee that all I/O read and write operations\r
-  are serialized. Extra left bits in AndData are stripped.\r
-\r
-  If 8-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  AndData   The value to AND with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-IoBitFieldAnd8 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     AndData\r
-  );\r
-\r
-/**\r
-  Reads a bit field in an 8-bit port, performs a bitwise AND followed by a\r
-  bitwise inclusive OR, and writes the result back to the bit field in the\r
-  8-bit port.\r
-\r
-  Reads the 8-bit I/O port specified by Port, performs a bitwise AND followed\r
-  by a bitwise inclusive OR between the read result and the value specified by\r
-  AndData, and writes the result to the 8-bit I/O port specified by Port. The\r
-  value written to the I/O port is returned. This function must guarantee that\r
-  all I/O read and write operations are serialized. Extra left bits in both\r
-  AndData and OrData are stripped.\r
-\r
-  If 8-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  AndData   The value to AND with the read value from the I/O port.\r
-  @param  OrData    The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-IoBitFieldAndThenOr8 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     AndData,\r
-  IN      UINT8                     OrData\r
-  );\r
-\r
-/**\r
-  Reads a 16-bit I/O port.\r
-\r
-  Reads the 16-bit I/O port specified by Port. The 16-bit read value is returned.\r
-  This function must guarantee that all I/O read and write operations are\r
-  serialized.\r
-\r
-  If 16-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port  The I/O port to read.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-IoRead16 (\r
-  IN      UINTN                     Port\r
-  );\r
-\r
-/**\r
-  Writes a 16-bit I/O port.\r
-\r
-  Writes the 16-bit I/O port specified by Port with the value specified by Value\r
-  and returns Value. This function must guarantee that all I/O read and write\r
-  operations are serialized.\r
-\r
-  If 16-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port  The I/O port to write.\r
-  @param  Value The value to write to the I/O port.\r
-\r
-  @return The value written the I/O port.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-IoWrite16 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT16                    Value\r
-  );\r
-\r
-/**\r
-  Reads a 16-bit I/O port, performs a bitwise inclusive OR, and writes the\r
-  result back to the 16-bit I/O port.\r
-\r
-  Reads the 16-bit I/O port specified by Port, performs a bitwise inclusive OR\r
-  between the read result and the value specified by OrData, and writes the\r
-  result to the 16-bit I/O port specified by Port. The value written to the I/O\r
-  port is returned. This function must guarantee that all I/O read and write\r
-  operations are serialized.\r
-\r
-  If 16-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port    The I/O port to write.\r
-  @param  OrData  The value to OR with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-IoOr16 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT16                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a 16-bit I/O port, performs a bitwise AND, and writes the result back\r
-  to the 16-bit I/O port.\r
-\r
-  Reads the 16-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, and writes the result to\r
-  the 16-bit I/O port specified by Port. The value written to the I/O port is\r
-  returned. This function must guarantee that all I/O read and write operations\r
-  are serialized.\r
-\r
-  If 16-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port    The I/O port to write.\r
-  @param  AndData The value to AND with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-IoAnd16 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT16                    AndData\r
-  );\r
-\r
-/**\r
-  Reads a 16-bit I/O port, performs a bitwise AND followed by a bitwise\r
-  inclusive OR, and writes the result back to the 16-bit I/O port.\r
-\r
-  Reads the 16-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, performs a bitwise OR\r
-  between the result of the AND operation and the value specified by OrData,\r
-  and writes the result to the 16-bit I/O port specified by Port. The value\r
-  written to the I/O port is returned. This function must guarantee that all\r
-  I/O read and write operations are serialized.\r
-\r
-  If 16-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port    The I/O port to write.\r
-  @param  AndData The value to AND with the read value from the I/O port.\r
-  @param  OrData  The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-IoAndThenOr16 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT16                    AndData,\r
-  IN      UINT16                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field of an I/O register.\r
-\r
-  Reads the bit field in a 16-bit I/O register. The bit field is specified by\r
-  the StartBit and the EndBit. The value of the bit field is returned.\r
-\r
-  If 16-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 15, then ASSERT().\r
-  If EndBit is greater than 15, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to read.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-IoBitFieldRead16 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  );\r
-\r
-/**\r
-  Writes a bit field to an I/O register.\r
-\r
-  Writes Value to the bit field of the I/O register. The bit field is specified\r
-  by the StartBit and the EndBit. All other bits in the destination I/O\r
-  register are preserved. The value written to the I/O port is returned. Extra\r
-  left bits in Value are stripped.\r
-\r
-  If 16-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 15, then ASSERT().\r
-  If EndBit is greater than 15, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  Value     New value of the bit field.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-IoBitFieldWrite16 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    Value\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 16-bit port, performs a bitwise OR, and writes the\r
-  result back to the bit field in the 16-bit port.\r
-\r
-  Reads the 16-bit I/O port specified by Port, performs a bitwise inclusive OR\r
-  between the read result and the value specified by OrData, and writes the\r
-  result to the 16-bit I/O port specified by Port. The value written to the I/O\r
-  port is returned. This function must guarantee that all I/O read and write\r
-  operations are serialized. Extra left bits in OrData are stripped.\r
-\r
-  If 16-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 15, then ASSERT().\r
-  If EndBit is greater than 15, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  OrData    The value to OR with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-IoBitFieldOr16 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 16-bit port, performs a bitwise AND, and writes the\r
-  result back to the bit field in the 16-bit port.\r
-\r
-  Reads the 16-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, and writes the result to\r
-  the 16-bit I/O port specified by Port. The value written to the I/O port is\r
-  returned. This function must guarantee that all I/O read and write operations\r
-  are serialized. Extra left bits in AndData are stripped.\r
-\r
-  If 16-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 15, then ASSERT().\r
-  If EndBit is greater than 15, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  AndData   The value to AND with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-IoBitFieldAnd16 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    AndData\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 16-bit port, performs a bitwise AND followed by a\r
-  bitwise inclusive OR, and writes the result back to the bit field in the\r
-  16-bit port.\r
-\r
-  Reads the 16-bit I/O port specified by Port, performs a bitwise AND followed\r
-  by a bitwise inclusive OR between the read result and the value specified by\r
-  AndData, and writes the result to the 16-bit I/O port specified by Port. The\r
-  value written to the I/O port is returned. This function must guarantee that\r
-  all I/O read and write operations are serialized. Extra left bits in both\r
-  AndData and OrData are stripped.\r
-\r
-  If 16-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 15, then ASSERT().\r
-  If EndBit is greater than 15, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  AndData   The value to AND with the read value from the I/O port.\r
-  @param  OrData    The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-IoBitFieldAndThenOr16 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    AndData,\r
-  IN      UINT16                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a 32-bit I/O port.\r
-\r
-  Reads the 32-bit I/O port specified by Port. The 32-bit read value is returned.\r
-  This function must guarantee that all I/O read and write operations are\r
-  serialized.\r
-\r
-  If 32-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port  The I/O port to read.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-IoRead32 (\r
-  IN      UINTN                     Port\r
-  );\r
-\r
-/**\r
-  Writes a 32-bit I/O port.\r
-\r
-  Writes the 32-bit I/O port specified by Port with the value specified by Value\r
-  and returns Value. This function must guarantee that all I/O read and write\r
-  operations are serialized.\r
-\r
-  If 32-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port  The I/O port to write.\r
-  @param  Value The value to write to the I/O port.\r
-\r
-  @return The value written the I/O port.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-IoWrite32 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT32                    Value\r
-  );\r
-\r
-/**\r
-  Reads a 32-bit I/O port, performs a bitwise inclusive OR, and writes the\r
-  result back to the 32-bit I/O port.\r
-\r
-  Reads the 32-bit I/O port specified by Port, performs a bitwise inclusive OR\r
-  between the read result and the value specified by OrData, and writes the\r
-  result to the 32-bit I/O port specified by Port. The value written to the I/O\r
-  port is returned. This function must guarantee that all I/O read and write\r
-  operations are serialized.\r
-\r
-  If 32-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port    The I/O port to write.\r
-  @param  OrData  The value to OR with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-IoOr32 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT32                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a 32-bit I/O port, performs a bitwise AND, and writes the result back\r
-  to the 32-bit I/O port.\r
-\r
-  Reads the 32-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, and writes the result to\r
-  the 32-bit I/O port specified by Port. The value written to the I/O port is\r
-  returned. This function must guarantee that all I/O read and write operations\r
-  are serialized.\r
-\r
-  If 32-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port    The I/O port to write.\r
-  @param  AndData The value to AND with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-IoAnd32 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT32                    AndData\r
-  );\r
-\r
-/**\r
-  Reads a 32-bit I/O port, performs a bitwise AND followed by a bitwise\r
-  inclusive OR, and writes the result back to the 32-bit I/O port.\r
-\r
-  Reads the 32-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, performs a bitwise OR\r
-  between the result of the AND operation and the value specified by OrData,\r
-  and writes the result to the 32-bit I/O port specified by Port. The value\r
-  written to the I/O port is returned. This function must guarantee that all\r
-  I/O read and write operations are serialized.\r
-\r
-  If 32-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port    The I/O port to write.\r
-  @param  AndData The value to AND with the read value from the I/O port.\r
-  @param  OrData  The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-IoAndThenOr32 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT32                    AndData,\r
-  IN      UINT32                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field of an I/O register.\r
-\r
-  Reads the bit field in a 32-bit I/O register. The bit field is specified by\r
-  the StartBit and the EndBit. The value of the bit field is returned.\r
-\r
-  If 32-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 31, then ASSERT().\r
-  If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to read.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-IoBitFieldRead32 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  );\r
-\r
-/**\r
-  Writes a bit field to an I/O register.\r
-\r
-  Writes Value to the bit field of the I/O register. The bit field is specified\r
-  by the StartBit and the EndBit. All other bits in the destination I/O\r
-  register are preserved. The value written to the I/O port is returned. Extra\r
-  left bits in Value are stripped.\r
-\r
-  If 32-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 31, then ASSERT().\r
-  If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  Value     New value of the bit field.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-IoBitFieldWrite32 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    Value\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 32-bit port, performs a bitwise OR, and writes the\r
-  result back to the bit field in the 32-bit port.\r
-\r
-  Reads the 32-bit I/O port specified by Port, performs a bitwise inclusive OR\r
-  between the read result and the value specified by OrData, and writes the\r
-  result to the 32-bit I/O port specified by Port. The value written to the I/O\r
-  port is returned. This function must guarantee that all I/O read and write\r
-  operations are serialized. Extra left bits in OrData are stripped.\r
-\r
-  If 32-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 31, then ASSERT().\r
-  If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  OrData    The value to OR with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-IoBitFieldOr32 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 32-bit port, performs a bitwise AND, and writes the\r
-  result back to the bit field in the 32-bit port.\r
-\r
-  Reads the 32-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, and writes the result to\r
-  the 32-bit I/O port specified by Port. The value written to the I/O port is\r
-  returned. This function must guarantee that all I/O read and write operations\r
-  are serialized. Extra left bits in AndData are stripped.\r
-\r
-  If 32-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 31, then ASSERT().\r
-  If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  AndData   The value to AND with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-IoBitFieldAnd32 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    AndData\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 32-bit port, performs a bitwise AND followed by a\r
-  bitwise inclusive OR, and writes the result back to the bit field in the\r
-  32-bit port.\r
-\r
-  Reads the 32-bit I/O port specified by Port, performs a bitwise AND followed\r
-  by a bitwise inclusive OR between the read result and the value specified by\r
-  AndData, and writes the result to the 32-bit I/O port specified by Port. The\r
-  value written to the I/O port is returned. This function must guarantee that\r
-  all I/O read and write operations are serialized. Extra left bits in both\r
-  AndData and OrData are stripped.\r
-\r
-  If 32-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 31, then ASSERT().\r
-  If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  AndData   The value to AND with the read value from the I/O port.\r
-  @param  OrData    The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-IoBitFieldAndThenOr32 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    AndData,\r
-  IN      UINT32                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a 64-bit I/O port.\r
-\r
-  Reads the 64-bit I/O port specified by Port. The 64-bit read value is returned.\r
-  This function must guarantee that all I/O read and write operations are\r
-  serialized.\r
-\r
-  If 64-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port  The I/O port to read.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoRead64 (\r
-  IN      UINTN                     Port\r
-  );\r
-\r
-/**\r
-  Writes a 64-bit I/O port.\r
-\r
-  Writes the 64-bit I/O port specified by Port with the value specified by Value\r
-  and returns Value. This function must guarantee that all I/O read and write\r
-  operations are serialized.\r
-\r
-  If 64-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port  The I/O port to write.\r
-  @param  Value The value to write to the I/O port.\r
-\r
-  @return The value written the I/O port.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoWrite64 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT64                    Value\r
-  );\r
-\r
-/**\r
-  Reads a 64-bit I/O port, performs a bitwise inclusive OR, and writes the\r
-  result back to the 64-bit I/O port.\r
-\r
-  Reads the 64-bit I/O port specified by Port, performs a bitwise inclusive OR\r
-  between the read result and the value specified by OrData, and writes the\r
-  result to the 64-bit I/O port specified by Port. The value written to the I/O\r
-  port is returned. This function must guarantee that all I/O read and write\r
-  operations are serialized.\r
-\r
-  If 64-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port    The I/O port to write.\r
-  @param  OrData  The value to OR with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoOr64 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT64                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a 64-bit I/O port, performs a bitwise AND, and writes the result back\r
-  to the 64-bit I/O port.\r
-\r
-  Reads the 64-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, and writes the result to\r
-  the 64-bit I/O port specified by Port. The value written to the I/O port is\r
-  returned. This function must guarantee that all I/O read and write operations\r
-  are serialized.\r
-\r
-  If 64-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port    The I/O port to write.\r
-  @param  AndData The value to AND with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoAnd64 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT64                    AndData\r
-  );\r
-\r
-/**\r
-  Reads a 64-bit I/O port, performs a bitwise AND followed by a bitwise\r
-  inclusive OR, and writes the result back to the 64-bit I/O port.\r
-\r
-  Reads the 64-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, performs a bitwise OR\r
-  between the result of the AND operation and the value specified by OrData,\r
-  and writes the result to the 64-bit I/O port specified by Port. The value\r
-  written to the I/O port is returned. This function must guarantee that all\r
-  I/O read and write operations are serialized.\r
-\r
-  If 64-bit I/O port operations are not supported, then ASSERT().\r
-\r
-  @param  Port    The I/O port to write.\r
-  @param  AndData The value to AND with the read value from the I/O port.\r
-  @param  OrData  The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoAndThenOr64 (\r
-  IN      UINTN                     Port,\r
-  IN      UINT64                    AndData,\r
-  IN      UINT64                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field of an I/O register.\r
-\r
-  Reads the bit field in a 64-bit I/O register. The bit field is specified by\r
-  the StartBit and the EndBit. The value of the bit field is returned.\r
-\r
-  If 64-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 63, then ASSERT().\r
-  If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to read.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoBitFieldRead64 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  );\r
-\r
-/**\r
-  Writes a bit field to an I/O register.\r
-\r
-  Writes Value to the bit field of the I/O register. The bit field is specified\r
-  by the StartBit and the EndBit. All other bits in the destination I/O\r
-  register are preserved. The value written to the I/O port is returned. Extra\r
-  left bits in Value are stripped.\r
-\r
-  If 64-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 63, then ASSERT().\r
-  If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  Value     New value of the bit field.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoBitFieldWrite64 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    Value\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 64-bit port, performs a bitwise OR, and writes the\r
-  result back to the bit field in the 64-bit port.\r
-\r
-  Reads the 64-bit I/O port specified by Port, performs a bitwise inclusive OR\r
-  between the read result and the value specified by OrData, and writes the\r
-  result to the 64-bit I/O port specified by Port. The value written to the I/O\r
-  port is returned. This function must guarantee that all I/O read and write\r
-  operations are serialized. Extra left bits in OrData are stripped.\r
-\r
-  If 64-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 63, then ASSERT().\r
-  If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  OrData    The value to OR with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoBitFieldOr64 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 64-bit port, performs a bitwise AND, and writes the\r
-  result back to the bit field in the 64-bit port.\r
-\r
-  Reads the 64-bit I/O port specified by Port, performs a bitwise AND between\r
-  the read result and the value specified by AndData, and writes the result to\r
-  the 64-bit I/O port specified by Port. The value written to the I/O port is\r
-  returned. This function must guarantee that all I/O read and write operations\r
-  are serialized. Extra left bits in AndData are stripped.\r
-\r
-  If 64-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 63, then ASSERT().\r
-  If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  AndData   The value to AND with the read value from the I/O port.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoBitFieldAnd64 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    AndData\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 64-bit port, performs a bitwise AND followed by a\r
-  bitwise inclusive OR, and writes the result back to the bit field in the\r
-  64-bit port.\r
-\r
-  Reads the 64-bit I/O port specified by Port, performs a bitwise AND followed\r
-  by a bitwise inclusive OR between the read result and the value specified by\r
-  AndData, and writes the result to the 64-bit I/O port specified by Port. The\r
-  value written to the I/O port is returned. This function must guarantee that\r
-  all I/O read and write operations are serialized. Extra left bits in both\r
-  AndData and OrData are stripped.\r
-\r
-  If 64-bit I/O port operations are not supported, then ASSERT().\r
-  If StartBit is greater than 63, then ASSERT().\r
-  If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Port      The I/O port to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  AndData   The value to AND with the read value from the I/O port.\r
-  @param  OrData    The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the I/O port.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-IoBitFieldAndThenOr64 (\r
-  IN      UINTN                     Port,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    AndData,\r
-  IN      UINT64                    OrData\r
-  );\r
-\r
-/**\r
-  Reads an 8-bit MMIO register.\r
-\r
-  Reads the 8-bit MMIO register specified by Address. The 8-bit read value is\r
-  returned. This function must guarantee that all MMIO read and write\r
-  operations are serialized.\r
-\r
-  If 8-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to read.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-MmioRead8 (\r
-  IN      UINTN                     Address\r
-  );\r
-\r
-/**\r
-  Writes an 8-bit MMIO register.\r
-\r
-  Writes the 8-bit MMIO register specified by Address with the value specified\r
-  by Value and returns Value. This function must guarantee that all MMIO read\r
-  and write operations are serialized.\r
-\r
-  If 8-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  Value   The value to write to the MMIO register.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-MmioWrite8 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT8                     Value\r
-  );\r
-\r
-/**\r
-  Reads an 8-bit MMIO register, performs a bitwise inclusive OR, and writes the\r
-  result back to the 8-bit MMIO register.\r
-\r
-  Reads the 8-bit MMIO register specified by Address, performs a bitwise\r
-  inclusive OR between the read result and the value specified by OrData, and\r
-  writes the result to the 8-bit MMIO register specified by Address. The value\r
-  written to the MMIO register is returned. This function must guarantee that\r
-  all MMIO read and write operations are serialized.\r
-\r
-  If 8-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  OrData  The value to OR with the read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-MmioOr8 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT8                     OrData\r
-  );\r
-\r
-/**\r
-  Reads an 8-bit MMIO register, performs a bitwise AND, and writes the result\r
-  back to the 8-bit MMIO register.\r
-\r
-  Reads the 8-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, and writes the\r
-  result to the 8-bit MMIO register specified by Address. The value written to\r
-  the MMIO register is returned. This function must guarantee that all MMIO\r
-  read and write operations are serialized.\r
-\r
-  If 8-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  AndData The value to AND with the read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-MmioAnd8 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT8                     AndData\r
-  );\r
-\r
-/**\r
-  Reads an 8-bit MMIO register, performs a bitwise AND followed by a bitwise\r
-  inclusive OR, and writes the result back to the 8-bit MMIO register.\r
-\r
-  Reads the 8-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, performs a\r
-  bitwise OR between the result of the AND operation and the value specified by\r
-  OrData, and writes the result to the 8-bit MMIO register specified by\r
-  Address. The value written to the MMIO register is returned. This function\r
-  must guarantee that all MMIO read and write operations are serialized.\r
-\r
-  If 8-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  AndData The value to AND with the read value from the MMIO register.\r
-  @param  OrData  The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-MmioAndThenOr8 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT8                     AndData,\r
-  IN      UINT8                     OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field of a MMIO register.\r
-\r
-  Reads the bit field in an 8-bit MMIO register. The bit field is specified by\r
-  the StartBit and the EndBit. The value of the bit field is returned.\r
-\r
-  If 8-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to read.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-MmioBitFieldRead8 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  );\r
-\r
-/**\r
-  Writes a bit field to a MMIO register.\r
-\r
-  Writes Value to the bit field of the MMIO register. The bit field is\r
-  specified by the StartBit and the EndBit. All other bits in the destination\r
-  MMIO register are preserved. The new value of the 8-bit register is returned.\r
-\r
-  If 8-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  Value     New value of the bit field.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-MmioBitFieldWrite8 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     Value\r
-  );\r
-\r
-/**\r
-  Reads a bit field in an 8-bit MMIO register, performs a bitwise OR, and\r
-  writes the result back to the bit field in the 8-bit MMIO register.\r
-\r
-  Reads the 8-bit MMIO register specified by Address, performs a bitwise\r
-  inclusive OR between the read result and the value specified by OrData, and\r
-  writes the result to the 8-bit MMIO register specified by Address. The value\r
-  written to the MMIO register is returned. This function must guarantee that\r
-  all MMIO read and write operations are serialized. Extra left bits in OrData\r
-  are stripped.\r
-\r
-  If 8-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  OrData    The value to OR with read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-MmioBitFieldOr8 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field in an 8-bit MMIO register, performs a bitwise AND, and\r
-  writes the result back to the bit field in the 8-bit MMIO register.\r
-\r
-  Reads the 8-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, and writes the\r
-  result to the 8-bit MMIO register specified by Address. The value written to\r
-  the MMIO register is returned. This function must guarantee that all MMIO\r
-  read and write operations are serialized. Extra left bits in AndData are\r
-  stripped.\r
-\r
-  If 8-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  AndData   The value to AND with read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-MmioBitFieldAnd8 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     AndData\r
-  );\r
-\r
-/**\r
-  Reads a bit field in an 8-bit MMIO register, performs a bitwise AND followed\r
-  by a bitwise inclusive OR, and writes the result back to the bit field in the\r
-  8-bit MMIO register.\r
-\r
-  Reads the 8-bit MMIO register specified by Address, performs a bitwise AND\r
-  followed by a bitwise inclusive OR between the read result and the value\r
-  specified by AndData, and writes the result to the 8-bit MMIO register\r
-  specified by Address. The value written to the MMIO register is returned.\r
-  This function must guarantee that all MMIO read and write operations are\r
-  serialized. Extra left bits in both AndData and OrData are stripped.\r
-\r
-  If 8-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 7, then ASSERT().\r
-  If EndBit is greater than 7, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..7.\r
-  @param  AndData   The value to AND with read value from the MMIO register.\r
-  @param  OrData    The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-MmioBitFieldAndThenOr8 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT8                     AndData,\r
-  IN      UINT8                     OrData\r
-  );\r
-\r
-/**\r
-  Reads a 16-bit MMIO register.\r
-\r
-  Reads the 16-bit MMIO register specified by Address. The 16-bit read value is\r
-  returned. This function must guarantee that all MMIO read and write\r
-  operations are serialized.\r
-\r
-  If 16-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to read.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-MmioRead16 (\r
-  IN      UINTN                     Address\r
-  );\r
-\r
-/**\r
-  Writes a 16-bit MMIO register.\r
-\r
-  Writes the 16-bit MMIO register specified by Address with the value specified\r
-  by Value and returns Value. This function must guarantee that all MMIO read\r
-  and write operations are serialized.\r
-\r
-  If 16-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  Value   The value to write to the MMIO register.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-MmioWrite16 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT16                    Value\r
-  );\r
-\r
-/**\r
-  Reads a 16-bit MMIO register, performs a bitwise inclusive OR, and writes the\r
-  result back to the 16-bit MMIO register.\r
-\r
-  Reads the 16-bit MMIO register specified by Address, performs a bitwise\r
-  inclusive OR between the read result and the value specified by OrData, and\r
-  writes the result to the 16-bit MMIO register specified by Address. The value\r
-  written to the MMIO register is returned. This function must guarantee that\r
-  all MMIO read and write operations are serialized.\r
-\r
-  If 16-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  OrData  The value to OR with the read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-MmioOr16 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT16                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a 16-bit MMIO register, performs a bitwise AND, and writes the result\r
-  back to the 16-bit MMIO register.\r
-\r
-  Reads the 16-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, and writes the\r
-  result to the 16-bit MMIO register specified by Address. The value written to\r
-  the MMIO register is returned. This function must guarantee that all MMIO\r
-  read and write operations are serialized.\r
-\r
-  If 16-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  AndData The value to AND with the read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-MmioAnd16 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT16                    AndData\r
-  );\r
-\r
-/**\r
-  Reads a 16-bit MMIO register, performs a bitwise AND followed by a bitwise\r
-  inclusive OR, and writes the result back to the 16-bit MMIO register.\r
-\r
-  Reads the 16-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, performs a\r
-  bitwise OR between the result of the AND operation and the value specified by\r
-  OrData, and writes the result to the 16-bit MMIO register specified by\r
-  Address. The value written to the MMIO register is returned. This function\r
-  must guarantee that all MMIO read and write operations are serialized.\r
-\r
-  If 16-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  AndData The value to AND with the read value from the MMIO register.\r
-  @param  OrData  The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-MmioAndThenOr16 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT16                    AndData,\r
-  IN      UINT16                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field of a MMIO register.\r
-\r
-  Reads the bit field in a 16-bit MMIO register. The bit field is specified by\r
-  the StartBit and the EndBit. The value of the bit field is returned.\r
-\r
-  If 16-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 15, then ASSERT().\r
-  If EndBit is greater than 15, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to read.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-MmioBitFieldRead16 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  );\r
-\r
-/**\r
-  Writes a bit field to a MMIO register.\r
-\r
-  Writes Value to the bit field of the MMIO register. The bit field is\r
-  specified by the StartBit and the EndBit. All other bits in the destination\r
-  MMIO register are preserved. The new value of the 16-bit register is returned.\r
-\r
-  If 16-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 15, then ASSERT().\r
-  If EndBit is greater than 15, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  Value     New value of the bit field.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-MmioBitFieldWrite16 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    Value\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 16-bit MMIO register, performs a bitwise OR, and\r
-  writes the result back to the bit field in the 16-bit MMIO register.\r
-\r
-  Reads the 16-bit MMIO register specified by Address, performs a bitwise\r
-  inclusive OR between the read result and the value specified by OrData, and\r
-  writes the result to the 16-bit MMIO register specified by Address. The value\r
-  written to the MMIO register is returned. This function must guarantee that\r
-  all MMIO read and write operations are serialized. Extra left bits in OrData\r
-  are stripped.\r
-\r
-  If 16-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 15, then ASSERT().\r
-  If EndBit is greater than 15, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  OrData    The value to OR with read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-MmioBitFieldOr16 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 16-bit MMIO register, performs a bitwise AND, and\r
-  writes the result back to the bit field in the 16-bit MMIO register.\r
-\r
-  Reads the 16-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, and writes the\r
-  result to the 16-bit MMIO register specified by Address. The value written to\r
-  the MMIO register is returned. This function must guarantee that all MMIO\r
-  read and write operations are serialized. Extra left bits in AndData are\r
-  stripped.\r
-\r
-  If 16-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 15, then ASSERT().\r
-  If EndBit is greater than 15, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  AndData   The value to AND with read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-MmioBitFieldAnd16 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    AndData\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 16-bit MMIO register, performs a bitwise AND followed\r
-  by a bitwise inclusive OR, and writes the result back to the bit field in the\r
-  16-bit MMIO register.\r
-\r
-  Reads the 16-bit MMIO register specified by Address, performs a bitwise AND\r
-  followed by a bitwise inclusive OR between the read result and the value\r
-  specified by AndData, and writes the result to the 16-bit MMIO register\r
-  specified by Address. The value written to the MMIO register is returned.\r
-  This function must guarantee that all MMIO read and write operations are\r
-  serialized. Extra left bits in both AndData and OrData are stripped.\r
-\r
-  If 16-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 15, then ASSERT().\r
-  If EndBit is greater than 15, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..15.\r
-  @param  AndData   The value to AND with read value from the MMIO register.\r
-  @param  OrData    The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-MmioBitFieldAndThenOr16 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT16                    AndData,\r
-  IN      UINT16                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a 32-bit MMIO register.\r
-\r
-  Reads the 32-bit MMIO register specified by Address. The 32-bit read value is\r
-  returned. This function must guarantee that all MMIO read and write\r
-  operations are serialized.\r
-\r
-  If 32-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to read.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-MmioRead32 (\r
-  IN      UINTN                     Address\r
-  );\r
-\r
-/**\r
-  Writes a 32-bit MMIO register.\r
-\r
-  Writes the 32-bit MMIO register specified by Address with the value specified\r
-  by Value and returns Value. This function must guarantee that all MMIO read\r
-  and write operations are serialized.\r
-\r
-  If 32-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  Value   The value to write to the MMIO register.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-MmioWrite32 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT32                    Value\r
-  );\r
-\r
-/**\r
-  Reads a 32-bit MMIO register, performs a bitwise inclusive OR, and writes the\r
-  result back to the 32-bit MMIO register.\r
-\r
-  Reads the 32-bit MMIO register specified by Address, performs a bitwise\r
-  inclusive OR between the read result and the value specified by OrData, and\r
-  writes the result to the 32-bit MMIO register specified by Address. The value\r
-  written to the MMIO register is returned. This function must guarantee that\r
-  all MMIO read and write operations are serialized.\r
-\r
-  If 32-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  OrData  The value to OR with the read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-MmioOr32 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT32                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a 32-bit MMIO register, performs a bitwise AND, and writes the result\r
-  back to the 32-bit MMIO register.\r
-\r
-  Reads the 32-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, and writes the\r
-  result to the 32-bit MMIO register specified by Address. The value written to\r
-  the MMIO register is returned. This function must guarantee that all MMIO\r
-  read and write operations are serialized.\r
-\r
-  If 32-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  AndData The value to AND with the read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-MmioAnd32 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT32                    AndData\r
-  );\r
-\r
-/**\r
-  Reads a 32-bit MMIO register, performs a bitwise AND followed by a bitwise\r
-  inclusive OR, and writes the result back to the 32-bit MMIO register.\r
-\r
-  Reads the 32-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, performs a\r
-  bitwise OR between the result of the AND operation and the value specified by\r
-  OrData, and writes the result to the 32-bit MMIO register specified by\r
-  Address. The value written to the MMIO register is returned. This function\r
-  must guarantee that all MMIO read and write operations are serialized.\r
-\r
-  If 32-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  AndData The value to AND with the read value from the MMIO register.\r
-  @param  OrData  The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-MmioAndThenOr32 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT32                    AndData,\r
-  IN      UINT32                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field of a MMIO register.\r
-\r
-  Reads the bit field in a 32-bit MMIO register. The bit field is specified by\r
-  the StartBit and the EndBit. The value of the bit field is returned.\r
-\r
-  If 32-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 31, then ASSERT().\r
-  If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to read.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-MmioBitFieldRead32 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  );\r
-\r
-/**\r
-  Writes a bit field to a MMIO register.\r
-\r
-  Writes Value to the bit field of the MMIO register. The bit field is\r
-  specified by the StartBit and the EndBit. All other bits in the destination\r
-  MMIO register are preserved. The new value of the 32-bit register is returned.\r
-\r
-  If 32-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 31, then ASSERT().\r
-  If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  Value     New value of the bit field.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-MmioBitFieldWrite32 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    Value\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 32-bit MMIO register, performs a bitwise OR, and\r
-  writes the result back to the bit field in the 32-bit MMIO register.\r
-\r
-  Reads the 32-bit MMIO register specified by Address, performs a bitwise\r
-  inclusive OR between the read result and the value specified by OrData, and\r
-  writes the result to the 32-bit MMIO register specified by Address. The value\r
-  written to the MMIO register is returned. This function must guarantee that\r
-  all MMIO read and write operations are serialized. Extra left bits in OrData\r
-  are stripped.\r
-\r
-  If 32-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 31, then ASSERT().\r
-  If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  OrData    The value to OR with read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-MmioBitFieldOr32 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 32-bit MMIO register, performs a bitwise AND, and\r
-  writes the result back to the bit field in the 32-bit MMIO register.\r
-\r
-  Reads the 32-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, and writes the\r
-  result to the 32-bit MMIO register specified by Address. The value written to\r
-  the MMIO register is returned. This function must guarantee that all MMIO\r
-  read and write operations are serialized. Extra left bits in AndData are\r
-  stripped.\r
-\r
-  If 32-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 31, then ASSERT().\r
-  If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  AndData   The value to AND with read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-MmioBitFieldAnd32 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    AndData\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 32-bit MMIO register, performs a bitwise AND followed\r
-  by a bitwise inclusive OR, and writes the result back to the bit field in the\r
-  32-bit MMIO register.\r
-\r
-  Reads the 32-bit MMIO register specified by Address, performs a bitwise AND\r
-  followed by a bitwise inclusive OR between the read result and the value\r
-  specified by AndData, and writes the result to the 32-bit MMIO register\r
-  specified by Address. The value written to the MMIO register is returned.\r
-  This function must guarantee that all MMIO read and write operations are\r
-  serialized. Extra left bits in both AndData and OrData are stripped.\r
-\r
-  If 32-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 31, then ASSERT().\r
-  If EndBit is greater than 31, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..31.\r
-  @param  AndData   The value to AND with read value from the MMIO register.\r
-  @param  OrData    The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-MmioBitFieldAndThenOr32 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT32                    AndData,\r
-  IN      UINT32                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a 64-bit MMIO register.\r
-\r
-  Reads the 64-bit MMIO register specified by Address. The 64-bit read value is\r
-  returned. This function must guarantee that all MMIO read and write\r
-  operations are serialized.\r
-\r
-  If 64-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to read.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioRead64 (\r
-  IN      UINTN                     Address\r
-  );\r
-\r
-/**\r
-  Writes a 64-bit MMIO register.\r
-\r
-  Writes the 64-bit MMIO register specified by Address with the value specified\r
-  by Value and returns Value. This function must guarantee that all MMIO read\r
-  and write operations are serialized.\r
-\r
-  If 64-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  Value   The value to write to the MMIO register.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioWrite64 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT64                    Value\r
-  );\r
-\r
-/**\r
-  Reads a 64-bit MMIO register, performs a bitwise inclusive OR, and writes the\r
-  result back to the 64-bit MMIO register.\r
-\r
-  Reads the 64-bit MMIO register specified by Address, performs a bitwise\r
-  inclusive OR between the read result and the value specified by OrData, and\r
-  writes the result to the 64-bit MMIO register specified by Address. The value\r
-  written to the MMIO register is returned. This function must guarantee that\r
-  all MMIO read and write operations are serialized.\r
-\r
-  If 64-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  OrData  The value to OR with the read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioOr64 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT64                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a 64-bit MMIO register, performs a bitwise AND, and writes the result\r
-  back to the 64-bit MMIO register.\r
-\r
-  Reads the 64-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, and writes the\r
-  result to the 64-bit MMIO register specified by Address. The value written to\r
-  the MMIO register is returned. This function must guarantee that all MMIO\r
-  read and write operations are serialized.\r
-\r
-  If 64-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  AndData The value to AND with the read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioAnd64 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT64                    AndData\r
-  );\r
-\r
-/**\r
-  Reads a 64-bit MMIO register, performs a bitwise AND followed by a bitwise\r
-  inclusive OR, and writes the result back to the 64-bit MMIO register.\r
-\r
-  Reads the 64-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, performs a\r
-  bitwise OR between the result of the AND operation and the value specified by\r
-  OrData, and writes the result to the 64-bit MMIO register specified by\r
-  Address. The value written to the MMIO register is returned. This function\r
-  must guarantee that all MMIO read and write operations are serialized.\r
-\r
-  If 64-bit MMIO register operations are not supported, then ASSERT().\r
-\r
-\r
-  @param  Address The MMIO register to write.\r
-  @param  AndData The value to AND with the read value from the MMIO register.\r
-  @param  OrData  The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioAndThenOr64 (\r
-  IN      UINTN                     Address,\r
-  IN      UINT64                    AndData,\r
-  IN      UINT64                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field of a MMIO register.\r
-\r
-  Reads the bit field in a 64-bit MMIO register. The bit field is specified by\r
-  the StartBit and the EndBit. The value of the bit field is returned.\r
-\r
-  If 64-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 63, then ASSERT().\r
-  If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to read.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-\r
-  @return The value read.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioBitFieldRead64 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  );\r
-\r
-/**\r
-  Writes a bit field to a MMIO register.\r
-\r
-  Writes Value to the bit field of the MMIO register. The bit field is\r
-  specified by the StartBit and the EndBit. All other bits in the destination\r
-  MMIO register are preserved. The new value of the 64-bit register is returned.\r
-\r
-  If 64-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 63, then ASSERT().\r
-  If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  Value     New value of the bit field.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioBitFieldWrite64 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    Value\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 64-bit MMIO register, performs a bitwise OR, and\r
-  writes the result back to the bit field in the 64-bit MMIO register.\r
-\r
-  Reads the 64-bit MMIO register specified by Address, performs a bitwise\r
-  inclusive OR between the read result and the value specified by OrData, and\r
-  writes the result to the 64-bit MMIO register specified by Address. The value\r
-  written to the MMIO register is returned. This function must guarantee that\r
-  all MMIO read and write operations are serialized. Extra left bits in OrData\r
-  are stripped.\r
-\r
-  If 64-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 63, then ASSERT().\r
-  If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  OrData    The value to OR with read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioBitFieldOr64 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    OrData\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 64-bit MMIO register, performs a bitwise AND, and\r
-  writes the result back to the bit field in the 64-bit MMIO register.\r
-\r
-  Reads the 64-bit MMIO register specified by Address, performs a bitwise AND\r
-  between the read result and the value specified by AndData, and writes the\r
-  result to the 64-bit MMIO register specified by Address. The value written to\r
-  the MMIO register is returned. This function must guarantee that all MMIO\r
-  read and write operations are serialized. Extra left bits in AndData are\r
-  stripped.\r
-\r
-  If 64-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 63, then ASSERT().\r
-  If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  AndData   The value to AND with read value from the MMIO register.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioBitFieldAnd64 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    AndData\r
-  );\r
-\r
-/**\r
-  Reads a bit field in a 64-bit MMIO register, performs a bitwise AND followed\r
-  by a bitwise inclusive OR, and writes the result back to the bit field in the\r
-  64-bit MMIO register.\r
-\r
-  Reads the 64-bit MMIO register specified by Address, performs a bitwise AND\r
-  followed by a bitwise inclusive OR between the read result and the value\r
-  specified by AndData, and writes the result to the 64-bit MMIO register\r
-  specified by Address. The value written to the MMIO register is returned.\r
-  This function must guarantee that all MMIO read and write operations are\r
-  serialized. Extra left bits in both AndData and OrData are stripped.\r
-\r
-  If 64-bit MMIO register operations are not supported, then ASSERT().\r
-  If StartBit is greater than 63, then ASSERT().\r
-  If EndBit is greater than 63, then ASSERT().\r
-  If EndBit is less than StartBit, then ASSERT().\r
-\r
-  @param  Address   MMIO register to write.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-                    Range 0..63.\r
-  @param  AndData   The value to AND with read value from the MMIO register.\r
-  @param  OrData    The value to OR with the result of the AND operation.\r
-\r
-  @return The value written back to the MMIO register.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-MmioBitFieldAndThenOr64 (\r
-  IN      UINTN                     Address,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      UINT64                    AndData,\r
-  IN      UINT64                    OrData\r
-  );\r
-\r
-#endif\r
+/** @file
+  I/O and MMIO Library Services
+
+  Copyright (c) 2006 - 2007, Intel Corporation
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Module Name:  IoLib.h
+
+**/
+
+#ifndef __IO_LIB_H__
+#define __IO_LIB_H__
+
+#define IO_LIB_ADDRESS(Segment,Port) \
+  ( ((Port) & 0xffff) | (((Segment) & 0xffff) << 16) )
+
+/**
+  Reads an 8-bit I/O port.
+
+  Reads the 8-bit I/O port specified by Port. The 8-bit read value is returned.
+  This function must guarantee that all I/O read and write operations are
+  serialized.
+
+  If 8-bit I/O port operations are not supported, then ASSERT().
+
+  @param  Port  The I/O port to read.
+
+  @return The value read.
+
+**/
+UINT8
+EFIAPI
+IoRead8 (
+  IN      UINTN                     Port
+  );
+
+/**
+  Writes an 8-bit I/O port.
+
+  Writes the 8-bit I/O port specified by Port with the value specified by Value
+  and returns Value. This function must guarantee that all I/O read and write
+  operations are serialized.
+
+  If 8-bit I/O port operations are not supported, then ASSERT().
+
+  @param  Port  The I/O port to write.
+  @param  Value The value to write to the I/O port.
+
+  @return The value written the I/O port.
+
+**/
+UINT8
+EFIAPI
+IoWrite8 (
+  IN      UINTN                     Port,
+  IN      UINT8                     Value
+  );
+
+/**
+  Reads an 8-bit I/O port, performs a bitwise inclusive OR, and writes the
+  result back to the 8-bit I/O port.
+
+  Reads the 8-bit I/O port specified by Port, performs a bitwise inclusive OR
+  between the read result and the value specified by OrData, and writes the
+  result to the 8-bit I/O port specified by Port. The value written to the I/O
+  port is returned. This function must guarantee that all I/O read and write
+  operations are serialized.
+
+  If 8-bit I/O port operations are not supported, then ASSERT().
+
+  @param  Port    The I/O port to write.
+  @param  OrData  The value to OR with the read value from the I/O port.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT8
+EFIAPI
+IoOr8 (
+  IN      UINTN                     Port,
+  IN      UINT8                     OrData
+  );
+
+/**
+  Reads an 8-bit I/O port, performs a bitwise AND, and writes the result back
+  to the 8-bit I/O port.
+
+  Reads the 8-bit I/O port specified by Port, performs a bitwise AND between
+  the read result and the value specified by AndData, and writes the result to
+  the 8-bit I/O port specified by Port. The value written to the I/O port is
+  returned. This function must guarantee that all I/O read and write operations
+  are serialized.
+
+  If 8-bit I/O port operations are not supported, then ASSERT().
+
+  @param  Port    The I/O port to write.
+  @param  AndData The value to AND with the read value from the I/O port.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT8
+EFIAPI
+IoAnd8 (
+  IN      UINTN                     Port,
+  IN      UINT8                     AndData
+  );
+
+/**
+  Reads an 8-bit I/O port, performs a bitwise AND followed by a bitwise
+  inclusive OR, and writes the result back to the 8-bit I/O port.
+
+  Reads the 8-bit I/O port specified by Port, performs a bitwise AND between
+  the read result and the value specified by AndData, performs a bitwise OR
+  between the result of the AND operation and the value specified by OrData,
+  and writes the result to the 8-bit I/O port specified by Port. The value
+  written to the I/O port is returned. This function must guarantee that all
+  I/O read and write operations are serialized.
+
+  If 8-bit I/O port operations are not supported, then ASSERT().
+
+  @param  Port    The I/O port to write.
+  @param  AndData The value to AND with the read value from the I/O port.
+  @param  OrData  The value to OR with the result of the AND operation.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT8
+EFIAPI
+IoAndThenOr8 (
+  IN      UINTN                     Port,
+  IN      UINT8                     AndData,
+  IN      UINT8                     OrData
+  );
+
+/**
+  Reads a bit field of an I/O register.
+
+  Reads the bit field in an 8-bit I/O register. The bit field is specified by
+  the StartBit and the EndBit. The value of the bit field is returned.
+
+  If 8-bit I/O port operations are not supported, then ASSERT().
+  If StartBit is greater than 7, then ASSERT().
+  If EndBit is greater than 7, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Port      The I/O port to read.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..7.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..7.
+
+  @return The value read.
+
+**/
+UINT8
+EFIAPI
+IoBitFieldRead8 (
+  IN      UINTN                     Port,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit
+  );
+
+/**
+  Writes a bit field to an I/O register.
+
+  Writes Value to the bit field of the I/O register. The bit field is specified
+  by the StartBit and the EndBit. All other bits in the destination I/O
+  register are preserved. The value written to the I/O port is returned. Extra
+  left bits in Value are stripped.
+
+  If 8-bit I/O port operations are not supported, then ASSERT().
+  If StartBit is greater than 7, then ASSERT().
+  If EndBit is greater than 7, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Port      The I/O port to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..7.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..7.
+  @param  Value     New value of the bit field.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT8
+EFIAPI
+IoBitFieldWrite8 (
+  IN      UINTN                     Port,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT8                     Value
+  );
+
+/**
+  Reads a bit field in an 8-bit port, performs a bitwise OR, and writes the
+  result back to the bit field in the 8-bit port.
+
+  Reads the 8-bit I/O port specified by Port, performs a bitwise inclusive OR
+  between the read result and the value specified by OrData, and writes the
+  result to the 8-bit I/O port specified by Port. The value written to the I/O
+  port is returned. This function must guarantee that all I/O read and write
+  operations are serialized. Extra left bits in OrData are stripped.
+
+  If 8-bit I/O port operations are not supported, then ASSERT().
+  If StartBit is greater than 7, then ASSERT().
+  If EndBit is greater than 7, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Port      The I/O port to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..7.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..7.
+  @param  OrData    The value to OR with the read value from the I/O port.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT8
+EFIAPI
+IoBitFieldOr8 (
+  IN      UINTN                     Port,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT8                     OrData
+  );
+
+/**
+  Reads a bit field in an 8-bit port, performs a bitwise AND, and writes the
+  result back to the bit field in the 8-bit port.
+
+  Reads the 8-bit I/O port specified by Port, performs a bitwise AND between
+  the read result and the value specified by AndData, and writes the result to
+  the 8-bit I/O port specified by Port. The value written to the I/O port is
+  returned. This function must guarantee that all I/O read and write operations
+  are serialized. Extra left bits in AndData are stripped.
+
+  If 8-bit I/O port operations are not supported, then ASSERT().
+  If StartBit is greater than 7, then ASSERT().
+  If EndBit is greater than 7, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Port      The I/O port to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..7.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..7.
+  @param  AndData   The value to AND with the read value from the I/O port.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT8
+EFIAPI
+IoBitFieldAnd8 (
+  IN      UINTN                     Port,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT8                     AndData
+  );
+
+/**
+  Reads a bit field in an 8-bit port, performs a bitwise AND followed by a
+  bitwise inclusive OR, and writes the result back to the bit field in the
+  8-bit port.
+
+  Reads the 8-bit I/O port specified by Port, performs a bitwise AND followed
+  by a bitwise inclusive OR between the read result and the value specified by
+  AndData, and writes the result to the 8-bit I/O port specified by Port. The
+  value written to the I/O port is returned. This function must guarantee that
+  all I/O read and write operations are serialized. Extra left bits in both
+  AndData and OrData are stripped.
+
+  If 8-bit I/O port operations are not supported, then ASSERT().
+  If StartBit is greater than 7, then ASSERT().
+  If EndBit is greater than 7, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Port      The I/O port to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..7.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..7.
+  @param  AndData   The value to AND with the read value from the I/O port.
+  @param  OrData    The value to OR with the result of the AND operation.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT8
+EFIAPI
+IoBitFieldAndThenOr8 (
+  IN      UINTN                     Port,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT8                     AndData,
+  IN      UINT8                     OrData
+  );
+
+/**
+  Reads a 16-bit I/O port.
+
+  Reads the 16-bit I/O port specified by Port. The 16-bit read value is returned.
+  This function must guarantee that all I/O read and write operations are
+  serialized.
+
+  If 16-bit I/O port operations are not supported, then ASSERT().
+
+  @param  Port  The I/O port to read.
+
+  @return The value read.
+
+**/
+UINT16
+EFIAPI
+IoRead16 (
+  IN      UINTN                     Port
+  );
+
+/**
+  Writes a 16-bit I/O port.
+
+  Writes the 16-bit I/O port specified by Port with the value specified by Value
+  and returns Value. This function must guarantee that all I/O read and write
+  operations are serialized.
+
+  If 16-bit I/O port operations are not supported, then ASSERT().
+
+  @param  Port  The I/O port to write.
+  @param  Value The value to write to the I/O port.
+
+  @return The value written the I/O port.
+
+**/
+UINT16
+EFIAPI
+IoWrite16 (
+  IN      UINTN                     Port,
+  IN      UINT16                    Value
+  );
+
+/**
+  Reads a 16-bit I/O port, performs a bitwise inclusive OR, and writes the
+  result back to the 16-bit I/O port.
+
+  Reads the 16-bit I/O port specified by Port, performs a bitwise inclusive OR
+  between the read result and the value specified by OrData, and writes the
+  result to the 16-bit I/O port specified by Port. The value written to the I/O
+  port is returned. This function must guarantee that all I/O read and write
+  operations are serialized.
+
+  If 16-bit I/O port operations are not supported, then ASSERT().
+
+  @param  Port    The I/O port to write.
+  @param  OrData  The value to OR with the read value from the I/O port.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT16
+EFIAPI
+IoOr16 (
+  IN      UINTN                     Port,
+  IN      UINT16                    OrData
+  );
+
+/**
+  Reads a 16-bit I/O port, performs a bitwise AND, and writes the result back
+  to the 16-bit I/O port.
+
+  Reads the 16-bit I/O port specified by Port, performs a bitwise AND between
+  the read result and the value specified by AndData, and writes the result to
+  the 16-bit I/O port specified by Port. The value written to the I/O port is
+  returned. This function must guarantee that all I/O read and write operations
+  are serialized.
+
+  If 16-bit I/O port operations are not supported, then ASSERT().
+
+  @param  Port    The I/O port to write.
+  @param  AndData The value to AND with the read value from the I/O port.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT16
+EFIAPI
+IoAnd16 (
+  IN      UINTN                     Port,
+  IN      UINT16                    AndData
+  );
+
+/**
+  Reads a 16-bit I/O port, performs a bitwise AND followed by a bitwise
+  inclusive OR, and writes the result back to the 16-bit I/O port.
+
+  Reads the 16-bit I/O port specified by Port, performs a bitwise AND between
+  the read result and the value specified by AndData, performs a bitwise OR
+  between the result of the AND operation and the value specified by OrData,
+  and writes the result to the 16-bit I/O port specified by Port. The value
+  written to the I/O port is returned. This function must guarantee that all
+  I/O read and write operations are serialized.
+
+  If 16-bit I/O port operations are not supported, then ASSERT().
+
+  @param  Port    The I/O port to write.
+  @param  AndData The value to AND with the read value from the I/O port.
+  @param  OrData  The value to OR with the result of the AND operation.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT16
+EFIAPI
+IoAndThenOr16 (
+  IN      UINTN                     Port,
+  IN      UINT16                    AndData,
+  IN      UINT16                    OrData
+  );
+
+/**
+  Reads a bit field of an I/O register.
+
+  Reads the bit field in a 16-bit I/O register. The bit field is specified by
+  the StartBit and the EndBit. The value of the bit field is returned.
+
+  If 16-bit I/O port operations are not supported, then ASSERT().
+  If StartBit is greater than 15, then ASSERT().
+  If EndBit is greater than 15, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Port      The I/O port to read.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..15.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..15.
+
+  @return The value read.
+
+**/
+UINT16
+EFIAPI
+IoBitFieldRead16 (
+  IN      UINTN                     Port,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit
+  );
+
+/**
+  Writes a bit field to an I/O register.
+
+  Writes Value to the bit field of the I/O register. The bit field is specified
+  by the StartBit and the EndBit. All other bits in the destination I/O
+  register are preserved. The value written to the I/O port is returned. Extra
+  left bits in Value are stripped.
+
+  If 16-bit I/O port operations are not supported, then ASSERT().
+  If StartBit is greater than 15, then ASSERT().
+  If EndBit is greater than 15, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Port      The I/O port to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..15.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..15.
+  @param  Value     New value of the bit field.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT16
+EFIAPI
+IoBitFieldWrite16 (
+  IN      UINTN                     Port,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT16                    Value
+  );
+
+/**
+  Reads a bit field in a 16-bit port, performs a bitwise OR, and writes the
+  result back to the bit field in the 16-bit port.
+
+  Reads the 16-bit I/O port specified by Port, performs a bitwise inclusive OR
+  between the read result and the value specified by OrData, and writes the
+  result to the 16-bit I/O port specified by Port. The value written to the I/O
+  port is returned. This function must guarantee that all I/O read and write
+  operations are serialized. Extra left bits in OrData are stripped.
+
+  If 16-bit I/O port operations are not supported, then ASSERT().
+  If StartBit is greater than 15, then ASSERT().
+  If EndBit is greater than 15, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Port      The I/O port to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..15.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..15.
+  @param  OrData    The value to OR with the read value from the I/O port.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT16
+EFIAPI
+IoBitFieldOr16 (
+  IN      UINTN                     Port,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT16                    OrData
+  );
+
+/**
+  Reads a bit field in a 16-bit port, performs a bitwise AND, and writes the
+  result back to the bit field in the 16-bit port.
+
+  Reads the 16-bit I/O port specified by Port, performs a bitwise AND between
+  the read result and the value specified by AndData, and writes the result to
+  the 16-bit I/O port specified by Port. The value written to the I/O port is
+  returned. This function must guarantee that all I/O read and write operations
+  are serialized. Extra left bits in AndData are stripped.
+
+  If 16-bit I/O port operations are not supported, then ASSERT().
+  If StartBit is greater than 15, then ASSERT().
+  If EndBit is greater than 15, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Port      The I/O port to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..15.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..15.
+  @param  AndData   The value to AND with the read value from the I/O port.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT16
+EFIAPI
+IoBitFieldAnd16 (
+  IN      UINTN                     Port,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT16                    AndData
+  );
+
+/**
+  Reads a bit field in a 16-bit port, performs a bitwise AND followed by a
+  bitwise inclusive OR, and writes the result back to the bit field in the
+  16-bit port.
+
+  Reads the 16-bit I/O port specified by Port, performs a bitwise AND followed
+  by a bitwise inclusive OR between the read result and the value specified by
+  AndData, and writes the result to the 16-bit I/O port specified by Port. The
+  value written to the I/O port is returned. This function must guarantee that
+  all I/O read and write operations are serialized. Extra left bits in both
+  AndData and OrData are stripped.
+
+  If 16-bit I/O port operations are not supported, then ASSERT().
+  If StartBit is greater than 15, then ASSERT().
+  If EndBit is greater than 15, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Port      The I/O port to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..15.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..15.
+  @param  AndData   The value to AND with the read value from the I/O port.
+  @param  OrData    The value to OR with the result of the AND operation.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT16
+EFIAPI
+IoBitFieldAndThenOr16 (
+  IN      UINTN                     Port,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT16                    AndData,
+  IN      UINT16                    OrData
+  );
+
+/**
+  Reads a 32-bit I/O port.
+
+  Reads the 32-bit I/O port specified by Port. The 32-bit read value is returned.
+  This function must guarantee that all I/O read and write operations are
+  serialized.
+
+  If 32-bit I/O port operations are not supported, then ASSERT().
+
+  @param  Port  The I/O port to read.
+
+  @return The value read.
+
+**/
+UINT32
+EFIAPI
+IoRead32 (
+  IN      UINTN                     Port
+  );
+
+/**
+  Writes a 32-bit I/O port.
+
+  Writes the 32-bit I/O port specified by Port with the value specified by Value
+  and returns Value. This function must guarantee that all I/O read and write
+  operations are serialized.
+
+  If 32-bit I/O port operations are not supported, then ASSERT().
+
+  @param  Port  The I/O port to write.
+  @param  Value The value to write to the I/O port.
+
+  @return The value written the I/O port.
+
+**/
+UINT32
+EFIAPI
+IoWrite32 (
+  IN      UINTN                     Port,
+  IN      UINT32                    Value
+  );
+
+/**
+  Reads a 32-bit I/O port, performs a bitwise inclusive OR, and writes the
+  result back to the 32-bit I/O port.
+
+  Reads the 32-bit I/O port specified by Port, performs a bitwise inclusive OR
+  between the read result and the value specified by OrData, and writes the
+  result to the 32-bit I/O port specified by Port. The value written to the I/O
+  port is returned. This function must guarantee that all I/O read and write
+  operations are serialized.
+
+  If 32-bit I/O port operations are not supported, then ASSERT().
+
+  @param  Port    The I/O port to write.
+  @param  OrData  The value to OR with the read value from the I/O port.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT32
+EFIAPI
+IoOr32 (
+  IN      UINTN                     Port,
+  IN      UINT32                    OrData
+  );
+
+/**
+  Reads a 32-bit I/O port, performs a bitwise AND, and writes the result back
+  to the 32-bit I/O port.
+
+  Reads the 32-bit I/O port specified by Port, performs a bitwise AND between
+  the read result and the value specified by AndData, and writes the result to
+  the 32-bit I/O port specified by Port. The value written to the I/O port is
+  returned. This function must guarantee that all I/O read and write operations
+  are serialized.
+
+  If 32-bit I/O port operations are not supported, then ASSERT().
+
+  @param  Port    The I/O port to write.
+  @param  AndData The value to AND with the read value from the I/O port.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT32
+EFIAPI
+IoAnd32 (
+  IN      UINTN                     Port,
+  IN      UINT32                    AndData
+  );
+
+/**
+  Reads a 32-bit I/O port, performs a bitwise AND followed by a bitwise
+  inclusive OR, and writes the result back to the 32-bit I/O port.
+
+  Reads the 32-bit I/O port specified by Port, performs a bitwise AND between
+  the read result and the value specified by AndData, performs a bitwise OR
+  between the result of the AND operation and the value specified by OrData,
+  and writes the result to the 32-bit I/O port specified by Port. The value
+  written to the I/O port is returned. This function must guarantee that all
+  I/O read and write operations are serialized.
+
+  If 32-bit I/O port operations are not supported, then ASSERT().
+
+  @param  Port    The I/O port to write.
+  @param  AndData The value to AND with the read value from the I/O port.
+  @param  OrData  The value to OR with the result of the AND operation.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT32
+EFIAPI
+IoAndThenOr32 (
+  IN      UINTN                     Port,
+  IN      UINT32                    AndData,
+  IN      UINT32                    OrData
+  );
+
+/**
+  Reads a bit field of an I/O register.
+
+  Reads the bit field in a 32-bit I/O register. The bit field is specified by
+  the StartBit and the EndBit. The value of the bit field is returned.
+
+  If 32-bit I/O port operations are not supported, then ASSERT().
+  If StartBit is greater than 31, then ASSERT().
+  If EndBit is greater than 31, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Port      The I/O port to read.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..31.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..31.
+
+  @return The value read.
+
+**/
+UINT32
+EFIAPI
+IoBitFieldRead32 (
+  IN      UINTN                     Port,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit
+  );
+
+/**
+  Writes a bit field to an I/O register.
+
+  Writes Value to the bit field of the I/O register. The bit field is specified
+  by the StartBit and the EndBit. All other bits in the destination I/O
+  register are preserved. The value written to the I/O port is returned. Extra
+  left bits in Value are stripped.
+
+  If 32-bit I/O port operations are not supported, then ASSERT().
+  If StartBit is greater than 31, then ASSERT().
+  If EndBit is greater than 31, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Port      The I/O port to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..31.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..31.
+  @param  Value     New value of the bit field.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT32
+EFIAPI
+IoBitFieldWrite32 (
+  IN      UINTN                     Port,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT32                    Value
+  );
+
+/**
+  Reads a bit field in a 32-bit port, performs a bitwise OR, and writes the
+  result back to the bit field in the 32-bit port.
+
+  Reads the 32-bit I/O port specified by Port, performs a bitwise inclusive OR
+  between the read result and the value specified by OrData, and writes the
+  result to the 32-bit I/O port specified by Port. The value written to the I/O
+  port is returned. This function must guarantee that all I/O read and write
+  operations are serialized. Extra left bits in OrData are stripped.
+
+  If 32-bit I/O port operations are not supported, then ASSERT().
+  If StartBit is greater than 31, then ASSERT().
+  If EndBit is greater than 31, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Port      The I/O port to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..31.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..31.
+  @param  OrData    The value to OR with the read value from the I/O port.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT32
+EFIAPI
+IoBitFieldOr32 (
+  IN      UINTN                     Port,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT32                    OrData
+  );
+
+/**
+  Reads a bit field in a 32-bit port, performs a bitwise AND, and writes the
+  result back to the bit field in the 32-bit port.
+
+  Reads the 32-bit I/O port specified by Port, performs a bitwise AND between
+  the read result and the value specified by AndData, and writes the result to
+  the 32-bit I/O port specified by Port. The value written to the I/O port is
+  returned. This function must guarantee that all I/O read and write operations
+  are serialized. Extra left bits in AndData are stripped.
+
+  If 32-bit I/O port operations are not supported, then ASSERT().
+  If StartBit is greater than 31, then ASSERT().
+  If EndBit is greater than 31, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Port      The I/O port to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..31.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..31.
+  @param  AndData   The value to AND with the read value from the I/O port.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT32
+EFIAPI
+IoBitFieldAnd32 (
+  IN      UINTN                     Port,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT32                    AndData
+  );
+
+/**
+  Reads a bit field in a 32-bit port, performs a bitwise AND followed by a
+  bitwise inclusive OR, and writes the result back to the bit field in the
+  32-bit port.
+
+  Reads the 32-bit I/O port specified by Port, performs a bitwise AND followed
+  by a bitwise inclusive OR between the read result and the value specified by
+  AndData, and writes the result to the 32-bit I/O port specified by Port. The
+  value written to the I/O port is returned. This function must guarantee that
+  all I/O read and write operations are serialized. Extra left bits in both
+  AndData and OrData are stripped.
+
+  If 32-bit I/O port operations are not supported, then ASSERT().
+  If StartBit is greater than 31, then ASSERT().
+  If EndBit is greater than 31, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Port      The I/O port to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..31.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..31.
+  @param  AndData   The value to AND with the read value from the I/O port.
+  @param  OrData    The value to OR with the result of the AND operation.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT32
+EFIAPI
+IoBitFieldAndThenOr32 (
+  IN      UINTN                     Port,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT32                    AndData,
+  IN      UINT32                    OrData
+  );
+
+/**
+  Reads a 64-bit I/O port.
+
+  Reads the 64-bit I/O port specified by Port. The 64-bit read value is returned.
+  This function must guarantee that all I/O read and write operations are
+  serialized.
+
+  If 64-bit I/O port operations are not supported, then ASSERT().
+
+  @param  Port  The I/O port to read.
+
+  @return The value read.
+
+**/
+UINT64
+EFIAPI
+IoRead64 (
+  IN      UINTN                     Port
+  );
+
+/**
+  Writes a 64-bit I/O port.
+
+  Writes the 64-bit I/O port specified by Port with the value specified by Value
+  and returns Value. This function must guarantee that all I/O read and write
+  operations are serialized.
+
+  If 64-bit I/O port operations are not supported, then ASSERT().
+
+  @param  Port  The I/O port to write.
+  @param  Value The value to write to the I/O port.
+
+  @return The value written the I/O port.
+
+**/
+UINT64
+EFIAPI
+IoWrite64 (
+  IN      UINTN                     Port,
+  IN      UINT64                    Value
+  );
+
+/**
+  Reads a 64-bit I/O port, performs a bitwise inclusive OR, and writes the
+  result back to the 64-bit I/O port.
+
+  Reads the 64-bit I/O port specified by Port, performs a bitwise inclusive OR
+  between the read result and the value specified by OrData, and writes the
+  result to the 64-bit I/O port specified by Port. The value written to the I/O
+  port is returned. This function must guarantee that all I/O read and write
+  operations are serialized.
+
+  If 64-bit I/O port operations are not supported, then ASSERT().
+
+  @param  Port    The I/O port to write.
+  @param  OrData  The value to OR with the read value from the I/O port.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT64
+EFIAPI
+IoOr64 (
+  IN      UINTN                     Port,
+  IN      UINT64                    OrData
+  );
+
+/**
+  Reads a 64-bit I/O port, performs a bitwise AND, and writes the result back
+  to the 64-bit I/O port.
+
+  Reads the 64-bit I/O port specified by Port, performs a bitwise AND between
+  the read result and the value specified by AndData, and writes the result to
+  the 64-bit I/O port specified by Port. The value written to the I/O port is
+  returned. This function must guarantee that all I/O read and write operations
+  are serialized.
+
+  If 64-bit I/O port operations are not supported, then ASSERT().
+
+  @param  Port    The I/O port to write.
+  @param  AndData The value to AND with the read value from the I/O port.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT64
+EFIAPI
+IoAnd64 (
+  IN      UINTN                     Port,
+  IN      UINT64                    AndData
+  );
+
+/**
+  Reads a 64-bit I/O port, performs a bitwise AND followed by a bitwise
+  inclusive OR, and writes the result back to the 64-bit I/O port.
+
+  Reads the 64-bit I/O port specified by Port, performs a bitwise AND between
+  the read result and the value specified by AndData, performs a bitwise OR
+  between the result of the AND operation and the value specified by OrData,
+  and writes the result to the 64-bit I/O port specified by Port. The value
+  written to the I/O port is returned. This function must guarantee that all
+  I/O read and write operations are serialized.
+
+  If 64-bit I/O port operations are not supported, then ASSERT().
+
+  @param  Port    The I/O port to write.
+  @param  AndData The value to AND with the read value from the I/O port.
+  @param  OrData  The value to OR with the result of the AND operation.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT64
+EFIAPI
+IoAndThenOr64 (
+  IN      UINTN                     Port,
+  IN      UINT64                    AndData,
+  IN      UINT64                    OrData
+  );
+
+/**
+  Reads a bit field of an I/O register.
+
+  Reads the bit field in a 64-bit I/O register. The bit field is specified by
+  the StartBit and the EndBit. The value of the bit field is returned.
+
+  If 64-bit I/O port operations are not supported, then ASSERT().
+  If StartBit is greater than 63, then ASSERT().
+  If EndBit is greater than 63, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Port      The I/O port to read.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..63.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..63.
+
+  @return The value read.
+
+**/
+UINT64
+EFIAPI
+IoBitFieldRead64 (
+  IN      UINTN                     Port,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit
+  );
+
+/**
+  Writes a bit field to an I/O register.
+
+  Writes Value to the bit field of the I/O register. The bit field is specified
+  by the StartBit and the EndBit. All other bits in the destination I/O
+  register are preserved. The value written to the I/O port is returned. Extra
+  left bits in Value are stripped.
+
+  If 64-bit I/O port operations are not supported, then ASSERT().
+  If StartBit is greater than 63, then ASSERT().
+  If EndBit is greater than 63, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Port      The I/O port to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..63.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..63.
+  @param  Value     New value of the bit field.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT64
+EFIAPI
+IoBitFieldWrite64 (
+  IN      UINTN                     Port,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT64                    Value
+  );
+
+/**
+  Reads a bit field in a 64-bit port, performs a bitwise OR, and writes the
+  result back to the bit field in the 64-bit port.
+
+  Reads the 64-bit I/O port specified by Port, performs a bitwise inclusive OR
+  between the read result and the value specified by OrData, and writes the
+  result to the 64-bit I/O port specified by Port. The value written to the I/O
+  port is returned. This function must guarantee that all I/O read and write
+  operations are serialized. Extra left bits in OrData are stripped.
+
+  If 64-bit I/O port operations are not supported, then ASSERT().
+  If StartBit is greater than 63, then ASSERT().
+  If EndBit is greater than 63, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Port      The I/O port to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..63.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..63.
+  @param  OrData    The value to OR with the read value from the I/O port.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT64
+EFIAPI
+IoBitFieldOr64 (
+  IN      UINTN                     Port,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT64                    OrData
+  );
+
+/**
+  Reads a bit field in a 64-bit port, performs a bitwise AND, and writes the
+  result back to the bit field in the 64-bit port.
+
+  Reads the 64-bit I/O port specified by Port, performs a bitwise AND between
+  the read result and the value specified by AndData, and writes the result to
+  the 64-bit I/O port specified by Port. The value written to the I/O port is
+  returned. This function must guarantee that all I/O read and write operations
+  are serialized. Extra left bits in AndData are stripped.
+
+  If 64-bit I/O port operations are not supported, then ASSERT().
+  If StartBit is greater than 63, then ASSERT().
+  If EndBit is greater than 63, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Port      The I/O port to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..63.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..63.
+  @param  AndData   The value to AND with the read value from the I/O port.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT64
+EFIAPI
+IoBitFieldAnd64 (
+  IN      UINTN                     Port,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT64                    AndData
+  );
+
+/**
+  Reads a bit field in a 64-bit port, performs a bitwise AND followed by a
+  bitwise inclusive OR, and writes the result back to the bit field in the
+  64-bit port.
+
+  Reads the 64-bit I/O port specified by Port, performs a bitwise AND followed
+  by a bitwise inclusive OR between the read result and the value specified by
+  AndData, and writes the result to the 64-bit I/O port specified by Port. The
+  value written to the I/O port is returned. This function must guarantee that
+  all I/O read and write operations are serialized. Extra left bits in both
+  AndData and OrData are stripped.
+
+  If 64-bit I/O port operations are not supported, then ASSERT().
+  If StartBit is greater than 63, then ASSERT().
+  If EndBit is greater than 63, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Port      The I/O port to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..63.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..63.
+  @param  AndData   The value to AND with the read value from the I/O port.
+  @param  OrData    The value to OR with the result of the AND operation.
+
+  @return The value written back to the I/O port.
+
+**/
+UINT64
+EFIAPI
+IoBitFieldAndThenOr64 (
+  IN      UINTN                     Port,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT64                    AndData,
+  IN      UINT64                    OrData
+  );
+
+/**
+  Reads an 8-bit MMIO register.
+
+  Reads the 8-bit MMIO register specified by Address. The 8-bit read value is
+  returned. This function must guarantee that all MMIO read and write
+  operations are serialized.
+
+  If 8-bit MMIO register operations are not supported, then ASSERT().
+
+  @param  Address The MMIO register to read.
+
+  @return The value read.
+
+**/
+UINT8
+EFIAPI
+MmioRead8 (
+  IN      UINTN                     Address
+  );
+
+/**
+  Writes an 8-bit MMIO register.
+
+  Writes the 8-bit MMIO register specified by Address with the value specified
+  by Value and returns Value. This function must guarantee that all MMIO read
+  and write operations are serialized.
+
+  If 8-bit MMIO register operations are not supported, then ASSERT().
+
+  @param  Address The MMIO register to write.
+  @param  Value   The value to write to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+MmioWrite8 (
+  IN      UINTN                     Address,
+  IN      UINT8                     Value
+  );
+
+/**
+  Reads an 8-bit MMIO register, performs a bitwise inclusive OR, and writes the
+  result back to the 8-bit MMIO register.
+
+  Reads the 8-bit MMIO register specified by Address, performs a bitwise
+  inclusive OR between the read result and the value specified by OrData, and
+  writes the result to the 8-bit MMIO register specified by Address. The value
+  written to the MMIO register is returned. This function must guarantee that
+  all MMIO read and write operations are serialized.
+
+  If 8-bit MMIO register operations are not supported, then ASSERT().
+
+  @param  Address The MMIO register to write.
+  @param  OrData  The value to OR with the read value from the MMIO register.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+MmioOr8 (
+  IN      UINTN                     Address,
+  IN      UINT8                     OrData
+  );
+
+/**
+  Reads an 8-bit MMIO register, performs a bitwise AND, and writes the result
+  back to the 8-bit MMIO register.
+
+  Reads the 8-bit MMIO register specified by Address, performs a bitwise AND
+  between the read result and the value specified by AndData, and writes the
+  result to the 8-bit MMIO register specified by Address. The value written to
+  the MMIO register is returned. This function must guarantee that all MMIO
+  read and write operations are serialized.
+
+  If 8-bit MMIO register operations are not supported, then ASSERT().
+
+  @param  Address The MMIO register to write.
+  @param  AndData The value to AND with the read value from the MMIO register.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+MmioAnd8 (
+  IN      UINTN                     Address,
+  IN      UINT8                     AndData
+  );
+
+/**
+  Reads an 8-bit MMIO register, performs a bitwise AND followed by a bitwise
+  inclusive OR, and writes the result back to the 8-bit MMIO register.
+
+  Reads the 8-bit MMIO register specified by Address, performs a bitwise AND
+  between the read result and the value specified by AndData, performs a
+  bitwise OR between the result of the AND operation and the value specified by
+  OrData, and writes the result to the 8-bit MMIO register specified by
+  Address. The value written to the MMIO register is returned. This function
+  must guarantee that all MMIO read and write operations are serialized.
+
+  If 8-bit MMIO register operations are not supported, then ASSERT().
+
+
+  @param  Address The MMIO register to write.
+  @param  AndData The value to AND with the read value from the MMIO register.
+  @param  OrData  The value to OR with the result of the AND operation.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+MmioAndThenOr8 (
+  IN      UINTN                     Address,
+  IN      UINT8                     AndData,
+  IN      UINT8                     OrData
+  );
+
+/**
+  Reads a bit field of a MMIO register.
+
+  Reads the bit field in an 8-bit MMIO register. The bit field is specified by
+  the StartBit and the EndBit. The value of the bit field is returned.
+
+  If 8-bit MMIO register operations are not supported, then ASSERT().
+  If StartBit is greater than 7, then ASSERT().
+  If EndBit is greater than 7, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Address   MMIO register to read.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..7.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..7.
+
+  @return The value read.
+
+**/
+UINT8
+EFIAPI
+MmioBitFieldRead8 (
+  IN      UINTN                     Address,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit
+  );
+
+/**
+  Writes a bit field to a MMIO register.
+
+  Writes Value to the bit field of the MMIO register. The bit field is
+  specified by the StartBit and the EndBit. All other bits in the destination
+  MMIO register are preserved. The new value of the 8-bit register is returned.
+
+  If 8-bit MMIO register operations are not supported, then ASSERT().
+  If StartBit is greater than 7, then ASSERT().
+  If EndBit is greater than 7, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Address   MMIO register to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..7.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..7.
+  @param  Value     New value of the bit field.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+MmioBitFieldWrite8 (
+  IN      UINTN                     Address,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT8                     Value
+  );
+
+/**
+  Reads a bit field in an 8-bit MMIO register, performs a bitwise OR, and
+  writes the result back to the bit field in the 8-bit MMIO register.
+
+  Reads the 8-bit MMIO register specified by Address, performs a bitwise
+  inclusive OR between the read result and the value specified by OrData, and
+  writes the result to the 8-bit MMIO register specified by Address. The value
+  written to the MMIO register is returned. This function must guarantee that
+  all MMIO read and write operations are serialized. Extra left bits in OrData
+  are stripped.
+
+  If 8-bit MMIO register operations are not supported, then ASSERT().
+  If StartBit is greater than 7, then ASSERT().
+  If EndBit is greater than 7, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Address   MMIO register to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..7.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..7.
+  @param  OrData    The value to OR with read value from the MMIO register.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+MmioBitFieldOr8 (
+  IN      UINTN                     Address,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT8                     OrData
+  );
+
+/**
+  Reads a bit field in an 8-bit MMIO register, performs a bitwise AND, and
+  writes the result back to the bit field in the 8-bit MMIO register.
+
+  Reads the 8-bit MMIO register specified by Address, performs a bitwise AND
+  between the read result and the value specified by AndData, and writes the
+  result to the 8-bit MMIO register specified by Address. The value written to
+  the MMIO register is returned. This function must guarantee that all MMIO
+  read and write operations are serialized. Extra left bits in AndData are
+  stripped.
+
+  If 8-bit MMIO register operations are not supported, then ASSERT().
+  If StartBit is greater than 7, then ASSERT().
+  If EndBit is greater than 7, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Address   MMIO register to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..7.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..7.
+  @param  AndData   The value to AND with read value from the MMIO register.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+MmioBitFieldAnd8 (
+  IN      UINTN                     Address,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT8                     AndData
+  );
+
+/**
+  Reads a bit field in an 8-bit MMIO register, performs a bitwise AND followed
+  by a bitwise inclusive OR, and writes the result back to the bit field in the
+  8-bit MMIO register.
+
+  Reads the 8-bit MMIO register specified by Address, performs a bitwise AND
+  followed by a bitwise inclusive OR between the read result and the value
+  specified by AndData, and writes the result to the 8-bit MMIO register
+  specified by Address. The value written to the MMIO register is returned.
+  This function must guarantee that all MMIO read and write operations are
+  serialized. Extra left bits in both AndData and OrData are stripped.
+
+  If 8-bit MMIO register operations are not supported, then ASSERT().
+  If StartBit is greater than 7, then ASSERT().
+  If EndBit is greater than 7, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Address   MMIO register to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..7.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..7.
+  @param  AndData   The value to AND with read value from the MMIO register.
+  @param  OrData    The value to OR with the result of the AND operation.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT8
+EFIAPI
+MmioBitFieldAndThenOr8 (
+  IN      UINTN                     Address,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT8                     AndData,
+  IN      UINT8                     OrData
+  );
+
+/**
+  Reads a 16-bit MMIO register.
+
+  Reads the 16-bit MMIO register specified by Address. The 16-bit read value is
+  returned. This function must guarantee that all MMIO read and write
+  operations are serialized.
+
+  If 16-bit MMIO register operations are not supported, then ASSERT().
+
+  @param  Address The MMIO register to read.
+
+  @return The value read.
+
+**/
+UINT16
+EFIAPI
+MmioRead16 (
+  IN      UINTN                     Address
+  );
+
+/**
+  Writes a 16-bit MMIO register.
+
+  Writes the 16-bit MMIO register specified by Address with the value specified
+  by Value and returns Value. This function must guarantee that all MMIO read
+  and write operations are serialized.
+
+  If 16-bit MMIO register operations are not supported, then ASSERT().
+
+  @param  Address The MMIO register to write.
+  @param  Value   The value to write to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+MmioWrite16 (
+  IN      UINTN                     Address,
+  IN      UINT16                    Value
+  );
+
+/**
+  Reads a 16-bit MMIO register, performs a bitwise inclusive OR, and writes the
+  result back to the 16-bit MMIO register.
+
+  Reads the 16-bit MMIO register specified by Address, performs a bitwise
+  inclusive OR between the read result and the value specified by OrData, and
+  writes the result to the 16-bit MMIO register specified by Address. The value
+  written to the MMIO register is returned. This function must guarantee that
+  all MMIO read and write operations are serialized.
+
+  If 16-bit MMIO register operations are not supported, then ASSERT().
+
+  @param  Address The MMIO register to write.
+  @param  OrData  The value to OR with the read value from the MMIO register.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+MmioOr16 (
+  IN      UINTN                     Address,
+  IN      UINT16                    OrData
+  );
+
+/**
+  Reads a 16-bit MMIO register, performs a bitwise AND, and writes the result
+  back to the 16-bit MMIO register.
+
+  Reads the 16-bit MMIO register specified by Address, performs a bitwise AND
+  between the read result and the value specified by AndData, and writes the
+  result to the 16-bit MMIO register specified by Address. The value written to
+  the MMIO register is returned. This function must guarantee that all MMIO
+  read and write operations are serialized.
+
+  If 16-bit MMIO register operations are not supported, then ASSERT().
+
+  @param  Address The MMIO register to write.
+  @param  AndData The value to AND with the read value from the MMIO register.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+MmioAnd16 (
+  IN      UINTN                     Address,
+  IN      UINT16                    AndData
+  );
+
+/**
+  Reads a 16-bit MMIO register, performs a bitwise AND followed by a bitwise
+  inclusive OR, and writes the result back to the 16-bit MMIO register.
+
+  Reads the 16-bit MMIO register specified by Address, performs a bitwise AND
+  between the read result and the value specified by AndData, performs a
+  bitwise OR between the result of the AND operation and the value specified by
+  OrData, and writes the result to the 16-bit MMIO register specified by
+  Address. The value written to the MMIO register is returned. This function
+  must guarantee that all MMIO read and write operations are serialized.
+
+  If 16-bit MMIO register operations are not supported, then ASSERT().
+
+
+  @param  Address The MMIO register to write.
+  @param  AndData The value to AND with the read value from the MMIO register.
+  @param  OrData  The value to OR with the result of the AND operation.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+MmioAndThenOr16 (
+  IN      UINTN                     Address,
+  IN      UINT16                    AndData,
+  IN      UINT16                    OrData
+  );
+
+/**
+  Reads a bit field of a MMIO register.
+
+  Reads the bit field in a 16-bit MMIO register. The bit field is specified by
+  the StartBit and the EndBit. The value of the bit field is returned.
+
+  If 16-bit MMIO register operations are not supported, then ASSERT().
+  If StartBit is greater than 15, then ASSERT().
+  If EndBit is greater than 15, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Address   MMIO register to read.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..15.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..15.
+
+  @return The value read.
+
+**/
+UINT16
+EFIAPI
+MmioBitFieldRead16 (
+  IN      UINTN                     Address,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit
+  );
+
+/**
+  Writes a bit field to a MMIO register.
+
+  Writes Value to the bit field of the MMIO register. The bit field is
+  specified by the StartBit and the EndBit. All other bits in the destination
+  MMIO register are preserved. The new value of the 16-bit register is returned.
+
+  If 16-bit MMIO register operations are not supported, then ASSERT().
+  If StartBit is greater than 15, then ASSERT().
+  If EndBit is greater than 15, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Address   MMIO register to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..15.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..15.
+  @param  Value     New value of the bit field.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+MmioBitFieldWrite16 (
+  IN      UINTN                     Address,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT16                    Value
+  );
+
+/**
+  Reads a bit field in a 16-bit MMIO register, performs a bitwise OR, and
+  writes the result back to the bit field in the 16-bit MMIO register.
+
+  Reads the 16-bit MMIO register specified by Address, performs a bitwise
+  inclusive OR between the read result and the value specified by OrData, and
+  writes the result to the 16-bit MMIO register specified by Address. The value
+  written to the MMIO register is returned. This function must guarantee that
+  all MMIO read and write operations are serialized. Extra left bits in OrData
+  are stripped.
+
+  If 16-bit MMIO register operations are not supported, then ASSERT().
+  If StartBit is greater than 15, then ASSERT().
+  If EndBit is greater than 15, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Address   MMIO register to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..15.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..15.
+  @param  OrData    The value to OR with read value from the MMIO register.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+MmioBitFieldOr16 (
+  IN      UINTN                     Address,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT16                    OrData
+  );
+
+/**
+  Reads a bit field in a 16-bit MMIO register, performs a bitwise AND, and
+  writes the result back to the bit field in the 16-bit MMIO register.
+
+  Reads the 16-bit MMIO register specified by Address, performs a bitwise AND
+  between the read result and the value specified by AndData, and writes the
+  result to the 16-bit MMIO register specified by Address. The value written to
+  the MMIO register is returned. This function must guarantee that all MMIO
+  read and write operations are serialized. Extra left bits in AndData are
+  stripped.
+
+  If 16-bit MMIO register operations are not supported, then ASSERT().
+  If StartBit is greater than 15, then ASSERT().
+  If EndBit is greater than 15, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Address   MMIO register to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..15.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..15.
+  @param  AndData   The value to AND with read value from the MMIO register.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+MmioBitFieldAnd16 (
+  IN      UINTN                     Address,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT16                    AndData
+  );
+
+/**
+  Reads a bit field in a 16-bit MMIO register, performs a bitwise AND followed
+  by a bitwise inclusive OR, and writes the result back to the bit field in the
+  16-bit MMIO register.
+
+  Reads the 16-bit MMIO register specified by Address, performs a bitwise AND
+  followed by a bitwise inclusive OR between the read result and the value
+  specified by AndData, and writes the result to the 16-bit MMIO register
+  specified by Address. The value written to the MMIO register is returned.
+  This function must guarantee that all MMIO read and write operations are
+  serialized. Extra left bits in both AndData and OrData are stripped.
+
+  If 16-bit MMIO register operations are not supported, then ASSERT().
+  If StartBit is greater than 15, then ASSERT().
+  If EndBit is greater than 15, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Address   MMIO register to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..15.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..15.
+  @param  AndData   The value to AND with read value from the MMIO register.
+  @param  OrData    The value to OR with the result of the AND operation.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT16
+EFIAPI
+MmioBitFieldAndThenOr16 (
+  IN      UINTN                     Address,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT16                    AndData,
+  IN      UINT16                    OrData
+  );
+
+/**
+  Reads a 32-bit MMIO register.
+
+  Reads the 32-bit MMIO register specified by Address. The 32-bit read value is
+  returned. This function must guarantee that all MMIO read and write
+  operations are serialized.
+
+  If 32-bit MMIO register operations are not supported, then ASSERT().
+
+  @param  Address The MMIO register to read.
+
+  @return The value read.
+
+**/
+UINT32
+EFIAPI
+MmioRead32 (
+  IN      UINTN                     Address
+  );
+
+/**
+  Writes a 32-bit MMIO register.
+
+  Writes the 32-bit MMIO register specified by Address with the value specified
+  by Value and returns Value. This function must guarantee that all MMIO read
+  and write operations are serialized.
+
+  If 32-bit MMIO register operations are not supported, then ASSERT().
+
+  @param  Address The MMIO register to write.
+  @param  Value   The value to write to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+MmioWrite32 (
+  IN      UINTN                     Address,
+  IN      UINT32                    Value
+  );
+
+/**
+  Reads a 32-bit MMIO register, performs a bitwise inclusive OR, and writes the
+  result back to the 32-bit MMIO register.
+
+  Reads the 32-bit MMIO register specified by Address, performs a bitwise
+  inclusive OR between the read result and the value specified by OrData, and
+  writes the result to the 32-bit MMIO register specified by Address. The value
+  written to the MMIO register is returned. This function must guarantee that
+  all MMIO read and write operations are serialized.
+
+  If 32-bit MMIO register operations are not supported, then ASSERT().
+
+  @param  Address The MMIO register to write.
+  @param  OrData  The value to OR with the read value from the MMIO register.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+MmioOr32 (
+  IN      UINTN                     Address,
+  IN      UINT32                    OrData
+  );
+
+/**
+  Reads a 32-bit MMIO register, performs a bitwise AND, and writes the result
+  back to the 32-bit MMIO register.
+
+  Reads the 32-bit MMIO register specified by Address, performs a bitwise AND
+  between the read result and the value specified by AndData, and writes the
+  result to the 32-bit MMIO register specified by Address. The value written to
+  the MMIO register is returned. This function must guarantee that all MMIO
+  read and write operations are serialized.
+
+  If 32-bit MMIO register operations are not supported, then ASSERT().
+
+  @param  Address The MMIO register to write.
+  @param  AndData The value to AND with the read value from the MMIO register.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+MmioAnd32 (
+  IN      UINTN                     Address,
+  IN      UINT32                    AndData
+  );
+
+/**
+  Reads a 32-bit MMIO register, performs a bitwise AND followed by a bitwise
+  inclusive OR, and writes the result back to the 32-bit MMIO register.
+
+  Reads the 32-bit MMIO register specified by Address, performs a bitwise AND
+  between the read result and the value specified by AndData, performs a
+  bitwise OR between the result of the AND operation and the value specified by
+  OrData, and writes the result to the 32-bit MMIO register specified by
+  Address. The value written to the MMIO register is returned. This function
+  must guarantee that all MMIO read and write operations are serialized.
+
+  If 32-bit MMIO register operations are not supported, then ASSERT().
+
+
+  @param  Address The MMIO register to write.
+  @param  AndData The value to AND with the read value from the MMIO register.
+  @param  OrData  The value to OR with the result of the AND operation.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+MmioAndThenOr32 (
+  IN      UINTN                     Address,
+  IN      UINT32                    AndData,
+  IN      UINT32                    OrData
+  );
+
+/**
+  Reads a bit field of a MMIO register.
+
+  Reads the bit field in a 32-bit MMIO register. The bit field is specified by
+  the StartBit and the EndBit. The value of the bit field is returned.
+
+  If 32-bit MMIO register operations are not supported, then ASSERT().
+  If StartBit is greater than 31, then ASSERT().
+  If EndBit is greater than 31, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Address   MMIO register to read.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..31.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..31.
+
+  @return The value read.
+
+**/
+UINT32
+EFIAPI
+MmioBitFieldRead32 (
+  IN      UINTN                     Address,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit
+  );
+
+/**
+  Writes a bit field to a MMIO register.
+
+  Writes Value to the bit field of the MMIO register. The bit field is
+  specified by the StartBit and the EndBit. All other bits in the destination
+  MMIO register are preserved. The new value of the 32-bit register is returned.
+
+  If 32-bit MMIO register operations are not supported, then ASSERT().
+  If StartBit is greater than 31, then ASSERT().
+  If EndBit is greater than 31, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Address   MMIO register to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..31.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..31.
+  @param  Value     New value of the bit field.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+MmioBitFieldWrite32 (
+  IN      UINTN                     Address,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT32                    Value
+  );
+
+/**
+  Reads a bit field in a 32-bit MMIO register, performs a bitwise OR, and
+  writes the result back to the bit field in the 32-bit MMIO register.
+
+  Reads the 32-bit MMIO register specified by Address, performs a bitwise
+  inclusive OR between the read result and the value specified by OrData, and
+  writes the result to the 32-bit MMIO register specified by Address. The value
+  written to the MMIO register is returned. This function must guarantee that
+  all MMIO read and write operations are serialized. Extra left bits in OrData
+  are stripped.
+
+  If 32-bit MMIO register operations are not supported, then ASSERT().
+  If StartBit is greater than 31, then ASSERT().
+  If EndBit is greater than 31, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Address   MMIO register to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..31.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..31.
+  @param  OrData    The value to OR with read value from the MMIO register.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+MmioBitFieldOr32 (
+  IN      UINTN                     Address,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT32                    OrData
+  );
+
+/**
+  Reads a bit field in a 32-bit MMIO register, performs a bitwise AND, and
+  writes the result back to the bit field in the 32-bit MMIO register.
+
+  Reads the 32-bit MMIO register specified by Address, performs a bitwise AND
+  between the read result and the value specified by AndData, and writes the
+  result to the 32-bit MMIO register specified by Address. The value written to
+  the MMIO register is returned. This function must guarantee that all MMIO
+  read and write operations are serialized. Extra left bits in AndData are
+  stripped.
+
+  If 32-bit MMIO register operations are not supported, then ASSERT().
+  If StartBit is greater than 31, then ASSERT().
+  If EndBit is greater than 31, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Address   MMIO register to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..31.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..31.
+  @param  AndData   The value to AND with read value from the MMIO register.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+MmioBitFieldAnd32 (
+  IN      UINTN                     Address,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT32                    AndData
+  );
+
+/**
+  Reads a bit field in a 32-bit MMIO register, performs a bitwise AND followed
+  by a bitwise inclusive OR, and writes the result back to the bit field in the
+  32-bit MMIO register.
+
+  Reads the 32-bit MMIO register specified by Address, performs a bitwise AND
+  followed by a bitwise inclusive OR between the read result and the value
+  specified by AndData, and writes the result to the 32-bit MMIO register
+  specified by Address. The value written to the MMIO register is returned.
+  This function must guarantee that all MMIO read and write operations are
+  serialized. Extra left bits in both AndData and OrData are stripped.
+
+  If 32-bit MMIO register operations are not supported, then ASSERT().
+  If StartBit is greater than 31, then ASSERT().
+  If EndBit is greater than 31, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Address   MMIO register to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..31.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..31.
+  @param  AndData   The value to AND with read value from the MMIO register.
+  @param  OrData    The value to OR with the result of the AND operation.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT32
+EFIAPI
+MmioBitFieldAndThenOr32 (
+  IN      UINTN                     Address,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT32                    AndData,
+  IN      UINT32                    OrData
+  );
+
+/**
+  Reads a 64-bit MMIO register.
+
+  Reads the 64-bit MMIO register specified by Address. The 64-bit read value is
+  returned. This function must guarantee that all MMIO read and write
+  operations are serialized.
+
+  If 64-bit MMIO register operations are not supported, then ASSERT().
+
+  @param  Address The MMIO register to read.
+
+  @return The value read.
+
+**/
+UINT64
+EFIAPI
+MmioRead64 (
+  IN      UINTN                     Address
+  );
+
+/**
+  Writes a 64-bit MMIO register.
+
+  Writes the 64-bit MMIO register specified by Address with the value specified
+  by Value and returns Value. This function must guarantee that all MMIO read
+  and write operations are serialized.
+
+  If 64-bit MMIO register operations are not supported, then ASSERT().
+
+  @param  Address The MMIO register to write.
+  @param  Value   The value to write to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+MmioWrite64 (
+  IN      UINTN                     Address,
+  IN      UINT64                    Value
+  );
+
+/**
+  Reads a 64-bit MMIO register, performs a bitwise inclusive OR, and writes the
+  result back to the 64-bit MMIO register.
+
+  Reads the 64-bit MMIO register specified by Address, performs a bitwise
+  inclusive OR between the read result and the value specified by OrData, and
+  writes the result to the 64-bit MMIO register specified by Address. The value
+  written to the MMIO register is returned. This function must guarantee that
+  all MMIO read and write operations are serialized.
+
+  If 64-bit MMIO register operations are not supported, then ASSERT().
+
+  @param  Address The MMIO register to write.
+  @param  OrData  The value to OR with the read value from the MMIO register.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+MmioOr64 (
+  IN      UINTN                     Address,
+  IN      UINT64                    OrData
+  );
+
+/**
+  Reads a 64-bit MMIO register, performs a bitwise AND, and writes the result
+  back to the 64-bit MMIO register.
+
+  Reads the 64-bit MMIO register specified by Address, performs a bitwise AND
+  between the read result and the value specified by AndData, and writes the
+  result to the 64-bit MMIO register specified by Address. The value written to
+  the MMIO register is returned. This function must guarantee that all MMIO
+  read and write operations are serialized.
+
+  If 64-bit MMIO register operations are not supported, then ASSERT().
+
+  @param  Address The MMIO register to write.
+  @param  AndData The value to AND with the read value from the MMIO register.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+MmioAnd64 (
+  IN      UINTN                     Address,
+  IN      UINT64                    AndData
+  );
+
+/**
+  Reads a 64-bit MMIO register, performs a bitwise AND followed by a bitwise
+  inclusive OR, and writes the result back to the 64-bit MMIO register.
+
+  Reads the 64-bit MMIO register specified by Address, performs a bitwise AND
+  between the read result and the value specified by AndData, performs a
+  bitwise OR between the result of the AND operation and the value specified by
+  OrData, and writes the result to the 64-bit MMIO register specified by
+  Address. The value written to the MMIO register is returned. This function
+  must guarantee that all MMIO read and write operations are serialized.
+
+  If 64-bit MMIO register operations are not supported, then ASSERT().
+
+
+  @param  Address The MMIO register to write.
+  @param  AndData The value to AND with the read value from the MMIO register.
+  @param  OrData  The value to OR with the result of the AND operation.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+MmioAndThenOr64 (
+  IN      UINTN                     Address,
+  IN      UINT64                    AndData,
+  IN      UINT64                    OrData
+  );
+
+/**
+  Reads a bit field of a MMIO register.
+
+  Reads the bit field in a 64-bit MMIO register. The bit field is specified by
+  the StartBit and the EndBit. The value of the bit field is returned.
+
+  If 64-bit MMIO register operations are not supported, then ASSERT().
+  If StartBit is greater than 63, then ASSERT().
+  If EndBit is greater than 63, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Address   MMIO register to read.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..63.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..63.
+
+  @return The value read.
+
+**/
+UINT64
+EFIAPI
+MmioBitFieldRead64 (
+  IN      UINTN                     Address,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit
+  );
+
+/**
+  Writes a bit field to a MMIO register.
+
+  Writes Value to the bit field of the MMIO register. The bit field is
+  specified by the StartBit and the EndBit. All other bits in the destination
+  MMIO register are preserved. The new value of the 64-bit register is returned.
+
+  If 64-bit MMIO register operations are not supported, then ASSERT().
+  If StartBit is greater than 63, then ASSERT().
+  If EndBit is greater than 63, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Address   MMIO register to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..63.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..63.
+  @param  Value     New value of the bit field.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+MmioBitFieldWrite64 (
+  IN      UINTN                     Address,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT64                    Value
+  );
+
+/**
+  Reads a bit field in a 64-bit MMIO register, performs a bitwise OR, and
+  writes the result back to the bit field in the 64-bit MMIO register.
+
+  Reads the 64-bit MMIO register specified by Address, performs a bitwise
+  inclusive OR between the read result and the value specified by OrData, and
+  writes the result to the 64-bit MMIO register specified by Address. The value
+  written to the MMIO register is returned. This function must guarantee that
+  all MMIO read and write operations are serialized. Extra left bits in OrData
+  are stripped.
+
+  If 64-bit MMIO register operations are not supported, then ASSERT().
+  If StartBit is greater than 63, then ASSERT().
+  If EndBit is greater than 63, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Address   MMIO register to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..63.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..63.
+  @param  OrData    The value to OR with read value from the MMIO register.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+MmioBitFieldOr64 (
+  IN      UINTN                     Address,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT64                    OrData
+  );
+
+/**
+  Reads a bit field in a 64-bit MMIO register, performs a bitwise AND, and
+  writes the result back to the bit field in the 64-bit MMIO register.
+
+  Reads the 64-bit MMIO register specified by Address, performs a bitwise AND
+  between the read result and the value specified by AndData, and writes the
+  result to the 64-bit MMIO register specified by Address. The value written to
+  the MMIO register is returned. This function must guarantee that all MMIO
+  read and write operations are serialized. Extra left bits in AndData are
+  stripped.
+
+  If 64-bit MMIO register operations are not supported, then ASSERT().
+  If StartBit is greater than 63, then ASSERT().
+  If EndBit is greater than 63, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Address   MMIO register to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..63.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..63.
+  @param  AndData   The value to AND with read value from the MMIO register.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+MmioBitFieldAnd64 (
+  IN      UINTN                     Address,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT64                    AndData
+  );
+
+/**
+  Reads a bit field in a 64-bit MMIO register, performs a bitwise AND followed
+  by a bitwise inclusive OR, and writes the result back to the bit field in the
+  64-bit MMIO register.
+
+  Reads the 64-bit MMIO register specified by Address, performs a bitwise AND
+  followed by a bitwise inclusive OR between the read result and the value
+  specified by AndData, and writes the result to the 64-bit MMIO register
+  specified by Address. The value written to the MMIO register is returned.
+  This function must guarantee that all MMIO read and write operations are
+  serialized. Extra left bits in both AndData and OrData are stripped.
+
+  If 64-bit MMIO register operations are not supported, then ASSERT().
+  If StartBit is greater than 63, then ASSERT().
+  If EndBit is greater than 63, then ASSERT().
+  If EndBit is less than StartBit, then ASSERT().
+
+  @param  Address   MMIO register to write.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+                    Range 0..63.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+                    Range 0..63.
+  @param  AndData   The value to AND with read value from the MMIO register.
+  @param  OrData    The value to OR with the result of the AND operation.
+
+  @return The value written back to the MMIO register.
+
+**/
+UINT64
+EFIAPI
+MmioBitFieldAndThenOr64 (
+  IN      UINTN                     Address,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      UINT64                    AndData,
+  IN      UINT64                    OrData
+  );
+
+/**
+  Copy data from MMIO region to system memory by using 8-bit access.
+
+  Copy data from MMIO region specified by starting address StartAddress 
+  to system memory specified by Buffer by using 8-bit access. The total 
+  number of byte to be copied is specified by Length. Buffer is returned.
+  
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). 
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
+
+
+  @param  StartAddress    Starting address for the MMIO region to be copied from.
+  @param  Length          Size in bytes of the copy.
+  @param  Buffer          Pointer to a system memory buffer receiving the data read.
+
+  @return Buffer
+
+**/
+UINT8 *
+EFIAPI
+MmioReadBuffer8 (
+  IN  UINTN       StartAddress,
+  IN  UINTN       Length,
+  OUT UINT8       *Buffer
+  );
+
+/**
+  Copy data from MMIO region to system memory by using 16-bit access.
+
+  Copy data from MMIO region specified by starting address StartAddress 
+  to system memory specified by Buffer by using 16-bit access. The total 
+  number of byte to be copied is specified by Length. Buffer is returned.
+  
+  If StartAddress is not aligned on a 16-bit boundary, then ASSERT().
+
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). 
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
+
+  If Length is not aligned on a 16-bit boundary, then ASSERT().
+  If Buffer is not aligned on a 16-bit boundary, then ASSERT().
+
+  @param  StartAddress    Starting address for the MMIO region to be copied from.
+  @param  Length          Size in bytes of the copy.
+  @param  Buffer          Pointer to a system memory buffer receiving the data read.
+
+  @return Buffer
+
+**/
+UINT16 *
+EFIAPI
+MmioReadBuffer16 (
+  IN  UINTN       StartAddress,
+  IN  UINTN       Length,
+  OUT UINT16      *Buffer
+  );
+
+/**
+  Copy data from MMIO region to system memory by using 32-bit access.
+
+  Copy data from MMIO region specified by starting address StartAddress 
+  to system memory specified by Buffer by using 32-bit access. The total 
+  number of byte to be copied is specified by Length. Buffer is returned.
+  
+  If StartAddress is not aligned on a 32-bit boundary, then ASSERT().
+
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). 
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
+
+  If Length is not aligned on a 32-bit boundary, then ASSERT().
+  If Buffer is not aligned on a 32-bit boundary, then ASSERT().
+
+  @param  StartAddress    Starting address for the MMIO region to be copied from.
+  @param  Length          Size in bytes of the copy.
+  @param  Buffer          Pointer to a system memory buffer receiving the data read.
+
+  @return Buffer
+
+**/
+UINT32 *
+EFIAPI
+MmioReadBuffer32 (
+  IN  UINTN       StartAddress,
+  IN  UINTN       Length,
+  OUT UINT32      *Buffer
+  );
+
+/**
+  Copy data from MMIO region to system memory by using 64-bit access.
+
+  Copy data from MMIO region specified by starting address StartAddress 
+  to system memory specified by Buffer by using 64-bit access. The total 
+  number of byte to be copied is specified by Length. Buffer is returned.
+  
+  If StartAddress is not aligned on a 64-bit boundary, then ASSERT().
+
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). 
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().
+
+  If Length is not aligned on a 64-bit boundary, then ASSERT().
+  If Buffer is not aligned on a 64-bit boundary, then ASSERT().
+
+  @param  StartAddress    Starting address for the MMIO region to be copied from.
+  @param  Length          Size in bytes of the copy.
+  @param  Buffer          Pointer to a system memory buffer receiving the data read.
+
+  @return Buffer
+
+**/
+UINT64 *
+EFIAPI
+MmioReadBuffer64 (
+  IN  UINTN       StartAddress,
+  IN  UINTN       Length,
+  OUT UINT64      *Buffer
+  );
+
+/**
+  Copy data from system memory to MMIO region by using 8-bit access.
+
+  Copy data from system memory specified by Buffer to MMIO region specified 
+  by starting address StartAddress by using 8-bit access. The total number 
+  of byte to be copied is specified by Length. Buffer is returned.
+  
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). 
+  If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().
+
+
+  @param  StartAddress    Starting address for the MMIO region to be copied to.
+  @param  Length          Size in bytes of the copy.
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.
+
+  @return Size in bytes of the copy.
+
+**/
+UINT8 *
+EFIAPI
+MmioWriteBuffer8 (
+  IN  UINTN         StartAddress,
+  IN  UINTN         Length,
+  IN  CONST UINT8   *Buffer
+  );
+
+/**
+  Copy data from system memory to MMIO region by using 16-bit access.
+
+  Copy data from system memory specified by Buffer to MMIO region specified 
+  by starting address StartAddress by using 16-bit access. The total number 
+  of byte to be copied is specified by Length. Length is returned.
+  
+  If StartAddress is not aligned on a 16-bit boundary, then ASSERT().
+
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). 
+  If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().
+
+  If Length is not aligned on a 16-bit boundary, then ASSERT().
+
+  If Buffer is not aligned on a 16-bit boundary, then ASSERT().
+
+  @param  StartAddress    Starting address for the MMIO region to be copied to.
+  @param  Length          Size in bytes of the copy.
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.
+
+  @return Size in bytes of the copy.
+
+**/
+UINT16 *
+EFIAPI
+MmioWriteBuffer16 (
+  IN  UINTN        StartAddress,
+  IN  UINTN        Length,
+  IN  CONST UINT16 *Buffer
+  );
+
+/**
+  Copy data from system memory to MMIO region by using 32-bit access.
+
+  Copy data from system memory specified by Buffer to MMIO region specified 
+  by starting address StartAddress by using 32-bit access. The total number 
+  of byte to be copied is specified by Length. Length is returned.
+  
+  If StartAddress is not aligned on a 32-bit boundary, then ASSERT().
+
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). 
+  If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().
+
+  If Length is not aligned on a 32-bit boundary, then ASSERT().
+
+  If Buffer is not aligned on a 32-bit boundary, then ASSERT().
+
+  @param  StartAddress    Starting address for the MMIO region to be copied to.
+  @param  Length          Size in bytes of the copy.
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.
+
+  @return Size in bytes of the copy.
+
+**/
+UINT32 *
+EFIAPI
+MmioWriteBuffer32 (
+  IN  UINTN        StartAddress,
+  IN  UINTN        Length,
+  IN  CONST UINT32 *Buffer
+  );
+
+/**
+  Copy data from system memory to MMIO region by using 64-bit access.
+
+  Copy data from system memory specified by Buffer to MMIO region specified 
+  by starting address StartAddress by using 64-bit access. The total number 
+  of byte to be copied is specified by Length. Length is returned.
+  
+  If StartAddress is not aligned on a 64-bit boundary, then ASSERT().
+
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). 
+  If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().
+
+  If Length is not aligned on a 64-bit boundary, then ASSERT().
+
+  If Buffer is not aligned on a 64-bit boundary, then ASSERT().
+
+  @param  StartAddress    Starting address for the MMIO region to be copied to.
+  @param  Length          Size in bytes of the copy.
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.
+
+  @return Size in bytes of the copy.
+
+**/
+UINT64 *
+EFIAPI
+MmioWriteBuffer64 (
+  IN  UINTN        StartAddress,
+  IN  UINTN        Length,
+  IN  CONST UINT64 *Buffer
+  );
+
+
+#endif
+
index 038443b993c9dcbe0a30a92449fc2c80edc2c1ef..28566d9fbc7d30271865be57bae0831e1e5e7146 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 PCD Library Class Interface Declarations\r
 \r
-Copyright (c) 2006, Intel Corporation                                                         \r
+Copyright (c) 2006 - 2007, Intel Corporation                                                         \r
 All rights reserved. This program and the accompanying materials                          \r
 are licensed and made available under the terms and conditions of the BSD License         \r
 which accompanies this distribution.  The full text of the license may be found at        \r
@@ -461,7 +461,7 @@ EFIAPI
 LibPcdSetPtr (\r
   IN      UINTN             TokenNumber,\r
   IN OUT  UINTN             *SizeOfBuffer,\r
-  IN      VOID              *Value\r
+  IN      VOID              *Buffer\r
   );\r
 \r
 \r
index 004bc9f926bf0cef882f48b2a377fbbdaf2da390..412dc530bd528c5afd412a8aa2308e0801d3e89b 100644 (file)
-/** @file\r
-  Library that provides print services\r
-\r
-  Copyright (c) 2006, Intel Corporation                                                         \r
-  All rights reserved. This program and the accompanying materials                          \r
-  are licensed and made available under the terms and conditions of the BSD License         \r
-  which accompanies this distribution.  The full text of the license may be found at        \r
-  http://opensource.org/licenses/bsd-license.php                                            \r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
-\r
-  Module Name:  PrintLib.h\r
-\r
-**/\r
-\r
-#ifndef __PRINT_LIB_H__\r
-#define __PRINT_LIB_H__\r
-\r
-///\r
-/// Define the maximum number of characters that are required to\r
-/// encode a decimal, hexidecimal, GUID, or TIME value with a NULL \r
-/// terminator.\r
-///  \r
-///  Maximum Length Decimal String     = 28\r
-///    "-9,223,372,036,854,775,808"\r
-///  Maximum Length Hexidecimal String = 17\r
-///    "FFFFFFFFFFFFFFFF"\r
-///  Maximum Length GUID               = 37\r
-///    "00000000-0000-0000-0000-000000000000"\r
-///  Maximum Length TIME               = 18\r
-///    "12/12/2006  12:12"\r
-///\r
-#define MAXIMUM_VALUE_CHARACTERS  38\r
-\r
-///\r
-/// Flags bitmask values use in UnicodeValueToString() and \r
-/// AcsiiValueToString()\r
-///\r
-#define LEFT_JUSTIFY      0x01\r
-#define COMMA_TYPE        0x08\r
-#define PREFIX_ZERO       0x20\r
-\r
-/**\r
-  Produces a Null-terminated Unicode string in an output buffer based on \r
-  a Null-terminated Unicode format string and a VA_LIST argument list\r
-  \r
-  Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer\r
-  and BufferSize.  \r
-  The Unicode string is produced by parsing the format string specified by FormatString.  \r
-  Arguments are pulled from the variable argument list specified by Marker based on the \r
-  contents of the format string.  \r
-  The number of Unicode characters in the produced output buffer is returned not including\r
-  the Null-terminator.\r
-  If BufferSize is 0 or 1, then no output buffer is produced and 0 is returned.\r
-\r
-  If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().\r
-  If BufferSize > 1 and FormatString is NULL, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than \r
-  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then\r
-  ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string\r
-  contains more than PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated \r
-                          Unicode string.\r
-  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.\r
-  @param  FormatString    Null-terminated Unicode format string.\r
-  @param  Marker          VA_LIST marker for the variable argument list.\r
-  \r
-  @return The number of Unicode characters in the produced output buffer not including the\r
-          Null-terminator.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-UnicodeVSPrint (\r
-  OUT CHAR16        *StartOfBuffer,\r
-  IN  UINTN         BufferSize,\r
-  IN  CONST CHAR16  *FormatString,\r
-  IN  VA_LIST       Marker\r
-  );\r
-\r
-/**\r
-  Produces a Null-terminated Unicode string in an output buffer based on a Null-terminated \r
-  Unicode format string and variable argument list.\r
-  \r
-  Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer\r
-  and BufferSize.\r
-  The Unicode string is produced by parsing the format string specified by FormatString.\r
-  Arguments are pulled from the variable argument list based on the contents of the format string.\r
-  The number of Unicode characters in the produced output buffer is returned not including\r
-  the Null-terminator.\r
-  If BufferSize is 0 or 1, then no output buffer is produced and 0 is returned.\r
-\r
-  If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().\r
-  If BufferSize > 1 and FormatString is NULL, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than \r
-  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then\r
-  ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string\r
-  contains more than PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated \r
-                          Unicode string.\r
-  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.\r
-  @param  FormatString    Null-terminated Unicode format string.\r
-  \r
-  @return The number of Unicode characters in the produced output buffer not including the\r
-          Null-terminator.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-UnicodeSPrint (\r
-  OUT CHAR16        *StartOfBuffer,\r
-  IN  UINTN         BufferSize,\r
-  IN  CONST CHAR16  *FormatString,\r
-  ...\r
-  );\r
-\r
-/**\r
-  Produces a Null-terminated Unicode string in an output buffer based on a Null-terminated\r
-  ASCII format string and a VA_LIST argument list\r
-  \r
-  Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer\r
-  and BufferSize.\r
-  The Unicode string is produced by parsing the format string specified by FormatString.\r
-  Arguments are pulled from the variable argument list specified by Marker based on the \r
-  contents of the format string.\r
-  The number of Unicode characters in the produced output buffer is returned not including\r
-  the Null-terminator.\r
-  If BufferSize is 0 or 1, then no output buffer is produced and 0 is returned.\r
-\r
-  If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().\r
-  If BufferSize > 1 and FormatString is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then\r
-  ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string\r
-  contains more than PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated \r
-                          Unicode string.\r
-  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.\r
-  @param  FormatString    Null-terminated Unicode format string.\r
-  @param  Marker          VA_LIST marker for the variable argument list.\r
-  \r
-  @return The number of Unicode characters in the produced output buffer not including the\r
-          Null-terminator.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-UnicodeVSPrintAsciiFormat (\r
-  OUT CHAR16       *StartOfBuffer,\r
-  IN  UINTN        BufferSize,\r
-  IN  CONST CHAR8  *FormatString,\r
-  IN  VA_LIST      Marker\r
-  );\r
-\r
-/**\r
-  Produces a Null-terminated Unicode string in an output buffer based on a Null-terminated \r
-  ASCII format string and  variable argument list.\r
-  \r
-  Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer\r
-  and BufferSize.\r
-  The Unicode string is produced by parsing the format string specified by FormatString.\r
-  Arguments are pulled from the variable argument list based on the contents of the \r
-  format string.\r
-  The number of Unicode characters in the produced output buffer is returned not including\r
-  the Null-terminator.\r
-  If BufferSize is 0 or 1, then no output buffer is produced and 0 is returned.\r
-\r
-  If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().\r
-  If BufferSize > 1 and FormatString is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then\r
-  ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string\r
-  contains more than PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated \r
-                          Unicode string.\r
-  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.\r
-  @param  FormatString    Null-terminated Unicode format string.\r
-  \r
-  @return The number of Unicode characters in the produced output buffer not including the\r
-          Null-terminator.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-UnicodeSPrintAsciiFormat (\r
-  OUT CHAR16       *StartOfBuffer,\r
-  IN  UINTN        BufferSize,\r
-  IN  CONST CHAR8  *FormatString,\r
-  ...\r
-  );\r
-\r
-/**\r
-  Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated\r
-  ASCII format string and a VA_LIST argument list.\r
-  \r
-  Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer\r
-  and BufferSize.\r
-  The ASCII string is produced by parsing the format string specified by FormatString.\r
-  Arguments are pulled from the variable argument list specified by Marker based on \r
-  the contents of the format string.\r
-  The number of ASCII characters in the produced output buffer is returned not including\r
-  the Null-terminator.\r
-  If BufferSize is 0, then no output buffer is produced and 0 is returned.\r
-\r
-  If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT().\r
-  If BufferSize > 0 and FormatString is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then\r
-  ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string\r
-  contains more than PcdMaximumAsciiStringLength ASCII characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated \r
-                          ASCII string.\r
-  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.\r
-  @param  FormatString    Null-terminated Unicode format string.\r
-  @param  Marker          VA_LIST marker for the variable argument list.\r
-  \r
-  @return The number of ASCII characters in the produced output buffer not including the\r
-          Null-terminator.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsciiVSPrint (\r
-  OUT CHAR8         *StartOfBuffer,\r
-  IN  UINTN         BufferSize,\r
-  IN  CONST CHAR8   *FormatString,\r
-  IN  VA_LIST       Marker\r
-  );\r
-\r
-/**\r
-  Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated\r
-  ASCII format string and  variable argument list.\r
-  \r
-  Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer\r
-  and BufferSize.\r
-  The ASCII string is produced by parsing the format string specified by FormatString.\r
-  Arguments are pulled from the variable argument list based on the contents of the \r
-  format string.\r
-  The number of ASCII characters in the produced output buffer is returned not including\r
-  the Null-terminator.\r
-  If BufferSize is 0, then no output buffer is produced and 0 is returned.\r
-\r
-  If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT().\r
-  If BufferSize > 0 and FormatString is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then\r
-  ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string\r
-  contains more than PcdMaximumAsciiStringLength ASCII characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated \r
-                          ASCII string.\r
-  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.\r
-  @param  FormatString    Null-terminated Unicode format string.\r
-  \r
-  @return The number of ASCII characters in the produced output buffer not including the\r
-          Null-terminator.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsciiSPrint (\r
-  OUT CHAR8        *StartOfBuffer,\r
-  IN  UINTN        BufferSize,\r
-  IN  CONST CHAR8  *FormatString,\r
-  ...\r
-  );\r
-\r
-/**\r
-  Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated\r
-  ASCII format string and a VA_LIST argument list.\r
-  \r
-  Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer\r
-  and BufferSize.\r
-  The ASCII string is produced by parsing the format string specified by FormatString.\r
-  Arguments are pulled from the variable argument list specified by Marker based on \r
-  the contents of the format string.\r
-  The number of ASCII characters in the produced output buffer is returned not including\r
-  the Null-terminator.\r
-  If BufferSize is 0, then no output buffer is produced and 0 is returned.\r
-\r
-  If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT().\r
-  If BufferSize > 0 and FormatString is NULL, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then\r
-  ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string\r
-  contains more than PcdMaximumAsciiStringLength ASCII characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated \r
-                          ASCII string.\r
-  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.\r
-  @param  FormatString    Null-terminated Unicode format string.\r
-  @param  Marker          VA_LIST marker for the variable argument list.\r
-  \r
-  @return The number of ASCII characters in the produced output buffer not including the\r
-          Null-terminator.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsciiVSPrintUnicodeFormat (\r
-  OUT CHAR8         *StartOfBuffer,\r
-  IN  UINTN         BufferSize,\r
-  IN  CONST CHAR16  *FormatString,\r
-  IN  VA_LIST       Marker\r
-  );\r
-\r
-/**\r
-  Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated\r
-  ASCII format string and  variable argument list.\r
-  \r
-  Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer\r
-  and BufferSize.\r
-  The ASCII string is produced by parsing the format string specified by FormatString.\r
-  Arguments are pulled from the variable argument list based on the contents of the \r
-  format string.\r
-  The number of ASCII characters in the produced output buffer is returned not including\r
-  the Null-terminator.\r
-  If BufferSize is 0, then no output buffer is produced and 0 is returned.\r
-\r
-  If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT().\r
-  If BufferSize > 0 and FormatString is NULL, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then\r
-  ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string\r
-  contains more than PcdMaximumAsciiStringLength ASCII characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated \r
-                          ASCII string.\r
-  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.\r
-  @param  FormatString    Null-terminated Unicode format string.\r
-  \r
-  @return The number of ASCII characters in the produced output buffer not including the\r
-          Null-terminator.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsciiSPrintUnicodeFormat (\r
-  OUT CHAR8         *StartOfBuffer,\r
-  IN  UINTN         BufferSize,\r
-  IN  CONST CHAR16  *FormatString,\r
-  ...\r
-  );\r
-\r
-/**\r
-  Converts a decimal value to a Null-terminated Unicode string.\r
-  \r
-  Converts the decimal number specified by Value to a Null-terminated Unicode \r
-  string specified by Buffer containing at most Width characters.\r
-  If Width is 0 then a width of  MAXIMUM_VALUE_CHARACTERS is assumed.\r
-  The number of Unicode characters in Buffer is returned not including the Null-terminator.\r
-  If the conversion contains more than Width characters, then only the first\r
-  Width characters are returned, and the total number of characters \r
-  required to perform the conversion is returned.\r
-  Additional conversion parameters are specified in Flags.  \r
-  The Flags bit LEFT_JUSTIFY is always ignored.\r
-  All conversions are left justified in Buffer.\r
-  If Width is 0, PREFIX_ZERO is ignored in Flags.\r
-  If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and commas\r
-  are inserted every 3rd digit starting from the right.\r
-  If Value is < 0, then the fist character in Buffer is a '-'.\r
-  If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored, \r
-  then Buffer is padded with '0' characters so the combination of the optional '-' \r
-  sign character, '0' characters, digit characters for Value, and the Null-terminator\r
-  add up to Width characters.\r
-\r
-  If Buffer is NULL, then ASSERT().\r
-  If unsupported bits are set in Flags, then ASSERT().\r
-  If Width >= MAXIMUM_VALUE_CHARACTERS, then ASSERT()\r
-\r
-  @param  Buffer  Pointer to the output buffer for the produced Null-terminated\r
-                  Unicode string.\r
-  @param  Flags   The bitmask of flags that specify left justification, zero pad, and commas.\r
-  @param  Value   The 64-bit signed value to convert to a string.\r
-  @param  Width   The maximum number of Unicode characters to place in Buffer, not including\r
-                  the Null-terminator.\r
-  \r
-  @return The number of Unicode characters in Buffer not including the Null-terminator.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-UnicodeValueToString (\r
-  IN OUT CHAR16  *Buffer,\r
-  IN UINTN       Flags,\r
-  IN INT64       Value,\r
-  IN UINTN       Width\r
-  );\r
-\r
-/**\r
-  Converts a decimal value to a Null-terminated ASCII string.\r
-  \r
-  Converts the decimal number specified by Value to a Null-terminated ASCII string \r
-  specified by Buffer containing at most Width characters.\r
-  If Width is 0 then a width of  MAXIMUM_VALUE_CHARACTERS is assumed.\r
-  The number of ASCII characters in Buffer is returned not including the Null-terminator.\r
-  If the conversion contains more than Width characters, then only the first Width\r
-  characters are returned, and the total number of characters required to perform\r
-  the conversion is returned.\r
-  Additional conversion parameters are specified in Flags.  \r
-  The Flags bit LEFT_JUSTIFY is always ignored.\r
-  All conversions are left justified in Buffer.\r
-  If Width is 0, PREFIX_ZERO is ignored in Flags.\r
-  If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and commas \r
-  are inserted every 3rd digit starting from the right.\r
-  If Value is < 0, then the fist character in Buffer is a '-'.\r
-  If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored, then Buffer\r
-  is padded with '0' characters so the combination of the optional '-'\r
-  sign character, '0' characters, digit characters for Value, and the \r
-  Null-terminator add up to Width characters.\r
-\r
-  If Buffer is NULL, then ASSERT().\r
-  If unsupported bits are set in Flags, then ASSERT().\r
-  If Width >= MAXIMUM_VALUE_CHARACTERS, then ASSERT()\r
-\r
-  @param  Buffer  Pointer to the output buffer for the produced Null-terminated\r
-                  ASCII string.\r
-  @param  Flags   The bitmask of flags that specify left justification, zero pad, and commas.\r
-  @param  Value   The 64-bit signed value to convert to a string.\r
-  @param  Width   The maximum number of ASCII characters to place in Buffer, not including\r
-                  the Null-terminator.\r
-  \r
-  @return The number of ASCII characters in Buffer not including the Null-terminator.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsciiValueToString (\r
-  IN OUT CHAR8  *Buffer,\r
-  IN UINTN      Flags,\r
-  IN INT64      Value,\r
-  IN UINTN      Width\r
-  );\r
-\r
-#endif\r
+/** @file
+  Library that provides print services
+
+  Copyright (c) 2006 - 2007, Intel Corporation                                                         
+  All rights reserved. This program and the accompanying materials                          
+  are licensed and made available under the terms and conditions of the BSD License         
+  which accompanies this distribution.  The full text of the license may be found at        
+  http://opensource.org/licenses/bsd-license.php                                            
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
+
+  Module Name:  PrintLib.h
+
+**/
+
+#ifndef __PRINT_LIB_H__
+#define __PRINT_LIB_H__
+
+///
+/// Define the maximum number of characters that are required to
+/// encode a decimal, hexidecimal, GUID, or TIME value with a NULL 
+/// terminator.
+///  
+///  Maximum Length Decimal String     = 28
+///    "-9,223,372,036,854,775,808"
+///  Maximum Length Hexidecimal String = 17
+///    "FFFFFFFFFFFFFFFF"
+///  Maximum Length GUID               = 37
+///    "00000000-0000-0000-0000-000000000000"
+///  Maximum Length TIME               = 18
+///    "12/12/2006  12:12"
+///
+#define MAXIMUM_VALUE_CHARACTERS  38
+
+///
+/// Flags bitmask values use in UnicodeValueToString() and 
+/// AcsiiValueToString()
+///
+#define LEFT_JUSTIFY      0x01
+#define COMMA_TYPE        0x08
+#define PREFIX_ZERO       0x20
+#define RADIX_HEX         0x80
+
+/**
+  Produces a Null-terminated Unicode string in an output buffer based on 
+  a Null-terminated Unicode format string and a VA_LIST argument list
+  
+  Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer
+  and BufferSize.  
+  The Unicode string is produced by parsing the format string specified by FormatString.  
+  Arguments are pulled from the variable argument list specified by Marker based on the 
+  contents of the format string.  
+  The number of Unicode characters in the produced output buffer is returned not including
+  the Null-terminator.
+  If BufferSize is 0 or 1, then no output buffer is produced and 0 is returned.
+
+  If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().
+  If BufferSize > 1 and FormatString is NULL, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than 
+  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then
+  ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string
+  contains more than PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated 
+                          Unicode string.
+  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
+  @param  FormatString    Null-terminated Unicode format string.
+  @param  Marker          VA_LIST marker for the variable argument list.
+  
+  @return The number of Unicode characters in the produced output buffer not including the
+          Null-terminator.
+
+**/
+UINTN
+EFIAPI
+UnicodeVSPrint (
+  OUT CHAR16        *StartOfBuffer,
+  IN  UINTN         BufferSize,
+  IN  CONST CHAR16  *FormatString,
+  IN  VA_LIST       Marker
+  );
+
+/**
+  Produces a Null-terminated Unicode string in an output buffer based on a Null-terminated 
+  Unicode format string and variable argument list.
+  
+  Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer
+  and BufferSize.
+  The Unicode string is produced by parsing the format string specified by FormatString.
+  Arguments are pulled from the variable argument list based on the contents of the format string.
+  The number of Unicode characters in the produced output buffer is returned not including
+  the Null-terminator.
+  If BufferSize is 0 or 1, then no output buffer is produced and 0 is returned.
+
+  If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().
+  If BufferSize > 1 and FormatString is NULL, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than 
+  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then
+  ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string
+  contains more than PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated 
+                          Unicode string.
+  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
+  @param  FormatString    Null-terminated Unicode format string.
+  
+  @return The number of Unicode characters in the produced output buffer not including the
+          Null-terminator.
+
+**/
+UINTN
+EFIAPI
+UnicodeSPrint (
+  OUT CHAR16        *StartOfBuffer,
+  IN  UINTN         BufferSize,
+  IN  CONST CHAR16  *FormatString,
+  ...
+  );
+
+/**
+  Produces a Null-terminated Unicode string in an output buffer based on a Null-terminated
+  ASCII format string and a VA_LIST argument list
+  
+  Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer
+  and BufferSize.
+  The Unicode string is produced by parsing the format string specified by FormatString.
+  Arguments are pulled from the variable argument list specified by Marker based on the 
+  contents of the format string.
+  The number of Unicode characters in the produced output buffer is returned not including
+  the Null-terminator.
+  If BufferSize is 0 or 1, then no output buffer is produced and 0 is returned.
+
+  If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().
+  If BufferSize > 1 and FormatString is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then
+  ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string
+  contains more than PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated 
+                          Unicode string.
+  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
+  @param  FormatString    Null-terminated Unicode format string.
+  @param  Marker          VA_LIST marker for the variable argument list.
+  
+  @return The number of Unicode characters in the produced output buffer not including the
+          Null-terminator.
+
+**/
+UINTN
+EFIAPI
+UnicodeVSPrintAsciiFormat (
+  OUT CHAR16       *StartOfBuffer,
+  IN  UINTN        BufferSize,
+  IN  CONST CHAR8  *FormatString,
+  IN  VA_LIST      Marker
+  );
+
+/**
+  Produces a Null-terminated Unicode string in an output buffer based on a Null-terminated 
+  ASCII format string and  variable argument list.
+  
+  Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer
+  and BufferSize.
+  The Unicode string is produced by parsing the format string specified by FormatString.
+  Arguments are pulled from the variable argument list based on the contents of the 
+  format string.
+  The number of Unicode characters in the produced output buffer is returned not including
+  the Null-terminator.
+  If BufferSize is 0 or 1, then no output buffer is produced and 0 is returned.
+
+  If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().
+  If BufferSize > 1 and FormatString is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then
+  ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string
+  contains more than PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated 
+                          Unicode string.
+  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
+  @param  FormatString    Null-terminated Unicode format string.
+  
+  @return The number of Unicode characters in the produced output buffer not including the
+          Null-terminator.
+
+**/
+UINTN
+EFIAPI
+UnicodeSPrintAsciiFormat (
+  OUT CHAR16       *StartOfBuffer,
+  IN  UINTN        BufferSize,
+  IN  CONST CHAR8  *FormatString,
+  ...
+  );
+
+/**
+  Converts a decimal value to a Null-terminated Unicode string.
+  
+  Converts the decimal number specified by Value to a Null-terminated Unicode 
+  string specified by Buffer containing at most Width characters. No padding of spaces 
+  is ever performed. If Width is 0 then a width of MAXIMUM_VALUE_CHARACTERS is assumed.
+  The number of Unicode characters in Buffer is returned not including the Null-terminator.
+  If the conversion contains more than Width characters, then only the first
+  Width characters are returned, and the total number of characters 
+  required to perform the conversion is returned.
+  Additional conversion parameters are specified in Flags.  
+  
+  The Flags bit LEFT_JUSTIFY is always ignored.
+  All conversions are left justified in Buffer.
+  If Width is 0, PREFIX_ZERO is ignored in Flags.
+  If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and commas
+  are inserted every 3rd digit starting from the right.
+  If HEX_RADIX is set in Flags, then the output buffer will be 
+  formatted in hexadecimal format.
+  If Value is < 0 and HEX_RADIX is not set in Flags, then the fist character in Buffer is a '-'.
+  If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored, 
+  then Buffer is padded with '0' characters so the combination of the optional '-' 
+  sign character, '0' characters, digit characters for Value, and the Null-terminator
+  add up to Width characters.
+  If both COMMA_TYPE and HEX_RADIX are set in Flags, then ASSERT().
+  If Buffer is NULL, then ASSERT().
+  If unsupported bits are set in Flags, then ASSERT().
+  If both COMMA_TYPE and HEX_RADIX are set in Flags, then ASSERT().
+  If Width >= MAXIMUM_VALUE_CHARACTERS, then ASSERT()
+
+  @param  Buffer  Pointer to the output buffer for the produced Null-terminated
+                  Unicode string.
+  @param  Flags   The bitmask of flags that specify left justification, zero pad, and commas.
+  @param  Value   The 64-bit signed value to convert to a string.
+  @param  Width   The maximum number of Unicode characters to place in Buffer, not including
+                  the Null-terminator.
+  
+  @return The number of Unicode characters in Buffer not including the Null-terminator.
+
+**/
+UINTN
+EFIAPI
+UnicodeValueToString (
+  IN OUT CHAR16  *Buffer,
+  IN UINTN       Flags,
+  IN INT64       Value,
+  IN UINTN       Width
+  );
+
+/**
+  Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated
+  ASCII format string and a VA_LIST argument list.
+  
+  Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer
+  and BufferSize.
+  The ASCII string is produced by parsing the format string specified by FormatString.
+  Arguments are pulled from the variable argument list specified by Marker based on 
+  the contents of the format string.
+  The number of ASCII characters in the produced output buffer is returned not including
+  the Null-terminator.
+  If BufferSize is 0, then no output buffer is produced and 0 is returned.
+
+  If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT().
+  If BufferSize > 0 and FormatString is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then
+  ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string
+  contains more than PcdMaximumAsciiStringLength ASCII characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated 
+                          ASCII string.
+  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
+  @param  FormatString    Null-terminated Unicode format string.
+  @param  Marker          VA_LIST marker for the variable argument list.
+  
+  @return The number of ASCII characters in the produced output buffer not including the
+          Null-terminator.
+
+**/
+UINTN
+EFIAPI
+AsciiVSPrint (
+  OUT CHAR8         *StartOfBuffer,
+  IN  UINTN         BufferSize,
+  IN  CONST CHAR8   *FormatString,
+  IN  VA_LIST       Marker
+  );
+
+/**
+  Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated
+  ASCII format string and  variable argument list.
+  
+  Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer
+  and BufferSize.
+  The ASCII string is produced by parsing the format string specified by FormatString.
+  Arguments are pulled from the variable argument list based on the contents of the 
+  format string.
+  The number of ASCII characters in the produced output buffer is returned not including
+  the Null-terminator.
+  If BufferSize is 0, then no output buffer is produced and 0 is returned.
+
+  If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT().
+  If BufferSize > 0 and FormatString is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then
+  ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string
+  contains more than PcdMaximumAsciiStringLength ASCII characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated 
+                          ASCII string.
+  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
+  @param  FormatString    Null-terminated Unicode format string.
+  
+  @return The number of ASCII characters in the produced output buffer not including the
+          Null-terminator.
+
+**/
+UINTN
+EFIAPI
+AsciiSPrint (
+  OUT CHAR8        *StartOfBuffer,
+  IN  UINTN        BufferSize,
+  IN  CONST CHAR8  *FormatString,
+  ...
+  );
+
+/**
+  Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated
+  ASCII format string and a VA_LIST argument list.
+  
+  Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer
+  and BufferSize.
+  The ASCII string is produced by parsing the format string specified by FormatString.
+  Arguments are pulled from the variable argument list specified by Marker based on 
+  the contents of the format string.
+  The number of ASCII characters in the produced output buffer is returned not including
+  the Null-terminator.
+  If BufferSize is 0, then no output buffer is produced and 0 is returned.
+
+  If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT().
+  If BufferSize > 0 and FormatString is NULL, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than
+  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then
+  ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string
+  contains more than PcdMaximumAsciiStringLength ASCII characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated 
+                          ASCII string.
+  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
+  @param  FormatString    Null-terminated Unicode format string.
+  @param  Marker          VA_LIST marker for the variable argument list.
+  
+  @return The number of ASCII characters in the produced output buffer not including the
+          Null-terminator.
+
+**/
+UINTN
+EFIAPI
+AsciiVSPrintUnicodeFormat (
+  OUT CHAR8         *StartOfBuffer,
+  IN  UINTN         BufferSize,
+  IN  CONST CHAR16  *FormatString,
+  IN  VA_LIST       Marker
+  );
+
+/**
+  Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated
+  ASCII format string and  variable argument list.
+  
+  Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer
+  and BufferSize.
+  The ASCII string is produced by parsing the format string specified by FormatString.
+  Arguments are pulled from the variable argument list based on the contents of the 
+  format string.
+  The number of ASCII characters in the produced output buffer is returned not including
+  the Null-terminator.
+  If BufferSize is 0, then no output buffer is produced and 0 is returned.
+
+  If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT().
+  If BufferSize > 0 and FormatString is NULL, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than
+  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then
+  ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string
+  contains more than PcdMaximumAsciiStringLength ASCII characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated 
+                          ASCII string.
+  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
+  @param  FormatString    Null-terminated Unicode format string.
+  
+  @return The number of ASCII characters in the produced output buffer not including the
+          Null-terminator.
+
+**/
+UINTN
+EFIAPI
+AsciiSPrintUnicodeFormat (
+  OUT CHAR8         *StartOfBuffer,
+  IN  UINTN         BufferSize,
+  IN  CONST CHAR16  *FormatString,
+  ...
+  );
+
+/**
+  Converts a decimal value to a Null-terminated ASCII string.
+  
+  Converts the decimal number specified by Value to a Null-terminated ASCII string 
+  specified by Buffer containing at most Width characters. No padding of spaces 
+  is ever performed.
+  If Width is 0 then a width of  MAXIMUM_VALUE_CHARACTERS is assumed.
+  The number of ASCII characters in Buffer is returned not including the Null-terminator.
+  If the conversion contains more than Width characters, then only the first Width
+  characters are returned, and the total number of characters required to perform
+  the conversion is returned.
+  Additional conversion parameters are specified in Flags.  
+  The Flags bit LEFT_JUSTIFY is always ignored.
+  All conversions are left justified in Buffer.
+  If Width is 0, PREFIX_ZERO is ignored in Flags.
+  If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and commas
+  are inserted every 3rd digit starting from the right.
+  If HEX_RADIX is set in Flags, then the output buffer will be 
+  formatted in hexadecimal format.
+  If Value is < 0 and HEX_RADIX is not set in Flags, then the fist character in Buffer is a '-'.
+  If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored, 
+  then Buffer is padded with '0' characters so the combination of the optional '-' 
+  sign character, '0' characters, digit characters for Value, and the Null-terminator
+  add up to Width characters.
+  
+  If Buffer is NULL, then ASSERT().
+  If unsupported bits are set in Flags, then ASSERT().
+  If both COMMA_TYPE and HEX_RADIX are set in Flags, then ASSERT().
+  If Width >= MAXIMUM_VALUE_CHARACTERS, then ASSERT()
+
+  @param  Buffer  Pointer to the output buffer for the produced Null-terminated
+                  ASCII string.
+  @param  Flags   The bitmask of flags that specify left justification, zero pad, and commas.
+  @param  Value   The 64-bit signed value to convert to a string.
+  @param  Width   The maximum number of ASCII characters to place in Buffer, not including
+                  the Null-terminator.
+  
+  @return The number of ASCII characters in Buffer not including the Null-terminator.
+
+**/
+UINTN
+EFIAPI
+AsciiValueToString (
+  IN OUT CHAR8  *Buffer,
+  IN UINTN      Flags,
+  IN INT64      Value,
+  IN UINTN      Width
+  );
+
+#endif
index 1f0b52b06152c15a8eb06514d2a47605e9f6fcac..a302c26beb51cdc983094ab53080bb0a00e7270f 100644 (file)
@@ -128,6 +128,26 @@ EfiNamedEventSignal (
   IN CONST EFI_GUID  *Name\r
   );\r
 \r
+/** \r
+  Returns the current TPL.\r
+\r
+  This function returns the current TPL.  There is no EFI service to directly \r
+  retrieve the current TPL. Instead, the RaiseTPL() function is used to raise \r
+  the TPL to TPL_HIGH_LEVEL.  This will return the current TPL.  The TPL level \r
+  can then immediately be restored back to the current TPL level with a call \r
+  to RestoreTPL().\r
+\r
+  @param  VOID\r
+\r
+  @retvale EFI_TPL              The current TPL.\r
+\r
+**/\r
+EFI_TPL\r
+EFIAPI\r
+EfiGetCurrentTpl (\r
+  VOID\r
+  );\r
+\r
 /**\r
   This function initializes a basic mutual exclusion lock to the released state \r
   and returns the lock.  Each lock provides mutual exclusion access at its task \r
@@ -595,5 +615,4 @@ EfiGetNameGuidFromFwVolDevicePathNode (
   IN CONST MEDIA_FW_VOL_FILEPATH_DEVICE_PATH  *FvDevicePathNode\r
   );\r
 \r
-\r
 #endif\r
index f92ff9dd627b74e7fa27665c048878463c8212ae..d1b74b7d4b2172aac383b47febf3167ff216b901 100644 (file)
@@ -1,66 +1,67 @@
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0">\r
-  <MsaHeader>\r
-    <ModuleName>BaseIoLibIntrinsic</ModuleName>\r
-    <ModuleType>BASE</ModuleType>\r
-    <GuidValue>926c9cd0-4bb8-479b-9ac4-8a2a23f85307</GuidValue>\r
-    <Version>1.0</Version>\r
-    <Abstract>Component description file for Intrinsic Base Io Library</Abstract>\r
-    <Description>I/O Library that uses compiler intrinsics to perform IN and OUT instructions\r
-      for IA-32 and x64.  It also performs direct memory access for MMIO services.</Description>\r
-    <Copyright>Copyright (c) 2006, Intel Corporation.</Copyright>\r
-    <License>All rights reserved. This program and the accompanying materials\r
-      are licensed and made available under the terms and conditions of the BSD License\r
-      which accompanies this distribution.  The full text of the license may be found at\r
-      http://opensource.org/licenses/bsd-license.php\r
-      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.</License>\r
-    <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION   0x00000052</Specification>\r
-  </MsaHeader>\r
-  <ModuleDefinitions>\r
-    <SupportedArchitectures>IA32 X64 IPF</SupportedArchitectures>\r
-    <BinaryModule>false</BinaryModule>\r
-    <OutputFileBasename>BaseIoLibIntrinsic</OutputFileBasename>\r
-  </ModuleDefinitions>\r
-  <LibraryClassDefinitions>\r
-    <LibraryClass Usage="ALWAYS_PRODUCED">\r
-      <Keyword>IoLib</Keyword>\r
-    </LibraryClass>\r
-    <LibraryClass Usage="ALWAYS_CONSUMED">\r
-      <Keyword>BaseLib</Keyword>\r
-    </LibraryClass>\r
-    <LibraryClass Usage="ALWAYS_CONSUMED">\r
-      <Keyword>DebugLib</Keyword>\r
-    </LibraryClass>\r
-    <LibraryClass Usage="ALWAYS_CONSUMED">\r
-      <Keyword>PcdLib</Keyword>\r
-    </LibraryClass>\r
-  </LibraryClassDefinitions>\r
-  <SourceFiles>\r
-    <Filename SupArchList="IA32">IoLib.c</Filename>\r
-    <Filename SupArchList="IA32">IoLibMsc.c</Filename>\r
-    <Filename SupArchList="IA32">IoLibGcc.c</Filename>\r
-    <Filename SupArchList="IA32">IoHighLevel.c</Filename>\r
-    <Filename SupArchList="X64">IoLib.c</Filename>\r
-    <Filename SupArchList="X64">IoLibMsc.c</Filename>\r
-    <Filename SupArchList="X64">IoLibGcc.c</Filename>\r
-    <Filename SupArchList="X64">IoHighLevel.c</Filename>\r
-    <Filename SupArchList="IPF">IoLibIpf.c</Filename>\r
-    <Filename SupArchList="IPF">IoHighLevel.c</Filename>\r
-  </SourceFiles>\r
-  <PackageDependencies>\r
-    <Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>\r
-  </PackageDependencies>\r
-  <Externs>\r
-    <Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification>\r
-    <Specification>EDK_RELEASE_VERSION 0x00020000</Specification>\r
-  </Externs>\r
-  <PcdCoded>\r
-    <PcdEntry SupArchList="IPF" PcdItemType="FIXED_AT_BUILD" Usage="ALWAYS_CONSUMED">\r
-      <C_Name>PcdIoBlockBaseAddressForIpf</C_Name>\r
-      <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-      <DefaultValue>0x0ffffc000000</DefaultValue>\r
-      <HelpText>The base address of IPF IO Block</HelpText>\r
-    </PcdEntry>\r
-  </PcdCoded>\r
-</ModuleSurfaceArea>
\ No newline at end of file
+<?xml version="1.0" encoding="UTF-8"?>
+<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0">
+  <MsaHeader>
+    <ModuleName>BaseIoLibIntrinsic</ModuleName>
+    <ModuleType>BASE</ModuleType>
+    <GuidValue>926c9cd0-4bb8-479b-9ac4-8a2a23f85307</GuidValue>
+    <Version>1.0</Version>
+    <Abstract>Component description file for Intrinsic Base Io Library</Abstract>
+    <Description>I/O Library that uses compiler intrinsics to perform IN and OUT instructions
+      for IA-32 and x64.  It also performs direct memory access for MMIO services.</Description>
+    <Copyright>Copyright (c) 2006 - 2007, Intel Corporation.</Copyright>
+    <License>All rights reserved. This program and the accompanying materials
+      are licensed and made available under the terms and conditions of the BSD License
+      which accompanies this distribution.  The full text of the license may be found at
+      http://opensource.org/licenses/bsd-license.php
+      THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+      WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.</License>
+    <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION   0x00000052</Specification>
+  </MsaHeader>
+  <ModuleDefinitions>
+    <SupportedArchitectures>IA32 X64 IPF</SupportedArchitectures>
+    <BinaryModule>false</BinaryModule>
+    <OutputFileBasename>BaseIoLibIntrinsic</OutputFileBasename>
+  </ModuleDefinitions>
+  <LibraryClassDefinitions>
+    <LibraryClass Usage="ALWAYS_PRODUCED">
+      <Keyword>IoLib</Keyword>
+    </LibraryClass>
+    <LibraryClass Usage="ALWAYS_CONSUMED">
+      <Keyword>BaseLib</Keyword>
+    </LibraryClass>
+    <LibraryClass Usage="ALWAYS_CONSUMED">
+      <Keyword>DebugLib</Keyword>
+    </LibraryClass>
+    <LibraryClass Usage="ALWAYS_CONSUMED">
+      <Keyword>PcdLib</Keyword>
+    </LibraryClass>
+  </LibraryClassDefinitions>
+  <SourceFiles>
+    <Filename>IoLibMmioBuffer.c</Filename>
+    <Filename SupArchList="IA32">IoLib.c</Filename>
+    <Filename SupArchList="IA32">IoLibMsc.c</Filename>
+    <Filename SupArchList="IA32">IoLibGcc.c</Filename>
+    <Filename SupArchList="IA32">IoHighLevel.c</Filename>
+    <Filename SupArchList="X64">IoLib.c</Filename>
+    <Filename SupArchList="X64">IoLibMsc.c</Filename>
+    <Filename SupArchList="X64">IoLibGcc.c</Filename>
+    <Filename SupArchList="X64">IoHighLevel.c</Filename>
+    <Filename SupArchList="IPF">IoLibIpf.c</Filename>
+    <Filename SupArchList="IPF">IoHighLevel.c</Filename>
+  </SourceFiles>
+  <PackageDependencies>
+    <Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
+  </PackageDependencies>
+  <Externs>
+    <Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification>
+    <Specification>EDK_RELEASE_VERSION 0x00020000</Specification>
+  </Externs>
+  <PcdCoded>
+    <PcdEntry SupArchList="IPF" PcdItemType="FIXED_AT_BUILD" Usage="ALWAYS_CONSUMED">
+      <C_Name>PcdIoBlockBaseAddressForIpf</C_Name>
+      <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>
+      <DefaultValue>0x0ffffc000000</DefaultValue>
+      <HelpText>The base address of IPF IO Block</HelpText>
+    </PcdEntry>
+  </PcdCoded>
+</ModuleSurfaceArea>
index 1de7f93e298ef015affad44b81f7b4f5bc1870ca..8de4f71bd0fab7b8f2ebfe976c9f3678cc5d388f 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Common I/O Library routines.\r
 \r
-  Copyright (c) 2006, Intel Corporation<BR>\r
+  Copyright (c) 2006 - 2007, Intel Corporation<BR>\r
   All rights reserved. This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
@@ -14,8 +14,6 @@
 \r
 **/\r
 \r
-#define BIT63                0x8000000000000000ULL\r
-\r
 #define MAP_PORT_BASE_TO_MEM(_Port) \\r
     ((((_Port) & 0xfffc) << 10) | ((_Port) & 0x0fff))\r
 \r
diff --git a/MdePkg/Library/BaseIoLibIntrinsic/IoLibMmioBuffer.c b/MdePkg/Library/BaseIoLibIntrinsic/IoLibMmioBuffer.c
new file mode 100644 (file)
index 0000000..b8e6d83
--- /dev/null
@@ -0,0 +1,409 @@
+/** @file\r
+  I/O Library MMIO Buffer Functions.\r
+\r
+  Copyright (c) 2007, Intel Corporation<BR>\r
+  All rights reserved. This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+/**\r
+  Copy data from MMIO region to system memory by using 8-bit access.\r
+\r
+  Copy data from MMIO region specified by starting address StartAddress \r
+  to system memory specified by Buffer by using 8-bit access. The total \r
+  number of byte to be copied is specified by Length. Buffer is returned.\r
+  \r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied from.\r
+  @param  Length          Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer receiving the data read.\r
+\r
+  @return Buffer\r
+\r
+**/\r
+UINT8 *\r
+EFIAPI\r
+MmioReadBuffer8 (\r
+  IN  UINTN       StartAddress,\r
+  IN  UINTN       Length,\r
+  OUT UINT8       *Buffer\r
+  )\r
+{\r
+  UINT8   *ReturnBuffer;\r
+\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
\r
+  ReturnBuffer = Buffer;\r
+  \r
+  while (Length--) {\r
+    *(Buffer++) = MmioRead8 (StartAddress++);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\r
+\r
+/**\r
+  Copy data from MMIO region to system memory by using 16-bit access.\r
+\r
+  Copy data from MMIO region specified by starting address StartAddress \r
+  to system memory specified by Buffer by using 16-bit access. The total \r
+  number of byte to be copied is specified by Length. Buffer is returned.\r
+  \r
+  If StartAddress is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Buffer is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied from.\r
+  @param  Length          Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer receiving the data read.\r
+\r
+  @return Buffer\r
+\r
+**/\r
+UINT16 *\r
+EFIAPI\r
+MmioReadBuffer16 (\r
+  IN  UINTN       StartAddress,\r
+  IN  UINTN       Length,\r
+  OUT UINT16      *Buffer\r
+  )\r
+{\r
+  UINT16    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT16) - 1)) == 0);\r
+  \r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT16) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT16) - 1)) == 0);\r
\r
+  ReturnBuffer = Buffer;\r
+  \r
+  while (Length) {\r
+    *(Buffer++) = MmioRead16 (StartAddress);\r
+    StartAddress += sizeof (UINT16);\r
+    Length -= sizeof (UINT16);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\r
+\r
+/**\r
+  Copy data from MMIO region to system memory by using 32-bit access.\r
+\r
+  Copy data from MMIO region specified by starting address StartAddress \r
+  to system memory specified by Buffer by using 32-bit access. The total \r
+  number of byte to be copied is specified by Length. Buffer is returned.\r
+  \r
+  If StartAddress is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 32-bit boundary, then ASSERT().\r
+  If Buffer is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied from.\r
+  @param  Length          Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer receiving the data read.\r
+\r
+  @return Buffer\r
+\r
+**/\r
+UINT32 *\r
+EFIAPI\r
+MmioReadBuffer32 (\r
+  IN  UINTN       StartAddress,\r
+  IN  UINTN       Length,\r
+  OUT UINT32      *Buffer\r
+  )\r
+{\r
+  UINT32    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT32) - 1)) == 0);\r
+  \r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT32) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT32) - 1)) == 0);\r
\r
+  ReturnBuffer = Buffer;\r
+  \r
+  while (Length) {\r
+    *(Buffer++) = MmioRead32 (StartAddress);\r
+    StartAddress += sizeof (UINT32);\r
+    Length -= sizeof (UINT32);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\r
+\r
+/**\r
+  Copy data from MMIO region to system memory by using 64-bit access.\r
+\r
+  Copy data from MMIO region specified by starting address StartAddress \r
+  to system memory specified by Buffer by using 64-bit access. The total \r
+  number of byte to be copied is specified by Length. Buffer is returned.\r
+  \r
+  If StartAddress is not aligned on a 64-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 64-bit boundary, then ASSERT().\r
+  If Buffer is not aligned on a 64-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied from.\r
+  @param  Length          Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer receiving the data read.\r
+\r
+  @return Buffer\r
+\r
+**/\r
+UINT64 *\r
+EFIAPI\r
+MmioReadBuffer64 (\r
+  IN  UINTN       StartAddress,\r
+  IN  UINTN       Length,\r
+  OUT UINT64      *Buffer\r
+  )\r
+{\r
+  UINT64    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT64) - 1)) == 0);\r
+  \r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT64) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT64) - 1)) == 0);\r
\r
+  ReturnBuffer = Buffer;\r
+  \r
+  while (Length) {\r
+    *(Buffer++) = MmioRead64 (StartAddress);\r
+    StartAddress += sizeof (UINT64);\r
+    Length -= sizeof (UINT64);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\r
+\r
+\r
+/**\r
+  Copy data from system memory to MMIO region by using 8-bit access.\r
+\r
+  Copy data from system memory specified by Buffer to MMIO region specified \r
+  by starting address StartAddress by using 8-bit access. The total number \r
+  of byte to be copied is specified by Length. Buffer is returned.\r
+  \r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().\r
+\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied to.\r
+  @param  Length     Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
+\r
+  @return Size in bytes of the copy.\r
+\r
+**/\r
+UINT8 *\r
+EFIAPI\r
+MmioWriteBuffer8 (\r
+  IN  UINTN         StartAddress,\r
+  IN  UINTN         Length,\r
+  IN  CONST UINT8   *Buffer\r
+  )\r
+{\r
+  VOID* ReturnBuffer;\r
+\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
\r
+  ReturnBuffer = (UINT8 *) Buffer;\r
+  \r
+  while (Length--) {\r
+     MmioWrite8 (StartAddress++, *(Buffer++));\r
+  }\r
+\r
+  return ReturnBuffer;\r
\r
+}\r
+\r
+/**\r
+  Copy data from system memory to MMIO region by using 16-bit access.\r
+\r
+  Copy data from system memory specified by Buffer to MMIO region specified \r
+  by starting address StartAddress by using 16-bit access. The total number \r
+  of byte to be copied is specified by Length. Length is returned.\r
+  \r
+  If StartAddress is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  If Buffer is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied to.\r
+  @param  Length     Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
+\r
+  @return Size in bytes of the copy.\r
+\r
+**/\r
+UINT16 *\r
+EFIAPI\r
+MmioWriteBuffer16 (\r
+  IN  UINTN        StartAddress,\r
+  IN  UINTN        Length,\r
+  IN  CONST UINT16 *Buffer\r
+  )\r
+{\r
+  UINT16    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT16) - 1)) == 0);\r
+  \r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT16) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT16) - 1)) == 0);\r
+\r
+  ReturnBuffer = (UINT16 *) Buffer;\r
+  \r
+  while (Length) {\r
+    MmioWrite16 (StartAddress, *(Buffer++));\r
+    \r
+    StartAddress += sizeof (UINT16);\r
+    Length -= sizeof (UINT16);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\r
+\r
+\r
+/**\r
+  Copy data from system memory to MMIO region by using 32-bit access.\r
+\r
+  Copy data from system memory specified by Buffer to MMIO region specified \r
+  by starting address StartAddress by using 32-bit access. The total number \r
+  of byte to be copied is specified by Length. Length is returned.\r
+  \r
+  If StartAddress is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  If Buffer is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied to.\r
+  @param  Length     Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
+\r
+  @return Size in bytes of the copy.\r
+\r
+**/\r
+UINT32 *\r
+EFIAPI\r
+MmioWriteBuffer32 (\r
+  IN  UINTN        StartAddress,\r
+  IN  UINTN        Length,\r
+  IN  CONST UINT32 *Buffer\r
+  )\r
+{\r
+  UINT32    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT32) - 1)) == 0);\r
+  \r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT32) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT32) - 1)) == 0);\r
+\r
+  ReturnBuffer = (UINT32 *) Buffer;\r
+  \r
+  while (Length) {\r
+    MmioWrite32 (StartAddress, *(Buffer++));\r
+    \r
+    StartAddress += sizeof (UINT32);\r
+    Length -= sizeof (UINT32);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\r
+\r
+/**\r
+  Copy data from system memory to MMIO region by using 64-bit access.\r
+\r
+  Copy data from system memory specified by Buffer to MMIO region specified \r
+  by starting address StartAddress by using 64-bit access. The total number \r
+  of byte to be copied is specified by Length. Length is returned.\r
+  \r
+  If StartAddress is not aligned on a 64-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 64-bit boundary, then ASSERT().\r
+\r
+  If Buffer is not aligned on a 64-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied to.\r
+  @param  Length     Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
+\r
+  @return Size in bytes of the copy.\r
+\r
+**/\r
+UINT64 *\r
+EFIAPI\r
+MmioWriteBuffer64 (\r
+  IN  UINTN        StartAddress,\r
+  IN  UINTN        Length,\r
+  IN  CONST UINT64 *Buffer\r
+  )\r
+{\r
+  UINT64    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT64) - 1)) == 0);\r
+  \r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT64) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT64) - 1)) == 0);\r
+\r
+  ReturnBuffer = (UINT64 *) Buffer;\r
+  \r
+  while (Length) {\r
+    MmioWrite64 (StartAddress, *(Buffer++));\r
+    \r
+    StartAddress += sizeof (UINT64);\r
+    Length -= sizeof (UINT64);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\r
+\r
index fc2b1dab7c377d94cfcc4eea76a2d710b830d219..7e4c870b4f1e08e0afef6e28ade32f350f904995 100644 (file)
-<?xml version="1.0" encoding="UTF-8"?>\r
-<!--\r
-Copyright (c) 2006, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
--->\r
-<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0">\r
-  <MsaHeader>\r
-    <ModuleName>BaseLib</ModuleName>\r
-    <ModuleType>BASE</ModuleType>\r
-    <GuidValue>27d67720-ea68-48ae-93da-a3a074c90e30</GuidValue>\r
-    <Version>1.0</Version>\r
-    <Abstract>Component description file for Base Library</Abstract>\r
-    <Description>Base Library implementation.</Description>\r
-    <Copyright>Copyright (c) 2006, Intel Corporation.</Copyright>\r
-    <License>All rights reserved. This program and the accompanying materials\r
-      are licensed and made available under the terms and conditions of the BSD License\r
-      which accompanies this distribution.  The full text of the license may be found at\r
-      http://opensource.org/licenses/bsd-license.php\r
-      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.</License>\r
-    <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION   0x00000052</Specification>\r
-  </MsaHeader>\r
-  <ModuleDefinitions>\r
-    <SupportedArchitectures>IA32 X64 IPF EBC</SupportedArchitectures>\r
-    <BinaryModule>false</BinaryModule>\r
-    <OutputFileBasename>BaseLib</OutputFileBasename>\r
-  </ModuleDefinitions>\r
-  <LibraryClassDefinitions>\r
-    <LibraryClass Usage="ALWAYS_PRODUCED">\r
-      <Keyword>BaseLib</Keyword>\r
-    </LibraryClass>\r
-    <LibraryClass Usage="ALWAYS_CONSUMED">\r
-      <Keyword>BaseMemoryLib</Keyword>\r
-    </LibraryClass>\r
-    <LibraryClass Usage="ALWAYS_CONSUMED">\r
-      <Keyword>DebugLib</Keyword>\r
-    </LibraryClass>\r
-    <LibraryClass Usage="ALWAYS_CONSUMED">\r
-      <Keyword>TimerLib</Keyword>\r
-    </LibraryClass>\r
-    <LibraryClass Usage="ALWAYS_CONSUMED">\r
-      <Keyword>PcdLib</Keyword>\r
-    </LibraryClass>\r
-  </LibraryClassDefinitions>\r
-  <SourceFiles>\r
-    <Filename>BaseLibInternals.h</Filename>\r
-    <Filename>String.c</Filename>\r
-    <Filename>LinkedList.c</Filename>\r
-    <Filename>Synchronization.c</Filename>\r
-    <Filename>Cpu.c</Filename>\r
-    <Filename>CpuDeadLoop.c</Filename>\r
-    <Filename>BitField.c</Filename>\r
-    <Filename>ARShiftU64.c</Filename>\r
-    <Filename>DivS64x64Remainder.c</Filename>\r
-    <Filename>DivU64x32.c</Filename>\r
-    <Filename>DivU64x32Remainder.c</Filename>\r
-    <Filename>DivU64x64Remainder.c</Filename>\r
-    <Filename>GetPowerOfTwo32.c</Filename>\r
-    <Filename>GetPowerOfTwo64.c</Filename>\r
-    <Filename>HighBitSet32.c</Filename>\r
-    <Filename>HighBitSet64.c</Filename>\r
-    <Filename>LowBitSet32.c</Filename>\r
-    <Filename>LowBitSet64.c</Filename>\r
-    <Filename>LRotU32.c</Filename>\r
-    <Filename>LRotU64.c</Filename>\r
-    <Filename>LShiftU64.c</Filename>\r
-    <Filename>ModU64x32.c</Filename>\r
-    <Filename>MultS64x64.c</Filename>\r
-    <Filename>MultU64x32.c</Filename>\r
-    <Filename>MultU64x64.c</Filename>\r
-    <Filename>RRotU32.c</Filename>\r
-    <Filename>RRotU64.c</Filename>\r
-    <Filename>RShiftU64.c</Filename>\r
-    <Filename>SetJump.c</Filename>\r
-    <Filename>LongJump.c</Filename>\r
-    <Filename>SwapBytes16.c</Filename>\r
-    <Filename>SwapBytes32.c</Filename>\r
-    <Filename>SwapBytes64.c</Filename>\r
-    <Filename>SwitchStack.c</Filename>\r
-\r
-    <Filename SupArchList="IA32">x86DisablePaging32.c</Filename>\r
-    <Filename SupArchList="IA32">x86DisablePaging64.c</Filename>\r
-    <Filename SupArchList="IA32">x86EnablePaging32.c</Filename>\r
-    <Filename SupArchList="IA32">x86EnablePaging64.c</Filename>\r
-    <Filename SupArchList="IA32">x86FxRestore.c</Filename>\r
-    <Filename SupArchList="IA32">x86FxSave.c</Filename>\r
-    <Filename SupArchList="IA32">x86GetInterruptState.c</Filename>\r
-    <Filename SupArchList="IA32">x86MemoryFence.c</Filename>\r
-    <Filename SupArchList="IA32">x86Msr.c</Filename>\r
-    <Filename SupArchList="IA32">x86ReadGdtr.c</Filename>\r
-    <Filename SupArchList="IA32">x86ReadIdtr.c</Filename>\r
-    <Filename SupArchList="IA32">x86Thunk.c</Filename>\r
-    <Filename SupArchList="IA32">x86WriteGdtr.c</Filename>\r
-    <Filename SupArchList="IA32">x86WriteIdtr.c</Filename>\r
-    <Filename SupArchList="IA32">Unaligned.c</Filename>\r
-    <Filename SupArchList="IA32">Ia32/Non-existing.c</Filename>\r
-    <Filename SupArchList="IA32">Ia32/InternalSwitchStack.c</Filename>\r
-    <Filename SupArchList="IA32">Ia32/DivS64x64Remainder.c</Filename>\r
-\r
-    <!-- GCC assembly code is with .S extension -->\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/LShiftU64.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/RShiftU64.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ARShiftU64.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/LRotU64.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/RRotU64.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/MultU64x32.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/MultU64x64.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/DivU64x32.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ModU64x32.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/DivU64x32Remainder.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/DivU64x64Remainder.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/SwapBytes64.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/SetJump.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/LongJump.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/CpuId.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/CpuIdEx.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadEflags.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadMsr64.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteMsr64.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadCr0.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadCr2.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadCr3.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadCr4.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteCr0.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteCr2.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteCr3.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteCr4.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadDr0.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadDr1.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadDr2.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadDr3.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadDr4.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadDr5.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadDr6.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadDr7.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteDr0.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteDr1.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteDr2.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteDr3.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteDr4.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteDr5.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteDr6.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteDr7.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadCs.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadDs.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadEs.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadFs.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadGs.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadSs.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadTr.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadGdtr.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteGdtr.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadIdtr.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteIdtr.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadLdtr.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteLdtr.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/FxSave.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/FxRestore.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadMm0.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadMm1.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadMm2.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadMm3.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadMm4.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadMm5.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadMm6.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadMm7.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteMm0.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteMm1.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteMm2.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteMm3.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteMm4.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteMm5.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteMm6.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteMm7.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadTsc.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadPmc.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/Monitor.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/Mwait.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/EnablePaging32.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/DisablePaging32.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/EnablePaging64.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/Wbinvd.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/Invd.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/FlushCacheLine.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/InterlockedIncrement.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/InterlockedDecrement.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/InterlockedCompareExchange32.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/InterlockedCompareExchange64.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/EnableInterrupts.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/DisableInterrupts.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/EnableDisableInterrupts.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/CpuSleep.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/CpuPause.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/CpuBreakpoint.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/CpuFlushTlb.S</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/Thunk16.S</Filename>\r
-\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/CpuBreakpoint.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/CpuFlushTlb.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/CpuIdEx.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/CpuId.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/CpuPause.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/CpuSleep.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/DisableInterrupts.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/DisablePaging64.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/EnableDisableInterrupts.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/EnableInterrupts.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/EnablePaging64.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/FlushCacheLine.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/FxRestore.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/FxSave.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/InterlockedCompareExchange32.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/InterlockedCompareExchange64.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/InterlockedDecrement.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/InterlockedIncrement.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/Invd.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/LongJump.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/Monitor.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/Mwait.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadCr0.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadCr2.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadCr3.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadCr4.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadCs.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadDr0.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadDr1.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadDr2.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadDr3.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadDr4.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadDr5.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadDr6.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadDr7.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadDs.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadEflags.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadEs.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadFs.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadGdtr.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadGs.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadIdtr.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadLdtr.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadMm0.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadMm1.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadMm2.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadMm3.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadMm4.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadMm5.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadMm6.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadMm7.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadMsr64.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadPmc.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadSs.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadTr.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadTsc.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/SetJump.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/SwitchStack.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/Thunk16.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/Wbinvd.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteCr0.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteCr2.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteCr3.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteCr4.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteDr0.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteDr1.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteDr2.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteDr3.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteDr4.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteDr5.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteDr6.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteDr7.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteGdtr.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteIdtr.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteLdtr.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteMm0.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteMm1.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteMm2.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteMm3.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteMm4.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteMm5.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteMm6.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteMm7.S</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteMsr64.S</Filename>\r
-\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ARShiftU64.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/CpuBreakpoint.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/CpuFlushTlb.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/CpuSleep.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/CpuId.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/CpuIdEx.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/CpuPause.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/DisableInterrupts.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/DisablePaging32.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/DivU64x32.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/DivU64x32Remainder.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/DivU64x64Remainder.c</Filename>\r
-\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/EnableDisableInterrupts.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/EnableInterrupts.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/EnablePaging32.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/EnablePaging64.asm</Filename>\r
-\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/FlushCacheLine.c</Filename>\r
-\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/FxSave.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/FxRestore.c</Filename>\r
-\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/InterlockedIncrement.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/InterlockedDecrement.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/InterlockedCompareExchange32.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/InterlockedCompareExchange64.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/Invd.c</Filename>\r
-\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/LongJump.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/LRotU64.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/LShiftU64.c</Filename>\r
-\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/MultU64x32.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/MultU64x64.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ModU64x32.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/Monitor.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/Mwait.c</Filename>\r
-\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadCr0.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadCr2.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadCr3.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadCr4.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadDr0.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadDr1.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadDr2.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadDr3.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadDr4.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadDr5.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadDr6.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadDr7.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadEflags.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadMm0.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadMm1.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadMm2.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadMm3.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadMm4.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadMm5.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadMm6.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadMm7.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadMsr64.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadCs.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadDs.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadEs.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadFs.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadGs.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadSs.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadTr.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadGdtr.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadIdtr.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadLdtr.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadTsc.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadPmc.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/RShiftU64.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/RRotU64.c</Filename>\r
-\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/SetJump.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/SwapBytes64.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/Thunk16.asm</Filename>\r
-\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteMsr64.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteCr0.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteCr2.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteCr3.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteCr4.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteDr0.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteDr1.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteDr2.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteDr3.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteDr4.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteDr5.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteDr6.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteDr7.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteGdtr.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteIdtr.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteLdtr.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteMm0.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteMm1.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteMm2.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteMm3.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteMm4.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteMm5.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteMm6.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteMm7.c</Filename>\r
-    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/Wbinvd.c</Filename>\r
-\r
-    <Filename SupArchList="X64">x86DisablePaging32.c</Filename>\r
-    <Filename SupArchList="X64">x86DisablePaging64.c</Filename>\r
-    <Filename SupArchList="X64">x86EnablePaging32.c</Filename>\r
-    <Filename SupArchList="X64">x86EnablePaging64.c</Filename>\r
-    <Filename SupArchList="X64">x86FxRestore.c</Filename>\r
-    <Filename SupArchList="X64">x86FxSave.c</Filename>\r
-    <Filename SupArchList="X64">x86GetInterruptState.c</Filename>\r
-    <Filename SupArchList="X64">x86MemoryFence.c</Filename>\r
-    <Filename SupArchList="X64">x86Msr.c</Filename>\r
-    <Filename SupArchList="X64">x86ReadGdtr.c</Filename>\r
-    <Filename SupArchList="X64">x86ReadIdtr.c</Filename>\r
-    <Filename SupArchList="X64">x86Thunk.c</Filename>\r
-    <Filename SupArchList="X64">x86WriteGdtr.c</Filename>\r
-    <Filename SupArchList="X64">x86WriteIdtr.c</Filename>\r
-    <Filename SupArchList="X64">Unaligned.c</Filename>\r
-    <Filename SupArchList="X64">Math64.c</Filename>\r
-    <Filename SupArchList="X64">X64/Non-existing.c</Filename>\r
-    <Filename SupArchList="X64">X64/SwitchStack.asm</Filename>\r
-    <Filename SupArchList="X64">X64/SetJump.asm</Filename>\r
-    <Filename SupArchList="X64">X64/LongJump.asm</Filename>\r
-    <Filename SupArchList="X64">X64/CpuId.asm</Filename>\r
-    <Filename SupArchList="X64">X64/CpuIdEx.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadEflags.asm</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="MSFT">X64/ReadMsr64.c</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="MSFT">X64/WriteMsr64.c</Filename>\r
-    <Filename SupArchList="X64">X64/ReadCr0.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadCr2.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadCr3.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadCr4.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteCr0.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteCr2.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteCr3.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteCr4.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadDr0.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadDr1.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadDr2.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadDr3.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadDr4.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadDr5.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadDr6.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadDr7.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteDr0.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteDr1.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteDr2.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteDr3.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteDr4.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteDr5.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteDr6.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteDr7.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadCs.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadDs.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadEs.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadFs.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadGs.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadSs.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadTr.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadGdtr.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteGdtr.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadIdtr.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteIdtr.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadLdtr.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteLdtr.asm</Filename>\r
-    <Filename SupArchList="X64">X64/FxSave.asm</Filename>\r
-    <Filename SupArchList="X64">X64/FxRestore.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadMm0.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadMm1.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadMm2.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadMm3.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadMm4.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadMm5.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadMm6.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadMm7.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteMm0.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteMm1.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteMm2.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteMm3.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteMm4.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteMm5.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteMm6.asm</Filename>\r
-    <Filename SupArchList="X64">X64/WriteMm7.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadTsc.asm</Filename>\r
-    <Filename SupArchList="X64">X64/ReadPmc.asm</Filename>\r
-    <Filename SupArchList="X64">X64/Monitor.asm</Filename>\r
-    <Filename SupArchList="X64">X64/Mwait.asm</Filename>\r
-    <Filename SupArchList="X64">X64/EnablePaging64.asm</Filename>\r
-    <Filename SupArchList="X64">X64/DisablePaging64.asm</Filename>\r
-    <Filename SupArchList="X64">X64/Wbinvd.asm</Filename>\r
-    <Filename SupArchList="X64">X64/Invd.asm</Filename>\r
-    <Filename SupArchList="X64">X64/FlushCacheLine.asm</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="MSFT">X64/InterlockedIncrement.c</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="MSFT">X64/InterlockedDecrement.c</Filename>\r
-    <Filename SupArchList="X64">X64/InterlockedCompareExchange32.asm</Filename>\r
-    <Filename SupArchList="X64">X64/InterlockedCompareExchange64.asm</Filename>\r
-    <Filename SupArchList="X64">X64/EnableInterrupts.asm</Filename>\r
-    <Filename SupArchList="X64">X64/DisableInterrupts.asm</Filename>\r
-    <Filename SupArchList="X64">X64/EnableDisableInterrupts.asm</Filename>\r
-    <Filename SupArchList="X64">X64/CpuSleep.asm</Filename>\r
-    <Filename SupArchList="X64">X64/CpuPause.asm</Filename>\r
-    <Filename SupArchList="X64" ToolChainFamily="MSFT">X64/CpuBreakpoint.c</Filename>\r
-    <Filename SupArchList="X64">X64/CpuFlushTlb.asm</Filename>\r
-    <Filename SupArchList="X64">X64/Thunk16.asm</Filename>\r
-\r
-    <Filename SupArchList="IPF">Math64.c</Filename>\r
-    <Filename SupArchList="IPF">Ipf/asm.h</Filename>\r
-    <Filename SupArchList="IPF">Ipf/ia_64gen.h</Filename>\r
-    <Filename SupArchList="IPF">Ipf/PalCallStatic.s</Filename>\r
-    <Filename SupArchList="IPF">Ipf/setjmp.s</Filename>\r
-    <Filename SupArchList="IPF">Ipf/longjmp.s</Filename>\r
-    <Filename SupArchList="IPF">Ipf/SwitchStack.s</Filename>\r
-    <Filename SupArchList="IPF">Ipf/Unaligned.c</Filename>\r
-    <Filename SupArchList="IPF">Ipf/CpuBreakpoint.c</Filename>\r
-    <Filename SupArchList="IPF">Ipf/InterlockedCompareExchange32.s</Filename>\r
-    <Filename SupArchList="IPF">Ipf/InterlockedCompareExchange64.s</Filename>\r
-    <Filename SupArchList="IPF">Ipf/Synchronization.c</Filename>\r
-    <Filename SupArchList="IPF">Ipf/CpuPause.s</Filename>\r
-    <Filename SupArchList="IPF">Ipf/CpuFlushTlb.s</Filename>\r
-    <Filename SupArchList="IPF">Ipf/GetInterruptState.s</Filename>\r
-    <Filename SupArchList="IPF">Ipf/Non-existing.c</Filename>\r
-    <Filename SupArchList="IPF">Ipf/FlushCacheRange.s</Filename>\r
-    <Filename SupArchList="IPF">Ipf/ReadItc.s</Filename>\r
-\r
-    <Filename SupArchList="EBC">Math64.c</Filename>\r
-    <Filename SupArchList="EBC">Unaligned.c</Filename>\r
-    <Filename SupArchList="EBC">Ebc/SwitchStack.c</Filename>\r
-    <Filename SupArchList="EBC">Ebc/SetJumpLongJump.c</Filename>\r
-    <Filename SupArchList="EBC">Ebc/CpuBreakpoint.c</Filename>\r
-    <Filename SupArchList="EBC">Ebc/Synchronization.c</Filename>\r
-  </SourceFiles>\r
-  <NonProcessedFiles>\r
-    <Filename>Ia32/ARShiftU64.asm</Filename>\r
-    <Filename>Ia32/CpuBreakpoint.asm</Filename>\r
-    <Filename>Ia32/CpuFlushTlb.asm</Filename>\r
-    <Filename>Ia32/CpuId.asm</Filename>\r
-    <Filename>Ia32/CpuIdEx.asm</Filename>\r
-    <Filename>Ia32/CpuPause.asm</Filename>\r
-    <Filename>Ia32/CpuSleep.asm</Filename>\r
-    <Filename>Ia32/DisableInterrupts.asm</Filename>\r
-    <Filename>Ia32/DisablePaging32.asm</Filename>\r
-    <Filename>Ia32/DivU64x32.asm</Filename>\r
-    <Filename>Ia32/DivU64x32Remainder.asm</Filename>\r
-    <Filename>Ia32/DivU64x64Remainder.asm</Filename>\r
-    <Filename>Ia32/EnableDisableInterrupts.asm</Filename>\r
-    <Filename>Ia32/EnableInterrupts.asm</Filename>\r
-    <Filename>Ia32/EnablePaging32.asm</Filename>\r
-    <Filename>Ia32/EnablePaging64.asm</Filename>\r
-    <Filename>Ia32/FlushCacheLine.asm</Filename>\r
-    <Filename>Ia32/FxRestore.asm</Filename>\r
-    <Filename>Ia32/FxSave.asm</Filename>\r
-    <Filename>Ia32/InterlockedCompareExchange32.asm</Filename>\r
-    <Filename>Ia32/InterlockedCompareExchange64.asm</Filename>\r
-    <Filename>Ia32/InterlockedDecrement.asm</Filename>\r
-    <Filename>Ia32/InterlockedIncrement.asm</Filename>\r
-    <Filename>Ia32/Invd.asm</Filename>\r
-    <Filename>Ia32/LongJump.asm</Filename>\r
-    <Filename>Ia32/LRotU64.asm</Filename>\r
-    <Filename>Ia32/LShiftU64.asm</Filename>\r
-    <Filename>Ia32/ModU64x32.asm</Filename>\r
-    <Filename>Ia32/Monitor.asm</Filename>\r
-    <Filename>Ia32/MultU64x32.asm</Filename>\r
-    <Filename>Ia32/MultU64x64.asm</Filename>\r
-    <Filename>Ia32/Mwait.asm</Filename>\r
-    <Filename>Ia32/ReadCr0.asm</Filename>\r
-    <Filename>Ia32/ReadCr2.asm</Filename>\r
-    <Filename>Ia32/ReadCr3.asm</Filename>\r
-    <Filename>Ia32/ReadCr4.asm</Filename>\r
-    <Filename>Ia32/ReadCs.asm</Filename>\r
-    <Filename>Ia32/ReadDr0.asm</Filename>\r
-    <Filename>Ia32/ReadDr1.asm</Filename>\r
-    <Filename>Ia32/ReadDr2.asm</Filename>\r
-    <Filename>Ia32/ReadDr3.asm</Filename>\r
-    <Filename>Ia32/ReadDr4.asm</Filename>\r
-    <Filename>Ia32/ReadDr5.asm</Filename>\r
-    <Filename>Ia32/ReadDr6.asm</Filename>\r
-    <Filename>Ia32/ReadDr7.asm</Filename>\r
-    <Filename>Ia32/ReadDs.asm</Filename>\r
-    <Filename>Ia32/ReadEflags.asm</Filename>\r
-    <Filename>Ia32/ReadEs.asm</Filename>\r
-    <Filename>Ia32/ReadFs.asm</Filename>\r
-    <Filename>Ia32/ReadGdtr.asm</Filename>\r
-    <Filename>Ia32/ReadGs.asm</Filename>\r
-    <Filename>Ia32/ReadIdtr.asm</Filename>\r
-    <Filename>Ia32/ReadLdtr.asm</Filename>\r
-    <Filename>Ia32/ReadMm0.asm</Filename>\r
-    <Filename>Ia32/ReadMm1.asm</Filename>\r
-    <Filename>Ia32/ReadMm2.asm</Filename>\r
-    <Filename>Ia32/ReadMm3.asm</Filename>\r
-    <Filename>Ia32/ReadMm4.asm</Filename>\r
-    <Filename>Ia32/ReadMm5.asm</Filename>\r
-    <Filename>Ia32/ReadMm6.asm</Filename>\r
-    <Filename>Ia32/ReadMm7.asm</Filename>\r
-    <Filename>Ia32/ReadMsr64.asm</Filename>\r
-    <Filename>Ia32/ReadPmc.asm</Filename>\r
-    <Filename>Ia32/ReadSs.asm</Filename>\r
-    <Filename>Ia32/ReadTr.asm</Filename>\r
-    <Filename>Ia32/ReadTsc.asm</Filename>\r
-    <Filename>Ia32/RRotU64.asm</Filename>\r
-    <Filename>Ia32/RShiftU64.asm</Filename>\r
-    <Filename>Ia32/SetJump.asm</Filename>\r
-    <Filename>Ia32/SwapBytes64.asm</Filename>\r
-    <Filename>Ia32/Thunk16.asm</Filename>\r
-    <Filename>Ia32/Wbinvd.asm</Filename>\r
-    <Filename>Ia32/WriteCr0.asm</Filename>\r
-    <Filename>Ia32/WriteCr2.asm</Filename>\r
-    <Filename>Ia32/WriteCr3.asm</Filename>\r
-    <Filename>Ia32/WriteCr4.asm</Filename>\r
-    <Filename>Ia32/WriteDr0.asm</Filename>\r
-    <Filename>Ia32/WriteDr1.asm</Filename>\r
-    <Filename>Ia32/WriteDr2.asm</Filename>\r
-    <Filename>Ia32/WriteDr3.asm</Filename>\r
-    <Filename>Ia32/WriteDr4.asm</Filename>\r
-    <Filename>Ia32/WriteDr5.asm</Filename>\r
-    <Filename>Ia32/WriteDr6.asm</Filename>\r
-    <Filename>Ia32/WriteDr7.asm</Filename>\r
-    <Filename>Ia32/WriteGdtr.asm</Filename>\r
-    <Filename>Ia32/WriteIdtr.asm</Filename>\r
-    <Filename>Ia32/WriteLdtr.asm</Filename>\r
-    <Filename>Ia32/WriteMm0.asm</Filename>\r
-    <Filename>Ia32/WriteMm1.asm</Filename>\r
-    <Filename>Ia32/WriteMm2.asm</Filename>\r
-    <Filename>Ia32/WriteMm3.asm</Filename>\r
-    <Filename>Ia32/WriteMm4.asm</Filename>\r
-    <Filename>Ia32/WriteMm5.asm</Filename>\r
-    <Filename>Ia32/WriteMm6.asm</Filename>\r
-    <Filename>Ia32/WriteMm7.asm</Filename>\r
-    <Filename>Ia32/WriteMsr64.asm</Filename>\r
-  </NonProcessedFiles>\r
-  <PackageDependencies>\r
-    <Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>\r
-  </PackageDependencies>\r
-  <Externs>\r
-    <Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification>\r
-    <Specification>EDK_RELEASE_VERSION 0x00020000</Specification>\r
-  </Externs>\r
-  <PcdCoded>\r
-    <PcdEntry PcdItemType="FIXED_AT_BUILD">\r
-      <C_Name>PcdMaximumUnicodeStringLength</C_Name>\r
-          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-      <HelpText>If PcdMaximumUnicodeStringLength is not zero, the maximum\r
-                number of characters (not counting the NULL-terminator) in a\r
-                Unicode string cannot exceed it.</HelpText>\r
-    </PcdEntry>\r
-    <PcdEntry PcdItemType="FIXED_AT_BUILD">\r
-      <C_Name>PcdMaximumAsciiStringLength</C_Name>\r
-          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-      <HelpText>If PcdMaximumAsciiStringLength is not zero, the maximum number\r
-                of characters (not counting the NULL-terminator) in an ASCII\r
-                string cannot exceed it.</HelpText>\r
-    </PcdEntry>\r
-    <PcdEntry PcdItemType="FIXED_AT_BUILD">\r
-      <C_Name>PcdMaximumLinkedListLength</C_Name>\r
-          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-      <HelpText>If PcdMaximumLinkedListLength is not zero, the maximum number\r
-                of nodes (not counting the list header) in a linked list\r
-                cannot exceed it.</HelpText>\r
-    </PcdEntry>\r
-    <PcdEntry PcdItemType="FIXED_AT_BUILD">\r
-      <C_Name>PcdSpinLockTimeout</C_Name>\r
-          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
-      <HelpText>If PcdSpinLockTimeout is not zero, it stands for the timeout\r
-                value (unit: millisecond) for spin lock.</HelpText>\r
-    </PcdEntry>\r
-  </PcdCoded>\r
-</ModuleSurfaceArea>\r
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (c) 2006 - 2007, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+-->
+<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0">
+  <MsaHeader>
+    <ModuleName>BaseLib</ModuleName>
+    <ModuleType>BASE</ModuleType>
+    <GuidValue>27d67720-ea68-48ae-93da-a3a074c90e30</GuidValue>
+    <Version>1.0</Version>
+    <Abstract>Component description file for Base Library</Abstract>
+    <Description>Base Library implementation.</Description>
+    <Copyright>Copyright (c) 2006 - 2007, Intel Corporation.</Copyright>
+    <License>All rights reserved. This program and the accompanying materials
+      are licensed and made available under the terms and conditions of the BSD License
+      which accompanies this distribution.  The full text of the license may be found at
+      http://opensource.org/licenses/bsd-license.php
+      THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+      WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.</License>
+    <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION   0x00000052</Specification>
+  </MsaHeader>
+  <ModuleDefinitions>
+    <SupportedArchitectures>IA32 X64 IPF EBC</SupportedArchitectures>
+    <BinaryModule>false</BinaryModule>
+    <OutputFileBasename>BaseLib</OutputFileBasename>
+  </ModuleDefinitions>
+  <LibraryClassDefinitions>
+    <LibraryClass Usage="ALWAYS_PRODUCED">
+      <Keyword>BaseLib</Keyword>
+    </LibraryClass>
+    <LibraryClass Usage="ALWAYS_CONSUMED">
+      <Keyword>BaseMemoryLib</Keyword>
+    </LibraryClass>
+    <LibraryClass Usage="ALWAYS_CONSUMED">
+      <Keyword>DebugLib</Keyword>
+    </LibraryClass>
+    <LibraryClass Usage="ALWAYS_CONSUMED">
+      <Keyword>TimerLib</Keyword>
+    </LibraryClass>
+    <LibraryClass Usage="ALWAYS_CONSUMED">
+      <Keyword>PcdLib</Keyword>
+    </LibraryClass>
+  </LibraryClassDefinitions>
+  <SourceFiles>
+    <Filename>BaseLibInternals.h</Filename>
+    <Filename>String.c</Filename>
+    <Filename>LinkedList.c</Filename>
+    <Filename>Synchronization.c</Filename>
+    <Filename>Cpu.c</Filename>
+    <Filename>CpuDeadLoop.c</Filename>
+    <Filename>BitField.c</Filename>
+    <Filename>ARShiftU64.c</Filename>
+    <Filename>DivS64x64Remainder.c</Filename>
+    <Filename>DivU64x32.c</Filename>
+    <Filename>DivU64x32Remainder.c</Filename>
+    <Filename>DivU64x64Remainder.c</Filename>
+    <Filename>GetPowerOfTwo32.c</Filename>
+    <Filename>GetPowerOfTwo64.c</Filename>
+    <Filename>HighBitSet32.c</Filename>
+    <Filename>HighBitSet64.c</Filename>
+    <Filename>LowBitSet32.c</Filename>
+    <Filename>LowBitSet64.c</Filename>
+    <Filename>LRotU32.c</Filename>
+    <Filename>LRotU64.c</Filename>
+    <Filename>LShiftU64.c</Filename>
+    <Filename>ModU64x32.c</Filename>
+    <Filename>MultS64x64.c</Filename>
+    <Filename>MultU64x32.c</Filename>
+    <Filename>MultU64x64.c</Filename>
+    <Filename>RRotU32.c</Filename>
+    <Filename>RRotU64.c</Filename>
+    <Filename>RShiftU64.c</Filename>
+    <Filename>SetJump.c</Filename>
+    <Filename>LongJump.c</Filename>
+    <Filename>SwapBytes16.c</Filename>
+    <Filename>SwapBytes32.c</Filename>
+    <Filename>SwapBytes64.c</Filename>
+    <Filename>SwitchStack.c</Filename>
+         <Filename>CheckSum.c</Filename>
+    <Filename SupArchList="IA32">x86DisablePaging32.c</Filename>
+    <Filename SupArchList="IA32">x86DisablePaging64.c</Filename>
+    <Filename SupArchList="IA32">x86EnablePaging32.c</Filename>
+    <Filename SupArchList="IA32">x86EnablePaging64.c</Filename>
+    <Filename SupArchList="IA32">x86FxRestore.c</Filename>
+    <Filename SupArchList="IA32">x86FxSave.c</Filename>
+    <Filename SupArchList="IA32">x86GetInterruptState.c</Filename>
+    <Filename SupArchList="IA32">x86MemoryFence.c</Filename>
+    <Filename SupArchList="IA32">x86Msr.c</Filename>
+    <Filename SupArchList="IA32">x86ReadGdtr.c</Filename>
+    <Filename SupArchList="IA32">x86ReadIdtr.c</Filename>
+    <Filename SupArchList="IA32">x86Thunk.c</Filename>
+    <Filename SupArchList="IA32">x86WriteGdtr.c</Filename>
+    <Filename SupArchList="IA32">x86WriteIdtr.c</Filename>
+    <Filename SupArchList="IA32">Unaligned.c</Filename>
+    <Filename SupArchList="IA32">Ia32/Non-existing.c</Filename>
+    <Filename SupArchList="IA32">Ia32/InternalSwitchStack.c</Filename>
+    <Filename SupArchList="IA32">Ia32/DivS64x64Remainder.c</Filename>
+
+    <!-- GCC assembly code is with .S extension -->
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/LShiftU64.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/RShiftU64.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ARShiftU64.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/LRotU64.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/RRotU64.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/MultU64x32.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/MultU64x64.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/DivU64x32.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ModU64x32.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/DivU64x32Remainder.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/DivU64x64Remainder.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/SwapBytes64.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/SetJump.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/LongJump.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/CpuId.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/CpuIdEx.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadEflags.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadMsr64.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteMsr64.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadCr0.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadCr2.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadCr3.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadCr4.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteCr0.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteCr2.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteCr3.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteCr4.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadDr0.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadDr1.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadDr2.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadDr3.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadDr4.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadDr5.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadDr6.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadDr7.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteDr0.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteDr1.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteDr2.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteDr3.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteDr4.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteDr5.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteDr6.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteDr7.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadCs.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadDs.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadEs.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadFs.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadGs.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadSs.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadTr.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadGdtr.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteGdtr.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadIdtr.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteIdtr.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadLdtr.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteLdtr.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/FxSave.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/FxRestore.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadMm0.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadMm1.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadMm2.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadMm3.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadMm4.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadMm5.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadMm6.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadMm7.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteMm0.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteMm1.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteMm2.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteMm3.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteMm4.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteMm5.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteMm6.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/WriteMm7.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadTsc.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/ReadPmc.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/Monitor.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/Mwait.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/EnablePaging32.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/DisablePaging32.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/EnablePaging64.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/Wbinvd.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/Invd.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/FlushCacheLine.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/InterlockedIncrement.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/InterlockedDecrement.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/InterlockedCompareExchange32.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/InterlockedCompareExchange64.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/EnableInterrupts.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/DisableInterrupts.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/EnableDisableInterrupts.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/CpuSleep.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/CpuPause.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/CpuBreakpoint.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/CpuFlushTlb.S</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="GCC">Ia32/Thunk16.S</Filename>
+
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/CpuBreakpoint.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/CpuFlushTlb.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/CpuIdEx.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/CpuId.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/CpuPause.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/CpuSleep.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/DisableInterrupts.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/DisablePaging64.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/EnableDisableInterrupts.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/EnableInterrupts.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/EnablePaging64.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/FlushCacheLine.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/FxRestore.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/FxSave.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/InterlockedCompareExchange32.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/InterlockedCompareExchange64.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/InterlockedDecrement.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/InterlockedIncrement.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/Invd.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/LongJump.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/Monitor.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/Mwait.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadCr0.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadCr2.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadCr3.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadCr4.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadCs.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadDr0.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadDr1.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadDr2.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadDr3.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadDr4.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadDr5.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadDr6.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadDr7.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadDs.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadEflags.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadEs.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadFs.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadGdtr.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadGs.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadIdtr.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadLdtr.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadMm0.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadMm1.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadMm2.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadMm3.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadMm4.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadMm5.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadMm6.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadMm7.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadMsr64.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadPmc.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadSs.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadTr.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/ReadTsc.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/SetJump.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/SwitchStack.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/Thunk16.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/Wbinvd.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteCr0.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteCr2.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteCr3.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteCr4.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteDr0.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteDr1.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteDr2.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteDr3.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteDr4.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteDr5.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteDr6.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteDr7.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteGdtr.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteIdtr.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteLdtr.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteMm0.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteMm1.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteMm2.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteMm3.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteMm4.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteMm5.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteMm6.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteMm7.S</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="GCC">X64/WriteMsr64.S</Filename>
+
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ARShiftU64.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/CpuBreakpoint.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/CpuFlushTlb.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/CpuSleep.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/CpuId.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/CpuIdEx.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/CpuPause.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/DisableInterrupts.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/DisablePaging32.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/DivU64x32.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/DivU64x32Remainder.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/DivU64x64Remainder.c</Filename>
+
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/EnableDisableInterrupts.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/EnableInterrupts.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/EnablePaging32.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/EnablePaging64.asm</Filename>
+
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/FlushCacheLine.c</Filename>
+
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/FxSave.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/FxRestore.c</Filename>
+
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/InterlockedIncrement.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/InterlockedDecrement.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/InterlockedCompareExchange32.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/InterlockedCompareExchange64.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/Invd.c</Filename>
+
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/LongJump.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/LRotU64.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/LShiftU64.c</Filename>
+
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/MultU64x32.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/MultU64x64.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ModU64x32.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/Monitor.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/Mwait.c</Filename>
+
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadCr0.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadCr2.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadCr3.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadCr4.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadDr0.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadDr1.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadDr2.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadDr3.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadDr4.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadDr5.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadDr6.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadDr7.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadEflags.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadMm0.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadMm1.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadMm2.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadMm3.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadMm4.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadMm5.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadMm6.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadMm7.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadMsr64.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadCs.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadDs.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadEs.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadFs.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadGs.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadSs.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadTr.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadGdtr.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadIdtr.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadLdtr.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadTsc.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/ReadPmc.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/RShiftU64.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/RRotU64.c</Filename>
+
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/SetJump.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/SwapBytes64.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/Thunk16.asm</Filename>
+
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteMsr64.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteCr0.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteCr2.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteCr3.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteCr4.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteDr0.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteDr1.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteDr2.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteDr3.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteDr4.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteDr5.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteDr6.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteDr7.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteGdtr.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteIdtr.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteLdtr.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteMm0.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteMm1.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteMm2.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteMm3.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteMm4.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteMm5.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteMm6.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/WriteMm7.c</Filename>
+    <Filename SupArchList="IA32" ToolChainFamily="MSFT">Ia32/Wbinvd.c</Filename>
+
+    <Filename SupArchList="X64">x86DisablePaging32.c</Filename>
+    <Filename SupArchList="X64">x86DisablePaging64.c</Filename>
+    <Filename SupArchList="X64">x86EnablePaging32.c</Filename>
+    <Filename SupArchList="X64">x86EnablePaging64.c</Filename>
+    <Filename SupArchList="X64">x86FxRestore.c</Filename>
+    <Filename SupArchList="X64">x86FxSave.c</Filename>
+    <Filename SupArchList="X64">x86GetInterruptState.c</Filename>
+    <Filename SupArchList="X64">x86MemoryFence.c</Filename>
+    <Filename SupArchList="X64">x86Msr.c</Filename>
+    <Filename SupArchList="X64">x86ReadGdtr.c</Filename>
+    <Filename SupArchList="X64">x86ReadIdtr.c</Filename>
+    <Filename SupArchList="X64">x86Thunk.c</Filename>
+    <Filename SupArchList="X64">x86WriteGdtr.c</Filename>
+    <Filename SupArchList="X64">x86WriteIdtr.c</Filename>
+    <Filename SupArchList="X64">Unaligned.c</Filename>
+    <Filename SupArchList="X64">Math64.c</Filename>
+    <Filename SupArchList="X64">X64/Non-existing.c</Filename>
+    <Filename SupArchList="X64">X64/SwitchStack.asm</Filename>
+    <Filename SupArchList="X64">X64/SetJump.asm</Filename>
+    <Filename SupArchList="X64">X64/LongJump.asm</Filename>
+    <Filename SupArchList="X64">X64/CpuId.asm</Filename>
+    <Filename SupArchList="X64">X64/CpuIdEx.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadEflags.asm</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="MSFT">X64/ReadMsr64.c</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="MSFT">X64/WriteMsr64.c</Filename>
+    <Filename SupArchList="X64">X64/ReadCr0.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadCr2.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadCr3.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadCr4.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteCr0.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteCr2.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteCr3.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteCr4.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadDr0.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadDr1.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadDr2.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadDr3.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadDr4.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadDr5.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadDr6.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadDr7.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteDr0.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteDr1.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteDr2.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteDr3.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteDr4.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteDr5.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteDr6.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteDr7.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadCs.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadDs.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadEs.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadFs.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadGs.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadSs.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadTr.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadGdtr.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteGdtr.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadIdtr.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteIdtr.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadLdtr.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteLdtr.asm</Filename>
+    <Filename SupArchList="X64">X64/FxSave.asm</Filename>
+    <Filename SupArchList="X64">X64/FxRestore.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadMm0.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadMm1.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadMm2.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadMm3.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadMm4.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadMm5.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadMm6.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadMm7.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteMm0.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteMm1.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteMm2.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteMm3.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteMm4.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteMm5.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteMm6.asm</Filename>
+    <Filename SupArchList="X64">X64/WriteMm7.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadTsc.asm</Filename>
+    <Filename SupArchList="X64">X64/ReadPmc.asm</Filename>
+    <Filename SupArchList="X64">X64/Monitor.asm</Filename>
+    <Filename SupArchList="X64">X64/Mwait.asm</Filename>
+    <Filename SupArchList="X64">X64/EnablePaging64.asm</Filename>
+    <Filename SupArchList="X64">X64/DisablePaging64.asm</Filename>
+    <Filename SupArchList="X64">X64/Wbinvd.asm</Filename>
+    <Filename SupArchList="X64">X64/Invd.asm</Filename>
+    <Filename SupArchList="X64">X64/FlushCacheLine.asm</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="MSFT">X64/InterlockedIncrement.c</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="MSFT">X64/InterlockedDecrement.c</Filename>
+    <Filename SupArchList="X64">X64/InterlockedCompareExchange32.asm</Filename>
+    <Filename SupArchList="X64">X64/InterlockedCompareExchange64.asm</Filename>
+    <Filename SupArchList="X64">X64/EnableInterrupts.asm</Filename>
+    <Filename SupArchList="X64">X64/DisableInterrupts.asm</Filename>
+    <Filename SupArchList="X64">X64/EnableDisableInterrupts.asm</Filename>
+    <Filename SupArchList="X64">X64/CpuSleep.asm</Filename>
+    <Filename SupArchList="X64">X64/CpuPause.asm</Filename>
+    <Filename SupArchList="X64" ToolChainFamily="MSFT">X64/CpuBreakpoint.c</Filename>
+    <Filename SupArchList="X64">X64/CpuFlushTlb.asm</Filename>
+    <Filename SupArchList="X64">X64/Thunk16.asm</Filename>
+
+    <Filename SupArchList="IPF">Math64.c</Filename>
+    <Filename SupArchList="IPF">Ipf/asm.h</Filename>
+    <Filename SupArchList="IPF">Ipf/ia_64gen.h</Filename>
+    <Filename SupArchList="IPF">Ipf/PalCallStatic.s</Filename>
+    <Filename SupArchList="IPF">Ipf/setjmp.s</Filename>
+    <Filename SupArchList="IPF">Ipf/longjmp.s</Filename>
+    <Filename SupArchList="IPF">Ipf/SwitchStack.s</Filename>
+    <Filename SupArchList="IPF">Ipf/Unaligned.c</Filename>
+    <Filename SupArchList="IPF">Ipf/CpuBreakpoint.c</Filename>
+    <Filename SupArchList="IPF">Ipf/InterlockedCompareExchange32.s</Filename>
+    <Filename SupArchList="IPF">Ipf/InterlockedCompareExchange64.s</Filename>
+    <Filename SupArchList="IPF">Ipf/Synchronization.c</Filename>
+    <Filename SupArchList="IPF">Ipf/CpuPause.s</Filename>
+    <Filename SupArchList="IPF">Ipf/CpuFlushTlb.s</Filename>
+    <Filename SupArchList="IPF">Ipf/GetInterruptState.s</Filename>
+    <Filename SupArchList="IPF">Ipf/Non-existing.c</Filename>
+    <Filename SupArchList="IPF">Ipf/FlushCacheRange.s</Filename>
+    <Filename SupArchList="IPF">Ipf/ReadItc.s</Filename>
+
+    <Filename SupArchList="EBC">Math64.c</Filename>
+    <Filename SupArchList="EBC">Unaligned.c</Filename>
+    <Filename SupArchList="EBC">Ebc/SwitchStack.c</Filename>
+    <Filename SupArchList="EBC">Ebc/SetJumpLongJump.c</Filename>
+    <Filename SupArchList="EBC">Ebc/CpuBreakpoint.c</Filename>
+    <Filename SupArchList="EBC">Ebc/Synchronization.c</Filename>
+    <Filename>CheckSum.c</Filename>
+  </SourceFiles>
+  <NonProcessedFiles>
+    <Filename>Ia32/ARShiftU64.asm</Filename>
+    <Filename>Ia32/CpuBreakpoint.asm</Filename>
+    <Filename>Ia32/CpuFlushTlb.asm</Filename>
+    <Filename>Ia32/CpuId.asm</Filename>
+    <Filename>Ia32/CpuIdEx.asm</Filename>
+    <Filename>Ia32/CpuPause.asm</Filename>
+    <Filename>Ia32/CpuSleep.asm</Filename>
+    <Filename>Ia32/DisableInterrupts.asm</Filename>
+    <Filename>Ia32/DisablePaging32.asm</Filename>
+    <Filename>Ia32/DivU64x32.asm</Filename>
+    <Filename>Ia32/DivU64x32Remainder.asm</Filename>
+    <Filename>Ia32/DivU64x64Remainder.asm</Filename>
+    <Filename>Ia32/EnableDisableInterrupts.asm</Filename>
+    <Filename>Ia32/EnableInterrupts.asm</Filename>
+    <Filename>Ia32/EnablePaging32.asm</Filename>
+    <Filename>Ia32/EnablePaging64.asm</Filename>
+    <Filename>Ia32/FlushCacheLine.asm</Filename>
+    <Filename>Ia32/FxRestore.asm</Filename>
+    <Filename>Ia32/FxSave.asm</Filename>
+    <Filename>Ia32/InterlockedCompareExchange32.asm</Filename>
+    <Filename>Ia32/InterlockedCompareExchange64.asm</Filename>
+    <Filename>Ia32/InterlockedDecrement.asm</Filename>
+    <Filename>Ia32/InterlockedIncrement.asm</Filename>
+    <Filename>Ia32/Invd.asm</Filename>
+    <Filename>Ia32/LongJump.asm</Filename>
+    <Filename>Ia32/LRotU64.asm</Filename>
+    <Filename>Ia32/LShiftU64.asm</Filename>
+    <Filename>Ia32/ModU64x32.asm</Filename>
+    <Filename>Ia32/Monitor.asm</Filename>
+    <Filename>Ia32/MultU64x32.asm</Filename>
+    <Filename>Ia32/MultU64x64.asm</Filename>
+    <Filename>Ia32/Mwait.asm</Filename>
+    <Filename>Ia32/ReadCr0.asm</Filename>
+    <Filename>Ia32/ReadCr2.asm</Filename>
+    <Filename>Ia32/ReadCr3.asm</Filename>
+    <Filename>Ia32/ReadCr4.asm</Filename>
+    <Filename>Ia32/ReadCs.asm</Filename>
+    <Filename>Ia32/ReadDr0.asm</Filename>
+    <Filename>Ia32/ReadDr1.asm</Filename>
+    <Filename>Ia32/ReadDr2.asm</Filename>
+    <Filename>Ia32/ReadDr3.asm</Filename>
+    <Filename>Ia32/ReadDr4.asm</Filename>
+    <Filename>Ia32/ReadDr5.asm</Filename>
+    <Filename>Ia32/ReadDr6.asm</Filename>
+    <Filename>Ia32/ReadDr7.asm</Filename>
+    <Filename>Ia32/ReadDs.asm</Filename>
+    <Filename>Ia32/ReadEflags.asm</Filename>
+    <Filename>Ia32/ReadEs.asm</Filename>
+    <Filename>Ia32/ReadFs.asm</Filename>
+    <Filename>Ia32/ReadGdtr.asm</Filename>
+    <Filename>Ia32/ReadGs.asm</Filename>
+    <Filename>Ia32/ReadIdtr.asm</Filename>
+    <Filename>Ia32/ReadLdtr.asm</Filename>
+    <Filename>Ia32/ReadMm0.asm</Filename>
+    <Filename>Ia32/ReadMm1.asm</Filename>
+    <Filename>Ia32/ReadMm2.asm</Filename>
+    <Filename>Ia32/ReadMm3.asm</Filename>
+    <Filename>Ia32/ReadMm4.asm</Filename>
+    <Filename>Ia32/ReadMm5.asm</Filename>
+    <Filename>Ia32/ReadMm6.asm</Filename>
+    <Filename>Ia32/ReadMm7.asm</Filename>
+    <Filename>Ia32/ReadMsr64.asm</Filename>
+    <Filename>Ia32/ReadPmc.asm</Filename>
+    <Filename>Ia32/ReadSs.asm</Filename>
+    <Filename>Ia32/ReadTr.asm</Filename>
+    <Filename>Ia32/ReadTsc.asm</Filename>
+    <Filename>Ia32/RRotU64.asm</Filename>
+    <Filename>Ia32/RShiftU64.asm</Filename>
+    <Filename>Ia32/SetJump.asm</Filename>
+    <Filename>Ia32/SwapBytes64.asm</Filename>
+    <Filename>Ia32/Thunk16.asm</Filename>
+    <Filename>Ia32/Wbinvd.asm</Filename>
+    <Filename>Ia32/WriteCr0.asm</Filename>
+    <Filename>Ia32/WriteCr2.asm</Filename>
+    <Filename>Ia32/WriteCr3.asm</Filename>
+    <Filename>Ia32/WriteCr4.asm</Filename>
+    <Filename>Ia32/WriteDr0.asm</Filename>
+    <Filename>Ia32/WriteDr1.asm</Filename>
+    <Filename>Ia32/WriteDr2.asm</Filename>
+    <Filename>Ia32/WriteDr3.asm</Filename>
+    <Filename>Ia32/WriteDr4.asm</Filename>
+    <Filename>Ia32/WriteDr5.asm</Filename>
+    <Filename>Ia32/WriteDr6.asm</Filename>
+    <Filename>Ia32/WriteDr7.asm</Filename>
+    <Filename>Ia32/WriteGdtr.asm</Filename>
+    <Filename>Ia32/WriteIdtr.asm</Filename>
+    <Filename>Ia32/WriteLdtr.asm</Filename>
+    <Filename>Ia32/WriteMm0.asm</Filename>
+    <Filename>Ia32/WriteMm1.asm</Filename>
+    <Filename>Ia32/WriteMm2.asm</Filename>
+    <Filename>Ia32/WriteMm3.asm</Filename>
+    <Filename>Ia32/WriteMm4.asm</Filename>
+    <Filename>Ia32/WriteMm5.asm</Filename>
+    <Filename>Ia32/WriteMm6.asm</Filename>
+    <Filename>Ia32/WriteMm7.asm</Filename>
+    <Filename>Ia32/WriteMsr64.asm</Filename>
+  </NonProcessedFiles>
+  <PackageDependencies>
+    <Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
+  </PackageDependencies>
+  <Externs>
+    <Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification>
+    <Specification>EDK_RELEASE_VERSION 0x00020000</Specification>
+  </Externs>
+  <PcdCoded>
+    <PcdEntry PcdItemType="FIXED_AT_BUILD">
+      <C_Name>PcdMaximumUnicodeStringLength</C_Name>
+      <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>
+      <HelpText>If PcdMaximumUnicodeStringLength is not zero, the maximum
+                number of characters (not counting the NULL-terminator) in a
+                Unicode string cannot exceed it.</HelpText>
+    </PcdEntry>
+    <PcdEntry PcdItemType="FIXED_AT_BUILD">
+      <C_Name>PcdMaximumAsciiStringLength</C_Name>
+      <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>
+      <HelpText>If PcdMaximumAsciiStringLength is not zero, the maximum number
+                of characters (not counting the NULL-terminator) in an ASCII
+                string cannot exceed it.</HelpText>
+    </PcdEntry>
+    <PcdEntry PcdItemType="FIXED_AT_BUILD">
+      <C_Name>PcdMaximumLinkedListLength</C_Name>
+      <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>
+      <HelpText>If PcdMaximumLinkedListLength is not zero, the maximum number
+                of nodes (not counting the list header) in a linked list
+                cannot exceed it.</HelpText>
+    </PcdEntry>
+    <PcdEntry PcdItemType="FIXED_AT_BUILD">
+      <C_Name>PcdSpinLockTimeout</C_Name>
+      <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>
+      <HelpText>If PcdSpinLockTimeout is not zero, it stands for the timeout
+                value (unit: millisecond) for spin lock.</HelpText>
+    </PcdEntry>
+  </PcdCoded>
+</ModuleSurfaceArea>
index d0b9ef6f20de6416476b62d2979b45d3b75d02d4..8c55cdc6a92ef676df5ab2998f1dbd7453a5a9b1 100644 (file)
-/** @file\r
-  Declaration of internal functions in BaseLib.\r
-\r
-  Copyright (c) 2006, Intel Corporation<BR>\r
-  All rights reserved. This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-  Module Name:  BaseLibInternals.h\r
-\r
-**/\r
-\r
-#ifndef __BASE_LIB_INTERNALS__\r
-#define __BASE_LIB_INTERNALS__\r
-\r
-//\r
-// Math functions\r
-//\r
-\r
-/**\r
-  Shifts a 64-bit integer left between 0 and 63 bits. The low bits\r
-  are filled with zeros. The shifted value is returned.\r
-\r
-  This function shifts the 64-bit value Operand to the left by Count bits. The\r
-  low Count bits are set to zero. The shifted value is returned.\r
-\r
-  @param  Operand The 64-bit operand to shift left.\r
-  @param  Count   The number of bits to shift left.\r
-\r
-  @return Operand << Count\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalMathLShiftU64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     Count\r
-  );\r
-\r
-/**\r
-  Shifts a 64-bit integer right between 0 and 63 bits. This high bits\r
-  are filled with zeros. The shifted value is returned.\r
-\r
-  This function shifts the 64-bit value Operand to the right by Count bits. The\r
-  high Count bits are set to zero. The shifted value is returned.\r
-\r
-  @param  Operand The 64-bit operand to shift right.\r
-  @param  Count   The number of bits to shift right.\r
-\r
-  @return Operand >> Count\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalMathRShiftU64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     Count\r
-  );\r
-\r
-/**\r
-  Shifts a 64-bit integer right between 0 and 63 bits. The high bits\r
-  are filled with original integer's bit 63. The shifted value is returned.\r
-\r
-  This function shifts the 64-bit value Operand to the right by Count bits. The\r
-  high Count bits are set to bit 63 of Operand.  The shifted value is returned.\r
-\r
-  @param  Operand The 64-bit operand to shift right.\r
-  @param  Count   The number of bits to shift right.\r
-\r
-  @return Operand arithmetically shifted right by Count\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalMathARShiftU64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     Count\r
-  );\r
-\r
-/**\r
-  Rotates a 64-bit integer left between 0 and 63 bits, filling\r
-  the low bits with the high bits that were rotated.\r
-\r
-  This function rotates the 64-bit value Operand to the left by Count bits. The\r
-  low Count bits are fill with the high Count bits of Operand. The rotated\r
-  value is returned.\r
-\r
-  @param  Operand The 64-bit operand to rotate left.\r
-  @param  Count   The number of bits to rotate left.\r
-\r
-  @return Operand <<< Count\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalMathLRotU64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     Count\r
-  );\r
-\r
-/**\r
-  Rotates a 64-bit integer right between 0 and 63 bits, filling\r
-  the high bits with the high low bits that were rotated.\r
-\r
-  This function rotates the 64-bit value Operand to the right by Count bits.\r
-  The high Count bits are fill with the low Count bits of Operand. The rotated\r
-  value is returned.\r
-\r
-  @param  Operand The 64-bit operand to rotate right.\r
-  @param  Count   The number of bits to rotate right.\r
-\r
-  @return Operand >>> Count\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalMathRRotU64 (\r
-  IN      UINT64                    Operand,\r
-  IN      UINTN                     Count\r
-  );\r
-\r
-/**\r
-  Switches the endianess of a 64-bit integer.\r
-\r
-  This function swaps the bytes in a 64-bit unsigned value to switch the value\r
-  from little endian to big endian or vice versa. The byte swapped value is\r
-  returned.\r
-\r
-  @param  Operand A 64-bit unsigned value.\r
-\r
-  @return The byte swaped Operand.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalMathSwapBytes64 (\r
-  IN      UINT64                    Operand\r
-  );\r
-\r
-/**\r
-  Multiples a 64-bit unsigned integer by a 32-bit unsigned integer\r
-  and generates a 64-bit unsigned result.\r
-\r
-  This function multiples the 64-bit unsigned value Multiplicand by the 32-bit\r
-  unsigned value Multiplier and generates a 64-bit unsigned result. This 64-\r
-  bit unsigned result is returned.\r
-\r
-  @param  Multiplicand  A 64-bit unsigned value.\r
-  @param  Multiplier    A 32-bit unsigned value.\r
-\r
-  @return Multiplicand * Multiplier\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalMathMultU64x32 (\r
-  IN      UINT64                    Multiplicand,\r
-  IN      UINT32                    Multiplier\r
-  );\r
-\r
-/**\r
-  Multiples a 64-bit unsigned integer by a 64-bit unsigned integer\r
-  and generates a 64-bit unsigned result.\r
-\r
-  This function multiples the 64-bit unsigned value Multiplicand by the 64-bit\r
-  unsigned value Multiplier and generates a 64-bit unsigned result. This 64-\r
-  bit unsigned result is returned.\r
-\r
-  @param  Multiplicand  A 64-bit unsigned value.\r
-  @param  Multiplier    A 64-bit unsigned value.\r
-\r
-  @return Multiplicand * Multiplier\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalMathMultU64x64 (\r
-  IN      UINT64                    Multiplicand,\r
-  IN      UINT64                    Multiplier\r
-  );\r
-\r
-/**\r
-  Divides a 64-bit unsigned integer by a 32-bit unsigned integer and\r
-  generates a 64-bit unsigned result.\r
-\r
-  This function divides the 64-bit unsigned value Dividend by the 32-bit\r
-  unsigned value Divisor and generates a 64-bit unsigned quotient. This\r
-  function returns the 64-bit unsigned quotient.\r
-\r
-   @param  Dividend  A 64-bit unsigned value.\r
-  @param  Divisor   A 32-bit unsigned value.\r
-\r
-  @return Dividend / Divisor\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalMathDivU64x32 (\r
-  IN      UINT64                    Dividend,\r
-  IN      UINT32                    Divisor\r
-  );\r
-\r
-/**\r
-  Divides a 64-bit unsigned integer by a 32-bit unsigned integer and\r
-  generates a 32-bit unsigned remainder.\r
-\r
-  This function divides the 64-bit unsigned value Dividend by the 32-bit\r
-  unsigned value Divisor and generates a 32-bit remainder. This function\r
-  returns the 32-bit unsigned remainder.\r
-\r
-  @param  Dividend  A 64-bit unsigned value.\r
-  @param  Divisor   A 32-bit unsigned value.\r
-\r
-  @return Dividend % Divisor\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-InternalMathModU64x32 (\r
-  IN      UINT64                    Dividend,\r
-  IN      UINT32                    Divisor\r
-  );\r
-\r
-/**\r
-  Divides a 64-bit unsigned integer by a 32-bit unsigned integer and\r
-  generates a 64-bit unsigned result and an optional 32-bit unsigned remainder.\r
-\r
-  This function divides the 64-bit unsigned value Dividend by the 32-bit\r
-  unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder\r
-  is not NULL, then the 32-bit unsigned remainder is returned in Remainder.\r
-  This function returns the 64-bit unsigned quotient.\r
-\r
-  @param  Dividend  A 64-bit unsigned value.\r
-  @param  Divisor   A 32-bit unsigned value.\r
-  @param  Remainder A pointer to a 32-bit unsigned value. This parameter is\r
-                    optional and may be NULL.\r
-\r
-  @return Dividend / Divisor\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalMathDivRemU64x32 (\r
-  IN      UINT64                    Dividend,\r
-  IN      UINT32                    Divisor,\r
-  OUT     UINT32                    *Remainder\r
-  );\r
-\r
-/**\r
-  Divides a 64-bit unsigned integer by a 64-bit unsigned integer and\r
-  generates a 64-bit unsigned result and an optional 64-bit unsigned remainder.\r
-\r
-  This function divides the 64-bit unsigned value Dividend by the 64-bit\r
-  unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder\r
-  is not NULL, then the 64-bit unsigned remainder is returned in Remainder.\r
-  This function returns the 64-bit unsigned quotient.\r
-\r
-  @param  Dividend  A 64-bit unsigned value.\r
-  @param  Divisor   A 64-bit unsigned value.\r
-  @param  Remainder A pointer to a 64-bit unsigned value. This parameter is\r
-                    optional and may be NULL.\r
-\r
-  @return Dividend / Divisor\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalMathDivRemU64x64 (\r
-  IN      UINT64                    Dividend,\r
-  IN      UINT64                    Divisor,\r
-  OUT     UINT64                    *Remainder\r
-  );\r
-\r
-/**\r
-  Divides a 64-bit signed integer by a 64-bit signed integer and\r
-  generates a  64-bit signed result and a optional 64-bit signed remainder.\r
-\r
-  This function divides the 64-bit unsigned value Dividend by the 64-bit\r
-  unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder\r
-  is not NULL, then the 64-bit unsigned remainder is returned in Remainder.\r
-  This function returns the 64-bit unsigned quotient.\r
-\r
-  @param  Dividend  A 64-bit signed value.\r
-  @param  Divisor   A 64-bit signed value.\r
-  @param  Remainder A pointer to a 64-bit signed value. This parameter is\r
-                    optional and may be NULL.\r
-\r
-  @return Dividend / Divisor\r
-\r
-**/\r
-INT64\r
-InternalMathDivRemS64x64 (\r
-  IN      INT64                     Dividend,\r
-  IN      INT64                     Divisor,\r
-  OUT     INT64                     *Remainder  OPTIONAL\r
- );\r
-\r
-/**\r
-  Transfers control to a function starting with a new stack.\r
-\r
-  Transfers control to the function specified by EntryPoint using the new stack\r
-  specified by NewStack and passing in the parameters specified by Context1 and\r
-  Context2. Context1 and Context2 are optional and may be NULL. The function\r
-  EntryPoint must never return.\r
-\r
-  @param  EntryPoint  A pointer to function to call with the new stack.\r
-  @param  Context1    A pointer to the context to pass into the EntryPoint\r
-                      function.\r
-  @param  Context2    A pointer to the context to pass into the EntryPoint\r
-                      function.\r
-  @param  NewStack    A pointer to the new stack to use for the EntryPoint\r
-                      function.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalSwitchStack (\r
-  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
-  IN      VOID                      *Context1,\r
-  IN      VOID                      *Context2,\r
-  IN      VOID                      *NewStack\r
-  );\r
-\r
-//\r
-// Ia32 and x64 specific functions\r
-//\r
-\r
-/**\r
-  Reads the current Global Descriptor Table Register(GDTR) descriptor.\r
-\r
-  Reads and returns the current GDTR descriptor and returns it in Gdtr. This\r
-  function is only available on IA-32 and X64.\r
-\r
-  @param  Gdtr  Pointer to a GDTR descriptor.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalX86ReadGdtr (\r
-  OUT     IA32_DESCRIPTOR           *Gdtr\r
-  );\r
-\r
-/**\r
-  Writes the current Global Descriptor Table Register (GDTR) descriptor.\r
-\r
-  Writes and the current GDTR descriptor specified by Gdtr. This function is\r
-  only available on IA-32 and X64.\r
-\r
-  @param  Gdtr  Pointer to a GDTR descriptor.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalX86WriteGdtr (\r
-  IN      CONST IA32_DESCRIPTOR     *Gdtr\r
-  );\r
-\r
-/**\r
-  Reads the current Interrupt Descriptor Table Register(GDTR) descriptor.\r
-\r
-  Reads and returns the current IDTR descriptor and returns it in Idtr. This\r
-  function is only available on IA-32 and X64.\r
-\r
-  @param  Idtr  Pointer to a IDTR descriptor.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalX86ReadIdtr (\r
-  OUT     IA32_DESCRIPTOR           *Idtr\r
-  );\r
-\r
-/**\r
-  Writes the current Interrupt Descriptor Table Register(GDTR) descriptor.\r
-\r
-  Writes the current IDTR descriptor and returns it in Idtr. This function is\r
-  only available on IA-32 and X64.\r
-\r
-  @param  Idtr  Pointer to a IDTR descriptor.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalX86WriteIdtr (\r
-  IN      CONST IA32_DESCRIPTOR     *Idtr\r
-  );\r
-\r
-/**\r
-  Save the current floating point/SSE/SSE2 context to a buffer.\r
-\r
-  Saves the current floating point/SSE/SSE2 state to the buffer specified by\r
-  Buffer. Buffer must be aligned on a 16-byte boundary. This function is only\r
-  available on IA-32 and X64.\r
-\r
-  @param  Buffer  Pointer to a buffer to save the floating point/SSE/SSE2 context.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalX86FxSave (\r
-  OUT     IA32_FX_BUFFER            *Buffer\r
-  );\r
-\r
-/**\r
-  Restores the current floating point/SSE/SSE2 context from a buffer.\r
-\r
-  Restores the current floating point/SSE/SSE2 state from the buffer specified\r
-  by Buffer. Buffer must be aligned on a 16-byte boundary. This function is\r
-  only available on IA-32 and X64.\r
-\r
-  @param  Buffer  Pointer to a buffer to save the floating point/SSE/SSE2 context.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalX86FxRestore (\r
-  IN      CONST IA32_FX_BUFFER      *Buffer\r
-  );\r
-\r
-/**\r
-  Enables the 32-bit paging mode on the CPU.\r
-\r
-  Enables the 32-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables\r
-  must be properly initialized prior to calling this service. This function\r
-  assumes the current execution mode is 32-bit protected mode. This function is\r
-  only available on IA-32. After the 32-bit paging mode is enabled, control is\r
-  transferred to the function specified by EntryPoint using the new stack\r
-  specified by NewStack and passing in the parameters specified by Context1 and\r
-  Context2. Context1 and Context2 are optional and may be NULL. The function\r
-  EntryPoint must never return.\r
-\r
-  There are a number of constraints that must be followed before calling this\r
-  function:\r
-  1)  Interrupts must be disabled.\r
-  2)  The caller must be in 32-bit protected mode with flat descriptors. This\r
-      means all descriptors must have a base of 0 and a limit of 4GB.\r
-  3)  CR0 and CR4 must be compatible with 32-bit protected mode with flat\r
-      descriptors.\r
-  4)  CR3 must point to valid page tables that will be used once the transition\r
-      is complete, and those page tables must guarantee that the pages for this\r
-      function and the stack are identity mapped.\r
-\r
-  @param  EntryPoint  A pointer to function to call with the new stack after\r
-                      paging is enabled.\r
-  @param  Context1    A pointer to the context to pass into the EntryPoint\r
-                      function as the first parameter after paging is enabled.\r
-  @param  Context2    A pointer to the context to pass into the EntryPoint\r
-                      function as the second parameter after paging is enabled.\r
-  @param  NewStack    A pointer to the new stack to use for the EntryPoint\r
-                      function after paging is enabled.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalX86EnablePaging32 (\r
-  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
-  IN      VOID                      *Context1,  OPTIONAL\r
-  IN      VOID                      *Context2,  OPTIONAL\r
-  IN      VOID                      *NewStack\r
-  );\r
-\r
-/**\r
-  Disables the 32-bit paging mode on the CPU.\r
-\r
-  Disables the 32-bit paging mode on the CPU and returns to 32-bit protected\r
-  mode. This function assumes the current execution mode is 32-paged protected\r
-  mode. This function is only available on IA-32. After the 32-bit paging mode\r
-  is disabled, control is transferred to the function specified by EntryPoint\r
-  using the new stack specified by NewStack and passing in the parameters\r
-  specified by Context1 and Context2. Context1 and Context2 are optional and\r
-  may be NULL. The function EntryPoint must never return.\r
-\r
-  There are a number of constraints that must be followed before calling this\r
-  function:\r
-  1)  Interrupts must be disabled.\r
-  2)  The caller must be in 32-bit paged mode.\r
-  3)  CR0, CR3, and CR4 must be compatible with 32-bit paged mode.\r
-  4)  CR3 must point to valid page tables that guarantee that the pages for\r
-      this function and the stack are identity mapped.\r
-\r
-  @param  EntryPoint  A pointer to function to call with the new stack after\r
-                      paging is disabled.\r
-  @param  Context1    A pointer to the context to pass into the EntryPoint\r
-                      function as the first parameter after paging is disabled.\r
-  @param  Context2    A pointer to the context to pass into the EntryPoint\r
-                      function as the second parameter after paging is\r
-                      disabled.\r
-  @param  NewStack    A pointer to the new stack to use for the EntryPoint\r
-                      function after paging is disabled.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalX86DisablePaging32 (\r
-  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
-  IN      VOID                      *Context1,  OPTIONAL\r
-  IN      VOID                      *Context2,  OPTIONAL\r
-  IN      VOID                      *NewStack\r
-  );\r
-\r
-/**\r
-  Enables the 64-bit paging mode on the CPU.\r
-\r
-  Enables the 64-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables\r
-  must be properly initialized prior to calling this service. This function\r
-  assumes the current execution mode is 32-bit protected mode with flat\r
-  descriptors. This function is only available on IA-32. After the 64-bit\r
-  paging mode is enabled, control is transferred to the function specified by\r
-  EntryPoint using the new stack specified by NewStack and passing in the\r
-  parameters specified by Context1 and Context2. Context1 and Context2 are\r
-  optional and may be 0. The function EntryPoint must never return.\r
-\r
-  @param  Cs          The 16-bit selector to load in the CS before EntryPoint\r
-                      is called. The descriptor in the GDT that this selector\r
-                      references must be setup for long mode.\r
-  @param  EntryPoint  The 64-bit virtual address of the function to call with\r
-                      the new stack after paging is enabled.\r
-  @param  Context1    The 64-bit virtual address of the context to pass into\r
-                      the EntryPoint function as the first parameter after\r
-                      paging is enabled.\r
-  @param  Context2    The 64-bit virtual address of the context to pass into\r
-                      the EntryPoint function as the second parameter after\r
-                      paging is enabled.\r
-  @param  NewStack    The 64-bit virtual address of the new stack to use for\r
-                      the EntryPoint function after paging is enabled.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalX86EnablePaging64 (\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
-  Disables the 64-bit paging mode on the CPU.\r
-\r
-  Disables the 64-bit paging mode on the CPU and returns to 32-bit protected\r
-  mode. This function assumes the current execution mode is 64-paging mode.\r
-  This function is only available on X64. After the 64-bit paging mode is\r
-  disabled, control is transferred to the function specified by EntryPoint\r
-  using the new stack specified by NewStack and passing in the parameters\r
-  specified by Context1 and Context2. Context1 and Context2 are optional and\r
-  may be 0. The function EntryPoint must never return.\r
-\r
-  @param  Cs          The 16-bit selector to load in the CS before EntryPoint\r
-                      is called. The descriptor in the GDT that this selector\r
-                      references must be setup for 32-bit protected mode.\r
-  @param  EntryPoint  The 64-bit virtual address of the function to call with\r
-                      the new stack after paging is disabled.\r
-  @param  Context1    The 64-bit virtual address of the context to pass into\r
-                      the EntryPoint function as the first parameter after\r
-                      paging is disabled.\r
-  @param  Context2    The 64-bit virtual address of the context to pass into\r
-                      the EntryPoint function as the second parameter after\r
-                      paging is disabled.\r
-  @param  NewStack    The 64-bit virtual address of the new stack to use for\r
-                      the EntryPoint function after paging is disabled.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalX86DisablePaging64 (\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
-  Worker function that locates the Node in the List\r
-\r
-  By searching the List, finds the location of the Node in List. At the same time,\r
-  verifies the validity of this list.\r
-\r
-  If List is NULL, then ASSERT().\r
-  If List->ForwardLink is NULL, then ASSERT().\r
-  If List->backLink is NULL, then ASSERT().\r
-  If Node is NULL, then ASSERT();\r
-  If PcdMaximumLinkedListLenth is not zero, and prior to insertion the number\r
-  of nodes in ListHead, including the ListHead node, is greater than or\r
-  equal to PcdMaximumLinkedListLength, then ASSERT().\r
-\r
-  @param  List  A pointer to a node in a linked list.\r
-  @param  Node  A pointer to one nod.\r
-\r
-  @retval TRUE   Node is in List\r
-  @retval FALSE  Node isn't in List, or List is invalid\r
-\r
-**/\r
-BOOLEAN\r
-IsNodeInList (\r
-  IN      CONST LIST_ENTRY      *List,\r
-  IN      CONST LIST_ENTRY      *Node\r
-  );\r
-\r
-/**\r
-  Performs an atomic increment of an 32-bit unsigned integer.\r
-\r
-  Performs an atomic increment of the 32-bit unsigned integer specified by\r
-  Value and returns the incremented value. The increment operation must be\r
-  performed using MP safe mechanisms. The state of the return value is not\r
-  guaranteed to be MP safe.\r
-\r
-  @param  Value A pointer to the 32-bit value to increment.\r
-\r
-  @return The incremented value.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-InternalSyncIncrement (\r
-  IN      volatile UINT32           *Value\r
-  );\r
-\r
-/**\r
-  Performs an atomic decrement of an 32-bit unsigned integer.\r
-\r
-  Performs an atomic decrement of the 32-bit unsigned integer specified by\r
-  Value and returns the decrement value. The decrement operation must be\r
-  performed using MP safe mechanisms. The state of the return value is not\r
-  guaranteed to be MP safe.\r
-\r
-  @param  Value A pointer to the 32-bit value to decrement.\r
-\r
-  @return The decrement value.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-InternalSyncDecrement (\r
-  IN      volatile UINT32           *Value\r
-  );\r
-\r
-/**\r
-  Performs an atomic compare exchange operation on a 32-bit unsigned integer.\r
-\r
-  Performs an atomic compare exchange operation on the 32-bit unsigned integer\r
-  specified by Value.  If Value is equal to CompareValue, then Value is set to \r
-  ExchangeValue and CompareValue is returned.  If Value is not equal to CompareValue,\r
-  then Value is returned.  The compare exchange operation must be performed using \r
-  MP safe mechanisms.\r
-\r
-  @param  Value         A pointer to the 32-bit value for the compare exchange\r
-                        operation.\r
-  @param  CompareValue  32-bit value used in compare operation.\r
-  @param  ExchangeValue 32-bit value used in exchange operation.\r
-\r
-  @return The original *Value before exchange.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-InternalSyncCompareExchange32 (\r
-  IN      volatile UINT32           *Value,\r
-  IN      UINT32                    CompareValue,\r
-  IN      UINT32                    ExchangeValue\r
-  );\r
-\r
-/**\r
-  Performs an atomic compare exchange operation on a 64-bit unsigned integer.\r
-\r
-  Performs an atomic compare exchange operation on the 64-bit unsigned integer specified \r
-  by Value.  If Value is equal to CompareValue, then Value is set to ExchangeValue and \r
-  CompareValue is returned.  If Value is not equal to CompareValue, then Value is returned. \r
-  The compare exchange operation must be performed using MP safe mechanisms.\r
-\r
-  @param  Value         A pointer to the 64-bit value for the compare exchange\r
-                        operation.\r
-  @param  CompareValue  64-bit value used in compare operation.\r
-  @param  ExchangeValue 64-bit value used in exchange operation.\r
-\r
-  @return The original *Value before exchange.\r
-\r
-**/\r
-UINT64\r
-EFIAPI\r
-InternalSyncCompareExchange64 (\r
-  IN      volatile UINT64           *Value,\r
-  IN      UINT64                    CompareValue,\r
-  IN      UINT64                    ExchangeValue\r
-  );\r
-\r
-/**\r
-  Worker function that returns a bit field from Operand\r
-\r
-  Returns the bitfield specified by the StartBit and the EndBit from Operand.\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-\r
-  @return The bit field read.\r
-\r
-**/\r
-unsigned int\r
-BitFieldReadUint (\r
-  IN      unsigned int              Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit\r
-  );\r
-\r
-/**\r
-  Worker function that reads a bit field from Operand, performs a bitwise OR, \r
-  and returns the result.\r
-\r
-  Performs a bitwise OR between the bit field specified by StartBit and EndBit\r
-  in Operand and the value specified by AndData. All other bits in Operand are\r
-  preserved. The new value is returned.\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-  @param  OrData    The value to OR with the read value from the value\r
-\r
-  @return The new value.\r
-\r
-**/\r
-unsigned int\r
-BitFieldOrUint (\r
-  IN      unsigned int              Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      unsigned int              OrData\r
-  );\r
-\r
-/**\r
-  Worker function that reads a bit field from Operand, performs a bitwise AND, \r
-  and returns the result.\r
-\r
-  Performs a bitwise AND between the bit field specified by StartBit and EndBit\r
-  in Operand and the value specified by AndData. All other bits in Operand are\r
-  preserved. The new value is returned.\r
-\r
-  @param  Operand   Operand on which to perform the bitfield operation.\r
-  @param  StartBit  The ordinal of the least significant bit in the bit field.\r
-  @param  EndBit    The ordinal of the most significant bit in the bit field.\r
-  @param  AndData    The value to And with the read value from the value\r
-\r
-  @return The new value.\r
-\r
-**/\r
-unsigned int\r
-BitFieldAndUint (\r
-  IN      unsigned int              Operand,\r
-  IN      UINTN                     StartBit,\r
-  IN      UINTN                     EndBit,\r
-  IN      unsigned int              AndData\r
-  );\r
-\r
-/**\r
-  Worker function that checks ASSERT condition for JumpBuffer\r
-\r
-  Checks ASSERT condition for JumpBuffer.\r
-\r
-  If JumpBuffer is NULL, then ASSERT().\r
-  For IPF CPUs, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().\r
-\r
-  @param  JumpBuffer    A pointer to CPU context buffer.\r
-\r
-**/\r
-VOID\r
-InternalAssertJumpBuffer (\r
-  IN      BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer\r
-  );\r
-\r
-/**\r
-  Restores the CPU context that was saved with SetJump().\r
-\r
-  Restores the CPU context from the buffer specified by JumpBuffer.\r
-  This function never returns to the caller.\r
-  Instead is resumes execution based on the state of JumpBuffer.\r
-\r
-  @param  JumpBuffer    A pointer to CPU context buffer.\r
-  @param  Value         The value to return when the SetJump() context is restored.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-InternalLongJump (\r
-  IN      BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer,\r
-  IN      UINTN                     Value\r
-  );\r
-\r
-#endif\r
+/** @file
+  Declaration of internal functions in BaseLib.
+
+  Copyright (c) 2006 - 2007, Intel Corporation<BR>
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Module Name:  BaseLibInternals.h
+
+**/
+
+#ifndef __BASE_LIB_INTERNALS__
+#define __BASE_LIB_INTERNALS__
+
+#define QUIENT_MAX_UINTN_DIVIDED_BY_10      ((UINTN) -1 / 10)
+#define REMINDER_MAX_UINTN_DIVIDED_BY_10    ((UINTN) -1 % 10)
+
+#define QUIENT_MAX_UINTN_DIVIDED_BY_16      ((UINTN) -1 / 16)
+#define REMINDER_MAX_UINTN_DIVIDED_BY_16    ((UINTN) -1 % 16)
+
+#define QUIENT_MAX_UINT64_DIVIDED_BY_10      ((UINT64) -1 / 10)
+#define REMINDER_MAX_UINT64_DIVIDED_BY_10    ((UINT64) -1 % 10)
+
+#define QUIENT_MAX_UINT64_DIVIDED_BY_16      ((UINT64) -1 / 16)
+#define REMINDER_MAX_UINT64_DIVIDED_BY_16    ((UINT64) -1 % 16)
+
+//
+// Math functions
+//
+
+/**
+  Shifts a 64-bit integer left between 0 and 63 bits. The low bits
+  are filled with zeros. The shifted value is returned.
+
+  This function shifts the 64-bit value Operand to the left by Count bits. The
+  low Count bits are set to zero. The shifted value is returned.
+
+  @param  Operand The 64-bit operand to shift left.
+  @param  Count   The number of bits to shift left.
+
+  @return Operand << Count
+
+**/
+UINT64
+EFIAPI
+InternalMathLShiftU64 (
+  IN      UINT64                    Operand,
+  IN      UINTN                     Count
+  );
+
+/**
+  Shifts a 64-bit integer right between 0 and 63 bits. This high bits
+  are filled with zeros. The shifted value is returned.
+
+  This function shifts the 64-bit value Operand to the right by Count bits. The
+  high Count bits are set to zero. The shifted value is returned.
+
+  @param  Operand The 64-bit operand to shift right.
+  @param  Count   The number of bits to shift right.
+
+  @return Operand >> Count
+
+**/
+UINT64
+EFIAPI
+InternalMathRShiftU64 (
+  IN      UINT64                    Operand,
+  IN      UINTN                     Count
+  );
+
+/**
+  Shifts a 64-bit integer right between 0 and 63 bits. The high bits
+  are filled with original integer's bit 63. The shifted value is returned.
+
+  This function shifts the 64-bit value Operand to the right by Count bits. The
+  high Count bits are set to bit 63 of Operand.  The shifted value is returned.
+
+  @param  Operand The 64-bit operand to shift right.
+  @param  Count   The number of bits to shift right.
+
+  @return Operand arithmetically shifted right by Count
+
+**/
+UINT64
+EFIAPI
+InternalMathARShiftU64 (
+  IN      UINT64                    Operand,
+  IN      UINTN                     Count
+  );
+
+/**
+  Rotates a 64-bit integer left between 0 and 63 bits, filling
+  the low bits with the high bits that were rotated.
+
+  This function rotates the 64-bit value Operand to the left by Count bits. The
+  low Count bits are fill with the high Count bits of Operand. The rotated
+  value is returned.
+
+  @param  Operand The 64-bit operand to rotate left.
+  @param  Count   The number of bits to rotate left.
+
+  @return Operand <<< Count
+
+**/
+UINT64
+EFIAPI
+InternalMathLRotU64 (
+  IN      UINT64                    Operand,
+  IN      UINTN                     Count
+  );
+
+/**
+  Rotates a 64-bit integer right between 0 and 63 bits, filling
+  the high bits with the high low bits that were rotated.
+
+  This function rotates the 64-bit value Operand to the right by Count bits.
+  The high Count bits are fill with the low Count bits of Operand. The rotated
+  value is returned.
+
+  @param  Operand The 64-bit operand to rotate right.
+  @param  Count   The number of bits to rotate right.
+
+  @return Operand >>> Count
+
+**/
+UINT64
+EFIAPI
+InternalMathRRotU64 (
+  IN      UINT64                    Operand,
+  IN      UINTN                     Count
+  );
+
+/**
+  Switches the endianess of a 64-bit integer.
+
+  This function swaps the bytes in a 64-bit unsigned value to switch the value
+  from little endian to big endian or vice versa. The byte swapped value is
+  returned.
+
+  @param  Operand A 64-bit unsigned value.
+
+  @return The byte swaped Operand.
+
+**/
+UINT64
+EFIAPI
+InternalMathSwapBytes64 (
+  IN      UINT64                    Operand
+  );
+
+/**
+  Multiples a 64-bit unsigned integer by a 32-bit unsigned integer
+  and generates a 64-bit unsigned result.
+
+  This function multiples the 64-bit unsigned value Multiplicand by the 32-bit
+  unsigned value Multiplier and generates a 64-bit unsigned result. This 64-
+  bit unsigned result is returned.
+
+  @param  Multiplicand  A 64-bit unsigned value.
+  @param  Multiplier    A 32-bit unsigned value.
+
+  @return Multiplicand * Multiplier
+
+**/
+UINT64
+EFIAPI
+InternalMathMultU64x32 (
+  IN      UINT64                    Multiplicand,
+  IN      UINT32                    Multiplier
+  );
+
+/**
+  Multiples a 64-bit unsigned integer by a 64-bit unsigned integer
+  and generates a 64-bit unsigned result.
+
+  This function multiples the 64-bit unsigned value Multiplicand by the 64-bit
+  unsigned value Multiplier and generates a 64-bit unsigned result. This 64-
+  bit unsigned result is returned.
+
+  @param  Multiplicand  A 64-bit unsigned value.
+  @param  Multiplier    A 64-bit unsigned value.
+
+  @return Multiplicand * Multiplier
+
+**/
+UINT64
+EFIAPI
+InternalMathMultU64x64 (
+  IN      UINT64                    Multiplicand,
+  IN      UINT64                    Multiplier
+  );
+
+/**
+  Divides a 64-bit unsigned integer by a 32-bit unsigned integer and
+  generates a 64-bit unsigned result.
+
+  This function divides the 64-bit unsigned value Dividend by the 32-bit
+  unsigned value Divisor and generates a 64-bit unsigned quotient. This
+  function returns the 64-bit unsigned quotient.
+
+   @param  Dividend  A 64-bit unsigned value.
+  @param  Divisor   A 32-bit unsigned value.
+
+  @return Dividend / Divisor
+
+**/
+UINT64
+EFIAPI
+InternalMathDivU64x32 (
+  IN      UINT64                    Dividend,
+  IN      UINT32                    Divisor
+  );
+
+/**
+  Divides a 64-bit unsigned integer by a 32-bit unsigned integer and
+  generates a 32-bit unsigned remainder.
+
+  This function divides the 64-bit unsigned value Dividend by the 32-bit
+  unsigned value Divisor and generates a 32-bit remainder. This function
+  returns the 32-bit unsigned remainder.
+
+  @param  Dividend  A 64-bit unsigned value.
+  @param  Divisor   A 32-bit unsigned value.
+
+  @return Dividend % Divisor
+
+**/
+UINT32
+EFIAPI
+InternalMathModU64x32 (
+  IN      UINT64                    Dividend,
+  IN      UINT32                    Divisor
+  );
+
+/**
+  Divides a 64-bit unsigned integer by a 32-bit unsigned integer and
+  generates a 64-bit unsigned result and an optional 32-bit unsigned remainder.
+
+  This function divides the 64-bit unsigned value Dividend by the 32-bit
+  unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder
+  is not NULL, then the 32-bit unsigned remainder is returned in Remainder.
+  This function returns the 64-bit unsigned quotient.
+
+  @param  Dividend  A 64-bit unsigned value.
+  @param  Divisor   A 32-bit unsigned value.
+  @param  Remainder A pointer to a 32-bit unsigned value. This parameter is
+                    optional and may be NULL.
+
+  @return Dividend / Divisor
+
+**/
+UINT64
+EFIAPI
+InternalMathDivRemU64x32 (
+  IN      UINT64                    Dividend,
+  IN      UINT32                    Divisor,
+  OUT     UINT32                    *Remainder
+  );
+
+/**
+  Divides a 64-bit unsigned integer by a 64-bit unsigned integer and
+  generates a 64-bit unsigned result and an optional 64-bit unsigned remainder.
+
+  This function divides the 64-bit unsigned value Dividend by the 64-bit
+  unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder
+  is not NULL, then the 64-bit unsigned remainder is returned in Remainder.
+  This function returns the 64-bit unsigned quotient.
+
+  @param  Dividend  A 64-bit unsigned value.
+  @param  Divisor   A 64-bit unsigned value.
+  @param  Remainder A pointer to a 64-bit unsigned value. This parameter is
+                    optional and may be NULL.
+
+  @return Dividend / Divisor
+
+**/
+UINT64
+EFIAPI
+InternalMathDivRemU64x64 (
+  IN      UINT64                    Dividend,
+  IN      UINT64                    Divisor,
+  OUT     UINT64                    *Remainder
+  );
+
+/**
+  Divides a 64-bit signed integer by a 64-bit signed integer and
+  generates a  64-bit signed result and a optional 64-bit signed remainder.
+
+  This function divides the 64-bit unsigned value Dividend by the 64-bit
+  unsigned value Divisor and generates a 64-bit unsigned quotient. If Remainder
+  is not NULL, then the 64-bit unsigned remainder is returned in Remainder.
+  This function returns the 64-bit unsigned quotient.
+
+  @param  Dividend  A 64-bit signed value.
+  @param  Divisor   A 64-bit signed value.
+  @param  Remainder A pointer to a 64-bit signed value. This parameter is
+                    optional and may be NULL.
+
+  @return Dividend / Divisor
+
+**/
+INT64
+InternalMathDivRemS64x64 (
+  IN      INT64                     Dividend,
+  IN      INT64                     Divisor,
+  OUT     INT64                     *Remainder  OPTIONAL
+ );
+
+/**
+  Transfers control to a function starting with a new stack.
+
+  Transfers control to the function specified by EntryPoint using the new stack
+  specified by NewStack and passing in the parameters specified by Context1 and
+  Context2. Context1 and Context2 are optional and may be NULL. The function
+  EntryPoint must never return.
+
+  @param  EntryPoint  A pointer to function to call with the new stack.
+  @param  Context1    A pointer to the context to pass into the EntryPoint
+                      function.
+  @param  Context2    A pointer to the context to pass into the EntryPoint
+                      function.
+  @param  NewStack    A pointer to the new stack to use for the EntryPoint
+                      function.
+
+**/
+VOID
+EFIAPI
+InternalSwitchStack (
+  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
+  IN      VOID                      *Context1,
+  IN      VOID                      *Context2,
+  IN      VOID                      *NewStack
+  );
+
+//
+// Ia32 and x64 specific functions
+//
+
+/**
+  Reads the current Global Descriptor Table Register(GDTR) descriptor.
+
+  Reads and returns the current GDTR descriptor and returns it in Gdtr. This
+  function is only available on IA-32 and X64.
+
+  @param  Gdtr  Pointer to a GDTR descriptor.
+
+**/
+VOID
+EFIAPI
+InternalX86ReadGdtr (
+  OUT     IA32_DESCRIPTOR           *Gdtr
+  );
+
+/**
+  Writes the current Global Descriptor Table Register (GDTR) descriptor.
+
+  Writes and the current GDTR descriptor specified by Gdtr. This function is
+  only available on IA-32 and X64.
+
+  @param  Gdtr  Pointer to a GDTR descriptor.
+
+**/
+VOID
+EFIAPI
+InternalX86WriteGdtr (
+  IN      CONST IA32_DESCRIPTOR     *Gdtr
+  );
+
+/**
+  Reads the current Interrupt Descriptor Table Register(GDTR) descriptor.
+
+  Reads and returns the current IDTR descriptor and returns it in Idtr. This
+  function is only available on IA-32 and X64.
+
+  @param  Idtr  Pointer to a IDTR descriptor.
+
+**/
+VOID
+EFIAPI
+InternalX86ReadIdtr (
+  OUT     IA32_DESCRIPTOR           *Idtr
+  );
+
+/**
+  Writes the current Interrupt Descriptor Table Register(GDTR) descriptor.
+
+  Writes the current IDTR descriptor and returns it in Idtr. This function is
+  only available on IA-32 and X64.
+
+  @param  Idtr  Pointer to a IDTR descriptor.
+
+**/
+VOID
+EFIAPI
+InternalX86WriteIdtr (
+  IN      CONST IA32_DESCRIPTOR     *Idtr
+  );
+
+/**
+  Save the current floating point/SSE/SSE2 context to a buffer.
+
+  Saves the current floating point/SSE/SSE2 state to the buffer specified by
+  Buffer. Buffer must be aligned on a 16-byte boundary. This function is only
+  available on IA-32 and X64.
+
+  @param  Buffer  Pointer to a buffer to save the floating point/SSE/SSE2 context.
+
+**/
+VOID
+EFIAPI
+InternalX86FxSave (
+  OUT     IA32_FX_BUFFER            *Buffer
+  );
+
+/**
+  Restores the current floating point/SSE/SSE2 context from a buffer.
+
+  Restores the current floating point/SSE/SSE2 state from the buffer specified
+  by Buffer. Buffer must be aligned on a 16-byte boundary. This function is
+  only available on IA-32 and X64.
+
+  @param  Buffer  Pointer to a buffer to save the floating point/SSE/SSE2 context.
+
+**/
+VOID
+EFIAPI
+InternalX86FxRestore (
+  IN      CONST IA32_FX_BUFFER      *Buffer
+  );
+
+/**
+  Enables the 32-bit paging mode on the CPU.
+
+  Enables the 32-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables
+  must be properly initialized prior to calling this service. This function
+  assumes the current execution mode is 32-bit protected mode. This function is
+  only available on IA-32. After the 32-bit paging mode is enabled, control is
+  transferred to the function specified by EntryPoint using the new stack
+  specified by NewStack and passing in the parameters specified by Context1 and
+  Context2. Context1 and Context2 are optional and may be NULL. The function
+  EntryPoint must never return.
+
+  There are a number of constraints that must be followed before calling this
+  function:
+  1)  Interrupts must be disabled.
+  2)  The caller must be in 32-bit protected mode with flat descriptors. This
+      means all descriptors must have a base of 0 and a limit of 4GB.
+  3)  CR0 and CR4 must be compatible with 32-bit protected mode with flat
+      descriptors.
+  4)  CR3 must point to valid page tables that will be used once the transition
+      is complete, and those page tables must guarantee that the pages for this
+      function and the stack are identity mapped.
+
+  @param  EntryPoint  A pointer to function to call with the new stack after
+                      paging is enabled.
+  @param  Context1    A pointer to the context to pass into the EntryPoint
+                      function as the first parameter after paging is enabled.
+  @param  Context2    A pointer to the context to pass into the EntryPoint
+                      function as the second parameter after paging is enabled.
+  @param  NewStack    A pointer to the new stack to use for the EntryPoint
+                      function after paging is enabled.
+
+**/
+VOID
+EFIAPI
+InternalX86EnablePaging32 (
+  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
+  IN      VOID                      *Context1,  OPTIONAL
+  IN      VOID                      *Context2,  OPTIONAL
+  IN      VOID                      *NewStack
+  );
+
+/**
+  Disables the 32-bit paging mode on the CPU.
+
+  Disables the 32-bit paging mode on the CPU and returns to 32-bit protected
+  mode. This function assumes the current execution mode is 32-paged protected
+  mode. This function is only available on IA-32. After the 32-bit paging mode
+  is disabled, control is transferred to the function specified by EntryPoint
+  using the new stack specified by NewStack and passing in the parameters
+  specified by Context1 and Context2. Context1 and Context2 are optional and
+  may be NULL. The function EntryPoint must never return.
+
+  There are a number of constraints that must be followed before calling this
+  function:
+  1)  Interrupts must be disabled.
+  2)  The caller must be in 32-bit paged mode.
+  3)  CR0, CR3, and CR4 must be compatible with 32-bit paged mode.
+  4)  CR3 must point to valid page tables that guarantee that the pages for
+      this function and the stack are identity mapped.
+
+  @param  EntryPoint  A pointer to function to call with the new stack after
+                      paging is disabled.
+  @param  Context1    A pointer to the context to pass into the EntryPoint
+                      function as the first parameter after paging is disabled.
+  @param  Context2    A pointer to the context to pass into the EntryPoint
+                      function as the second parameter after paging is
+                      disabled.
+  @param  NewStack    A pointer to the new stack to use for the EntryPoint
+                      function after paging is disabled.
+
+**/
+VOID
+EFIAPI
+InternalX86DisablePaging32 (
+  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
+  IN      VOID                      *Context1,  OPTIONAL
+  IN      VOID                      *Context2,  OPTIONAL
+  IN      VOID                      *NewStack
+  );
+
+/**
+  Enables the 64-bit paging mode on the CPU.
+
+  Enables the 64-bit paging mode on the CPU. CR0, CR3, CR4, and the page tables
+  must be properly initialized prior to calling this service. This function
+  assumes the current execution mode is 32-bit protected mode with flat
+  descriptors. This function is only available on IA-32. After the 64-bit
+  paging mode is enabled, control is transferred to the function specified by
+  EntryPoint using the new stack specified by NewStack and passing in the
+  parameters specified by Context1 and Context2. Context1 and Context2 are
+  optional and may be 0. The function EntryPoint must never return.
+
+  @param  Cs          The 16-bit selector to load in the CS before EntryPoint
+                      is called. The descriptor in the GDT that this selector
+                      references must be setup for long mode.
+  @param  EntryPoint  The 64-bit virtual address of the function to call with
+                      the new stack after paging is enabled.
+  @param  Context1    The 64-bit virtual address of the context to pass into
+                      the EntryPoint function as the first parameter after
+                      paging is enabled.
+  @param  Context2    The 64-bit virtual address of the context to pass into
+                      the EntryPoint function as the second parameter after
+                      paging is enabled.
+  @param  NewStack    The 64-bit virtual address of the new stack to use for
+                      the EntryPoint function after paging is enabled.
+
+**/
+VOID
+EFIAPI
+InternalX86EnablePaging64 (
+  IN      UINT16                    Cs,
+  IN      UINT64                    EntryPoint,
+  IN      UINT64                    Context1,  OPTIONAL
+  IN      UINT64                    Context2,  OPTIONAL
+  IN      UINT64                    NewStack
+  );
+
+/**
+  Disables the 64-bit paging mode on the CPU.
+
+  Disables the 64-bit paging mode on the CPU and returns to 32-bit protected
+  mode. This function assumes the current execution mode is 64-paging mode.
+  This function is only available on X64. After the 64-bit paging mode is
+  disabled, control is transferred to the function specified by EntryPoint
+  using the new stack specified by NewStack and passing in the parameters
+  specified by Context1 and Context2. Context1 and Context2 are optional and
+  may be 0. The function EntryPoint must never return.
+
+  @param  Cs          The 16-bit selector to load in the CS before EntryPoint
+                      is called. The descriptor in the GDT that this selector
+                      references must be setup for 32-bit protected mode.
+  @param  EntryPoint  The 64-bit virtual address of the function to call with
+                      the new stack after paging is disabled.
+  @param  Context1    The 64-bit virtual address of the context to pass into
+                      the EntryPoint function as the first parameter after
+                      paging is disabled.
+  @param  Context2    The 64-bit virtual address of the context to pass into
+                      the EntryPoint function as the second parameter after
+                      paging is disabled.
+  @param  NewStack    The 64-bit virtual address of the new stack to use for
+                      the EntryPoint function after paging is disabled.
+
+**/
+VOID
+EFIAPI
+InternalX86DisablePaging64 (
+  IN      UINT16                    Cs,
+  IN      UINT32                    EntryPoint,
+  IN      UINT32                    Context1,  OPTIONAL
+  IN      UINT32                    Context2,  OPTIONAL
+  IN      UINT32                    NewStack
+  );
+
+/**
+  Worker function that locates the Node in the List
+
+  By searching the List, finds the location of the Node in List. At the same time,
+  verifies the validity of this list.
+
+  If List is NULL, then ASSERT().
+  If List->ForwardLink is NULL, then ASSERT().
+  If List->backLink is NULL, then ASSERT().
+  If Node is NULL, then ASSERT();
+  If PcdMaximumLinkedListLenth is not zero, and prior to insertion the number
+  of nodes in ListHead, including the ListHead node, is greater than or
+  equal to PcdMaximumLinkedListLength, then ASSERT().
+
+  @param  List  A pointer to a node in a linked list.
+  @param  Node  A pointer to one nod.
+
+  @retval TRUE   Node is in List
+  @retval FALSE  Node isn't in List, or List is invalid
+
+**/
+BOOLEAN
+IsNodeInList (
+  IN      CONST LIST_ENTRY      *List,
+  IN      CONST LIST_ENTRY      *Node
+  );
+
+/**
+  Performs an atomic increment of an 32-bit unsigned integer.
+
+  Performs an atomic increment of the 32-bit unsigned integer specified by
+  Value and returns the incremented value. The increment operation must be
+  performed using MP safe mechanisms. The state of the return value is not
+  guaranteed to be MP safe.
+
+  @param  Value A pointer to the 32-bit value to increment.
+
+  @return The incremented value.
+
+**/
+UINT32
+EFIAPI
+InternalSyncIncrement (
+  IN      volatile UINT32           *Value
+  );
+
+/**
+  Performs an atomic decrement of an 32-bit unsigned integer.
+
+  Performs an atomic decrement of the 32-bit unsigned integer specified by
+  Value and returns the decrement value. The decrement operation must be
+  performed using MP safe mechanisms. The state of the return value is not
+  guaranteed to be MP safe.
+
+  @param  Value A pointer to the 32-bit value to decrement.
+
+  @return The decrement value.
+
+**/
+UINT32
+EFIAPI
+InternalSyncDecrement (
+  IN      volatile UINT32           *Value
+  );
+
+/**
+  Performs an atomic compare exchange operation on a 32-bit unsigned integer.
+
+  Performs an atomic compare exchange operation on the 32-bit unsigned integer
+  specified by Value.  If Value is equal to CompareValue, then Value is set to 
+  ExchangeValue and CompareValue is returned.  If Value is not equal to CompareValue,
+  then Value is returned.  The compare exchange operation must be performed using 
+  MP safe mechanisms.
+
+  @param  Value         A pointer to the 32-bit value for the compare exchange
+                        operation.
+  @param  CompareValue  32-bit value used in compare operation.
+  @param  ExchangeValue 32-bit value used in exchange operation.
+
+  @return The original *Value before exchange.
+
+**/
+UINT32
+EFIAPI
+InternalSyncCompareExchange32 (
+  IN      volatile UINT32           *Value,
+  IN      UINT32                    CompareValue,
+  IN      UINT32                    ExchangeValue
+  );
+
+/**
+  Performs an atomic compare exchange operation on a 64-bit unsigned integer.
+
+  Performs an atomic compare exchange operation on the 64-bit unsigned integer specified 
+  by Value.  If Value is equal to CompareValue, then Value is set to ExchangeValue and 
+  CompareValue is returned.  If Value is not equal to CompareValue, then Value is returned. 
+  The compare exchange operation must be performed using MP safe mechanisms.
+
+  @param  Value         A pointer to the 64-bit value for the compare exchange
+                        operation.
+  @param  CompareValue  64-bit value used in compare operation.
+  @param  ExchangeValue 64-bit value used in exchange operation.
+
+  @return The original *Value before exchange.
+
+**/
+UINT64
+EFIAPI
+InternalSyncCompareExchange64 (
+  IN      volatile UINT64           *Value,
+  IN      UINT64                    CompareValue,
+  IN      UINT64                    ExchangeValue
+  );
+
+/**
+  Worker function that returns a bit field from Operand
+
+  Returns the bitfield specified by the StartBit and the EndBit from Operand.
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+
+  @return The bit field read.
+
+**/
+unsigned int
+BitFieldReadUint (
+  IN      unsigned int              Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit
+  );
+
+/**
+  Worker function that reads a bit field from Operand, performs a bitwise OR, 
+  and returns the result.
+
+  Performs a bitwise OR between the bit field specified by StartBit and EndBit
+  in Operand and the value specified by AndData. All other bits in Operand are
+  preserved. The new value is returned.
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+  @param  OrData    The value to OR with the read value from the value
+
+  @return The new value.
+
+**/
+unsigned int
+BitFieldOrUint (
+  IN      unsigned int              Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      unsigned int              OrData
+  );
+
+/**
+  Worker function that reads a bit field from Operand, performs a bitwise AND, 
+  and returns the result.
+
+  Performs a bitwise AND between the bit field specified by StartBit and EndBit
+  in Operand and the value specified by AndData. All other bits in Operand are
+  preserved. The new value is returned.
+
+  @param  Operand   Operand on which to perform the bitfield operation.
+  @param  StartBit  The ordinal of the least significant bit in the bit field.
+  @param  EndBit    The ordinal of the most significant bit in the bit field.
+  @param  AndData    The value to And with the read value from the value
+
+  @return The new value.
+
+**/
+unsigned int
+BitFieldAndUint (
+  IN      unsigned int              Operand,
+  IN      UINTN                     StartBit,
+  IN      UINTN                     EndBit,
+  IN      unsigned int              AndData
+  );
+
+/**
+  Worker function that checks ASSERT condition for JumpBuffer
+
+  Checks ASSERT condition for JumpBuffer.
+
+  If JumpBuffer is NULL, then ASSERT().
+  For IPF CPUs, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().
+
+  @param  JumpBuffer    A pointer to CPU context buffer.
+
+**/
+VOID
+InternalAssertJumpBuffer (
+  IN      BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer
+  );
+
+/**
+  Restores the CPU context that was saved with SetJump().
+
+  Restores the CPU context from the buffer specified by JumpBuffer.
+  This function never returns to the caller.
+  Instead is resumes execution based on the state of JumpBuffer.
+
+  @param  JumpBuffer    A pointer to CPU context buffer.
+  @param  Value         The value to return when the SetJump() context is restored.
+
+**/
+VOID
+EFIAPI
+InternalLongJump (
+  IN      BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer,
+  IN      UINTN                     Value
+  );
+
+#endif
diff --git a/MdePkg/Library/BaseLib/CheckSum.c b/MdePkg/Library/BaseLib/CheckSum.c
new file mode 100644 (file)
index 0000000..957a222
--- /dev/null
@@ -0,0 +1,334 @@
+/** @file\r
+  Utility functions to generate checksum based on 2's complement\r
+  algorithm.\r
+\r
+  Copyright (c) 2007, Intel Corporation<BR>\r
+  All rights reserved. This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+  Module Name:  CheckSum.c\r
+\r
+**/\r
+\r
+/**\r
+  Calculate the sum of all elements in a buffer in unit of UINT8. \r
+  During calculation, the carry bits are dropped.\r
+\r
+  This function calculates the sum of all elements in a buffer \r
+  in unit of UINT8. The carry bits in result of addition are dropped. \r
+  The result is returned as UINT8. If Length is Zero, then Zero is \r
+  returned.\r
+  \r
+  If Buffer is NULL, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). \r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the sum operation.\r
+  @param  Length           The size, in bytes, of Buffer .\r
+\r
+  @return Sum         The sum of Buffer with carry bits dropped during additions.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+CalculateSum8 (\r
+  IN      CONST UINT8                  *Buffer,\r
+  IN      UINTN                                      Length\r
+  )\r
+{\r
+  UINT8     Sum;\r
+  UINTN     Count;\r
+\r
+  ASSERT (Buffer != NULL);\r
+  ASSERT (Length <= (MAX_ADDRESS - ((UINTN) Buffer) + 1));\r
+\r
+  for (Sum = 0, Count = 0; Count < Length; Count++) {\r
+    Sum = Sum + *(Buffer + Count);\r
+  }\r
+  \r
+  return Sum;\r
+}\r
+\r
+\r
+/**\r
+  Returns the two's complement checksum of all elements in a buffer \r
+  of 8-bit values.\r
+\r
+  This function first calculates the sum of the 8-bit values in the \r
+  buffer specified by Buffer and Length.  The carry bits in the result \r
+  of addition are dropped. Then, the two's complement of the sum is \r
+  returned.  If Length is 0, then 0 is returned.\r
+  \r
+  If Buffer is NULL, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the checksum operation.\r
+  @param  Length           The size, in bytes, of Buffer.\r
+\r
+  @return Checksum       The 2's complement checksum of Buffer.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+CalculateCheckSum8 (\r
+  IN      CONST UINT8                  *Buffer,\r
+  IN      UINTN                                      Length\r
+  )\r
+{\r
+  UINT8     CheckSum;\r
+\r
+  CheckSum = CalculateSum8 (Buffer, Length);\r
+\r
+  //\r
+  // Return the checksum based on 2's complement.\r
+  //\r
+  return (UINT8) (0x100 - CheckSum);\r
+}\r
+\r
+/**\r
+  Returns the sum of all elements in a buffer of 16-bit values.  During \r
+  calculation, the carry bits are dropped.\r
+\r
+  This function calculates the sum of the 16-bit values in the buffer \r
+  specified by Buffer and Length. The carry bits in result of addition are dropped. \r
+  The 16-bit result is returned.  If Length is 0, then 0 is returned.  \r
+  \r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the sum operation.\r
+  @param  Length           The size, in bytes, of Buffer.\r
+\r
+  @return Sum         The sum of Buffer with carry bits dropped during additions.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+CalculateSum16 (\r
+  IN      CONST UINT16                 *Buffer,\r
+  IN      UINTN                                      Length\r
+  )\r
+{\r
+  UINT16    Sum;\r
+  UINTN     Count;\r
+\r
+  ASSERT (Buffer != NULL);\r
+  ASSERT (((UINTN) Buffer & 0x1) == 0);\r
+  ASSERT ((Length & 0x1) == 0);\r
+  ASSERT (Length <= (MAX_ADDRESS - ((UINTN) Buffer) + 1));\r
+\r
+\r
+  for (Sum = 0, Count = 0; Count < Length; Count++) {\r
+    Sum = Sum + *(Buffer + Count);\r
+  }\r
+  \r
+  return Sum;\r
+}\r
+\r
+\r
+/**\r
+  Returns the two's complement checksum of all elements in a buffer of \r
+  16-bit values.\r
+\r
+  This function first calculates the sum of the 16-bit values in the buffer \r
+  specified by Buffer and Length.  The carry bits in the result of addition \r
+  are dropped. Then, the two's complement of the sum is returned.  If Length \r
+  is 0, then 0 is returned.\r
+  \r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). \r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the checksum operation.\r
+  @param  Length           The size, in bytes, of Buffer.\r
+\r
+  @return Checksum       The 2's complement checksum of Buffer.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+CalculateCheckSum16 (\r
+  IN      CONST UINT16                 *Buffer,\r
+  IN      UINTN                                      Length\r
+  )\r
+{\r
+  UINT16     CheckSum;\r
+\r
+  CheckSum = CalculateSum16 (Buffer, Length);\r
+\r
+  //\r
+  // Return the checksum based on 2's complement.\r
+  //\r
+  return (UINT16) (0x10000 - CheckSum);\r
+}\r
+\r
+\r
+/**\r
+  Returns the sum of all elements in a buffer of 32-bit values.  During \r
+  calculation, the carry bits are dropped.\r
+\r
+  This function calculates the sum of the 32-bit values in the buffer \r
+  specified by Buffer and Length. The carry bits in result of addition are dropped. \r
+  The 32-bit result is returned.  If Length is 0, then 0 is returned.  \r
+  \r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 32-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 32-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the sum operation.\r
+  @param  Length           The size, in bytes, of Buffer.\r
+\r
+  @return Sum         The sum of Buffer with carry bits dropped during additions.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+CalculateSum32 (\r
+  IN      CONST UINT32                 *Buffer,\r
+  IN      UINTN                                      Length\r
+  )\r
+{\r
+  UINT32    Sum;\r
+  UINTN     Count;\r
+\r
+  ASSERT (Buffer != NULL);\r
+  ASSERT (((UINTN) Buffer & 0x3) == 0);\r
+  ASSERT ((Length & 0x3) == 0);\r
+  ASSERT (Length <= (MAX_ADDRESS - ((UINTN) Buffer) + 1));\r
+\r
+\r
+  for (Sum = 0, Count = 0; Count < Length; Count++) {\r
+    Sum = Sum + *(Buffer + Count);\r
+  }\r
+  \r
+  return Sum;\r
+}\r
+\r
+\r
+/**\r
+  Returns the two's complement checksum of all elements in a buffer of \r
+  32-bit values.\r
+\r
+  This function first calculates the sum of the 32-bit values in the buffer \r
+  specified by Buffer and Length.  The carry bits in the result of addition \r
+  are dropped. Then, the two's complement of the sum is returned.  If Length \r
+  is 0, then 0 is returned.\r
+  \r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 32-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 32-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). \r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the checksum operation.\r
+  @param  Length           The size, in bytes, of Buffer.\r
+\r
+  @return Checksum       The 2's complement checksum of Buffer.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+CalculateCheckSum32 (\r
+  IN      CONST UINT32                 *Buffer,\r
+  IN      UINTN                                      Length\r
+  )\r
+{\r
+  UINT32     CheckSum;\r
+\r
+  CheckSum = CalculateSum32 (Buffer, Length);\r
+\r
+  //\r
+  // Return the checksum based on 2's complement.\r
+  //\r
+  return (UINT32) ((UINT32)(-1) - CheckSum + 1);\r
+}\r
+\r
+\r
+/**\r
+  Returns the sum of all elements in a buffer of 64-bit values.  During \r
+  calculation, the carry bits are dropped.\r
+\r
+  This function calculates the sum of the 64-bit values in the buffer \r
+  specified by Buffer and Length. The carry bits in result of addition are dropped. \r
+  The 64-bit result is returned.  If Length is 0, then 0 is returned.  \r
+  \r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 64-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 64-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the sum operation.\r
+  @param  Length           The size, in bytes, of Buffer.\r
+\r
+  @return Sum         The sum of Buffer with carry bits dropped during additions.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+CalculateSum64 (\r
+  IN      CONST UINT64                 *Buffer,\r
+  IN      UINTN                                      Length\r
+  )\r
+{\r
+  UINT64    Sum;\r
+  UINTN     Count;\r
+\r
+  ASSERT (Buffer != NULL);\r
+  ASSERT (((UINTN) Buffer & 0x7) == 0);\r
+  ASSERT ((Length & 0x7) == 0);\r
+  ASSERT (Length <= (MAX_ADDRESS - ((UINTN) Buffer) + 1));\r
+\r
+  for (Sum = 0, Count = 0; Count < Length; Count++) {\r
+    Sum = Sum + *(Buffer + Count);\r
+  }\r
+  \r
+  return Sum;\r
+}\r
+\r
+\r
+/**\r
+  Returns the two's complement checksum of all elements in a buffer of \r
+  64-bit values.\r
+\r
+  This function first calculates the sum of the 64-bit values in the buffer \r
+  specified by Buffer and Length.  The carry bits in the result of addition \r
+  are dropped. Then, the two's complement of the sum is returned.  If Length \r
+  is 0, then 0 is returned.\r
+  \r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 64-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 64-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT(). \r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the checksum operation.\r
+  @param  Length           The size, in bytes, of Buffer.\r
+\r
+  @return Checksum       The 2's complement checksum of Buffer.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+CalculateCheckSum64 (\r
+  IN      CONST UINT64                 *Buffer,\r
+  IN      UINTN                                      Length\r
+  )\r
+{\r
+  UINT64     CheckSum;\r
+\r
+  CheckSum = CalculateSum64 (Buffer, Length);\r
+\r
+  //\r
+  // Return the checksum based on 2's complement.\r
+  //\r
+  return (UINT64) ((UINT64)(-1) - CheckSum + 1);\r
+}\r
+\r
+\r
index 7db468aee55dc79c251f80aeb8cff2009cf39663..402d676631c4a44e5f4a5ee5520be72364237b9e 100644 (file)
-/** @file\r
-  Unicode string primatives.\r
-\r
-  Copyright (c) 2006, Intel Corporation<BR>\r
-  All rights reserved. This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-  Module Name:  String.c\r
-\r
-**/\r
-\r
-/**\r
-  Copies one Null-terminated Unicode string to another Null-terminated Unicode\r
-  string and returns the new Unicode string.\r
-\r
-  This function copies the contents of the Unicode string Source to the Unicode\r
-  string Destination, and returns Destination. If Source and Destination\r
-  overlap, then the results are undefined.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters not including the \r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  Destination Pointer to a Null-terminated Unicode string.\r
-  @param  Source      Pointer to a Null-terminated Unicode string.\r
-\r
-  @return Destiantion\r
-\r
-**/\r
-CHAR16 *\r
-EFIAPI\r
-StrCpy (\r
-  OUT     CHAR16                    *Destination,\r
-  IN      CONST CHAR16              *Source\r
-  )\r
-{\r
-  CHAR16                            *ReturnValue;\r
-\r
-  //\r
-  // Destination cannot be NULL\r
-  //\r
-  ASSERT (Destination != NULL);\r
-\r
-  //\r
-  // Destination and source cannot overlap\r
-  //\r
-  ASSERT ((UINTN)(Destination - Source) > StrLen (Source));\r
-  ASSERT ((UINTN)(Source - Destination) > StrLen (Source));\r
-\r
-  ReturnValue = Destination;\r
-  while (*Source) {\r
-    *(Destination++) = *(Source++);\r
-  }\r
-  *Destination = 0;\r
-  return ReturnValue;\r
-}\r
-\r
-/**\r
-  Copies one Null-terminated Unicode string with a maximum length to another\r
-  Null-terminated Unicode string with a maximum length and returns the new\r
-  Unicode string.\r
-\r
-  This function copies the contents of the Unicode string Source to the Unicode\r
-  string Destination, and returns Destination. At most, Length Unicode\r
-  characters are copied from Source to Destination. If Length is 0, then\r
-  Destination is returned unmodified. If Length is greater that the number of\r
-  Unicode characters in Source, then Destination is padded with Null Unicode\r
-  characters. If Source and Destination overlap, then the results are\r
-  undefined.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters not including the \r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  Destination Pointer to a Null-terminated Unicode string.\r
-  @param  Source      Pointer to a Null-terminated Unicode string.\r
-  @param  Length      Maximum number of Unicode characters to copy.\r
-\r
-  @return Destination\r
-\r
-**/\r
-CHAR16 *\r
-EFIAPI\r
-StrnCpy (\r
-  OUT     CHAR16                    *Destination,\r
-  IN      CONST CHAR16              *Source,\r
-  IN      UINTN                     Length\r
-  )\r
-{\r
-  CHAR16                            *ReturnValue;\r
-\r
-  if (Length == 0) {\r
-    return Destination;\r
-  }\r
-\r
-  //\r
-  // Destination cannot be NULL if Length is not zero\r
-  //\r
-  ASSERT (Destination != NULL);\r
-\r
-  //\r
-  // Destination and source cannot overlap\r
-  // Q: Does Source have to be NULL-terminated?\r
-  //\r
-  ASSERT ((UINTN)(Destination - Source) > StrLen (Source));\r
-  ASSERT ((UINTN)(Source - Destination) >= Length);\r
-\r
-  ReturnValue = Destination;\r
-\r
-  while ((*Source != L'\0') && (Length > 0)) {\r
-    *(Destination++) = *(Source++);\r
-    Length--;\r
-  }\r
-\r
-  ZeroMem (Destination, Length * sizeof (*Destination));\r
-  return ReturnValue;\r
-}\r
-\r
-/**\r
-  Returns the length of a Null-terminated Unicode string.\r
-\r
-  This function returns the number of Unicode characters in the Null-terminated\r
-  Unicode string specified by String.\r
-\r
-  If String is NULL, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters not including the \r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  String  Pointer to a Null-terminated Unicode string.\r
-\r
-  @return The length of String.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-StrLen (\r
-  IN      CONST CHAR16              *String\r
-  )\r
-{\r
-  UINTN                             Length;\r
-\r
-  ASSERT (String != NULL);\r
-\r
-  for (Length = 0; *String != L'\0'; String++, Length++) {\r
-    //\r
-    // If PcdMaximumUnicodeStringLength is not zero,\r
-    // length should not more than PcdMaximumUnicodeStringLength\r
-    //\r
-    if (PcdGet32 (PcdMaximumUnicodeStringLength) != 0) {\r
-      ASSERT (Length < PcdGet32 (PcdMaximumUnicodeStringLength));\r
-    }\r
-  }\r
-  return Length;\r
-}\r
-\r
-/**\r
-  Returns the size of a Null-terminated Unicode string in bytes, including the\r
-  Null terminator.\r
-\r
-  This function returns the size, in bytes, of the Null-terminated Unicode\r
-  string specified by String.\r
-\r
-  If String is NULL, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters not including the \r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  String  Pointer to a Null-terminated Unicode string.\r
-\r
-  @return The size of String.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-StrSize (\r
-  IN      CONST CHAR16              *String\r
-  )\r
-{\r
-  return (StrLen (String) + 1) * sizeof (*String);\r
-}\r
-\r
-/**\r
-  Compares two Null-terminated Unicode strings, and returns the difference\r
-  between the first mismatched Unicode characters.\r
-\r
-  This function compares the Null-terminated Unicode string FirstString to the\r
-  Null-terminated Unicode string SecondString. If FirstString is identical to\r
-  SecondString, then 0 is returned. Otherwise, the value returned is the first\r
-  mismatched Unicode character in SecondString subtracted from the first\r
-  mismatched Unicode character in FirstString.\r
-\r
-  If FirstString is NULL, then ASSERT().\r
-  If SecondString is NULL, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more\r
-  than PcdMaximumUnicodeStringLength Unicode characters not including the \r
-  Null-terminator, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more\r
-  than PcdMaximumUnicodeStringLength Unicode characters not including the \r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  FirstString   Pointer to a Null-terminated Unicode string.\r
-  @param  SecondString  Pointer to a Null-terminated Unicode string.\r
-\r
-  @retval 0   FirstString is identical to SecondString.\r
-  @retval !=0 FirstString is not identical to SecondString.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-StrCmp (\r
-  IN      CONST CHAR16              *FirstString,\r
-  IN      CONST CHAR16              *SecondString\r
-  )\r
-{\r
-  //\r
-  // ASSERT both strings are less long than PcdMaximumUnicodeStringLength\r
-  //\r
-  ASSERT (StrSize (FirstString) != 0);\r
-  ASSERT (StrSize (SecondString) != 0);\r
-\r
-  while ((*FirstString != L'\0') && (*FirstString == *SecondString)) {\r
-    FirstString++;\r
-    SecondString++;\r
-  }\r
-  return *FirstString - *SecondString;\r
-}\r
-\r
-/**\r
-  Compares two Null-terminated Unicode strings with maximum lengths, and\r
-  returns the difference between the first mismatched Unicode characters.\r
-\r
-  This function compares the Null-terminated Unicode string FirstString to the\r
-  Null-terminated Unicode string SecondString. At most, Length Unicode\r
-  characters will be compared. If Length is 0, then 0 is returned. If\r
-  FirstString is identical to SecondString, then 0 is returned. Otherwise, the\r
-  value returned is the first mismatched Unicode character in SecondString\r
-  subtracted from the first mismatched Unicode character in FirstString.\r
-\r
-  If FirstString is NULL, then ASSERT().\r
-  If SecondString is NULL, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more\r
-  than PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more\r
-  than PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  FirstString   Pointer to a Null-terminated Unicode string.\r
-  @param  SecondString  Pointer to a Null-terminated Unicode string.\r
-  @param  Length        Maximum number of Unicode characters to compare.\r
-\r
-  @retval 0   FirstString is identical to SecondString.\r
-  @retval !=0 FirstString is not identical to SecondString.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-StrnCmp (\r
-  IN      CONST CHAR16              *FirstString,\r
-  IN      CONST CHAR16              *SecondString,\r
-  IN      UINTN                     Length\r
-  )\r
-{\r
-  if (Length == 0) {\r
-    return 0;\r
-  }\r
-\r
-  //\r
-  // ASSERT both strings are less long than PcdMaximumUnicodeStringLength.\r
-  // Length tests are performed inside StrLen().\r
-  //\r
-  ASSERT (StrSize (FirstString) != 0);\r
-  ASSERT (StrSize (SecondString) != 0);\r
-\r
-  while ((*FirstString != L'\0') &&\r
-         (*FirstString == *SecondString) &&\r
-         (Length > 1)) {\r
-    FirstString++;\r
-    SecondString++;\r
-    Length--;\r
-  }\r
-\r
-  return *FirstString - *SecondString;\r
-}\r
-\r
-/**\r
-  Concatenates one Null-terminated Unicode string to another Null-terminated\r
-  Unicode string, and returns the concatenated Unicode string.\r
-\r
-  This function concatenates two Null-terminated Unicode strings. The contents\r
-  of Null-terminated Unicode string Source are concatenated to the end of\r
-  Null-terminated Unicode string Destination. The Null-terminated concatenated\r
-  Unicode String is returned. If Source and Destination overlap, then the\r
-  results are undefined.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and Destination contains more\r
-  than PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination\r
-  and Source results in a Unicode string with more than\r
-  PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  Destination Pointer to a Null-terminated Unicode string.\r
-  @param  Source      Pointer to a Null-terminated Unicode string.\r
-\r
-  @return Destination\r
-\r
-**/\r
-CHAR16 *\r
-EFIAPI\r
-StrCat (\r
-  IN OUT  CHAR16                    *Destination,\r
-  IN      CONST CHAR16              *Source\r
-  )\r
-{\r
-  StrCpy (Destination + StrLen (Destination), Source);\r
-\r
-  //\r
-  // Size of the resulting string should never be zero.\r
-  // PcdMaximumUnicodeStringLength is tested inside StrLen().\r
-  //\r
-  ASSERT (StrSize (Destination) != 0);\r
-  return Destination;\r
-}\r
-\r
-/**\r
-  Concatenates one Null-terminated Unicode string with a maximum length to the\r
-  end of another Null-terminated Unicode string, and returns the concatenated\r
-  Unicode string.\r
-\r
-  This function concatenates two Null-terminated Unicode strings. The contents\r
-  of Null-terminated Unicode string Source are concatenated to the end of\r
-  Null-terminated Unicode string Destination, and Destination is returned. At\r
-  most, Length Unicode characters are concatenated from Source to the end of\r
-  Destination, and Destination is always Null-terminated. If Length is 0, then\r
-  Destination is returned unmodified. If Source and Destination overlap, then\r
-  the results are undefined.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and Destination contains more\r
-  than PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination\r
-  and Source results in a Unicode string with more than\r
-  PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  Destination Pointer to a Null-terminated Unicode string.\r
-  @param  Source      Pointer to a Null-terminated Unicode string.\r
-  @param  Length      Maximum number of Unicode characters to concatenate from\r
-                      Source.\r
-\r
-  @return Destination\r
-\r
-**/\r
-CHAR16 *\r
-EFIAPI\r
-StrnCat (\r
-  IN OUT  CHAR16                    *Destination,\r
-  IN      CONST CHAR16              *Source,\r
-  IN      UINTN                     Length\r
-  )\r
-{\r
-  StrnCpy (Destination + StrLen (Destination), Source, Length);\r
-\r
-  //\r
-  // Size of the resulting string should never be zero.\r
-  // PcdMaximumUnicodeStringLength is tested inside StrLen().\r
-  //\r
-  ASSERT (StrSize (Destination) != 0);\r
-  return Destination;\r
-}\r
-\r
-/**\r
-  Copies one Null-terminated ASCII string to another Null-terminated ASCII\r
-  string and returns the new ASCII string.\r
-\r
-  This function copies the contents of the ASCII string Source to the ASCII\r
-  string Destination, and returns Destination. If Source and Destination\r
-  overlap, then the results are undefined.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and Source contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-\r
-  @param  Destination Pointer to a Null-terminated ASCII string.\r
-  @param  Source      Pointer to a Null-terminated ASCII string.\r
-\r
-  @return Destination\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-AsciiStrCpy (\r
-  OUT     CHAR8                     *Destination,\r
-  IN      CONST CHAR8               *Source\r
-  )\r
-{\r
-  CHAR8                             *ReturnValue;\r
-\r
-  //\r
-  // Destination cannot be NULL\r
-  //\r
-  ASSERT (Destination != NULL);\r
-\r
-  //\r
-  // Destination and source cannot overlap\r
-  //\r
-  ASSERT ((UINTN)(Destination - Source) > AsciiStrLen (Source));\r
-  ASSERT ((UINTN)(Source - Destination) > AsciiStrLen (Source));\r
-\r
-  ReturnValue = Destination;\r
-  while (*Source) {\r
-    *(Destination++) = *(Source++);\r
-  }\r
-  *Destination = 0;\r
-  return ReturnValue;\r
-}\r
-\r
-/**\r
-  Copies one Null-terminated ASCII string with a maximum length to another\r
-  Null-terminated ASCII string with a maximum length and returns the new ASCII\r
-  string.\r
-\r
-  This function copies the contents of the ASCII string Source to the ASCII\r
-  string Destination, and returns Destination. At most, Length ASCII characters\r
-  are copied from Source to Destination. If Length is 0, then Destination is\r
-  returned unmodified. If Length is greater that the number of ASCII characters\r
-  in Source, then Destination is padded with Null ASCII characters. If Source\r
-  and Destination overlap, then the results are undefined.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and Source contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-\r
-  @param  Destination Pointer to a Null-terminated ASCII string.\r
-  @param  Source      Pointer to a Null-terminated ASCII string.\r
-  @param  Length      Maximum number of ASCII characters to copy.\r
-\r
-  @return Destination\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-AsciiStrnCpy (\r
-  OUT     CHAR8                     *Destination,\r
-  IN      CONST CHAR8               *Source,\r
-  IN      UINTN                     Length\r
-  )\r
-{\r
-  CHAR8                             *ReturnValue;\r
-\r
-  if (Length == 0) {\r
-    return Destination;\r
-  }\r
-\r
-  //\r
-  // Destination cannot be NULL\r
-  //\r
-  ASSERT (Destination != NULL);\r
-\r
-  //\r
-  // Destination and source cannot overlap\r
-  //\r
-  ASSERT ((UINTN)(Destination - Source) > AsciiStrLen (Source));\r
-  ASSERT ((UINTN)(Source - Destination) >= Length);\r
-\r
-  ReturnValue = Destination;\r
-\r
-  while (*Source && Length > 0) {\r
-    *(Destination++) = *(Source++);\r
-    Length--;\r
-  }\r
-\r
-  ZeroMem (Destination, Length * sizeof (*Destination));\r
-  return ReturnValue;\r
-}\r
-\r
-/**\r
-  Returns the length of a Null-terminated ASCII string.\r
-\r
-  This function returns the number of ASCII characters in the Null-terminated\r
-  ASCII string specified by String.\r
-\r
-  If String is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and String contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-\r
-  @param  String  Pointer to a Null-terminated ASCII string.\r
-\r
-  @return The length of String.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsciiStrLen (\r
-  IN      CONST CHAR8               *String\r
-  )\r
-{\r
-  UINTN                             Length;\r
-\r
-  ASSERT (String != NULL);\r
-\r
-  for (Length = 0; *String != '\0'; String++, Length++) {\r
-    //\r
-    // If PcdMaximumUnicodeStringLength is not zero,\r
-    // length should not more than PcdMaximumUnicodeStringLength\r
-    //\r
-    if (PcdGet32 (PcdMaximumAsciiStringLength) != 0) {\r
-      ASSERT (Length < PcdGet32 (PcdMaximumAsciiStringLength));\r
-    }\r
-  }\r
-  return Length;\r
-}\r
-\r
-/**\r
-  Returns the size of a Null-terminated ASCII string in bytes, including the\r
-  Null terminator.\r
-\r
-  This function returns the size, in bytes, of the Null-terminated ASCII string\r
-  specified by String.\r
-\r
-  If String is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and String contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-\r
-  @param  String  Pointer to a Null-terminated ASCII string.\r
-\r
-  @return The size of String.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsciiStrSize (\r
-  IN      CONST CHAR8               *String\r
-  )\r
-{\r
-  return (AsciiStrLen (String) + 1) * sizeof (*String);\r
-}\r
-\r
-/**\r
-  Compares two Null-terminated ASCII strings, and returns the difference\r
-  between the first mismatched ASCII characters.\r
-\r
-  This function compares the Null-terminated ASCII string FirstString to the\r
-  Null-terminated ASCII string SecondString. If FirstString is identical to\r
-  SecondString, then 0 is returned. Otherwise, the value returned is the first\r
-  mismatched ASCII character in SecondString subtracted from the first\r
-  mismatched ASCII character in FirstString.\r
-\r
-  If FirstString is NULL, then ASSERT().\r
-  If SecondString is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and FirstString contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and SecondString contains more\r
-  than PcdMaximumAsciiStringLength ASCII characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  FirstString   Pointer to a Null-terminated ASCII string.\r
-  @param  SecondString  Pointer to a Null-terminated ASCII string.\r
-\r
-  @retval 0   FirstString is identical to SecondString.\r
-  @retval !=0 FirstString is not identical to SecondString.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-AsciiStrCmp (\r
-  IN      CONST CHAR8               *FirstString,\r
-  IN      CONST CHAR8               *SecondString\r
-  )\r
-{\r
-  //\r
-  // ASSERT both strings are less long than PcdMaximumAsciiStringLength\r
-  //\r
-  ASSERT (AsciiStrSize (FirstString));\r
-  ASSERT (AsciiStrSize (SecondString));\r
-\r
-  while ((*FirstString != '\0') && (*FirstString == *SecondString)) {\r
-    FirstString++;\r
-    SecondString++;\r
-  }\r
-\r
-  return *FirstString - *SecondString;\r
-}\r
-\r
-/**\r
-  Converts a lowercase Ascii character to upper one\r
-\r
-  If Chr is lowercase Ascii character, then converts it to upper one.\r
-\r
-  If Value >= 0xA0, then ASSERT().\r
-  If (Value & 0x0F) >= 0x0A, then ASSERT().\r
-\r
-  @param  chr   one Ascii character\r
-\r
-  @return The uppercase value of Ascii character \r
-\r
-**/\r
-STATIC\r
-CHAR8\r
-AsciiToUpper (\r
-  IN      CHAR8                     Chr\r
-  )\r
-{\r
-  return (UINT8) ((Chr >= 'a' && Chr <= 'z') ? Chr - ('a' - 'A') : Chr);\r
-}\r
-\r
-/**\r
-  Performs a case insensitive comparison of two Null-terminated ASCII strings,\r
-  and returns the difference between the first mismatched ASCII characters.\r
-\r
-  This function performs a case insensitive comparison of the Null-terminated\r
-  ASCII string FirstString to the Null-terminated ASCII string SecondString. If\r
-  FirstString is identical to SecondString, then 0 is returned. Otherwise, the\r
-  value returned is the first mismatched lower case ASCII character in\r
-  SecondString subtracted from the first mismatched lower case ASCII character\r
-  in FirstString.\r
-\r
-  If FirstString is NULL, then ASSERT().\r
-  If SecondString is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and FirstString contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and SecondString contains more\r
-  than PcdMaximumAsciiStringLength ASCII characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  FirstString   Pointer to a Null-terminated ASCII string.\r
-  @param  SecondString  Pointer to a Null-terminated ASCII string.\r
-\r
-  @retval 0   FirstString is identical to SecondString using case insensitive\r
-              comparisons.\r
-  @retval !=0 FirstString is not identical to SecondString using case\r
-              insensitive comparisons.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-AsciiStriCmp (\r
-  IN      CONST CHAR8               *FirstString,\r
-  IN      CONST CHAR8               *SecondString\r
-  )\r
-{\r
-  CHAR8  UpperFirstString;\r
-  CHAR8  UpperSecondString;\r
-\r
-  //\r
-  // ASSERT both strings are less long than PcdMaximumAsciiStringLength\r
-  //\r
-  ASSERT (AsciiStrSize (FirstString));\r
-  ASSERT (AsciiStrSize (SecondString));\r
-\r
-  UpperFirstString  = AsciiToUpper (*FirstString);\r
-  UpperSecondString = AsciiToUpper (*SecondString);\r
-  while ((*FirstString != '\0') && (UpperFirstString == UpperSecondString)) {\r
-    FirstString++;\r
-    SecondString++;\r
-    UpperFirstString  = AsciiToUpper (*FirstString);\r
-    UpperSecondString = AsciiToUpper (*SecondString);\r
-  }\r
-\r
-  return UpperFirstString - UpperSecondString;\r
-}\r
-\r
-/**\r
-  Compares two Null-terminated ASCII strings with maximum lengths, and returns\r
-  the difference between the first mismatched ASCII characters.\r
-\r
-  This function compares the Null-terminated ASCII string FirstString to the\r
-  Null-terminated ASCII  string SecondString. At most, Length ASCII characters\r
-  will be compared. If Length is 0, then 0 is returned. If FirstString is\r
-  identical to SecondString, then 0 is returned. Otherwise, the value returned\r
-  is the first mismatched ASCII character in SecondString subtracted from the\r
-  first mismatched ASCII character in FirstString.\r
-\r
-  If FirstString is NULL, then ASSERT().\r
-  If SecondString is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and FirstString contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and SecondString contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-\r
-  @param  FirstString   Pointer to a Null-terminated ASCII string.\r
-  @param  SecondString  Pointer to a Null-terminated ASCII string.\r
-\r
-  @retval 0   FirstString is identical to SecondString.\r
-  @retval !=0 FirstString is not identical to SecondString.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-AsciiStrnCmp (\r
-  IN      CONST CHAR8               *FirstString,\r
-  IN      CONST CHAR8               *SecondString,\r
-  IN      UINTN                     Length\r
-  )\r
-{\r
-  if (Length == 0) {\r
-    return 0;\r
-  }\r
-\r
-  //\r
-  // ASSERT both strings are less long than PcdMaximumAsciiStringLength\r
-  //\r
-  ASSERT (AsciiStrSize (FirstString));\r
-  ASSERT (AsciiStrSize (SecondString));\r
-\r
-  while ((*FirstString != '\0') &&\r
-         (*FirstString == *SecondString) &&\r
-         (Length > 1)) {\r
-    FirstString++;\r
-    SecondString++;\r
-    Length--;\r
-  }\r
-  return *FirstString - *SecondString;\r
-}\r
-\r
-/**\r
-  Concatenates one Null-terminated ASCII string to another Null-terminated\r
-  ASCII string, and returns the concatenated ASCII string.\r
-\r
-  This function concatenates two Null-terminated ASCII strings. The contents of\r
-  Null-terminated ASCII string Source are concatenated to the end of Null-\r
-  terminated ASCII string Destination. The Null-terminated concatenated ASCII\r
-  String is returned.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and Destination contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and Source contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero and concatenating Destination and\r
-  Source results in a ASCII string with more than PcdMaximumAsciiStringLength\r
-  ASCII characters, then ASSERT().\r
-\r
-  @param  Destination Pointer to a Null-terminated ASCII string.\r
-  @param  Source      Pointer to a Null-terminated ASCII string.\r
-\r
-  @return Destination\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-AsciiStrCat (\r
-  IN OUT CHAR8    *Destination,\r
-  IN CONST CHAR8  *Source\r
-  )\r
-{\r
-  AsciiStrCpy (Destination + AsciiStrLen (Destination), Source);\r
-\r
-  //\r
-  // Size of the resulting string should never be zero.\r
-  // PcdMaximumUnicodeStringLength is tested inside StrLen().\r
-  //\r
-  ASSERT (AsciiStrSize (Destination) != 0);\r
-  return Destination;\r
-}\r
-\r
-/**\r
-  Concatenates one Null-terminated ASCII string with a maximum length to the\r
-  end of another Null-terminated ASCII string, and returns the concatenated\r
-  ASCII string.\r
-\r
-  This function concatenates two Null-terminated ASCII strings. The contents\r
-  of Null-terminated ASCII string Source are concatenated to the end of Null-\r
-  terminated ASCII string Destination, and Destination is returned. At most,\r
-  Length ASCII characters are concatenated from Source to the end of\r
-  Destination, and Destination is always Null-terminated. If Length is 0, then\r
-  Destination is returned unmodified. If Source and Destination overlap, then\r
-  the results are undefined.\r
-\r
-  If Destination is NULL, then ASSERT().\r
-  If Source is NULL, then ASSERT().\r
-  If Source and Destination overlap, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and Destination contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and Source contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
-  then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and concatenating Destination and\r
-  Source results in a ASCII string with more than PcdMaximumAsciiStringLength\r
-  ASCII characters not including the Null-terminator, then ASSERT().\r
-\r
-  @param  Destination Pointer to a Null-terminated ASCII string.\r
-  @param  Source      Pointer to a Null-terminated ASCII string.\r
-  @param  Length      Maximum number of ASCII characters to concatenate from\r
-                      Source.\r
-\r
-  @return Destination\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-AsciiStrnCat (\r
-  IN OUT  CHAR8                     *Destination,\r
-  IN      CONST CHAR8               *Source,\r
-  IN      UINTN                     Length\r
-  )\r
-{\r
-  AsciiStrnCpy (Destination + AsciiStrLen (Destination), Source, Length);\r
-\r
-  //\r
-  // Size of the resulting string should never be zero.\r
-  // PcdMaximumUnicodeStringLength is tested inside StrLen().\r
-  //\r
-  ASSERT (AsciiStrSize (Destination) != 0);\r
-  return Destination;\r
-}\r
-\r
-/**\r
-  Converts an 8-bit value to an 8-bit BCD value.\r
-\r
-  Converts the 8-bit value specified by Value to BCD. The BCD value is\r
-  returned.\r
-\r
-  If Value >= 100, then ASSERT().\r
-\r
-  @param  Value The 8-bit value to convert to BCD. Range 0..99.\r
-\r
-  @return The BCD value\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-DecimalToBcd8 (\r
-  IN      UINT8                     Value\r
-  )\r
-{\r
-  ASSERT (Value < 100);\r
-  return (UINT8) (((Value / 10) << 4) | (Value % 10));\r
-}\r
-\r
-/**\r
-  Converts an 8-bit BCD value to an 8-bit value.\r
-\r
-  Converts the 8-bit BCD value specified by Value to an 8-bit value. The 8-bit\r
-  value is returned.\r
-\r
-  If Value >= 0xA0, then ASSERT().\r
-  If (Value & 0x0F) >= 0x0A, then ASSERT().\r
-\r
-  @param  Value The 8-bit BCD value to convert to an 8-bit value.\r
-\r
-  @return The 8-bit value is returned.\r
-\r
-**/\r
-UINT8\r
-EFIAPI\r
-BcdToDecimal8 (\r
-  IN      UINT8                     Value\r
-  )\r
-{\r
-  ASSERT (Value < 0xa0);\r
-  ASSERT ((Value & 0xf) < 0xa);\r
-  return (UINT8) ((Value >> 4) * 10 + (Value & 0xf));\r
-}\r
+/** @file
+  Unicode and ASCII string primatives.
+
+  Copyright (c) 2006 - 2007, Intel Corporation<BR>
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Module Name:  String.c
+
+**/
+
+#include "BaseLibInternals.h"
+
+/**
+  Copies one Null-terminated Unicode string to another Null-terminated Unicode
+  string and returns the new Unicode string.
+
+  This function copies the contents of the Unicode string Source to the Unicode
+  string Destination, and returns Destination. If Source and Destination
+  overlap, then the results are undefined.
+
+  If Destination is NULL, then ASSERT().
+  If Source is NULL, then ASSERT().
+  If Source and Destination overlap, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
+  PcdMaximumUnicodeStringLength Unicode characters not including the 
+  Null-terminator, then ASSERT().
+
+  @param  Destination Pointer to a Null-terminated Unicode string.
+  @param  Source      Pointer to a Null-terminated Unicode string.
+
+  @return Destiantion
+
+**/
+CHAR16 *
+EFIAPI
+StrCpy (
+  OUT     CHAR16                    *Destination,
+  IN      CONST CHAR16              *Source
+  )
+{
+  CHAR16                            *ReturnValue;
+
+  //
+  // Destination cannot be NULL
+  //
+  ASSERT (Destination != NULL);
+
+  //
+  // Destination and source cannot overlap
+  //
+  ASSERT ((UINTN)(Destination - Source) > StrLen (Source));
+  ASSERT ((UINTN)(Source - Destination) > StrLen (Source));
+
+  ReturnValue = Destination;
+  while (*Source) {
+    *(Destination++) = *(Source++);
+  }
+  *Destination = 0;
+  return ReturnValue;
+}
+
+/**
+  Copies one Null-terminated Unicode string with a maximum length to another
+  Null-terminated Unicode string with a maximum length and returns the new
+  Unicode string.
+
+  This function copies the contents of the Unicode string Source to the Unicode
+  string Destination, and returns Destination. At most, Length Unicode
+  characters are copied from Source to Destination. If Length is 0, then
+  Destination is returned unmodified. If Length is greater that the number of
+  Unicode characters in Source, then Destination is padded with Null Unicode
+  characters. If Source and Destination overlap, then the results are
+  undefined.
+
+  If Destination is NULL, then ASSERT().
+  If Source is NULL, then ASSERT().
+  If Source and Destination overlap, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
+  PcdMaximumUnicodeStringLength Unicode characters not including the 
+  Null-terminator, then ASSERT().
+
+  @param  Destination Pointer to a Null-terminated Unicode string.
+  @param  Source      Pointer to a Null-terminated Unicode string.
+  @param  Length      Maximum number of Unicode characters to copy.
+
+  @return Destination
+
+**/
+CHAR16 *
+EFIAPI
+StrnCpy (
+  OUT     CHAR16                    *Destination,
+  IN      CONST CHAR16              *Source,
+  IN      UINTN                     Length
+  )
+{
+  CHAR16                            *ReturnValue;
+
+  if (Length == 0) {
+    return Destination;
+  }
+
+  //
+  // Destination cannot be NULL if Length is not zero
+  //
+  ASSERT (Destination != NULL);
+
+  //
+  // Destination and source cannot overlap
+  // Q: Does Source have to be NULL-terminated?
+  //
+  ASSERT ((UINTN)(Destination - Source) > StrLen (Source));
+  ASSERT ((UINTN)(Source - Destination) >= Length);
+
+  ReturnValue = Destination;
+
+  while ((*Source != L'\0') && (Length > 0)) {
+    *(Destination++) = *(Source++);
+    Length--;
+  }
+
+  ZeroMem (Destination, Length * sizeof (*Destination));
+  return ReturnValue;
+}
+
+/**
+  Returns the length of a Null-terminated Unicode string.
+
+  This function returns the number of Unicode characters in the Null-terminated
+  Unicode string specified by String.
+
+  If String is NULL, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than
+  PcdMaximumUnicodeStringLength Unicode characters not including the 
+  Null-terminator, then ASSERT().
+
+  @param  String  Pointer to a Null-terminated Unicode string.
+
+  @return The length of String.
+
+**/
+UINTN
+EFIAPI
+StrLen (
+  IN      CONST CHAR16              *String
+  )
+{
+  UINTN                             Length;
+
+  ASSERT (String != NULL);
+
+  for (Length = 0; *String != L'\0'; String++, Length++) {
+    //
+    // If PcdMaximumUnicodeStringLength is not zero,
+    // length should not more than PcdMaximumUnicodeStringLength
+    //
+    if (PcdGet32 (PcdMaximumUnicodeStringLength) != 0) {
+      ASSERT (Length < PcdGet32 (PcdMaximumUnicodeStringLength));
+    }
+  }
+  return Length;
+}
+
+/**
+  Returns the size of a Null-terminated Unicode string in bytes, including the
+  Null terminator.
+
+  This function returns the size, in bytes, of the Null-terminated Unicode
+  string specified by String.
+
+  If String is NULL, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than
+  PcdMaximumUnicodeStringLength Unicode characters not including the 
+  Null-terminator, then ASSERT().
+
+  @param  String  Pointer to a Null-terminated Unicode string.
+
+  @return The size of String.
+
+**/
+UINTN
+EFIAPI
+StrSize (
+  IN      CONST CHAR16              *String
+  )
+{
+  return (StrLen (String) + 1) * sizeof (*String);
+}
+
+/**
+  Compares two Null-terminated Unicode strings, and returns the difference
+  between the first mismatched Unicode characters.
+
+  This function compares the Null-terminated Unicode string FirstString to the
+  Null-terminated Unicode string SecondString. If FirstString is identical to
+  SecondString, then 0 is returned. Otherwise, the value returned is the first
+  mismatched Unicode character in SecondString subtracted from the first
+  mismatched Unicode character in FirstString.
+
+  If FirstString is NULL, then ASSERT().
+  If SecondString is NULL, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more
+  than PcdMaximumUnicodeStringLength Unicode characters not including the 
+  Null-terminator, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more
+  than PcdMaximumUnicodeStringLength Unicode characters not including the 
+  Null-terminator, then ASSERT().
+
+  @param  FirstString   Pointer to a Null-terminated Unicode string.
+  @param  SecondString  Pointer to a Null-terminated Unicode string.
+
+  @retval 0   FirstString is identical to SecondString.
+  @retval !=0 FirstString is not identical to SecondString.
+
+**/
+INTN
+EFIAPI
+StrCmp (
+  IN      CONST CHAR16              *FirstString,
+  IN      CONST CHAR16              *SecondString
+  )
+{
+  //
+  // ASSERT both strings are less long than PcdMaximumUnicodeStringLength
+  //
+  ASSERT (StrSize (FirstString) != 0);
+  ASSERT (StrSize (SecondString) != 0);
+
+  while ((*FirstString != L'\0') && (*FirstString == *SecondString)) {
+    FirstString++;
+    SecondString++;
+  }
+  return *FirstString - *SecondString;
+}
+
+/**
+  Compares two Null-terminated Unicode strings with maximum lengths, and
+  returns the difference between the first mismatched Unicode characters.
+
+  This function compares the Null-terminated Unicode string FirstString to the
+  Null-terminated Unicode string SecondString. At most, Length Unicode
+  characters will be compared. If Length is 0, then 0 is returned. If
+  FirstString is identical to SecondString, then 0 is returned. Otherwise, the
+  value returned is the first mismatched Unicode character in SecondString
+  subtracted from the first mismatched Unicode character in FirstString.
+
+  If FirstString is NULL, then ASSERT().
+  If SecondString is NULL, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more
+  than PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and SecondString contains more
+  than PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  FirstString   Pointer to a Null-terminated Unicode string.
+  @param  SecondString  Pointer to a Null-terminated Unicode string.
+  @param  Length        Maximum number of Unicode characters to compare.
+
+  @retval 0   FirstString is identical to SecondString.
+  @retval !=0 FirstString is not identical to SecondString.
+
+**/
+INTN
+EFIAPI
+StrnCmp (
+  IN      CONST CHAR16              *FirstString,
+  IN      CONST CHAR16              *SecondString,
+  IN      UINTN                     Length
+  )
+{
+  if (Length == 0) {
+    return 0;
+  }
+
+  //
+  // ASSERT both strings are less long than PcdMaximumUnicodeStringLength.
+  // Length tests are performed inside StrLen().
+  //
+  ASSERT (StrSize (FirstString) != 0);
+  ASSERT (StrSize (SecondString) != 0);
+
+  while ((*FirstString != L'\0') &&
+         (*FirstString == *SecondString) &&
+         (Length > 1)) {
+    FirstString++;
+    SecondString++;
+    Length--;
+  }
+
+  return *FirstString - *SecondString;
+}
+
+/**
+  Concatenates one Null-terminated Unicode string to another Null-terminated
+  Unicode string, and returns the concatenated Unicode string.
+
+  This function concatenates two Null-terminated Unicode strings. The contents
+  of Null-terminated Unicode string Source are concatenated to the end of
+  Null-terminated Unicode string Destination. The Null-terminated concatenated
+  Unicode String is returned. If Source and Destination overlap, then the
+  results are undefined.
+
+  If Destination is NULL, then ASSERT().
+  If Source is NULL, then ASSERT().
+  If Source and Destination overlap, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and Destination contains more
+  than PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
+  PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination
+  and Source results in a Unicode string with more than
+  PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  Destination Pointer to a Null-terminated Unicode string.
+  @param  Source      Pointer to a Null-terminated Unicode string.
+
+  @return Destination
+
+**/
+CHAR16 *
+EFIAPI
+StrCat (
+  IN OUT  CHAR16                    *Destination,
+  IN      CONST CHAR16              *Source
+  )
+{
+  StrCpy (Destination + StrLen (Destination), Source);
+
+  //
+  // Size of the resulting string should never be zero.
+  // PcdMaximumUnicodeStringLength is tested inside StrLen().
+  //
+  ASSERT (StrSize (Destination) != 0);
+  return Destination;
+}
+
+/**
+  Concatenates one Null-terminated Unicode string with a maximum length to the
+  end of another Null-terminated Unicode string, and returns the concatenated
+  Unicode string.
+
+  This function concatenates two Null-terminated Unicode strings. The contents
+  of Null-terminated Unicode string Source are concatenated to the end of
+  Null-terminated Unicode string Destination, and Destination is returned. At
+  most, Length Unicode characters are concatenated from Source to the end of
+  Destination, and Destination is always Null-terminated. If Length is 0, then
+  Destination is returned unmodified. If Source and Destination overlap, then
+  the results are undefined.
+
+  If Destination is NULL, then ASSERT().
+  If Source is NULL, then ASSERT().
+  If Source and Destination overlap, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and Destination contains more
+  than PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than
+  PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and concatenating Destination
+  and Source results in a Unicode string with more than
+  PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  Destination Pointer to a Null-terminated Unicode string.
+  @param  Source      Pointer to a Null-terminated Unicode string.
+  @param  Length      Maximum number of Unicode characters to concatenate from
+                      Source.
+
+  @return Destination
+
+**/
+CHAR16 *
+EFIAPI
+StrnCat (
+  IN OUT  CHAR16                    *Destination,
+  IN      CONST CHAR16              *Source,
+  IN      UINTN                     Length
+  )
+{
+  StrnCpy (Destination + StrLen (Destination), Source, Length);
+
+  //
+  // Size of the resulting string should never be zero.
+  // PcdMaximumUnicodeStringLength is tested inside StrLen().
+  //
+  ASSERT (StrSize (Destination) != 0);
+  return Destination;
+}
+
+/**
+  Returns the first occurance of a Null-terminated Unicode sub-string 
+  in a Null-terminated Unicode string.
+
+  This function scans the contents of the Null-terminated Unicode string 
+  specified by String and returns the first occurrence of SearchString.  
+  If SearchString is not found in String, then NULL is returned.  If 
+  the length of SearchString is zero, then String is 
+  returned.
+  
+  If String is NULL, then ASSERT().
+  If String is not aligned on a 16-bit boundary, then ASSERT().
+  If SearchString is NULL, then ASSERT().
+  If SearchString is not aligned on a 16-bit boundary, then ASSERT().
+
+  If PcdMaximumUnicodeStringLength is not zero, and SearchString 
+  or String contains more than PcdMaximumUnicodeStringLength Unicode 
+  characters not including the Null-terminator, then ASSERT().
+
+  @param  String                                 Pointer to a Null-terminated Unicode string.
+  @param  SearchString Pointer to a Null-terminated Unicode string to search for.
+
+  @retval NULL            If the SearchString does not appear in String.
+  @retval !NULL           If there is a match.
+
+**/
+CHAR16 *
+EFIAPI
+StrStr (
+  IN      CONST CHAR16               *String,
+  IN      CONST CHAR16               *SearchString
+  )
+{
+  CONST CHAR16 *FirstMatch;
+  CONST CHAR16 *SearchStringTmp;
+
+  ASSERT (String != NULL);
+  ASSERT (((UINTN) String & 0x01) == 0);
+  ASSERT (SearchString != NULL);
+  ASSERT (((UINTN) SearchString & 0x01) == 0);
+
+  //
+  // If PcdMaximumUnicodeStringLength is not zero,
+  // length of String should not more than PcdMaximumUnicodeStringLength
+  //
+  if (PcdGet32 (PcdMaximumUnicodeStringLength) != 0) {
+    ASSERT (StrLen (String) < PcdGet32 (PcdMaximumUnicodeStringLength));
+  }
+
+  //
+  // If PcdMaximumUnicodeStringLength is not zero,
+  // length of SearchString should not more than PcdMaximumUnicodeStringLength
+  //
+  if (PcdGet32 (PcdMaximumUnicodeStringLength) != 0) {
+    ASSERT (StrLen (SearchString) < PcdGet32 (PcdMaximumAsciiStringLength));
+  }
+
+  while (*String != '\0') {
+    SearchStringTmp = SearchString;
+    FirstMatch = String;
+    
+    while ((*String == *SearchStringTmp) 
+            && (*SearchStringTmp != '\0') 
+            && (*String != '\0')) {
+      String++;
+      SearchStringTmp++;
+    } 
+    
+    if (*SearchStringTmp == '\0') {
+      return (CHAR16 *) FirstMatch;
+    }
+
+    if (SearchStringTmp == SearchString) {
+      //
+      // If no character from SearchString match,
+      // move the pointer to the String under search
+      // by one character.
+      //
+      String++;
+    }
+  }
+
+  return NULL;
+}
+
+/**
+  Check if a Unicode character is a decimal character.
+
+  This internal function checks if a Unicode character is a 
+  decimal character. The valid decimal character is from
+  L'0' to L'9'.
+
+
+  @param  Char  The character to check against.
+
+  @retval TRUE  If the Char is a decmial character.
+  @retval FALSE Otherwise.
+
+**/
+STATIC
+BOOLEAN
+InternalIsDecimalDigitCharacter (
+  IN      CHAR16                    Char
+  )
+{
+  return (BOOLEAN) (Char >= L'0' && Char <= L'9');
+}
+
+/**
+  Convert a Unicode character to upper case only if 
+  it maps to a valid small-case ASCII character.
+
+  This internal function only deal with Unicode character
+  which maps to a valid small-case ASII character, i.e.
+  L'a' to L'z'. For other Unicode character, the input character
+  is returned directly.
+
+
+  @param  Char  The character to convert.
+
+  @retval LowerCharacter   If the Char is with range L'a' to L'z'.
+  @retval Unchanged        Otherwise.
+
+**/
+STATIC
+CHAR16
+InternalCharToUpper (
+  IN      CHAR16                    Char
+  )
+{
+  if (Char >= L'a' && Char <= L'z') {
+    return Char - (L'a' - L'A');
+  }
+
+  return Char;
+}
+
+/**
+  Convert a Unicode character to numerical value.
+
+  This internal function only deal with Unicode character
+  which maps to a valid hexadecimal ASII character, i.e.
+  L'0' to L'9', L'a' to L'f' or L'A' to L'F'. For other 
+  Unicode character, the value returned does not make sense.
+
+  @param  Char  The character to convert.
+
+  @retval UINTN   The numerical value converted.
+
+**/
+STATIC
+UINTN
+InternalHexCharToUintn (
+  IN      CHAR16                    Char
+  )
+{
+  if (InternalIsDecimalDigitCharacter (Char)) {
+    return Char - L'0';
+  }
+
+  return (UINTN) (10 + InternalCharToUpper (Char) - L'A');
+}
+
+/**
+  Check if a Unicode character is a hexadecimal character.
+
+  This internal function checks if a Unicode character is a 
+  decimal character.  The valid hexadecimal character is 
+  L'0' to L'9', L'a' to L'f', or L'A' to L'F'.
+
+
+  @param  Char  The character to check against.
+
+  @retval TRUE  If the Char is a hexadecmial character.
+  @retval FALSE Otherwise.
+
+**/
+STATIC
+BOOLEAN
+InternalIsHexaDecimalDigitCharacter (
+  IN      CHAR16                    Char
+  )
+{
+
+  return (BOOLEAN) (InternalIsDecimalDigitCharacter (Char) ||
+    (Char >= L'A' && Char <= L'F') ||
+    (Char >= L'a' && Char <= L'f'));
+}
+
+/**
+  Convert a Null-terminated Unicode decimal string to a value of 
+  type UINTN.
+
+  This function returns a value of type UINTN by interpreting the contents 
+  of the Unicode string specified by String as a decimal number. The format 
+  of the input Unicode string String is:
+  
+                  [spaces] [decimal digits].
+                  
+  The valid decimal digit character is in the range [0-9]. The 
+  function will ignore the pad space, which includes spaces or 
+  tab characters, before [decimal digits]. The running zero in the 
+  beginning of [decimal digits] will be ignored. Then, the function 
+  stops at the first character that is a not a valid decimal character 
+  or a Null-terminator, whichever one comes first. 
+  
+  If String is NULL, then ASSERT().
+  If String is not aligned in a 16-bit boundary, then ASSERT().  
+  If String has only pad spaces, then 0 is returned.
+  If String has no pad spaces or valid decimal digits, 
+  then 0 is returned.
+  If the number represented by String overflows according 
+  to the range defined by UINTN, then ASSERT().
+  
+  If PcdMaximumUnicodeStringLength is not zero, and String contains 
+  more than PcdMaximumUnicodeStringLength Unicode characters not including 
+  the Null-terminator, then ASSERT().
+
+  @param  String                           Pointer to a Null-terminated Unicode string.
+
+  @retval UINTN           
+
+**/
+UINTN
+EFIAPI
+StrDecimalToUintn (
+  IN      CONST CHAR16               *String
+  )
+{
+  UINTN     Result;
+  
+  ASSERT (String != NULL);
+  ASSERT (((UINTN) String & 0x01) == 0);
+  ASSERT (StrLen (String) < PcdGet32 (PcdMaximumUnicodeStringLength));
+
+  //
+  // Ignore the pad spaces (space or tab)
+  //
+  while ((*String == L' ') || (*String == L'\t')) {
+    String++;
+  }
+
+  //
+  // Ignore leading Zeros after the spaces
+  //
+  while (*String == L'0') {
+    String++;
+  }
+
+  Result = 0;
+
+  while (InternalIsDecimalDigitCharacter (*String)) {
+    //
+    // If the number represented by String overflows according 
+    // to the range defined by UINTN, then ASSERT().
+    //
+    ASSERT ((Result < QUIENT_MAX_UINTN_DIVIDED_BY_10) ||
+      ((Result == QUIENT_MAX_UINTN_DIVIDED_BY_10) &&
+      (*String - L'0') <= REMINDER_MAX_UINTN_DIVIDED_BY_10)
+      );
+
+    Result = Result * 10 + (*String - L'0');
+    String++;
+  }
+  
+  return Result;
+}
+
+
+/**
+  Convert a Null-terminated Unicode decimal string to a value of 
+  type UINT64.
+
+  This function returns a value of type UINT64 by interpreting the contents 
+  of the Unicode string specified by String as a decimal number. The format 
+  of the input Unicode string String is:
+  
+                  [spaces] [decimal digits].
+                  
+  The valid decimal digit character is in the range [0-9]. The 
+  function will ignore the pad space, which includes spaces or 
+  tab characters, before [decimal digits]. The running zero in the 
+  beginning of [decimal digits] will be ignored. Then, the function 
+  stops at the first character that is a not a valid decimal character 
+  or a Null-terminator, whichever one comes first. 
+  
+  If String is NULL, then ASSERT().
+  If String is not aligned in a 16-bit boundary, then ASSERT().  
+  If String has only pad spaces, then 0 is returned.
+  If String has no pad spaces or valid decimal digits, 
+  then 0 is returned.
+  If the number represented by String overflows according 
+  to the range defined by UINT64, then ASSERT().
+  
+  If PcdMaximumUnicodeStringLength is not zero, and String contains 
+  more than PcdMaximumUnicodeStringLength Unicode characters not including 
+  the Null-terminator, then ASSERT().
+
+  @param  String                           Pointer to a Null-terminated Unicode string.
+
+  @retval UINT64           
+
+**/
+UINT64
+EFIAPI
+StrDecimalToUint64 (
+  IN      CONST CHAR16               *String
+  )
+{
+  UINT64     Result;
+  
+  ASSERT (String != NULL);
+  ASSERT (((UINTN) String & 0x01) == 0);
+  ASSERT (StrLen (String) < PcdGet32 (PcdMaximumUnicodeStringLength));
+
+  //
+  // Ignore the pad spaces (space or tab)
+  //
+  while ((*String == L' ') || (*String == L'\t')) {
+    String++;
+  }
+
+  //
+  // Ignore leading Zeros after the spaces
+  //
+  while (*String == L'0') {
+    String++;
+  }
+
+  Result = 0;
+
+  while (InternalIsDecimalDigitCharacter (*String)) {
+    //
+    // If the number represented by String overflows according 
+    // to the range defined by UINTN, then ASSERT().
+    //
+    ASSERT ((Result < QUIENT_MAX_UINT64_DIVIDED_BY_10) || 
+      ((Result == QUIENT_MAX_UINT64_DIVIDED_BY_10) && 
+      (*String - L'0') <= REMINDER_MAX_UINT64_DIVIDED_BY_10)
+      );
+
+    Result = MultU64x32 (Result, 10) + (*String - L'0');
+    String++;
+  }
+  
+  return Result;
+}
+
+/**
+  Convert a Null-terminated Unicode hexadecimal string to a value of type UINTN.
+
+  This function returns a value of type UINTN by interpreting the contents 
+  of the Unicode string specified by String as a hexadecimal number. 
+  The format of the input Unicode string String is:
+  
+                  [spaces][zeros][x][hexadecimal digits]. 
+
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. 
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. 
+  If "x" appears in the input string, it must be prefixed with at least one 0. 
+  The function will ignore the pad space, which includes spaces or tab characters, 
+  before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or 
+  [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the 
+  first valid hexadecimal digit. Then, the function stops at the first character that is 
+  a not a valid hexadecimal character or NULL, whichever one comes first.
+
+  If String is NULL, then ASSERT().
+  If String is not aligned in a 16-bit boundary, then ASSERT().
+  If String has only pad spaces, then zero is returned.
+  If String has no leading pad spaces, leading zeros or valid hexadecimal digits, 
+  then zero is returned.
+  If the number represented by String overflows according to the range defined by 
+  UINTN, then ASSERT().
+
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than 
+  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, 
+  then ASSERT().
+
+  @param  String                           Pointer to a Null-terminated Unicode string.
+
+  @retval UINTN
+
+**/
+UINTN
+EFIAPI
+StrHexToUintn (
+  IN      CONST CHAR16               *String
+  )
+{
+  UINTN     Result;
+
+  ASSERT (String != NULL);
+  ASSERT (StrLen (String) < PcdGet32 (PcdMaximumUnicodeStringLength));
+  
+  //
+  // Ignore the pad spaces (space or tab) 
+  //
+  while ((*String == L' ') || (*String == L'\t')) {
+    String++;
+  }
+
+  //
+  // Ignore leading Zeros after the spaces
+  //
+  while (*String == L'0') {
+    String++;
+  }
+
+  if (InternalCharToUpper (*String) == L'X') {
+    ASSERT (*(String - 1)  == L'0');
+    if (*(String - 1)  != L'0') {
+      return 0;
+    }
+    //
+    // Skip the 'X'
+    //
+    String++;
+  }
+
+  Result = 0;
+  
+  while (InternalIsHexaDecimalDigitCharacter (*String)) {
+    //
+    // If the Hex Number represented by String overflows according 
+    // to the range defined by UINTN, then ASSERT().
+    //
+    ASSERT ((Result < QUIENT_MAX_UINTN_DIVIDED_BY_16) ||
+      ((Result == QUIENT_MAX_UINTN_DIVIDED_BY_16) && 
+      (InternalHexCharToUintn (*String) <= REMINDER_MAX_UINTN_DIVIDED_BY_16))
+      );
+
+    Result = (Result << 4) + InternalHexCharToUintn (*String);
+    String++;
+  }
+
+  return Result;
+}
+
+
+/**
+  Convert a Null-terminated Unicode hexadecimal string to a value of type UINT64.
+
+  This function returns a value of type UINT64 by interpreting the contents 
+  of the Unicode string specified by String as a hexadecimal number. 
+  The format of the input Unicode string String is 
+  
+                  [spaces][zeros][x][hexadecimal digits]. 
+
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. 
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. 
+  If "x" appears in the input string, it must be prefixed with at least one 0. 
+  The function will ignore the pad space, which includes spaces or tab characters, 
+  before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or 
+  [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the 
+  first valid hexadecimal digit. Then, the function stops at the first character that is 
+  a not a valid hexadecimal character or NULL, whichever one comes first.
+
+  If String is NULL, then ASSERT().
+  If String is not aligned in a 16-bit boundary, then ASSERT().
+  If String has only pad spaces, then zero is returned.
+  If String has no leading pad spaces, leading zeros or valid hexadecimal digits, 
+  then zero is returned.
+  If the number represented by String overflows according to the range defined by 
+  UINT64, then ASSERT().
+
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than 
+  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, 
+  then ASSERT().
+
+  @param  String                           Pointer to a Null-terminated Unicode string.
+
+  @retval UINT64
+
+**/
+UINT64
+EFIAPI
+StrHexToUint64 (
+  IN      CONST CHAR16               *String
+  )
+{
+  UINT64    Result;
+
+  ASSERT (String != NULL);
+  ASSERT (StrLen (String) < PcdGet32 (PcdMaximumUnicodeStringLength));
+  
+  //
+  // Ignore the pad spaces (space or tab) 
+  //
+  while ((*String == L' ') || (*String == L'\t')) {
+    String++;
+  }
+
+  //
+  // Ignore leading Zeros after the spaces
+  //
+  while (*String == L'0') {
+    String++;
+  }
+
+  if (InternalCharToUpper (*String) == L'X') {
+    ASSERT (*(String - 1)  == L'0');
+    if (*(String - 1)  != L'0') {
+      return 0;
+    }
+    //
+    // Skip the 'X'
+    //
+    String++;
+  }
+
+  Result = 0;
+  
+  while (InternalIsHexaDecimalDigitCharacter (*String)) {
+    //
+    // If the Hex Number represented by String overflows according 
+    // to the range defined by UINTN, then ASSERT().
+    //
+    ASSERT ((Result < QUIENT_MAX_UINT64_DIVIDED_BY_16)|| 
+      ((Result == QUIENT_MAX_UINT64_DIVIDED_BY_16) && 
+      (InternalHexCharToUintn (*String) <= REMINDER_MAX_UINT64_DIVIDED_BY_16))
+      );
+
+    Result = LShiftU64 (Result, 4) + InternalHexCharToUintn (*String);
+    String++;
+  }
+
+  return Result;
+}
+
+/**
+  Check if a ASCII character is a decimal character.
+
+  This internal function checks if a Unicode character is a 
+  decimal character. The valid decimal character is from
+  '0' to '9'.
+
+  @param  Char  The character to check against.
+
+  @retval TRUE  If the Char is a decmial character.
+  @retval FALSE Otherwise.
+
+**/
+STATIC
+BOOLEAN
+InternalAsciiIsDecimalDigitCharacter (
+  IN      CHAR8                     Char
+  )
+{
+  return (BOOLEAN) (Char >= '0' && Char <= '9');
+}
+
+/**
+  Check if a ASCII character is a hexadecimal character.
+
+  This internal function checks if a ASCII character is a 
+  decimal character.  The valid hexadecimal character is 
+  L'0' to L'9', L'a' to L'f', or L'A' to L'F'.
+
+
+  @param  Char  The character to check against.
+
+  @retval TRUE  If the Char is a hexadecmial character.
+  @retval FALSE Otherwise.
+
+**/
+STATIC
+BOOLEAN
+InternalAsciiIsHexaDecimalDigitCharacter (
+  IN      CHAR8                    Char
+  )
+{
+
+  return (BOOLEAN) (InternalAsciiIsDecimalDigitCharacter (Char) ||
+    (Char >= 'A' && Char <= 'F') ||
+    (Char >= 'a' && Char <= 'f'));
+}
+
+/**
+  Convert a Null-terminated Unicode string to a Null-terminated 
+  ASCII string and returns the ASCII string.
+  
+  This function converts the content of the Unicode string Source 
+  to the ASCII string Destination by copying the lower 8 bits of 
+  each Unicode character. It returns Destination. The function terminates 
+  the ASCII string Destination  by appending a Null-terminator character 
+  at the end. The caller is responsible to make sure Destination points 
+  to a buffer with size equal or greater than (StrLen (Source) + 1) in bytes.
+
+  If Destination is NULL, then ASSERT().
+  If Source is NULL, then ASSERT().
+  If Source is not aligned on a 16-bit boundary, then ASSERT().
+  If Source and Destination overlap, then ASSERT().
+
+  If any Unicode characters in Source contain non-zero value in 
+  the upper 8 bits, then ASSERT().
+  
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains 
+  more than PcdMaximumUnicodeStringLength Unicode characters not including 
+  the Null-terminator, then ASSERT().
+  
+  If PcdMaximumAsciiStringLength is not zero, and Source contains more 
+  than PcdMaximumAsciiStringLength Unicode characters not including the 
+  Null-terminator, then ASSERT().
+
+  @param  Source        Pointer to a Null-terminated Unicode string.
+  @param  Destination   Pointer to a Null-terminated ASCII string.
+
+  @reture Destination
+
+**/
+CHAR8 *
+EFIAPI
+UnicodeStrToAsciiStr (
+  IN      CONST CHAR16               *Source,
+  OUT    CHAR8                           *Destination
+  )
+{
+  ASSERT (Destination != NULL);
+  ASSERT (Source != NULL);
+
+  //
+  // Source and Destination should not overlap
+  //
+  ASSERT ((UINTN) ((CHAR16 *) Destination -  Source) > StrLen (Source));
+  ASSERT ((UINTN) ((CHAR8 *) Source - Destination) > StrLen (Source));
+
+  //
+  // If PcdMaximumUnicodeStringLength is not zero,
+  // length of Source should not more than PcdMaximumUnicodeStringLength
+  //
+  if (PcdGet32 (PcdMaximumUnicodeStringLength) != 0) {
+    ASSERT (StrLen (Source) < PcdGet32 (PcdMaximumUnicodeStringLength));
+  }
+
+  while (*Source != '\0') {
+    //
+    // If any Unicode characters in Source contain 
+    // non-zero value in the upper 8 bits, then ASSERT().
+    //
+    ASSERT (*Source < 0x100);
+    *(Destination++) = (CHAR8) *(Source++);
+  }
+
+  *Destination = '\0';
+  
+  return Destination;
+}
+
+
+/**
+  Copies one Null-terminated ASCII string to another Null-terminated ASCII
+  string and returns the new ASCII string.
+
+  This function copies the contents of the ASCII string Source to the ASCII
+  string Destination, and returns Destination. If Source and Destination
+  overlap, then the results are undefined.
+
+  If Destination is NULL, then ASSERT().
+  If Source is NULL, then ASSERT().
+  If Source and Destination overlap, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and Source contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+
+  @param  Destination Pointer to a Null-terminated ASCII string.
+  @param  Source      Pointer to a Null-terminated ASCII string.
+
+  @return Destination
+
+**/
+CHAR8 *
+EFIAPI
+AsciiStrCpy (
+  OUT     CHAR8                     *Destination,
+  IN      CONST CHAR8               *Source
+  )
+{
+  CHAR8                             *ReturnValue;
+
+  //
+  // Destination cannot be NULL
+  //
+  ASSERT (Destination != NULL);
+
+  //
+  // Destination and source cannot overlap
+  //
+  ASSERT ((UINTN)(Destination - Source) > AsciiStrLen (Source));
+  ASSERT ((UINTN)(Source - Destination) > AsciiStrLen (Source));
+
+  ReturnValue = Destination;
+  while (*Source) {
+    *(Destination++) = *(Source++);
+  }
+  *Destination = 0;
+  return ReturnValue;
+}
+
+/**
+  Copies one Null-terminated ASCII string with a maximum length to another
+  Null-terminated ASCII string with a maximum length and returns the new ASCII
+  string.
+
+  This function copies the contents of the ASCII string Source to the ASCII
+  string Destination, and returns Destination. At most, Length ASCII characters
+  are copied from Source to Destination. If Length is 0, then Destination is
+  returned unmodified. If Length is greater that the number of ASCII characters
+  in Source, then Destination is padded with Null ASCII characters. If Source
+  and Destination overlap, then the results are undefined.
+
+  If Destination is NULL, then ASSERT().
+  If Source is NULL, then ASSERT().
+  If Source and Destination overlap, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and Source contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+
+  @param  Destination Pointer to a Null-terminated ASCII string.
+  @param  Source      Pointer to a Null-terminated ASCII string.
+  @param  Length      Maximum number of ASCII characters to copy.
+
+  @return Destination
+
+**/
+CHAR8 *
+EFIAPI
+AsciiStrnCpy (
+  OUT     CHAR8                     *Destination,
+  IN      CONST CHAR8               *Source,
+  IN      UINTN                     Length
+  )
+{
+  CHAR8                             *ReturnValue;
+
+  if (Length == 0) {
+    return Destination;
+  }
+
+  //
+  // Destination cannot be NULL
+  //
+  ASSERT (Destination != NULL);
+
+  //
+  // Destination and source cannot overlap
+  //
+  ASSERT ((UINTN)(Destination - Source) > AsciiStrLen (Source));
+  ASSERT ((UINTN)(Source - Destination) >= Length);
+
+  ReturnValue = Destination;
+
+  while (*Source && Length > 0) {
+    *(Destination++) = *(Source++);
+    Length--;
+  }
+
+  ZeroMem (Destination, Length * sizeof (*Destination));
+  return ReturnValue;
+}
+
+/**
+  Returns the length of a Null-terminated ASCII string.
+
+  This function returns the number of ASCII characters in the Null-terminated
+  ASCII string specified by String.
+
+  If String is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and String contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+
+  @param  String  Pointer to a Null-terminated ASCII string.
+
+  @return The length of String.
+
+**/
+UINTN
+EFIAPI
+AsciiStrLen (
+  IN      CONST CHAR8               *String
+  )
+{
+  UINTN                             Length;
+
+  ASSERT (String != NULL);
+
+  for (Length = 0; *String != '\0'; String++, Length++) {
+    //
+    // If PcdMaximumUnicodeStringLength is not zero,
+    // length should not more than PcdMaximumUnicodeStringLength
+    //
+    if (PcdGet32 (PcdMaximumAsciiStringLength) != 0) {
+      ASSERT (Length < PcdGet32 (PcdMaximumAsciiStringLength));
+    }
+  }
+  return Length;
+}
+
+/**
+  Returns the size of a Null-terminated ASCII string in bytes, including the
+  Null terminator.
+
+  This function returns the size, in bytes, of the Null-terminated ASCII string
+  specified by String.
+
+  If String is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and String contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+
+  @param  String  Pointer to a Null-terminated ASCII string.
+
+  @return The size of String.
+
+**/
+UINTN
+EFIAPI
+AsciiStrSize (
+  IN      CONST CHAR8               *String
+  )
+{
+  return (AsciiStrLen (String) + 1) * sizeof (*String);
+}
+
+/**
+  Compares two Null-terminated ASCII strings, and returns the difference
+  between the first mismatched ASCII characters.
+
+  This function compares the Null-terminated ASCII string FirstString to the
+  Null-terminated ASCII string SecondString. If FirstString is identical to
+  SecondString, then 0 is returned. Otherwise, the value returned is the first
+  mismatched ASCII character in SecondString subtracted from the first
+  mismatched ASCII character in FirstString.
+
+  If FirstString is NULL, then ASSERT().
+  If SecondString is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and FirstString contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and SecondString contains more
+  than PcdMaximumAsciiStringLength ASCII characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  FirstString   Pointer to a Null-terminated ASCII string.
+  @param  SecondString  Pointer to a Null-terminated ASCII string.
+
+  @retval 0   FirstString is identical to SecondString.
+  @retval !=0 FirstString is not identical to SecondString.
+
+**/
+INTN
+EFIAPI
+AsciiStrCmp (
+  IN      CONST CHAR8               *FirstString,
+  IN      CONST CHAR8               *SecondString
+  )
+{
+  //
+  // ASSERT both strings are less long than PcdMaximumAsciiStringLength
+  //
+  ASSERT (AsciiStrSize (FirstString));
+  ASSERT (AsciiStrSize (SecondString));
+
+  while ((*FirstString != '\0') && (*FirstString == *SecondString)) {
+    FirstString++;
+    SecondString++;
+  }
+
+  return *FirstString - *SecondString;
+}
+
+/**
+  Converts a lowercase Ascii character to upper one
+
+  If Chr is lowercase Ascii character, then converts it to upper one.
+
+  If Value >= 0xA0, then ASSERT().
+  If (Value & 0x0F) >= 0x0A, then ASSERT().
+
+  @param  chr   one Ascii character
+
+  @return The uppercase value of Ascii character 
+
+**/
+STATIC
+CHAR8
+AsciiToUpper (
+  IN      CHAR8                     Chr
+  )
+{
+  return (UINT8) ((Chr >= 'a' && Chr <= 'z') ? Chr - ('a' - 'A') : Chr);
+}
+
+/**
+  Convert a ASCII character to numerical value.
+
+  This internal function only deal with Unicode character
+  which maps to a valid hexadecimal ASII character, i.e.
+  '0' to '9', 'a' to 'f' or 'A' to 'F'. For other 
+  ASCII character, the value returned does not make sense.
+
+  @param  Char  The character to convert.
+
+  @retval UINTN   The numerical value converted.
+
+**/
+STATIC
+UINTN
+InternalAsciiHexCharToUintn (
+  IN      CHAR8                    Char
+  )
+{
+  if (InternalIsDecimalDigitCharacter (Char)) {
+    return Char - '0';
+  }
+
+  return (UINTN) (10 + AsciiToUpper (Char) - 'A');
+}
+
+
+/**
+  Performs a case insensitive comparison of two Null-terminated ASCII strings,
+  and returns the difference between the first mismatched ASCII characters.
+
+  This function performs a case insensitive comparison of the Null-terminated
+  ASCII string FirstString to the Null-terminated ASCII string SecondString. If
+  FirstString is identical to SecondString, then 0 is returned. Otherwise, the
+  value returned is the first mismatched lower case ASCII character in
+  SecondString subtracted from the first mismatched lower case ASCII character
+  in FirstString.
+
+  If FirstString is NULL, then ASSERT().
+  If SecondString is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and FirstString contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and SecondString contains more
+  than PcdMaximumAsciiStringLength ASCII characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  FirstString   Pointer to a Null-terminated ASCII string.
+  @param  SecondString  Pointer to a Null-terminated ASCII string.
+
+  @retval 0   FirstString is identical to SecondString using case insensitive
+              comparisons.
+  @retval !=0 FirstString is not identical to SecondString using case
+              insensitive comparisons.
+
+**/
+INTN
+EFIAPI
+AsciiStriCmp (
+  IN      CONST CHAR8               *FirstString,
+  IN      CONST CHAR8               *SecondString
+  )
+{
+  CHAR8  UpperFirstString;
+  CHAR8  UpperSecondString;
+
+  //
+  // ASSERT both strings are less long than PcdMaximumAsciiStringLength
+  //
+  ASSERT (AsciiStrSize (FirstString));
+  ASSERT (AsciiStrSize (SecondString));
+
+  UpperFirstString  = AsciiToUpper (*FirstString);
+  UpperSecondString = AsciiToUpper (*SecondString);
+  while ((*FirstString != '\0') && (UpperFirstString == UpperSecondString)) {
+    FirstString++;
+    SecondString++;
+    UpperFirstString  = AsciiToUpper (*FirstString);
+    UpperSecondString = AsciiToUpper (*SecondString);
+  }
+
+  return UpperFirstString - UpperSecondString;
+}
+
+/**
+  Compares two Null-terminated ASCII strings with maximum lengths, and returns
+  the difference between the first mismatched ASCII characters.
+
+  This function compares the Null-terminated ASCII string FirstString to the
+  Null-terminated ASCII  string SecondString. At most, Length ASCII characters
+  will be compared. If Length is 0, then 0 is returned. If FirstString is
+  identical to SecondString, then 0 is returned. Otherwise, the value returned
+  is the first mismatched ASCII character in SecondString subtracted from the
+  first mismatched ASCII character in FirstString.
+
+  If FirstString is NULL, then ASSERT().
+  If SecondString is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and FirstString contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and SecondString contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+
+  @param  FirstString   Pointer to a Null-terminated ASCII string.
+  @param  SecondString  Pointer to a Null-terminated ASCII string.
+
+  @retval 0   FirstString is identical to SecondString.
+  @retval !=0 FirstString is not identical to SecondString.
+
+**/
+INTN
+EFIAPI
+AsciiStrnCmp (
+  IN      CONST CHAR8               *FirstString,
+  IN      CONST CHAR8               *SecondString,
+  IN      UINTN                     Length
+  )
+{
+  if (Length == 0) {
+    return 0;
+  }
+
+  //
+  // ASSERT both strings are less long than PcdMaximumAsciiStringLength
+  //
+  ASSERT (AsciiStrSize (FirstString));
+  ASSERT (AsciiStrSize (SecondString));
+
+  while ((*FirstString != '\0') &&
+         (*FirstString == *SecondString) &&
+         (Length > 1)) {
+    FirstString++;
+    SecondString++;
+    Length--;
+  }
+  return *FirstString - *SecondString;
+}
+
+/**
+  Concatenates one Null-terminated ASCII string to another Null-terminated
+  ASCII string, and returns the concatenated ASCII string.
+
+  This function concatenates two Null-terminated ASCII strings. The contents of
+  Null-terminated ASCII string Source are concatenated to the end of Null-
+  terminated ASCII string Destination. The Null-terminated concatenated ASCII
+  String is returned.
+
+  If Destination is NULL, then ASSERT().
+  If Source is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and Destination contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and Source contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero and concatenating Destination and
+  Source results in a ASCII string with more than PcdMaximumAsciiStringLength
+  ASCII characters, then ASSERT().
+
+  @param  Destination Pointer to a Null-terminated ASCII string.
+  @param  Source      Pointer to a Null-terminated ASCII string.
+
+  @return Destination
+
+**/
+CHAR8 *
+EFIAPI
+AsciiStrCat (
+  IN OUT CHAR8    *Destination,
+  IN CONST CHAR8  *Source
+  )
+{
+  AsciiStrCpy (Destination + AsciiStrLen (Destination), Source);
+
+  //
+  // Size of the resulting string should never be zero.
+  // PcdMaximumUnicodeStringLength is tested inside StrLen().
+  //
+  ASSERT (AsciiStrSize (Destination) != 0);
+  return Destination;
+}
+
+/**
+  Concatenates one Null-terminated ASCII string with a maximum length to the
+  end of another Null-terminated ASCII string, and returns the concatenated
+  ASCII string.
+
+  This function concatenates two Null-terminated ASCII strings. The contents
+  of Null-terminated ASCII string Source are concatenated to the end of Null-
+  terminated ASCII string Destination, and Destination is returned. At most,
+  Length ASCII characters are concatenated from Source to the end of
+  Destination, and Destination is always Null-terminated. If Length is 0, then
+  Destination is returned unmodified. If Source and Destination overlap, then
+  the results are undefined.
+
+  If Destination is NULL, then ASSERT().
+  If Source is NULL, then ASSERT().
+  If Source and Destination overlap, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and Destination contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and Source contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,
+  then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and concatenating Destination and
+  Source results in a ASCII string with more than PcdMaximumAsciiStringLength
+  ASCII characters not including the Null-terminator, then ASSERT().
+
+  @param  Destination Pointer to a Null-terminated ASCII string.
+  @param  Source      Pointer to a Null-terminated ASCII string.
+  @param  Length      Maximum number of ASCII characters to concatenate from
+                      Source.
+
+  @return Destination
+
+**/
+CHAR8 *
+EFIAPI
+AsciiStrnCat (
+  IN OUT  CHAR8                     *Destination,
+  IN      CONST CHAR8               *Source,
+  IN      UINTN                     Length
+  )
+{
+  AsciiStrnCpy (Destination + AsciiStrLen (Destination), Source, Length);
+
+  //
+  // Size of the resulting string should never be zero.
+  // PcdMaximumUnicodeStringLength is tested inside StrLen().
+  //
+  ASSERT (AsciiStrSize (Destination) != 0);
+  return Destination;
+}
+
+/**
+  Returns the first occurance of a Null-terminated ASCII sub-string 
+  in a Null-terminated ASCII string.
+
+  This function scans the contents of the ASCII string specified by String 
+  and returns the first occurrence of SearchString. If SearchString is not 
+  found in String, then NULL is returned. If the length of SearchString is zero, 
+  then String is returned.
+  
+  If String is NULL, then ASSERT().
+  If SearchString is NULL, then ASSERT().
+
+  If PcdMaximumAsciiStringLength is not zero, and SearchString or 
+  String contains more than PcdMaximumAsciiStringLength Unicode characters 
+  not including the Null-terminator, then ASSERT().
+
+  @param  String                                 Pointer to a Null-terminated ASCII string.
+  @param  SearchString   Pointer to a Null-terminated ASCII string to search for.
+
+  @retval NULL            If the SearchString does not appear in String.
+  @retval !NULL           If there is a match.
+
+**/
+CHAR8 *
+EFIAPI
+AsciiStrStr (
+  IN      CONST CHAR8                *String,
+  IN      CONST CHAR8             *SearchString
+  )
+{
+  CONST CHAR8 *FirstMatch;
+  CONST CHAR8 *SearchStringTmp;
+
+  ASSERT (String != NULL);
+  ASSERT (SearchString != NULL);
+
+  //
+  // If PcdMaximumUnicodeStringLength is not zero,
+  // length of String should not more than PcdMaximumUnicodeStringLength
+  //
+  if (PcdGet32 (PcdMaximumAsciiStringLength) != 0) {
+    ASSERT (AsciiStrLen (String) < PcdGet32 (PcdMaximumAsciiStringLength));
+  }
+
+  //
+  // If PcdMaximumUnicodeStringLength is not zero,
+  // length of SearchString should not more than PcdMaximumUnicodeStringLength
+  //
+  if (PcdGet32 (PcdMaximumAsciiStringLength) != 0) {
+    ASSERT (AsciiStrLen (SearchString) < PcdGet32 (PcdMaximumAsciiStringLength));
+  }
+
+  while (*String != '\0') {
+    SearchStringTmp = SearchString;
+    FirstMatch = String;
+    
+    while ((*String == *SearchStringTmp) 
+            && (*SearchStringTmp != '\0') 
+            && (*String != '\0')) {
+      String++;
+      SearchStringTmp++;
+    } 
+    
+    if (*SearchStringTmp == '\0') {
+      return (CHAR8 *) FirstMatch;
+    }
+
+    if (SearchStringTmp == SearchString) {
+      //
+      // If no character from SearchString match,
+      // move the pointer to the String under search
+      // by one character.
+      //
+      String++;
+    }
+
+  }
+
+  return NULL;
+}
+
+/**
+  Convert a Null-terminated ASCII decimal string to a value of type 
+  UINTN.
+
+  This function returns a value of type UINTN by interpreting the contents 
+  of the ASCII string String as a decimal number. The format of the input 
+  ASCII string String is:
+  
+                    [spaces] [decimal digits].
+  
+  The valid decimal digit character is in the range [0-9]. The function will 
+  ignore the pad space, which includes spaces or tab characters, before the digits. 
+  The running zero in the beginning of [decimal digits] will be ignored. Then, the 
+  function stops at the first character that is a not a valid decimal character or 
+  Null-terminator, whichever on comes first.
+  
+  If String has only pad spaces, then 0 is returned.
+  If String has no pad spaces or valid decimal digits, then 0 is returned.
+  If the number represented by String overflows according to the range defined by 
+  UINTN, then ASSERT().
+  If String is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and String contains more than 
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, 
+  then ASSERT().
+
+  @param  String                           Pointer to a Null-terminated ASCII string.
+
+  @retval UINTN           
+
+**/
+UINTN
+EFIAPI
+AsciiStrDecimalToUintn (
+  IN      CONST CHAR8                  *String
+  )
+{
+  UINTN     Result;
+  
+  ASSERT (String != NULL);
+  ASSERT (AsciiStrLen (String) < PcdGet32 (PcdMaximumAsciiStringLength));
+
+  //
+  // Ignore the pad spaces (space or tab)
+  //
+  while ((*String == ' ') || (*String == '\t')) {
+    String++;
+  }
+
+  //
+  // Ignore leading Zeros after the spaces
+  //
+  while (*String == '0') {
+    String++;
+  }
+
+  Result = 0;
+
+  while (InternalAsciiIsDecimalDigitCharacter (*String)) {
+    //
+    // If the number represented by String overflows according 
+    // to the range defined by UINTN, then ASSERT().
+    //
+    ASSERT ((Result < QUIENT_MAX_UINTN_DIVIDED_BY_10) ||
+      ((Result == QUIENT_MAX_UINTN_DIVIDED_BY_10) && 
+      (*String - '0') <= REMINDER_MAX_UINTN_DIVIDED_BY_10)
+      );
+
+    Result = Result * 10 + (*String - '0');
+    String++;
+  }
+  
+  return Result;
+}
+
+
+/**
+  Convert a Null-terminated ASCII decimal string to a value of type 
+  UINT64.
+
+  This function returns a value of type UINT64 by interpreting the contents 
+  of the ASCII string String as a decimal number. The format of the input 
+  ASCII string String is:
+  
+                    [spaces] [decimal digits].
+  
+  The valid decimal digit character is in the range [0-9]. The function will 
+  ignore the pad space, which includes spaces or tab characters, before the digits. 
+  The running zero in the beginning of [decimal digits] will be ignored. Then, the 
+  function stops at the first character that is a not a valid decimal character or 
+  Null-terminator, whichever on comes first.
+  
+  If String has only pad spaces, then 0 is returned.
+  If String has no pad spaces or valid decimal digits, then 0 is returned.
+  If the number represented by String overflows according to the range defined by 
+  UINT64, then ASSERT().
+  If String is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and String contains more than 
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, 
+  then ASSERT().
+
+  @param  String                           Pointer to a Null-terminated ASCII string.
+
+  @retval UINT64           
+
+**/
+UINT64
+EFIAPI
+AsciiStrDecimalToUint64 (
+  IN      CONST CHAR8                *String
+  )
+{
+  UINT64     Result;
+  
+  ASSERT (String != NULL);
+  ASSERT (AsciiStrLen (String) < PcdGet32 (PcdMaximumAsciiStringLength));
+
+  //
+  // Ignore the pad spaces (space or tab)
+  //
+  while ((*String == ' ') || (*String == '\t')) {
+    String++;
+  }
+
+  //
+  // Ignore leading Zeros after the spaces
+  //
+  while (*String == '0') {
+    String++;
+  }
+
+  Result = 0;
+
+  while (InternalAsciiIsDecimalDigitCharacter (*String)) {
+    //
+    // If the number represented by String overflows according 
+    // to the range defined by UINTN, then ASSERT().
+    //
+    ASSERT ((Result < QUIENT_MAX_UINT64_DIVIDED_BY_10) || 
+      ((Result == QUIENT_MAX_UINT64_DIVIDED_BY_10) && 
+      (*String - '0') <= REMINDER_MAX_UINT64_DIVIDED_BY_10)
+      );
+
+    Result = MultU64x32 (Result, 10) + (*String - '0');
+    String++;
+  }
+  
+  return Result;
+}
+
+/**
+  Convert a Null-terminated ASCII hexadecimal string to a value of type UINTN.
+
+  This function returns a value of type UINTN by interpreting the contents of 
+  the ASCII string String as a hexadecimal number. The format of the input ASCII 
+  string String is:
+  
+                  [spaces][zeros][x][hexadecimal digits].
+                  
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. 
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x" 
+  appears in the input string, it must be prefixed with at least one 0. The function 
+  will ignore the pad space, which includes spaces or tab characters, before [zeros], 
+  [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits] 
+  will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal 
+  digit. Then, the function stops at the first character that is a not a valid 
+  hexadecimal character or Null-terminator, whichever on comes first.
+  
+  If String has only pad spaces, then 0 is returned.
+  If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then
+  0 is returned.
+
+  If the number represented by String overflows according to the range defined by UINTN, 
+  then ASSERT().
+  If String is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, 
+  and String contains more than PcdMaximumAsciiStringLength ASCII characters not including 
+  the Null-terminator, then ASSERT().
+
+  @param  String                           Pointer to a Null-terminated ASCII string.
+
+  @retval UINTN
+
+**/
+UINTN
+EFIAPI
+AsciiStrHexToUintn (
+  IN      CONST CHAR8                *String
+  )
+{
+  UINTN     Result;
+
+  ASSERT (String != NULL);
+  ASSERT (AsciiStrLen (String) < PcdGet32 (PcdMaximumAsciiStringLength));
+  
+  //
+  // Ignore the pad spaces (space or tab) 
+  //
+  while ((*String == ' ') || (*String == '\t')) {
+    String++;
+  }
+
+  //
+  // Ignore leading Zeros after the spaces
+  //
+  while (*String == '0') {
+    String++;
+  }
+
+  if (AsciiToUpper (*String) == 'X') {
+    ASSERT (*(String - 1)  == '0');
+    if (*(String - 1)  != '0') {
+      return 0;
+    }
+    //
+    // Skip the 'X'
+    //
+    String++;
+  }
+
+  Result = 0;
+  
+  while (InternalAsciiIsHexaDecimalDigitCharacter (*String)) {
+    //
+    // If the Hex Number represented by String overflows according 
+    // to the range defined by UINTN, then ASSERT().
+    //
+     ASSERT ((Result < QUIENT_MAX_UINTN_DIVIDED_BY_16) ||
+       ((Result == QUIENT_MAX_UINTN_DIVIDED_BY_16) && 
+       (InternalAsciiHexCharToUintn (*String) <= REMINDER_MAX_UINTN_DIVIDED_BY_16))
+       );
+
+    Result = (Result << 4) + InternalAsciiHexCharToUintn (*String);
+    String++;
+  }
+
+  return Result;
+}
+
+
+/**
+  Convert a Null-terminated ASCII hexadecimal string to a value of type UINT64.
+
+  This function returns a value of type UINT64 by interpreting the contents of 
+  the ASCII string String as a hexadecimal number. The format of the input ASCII 
+  string String is:
+  
+                  [spaces][zeros][x][hexadecimal digits].
+                  
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F]. 
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x" 
+  appears in the input string, it must be prefixed with at least one 0. The function 
+  will ignore the pad space, which includes spaces or tab characters, before [zeros], 
+  [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits] 
+  will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal 
+  digit. Then, the function stops at the first character that is a not a valid 
+  hexadecimal character or Null-terminator, whichever on comes first.
+  
+  If String has only pad spaces, then 0 is returned.
+  If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then
+  0 is returned.
+
+  If the number represented by String overflows according to the range defined by UINT64, 
+  then ASSERT().
+  If String is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, 
+  and String contains more than PcdMaximumAsciiStringLength ASCII characters not including 
+  the Null-terminator, then ASSERT().
+
+  @param  String                           Pointer to a Null-terminated ASCII string.
+
+  @retval UINT64
+
+**/
+UINT64
+EFIAPI
+AsciiStrHexToUint64 (
+  IN      CONST CHAR8                *String
+  )
+{
+  UINT64    Result;
+
+  ASSERT (String != NULL);
+  ASSERT (AsciiStrLen (String) < PcdGet32 (PcdMaximumUnicodeStringLength));
+  
+  //
+  // Ignore the pad spaces (space or tab) and leading Zeros
+  //
+  //
+  // Ignore the pad spaces (space or tab) 
+  //
+  while ((*String == ' ') || (*String == '\t')) {
+    String++;
+  }
+
+  //
+  // Ignore leading Zeros after the spaces
+  //
+  while (*String == '0') {
+    String++;
+  }
+
+  if (AsciiToUpper (*String) == 'X') {
+    ASSERT (*(String - 1)  == '0');
+    if (*(String - 1)  != '0') {
+      return 0;
+    }
+    //
+    // Skip the 'X'
+    //
+    String++;
+  }
+
+  Result = 0;
+  
+  while (InternalAsciiIsHexaDecimalDigitCharacter (*String)) {
+    //
+    // If the Hex Number represented by String overflows according 
+    // to the range defined by UINTN, then ASSERT().
+    //
+    ASSERT ((Result < QUIENT_MAX_UINT64_DIVIDED_BY_16) ||
+      ((Result == QUIENT_MAX_UINT64_DIVIDED_BY_16) && 
+      (InternalAsciiHexCharToUintn (*String) <= REMINDER_MAX_UINT64_DIVIDED_BY_16))
+      );
+
+    Result = LShiftU64 (Result, 4) + InternalAsciiHexCharToUintn (*String);
+    String++;
+  }
+
+  return Result;
+}
+
+
+/**
+  Convert one Null-terminated ASCII string to a Null-terminated 
+  Unicode string and returns the Unicode string.
+
+  This function converts the contents of the ASCII string Source to the Unicode 
+  string Destination, and returns Destination.  The function terminates the 
+  Unicode string Destination by appending a Null-terminator character at the end. 
+  The caller is responsible to make sure Destination points to a buffer with size 
+  equal or greater than ((AsciiStrLen (Source) + 1) * sizeof (CHAR16)) in bytes.
+  
+  If Destination is NULL, then ASSERT().
+  If Destination is not aligned on a 16-bit boundary, then ASSERT().
+  If Source is NULL, then ASSERT().
+  If Source and Destination overlap, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and Source contains more than 
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, 
+  then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than 
+  PcdMaximumUnicodeStringLength ASCII characters not including the 
+  Null-terminator, then ASSERT().
+
+  @param  Source        Pointer to a Null-terminated ASCII string.
+  @param  Destination   Pointer to a Null-terminated Unicode string.
+
+  @reture Destination
+
+**/
+CHAR16 *
+EFIAPI
+AsciiStrToUnicodeStr (
+  IN      CONST CHAR8                *Source,
+  OUT    CHAR16                        *Destination
+  )
+{
+  ASSERT (Destination != NULL);
+  ASSERT (Source != NULL);
+
+  //
+  // Source and Destination should not overlap
+  //
+  ASSERT ((UINTN) ((CHAR8 *) Destination - Source) > AsciiStrLen (Source));
+  ASSERT ((UINTN) (Source - (CHAR8 *) Destination) > (AsciiStrLen (Source) * sizeof (CHAR16)));
+
+  //
+  // If PcdMaximumAsciiStringLength is not zero,
+  // length of Source should not more than PcdMaximumUnicodeStringLength
+  //
+  if (PcdGet32 (PcdMaximumAsciiStringLength) != 0) {
+    ASSERT (AsciiStrLen (Source) < PcdGet32 (PcdMaximumAsciiStringLength));
+  }
+
+  while (*Source != '\0') {
+    *(Destination++) = (CHAR16) *(Source++);
+  }
+  //
+  // End the Destination with a NULL.
+  //
+  *Destination = '\0';
+
+  return Destination;
+}
+
+/**
+  Converts an 8-bit value to an 8-bit BCD value.
+
+  Converts the 8-bit value specified by Value to BCD. The BCD value is
+  returned.
+
+  If Value >= 100, then ASSERT().
+
+  @param  Value The 8-bit value to convert to BCD. Range 0..99.
+
+  @return The BCD value
+
+**/
+UINT8
+EFIAPI
+DecimalToBcd8 (
+  IN      UINT8                     Value
+  )
+{
+  ASSERT (Value < 100);
+  return (UINT8) (((Value / 10) << 4) | (Value % 10));
+}
+
+/**
+  Converts an 8-bit BCD value to an 8-bit value.
+
+  Converts the 8-bit BCD value specified by Value to an 8-bit value. The 8-bit
+  value is returned.
+
+  If Value >= 0xA0, then ASSERT().
+  If (Value & 0x0F) >= 0x0A, then ASSERT().
+
+  @param  Value The 8-bit BCD value to convert to an 8-bit value.
+
+  @return The 8-bit value is returned.
+
+**/
+UINT8
+EFIAPI
+BcdToDecimal8 (
+  IN      UINT8                     Value
+  )
+{
+  ASSERT (Value < 0xa0);
+  ASSERT ((Value & 0xf) < 0xa);
+  return (UINT8) ((Value >> 4) * 10 + (Value & 0xf));
+}
+
+
index a5104c75a31da437a3ccbc88e6e66f5df6994ec4..5263dda28883e5dd1aa7c0ceef407cb40c7216e3 100644 (file)
-/** @file\r
-  Print Library.\r
-\r
-  Copyright (c) 2006, Intel Corporation<BR>\r
-  All rights reserved. This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-  Module Name:  PrintLib.c\r
-\r
-**/\r
-\r
-#include "PrintLibInternal.h"\r
-\r
-#define WARNING_STATUS_NUMBER          4\r
-#define ERROR_STATUS_NUMBER            24\r
-\r
-GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 *StatusString [] = {\r
-  "Success",                      //  RETURN_SUCCESS                = 0\r
-  "Warning Unknown Glyph",        //  RETURN_WARN_UNKNOWN_GLYPH     = 1\r
-  "Warning Delete Failure",       //  RETURN_WARN_DELETE_FAILURE    = 2\r
-  "Warning Write Failure",        //  RETURN_WARN_WRITE_FAILURE     = 3\r
-  "Warning Buffer Too Small",     //  RETURN_WARN_BUFFER_TOO_SMALL  = 4\r
-  "Load Error",                   //  RETURN_LOAD_ERROR             = 1  | MAX_BIT\r
-  "Invalid Parameter",            //  RETURN_INVALID_PARAMETER      = 2  | MAX_BIT\r
-  "Unsupported",                  //  RETURN_UNSUPPORTED            = 3  | MAX_BIT\r
-  "Bad Buffer Size",              //  RETURN_BAD_BUFFER_SIZE        = 4  | MAX_BIT\r
-  "Buffer Too Small",             //  RETURN_BUFFER_TOO_SMALL,      = 5  | MAX_BIT\r
-  "Not Ready",                    //  RETURN_NOT_READY              = 6  | MAX_BIT\r
-  "Device Error",                 //  RETURN_DEVICE_ERROR           = 7  | MAX_BIT\r
-  "Write Protected",              //  RETURN_WRITE_PROTECTED        = 8  | MAX_BIT\r
-  "Out of Resources",             //  RETURN_OUT_OF_RESOURCES       = 9  | MAX_BIT\r
-  "Volume Corrupt",               //  RETURN_VOLUME_CORRUPTED       = 10 | MAX_BIT\r
-  "Volume Full",                  //  RETURN_VOLUME_FULL            = 11 | MAX_BIT\r
-  "No Media",                     //  RETURN_NO_MEDIA               = 12 | MAX_BIT\r
-  "Media changed",                //  RETURN_MEDIA_CHANGED          = 13 | MAX_BIT\r
-  "Not Found",                    //  RETURN_NOT_FOUND              = 14 | MAX_BIT\r
-  "Access Denied",                //  RETURN_ACCESS_DENIED          = 15 | MAX_BIT\r
-  "No Response",                  //  RETURN_NO_RESPONSE            = 16 | MAX_BIT\r
-  "No mapping",                   //  RETURN_NO_MAPPING             = 17 | MAX_BIT\r
-  "Time out",                     //  RETURN_TIMEOUT                = 18 | MAX_BIT\r
-  "Not started",                  //  RETURN_NOT_STARTED            = 19 | MAX_BIT\r
-  "Already started",              //  RETURN_ALREADY_STARTED        = 20 | MAX_BIT\r
-  "Aborted",                      //  RETURN_ABORTED                = 21 | MAX_BIT\r
-  "ICMP Error",                   //  RETURN_ICMP_ERROR             = 22 | MAX_BIT\r
-  "TFTP Error",                   //  RETURN_TFTP_ERROR             = 23 | MAX_BIT\r
-  "Protocol Error"                //  RETURN_PROTOCOL_ERROR         = 24 | MAX_BIT\r
-};\r
-\r
-/**\r
-  Worker function that produces a Null-terminated string in an output buffer \r
-  based on a Null-terminated format string and a VA_LIST argument list.\r
-\r
-  VSPrint function to process format and place the results in Buffer. Since a \r
-  VA_LIST is used this rountine allows the nesting of Vararg routines. Thus \r
-  this is the main print working routine.\r
-\r
-  @param  Buffer      Character buffer to print the results of the parsing\r
-                      of Format into.\r
-  @param  BufferSize  Maximum number of characters to put into buffer.\r
-  @param  Flags       Intial flags value.\r
-                      Can only have FORMAT_UNICODE and OUTPUT_UNICODE set.\r
-  @param  Format      Null-terminated format string.\r
-  @param  Marker      Vararg list consumed by processing Format.\r
-\r
-  @return Number of characters printed not including the Null-terminator.\r
-\r
-**/\r
-UINTN\r
-BasePrintLibVSPrint (\r
-  OUT CHAR8        *Buffer,\r
-  IN  UINTN        BufferSize,\r
-  IN  UINTN        Flags,\r
-  IN  CONST CHAR8  *Format,\r
-  IN  VA_LIST      Marker\r
-  )\r
-{\r
-  CHAR8           *OriginalBuffer;\r
-  CHAR8           *EndBuffer;\r
-  CHAR8           ValueBuffer[MAXIMUM_VALUE_CHARACTERS];\r
-  UINTN           BytesPerOutputCharacter;\r
-  UINTN           BytesPerFormatCharacter;\r
-  UINTN           FormatMask;\r
-  UINTN           FormatCharacter;\r
-  UINTN           Width;\r
-  UINTN           Precision;\r
-  INT64           Value;\r
-  CONST CHAR8     *ArgumentString;\r
-  UINTN           Character;\r
-  GUID            *TmpGuid;\r
-  TIME            *TmpTime;\r
-  UINTN           Count;\r
-  UINTN           ArgumentMask;\r
-  INTN            BytesPerArgumentCharacter;\r
-  UINTN           ArgumentCharacter;\r
-  BOOLEAN         Done;\r
-  UINTN           Index;\r
-  CHAR8           Prefix;\r
-  BOOLEAN         ZeroPad;\r
-  BOOLEAN         Comma;\r
-  UINTN           Digits;\r
-  UINTN           Radix;\r
-  RETURN_STATUS   Status;\r
-\r
-  if (BufferSize == 0) {\r
-    return 0;\r
-  }\r
-  ASSERT (Buffer != NULL);\r
-\r
-  if ((Flags & OUTPUT_UNICODE) != 0) {\r
-    BytesPerOutputCharacter = 2;\r
-  } else {\r
-    BytesPerOutputCharacter = 1;\r
-  }\r
-\r
-  //\r
-  // Reserve space for the Null terminator.\r
-  //\r
-  BufferSize--;\r
-  OriginalBuffer = Buffer;\r
-  //\r
-  // Set the tag for the end of the input Buffer.\r
-  //\r
-  EndBuffer      = Buffer + BufferSize * BytesPerOutputCharacter;\r
-\r
-  if ((Flags & FORMAT_UNICODE) != 0) {\r
-    //\r
-    // Make sure format string cannot contain more than PcdMaximumUnicodeStringLength\r
-    // Unicode characters if PcdMaximumUnicodeStringLength is not zero. \r
-    //\r
-    ASSERT (StrSize ((CHAR16 *) Format) != 0);\r
-    BytesPerFormatCharacter = 2;\r
-    FormatMask = 0xffff;\r
-  } else {\r
-    //\r
-    // Make sure format string cannot contain more than PcdMaximumAsciiStringLength\r
-    // Ascii characters if PcdMaximumAsciiStringLength is not zero. \r
-    //\r
-    ASSERT (AsciiStrSize (Format) != 0);\r
-    BytesPerFormatCharacter = 1;\r
-    FormatMask = 0xff;\r
-  }\r
-\r
-\r
-\r
-  //\r
-  // Get the first character from the format string\r
-  //\r
-  FormatCharacter = (*Format | (*(Format + 1) << 8)) & FormatMask;\r
-\r
-  //\r
-  // Loop until the end of the format string is reached or the output buffer is full\r
-  //\r
-  while (FormatCharacter != 0 && Buffer < EndBuffer) {\r
-    //\r
-    // Clear all the flag bits except those that may have been passed in\r
-    //\r
-    Flags &= (OUTPUT_UNICODE | FORMAT_UNICODE);\r
-\r
-    //\r
-    // Set the default width to zero, and the default precision to 1\r
-    //\r
-    Width     = 0;\r
-    Precision = 1;\r
-    Prefix    = 0;\r
-    Comma     = FALSE;\r
-    ZeroPad   = FALSE;\r
-    Count     = 0;\r
-    Digits    = 0;\r
-\r
-    switch (FormatCharacter) {\r
-    case '%':\r
-      //\r
-      // Parse Flags and Width\r
-      //\r
-      for (Done = FALSE; !Done; ) {\r
-        Format += BytesPerFormatCharacter;\r
-        FormatCharacter = (*Format | (*(Format + 1) << 8)) & FormatMask;\r
-        switch (FormatCharacter) {\r
-        case '.': \r
-          Flags |= PRECISION; \r
-          break;\r
-        case '-': \r
-          Flags |= LEFT_JUSTIFY; \r
-          break;\r
-        case '+': \r
-          Flags |= PREFIX_SIGN;  \r
-          break;\r
-        case ' ': \r
-          Flags |= PREFIX_BLANK; \r
-          break;\r
-        case ',': \r
-          Flags |= COMMA_TYPE; \r
-          break;\r
-        case 'L':\r
-        case 'l': \r
-          Flags |= LONG_TYPE;    \r
-          break;\r
-        case '*':\r
-          if ((Flags & PRECISION) == 0) {\r
-            Flags |= PAD_TO_WIDTH;\r
-            Width = VA_ARG (Marker, UINTN);\r
-          } else {\r
-            Precision = VA_ARG (Marker, UINTN);\r
-          }\r
-          break;\r
-        case '0':\r
-          if ((Flags & PRECISION) == 0) {\r
-            Flags |= PREFIX_ZERO;\r
-          }\r
-        case '1':\r
-        case '2':\r
-        case '3':\r
-        case '4':\r
-        case '5':\r
-        case '6':\r
-        case '7':\r
-        case '8':\r
-        case '9':\r
-          for (Count = 0; ((FormatCharacter >= '0') &&  (FormatCharacter <= '9')); ){\r
-            Count = (Count * 10) + FormatCharacter - '0';\r
-            Format += BytesPerFormatCharacter;\r
-            FormatCharacter = (*Format | (*(Format + 1) << 8)) & FormatMask;\r
-          }\r
-          Format -= BytesPerFormatCharacter;\r
-          if ((Flags & PRECISION) == 0) {\r
-            Flags |= PAD_TO_WIDTH;\r
-            Width = Count;\r
-          } else {\r
-            Precision = Count;\r
-          }\r
-          break;\r
-       \r
-        case '\0':\r
-          //\r
-          // Make no output if Format string terminates unexpectedly when\r
-          // looking up for flag, width, precision and type. \r
-          //\r
-          Format   -= BytesPerFormatCharacter;\r
-          Precision = 0;\r
-          //\r
-          // break skipped on purpose.\r
-          //\r
-        default:\r
-          Done = TRUE;\r
-          break;\r
-        }\r
-      } \r
-\r
-      //\r
-      // Handle each argument type\r
-      //\r
-      switch (FormatCharacter) {\r
-      case 'p':\r
-        //\r
-        // Flag space, +, 0, L & l are invalid for type p.\r
-        //\r
-        Flags &= ~(PREFIX_BLANK | PREFIX_SIGN | PREFIX_ZERO | LONG_TYPE);\r
-        if (sizeof (VOID *) > 4) {\r
-          Flags |= LONG_TYPE;\r
-        }\r
-      case 'X':\r
-        Flags |= PREFIX_ZERO;\r
-        //\r
-        // break skipped on purpose\r
-        //\r
-      case 'x':\r
-        Flags |= RADIX_HEX;\r
-        //\r
-        // break skipped on purpose\r
-        //\r
-      case 'd':\r
-        if ((Flags & LONG_TYPE) == 0) {\r
-          Value = (VA_ARG (Marker, int));\r
-        } else {\r
-          Value = VA_ARG (Marker, INT64);\r
-        }\r
-        if ((Flags & PREFIX_BLANK) != 0) {\r
-          Prefix = ' ';\r
-        }\r
-        if ((Flags & PREFIX_SIGN) != 0) {\r
-          Prefix = '+';\r
-        }\r
-        if ((Flags & COMMA_TYPE) != 0) {\r
-          Comma = TRUE;\r
-        }\r
-        if ((Flags & RADIX_HEX) == 0) {\r
-          Radix = 10;\r
-          if (Comma) {\r
-            Flags &= (~PREFIX_ZERO);\r
-            Precision = 1;\r
-          }\r
-          if (Value < 0) {\r
-            Flags |= PREFIX_SIGN;\r
-            Prefix = '-';\r
-            Value = -Value;\r
-          }\r
-        } else {\r
-          Radix = 16;\r
-          Comma = FALSE;\r
-          if ((Flags & LONG_TYPE) == 0 && Value < 0) {\r
-            Value = (unsigned int)Value;\r
-          }\r
-        }\r
-        //\r
-        // Convert Value to a reversed string\r
-        //\r
-        Count = BasePrintLibValueToString (ValueBuffer, Value, Radix);\r
-        if (Value == 0 && Precision == 0) {\r
-          Count = 0;\r
-        }\r
-        ArgumentString = (CHAR8 *)ValueBuffer + Count;\r
-        \r
-        Digits = Count % 3;\r
-        if (Digits != 0) {\r
-          Digits = 3 - Digits;\r
-        }\r
-        if (Comma && Count != 0) {\r
-          Count += ((Count - 1) / 3);\r
-        }\r
-        if (Prefix != 0) {\r
-          Count++;\r
-          Precision++;\r
-        }\r
-        Flags |= ARGUMENT_REVERSED;\r
-        ZeroPad = TRUE;\r
-        if ((Flags & PREFIX_ZERO) != 0) {\r
-          if ((Flags & LEFT_JUSTIFY) == 0) {\r
-            if ((Flags & PAD_TO_WIDTH) != 0) {\r
-              if ((Flags & PRECISION) == 0) {\r
-                Precision = Width;\r
-              }\r
-            }\r
-          }\r
-        }\r
-        break;\r
-\r
-      case 's':\r
-      case 'S':\r
-        Flags |= ARGUMENT_UNICODE;\r
-        //\r
-        // break skipped on purpose\r
-        //\r
-      case 'a':\r
-        ArgumentString = (CHAR8 *)VA_ARG (Marker, CHAR8 *);\r
-        if (ArgumentString == NULL) {\r
-          Flags &= (~ARGUMENT_UNICODE);\r
-          ArgumentString = "<null string>";\r
-        }\r
-        break;\r
-\r
-      case 'c':\r
-        Character = VA_ARG (Marker, UINTN) & 0xffff;\r
-        ArgumentString = (CHAR8 *)&Character;\r
-        Flags |= ARGUMENT_UNICODE;\r
-        break;\r
-\r
-      case 'g':\r
-        TmpGuid = VA_ARG (Marker, GUID *);\r
-        if (TmpGuid == NULL) {\r
-          ArgumentString = "<null guid>";\r
-        } else {\r
-          BasePrintLibSPrint (\r
-            ValueBuffer,\r
-            MAXIMUM_VALUE_CHARACTERS, \r
-            0,\r
-            "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",\r
-            TmpGuid->Data1,\r
-            TmpGuid->Data2,\r
-            TmpGuid->Data3,\r
-            TmpGuid->Data4[0],\r
-            TmpGuid->Data4[1],\r
-            TmpGuid->Data4[2],\r
-            TmpGuid->Data4[3],\r
-            TmpGuid->Data4[4],\r
-            TmpGuid->Data4[5],\r
-            TmpGuid->Data4[6],\r
-            TmpGuid->Data4[7]\r
-            );\r
-          ArgumentString = ValueBuffer;\r
-        }\r
-        break;\r
-\r
-      case 't':\r
-        TmpTime = VA_ARG (Marker, TIME *); \r
-        if (TmpTime == NULL) {\r
-          ArgumentString = "<null time>";\r
-        } else {\r
-          BasePrintLibSPrint (\r
-            ValueBuffer,\r
-            MAXIMUM_VALUE_CHARACTERS,\r
-            0,\r
-            "%02d/%02d/%04d  %02d:%02d",\r
-            TmpTime->Month,\r
-            TmpTime->Day,\r
-            TmpTime->Year,\r
-            TmpTime->Hour,\r
-            TmpTime->Minute\r
-            );\r
-          ArgumentString = ValueBuffer;\r
-        }\r
-        break;\r
-\r
-      case 'r':\r
-        Status = VA_ARG (Marker, RETURN_STATUS);\r
-        ArgumentString = ValueBuffer;\r
-        if (RETURN_ERROR (Status)) {\r
-          //\r
-          // Clear error bit\r
-          //\r
-          Index = Status & ~MAX_BIT;\r
-          if (Index > 0 && Index <= ERROR_STATUS_NUMBER) {\r
-            ArgumentString = StatusString [Index + WARNING_STATUS_NUMBER];\r
-          }\r
-        } else {\r
-          Index = Status;\r
-          if (Index <= WARNING_STATUS_NUMBER) {\r
-            ArgumentString = StatusString [Index];\r
-          }\r
-        }\r
-        if (ArgumentString == ValueBuffer) {\r
-          BasePrintLibSPrint ((CHAR8 *) ValueBuffer, MAXIMUM_VALUE_CHARACTERS, 0, "%08X", Status);\r
-        }\r
-        break;\r
-\r
-      case '\n':\r
-        ArgumentString = "\n\r";\r
-        break;\r
-\r
-      case '%':\r
-      default:\r
-        //\r
-        // if the type is '%' or unknown, then print it to the screen\r
-        //\r
-        ArgumentString = (CHAR8 *)&FormatCharacter;\r
-        Flags |= ARGUMENT_UNICODE;\r
-        break;\r
-      }\r
-      break;\r
\r
-    case '\n':\r
-      ArgumentString = "\n\r";\r
-      break;\r
-\r
-    default:\r
-      ArgumentString = (CHAR8 *)&FormatCharacter;\r
-      Flags |= ARGUMENT_UNICODE;\r
-      break;\r
-    }\r
-\r
-    //\r
-    // Retrieve the ArgumentString attriubutes\r
-    //\r
-    if ((Flags & ARGUMENT_UNICODE) != 0) {\r
-      ArgumentMask = 0xffff;\r
-      BytesPerArgumentCharacter = 2;\r
-    } else {\r
-      ArgumentMask = 0xff;\r
-      BytesPerArgumentCharacter = 1;\r
-    }\r
-    if ((Flags & ARGUMENT_REVERSED) != 0) {\r
-      BytesPerArgumentCharacter = -BytesPerArgumentCharacter;\r
-    } else {\r
-      //\r
-      // Compute the number of characters in ArgumentString and store it in Count\r
-      // ArgumentString is either null-terminated, or it contains Precision characters\r
-      //\r
-      for (Count = 0; Count < Precision || ((Flags & PRECISION) == 0); Count++) {\r
-        ArgumentCharacter = ((ArgumentString[Count * BytesPerArgumentCharacter] & 0xff) | ((ArgumentString[Count * BytesPerArgumentCharacter + 1]) << 8)) & ArgumentMask;\r
-        if (ArgumentCharacter == 0) {\r
-          break;\r
-        }\r
-      }\r
-    }\r
-\r
-    if (Precision < Count) {\r
-      Precision = Count;\r
-    }\r
-\r
-    //\r
-    // Pad before the string\r
-    //\r
-    if ((Flags & (PAD_TO_WIDTH | LEFT_JUSTIFY)) == (PAD_TO_WIDTH)) {\r
-      Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Width - Precision, ' ', BytesPerOutputCharacter);\r
-    }\r
-\r
-    if (ZeroPad) {\r
-      if (Prefix != 0) {\r
-        Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, Prefix, BytesPerOutputCharacter);\r
-      }\r
-      Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Precision - Count, '0', BytesPerOutputCharacter);\r
-    } else {\r
-      Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Precision - Count, ' ', BytesPerOutputCharacter);\r
-      if (Prefix != 0) {\r
-        Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, Prefix, BytesPerOutputCharacter);\r
-      }\r
-    }\r
-\r
-    //\r
-    // Output the Prefix character if it is present\r
-    //\r
-    Index = 0;\r
-    if (Prefix != 0) {\r
-      Index++;\r
-    }\r
-\r
-    //\r
-    // Copy the string into the output buffer performing the required type conversions\r
-    //\r
-    while (Index < Count) {\r
-      ArgumentCharacter = ((*ArgumentString & 0xff) | (*(ArgumentString + 1) << 8)) & ArgumentMask;\r
-\r
-      Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ArgumentCharacter, BytesPerOutputCharacter);\r
-      ArgumentString    += BytesPerArgumentCharacter;\r
-      Index++;\r
-      if (Comma) {\r
-        Digits++;\r
-        if (Digits == 3) {\r
-          Digits = 0;\r
-          Index++;\r
-          if (Index < Count) {\r
-            Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ',', BytesPerOutputCharacter);\r
-          }\r
-        }\r
-      }\r
-    }\r
-\r
-    //\r
-    // Pad after the string\r
-    //\r
-    if ((Flags & (PAD_TO_WIDTH | LEFT_JUSTIFY)) == (PAD_TO_WIDTH | LEFT_JUSTIFY)) {\r
-      Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Width - Precision, ' ', BytesPerOutputCharacter);\r
-    }\r
-\r
-    //\r
-    // Get the next character from the format string\r
-    //\r
-    Format += BytesPerFormatCharacter;\r
-\r
-    //\r
-    // Get the next character from the format string\r
-    //\r
-    FormatCharacter = (*Format | (*(Format + 1) << 8)) & FormatMask;\r
-  }\r
-\r
-  //\r
-  // Null terminate the Unicode or ASCII string\r
-  //\r
-  BasePrintLibFillBuffer (Buffer, EndBuffer + BytesPerOutputCharacter, 1, 0, BytesPerOutputCharacter);\r
-  //\r
-  // Make sure output buffer cannot contain more than PcdMaximumUnicodeStringLength\r
-  // Unicode characters if PcdMaximumUnicodeStringLength is not zero. \r
-  //\r
-  ASSERT ((((Flags & OUTPUT_UNICODE) == 0)) || (StrSize ((CHAR16 *) OriginalBuffer) != 0));\r
-  //\r
-  // Make sure output buffer cannot contain more than PcdMaximumAsciiStringLength\r
-  // ASCII characters if PcdMaximumAsciiStringLength is not zero. \r
-  //\r
-  ASSERT ((((Flags & OUTPUT_UNICODE) != 0)) || (AsciiStrSize (OriginalBuffer) != 0));\r
-\r
-  return ((Buffer - OriginalBuffer) / BytesPerOutputCharacter);\r
-}\r
-\r
-/**\r
-  Worker function that produces a Null-terminated string in an output buffer \r
-  based on a Null-terminated format string and variable argument list.\r
-\r
-  VSPrint function to process format and place the results in Buffer. Since a \r
-  VA_LIST is used this rountine allows the nesting of Vararg routines. Thus \r
-  this is the main print working routine.\r
-\r
-  @param  Buffer        Character buffer to print the results of the parsing\r
-                        of Format into.\r
-  @param  BufferSize    Maximum number of characters to put into buffer.\r
-                        Zero means no limit.\r
-  @param  Flags         Intial flags value.\r
-                        Can only have FORMAT_UNICODE and OUTPUT_UNICODE set\r
-  @param  FormatString  Null-terminated format string.\r
-\r
-  @return Number of characters printed not including the Null-terminator.\r
-\r
-**/\r
-UINTN\r
-BasePrintLibSPrint (\r
-  OUT CHAR8        *StartOfBuffer,\r
-  IN  UINTN        BufferSize,\r
-  IN  UINTN        Flags,\r
-  IN  CONST CHAR8  *FormatString,\r
-  ...\r
-  )\r
-{\r
-  VA_LIST  Marker;\r
-\r
-  VA_START (Marker, FormatString);\r
-  return BasePrintLibVSPrint (StartOfBuffer, BufferSize, Flags, FormatString, Marker);\r
-}\r
-\r
-/**\r
-  Produces a Null-terminated Unicode string in an output buffer based on \r
-  a Null-terminated Unicode format string and a VA_LIST argument list\r
-  \r
-  Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer\r
-  and BufferSize.  \r
-  The Unicode string is produced by parsing the format string specified by FormatString.  \r
-  Arguments are pulled from the variable argument list specified by Marker based on the \r
-  contents of the format string.  \r
-  The number of Unicode characters in the produced output buffer is returned not including\r
-  the Null-terminator.\r
-  If BufferSize is 0 or 1, then no output buffer is produced and 0 is returned.\r
-\r
-  If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().\r
-  If BufferSize > 1 and FormatString is NULL, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than \r
-  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then\r
-  ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string\r
-  contains more than PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated \r
-                          Unicode string.\r
-  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.\r
-  @param  FormatString    Null-terminated Unicode format string.\r
-  @param  Marker          VA_LIST marker for the variable argument list.\r
-  \r
-  @return The number of Unicode characters in the produced output buffer not including the\r
-          Null-terminator.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-UnicodeVSPrint (\r
-  OUT CHAR16        *StartOfBuffer,\r
-  IN  UINTN         BufferSize,\r
-  IN  CONST CHAR16  *FormatString,\r
-  IN  VA_LIST       Marker\r
-  )\r
-{\r
-  return BasePrintLibVSPrint ((CHAR8 *)StartOfBuffer, BufferSize >> 1, FORMAT_UNICODE | OUTPUT_UNICODE, (CHAR8 *)FormatString, Marker);\r
-}\r
-\r
-/**\r
-  Produces a Null-terminated Unicode string in an output buffer based on a Null-terminated \r
-  Unicode format string and variable argument list.\r
-  \r
-  Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer\r
-  and BufferSize.\r
-  The Unicode string is produced by parsing the format string specified by FormatString.\r
-  Arguments are pulled from the variable argument list based on the contents of the format string.\r
-  The number of Unicode characters in the produced output buffer is returned not including\r
-  the Null-terminator.\r
-  If BufferSize is 0 or 1, then no output buffer is produced and 0 is returned.\r
-\r
-  If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().\r
-  If BufferSize > 1 and FormatString is NULL, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than \r
-  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then\r
-  ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string\r
-  contains more than PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated \r
-                          Unicode string.\r
-  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.\r
-  @param  FormatString    Null-terminated Unicode format string.\r
-  \r
-  @return The number of Unicode characters in the produced output buffer not including the\r
-          Null-terminator.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-UnicodeSPrint (\r
-  OUT CHAR16        *StartOfBuffer,\r
-  IN  UINTN         BufferSize,\r
-  IN  CONST CHAR16  *FormatString,\r
-  ...\r
-  )\r
-{\r
-  VA_LIST Marker;\r
-\r
-  VA_START (Marker, FormatString);\r
-  return UnicodeVSPrint (StartOfBuffer, BufferSize, FormatString, Marker);\r
-}\r
-\r
-/**\r
-  Produces a Null-terminated Unicode string in an output buffer based on a Null-terminated\r
-  ASCII format string and a VA_LIST argument list\r
-  \r
-  Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer\r
-  and BufferSize.\r
-  The Unicode string is produced by parsing the format string specified by FormatString.\r
-  Arguments are pulled from the variable argument list specified by Marker based on the \r
-  contents of the format string.\r
-  The number of Unicode characters in the produced output buffer is returned not including\r
-  the Null-terminator.\r
-  If BufferSize is 0 or 1, then no output buffer is produced and 0 is returned.\r
-\r
-  If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().\r
-  If BufferSize > 1 and FormatString is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then\r
-  ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string\r
-  contains more than PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated \r
-                          Unicode string.\r
-  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.\r
-  @param  FormatString    Null-terminated Unicode format string.\r
-  @param  Marker          VA_LIST marker for the variable argument list.\r
-  \r
-  @return The number of Unicode characters in the produced output buffer not including the\r
-          Null-terminator.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-UnicodeVSPrintAsciiFormat (\r
-  OUT CHAR16       *StartOfBuffer,\r
-  IN  UINTN        BufferSize,\r
-  IN  CONST CHAR8  *FormatString,\r
-  IN  VA_LIST      Marker\r
-  )\r
-{\r
-  return BasePrintLibVSPrint ((CHAR8 *)StartOfBuffer, BufferSize >> 1, OUTPUT_UNICODE,FormatString, Marker);\r
-}\r
-\r
-/**\r
-  Produces a Null-terminated Unicode string in an output buffer based on a Null-terminated \r
-  ASCII format string and  variable argument list.\r
-  \r
-  Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer\r
-  and BufferSize.\r
-  The Unicode string is produced by parsing the format string specified by FormatString.\r
-  Arguments are pulled from the variable argument list based on the contents of the \r
-  format string.\r
-  The number of Unicode characters in the produced output buffer is returned not including\r
-  the Null-terminator.\r
-  If BufferSize is 0 or 1, then no output buffer is produced and 0 is returned.\r
-\r
-  If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().\r
-  If BufferSize > 1 and FormatString is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then\r
-  ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string\r
-  contains more than PcdMaximumUnicodeStringLength Unicode characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated \r
-                          Unicode string.\r
-  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.\r
-  @param  FormatString    Null-terminated Unicode format string.\r
-  \r
-  @return The number of Unicode characters in the produced output buffer not including the\r
-          Null-terminator.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-UnicodeSPrintAsciiFormat (\r
-  OUT CHAR16       *StartOfBuffer,\r
-  IN  UINTN        BufferSize,\r
-  IN  CONST CHAR8  *FormatString,\r
-  ...\r
-  )\r
-{\r
-  VA_LIST Marker;\r
-\r
-  VA_START (Marker, FormatString);\r
-  return UnicodeVSPrintAsciiFormat (StartOfBuffer, BufferSize, FormatString, Marker);\r
-}\r
-\r
-/**\r
-  Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated\r
-  ASCII format string and a VA_LIST argument list.\r
-  \r
-  Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer\r
-  and BufferSize.\r
-  The ASCII string is produced by parsing the format string specified by FormatString.\r
-  Arguments are pulled from the variable argument list specified by Marker based on \r
-  the contents of the format string.\r
-  The number of ASCII characters in the produced output buffer is returned not including\r
-  the Null-terminator.\r
-  If BufferSize is 0, then no output buffer is produced and 0 is returned.\r
-\r
-  If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT().\r
-  If BufferSize > 0 and FormatString is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then\r
-  ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string\r
-  contains more than PcdMaximumAsciiStringLength ASCII characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated \r
-                          ASCII string.\r
-  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.\r
-  @param  FormatString    Null-terminated Unicode format string.\r
-  @param  Marker          VA_LIST marker for the variable argument list.\r
-  \r
-  @return The number of ASCII characters in the produced output buffer not including the\r
-          Null-terminator.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsciiVSPrint (\r
-  OUT CHAR8         *StartOfBuffer,\r
-  IN  UINTN         BufferSize,\r
-  IN  CONST CHAR8   *FormatString,\r
-  IN  VA_LIST       Marker\r
-  )\r
-{\r
-  return BasePrintLibVSPrint (StartOfBuffer, BufferSize, 0, FormatString, Marker);\r
-}\r
-\r
-/**\r
-  Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated\r
-  ASCII format string and  variable argument list.\r
-  \r
-  Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer\r
-  and BufferSize.\r
-  The ASCII string is produced by parsing the format string specified by FormatString.\r
-  Arguments are pulled from the variable argument list based on the contents of the \r
-  format string.\r
-  The number of ASCII characters in the produced output buffer is returned not including\r
-  the Null-terminator.\r
-  If BufferSize is 0, then no output buffer is produced and 0 is returned.\r
-\r
-  If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT().\r
-  If BufferSize > 0 and FormatString is NULL, then ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than\r
-  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then\r
-  ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string\r
-  contains more than PcdMaximumAsciiStringLength ASCII characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated \r
-                          ASCII string.\r
-  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.\r
-  @param  FormatString    Null-terminated Unicode format string.\r
-  \r
-  @return The number of ASCII characters in the produced output buffer not including the\r
-          Null-terminator.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsciiSPrint (\r
-  OUT CHAR8        *StartOfBuffer,\r
-  IN  UINTN        BufferSize,\r
-  IN  CONST CHAR8  *FormatString,\r
-  ...\r
-  )\r
-{\r
-  VA_LIST Marker;\r
-\r
-  VA_START (Marker, FormatString);\r
-  return AsciiVSPrint (StartOfBuffer, BufferSize, FormatString, Marker);\r
-}\r
-\r
-/**\r
-  Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated\r
-  ASCII format string and a VA_LIST argument list.\r
-  \r
-  Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer\r
-  and BufferSize.\r
-  The ASCII string is produced by parsing the format string specified by FormatString.\r
-  Arguments are pulled from the variable argument list specified by Marker based on \r
-  the contents of the format string.\r
-  The number of ASCII characters in the produced output buffer is returned not including\r
-  the Null-terminator.\r
-  If BufferSize is 0, then no output buffer is produced and 0 is returned.\r
-\r
-  If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT().\r
-  If BufferSize > 0 and FormatString is NULL, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then\r
-  ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string\r
-  contains more than PcdMaximumAsciiStringLength ASCII characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated \r
-                          ASCII string.\r
-  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.\r
-  @param  FormatString    Null-terminated Unicode format string.\r
-  @param  Marker          VA_LIST marker for the variable argument list.\r
-  \r
-  @return The number of ASCII characters in the produced output buffer not including the\r
-          Null-terminator.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsciiVSPrintUnicodeFormat (\r
-  OUT CHAR8         *StartOfBuffer,\r
-  IN  UINTN         BufferSize,\r
-  IN  CONST CHAR16  *FormatString,\r
-  IN  VA_LIST       Marker\r
-  )\r
-{\r
-  return BasePrintLibVSPrint (StartOfBuffer, BufferSize, FORMAT_UNICODE, (CHAR8 *)FormatString, Marker);\r
-}\r
-\r
-/**\r
-  Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated\r
-  ASCII format string and  variable argument list.\r
-  \r
-  Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer\r
-  and BufferSize.\r
-  The ASCII string is produced by parsing the format string specified by FormatString.\r
-  Arguments are pulled from the variable argument list based on the contents of the \r
-  format string.\r
-  The number of ASCII characters in the produced output buffer is returned not including\r
-  the Null-terminator.\r
-  If BufferSize is 0, then no output buffer is produced and 0 is returned.\r
-\r
-  If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT().\r
-  If BufferSize > 0 and FormatString is NULL, then ASSERT().\r
-  If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than\r
-  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then\r
-  ASSERT().\r
-  If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string\r
-  contains more than PcdMaximumAsciiStringLength ASCII characters not including the\r
-  Null-terminator, then ASSERT().\r
-\r
-  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated \r
-                          ASCII string.\r
-  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.\r
-  @param  FormatString    Null-terminated Unicode format string.\r
-  \r
-  @return The number of ASCII characters in the produced output buffer not including the\r
-          Null-terminator.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsciiSPrintUnicodeFormat (\r
-  OUT CHAR8         *StartOfBuffer,\r
-  IN  UINTN         BufferSize,\r
-  IN  CONST CHAR16  *FormatString,\r
-  ...\r
-  )\r
-{\r
-  VA_LIST Marker;\r
-\r
-  VA_START (Marker, FormatString);\r
-  return AsciiVSPrintUnicodeFormat (StartOfBuffer, BufferSize, FormatString, Marker);\r
-}\r
-\r
-/**\r
-  Converts a decimal value to a Null-terminated Unicode string.\r
-  \r
-  Converts the decimal number specified by Value to a Null-terminated Unicode \r
-  string specified by Buffer containing at most Width characters.\r
-  If Width is 0 then a width of  MAXIMUM_VALUE_CHARACTERS is assumed.\r
-  The number of Unicode characters in Buffer is returned not including the Null-terminator.\r
-  If the conversion contains more than Width characters, then only the first\r
-  Width characters are returned, and the total number of characters \r
-  required to perform the conversion is returned.\r
-  Additional conversion parameters are specified in Flags.  \r
-  The Flags bit LEFT_JUSTIFY is always ignored.\r
-  All conversions are left justified in Buffer.\r
-  If Width is 0, PREFIX_ZERO is ignored in Flags.\r
-  If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and commas\r
-  are inserted every 3rd digit starting from the right.\r
-  If Value is < 0, then the fist character in Buffer is a '-'.\r
-  If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored, \r
-  then Buffer is padded with '0' characters so the combination of the optional '-' \r
-  sign character, '0' characters, digit characters for Value, and the Null-terminator\r
-  add up to Width characters.\r
-\r
-  If Buffer is NULL, then ASSERT().\r
-  If unsupported bits are set in Flags, then ASSERT().\r
-  If Width >= MAXIMUM_VALUE_CHARACTERS, then ASSERT()\r
-\r
-  @param  Buffer  Pointer to the output buffer for the produced Null-terminated\r
-                  Unicode string.\r
-  @param  Flags   The bitmask of flags that specify left justification, zero pad, and commas.\r
-  @param  Value   The 64-bit signed value to convert to a string.\r
-  @param  Width   The maximum number of Unicode characters to place in Buffer, not including\r
-                  the Null-terminator.\r
-  \r
-  @return The number of Unicode characters in Buffer not including the Null-terminator.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-UnicodeValueToString (\r
-  IN OUT CHAR16  *Buffer,\r
-  IN UINTN       Flags,\r
-  IN INT64       Value,\r
-  IN UINTN       Width\r
-  )\r
-{\r
-  return BasePrintLibConvertValueToString ((CHAR8 *)Buffer, Flags, Value, Width, 2);\r
-}\r
-\r
-/**\r
-  Converts a decimal value to a Null-terminated ASCII string.\r
-  \r
-  Converts the decimal number specified by Value to a Null-terminated ASCII string \r
-  specified by Buffer containing at most Width characters.\r
-  If Width is 0 then a width of  MAXIMUM_VALUE_CHARACTERS is assumed.\r
-  The number of ASCII characters in Buffer is returned not including the Null-terminator.\r
-  If the conversion contains more than Width characters, then only the first Width\r
-  characters are returned, and the total number of characters required to perform\r
-  the conversion is returned.\r
-  Additional conversion parameters are specified in Flags.  \r
-  The Flags bit LEFT_JUSTIFY is always ignored.\r
-  All conversions are left justified in Buffer.\r
-  If Width is 0, PREFIX_ZERO is ignored in Flags.\r
-  If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and commas \r
-  are inserted every 3rd digit starting from the right.\r
-  If Value is < 0, then the fist character in Buffer is a '-'.\r
-  If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored, then Buffer\r
-  is padded with '0' characters so the combination of the optional '-'\r
-  sign character, '0' characters, digit characters for Value, and the \r
-  Null-terminator add up to Width characters.\r
-\r
-  If Buffer is NULL, then ASSERT().\r
-  If unsupported bits are set in Flags, then ASSERT().\r
-  If Width >= MAXIMUM_VALUE_CHARACTERS, then ASSERT()\r
-\r
-  @param  Buffer  Pointer to the output buffer for the produced Null-terminated\r
-                  ASCII string.\r
-  @param  Flags   The bitmask of flags that specify left justification, zero pad, and commas.\r
-  @param  Value   The 64-bit signed value to convert to a string.\r
-  @param  Width   The maximum number of ASCII characters to place in Buffer, not including\r
-                  the Null-terminator.\r
-  \r
-  @return The number of ASCII characters in Buffer not including the Null-terminator.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-AsciiValueToString (\r
-  IN OUT CHAR8  *Buffer,\r
-  IN UINTN      Flags,\r
-  IN INT64      Value,\r
-  IN UINTN      Width\r
-  )\r
-{\r
-  return BasePrintLibConvertValueToString ((CHAR8 *)Buffer, Flags, Value, Width, 1);\r
-}\r
+/** @file
+  Print Library.
+
+  Copyright (c) 2006 - 2007, Intel Corporation<BR>
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Module Name:  PrintLib.c
+
+**/
+
+#include "PrintLibInternal.h"
+
+#define WARNING_STATUS_NUMBER          4
+#define ERROR_STATUS_NUMBER            24
+
+GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 *StatusString [] = {
+  "Success",                      //  RETURN_SUCCESS                = 0
+  "Warning Unknown Glyph",        //  RETURN_WARN_UNKNOWN_GLYPH     = 1
+  "Warning Delete Failure",       //  RETURN_WARN_DELETE_FAILURE    = 2
+  "Warning Write Failure",        //  RETURN_WARN_WRITE_FAILURE     = 3
+  "Warning Buffer Too Small",     //  RETURN_WARN_BUFFER_TOO_SMALL  = 4
+  "Load Error",                   //  RETURN_LOAD_ERROR             = 1  | MAX_BIT
+  "Invalid Parameter",            //  RETURN_INVALID_PARAMETER      = 2  | MAX_BIT
+  "Unsupported",                  //  RETURN_UNSUPPORTED            = 3  | MAX_BIT
+  "Bad Buffer Size",              //  RETURN_BAD_BUFFER_SIZE        = 4  | MAX_BIT
+  "Buffer Too Small",             //  RETURN_BUFFER_TOO_SMALL,      = 5  | MAX_BIT
+  "Not Ready",                    //  RETURN_NOT_READY              = 6  | MAX_BIT
+  "Device Error",                 //  RETURN_DEVICE_ERROR           = 7  | MAX_BIT
+  "Write Protected",              //  RETURN_WRITE_PROTECTED        = 8  | MAX_BIT
+  "Out of Resources",             //  RETURN_OUT_OF_RESOURCES       = 9  | MAX_BIT
+  "Volume Corrupt",               //  RETURN_VOLUME_CORRUPTED       = 10 | MAX_BIT
+  "Volume Full",                  //  RETURN_VOLUME_FULL            = 11 | MAX_BIT
+  "No Media",                     //  RETURN_NO_MEDIA               = 12 | MAX_BIT
+  "Media changed",                //  RETURN_MEDIA_CHANGED          = 13 | MAX_BIT
+  "Not Found",                    //  RETURN_NOT_FOUND              = 14 | MAX_BIT
+  "Access Denied",                //  RETURN_ACCESS_DENIED          = 15 | MAX_BIT
+  "No Response",                  //  RETURN_NO_RESPONSE            = 16 | MAX_BIT
+  "No mapping",                   //  RETURN_NO_MAPPING             = 17 | MAX_BIT
+  "Time out",                     //  RETURN_TIMEOUT                = 18 | MAX_BIT
+  "Not started",                  //  RETURN_NOT_STARTED            = 19 | MAX_BIT
+  "Already started",              //  RETURN_ALREADY_STARTED        = 20 | MAX_BIT
+  "Aborted",                      //  RETURN_ABORTED                = 21 | MAX_BIT
+  "ICMP Error",                   //  RETURN_ICMP_ERROR             = 22 | MAX_BIT
+  "TFTP Error",                   //  RETURN_TFTP_ERROR             = 23 | MAX_BIT
+  "Protocol Error"                //  RETURN_PROTOCOL_ERROR         = 24 | MAX_BIT
+};
+
+/**
+  Worker function that produces a Null-terminated string in an output buffer 
+  based on a Null-terminated format string and a VA_LIST argument list.
+
+  VSPrint function to process format and place the results in Buffer. Since a 
+  VA_LIST is used this rountine allows the nesting of Vararg routines. Thus 
+  this is the main print working routine.
+
+  @param  Buffer      Character buffer to print the results of the parsing
+                      of Format into.
+  @param  BufferSize  Maximum number of characters to put into buffer.
+  @param  Flags       Intial flags value.
+                      Can only have FORMAT_UNICODE and OUTPUT_UNICODE set.
+  @param  Format      Null-terminated format string.
+  @param  Marker      Vararg list consumed by processing Format.
+
+  @return Number of characters printed not including the Null-terminator.
+
+**/
+UINTN
+BasePrintLibVSPrint (
+  OUT CHAR8        *Buffer,
+  IN  UINTN        BufferSize,
+  IN  UINTN        Flags,
+  IN  CONST CHAR8  *Format,
+  IN  VA_LIST      Marker
+  )
+{
+  CHAR8           *OriginalBuffer;
+  CHAR8           *EndBuffer;
+  CHAR8           ValueBuffer[MAXIMUM_VALUE_CHARACTERS];
+  UINTN           BytesPerOutputCharacter;
+  UINTN           BytesPerFormatCharacter;
+  UINTN           FormatMask;
+  UINTN           FormatCharacter;
+  UINTN           Width;
+  UINTN           Precision;
+  INT64           Value;
+  CONST CHAR8     *ArgumentString;
+  UINTN           Character;
+  GUID            *TmpGuid;
+  TIME            *TmpTime;
+  UINTN           Count;
+  UINTN           ArgumentMask;
+  INTN            BytesPerArgumentCharacter;
+  UINTN           ArgumentCharacter;
+  BOOLEAN         Done;
+  UINTN           Index;
+  CHAR8           Prefix;
+  BOOLEAN         ZeroPad;
+  BOOLEAN         Comma;
+  UINTN           Digits;
+  UINTN           Radix;
+  RETURN_STATUS   Status;
+
+  if (BufferSize == 0) {
+    return 0;
+  }
+  ASSERT (Buffer != NULL);
+
+  if ((Flags & OUTPUT_UNICODE) != 0) {
+    BytesPerOutputCharacter = 2;
+  } else {
+    BytesPerOutputCharacter = 1;
+  }
+
+  //
+  // Reserve space for the Null terminator.
+  //
+  BufferSize--;
+  OriginalBuffer = Buffer;
+  //
+  // Set the tag for the end of the input Buffer.
+  //
+  EndBuffer      = Buffer + BufferSize * BytesPerOutputCharacter;
+
+  if ((Flags & FORMAT_UNICODE) != 0) {
+    //
+    // Make sure format string cannot contain more than PcdMaximumUnicodeStringLength
+    // Unicode characters if PcdMaximumUnicodeStringLength is not zero. 
+    //
+    ASSERT (StrSize ((CHAR16 *) Format) != 0);
+    BytesPerFormatCharacter = 2;
+    FormatMask = 0xffff;
+  } else {
+    //
+    // Make sure format string cannot contain more than PcdMaximumAsciiStringLength
+    // Ascii characters if PcdMaximumAsciiStringLength is not zero. 
+    //
+    ASSERT (AsciiStrSize (Format) != 0);
+    BytesPerFormatCharacter = 1;
+    FormatMask = 0xff;
+  }
+
+
+
+  //
+  // Get the first character from the format string
+  //
+  FormatCharacter = (*Format | (*(Format + 1) << 8)) & FormatMask;
+
+  //
+  // Loop until the end of the format string is reached or the output buffer is full
+  //
+  while (FormatCharacter != 0 && Buffer < EndBuffer) {
+    //
+    // Clear all the flag bits except those that may have been passed in
+    //
+    Flags &= (OUTPUT_UNICODE | FORMAT_UNICODE);
+
+    //
+    // Set the default width to zero, and the default precision to 1
+    //
+    Width     = 0;
+    Precision = 1;
+    Prefix    = 0;
+    Comma     = FALSE;
+    ZeroPad   = FALSE;
+    Count     = 0;
+    Digits    = 0;
+
+    switch (FormatCharacter) {
+    case '%':
+      //
+      // Parse Flags and Width
+      //
+      for (Done = FALSE; !Done; ) {
+        Format += BytesPerFormatCharacter;
+        FormatCharacter = (*Format | (*(Format + 1) << 8)) & FormatMask;
+        switch (FormatCharacter) {
+        case '.': 
+          Flags |= PRECISION; 
+          break;
+        case '-': 
+          Flags |= LEFT_JUSTIFY; 
+          break;
+        case '+': 
+          Flags |= PREFIX_SIGN;  
+          break;
+        case ' ': 
+          Flags |= PREFIX_BLANK; 
+          break;
+        case ',': 
+          Flags |= COMMA_TYPE; 
+          break;
+        case 'L':
+        case 'l': 
+          Flags |= LONG_TYPE;    
+          break;
+        case '*':
+          if ((Flags & PRECISION) == 0) {
+            Flags |= PAD_TO_WIDTH;
+            Width = VA_ARG (Marker, UINTN);
+          } else {
+            Precision = VA_ARG (Marker, UINTN);
+          }
+          break;
+        case '0':
+          if ((Flags & PRECISION) == 0) {
+            Flags |= PREFIX_ZERO;
+          }
+        case '1':
+        case '2':
+        case '3':
+        case '4':
+        case '5':
+        case '6':
+        case '7':
+        case '8':
+        case '9':
+          for (Count = 0; ((FormatCharacter >= '0') &&  (FormatCharacter <= '9')); ){
+            Count = (Count * 10) + FormatCharacter - '0';
+            Format += BytesPerFormatCharacter;
+            FormatCharacter = (*Format | (*(Format + 1) << 8)) & FormatMask;
+          }
+          Format -= BytesPerFormatCharacter;
+          if ((Flags & PRECISION) == 0) {
+            Flags |= PAD_TO_WIDTH;
+            Width = Count;
+          } else {
+            Precision = Count;
+          }
+          break;
+       
+        case '\0':
+          //
+          // Make no output if Format string terminates unexpectedly when
+          // looking up for flag, width, precision and type. 
+          //
+          Format   -= BytesPerFormatCharacter;
+          Precision = 0;
+          //
+          // break skipped on purpose.
+          //
+        default:
+          Done = TRUE;
+          break;
+        }
+      } 
+
+      //
+      // Handle each argument type
+      //
+      switch (FormatCharacter) {
+      case 'p':
+        //
+        // Flag space, +, 0, L & l are invalid for type p.
+        //
+        Flags &= ~(PREFIX_BLANK | PREFIX_SIGN | PREFIX_ZERO | LONG_TYPE);
+        if (sizeof (VOID *) > 4) {
+          Flags |= LONG_TYPE;
+        }
+      case 'X':
+        Flags |= PREFIX_ZERO;
+        //
+        // break skipped on purpose
+        //
+      case 'x':
+        Flags |= RADIX_HEX;
+        //
+        // break skipped on purpose
+        //
+      case 'd':
+        if ((Flags & LONG_TYPE) == 0) {
+          Value = (VA_ARG (Marker, int));
+        } else {
+          Value = VA_ARG (Marker, INT64);
+        }
+        if ((Flags & PREFIX_BLANK) != 0) {
+          Prefix = ' ';
+        }
+        if ((Flags & PREFIX_SIGN) != 0) {
+          Prefix = '+';
+        }
+        if ((Flags & COMMA_TYPE) != 0) {
+          Comma = TRUE;
+        }
+        if ((Flags & RADIX_HEX) == 0) {
+          Radix = 10;
+          if (Comma) {
+            Flags &= (~PREFIX_ZERO);
+            Precision = 1;
+          }
+          if (Value < 0) {
+            Flags |= PREFIX_SIGN;
+            Prefix = '-';
+            Value = -Value;
+          }
+        } else {
+          Radix = 16;
+          Comma = FALSE;
+          if ((Flags & LONG_TYPE) == 0 && Value < 0) {
+            Value = (unsigned int)Value;
+          }
+        }
+        //
+        // Convert Value to a reversed string
+        //
+        Count = BasePrintLibValueToString (ValueBuffer, Value, Radix);
+        if (Value == 0 && Precision == 0) {
+          Count = 0;
+        }
+        ArgumentString = (CHAR8 *)ValueBuffer + Count;
+        
+        Digits = Count % 3;
+        if (Digits != 0) {
+          Digits = 3 - Digits;
+        }
+        if (Comma && Count != 0) {
+          Count += ((Count - 1) / 3);
+        }
+        if (Prefix != 0) {
+          Count++;
+          Precision++;
+        }
+        Flags |= ARGUMENT_REVERSED;
+        ZeroPad = TRUE;
+        if ((Flags & PREFIX_ZERO) != 0) {
+          if ((Flags & LEFT_JUSTIFY) == 0) {
+            if ((Flags & PAD_TO_WIDTH) != 0) {
+              if ((Flags & PRECISION) == 0) {
+                Precision = Width;
+              }
+            }
+          }
+        }
+        break;
+
+      case 's':
+      case 'S':
+        Flags |= ARGUMENT_UNICODE;
+        //
+        // break skipped on purpose
+        //
+      case 'a':
+        ArgumentString = (CHAR8 *)VA_ARG (Marker, CHAR8 *);
+        if (ArgumentString == NULL) {
+          Flags &= (~ARGUMENT_UNICODE);
+          ArgumentString = "<null string>";
+        }
+        break;
+
+      case 'c':
+        Character = VA_ARG (Marker, UINTN) & 0xffff;
+        ArgumentString = (CHAR8 *)&Character;
+        Flags |= ARGUMENT_UNICODE;
+        break;
+
+      case 'g':
+        TmpGuid = VA_ARG (Marker, GUID *);
+        if (TmpGuid == NULL) {
+          ArgumentString = "<null guid>";
+        } else {
+          BasePrintLibSPrint (
+            ValueBuffer,
+            MAXIMUM_VALUE_CHARACTERS, 
+            0,
+            "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
+            TmpGuid->Data1,
+            TmpGuid->Data2,
+            TmpGuid->Data3,
+            TmpGuid->Data4[0],
+            TmpGuid->Data4[1],
+            TmpGuid->Data4[2],
+            TmpGuid->Data4[3],
+            TmpGuid->Data4[4],
+            TmpGuid->Data4[5],
+            TmpGuid->Data4[6],
+            TmpGuid->Data4[7]
+            );
+          ArgumentString = ValueBuffer;
+        }
+        break;
+
+      case 't':
+        TmpTime = VA_ARG (Marker, TIME *); 
+        if (TmpTime == NULL) {
+          ArgumentString = "<null time>";
+        } else {
+          BasePrintLibSPrint (
+            ValueBuffer,
+            MAXIMUM_VALUE_CHARACTERS,
+            0,
+            "%02d/%02d/%04d  %02d:%02d",
+            TmpTime->Month,
+            TmpTime->Day,
+            TmpTime->Year,
+            TmpTime->Hour,
+            TmpTime->Minute
+            );
+          ArgumentString = ValueBuffer;
+        }
+        break;
+
+      case 'r':
+        Status = VA_ARG (Marker, RETURN_STATUS);
+        ArgumentString = ValueBuffer;
+        if (RETURN_ERROR (Status)) {
+          //
+          // Clear error bit
+          //
+          Index = Status & ~MAX_BIT;
+          if (Index > 0 && Index <= ERROR_STATUS_NUMBER) {
+            ArgumentString = StatusString [Index + WARNING_STATUS_NUMBER];
+          }
+        } else {
+          Index = Status;
+          if (Index <= WARNING_STATUS_NUMBER) {
+            ArgumentString = StatusString [Index];
+          }
+        }
+        if (ArgumentString == ValueBuffer) {
+          BasePrintLibSPrint ((CHAR8 *) ValueBuffer, MAXIMUM_VALUE_CHARACTERS, 0, "%08X", Status);
+        }
+        break;
+
+      case '\n':
+        ArgumentString = "\n\r";
+        break;
+
+      case '%':
+      default:
+        //
+        // if the type is '%' or unknown, then print it to the screen
+        //
+        ArgumentString = (CHAR8 *)&FormatCharacter;
+        Flags |= ARGUMENT_UNICODE;
+        break;
+      }
+      break;
+    case '\n':
+      ArgumentString = "\n\r";
+      break;
+
+    default:
+      ArgumentString = (CHAR8 *)&FormatCharacter;
+      Flags |= ARGUMENT_UNICODE;
+      break;
+    }
+
+    //
+    // Retrieve the ArgumentString attriubutes
+    //
+    if ((Flags & ARGUMENT_UNICODE) != 0) {
+      ArgumentMask = 0xffff;
+      BytesPerArgumentCharacter = 2;
+    } else {
+      ArgumentMask = 0xff;
+      BytesPerArgumentCharacter = 1;
+    }
+    if ((Flags & ARGUMENT_REVERSED) != 0) {
+      BytesPerArgumentCharacter = -BytesPerArgumentCharacter;
+    } else {
+      //
+      // Compute the number of characters in ArgumentString and store it in Count
+      // ArgumentString is either null-terminated, or it contains Precision characters
+      //
+      for (Count = 0; Count < Precision || ((Flags & PRECISION) == 0); Count++) {
+        ArgumentCharacter = ((ArgumentString[Count * BytesPerArgumentCharacter] & 0xff) | ((ArgumentString[Count * BytesPerArgumentCharacter + 1]) << 8)) & ArgumentMask;
+        if (ArgumentCharacter == 0) {
+          break;
+        }
+      }
+    }
+
+    if (Precision < Count) {
+      Precision = Count;
+    }
+
+    //
+    // Pad before the string
+    //
+    if ((Flags & (PAD_TO_WIDTH | LEFT_JUSTIFY)) == (PAD_TO_WIDTH)) {
+      Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Width - Precision, ' ', BytesPerOutputCharacter);
+    }
+
+    if (ZeroPad) {
+      if (Prefix != 0) {
+        Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, Prefix, BytesPerOutputCharacter);
+      }
+      Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Precision - Count, '0', BytesPerOutputCharacter);
+    } else {
+      Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Precision - Count, ' ', BytesPerOutputCharacter);
+      if (Prefix != 0) {
+        Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, Prefix, BytesPerOutputCharacter);
+      }
+    }
+
+    //
+    // Output the Prefix character if it is present
+    //
+    Index = 0;
+    if (Prefix != 0) {
+      Index++;
+    }
+
+    //
+    // Copy the string into the output buffer performing the required type conversions
+    //
+    while (Index < Count) {
+      ArgumentCharacter = ((*ArgumentString & 0xff) | (*(ArgumentString + 1) << 8)) & ArgumentMask;
+
+      Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ArgumentCharacter, BytesPerOutputCharacter);
+      ArgumentString    += BytesPerArgumentCharacter;
+      Index++;
+      if (Comma) {
+        Digits++;
+        if (Digits == 3) {
+          Digits = 0;
+          Index++;
+          if (Index < Count) {
+            Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ',', BytesPerOutputCharacter);
+          }
+        }
+      }
+    }
+
+    //
+    // Pad after the string
+    //
+    if ((Flags & (PAD_TO_WIDTH | LEFT_JUSTIFY)) == (PAD_TO_WIDTH | LEFT_JUSTIFY)) {
+      Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Width - Precision, ' ', BytesPerOutputCharacter);
+    }
+
+    //
+    // Get the next character from the format string
+    //
+    Format += BytesPerFormatCharacter;
+
+    //
+    // Get the next character from the format string
+    //
+    FormatCharacter = (*Format | (*(Format + 1) << 8)) & FormatMask;
+  }
+
+  //
+  // Null terminate the Unicode or ASCII string
+  //
+  BasePrintLibFillBuffer (Buffer, EndBuffer + BytesPerOutputCharacter, 1, 0, BytesPerOutputCharacter);
+  //
+  // Make sure output buffer cannot contain more than PcdMaximumUnicodeStringLength
+  // Unicode characters if PcdMaximumUnicodeStringLength is not zero. 
+  //
+  ASSERT ((((Flags & OUTPUT_UNICODE) == 0)) || (StrSize ((CHAR16 *) OriginalBuffer) != 0));
+  //
+  // Make sure output buffer cannot contain more than PcdMaximumAsciiStringLength
+  // ASCII characters if PcdMaximumAsciiStringLength is not zero. 
+  //
+  ASSERT ((((Flags & OUTPUT_UNICODE) != 0)) || (AsciiStrSize (OriginalBuffer) != 0));
+
+  return ((Buffer - OriginalBuffer) / BytesPerOutputCharacter);
+}
+
+/**
+  Worker function that produces a Null-terminated string in an output buffer 
+  based on a Null-terminated format string and variable argument list.
+
+  VSPrint function to process format and place the results in Buffer. Since a 
+  VA_LIST is used this rountine allows the nesting of Vararg routines. Thus 
+  this is the main print working routine.
+
+  @param  Buffer        Character buffer to print the results of the parsing
+                        of Format into.
+  @param  BufferSize    Maximum number of characters to put into buffer.
+                        Zero means no limit.
+  @param  Flags         Intial flags value.
+                        Can only have FORMAT_UNICODE and OUTPUT_UNICODE set
+  @param  FormatString  Null-terminated format string.
+
+  @return Number of characters printed not including the Null-terminator.
+
+**/
+UINTN
+BasePrintLibSPrint (
+  OUT CHAR8        *StartOfBuffer,
+  IN  UINTN        BufferSize,
+  IN  UINTN        Flags,
+  IN  CONST CHAR8  *FormatString,
+  ...
+  )
+{
+  VA_LIST  Marker;
+
+  VA_START (Marker, FormatString);
+  return BasePrintLibVSPrint (StartOfBuffer, BufferSize, Flags, FormatString, Marker);
+}
+
+/**
+  Produces a Null-terminated Unicode string in an output buffer based on 
+  a Null-terminated Unicode format string and a VA_LIST argument list
+  
+  Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer
+  and BufferSize.  
+  The Unicode string is produced by parsing the format string specified by FormatString.  
+  Arguments are pulled from the variable argument list specified by Marker based on the 
+  contents of the format string.  
+  The number of Unicode characters in the produced output buffer is returned not including
+  the Null-terminator.
+  If BufferSize is 0 or 1, then no output buffer is produced and 0 is returned.
+
+  If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().
+  If BufferSize > 1 and FormatString is NULL, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than 
+  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then
+  ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string
+  contains more than PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated 
+                          Unicode string.
+  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
+  @param  FormatString    Null-terminated Unicode format string.
+  @param  Marker          VA_LIST marker for the variable argument list.
+  
+  @return The number of Unicode characters in the produced output buffer not including the
+          Null-terminator.
+
+**/
+UINTN
+EFIAPI
+UnicodeVSPrint (
+  OUT CHAR16        *StartOfBuffer,
+  IN  UINTN         BufferSize,
+  IN  CONST CHAR16  *FormatString,
+  IN  VA_LIST       Marker
+  )
+{
+  return BasePrintLibVSPrint ((CHAR8 *)StartOfBuffer, BufferSize >> 1, FORMAT_UNICODE | OUTPUT_UNICODE, (CHAR8 *)FormatString, Marker);
+}
+
+/**
+  Produces a Null-terminated Unicode string in an output buffer based on a Null-terminated 
+  Unicode format string and variable argument list.
+  
+  Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer
+  and BufferSize.
+  The Unicode string is produced by parsing the format string specified by FormatString.
+  Arguments are pulled from the variable argument list based on the contents of the format string.
+  The number of Unicode characters in the produced output buffer is returned not including
+  the Null-terminator.
+  If BufferSize is 0 or 1, then no output buffer is produced and 0 is returned.
+
+  If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().
+  If BufferSize > 1 and FormatString is NULL, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than 
+  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then
+  ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string
+  contains more than PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated 
+                          Unicode string.
+  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
+  @param  FormatString    Null-terminated Unicode format string.
+  
+  @return The number of Unicode characters in the produced output buffer not including the
+          Null-terminator.
+
+**/
+UINTN
+EFIAPI
+UnicodeSPrint (
+  OUT CHAR16        *StartOfBuffer,
+  IN  UINTN         BufferSize,
+  IN  CONST CHAR16  *FormatString,
+  ...
+  )
+{
+  VA_LIST Marker;
+
+  VA_START (Marker, FormatString);
+  return UnicodeVSPrint (StartOfBuffer, BufferSize, FormatString, Marker);
+}
+
+/**
+  Produces a Null-terminated Unicode string in an output buffer based on a Null-terminated
+  ASCII format string and a VA_LIST argument list
+  
+  Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer
+  and BufferSize.
+  The Unicode string is produced by parsing the format string specified by FormatString.
+  Arguments are pulled from the variable argument list specified by Marker based on the 
+  contents of the format string.
+  The number of Unicode characters in the produced output buffer is returned not including
+  the Null-terminator.
+  If BufferSize is 0 or 1, then no output buffer is produced and 0 is returned.
+
+  If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().
+  If BufferSize > 1 and FormatString is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then
+  ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string
+  contains more than PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated 
+                          Unicode string.
+  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
+  @param  FormatString    Null-terminated Unicode format string.
+  @param  Marker          VA_LIST marker for the variable argument list.
+  
+  @return The number of Unicode characters in the produced output buffer not including the
+          Null-terminator.
+
+**/
+UINTN
+EFIAPI
+UnicodeVSPrintAsciiFormat (
+  OUT CHAR16       *StartOfBuffer,
+  IN  UINTN        BufferSize,
+  IN  CONST CHAR8  *FormatString,
+  IN  VA_LIST      Marker
+  )
+{
+  return BasePrintLibVSPrint ((CHAR8 *)StartOfBuffer, BufferSize >> 1, OUTPUT_UNICODE,FormatString, Marker);
+}
+
+/**
+  Produces a Null-terminated Unicode string in an output buffer based on a Null-terminated 
+  ASCII format string and  variable argument list.
+  
+  Produces a Null-terminated Unicode string in the output buffer specified by StartOfBuffer
+  and BufferSize.
+  The Unicode string is produced by parsing the format string specified by FormatString.
+  Arguments are pulled from the variable argument list based on the contents of the 
+  format string.
+  The number of Unicode characters in the produced output buffer is returned not including
+  the Null-terminator.
+  If BufferSize is 0 or 1, then no output buffer is produced and 0 is returned.
+
+  If BufferSize > 1 and StartOfBuffer is NULL, then ASSERT().
+  If BufferSize > 1 and FormatString is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then
+  ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and produced Null-terminated Unicode string
+  contains more than PcdMaximumUnicodeStringLength Unicode characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated 
+                          Unicode string.
+  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
+  @param  FormatString    Null-terminated Unicode format string.
+  
+  @return The number of Unicode characters in the produced output buffer not including the
+          Null-terminator.
+
+**/
+UINTN
+EFIAPI
+UnicodeSPrintAsciiFormat (
+  OUT CHAR16       *StartOfBuffer,
+  IN  UINTN        BufferSize,
+  IN  CONST CHAR8  *FormatString,
+  ...
+  )
+{
+  VA_LIST Marker;
+
+  VA_START (Marker, FormatString);
+  return UnicodeVSPrintAsciiFormat (StartOfBuffer, BufferSize, FormatString, Marker);
+}
+
+/**
+  Converts a decimal value to a Null-terminated Unicode string.
+  
+  Converts the decimal number specified by Value to a Null-terminated Unicode 
+  string specified by Buffer containing at most Width characters. No padding of spaces 
+  is ever performed. If Width is 0 then a width of MAXIMUM_VALUE_CHARACTERS is assumed.
+  The number of Unicode characters in Buffer is returned not including the Null-terminator.
+  If the conversion contains more than Width characters, then only the first
+  Width characters are returned, and the total number of characters 
+  required to perform the conversion is returned.
+  Additional conversion parameters are specified in Flags.  
+  
+  The Flags bit LEFT_JUSTIFY is always ignored.
+  All conversions are left justified in Buffer.
+  If Width is 0, PREFIX_ZERO is ignored in Flags.
+  If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and commas
+  are inserted every 3rd digit starting from the right.
+  If HEX_RADIX is set in Flags, then the output buffer will be 
+  formatted in hexadecimal format.
+  If Value is < 0 and HEX_RADIX is not set in Flags, then the fist character in Buffer is a '-'.
+  If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored, 
+  then Buffer is padded with '0' characters so the combination of the optional '-' 
+  sign character, '0' characters, digit characters for Value, and the Null-terminator
+  add up to Width characters.
+  If both COMMA_TYPE and HEX_RADIX are set in Flags, then ASSERT().
+  If Buffer is NULL, then ASSERT().
+  If unsupported bits are set in Flags, then ASSERT().
+  If both COMMA_TYPE and HEX_RADIX are set in Flags, then ASSERT().
+  If Width >= MAXIMUM_VALUE_CHARACTERS, then ASSERT()
+
+  @param  Buffer  Pointer to the output buffer for the produced Null-terminated
+                  Unicode string.
+  @param  Flags   The bitmask of flags that specify left justification, zero pad, and commas.
+  @param  Value   The 64-bit signed value to convert to a string.
+  @param  Width   The maximum number of Unicode characters to place in Buffer, not including
+                  the Null-terminator.
+  
+  @return The number of Unicode characters in Buffer not including the Null-terminator.
+
+**/
+UINTN
+EFIAPI
+UnicodeValueToString (
+  IN OUT CHAR16  *Buffer,
+  IN UINTN       Flags,
+  IN INT64       Value,
+  IN UINTN       Width
+  )
+{
+  return BasePrintLibConvertValueToString ((CHAR8 *)Buffer, Flags, Value, Width, 2);
+}
+
+/**
+  Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated
+  ASCII format string and a VA_LIST argument list.
+  
+  Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer
+  and BufferSize.
+  The ASCII string is produced by parsing the format string specified by FormatString.
+  Arguments are pulled from the variable argument list specified by Marker based on 
+  the contents of the format string.
+  The number of ASCII characters in the produced output buffer is returned not including
+  the Null-terminator.
+  If BufferSize is 0, then no output buffer is produced and 0 is returned.
+
+  If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT().
+  If BufferSize > 0 and FormatString is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then
+  ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string
+  contains more than PcdMaximumAsciiStringLength ASCII characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated 
+                          ASCII string.
+  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
+  @param  FormatString    Null-terminated Unicode format string.
+  @param  Marker          VA_LIST marker for the variable argument list.
+  
+  @return The number of ASCII characters in the produced output buffer not including the
+          Null-terminator.
+
+**/
+UINTN
+EFIAPI
+AsciiVSPrint (
+  OUT CHAR8         *StartOfBuffer,
+  IN  UINTN         BufferSize,
+  IN  CONST CHAR8   *FormatString,
+  IN  VA_LIST       Marker
+  )
+{
+  return BasePrintLibVSPrint (StartOfBuffer, BufferSize, 0, FormatString, Marker);
+}
+
+/**
+  Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated
+  ASCII format string and  variable argument list.
+  
+  Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer
+  and BufferSize.
+  The ASCII string is produced by parsing the format string specified by FormatString.
+  Arguments are pulled from the variable argument list based on the contents of the 
+  format string.
+  The number of ASCII characters in the produced output buffer is returned not including
+  the Null-terminator.
+  If BufferSize is 0, then no output buffer is produced and 0 is returned.
+
+  If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT().
+  If BufferSize > 0 and FormatString is NULL, then ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and FormatString contains more than
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator, then
+  ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string
+  contains more than PcdMaximumAsciiStringLength ASCII characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated 
+                          ASCII string.
+  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
+  @param  FormatString    Null-terminated Unicode format string.
+  
+  @return The number of ASCII characters in the produced output buffer not including the
+          Null-terminator.
+
+**/
+UINTN
+EFIAPI
+AsciiSPrint (
+  OUT CHAR8        *StartOfBuffer,
+  IN  UINTN        BufferSize,
+  IN  CONST CHAR8  *FormatString,
+  ...
+  )
+{
+  VA_LIST Marker;
+
+  VA_START (Marker, FormatString);
+  return AsciiVSPrint (StartOfBuffer, BufferSize, FormatString, Marker);
+}
+
+/**
+  Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated
+  ASCII format string and a VA_LIST argument list.
+  
+  Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer
+  and BufferSize.
+  The ASCII string is produced by parsing the format string specified by FormatString.
+  Arguments are pulled from the variable argument list specified by Marker based on 
+  the contents of the format string.
+  The number of ASCII characters in the produced output buffer is returned not including
+  the Null-terminator.
+  If BufferSize is 0, then no output buffer is produced and 0 is returned.
+
+  If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT().
+  If BufferSize > 0 and FormatString is NULL, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than
+  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then
+  ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string
+  contains more than PcdMaximumAsciiStringLength ASCII characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated 
+                          ASCII string.
+  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
+  @param  FormatString    Null-terminated Unicode format string.
+  @param  Marker          VA_LIST marker for the variable argument list.
+  
+  @return The number of ASCII characters in the produced output buffer not including the
+          Null-terminator.
+
+**/
+UINTN
+EFIAPI
+AsciiVSPrintUnicodeFormat (
+  OUT CHAR8         *StartOfBuffer,
+  IN  UINTN         BufferSize,
+  IN  CONST CHAR16  *FormatString,
+  IN  VA_LIST       Marker
+  )
+{
+  return BasePrintLibVSPrint (StartOfBuffer, BufferSize, FORMAT_UNICODE, (CHAR8 *)FormatString, Marker);
+}
+
+/**
+  Produces a Null-terminated ASCII string in an output buffer based on a Null-terminated
+  ASCII format string and  variable argument list.
+  
+  Produces a Null-terminated ASCII string in the output buffer specified by StartOfBuffer
+  and BufferSize.
+  The ASCII string is produced by parsing the format string specified by FormatString.
+  Arguments are pulled from the variable argument list based on the contents of the 
+  format string.
+  The number of ASCII characters in the produced output buffer is returned not including
+  the Null-terminator.
+  If BufferSize is 0, then no output buffer is produced and 0 is returned.
+
+  If BufferSize > 0 and StartOfBuffer is NULL, then ASSERT().
+  If BufferSize > 0 and FormatString is NULL, then ASSERT().
+  If PcdMaximumUnicodeStringLength is not zero, and FormatString contains more than
+  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator, then
+  ASSERT().
+  If PcdMaximumAsciiStringLength is not zero, and produced Null-terminated ASCII string
+  contains more than PcdMaximumAsciiStringLength ASCII characters not including the
+  Null-terminator, then ASSERT().
+
+  @param  StartOfBuffer   A pointer to the output buffer for the produced Null-terminated 
+                          ASCII string.
+  @param  BufferSize      The size, in bytes, of the output buffer specified by StartOfBuffer.
+  @param  FormatString    Null-terminated Unicode format string.
+  
+  @return The number of ASCII characters in the produced output buffer not including the
+          Null-terminator.
+
+**/
+UINTN
+EFIAPI
+AsciiSPrintUnicodeFormat (
+  OUT CHAR8         *StartOfBuffer,
+  IN  UINTN         BufferSize,
+  IN  CONST CHAR16  *FormatString,
+  ...
+  )
+{
+  VA_LIST Marker;
+
+  VA_START (Marker, FormatString);
+  return AsciiVSPrintUnicodeFormat (StartOfBuffer, BufferSize, FormatString, Marker);
+}
+
+
+/**
+  Converts a decimal value to a Null-terminated ASCII string.
+  
+  Converts the decimal number specified by Value to a Null-terminated ASCII string 
+  specified by Buffer containing at most Width characters. No padding of spaces 
+  is ever performed.
+  If Width is 0 then a width of  MAXIMUM_VALUE_CHARACTERS is assumed.
+  The number of ASCII characters in Buffer is returned not including the Null-terminator.
+  If the conversion contains more than Width characters, then only the first Width
+  characters are returned, and the total number of characters required to perform
+  the conversion is returned.
+  Additional conversion parameters are specified in Flags.  
+  The Flags bit LEFT_JUSTIFY is always ignored.
+  All conversions are left justified in Buffer.
+  If Width is 0, PREFIX_ZERO is ignored in Flags.
+  If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and commas
+  are inserted every 3rd digit starting from the right.
+  If HEX_RADIX is set in Flags, then the output buffer will be 
+  formatted in hexadecimal format.
+  If Value is < 0 and HEX_RADIX is not set in Flags, then the fist character in Buffer is a '-'.
+  If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored, 
+  then Buffer is padded with '0' characters so the combination of the optional '-' 
+  sign character, '0' characters, digit characters for Value, and the Null-terminator
+  add up to Width characters.
+  
+  If Buffer is NULL, then ASSERT().
+  If unsupported bits are set in Flags, then ASSERT().
+  If both COMMA_TYPE and HEX_RADIX are set in Flags, then ASSERT().
+  If Width >= MAXIMUM_VALUE_CHARACTERS, then ASSERT()
+
+  @param  Buffer  Pointer to the output buffer for the produced Null-terminated
+                  ASCII string.
+  @param  Flags   The bitmask of flags that specify left justification, zero pad, and commas.
+  @param  Value   The 64-bit signed value to convert to a string.
+  @param  Width   The maximum number of ASCII characters to place in Buffer, not including
+                  the Null-terminator.
+  
+  @return The number of ASCII characters in Buffer not including the Null-terminator.
+
+**/
+UINTN
+EFIAPI
+AsciiValueToString (
+  IN OUT CHAR8  *Buffer,
+  IN UINTN      Flags,
+  IN INT64      Value,
+  IN UINTN      Width
+  )
+{
+  return BasePrintLibConvertValueToString ((CHAR8 *)Buffer, Flags, Value, Width, 1);
+}
+
index 3d2f2952f9ec73db12599ee917b180ab5f684384..675e2a80e28ede2ca5794b60f6b90be34f7a5e71 100644 (file)
-/** @file\r
-  Print Library worker functions.\r
-\r
-  Copyright (c) 2006, Intel Corporation<BR>\r
-  All rights reserved. This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-  Module Name:  PrintLibInternal.c\r
-\r
-**/\r
-\r
-#include "PrintLibInternal.h"\r
-\r
-GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 mHexStr[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};\r
-\r
-\r
-/**\r
-  Internal function that places the character into the Buffer.\r
-\r
-  Internal function that places ASCII or Unicode character into the Buffer.\r
-\r
-  @param  Buffer      Buffer to place the Unicode or ASCII string.\r
-  @param  EndBuffer   The end of the input Buffer. No characters will be\r
-                      placed after that. \r
-  @param  Length      Count of character to be placed into Buffer.\r
-  @param  Character   Character to be placed into Buffer.\r
-  @param  Increment   Character increment in Buffer.\r
-\r
-  @return Number of characters printed.\r
-\r
-**/\r
-CHAR8 *\r
-BasePrintLibFillBuffer (\r
-  CHAR8   *Buffer,\r
-  CHAR8   *EndBuffer,\r
-  INTN    Length,\r
-  UINTN   Character,\r
-  INTN    Increment\r
-  )\r
-{\r
-  INTN  Index;\r
-\r
-  for (Index = 0; Index < Length && Buffer < EndBuffer; Index++) {\r
-    *Buffer       =  (CHAR8) Character;\r
-    *(Buffer + 1) =  (CHAR8) (Character >> 8);\r
-    Buffer        += Increment;\r
-  }\r
-  return Buffer;\r
-}\r
-\r
-/**\r
-  Internal function that convert a decimal number to a string in Buffer.\r
-\r
-  Print worker function that convert a decimal number to a string in Buffer.\r
-\r
-  @param  Buffer    Location to place the Unicode or ASCII string of Value.\r
-  @param  Value     Value to convert to a Decimal or Hexidecimal string in Buffer.\r
-  @param  Radix     Radix of the value\r
-\r
-  @return Number of characters printed.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-BasePrintLibValueToString (\r
-  IN OUT CHAR8  *Buffer,\r
-  IN INT64      Value,\r
-  IN UINTN      Radix\r
-  )\r
-{\r
-  UINTN   Digits;\r
-  UINT32  Remainder;\r
-\r
-  //\r
-  // Loop to convert one digit at a time in reverse order\r
-  //\r
-  *(Buffer++) = 0;\r
-  Digits = 0;\r
-  do {\r
-    Value = (INT64)DivU64x32Remainder ((UINT64)Value, (UINT32)Radix, &Remainder);\r
-    *(Buffer++) = mHexStr[Remainder];\r
-    Digits++;\r
-  } while (Value != 0);\r
-  return Digits;\r
-}\r
-\r
-/**\r
-  Internal function that converts a decimal value to a Null-terminated string.\r
-  \r
-  Converts the decimal number specified by Value to a Null-terminated  \r
-  string specified by Buffer containing at most Width characters.\r
-  If Width is 0 then a width of  MAXIMUM_VALUE_CHARACTERS is assumed.\r
-  The number of characters in Buffer is returned not including the Null-terminator.\r
-  If the conversion contains more than Width characters, then only the first\r
-  Width characters are returned, and the total number of characters \r
-  required to perform the conversion is returned.\r
-  Additional conversion parameters are specified in Flags.  \r
-  The Flags bit LEFT_JUSTIFY is always ignored.\r
-  All conversions are left justified in Buffer.\r
-  If Width is 0, PREFIX_ZERO is ignored in Flags.\r
-  If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and commas\r
-  are inserted every 3rd digit starting from the right.\r
-  If Value is < 0, then the fist character in Buffer is a '-'.\r
-  If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored, \r
-  then Buffer is padded with '0' characters so the combination of the optional '-' \r
-  sign character, '0' characters, digit characters for Value, and the Null-terminator\r
-  add up to Width characters.\r
-\r
-  If Buffer is NULL, then ASSERT().\r
-  If unsupported bits are set in Flags, then ASSERT().\r
-  If Width >= MAXIMUM_VALUE_CHARACTERS, then ASSERT()\r
-\r
-  @param  Buffer    Pointer to the output buffer for the produced Null-terminated\r
-                    string.\r
-  @param  Flags     The bitmask of flags that specify left justification, zero pad,\r
-                    and commas.\r
-  @param  Value     The 64-bit signed value to convert to a string.\r
-  @param  Width     The maximum number of characters to place in Buffer, not including\r
-                    the Null-terminator.\r
-  @param  Increment Character increment in Buffer.\r
-  \r
-  @return The number of characters in Buffer not including the Null-terminator.\r
-\r
-**/\r
-UINTN\r
-BasePrintLibConvertValueToString (\r
-  IN OUT CHAR8   *Buffer,\r
-  IN UINTN       Flags,\r
-  IN INT64       Value,\r
-  IN UINTN       Width,\r
-  IN UINTN       Increment\r
-  )\r
-{\r
-  CHAR8  *OriginalBuffer;\r
-  CHAR8  *EndBuffer;\r
-  CHAR8  ValueBuffer[MAXIMUM_VALUE_CHARACTERS];\r
-  UINTN  Count;\r
-  UINTN  Digits;\r
-  UINTN  Index;\r
-\r
-  ASSERT (Buffer != NULL);\r
-  ASSERT (Width < MAXIMUM_VALUE_CHARACTERS);\r
-  //\r
-  // Make sure Flags can only contain supported bits.\r
-  //\r
-  ASSERT ((Flags & ~(LEFT_JUSTIFY | COMMA_TYPE | PREFIX_ZERO)) == 0);\r
-\r
-  OriginalBuffer = Buffer;\r
-\r
-  if (Width == 0 || (Flags & COMMA_TYPE) != 0) {\r
-    Flags &= (~PREFIX_ZERO);\r
-  }\r
-\r
-  if (Width == 0) {\r
-    Width = MAXIMUM_VALUE_CHARACTERS - 1;\r
-  }\r
-  //\r
-  // Set the tag for the end of the input Buffer.\r
-  //\r
-  EndBuffer = Buffer + Width * Increment;\r
-\r
-  if (Value < 0) {\r
-    Value = -Value;\r
-    Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, '-', Increment);\r
-    Width--;\r
-  }\r
-\r
-  Count = BasePrintLibValueToString (ValueBuffer, Value, 10);\r
-\r
-  if ((Flags & PREFIX_ZERO) != 0) {\r
-    Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Width - Count, '0', Increment);\r
-  }\r
-\r
-  Digits = Count % 3;\r
-  if (Digits != 0) {\r
-    Digits = 3 - Digits;\r
-  }\r
-  for (Index = 0; Index < Count; Index++) {\r
-    Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ValueBuffer[Count - Index], Increment);\r
-    if ((Flags & COMMA_TYPE) != 0) {\r
-      Digits++;\r
-      if (Digits == 3) {\r
-        Digits = 0;\r
-        if ((Index + 1) < Count) {\r
-          Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ',', Increment);\r
-        }\r
-      }\r
-    }\r
-  }\r
-\r
-  BasePrintLibFillBuffer (Buffer, EndBuffer + Increment, 1, 0, Increment);\r
-\r
-  return ((Buffer - OriginalBuffer) / Increment);\r
-}\r
+/** @file
+  Print Library worker functions.
+
+  Copyright (c) 2006 - 2007, Intel Corporation<BR>
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Module Name:  PrintLibInternal.c
+
+**/
+
+#include "PrintLibInternal.h"
+
+GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 mHexStr[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
+
+
+/**
+  Internal function that places the character into the Buffer.
+
+  Internal function that places ASCII or Unicode character into the Buffer.
+
+  @param  Buffer      Buffer to place the Unicode or ASCII string.
+  @param  EndBuffer   The end of the input Buffer. No characters will be
+                      placed after that. 
+  @param  Length      Count of character to be placed into Buffer.
+  @param  Character   Character to be placed into Buffer.
+  @param  Increment   Character increment in Buffer.
+
+  @return Number of characters printed.
+
+**/
+CHAR8 *
+BasePrintLibFillBuffer (
+  CHAR8   *Buffer,
+  CHAR8   *EndBuffer,
+  INTN    Length,
+  UINTN   Character,
+  INTN    Increment
+  )
+{
+  INTN  Index;
+
+  for (Index = 0; Index < Length && Buffer < EndBuffer; Index++) {
+    *Buffer       =  (CHAR8) Character;
+    *(Buffer + 1) =  (CHAR8) (Character >> 8);
+    Buffer        += Increment;
+  }
+  return Buffer;
+}
+
+/**
+  Internal function that convert a decimal number to a string in Buffer.
+
+  Print worker function that convert a decimal number to a string in Buffer.
+
+  @param  Buffer    Location to place the Unicode or ASCII string of Value.
+  @param  Value     Value to convert to a Decimal or Hexidecimal string in Buffer.
+  @param  Radix     Radix of the value
+
+  @return Number of characters printed.
+
+**/
+UINTN
+EFIAPI
+BasePrintLibValueToString (
+  IN OUT CHAR8  *Buffer,
+  IN INT64      Value,
+  IN UINTN      Radix
+  )
+{
+  UINTN   Digits;
+  UINT32  Remainder;
+
+  //
+  // Loop to convert one digit at a time in reverse order
+  //
+  *(Buffer++) = 0;
+  Digits = 0;
+  do {
+    Value = (INT64)DivU64x32Remainder ((UINT64)Value, (UINT32)Radix, &Remainder);
+    *(Buffer++) = mHexStr[Remainder];
+    Digits++;
+  } while (Value != 0);
+  return Digits;
+}
+
+/**
+  Internal function that converts a decimal value to a Null-terminated string.
+  
+  Converts the decimal number specified by Value to a Null-terminated  
+  string specified by Buffer containing at most Width characters.
+  If Width is 0 then a width of  MAXIMUM_VALUE_CHARACTERS is assumed.
+  The number of characters in Buffer is returned not including the Null-terminator.
+  If the conversion contains more than Width characters, then only the first
+  Width characters are returned, and the total number of characters 
+  required to perform the conversion is returned.
+  Additional conversion parameters are specified in Flags.  
+  The Flags bit LEFT_JUSTIFY is always ignored.
+  All conversions are left justified in Buffer.
+  If Width is 0, PREFIX_ZERO is ignored in Flags.
+  If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and commas
+  are inserted every 3rd digit starting from the right.
+  If HEX_RADIX is set in Flags, then the output buffer will be formatted in hexadecimal format.
+  If Value is < 0 and HEX_RADIX is not set in Flags, then the fist character in Buffer is a '-'.
+  If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored, 
+  then Buffer is padded with '0' characters so the combination of the optional '-' 
+  sign character, '0' characters, digit characters for Value, and the Null-terminator
+  add up to Width characters.
+  If both COMMA_TYPE and HEX_RADIX are set in Flags, then ASSERT().
+
+  If Buffer is NULL, then ASSERT().
+  If unsupported bits are set in Flags, then ASSERT().
+  If Width >= MAXIMUM_VALUE_CHARACTERS, then ASSERT()
+
+  @param  Buffer    Pointer to the output buffer for the produced Null-terminated
+                    string.
+  @param  Flags     The bitmask of flags that specify left justification, zero pad,
+                    and commas.
+  @param  Value     The 64-bit signed value to convert to a string.
+  @param  Width     The maximum number of characters to place in Buffer, not including
+                    the Null-terminator.
+  @param  Increment Character increment in Buffer.
+  
+  @return The number of characters in Buffer not including the Null-terminator.
+
+**/
+UINTN
+BasePrintLibConvertValueToString (
+  IN OUT CHAR8   *Buffer,
+  IN UINTN       Flags,
+  IN INT64       Value,
+  IN UINTN       Width,
+  IN UINTN       Increment
+  )
+{
+  CHAR8  *OriginalBuffer;
+  CHAR8  *EndBuffer;
+  CHAR8  ValueBuffer[MAXIMUM_VALUE_CHARACTERS];
+  UINTN  Count;
+  UINTN  Digits;
+  UINTN  Index;
+  UINTN  Radix;
+
+  ASSERT (Buffer != NULL);
+  ASSERT (Width < MAXIMUM_VALUE_CHARACTERS);
+  //
+  // Make sure Flags can only contain supported bits.
+  //
+  ASSERT ((Flags & ~(LEFT_JUSTIFY | COMMA_TYPE | PREFIX_ZERO | RADIX_HEX)) == 0);
+
+  //
+  // If both COMMA_TYPE and HEX_RADIX are set, then ASSERT ()
+  //
+  ASSERT (((Flags & COMMA_TYPE) != 0 && (Flags & RADIX_HEX) != 0) == FALSE);
+
+  OriginalBuffer = Buffer;
+
+  if (Width == 0 || (Flags & COMMA_TYPE) != 0) {
+    Flags &= (~PREFIX_ZERO);
+  }
+
+  if (Width == 0) {
+    Width = MAXIMUM_VALUE_CHARACTERS - 1;
+  }
+  //
+  // Set the tag for the end of the input Buffer.
+  //
+  EndBuffer = Buffer + Width * Increment;
+
+  if ((Value < 0) && ((Flags & RADIX_HEX) == 0)) {
+    Value = -Value;
+    Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, '-', Increment);
+    Width--;
+  }
+
+  Radix = ((Flags & RADIX_HEX) == 0)? 10 : 16;
+  Count = BasePrintLibValueToString (ValueBuffer, Value, Radix);
+
+  if ((Flags & PREFIX_ZERO) != 0) {
+    Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, Width - Count, '0', Increment);
+  }
+
+  Digits = Count % 3;
+  if (Digits != 0) {
+    Digits = 3 - Digits;
+  }
+  for (Index = 0; Index < Count; Index++) {
+    Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ValueBuffer[Count - Index], Increment);
+    if ((Flags & COMMA_TYPE) != 0) {
+      Digits++;
+      if (Digits == 3) {
+        Digits = 0;
+        if ((Index + 1) < Count) {
+          Buffer = BasePrintLibFillBuffer (Buffer, EndBuffer, 1, ',', Increment);
+        }
+      }
+    }
+  }
+
+  BasePrintLibFillBuffer (Buffer, EndBuffer + Increment, 1, 0, Increment);
+
+  return ((Buffer - OriginalBuffer) / Increment);
+}
+
index 5a63cbb8b79f06938bbf280ba182a4dffb57818b..4482cc266c4c8bd35de4cdaaad7f7e63a1138ec1 100644 (file)
-/** @file\r
-  Print Library.\r
-\r
-  Copyright (c) 2006, Intel Corporation\r
-  All rights reserved. This program and the accompanying materials\r
-  are licensed and made available under the terms and conditions of the BSD License\r
-  which accompanies this distribution.  The full text of the license may be found at\r
-  http://opensource.org/licenses/bsd-license.php\r
-\r
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-  Module Name:  PrintLibInternal.h\r
-\r
-**/\r
-\r
-#ifndef __PRINT_LIB_INTERNAL_H\r
-#define __PRINT_LIB_INTERNAL_H\r
-\r
-//\r
-// Print primitives\r
-//\r
-//#define LEFT_JUSTIFY      0x01\r
-#define PREFIX_SIGN       0x02\r
-#define PREFIX_BLANK      0x04\r
-//#define COMMA_TYPE        0x08\r
-#define LONG_TYPE         0x10\r
-//#define PREFIX_ZERO       0x20\r
-#define OUTPUT_UNICODE    0x40\r
-#define RADIX_HEX         0x80\r
-#define FORMAT_UNICODE    0x100\r
-#define PAD_TO_WIDTH      0x200\r
-#define ARGUMENT_UNICODE  0x400\r
-#define PRECISION         0x800\r
-#define ARGUMENT_REVERSED 0x1000\r
-\r
-//\r
-// Record date and time information\r
-//\r
-typedef struct {\r
-  UINT16  Year;\r
-  UINT8   Month;\r
-  UINT8   Day;\r
-  UINT8   Hour;\r
-  UINT8   Minute;\r
-  UINT8   Second;\r
-  UINT8   Pad1;\r
-  UINT32  Nanosecond;\r
-  INT16   TimeZone;\r
-  UINT8   Daylight;\r
-  UINT8   Pad2;\r
-} TIME;\r
-\r
-/**\r
-  Worker function that produces a Null-terminated string in an output buffer \r
-  based on a Null-terminated format string and a VA_LIST argument list.\r
-\r
-  VSPrint function to process format and place the results in Buffer. Since a \r
-  VA_LIST is used this rountine allows the nesting of Vararg routines. Thus \r
-  this is the main print working routine.\r
-\r
-  @param  Buffer      Character buffer to print the results of the parsing\r
-                      of Format into.\r
-  @param  BufferSize  Maximum number of characters to put into buffer.\r
-  @param  Flags       Intial flags value.\r
-                      Can only have FORMAT_UNICODE and OUTPUT_UNICODE set.\r
-  @param  Format      Null-terminated format string.\r
-  @param  Marker      Vararg list consumed by processing Format.\r
-\r
-  @return Number of characters printed not including the Null-terminator.\r
-\r
-**/\r
-UINTN\r
-BasePrintLibVSPrint (\r
-  OUT CHAR8        *Buffer,\r
-  IN  UINTN        BufferSize,\r
-  IN  UINTN        Flags,\r
-  IN  CONST CHAR8  *Format,\r
-  IN  VA_LIST      Marker\r
-  );\r
-\r
-/**\r
-  Worker function that produces a Null-terminated string in an output buffer \r
-  based on a Null-terminated format string and variable argument list.\r
-\r
-  VSPrint function to process format and place the results in Buffer. Since a \r
-  VA_LIST is used this rountine allows the nesting of Vararg routines. Thus \r
-  this is the main print working routine\r
-\r
-  @param  Buffer        Character buffer to print the results of the parsing\r
-                        of Format into.\r
-  @param  BufferSize    Maximum number of characters to put into buffer.\r
-                        Zero means no limit.\r
-  @param  Flags         Intial flags value.\r
-                        Can only have FORMAT_UNICODE and OUTPUT_UNICODE set\r
-  @param  FormatString  Null-terminated format string.\r
-\r
-  @return Number of characters printed.\r
-\r
-**/\r
-UINTN\r
-BasePrintLibSPrint (\r
-  OUT CHAR8        *Buffer,\r
-  IN  UINTN        BufferSize,\r
-  IN  UINTN        Flags,\r
-  IN  CONST CHAR8  *FormatString,\r
-  ...\r
-  );\r
-\r
-/**\r
-  Internal function that places the character into the Buffer.\r
-\r
-  Internal function that places ASCII or Unicode character into the Buffer.\r
-\r
-  @param  Buffer      Buffer to place the Unicode or ASCII string.\r
-  @param  EndBuffer   The end of the input Buffer. No characters will be\r
-                      placed after that. \r
-  @param  Length      Count of character to be placed into Buffer.\r
-  @param  Character   Character to be placed into Buffer.\r
-  @param  Increment   Character increment in Buffer.\r
-\r
-  @return Number of characters printed.\r
-\r
-**/\r
-CHAR8 *\r
-BasePrintLibFillBuffer (\r
-  CHAR8   *Buffer,\r
-  CHAR8   *EndBuffer,\r
-  INTN    Length,\r
-  UINTN   Character,\r
-  INTN    Increment\r
-  );\r
-\r
-/**\r
-  Internal function that convert a decimal number to a string in Buffer.\r
-\r
-  Print worker function that convert a decimal number to a string in Buffer.\r
-\r
-  @param  Buffer    Location to place the Unicode or ASCII string of Value.\r
-  @param  Value     Value to convert to a Decimal or Hexidecimal string in Buffer.\r
-  @param  Radix     Radix of the value\r
-\r
-  @return Number of characters printed.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-BasePrintLibValueToString (\r
-  IN OUT CHAR8  *Buffer, \r
-  IN INT64      Value, \r
-  IN UINTN      Radix\r
-  );\r
-\r
-/**\r
-  Internal function that converts a decimal value to a Null-terminated string.\r
-  \r
-  Converts the decimal number specified by Value to a Null-terminated  \r
-  string specified by Buffer containing at most Width characters.\r
-  If Width is 0 then a width of  MAXIMUM_VALUE_CHARACTERS is assumed.\r
-  The total number of characters placed in Buffer is returned.\r
-  If the conversion contains more than Width characters, then only the first\r
-  Width characters are returned, and the total number of characters \r
-  required to perform the conversion is returned.\r
-  Additional conversion parameters are specified in Flags.  \r
-  The Flags bit LEFT_JUSTIFY is always ignored.\r
-  All conversions are left justified in Buffer.\r
-  If Width is 0, PREFIX_ZERO is ignored in Flags.\r
-  If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and commas\r
-  are inserted every 3rd digit starting from the right.\r
-  If Value is < 0, then the fist character in Buffer is a '-'.\r
-  If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored, \r
-  then Buffer is padded with '0' characters so the combination of the optional '-' \r
-  sign character, '0' characters, digit characters for Value, and the Null-terminator\r
-  add up to Width characters.\r
-\r
-  If Buffer is NULL, then ASSERT().\r
-  If unsupported bits are set in Flags, then ASSERT().\r
-  If Width >= MAXIMUM_VALUE_CHARACTERS, then ASSERT()\r
-\r
-  @param  Buffer    Pointer to the output buffer for the produced Null-terminated\r
-                    string.\r
-  @param  Flags     The bitmask of flags that specify left justification, zero pad,\r
-                    and commas.\r
-  @param  Value     The 64-bit signed value to convert to a string.\r
-  @param  Width     The maximum number of characters to place in Buffer, not including\r
-                    the Null-terminator.\r
-  @param  Increment Character increment in Buffer.\r
-  \r
-  @return Total number of characters required to perform the conversion.\r
-\r
-**/\r
-UINTN\r
-BasePrintLibConvertValueToString (\r
-  IN OUT CHAR8   *Buffer,\r
-  IN UINTN       Flags,\r
-  IN INT64       Value,\r
-  IN UINTN       Width,\r
-  IN UINTN       Increment\r
-  );\r
-\r
-#endif\r
+/** @file
+  Print Library Internal Functions.
+
+  Copyright (c) 2006 - 2007, Intel Corporation
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+  Module Name:  PrintLibInternal.h
+
+**/
+
+#ifndef __PRINT_LIB_INTERNAL_H
+#define __PRINT_LIB_INTERNAL_H
+
+//
+// Print primitives
+//
+//#define LEFT_JUSTIFY      0x01
+#define PREFIX_SIGN       0x02
+#define PREFIX_BLANK      0x04
+//#define COMMA_TYPE        0x08
+#define LONG_TYPE         0x10
+//#define PREFIX_ZERO       0x20
+#define OUTPUT_UNICODE    0x40
+//#define RADIX_HEX         0x80
+#define FORMAT_UNICODE    0x100
+#define PAD_TO_WIDTH      0x200
+#define ARGUMENT_UNICODE  0x400
+#define PRECISION         0x800
+#define ARGUMENT_REVERSED 0x1000
+
+//
+// Record date and time information
+//
+typedef struct {
+  UINT16  Year;
+  UINT8   Month;
+  UINT8   Day;
+  UINT8   Hour;
+  UINT8   Minute;
+  UINT8   Second;
+  UINT8   Pad1;
+  UINT32  Nanosecond;
+  INT16   TimeZone;
+  UINT8   Daylight;
+  UINT8   Pad2;
+} TIME;
+
+/**
+  Worker function that produces a Null-terminated string in an output buffer 
+  based on a Null-terminated format string and a VA_LIST argument list.
+
+  VSPrint function to process format and place the results in Buffer. Since a 
+  VA_LIST is used this rountine allows the nesting of Vararg routines. Thus 
+  this is the main print working routine.
+
+  @param  Buffer      Character buffer to print the results of the parsing
+                      of Format into.
+  @param  BufferSize  Maximum number of characters to put into buffer.
+  @param  Flags       Intial flags value.
+                      Can only have FORMAT_UNICODE and OUTPUT_UNICODE set.
+  @param  Format      Null-terminated format string.
+  @param  Marker      Vararg list consumed by processing Format.
+
+  @return Number of characters printed not including the Null-terminator.
+
+**/
+UINTN
+BasePrintLibVSPrint (
+  OUT CHAR8        *Buffer,
+  IN  UINTN        BufferSize,
+  IN  UINTN        Flags,
+  IN  CONST CHAR8  *Format,
+  IN  VA_LIST      Marker
+  );
+
+/**
+  Worker function that produces a Null-terminated string in an output buffer 
+  based on a Null-terminated format string and variable argument list.
+
+  VSPrint function to process format and place the results in Buffer. Since a 
+  VA_LIST is used this rountine allows the nesting of Vararg routines. Thus 
+  this is the main print working routine
+
+  @param  Buffer        Character buffer to print the results of the parsing
+                        of Format into.
+  @param  BufferSize    Maximum number of characters to put into buffer.
+                        Zero means no limit.
+  @param  Flags         Intial flags value.
+                        Can only have FORMAT_UNICODE and OUTPUT_UNICODE set
+  @param  FormatString  Null-terminated format string.
+
+  @return Number of characters printed.
+
+**/
+UINTN
+BasePrintLibSPrint (
+  OUT CHAR8        *Buffer,
+  IN  UINTN        BufferSize,
+  IN  UINTN        Flags,
+  IN  CONST CHAR8  *FormatString,
+  ...
+  );
+
+/**
+  Internal function that places the character into the Buffer.
+
+  Internal function that places ASCII or Unicode character into the Buffer.
+
+  @param  Buffer      Buffer to place the Unicode or ASCII string.
+  @param  EndBuffer   The end of the input Buffer. No characters will be
+                      placed after that. 
+  @param  Length      Count of character to be placed into Buffer.
+  @param  Character   Character to be placed into Buffer.
+  @param  Increment   Character increment in Buffer.
+
+  @return Number of characters printed.
+
+**/
+CHAR8 *
+BasePrintLibFillBuffer (
+  CHAR8   *Buffer,
+  CHAR8   *EndBuffer,
+  INTN    Length,
+  UINTN   Character,
+  INTN    Increment
+  );
+
+/**
+  Internal function that convert a decimal number to a string in Buffer.
+
+  Print worker function that convert a decimal number to a string in Buffer.
+
+  @param  Buffer    Location to place the Unicode or ASCII string of Value.
+  @param  Value     Value to convert to a Decimal or Hexidecimal string in Buffer.
+  @param  Radix     Radix of the value
+
+  @return Number of characters printed.
+
+**/
+UINTN
+EFIAPI
+BasePrintLibValueToString (
+  IN OUT CHAR8  *Buffer, 
+  IN INT64      Value, 
+  IN UINTN      Radix
+  );
+
+/**
+  Internal function that converts a decimal value to a Null-terminated string.
+  
+  Converts the decimal number specified by Value to a Null-terminated  
+  string specified by Buffer containing at most Width characters.
+  If Width is 0 then a width of  MAXIMUM_VALUE_CHARACTERS is assumed.
+  The total number of characters placed in Buffer is returned.
+  If the conversion contains more than Width characters, then only the first
+  Width characters are returned, and the total number of characters 
+  required to perform the conversion is returned.
+  Additional conversion parameters are specified in Flags.  
+  The Flags bit LEFT_JUSTIFY is always ignored.
+  All conversions are left justified in Buffer.
+  If Width is 0, PREFIX_ZERO is ignored in Flags.
+  If COMMA_TYPE is set in Flags, then PREFIX_ZERO is ignored in Flags, and commas
+  are inserted every 3rd digit starting from the right.
+  If Value is < 0, then the fist character in Buffer is a '-'.
+  If PREFIX_ZERO is set in Flags and PREFIX_ZERO is not being ignored, 
+  then Buffer is padded with '0' characters so the combination of the optional '-' 
+  sign character, '0' characters, digit characters for Value, and the Null-terminator
+  add up to Width characters.
+
+  If Buffer is NULL, then ASSERT().
+  If unsupported bits are set in Flags, then ASSERT().
+  If Width >= MAXIMUM_VALUE_CHARACTERS, then ASSERT()
+
+  @param  Buffer    Pointer to the output buffer for the produced Null-terminated
+                    string.
+  @param  Flags     The bitmask of flags that specify left justification, zero pad,
+                    and commas.
+  @param  Value     The 64-bit signed value to convert to a string.
+  @param  Width     The maximum number of characters to place in Buffer, not including
+                    the Null-terminator.
+  @param  Increment Character increment in Buffer.
+  
+  @return Total number of characters required to perform the conversion.
+
+**/
+UINTN
+BasePrintLibConvertValueToString (
+  IN OUT CHAR8   *Buffer,
+  IN UINTN       Flags,
+  IN INT64       Value,
+  IN UINTN       Width,
+  IN UINTN       Increment
+  );
+
+#endif
index 9901c6fb6d83c2e1e7d46e47fd6ecc900b6f006f..6bf6749bf7790a14075e36282d2f3e414b0cf02d 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   HOB Library.\r
 \r
-  Copyright (c) 2006, Intel Corporation<BR>\r
+  Copyright (c) 2006 - 2007, Intel Corporation<BR>\r
   All rights reserved. This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
@@ -160,6 +160,29 @@ GetFirstGuidHob (
   return GetNextGuidHob (Guid, HobList);\r
 }\r
 \r
+/**\r
+  Get the Boot Mode from the HOB list.\r
+\r
+  This function returns the system boot mode information from the \r
+  PHIT HOB in HOB list.\r
+\r
+  @param  VOID\r
+\r
+  @return The Boot Mode.\r
+\r
+**/\r
+EFI_BOOT_MODE\r
+EFIAPI\r
+GetBootModeHob (\r
+  VOID\r
+  )\r
+{\r
+  EFI_HOB_HANDOFF_INFO_TABLE    *HandOffHob;\r
+\r
+  HandOffHob = (EFI_HOB_HANDOFF_INFO_TABLE *) GetHobList ();\r
+\r
+  return  HandOffHob->BootMode;\r
+}\r
 /**\r
   Builds a HOB for a loaded PE32 module.\r
 \r
index b4ad4ff2f0448d362ec3ab14ceb42436604241e3..672dd3e46829c5ad2510512de550b331f11c9f27 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   HOB Library.\r
 \r
-  Copyright (c) 2006, Intel Corporation<BR>\r
+  Copyright (c) 2006 - 2007, Intel Corporation<BR>\r
   All rights reserved. This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
@@ -189,6 +189,30 @@ GetFirstGuidHob (
   return GetNextGuidHob (Guid, HobList);\r
 }\r
 \r
+/**\r
+  Get the Boot Mode from the HOB list.\r
+\r
+  This function returns the system boot mode information from the \r
+  PHIT HOB in HOB list.\r
+\r
+  @param  VOID\r
+\r
+  @return The Boot Mode.\r
+\r
+**/\r
+EFI_BOOT_MODE\r
+EFIAPI\r
+GetBootModeHob (\r
+  VOID\r
+  )\r
+{\r
+  EFI_HOB_HANDOFF_INFO_TABLE    *HandOffHob;\r
+\r
+  HandOffHob = (EFI_HOB_HANDOFF_INFO_TABLE *) GetHobList ();\r
+\r
+  return  HandOffHob->BootMode;\r
+}\r
+\r
 /**\r
   Builds a HOB for a loaded PE32 module.\r
 \r
index c72b8f34c5250865dec5d74d594fa42e05a085aa..0ee234ec26ea55b343344e2913051eb6e40013f3 100644 (file)
@@ -6,14 +6,14 @@
     <GuidValue>e94cd42a-3aad-4ea0-9b09-945891c60ccd</GuidValue>\r
     <Version>1.0</Version>\r
     <Abstract>Component description file for Cpu Io Dxe Io Library.</Abstract>\r
-    <Description>I/O Library implementation that uses the CPU I/O Protocol for I/O
+    <Description>I/O Library implementation that uses the CPU I/O Protocol for I/O\r
       and MMIO operations.</Description>\r
     <Copyright>Copyright (c) 2006, Intel Corporation.</Copyright>\r
-    <License>All rights reserved. This program and the accompanying materials
-      are licensed and made available under the terms and conditions of the BSD License
-      which accompanies this distribution.  The full text of the license may be found at
-      http://opensource.org/licenses/bsd-license.php
-      THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+    <License>All rights reserved. This program and the accompanying materials\r
+      are licensed and made available under the terms and conditions of the BSD License\r
+      which accompanies this distribution.  The full text of the license may be found at\r
+      http://opensource.org/licenses/bsd-license.php\r
+      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.</License>\r
     <Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION   0x00000052</Specification>\r
   </MsaHeader>\r
@@ -40,6 +40,7 @@
     <Filename>IoLib.c</Filename>\r
     <Filename>IoHighLevel.c</Filename>\r
     <Filename>DxeCpuIoLibInternal.h</Filename>\r
+    <Filename>IoLibMmioBuffer.c</Filename>\r
   </SourceFiles>\r
   <PackageDependencies>\r
     <Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>\r
diff --git a/MdePkg/Library/DxeIoLibCpuIo/IoLibMmioBuffer.c b/MdePkg/Library/DxeIoLibCpuIo/IoLibMmioBuffer.c
new file mode 100644 (file)
index 0000000..b8e6d83
--- /dev/null
@@ -0,0 +1,409 @@
+/** @file\r
+  I/O Library MMIO Buffer Functions.\r
+\r
+  Copyright (c) 2007, Intel Corporation<BR>\r
+  All rights reserved. This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+/**\r
+  Copy data from MMIO region to system memory by using 8-bit access.\r
+\r
+  Copy data from MMIO region specified by starting address StartAddress \r
+  to system memory specified by Buffer by using 8-bit access. The total \r
+  number of byte to be copied is specified by Length. Buffer is returned.\r
+  \r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied from.\r
+  @param  Length          Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer receiving the data read.\r
+\r
+  @return Buffer\r
+\r
+**/\r
+UINT8 *\r
+EFIAPI\r
+MmioReadBuffer8 (\r
+  IN  UINTN       StartAddress,\r
+  IN  UINTN       Length,\r
+  OUT UINT8       *Buffer\r
+  )\r
+{\r
+  UINT8   *ReturnBuffer;\r
+\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
\r
+  ReturnBuffer = Buffer;\r
+  \r
+  while (Length--) {\r
+    *(Buffer++) = MmioRead8 (StartAddress++);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\r
+\r
+/**\r
+  Copy data from MMIO region to system memory by using 16-bit access.\r
+\r
+  Copy data from MMIO region specified by starting address StartAddress \r
+  to system memory specified by Buffer by using 16-bit access. The total \r
+  number of byte to be copied is specified by Length. Buffer is returned.\r
+  \r
+  If StartAddress is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Buffer is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied from.\r
+  @param  Length          Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer receiving the data read.\r
+\r
+  @return Buffer\r
+\r
+**/\r
+UINT16 *\r
+EFIAPI\r
+MmioReadBuffer16 (\r
+  IN  UINTN       StartAddress,\r
+  IN  UINTN       Length,\r
+  OUT UINT16      *Buffer\r
+  )\r
+{\r
+  UINT16    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT16) - 1)) == 0);\r
+  \r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT16) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT16) - 1)) == 0);\r
\r
+  ReturnBuffer = Buffer;\r
+  \r
+  while (Length) {\r
+    *(Buffer++) = MmioRead16 (StartAddress);\r
+    StartAddress += sizeof (UINT16);\r
+    Length -= sizeof (UINT16);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\r
+\r
+/**\r
+  Copy data from MMIO region to system memory by using 32-bit access.\r
+\r
+  Copy data from MMIO region specified by starting address StartAddress \r
+  to system memory specified by Buffer by using 32-bit access. The total \r
+  number of byte to be copied is specified by Length. Buffer is returned.\r
+  \r
+  If StartAddress is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 32-bit boundary, then ASSERT().\r
+  If Buffer is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied from.\r
+  @param  Length          Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer receiving the data read.\r
+\r
+  @return Buffer\r
+\r
+**/\r
+UINT32 *\r
+EFIAPI\r
+MmioReadBuffer32 (\r
+  IN  UINTN       StartAddress,\r
+  IN  UINTN       Length,\r
+  OUT UINT32      *Buffer\r
+  )\r
+{\r
+  UINT32    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT32) - 1)) == 0);\r
+  \r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT32) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT32) - 1)) == 0);\r
\r
+  ReturnBuffer = Buffer;\r
+  \r
+  while (Length) {\r
+    *(Buffer++) = MmioRead32 (StartAddress);\r
+    StartAddress += sizeof (UINT32);\r
+    Length -= sizeof (UINT32);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\r
+\r
+/**\r
+  Copy data from MMIO region to system memory by using 64-bit access.\r
+\r
+  Copy data from MMIO region specified by starting address StartAddress \r
+  to system memory specified by Buffer by using 64-bit access. The total \r
+  number of byte to be copied is specified by Length. Buffer is returned.\r
+  \r
+  If StartAddress is not aligned on a 64-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 64-bit boundary, then ASSERT().\r
+  If Buffer is not aligned on a 64-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied from.\r
+  @param  Length          Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer receiving the data read.\r
+\r
+  @return Buffer\r
+\r
+**/\r
+UINT64 *\r
+EFIAPI\r
+MmioReadBuffer64 (\r
+  IN  UINTN       StartAddress,\r
+  IN  UINTN       Length,\r
+  OUT UINT64      *Buffer\r
+  )\r
+{\r
+  UINT64    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT64) - 1)) == 0);\r
+  \r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT64) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT64) - 1)) == 0);\r
\r
+  ReturnBuffer = Buffer;\r
+  \r
+  while (Length) {\r
+    *(Buffer++) = MmioRead64 (StartAddress);\r
+    StartAddress += sizeof (UINT64);\r
+    Length -= sizeof (UINT64);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\r
+\r
+\r
+/**\r
+  Copy data from system memory to MMIO region by using 8-bit access.\r
+\r
+  Copy data from system memory specified by Buffer to MMIO region specified \r
+  by starting address StartAddress by using 8-bit access. The total number \r
+  of byte to be copied is specified by Length. Buffer is returned.\r
+  \r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().\r
+\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied to.\r
+  @param  Length     Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
+\r
+  @return Size in bytes of the copy.\r
+\r
+**/\r
+UINT8 *\r
+EFIAPI\r
+MmioWriteBuffer8 (\r
+  IN  UINTN         StartAddress,\r
+  IN  UINTN         Length,\r
+  IN  CONST UINT8   *Buffer\r
+  )\r
+{\r
+  VOID* ReturnBuffer;\r
+\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
\r
+  ReturnBuffer = (UINT8 *) Buffer;\r
+  \r
+  while (Length--) {\r
+     MmioWrite8 (StartAddress++, *(Buffer++));\r
+  }\r
+\r
+  return ReturnBuffer;\r
\r
+}\r
+\r
+/**\r
+  Copy data from system memory to MMIO region by using 16-bit access.\r
+\r
+  Copy data from system memory specified by Buffer to MMIO region specified \r
+  by starting address StartAddress by using 16-bit access. The total number \r
+  of byte to be copied is specified by Length. Length is returned.\r
+  \r
+  If StartAddress is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  If Buffer is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied to.\r
+  @param  Length     Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
+\r
+  @return Size in bytes of the copy.\r
+\r
+**/\r
+UINT16 *\r
+EFIAPI\r
+MmioWriteBuffer16 (\r
+  IN  UINTN        StartAddress,\r
+  IN  UINTN        Length,\r
+  IN  CONST UINT16 *Buffer\r
+  )\r
+{\r
+  UINT16    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT16) - 1)) == 0);\r
+  \r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT16) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT16) - 1)) == 0);\r
+\r
+  ReturnBuffer = (UINT16 *) Buffer;\r
+  \r
+  while (Length) {\r
+    MmioWrite16 (StartAddress, *(Buffer++));\r
+    \r
+    StartAddress += sizeof (UINT16);\r
+    Length -= sizeof (UINT16);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\r
+\r
+\r
+/**\r
+  Copy data from system memory to MMIO region by using 32-bit access.\r
+\r
+  Copy data from system memory specified by Buffer to MMIO region specified \r
+  by starting address StartAddress by using 32-bit access. The total number \r
+  of byte to be copied is specified by Length. Length is returned.\r
+  \r
+  If StartAddress is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  If Buffer is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied to.\r
+  @param  Length     Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
+\r
+  @return Size in bytes of the copy.\r
+\r
+**/\r
+UINT32 *\r
+EFIAPI\r
+MmioWriteBuffer32 (\r
+  IN  UINTN        StartAddress,\r
+  IN  UINTN        Length,\r
+  IN  CONST UINT32 *Buffer\r
+  )\r
+{\r
+  UINT32    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT32) - 1)) == 0);\r
+  \r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT32) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT32) - 1)) == 0);\r
+\r
+  ReturnBuffer = (UINT32 *) Buffer;\r
+  \r
+  while (Length) {\r
+    MmioWrite32 (StartAddress, *(Buffer++));\r
+    \r
+    StartAddress += sizeof (UINT32);\r
+    Length -= sizeof (UINT32);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\r
+\r
+/**\r
+  Copy data from system memory to MMIO region by using 64-bit access.\r
+\r
+  Copy data from system memory specified by Buffer to MMIO region specified \r
+  by starting address StartAddress by using 64-bit access. The total number \r
+  of byte to be copied is specified by Length. Length is returned.\r
+  \r
+  If StartAddress is not aligned on a 64-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 64-bit boundary, then ASSERT().\r
+\r
+  If Buffer is not aligned on a 64-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied to.\r
+  @param  Length     Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
+\r
+  @return Size in bytes of the copy.\r
+\r
+**/\r
+UINT64 *\r
+EFIAPI\r
+MmioWriteBuffer64 (\r
+  IN  UINTN        StartAddress,\r
+  IN  UINTN        Length,\r
+  IN  CONST UINT64 *Buffer\r
+  )\r
+{\r
+  UINT64    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT64) - 1)) == 0);\r
+  \r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT64) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT64) - 1)) == 0);\r
+\r
+  ReturnBuffer = (UINT64 *) Buffer;\r
+  \r
+  while (Length) {\r
+    MmioWrite64 (StartAddress, *(Buffer++));\r
+    \r
+    StartAddress += sizeof (UINT64);\r
+    Length -= sizeof (UINT64);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\r
+\r
index 43490cc46b45d0a4b866c704eebc840568f1fb17..fdefd0ea51a654d20a90dd1d5627d85288361a9a 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   HOB Library.\r
 \r
-  Copyright (c) 2006, Intel Corporation<BR>\r
+  Copyright (c) 2006 - 2007, Intel Corporation<BR>\r
   All rights reserved. This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
@@ -167,6 +167,32 @@ GetFirstGuidHob (
   return GetNextGuidHob (Guid, HobList);\r
 }\r
 \r
+/**\r
+  Get the Boot Mode from the HOB list.\r
+\r
+  This function returns the system boot mode information from the \r
+  PHIT HOB in HOB list.\r
+\r
+  @param  VOID\r
+\r
+  @return The Boot Mode.\r
+\r
+**/\r
+EFI_BOOT_MODE\r
+EFIAPI\r
+GetBootModeHob (\r
+  VOID\r
+  )\r
+{\r
+  EFI_STATUS             Status;\r
+  EFI_BOOT_MODE          BootMode;\r
+\r
+  Status = PeiServicesGetBootMode (&BootMode);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return BootMode;\r
+}\r
+\r
 /**\r
   Adds a new HOB to the HOB List.\r
 \r
diff --git a/MdePkg/Library/PeiIoLibCpuIo/IoLibMmioBuffer.c b/MdePkg/Library/PeiIoLibCpuIo/IoLibMmioBuffer.c
new file mode 100644 (file)
index 0000000..b8e6d83
--- /dev/null
@@ -0,0 +1,409 @@
+/** @file\r
+  I/O Library MMIO Buffer Functions.\r
+\r
+  Copyright (c) 2007, Intel Corporation<BR>\r
+  All rights reserved. This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+/**\r
+  Copy data from MMIO region to system memory by using 8-bit access.\r
+\r
+  Copy data from MMIO region specified by starting address StartAddress \r
+  to system memory specified by Buffer by using 8-bit access. The total \r
+  number of byte to be copied is specified by Length. Buffer is returned.\r
+  \r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied from.\r
+  @param  Length          Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer receiving the data read.\r
+\r
+  @return Buffer\r
+\r
+**/\r
+UINT8 *\r
+EFIAPI\r
+MmioReadBuffer8 (\r
+  IN  UINTN       StartAddress,\r
+  IN  UINTN       Length,\r
+  OUT UINT8       *Buffer\r
+  )\r
+{\r
+  UINT8   *ReturnBuffer;\r
+\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
\r
+  ReturnBuffer = Buffer;\r
+  \r
+  while (Length--) {\r
+    *(Buffer++) = MmioRead8 (StartAddress++);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\r
+\r
+/**\r
+  Copy data from MMIO region to system memory by using 16-bit access.\r
+\r
+  Copy data from MMIO region specified by starting address StartAddress \r
+  to system memory specified by Buffer by using 16-bit access. The total \r
+  number of byte to be copied is specified by Length. Buffer is returned.\r
+  \r
+  If StartAddress is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Buffer is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied from.\r
+  @param  Length          Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer receiving the data read.\r
+\r
+  @return Buffer\r
+\r
+**/\r
+UINT16 *\r
+EFIAPI\r
+MmioReadBuffer16 (\r
+  IN  UINTN       StartAddress,\r
+  IN  UINTN       Length,\r
+  OUT UINT16      *Buffer\r
+  )\r
+{\r
+  UINT16    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT16) - 1)) == 0);\r
+  \r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT16) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT16) - 1)) == 0);\r
\r
+  ReturnBuffer = Buffer;\r
+  \r
+  while (Length) {\r
+    *(Buffer++) = MmioRead16 (StartAddress);\r
+    StartAddress += sizeof (UINT16);\r
+    Length -= sizeof (UINT16);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\r
+\r
+/**\r
+  Copy data from MMIO region to system memory by using 32-bit access.\r
+\r
+  Copy data from MMIO region specified by starting address StartAddress \r
+  to system memory specified by Buffer by using 32-bit access. The total \r
+  number of byte to be copied is specified by Length. Buffer is returned.\r
+  \r
+  If StartAddress is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 32-bit boundary, then ASSERT().\r
+  If Buffer is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied from.\r
+  @param  Length          Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer receiving the data read.\r
+\r
+  @return Buffer\r
+\r
+**/\r
+UINT32 *\r
+EFIAPI\r
+MmioReadBuffer32 (\r
+  IN  UINTN       StartAddress,\r
+  IN  UINTN       Length,\r
+  OUT UINT32      *Buffer\r
+  )\r
+{\r
+  UINT32    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT32) - 1)) == 0);\r
+  \r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT32) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT32) - 1)) == 0);\r
\r
+  ReturnBuffer = Buffer;\r
+  \r
+  while (Length) {\r
+    *(Buffer++) = MmioRead32 (StartAddress);\r
+    StartAddress += sizeof (UINT32);\r
+    Length -= sizeof (UINT32);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\r
+\r
+/**\r
+  Copy data from MMIO region to system memory by using 64-bit access.\r
+\r
+  Copy data from MMIO region specified by starting address StartAddress \r
+  to system memory specified by Buffer by using 64-bit access. The total \r
+  number of byte to be copied is specified by Length. Buffer is returned.\r
+  \r
+  If StartAddress is not aligned on a 64-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 64-bit boundary, then ASSERT().\r
+  If Buffer is not aligned on a 64-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied from.\r
+  @param  Length          Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer receiving the data read.\r
+\r
+  @return Buffer\r
+\r
+**/\r
+UINT64 *\r
+EFIAPI\r
+MmioReadBuffer64 (\r
+  IN  UINTN       StartAddress,\r
+  IN  UINTN       Length,\r
+  OUT UINT64      *Buffer\r
+  )\r
+{\r
+  UINT64    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT64) - 1)) == 0);\r
+  \r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT64) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT64) - 1)) == 0);\r
\r
+  ReturnBuffer = Buffer;\r
+  \r
+  while (Length) {\r
+    *(Buffer++) = MmioRead64 (StartAddress);\r
+    StartAddress += sizeof (UINT64);\r
+    Length -= sizeof (UINT64);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\r
+\r
+\r
+/**\r
+  Copy data from system memory to MMIO region by using 8-bit access.\r
+\r
+  Copy data from system memory specified by Buffer to MMIO region specified \r
+  by starting address StartAddress by using 8-bit access. The total number \r
+  of byte to be copied is specified by Length. Buffer is returned.\r
+  \r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().\r
+\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied to.\r
+  @param  Length     Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
+\r
+  @return Size in bytes of the copy.\r
+\r
+**/\r
+UINT8 *\r
+EFIAPI\r
+MmioWriteBuffer8 (\r
+  IN  UINTN         StartAddress,\r
+  IN  UINTN         Length,\r
+  IN  CONST UINT8   *Buffer\r
+  )\r
+{\r
+  VOID* ReturnBuffer;\r
+\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
\r
+  ReturnBuffer = (UINT8 *) Buffer;\r
+  \r
+  while (Length--) {\r
+     MmioWrite8 (StartAddress++, *(Buffer++));\r
+  }\r
+\r
+  return ReturnBuffer;\r
\r
+}\r
+\r
+/**\r
+  Copy data from system memory to MMIO region by using 16-bit access.\r
+\r
+  Copy data from system memory specified by Buffer to MMIO region specified \r
+  by starting address StartAddress by using 16-bit access. The total number \r
+  of byte to be copied is specified by Length. Length is returned.\r
+  \r
+  If StartAddress is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  If Buffer is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied to.\r
+  @param  Length     Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
+\r
+  @return Size in bytes of the copy.\r
+\r
+**/\r
+UINT16 *\r
+EFIAPI\r
+MmioWriteBuffer16 (\r
+  IN  UINTN        StartAddress,\r
+  IN  UINTN        Length,\r
+  IN  CONST UINT16 *Buffer\r
+  )\r
+{\r
+  UINT16    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT16) - 1)) == 0);\r
+  \r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT16) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT16) - 1)) == 0);\r
+\r
+  ReturnBuffer = (UINT16 *) Buffer;\r
+  \r
+  while (Length) {\r
+    MmioWrite16 (StartAddress, *(Buffer++));\r
+    \r
+    StartAddress += sizeof (UINT16);\r
+    Length -= sizeof (UINT16);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\r
+\r
+\r
+/**\r
+  Copy data from system memory to MMIO region by using 32-bit access.\r
+\r
+  Copy data from system memory specified by Buffer to MMIO region specified \r
+  by starting address StartAddress by using 32-bit access. The total number \r
+  of byte to be copied is specified by Length. Length is returned.\r
+  \r
+  If StartAddress is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  If Buffer is not aligned on a 32-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied to.\r
+  @param  Length     Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
+\r
+  @return Size in bytes of the copy.\r
+\r
+**/\r
+UINT32 *\r
+EFIAPI\r
+MmioWriteBuffer32 (\r
+  IN  UINTN        StartAddress,\r
+  IN  UINTN        Length,\r
+  IN  CONST UINT32 *Buffer\r
+  )\r
+{\r
+  UINT32    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT32) - 1)) == 0);\r
+  \r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT32) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT32) - 1)) == 0);\r
+\r
+  ReturnBuffer = (UINT32 *) Buffer;\r
+  \r
+  while (Length) {\r
+    MmioWrite32 (StartAddress, *(Buffer++));\r
+    \r
+    StartAddress += sizeof (UINT32);\r
+    Length -= sizeof (UINT32);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\r
+\r
+/**\r
+  Copy data from system memory to MMIO region by using 64-bit access.\r
+\r
+  Copy data from system memory specified by Buffer to MMIO region specified \r
+  by starting address StartAddress by using 64-bit access. The total number \r
+  of byte to be copied is specified by Length. Length is returned.\r
+  \r
+  If StartAddress is not aligned on a 64-bit boundary, then ASSERT().\r
+\r
+  If Length is greater than (MAX_ADDRESS - StartAddress + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS -Buffer + 1), then ASSERT().\r
+\r
+  If Length is not aligned on a 64-bit boundary, then ASSERT().\r
+\r
+  If Buffer is not aligned on a 64-bit boundary, then ASSERT().\r
+\r
+  @param  StartAddress    Starting address for the MMIO region to be copied to.\r
+  @param  Length     Size in bytes of the copy.\r
+  @param  Buffer          Pointer to a system memory buffer containing the data to write.\r
+\r
+  @return Size in bytes of the copy.\r
+\r
+**/\r
+UINT64 *\r
+EFIAPI\r
+MmioWriteBuffer64 (\r
+  IN  UINTN        StartAddress,\r
+  IN  UINTN        Length,\r
+  IN  CONST UINT64 *Buffer\r
+  )\r
+{\r
+  UINT64    *ReturnBuffer;\r
+\r
+  ASSERT ((StartAddress & (sizeof (UINT64) - 1)) == 0);\r
+  \r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - StartAddress));\r
+  ASSERT ((Length - 1) <=  (MAX_ADDRESS - (UINTN) Buffer));\r
+\r
+  ASSERT ((Length & (sizeof (UINT64) - 1)) == 0);\r
+  ASSERT (((UINTN) Buffer & (sizeof (UINT64) - 1)) == 0);\r
+\r
+  ReturnBuffer = (UINT64 *) Buffer;\r
+  \r
+  while (Length) {\r
+    MmioWrite64 (StartAddress, *(Buffer++));\r
+    \r
+    StartAddress += sizeof (UINT64);\r
+    Length -= sizeof (UINT64);\r
+  }\r
+\r
+  return ReturnBuffer;\r
+}\r
+\r
index 4b780e75f246d1af7144b3b8b4583d5d7c5e6371..a458f327c2ccafaff90975832bc7bdf5265fb9d0 100644 (file)
@@ -8,7 +8,7 @@
     <Abstract>Component description file for Cpu Io Pei Io Library</Abstract>\r
     <Description>I/O Library implementation that uses the CPU I/O PPI for I/O
       and MMIO operations.</Description>\r
-    <Copyright>Copyright (c) 2006, Intel Corporation.</Copyright>\r
+    <Copyright>Copyright (c) 2006 - 2007, Intel Corporation.</Copyright>\r
     <License>All rights reserved. This program and the accompanying materials
       are licensed and made available under the terms and conditions of the BSD License
       which accompanies this distribution.  The full text of the license may be found at
@@ -37,6 +37,7 @@
     </LibraryClass>\r
   </LibraryClassDefinitions>\r
   <SourceFiles>\r
+       <Filename>IoLibMmioBuffer.c</Filename>\r
     <Filename>IoLib.c</Filename>\r
     <Filename>IoHighLevel.c</Filename>\r
   </SourceFiles>\r
index a2dd6a8c1259aeadf5fd6946523cd9d224b0ebca..765235c51519f3c80bbf66c693a2e353582bb4eb 100644 (file)
@@ -243,6 +243,34 @@ EfiNamedEventSignal (
   return EFI_SUCCESS;\r
 }\r
 \r
+/** \r
+  Returns the current TPL.\r
+\r
+  This function returns the current TPL.  There is no EFI service to directly \r
+  retrieve the current TPL. Instead, the RaiseTPL() function is used to raise \r
+  the TPL to TPL_HIGH_LEVEL.  This will return the current TPL.  The TPL level \r
+  can then immediately be restored back to the current TPL level with a call \r
+  to RestoreTPL().\r
+\r
+  @param  VOID\r
+\r
+  @retvale EFI_TPL              The current TPL.\r
+\r
+**/\r
+EFI_TPL\r
+EFIAPI\r
+EfiGetCurrentTpl (\r
+  VOID\r
+  )\r
+{\r
+  EFI_TPL Tpl;\r
+\r
+  Tpl = gBS->RaiseTPL (EFI_TPL_HIGH_LEVEL); \r
+  gBS->RestoreTPL (Tpl);\r
+\r
+  return Tpl;\r
+}\r
+\r
 \r
 /**\r
   This function initializes a basic mutual exclusion lock to the released state \r
@@ -779,3 +807,4 @@ FreeUnicodeStringTable (
 \r
   return EFI_SUCCESS;\r
 }\r
+\r
index cf1083955bc745588bca41c805e312087d31a7de..0d39529245280659cd222e8e616b7705ea912415 100644 (file)
     <ModuleSA ModuleGuid="f4731d79-537e-4505-bd52-c03f9b1f6b89" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3" SupArchList="IPF"/>\r
     <!--Mod: BaseTimerLibNullTemplate Type: BASE Path: MdePkg\Library\BaseTimerLibNullTemplate\BaseTimerLibNullTemplate.msa-->\r
     <ModuleSA ModuleGuid="f4731d79-537e-4505-bd52-c03f9b1f6b89" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3" SupArchList="EBC"/>\r
+    <!--Mod: BaseIoLibIntrinsic Type: BASE Path: MdePkg\Library\BaseIoLibIntrinsic\BaseIoLibIntrinsic.msa-->\r
+    <ModuleSA ModuleGuid="926c9cd0-4bb8-479b-9ac4-8a2a23f85307" ModuleVersion="1.0" PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec" PackageVersion="0.3" SupArchList="IPF">\r
+      <PcdBuildDefinition>\r
+        <PcdData ItemType="FIXED_AT_BUILD">\r
+          <C_Name>PcdIoBlockBaseAddressForIpf</C_Name>\r
+          <Token>0x0000000c</Token>\r
+          <TokenSpaceGuidCName>gEfiMdePkgTokenSpaceGuid</TokenSpaceGuidCName>\r
+          <DatumType>UINT64</DatumType>\r
+          <MaxDatumSize>8</MaxDatumSize>\r
+          <Value>0x0ffffc000000</Value>\r
+        </PcdData>\r
+      </PcdBuildDefinition>\r
+    </ModuleSA>\r
   </FrameworkModules>\r
   <BuildOptions>\r
     <Ffs FfsKey="APPLICATION">\r