]> git.proxmox.com Git - mirror_edk2.git/commitdiff
De-unicode in comment for all source files.
authorqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 27 May 2008 03:24:01 +0000 (03:24 +0000)
committerqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 27 May 2008 03:24:01 +0000 (03:24 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5302 6f19259b-4bc3-4df7-8a09-765794883524

19 files changed:
IntelFrameworkPkg/Include/Ppi/Security.h
MdeModulePkg/Bus/Usb/UsbBusDxe/UsbEnumer.c
MdeModulePkg/Universal/HiiDatabaseDxe/Font.c
MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h
MdeModulePkg/Universal/HiiDatabaseDxe/Image.c
MdeModulePkg/Universal/HiiDatabaseDxe/String.c
MdePkg/Include/Library/BaseLib.h
MdePkg/Include/Library/PalCallLib.h
MdePkg/Include/Pi/PiHob.h
MdePkg/Include/Ppi/Decompress.h
MdePkg/Include/Ppi/ReadOnlyVariable2.h
MdePkg/Include/Protocol/HiiFont.h
MdePkg/Include/Protocol/PlatformToDriverConfiguration.h
MdePkg/Include/Protocol/TcgService.h
MdePkg/Include/Uefi/UefiInternalFormRepresentation.h
MdePkg/Include/Uefi/UefiSpec.h
MdePkg/Library/BaseLib/Ipf/AsmPalCall.s
MdePkg/Library/BasePalCallLibNull/PalCall.c
MdePkg/Library/PeiPalCallLib/PalCallLib.c

index 8c7adb6fa01356890b45779bcaac2860cdc45d38..514c249a2f5c34a1bc89e07068f4023796d01efd 100644 (file)
@@ -2,7 +2,7 @@
   This file declares Security Architectural PPI.\r
   \r
   This PPI is installed by some platform PEIM that abstracts the security policy to the PEI\r
-  Foundation, namely the case of a PEIM¡¯s authentication state being returned during the PEI section\r
+  Foundation, namely the case of a PEIM's authentication state being returned during the PEI section\r
   extraction process.\r
   \r
   Copyright (c) 2006, Intel Corporation\r
index 6b46e5c3ce4548ef91f249a29b394e9f3d31a015..8d527e061bf1640583a2201a896ec393b532aedd 100644 (file)
@@ -732,14 +732,14 @@ UsbEnumerateNewDev (
 \r
   //\r
   // After port is reset, hub establishes a signal path between\r
-  // the device and host (DEFALUT state). Device¡¯s registers are\r
+  // the device and host (DEFALUT state). Device's registers are\r
   // reset, use default address 0 (host enumerates one device at\r
   // a time) , and ready to respond to control transfer at EP 0.\r
   //\r
 \r
   //\r
   // Host sends a Get_Descriptor request to learn the max packet\r
-  // size of default pipe (only part of the device¡¯s descriptor).\r
+  // size of default pipe (only part of the device's descriptor).\r
   //\r
   Status = UsbGetMaxPacketSize0 (Child);\r
 \r
@@ -782,7 +782,7 @@ UsbEnumerateNewDev (
   DEBUG ((EFI_D_INFO, "UsbEnumerateNewDev: device is now ADDRESSED at %d\n", Address));\r
 \r
   //\r
-  // Host learns about the device¡¯s abilities by requesting device's\r
+  // Host learns about the device's abilities by requesting device's\r
   // entire descriptions.\r
   //\r
   Status = UsbBuildDescTable (Child);\r
index 2df03fc8d9aee47aedc0adb9efb1b4fa00fa440a..eb8e651360a9615d210c21c68915466dd00356a7 100644 (file)
@@ -1370,7 +1370,7 @@ IsLineBreak (
                                   EFI_HII_OUT_FLAG_CLIP is implied. If this points\r
                                   to a NULL on entry, then a              buffer\r
                                   will be allocated to hold the generated image and\r
-                                  the pointer updated on exit. It is the caller¡¯s\r
+                                  the pointer updated on exit. It is the caller's\r
                                   responsibility to free this buffer.\r
   @param  BltX,BLTY               Specifies the offset from the left and top edge\r
                                   of the image of the first character cell in the\r
@@ -1381,7 +1381,7 @@ IsLineBreak (
                                   updated to contain the        number of elements.\r
                                   This array describes the characters which were at\r
                                   least partially drawn and the heights of the\r
-                                  rows. It is the caller¡¯s responsibility to free\r
+                                  rows. It is the caller's responsibility to free\r
                                   this buffer.\r
   @param  RowInfoArraySize        If this is non-NULL on entry, then on exit it\r
                                   contains the number of elements in RowInfoArray.\r
@@ -1923,7 +1923,7 @@ Exit:
   @param  Flags                   Describes how the string is to be drawn.\r
   @param  PackageList             The package list in the HII database to search\r
                                   for the specified string.\r
-  @param  StringId                The string¡¯s id, which is unique within\r
+  @param  StringId                The string's id, which is unique within\r
                                   PackageList.\r
   @param  Language                Points to the language for the retrieved string.\r
                                   If NULL, then the current system language is\r
@@ -1939,7 +1939,7 @@ Exit:
                                   EFI_HII_OUT_FLAG_CLIP is implied. If this points\r
                                   to a NULL on entry, then a              buffer\r
                                   will be allocated to hold the generated image and\r
-                                  the pointer updated on exit. It is the caller¡¯s\r
+                                  the pointer updated on exit. It is the caller's\r
                                   responsibility to free this buffer.\r
   @param  BltX,BLTY               Specifies the offset from the left and top edge\r
                                   of the image of the first character cell in the\r
@@ -1950,7 +1950,7 @@ Exit:
                                   updated to contain the        number of elements.\r
                                   This array describes the characters which were at\r
                                   least partially drawn and the heights of the\r
-                                  rows. It is the caller¡¯s responsibility to free\r
+                                  rows. It is the caller's responsibility to free\r
                                   this buffer.\r
   @param  RowInfoArraySize        If this is non-NULL on entry, then on exit it\r
                                   contains the number of elements in RowInfoArray.\r
@@ -2071,7 +2071,7 @@ HiiStringIdToImage (
                                   system font and color.\r
   @param  Blt                     Thus must point to a NULL on entry. A buffer will\r
                                   be allocated to hold the output and the pointer\r
-                                  updated on exit. It is the caller¡¯s\r
+                                  updated on exit. It is the caller's\r
                                   responsibility to free this buffer.\r
   @param  Baseline                Number of pixels from the bottom of the bitmap to\r
                                   the baseline.\r
@@ -2232,7 +2232,7 @@ Exit:
                                   are no more matching fonts.\r
   @param  StringInfoIn            Upon entry, points to the font to return\r
                                   information about.\r
-  @param  StringInfoOut           Upon return, contains the matching font¡¯s\r
+  @param  StringInfoOut           Upon return, contains the matching font's\r
                                   information.  If NULL, then no information is\r
                                   returned. It's caller's responsibility to free\r
                                   this buffer.\r
index 7a311f28d1a6035ca18be7847b13b4b6c4692f78..f19813298edfff2d11d0d7639751db57c448d4fd 100644 (file)
-/** @file
-
-Copyright (c) 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:
-
-    HiiDatabase.h
-
-Abstract:
-
-    Private structures definitions in HiiDatabase.
-
-Revision History
-
-
-**/
-
-#ifndef __HII_DATABASE_PRIVATE_H__
-#define __HII_DATABASE_PRIVATE_H__
-
-#include <PiDxe.h>
-
-#include <Protocol/ConsoleControl.h>
-#include <Protocol/DevicePath.h>
-#include <Protocol/HiiFont.h>
-#include <Protocol/HiiImage.h>
-#include <Protocol/HiiString.h>
-#include <Protocol/HiiDatabase.h>
-#include <Protocol/HiiConfigRouting.h>
-#include <Protocol/HiiConfigAccess.h>
-#include <Protocol/SimpleTextOut.h>
-
-#include <Guid/HiiKeyBoardLayout.h>
-
-
-#include <Library/DebugLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/BaseLib.h>
-#include <Library/DevicePathLib.h>
-#include <Library/MemoryAllocationLib.h>
-
-#define HII_DATABASE_NOTIFY_GUID \
-  { \
-    0xc1c76, 0xd79e, 0x42fe, {0x86, 0xb, 0x8b, 0xe8, 0x7b, 0x3e, 0x7a, 0x78} \
-  }
-
-#define MAX_STRING_LENGTH                  1024
-#define MAX_FONT_NAME_LEN                  256
-#define NARROW_BASELINE                    15
-#define WIDE_BASELINE                      14
-#define SYS_FONT_INFO_MASK                 0x37
-#define REPLACE_UNKNOWN_GLYPH              0xFFFD
-#define PROPORTIONAL_GLYPH                 0x80
-#define NARROW_GLYPH                       0x40
-
-#define BITMAP_LEN_1_BIT(Width, Height)  (((Width) + 7) / 8 * (Height))
-#define BITMAP_LEN_4_BIT(Width, Height)  (((Width) + 1) / 2 * (Height))
-#define BITMAP_LEN_8_BIT(Width, Height)  ((Width) * (Height))
-#define BITMAP_LEN_24_BIT(Width, Height) ((Width) * (Height) * 3)
-
-//
-// Storage types
-//
-#define EFI_HII_VARSTORE_BUFFER            0
-#define EFI_HII_VARSTORE_NAME_VALUE        1
-#define EFI_HII_VARSTORE_EFI_VARIABLE      2
-
-#define HII_FORMSET_STORAGE_SIGNATURE           EFI_SIGNATURE_32 ('H', 'S', 'T', 'G')
-typedef struct {
-  UINTN               Signature;
-  LIST_ENTRY          Entry;
-
-  EFI_HII_HANDLE      HiiHandle;
-  EFI_HANDLE          DriverHandle;
-
-  UINT8               Type;   // EFI_HII_VARSTORE_BUFFER, EFI_HII_VARSTORE_NAME_VALUE, EFI_HII_VARSTORE_EFI_VARIABLE
-  EFI_GUID            Guid;
-  CHAR16              *Name;
-  UINT16              Size;
-} HII_FORMSET_STORAGE;
-
-#define HII_FORMSET_STORAGE_FROM_LINK(a)  CR (a, HII_FORMSET_STORAGE, Link, HII_FORMSET_STORAGE_SIGNATURE)
-
-
-//
-// String Package definitions
-//
-#define HII_STRING_PACKAGE_SIGNATURE    EFI_SIGNATURE_32 ('h','i','s','p')
-typedef struct _HII_STRING_PACKAGE_INSTANCE {
-  UINTN                                 Signature;
-  EFI_HII_STRING_PACKAGE_HDR            *StringPkgHdr;
-  UINT8                                 *StringBlock;
-  LIST_ENTRY                            StringEntry;
-  LIST_ENTRY                            FontInfoList;  // local font info list
-  UINT8                                 FontId;
-} HII_STRING_PACKAGE_INSTANCE;
-
-//
-// Form Package definitions
-//
-#define HII_IFR_PACKAGE_SIGNATURE       EFI_SIGNATURE_32 ('h','f','r','p')
-typedef struct _HII_IFR_PACKAGE_INSTANCE {
-  UINTN                                 Signature;
-  EFI_HII_PACKAGE_HEADER                FormPkgHdr;
-  UINT8                                 *IfrData;
-  LIST_ENTRY                            IfrEntry;
-} HII_IFR_PACKAGE_INSTANCE;
-
-//
-// Simple Font Package definitions
-//
-#define HII_S_FONT_PACKAGE_SIGNATURE    EFI_SIGNATURE_32 ('h','s','f','p')
-typedef struct _HII_SIMPLE_FONT_PACKAGE_INSTANCE {
-  UINTN                                 Signature;
-  EFI_HII_SIMPLE_FONT_PACKAGE_HDR       *SimpleFontPkgHdr;
-  LIST_ENTRY                            SimpleFontEntry;
-} HII_SIMPLE_FONT_PACKAGE_INSTANCE;
-
-//
-// Font Package definitions
-//
-#define HII_FONT_PACKAGE_SIGNATURE      EFI_SIGNATURE_32 ('h','i','f','p')
-typedef struct _HII_FONT_PACKAGE_INSTANCE {
-  UINTN                                 Signature;
-  EFI_HII_FONT_PACKAGE_HDR              *FontPkgHdr;
-  UINT8                                 *GlyphBlock;
-  LIST_ENTRY                            FontEntry;
-  LIST_ENTRY                            GlyphInfoList;
-} HII_FONT_PACKAGE_INSTANCE;
-
-#define HII_GLYPH_INFO_SIGNATURE        EFI_SIGNATURE_32 ('h','g','i','s')
-typedef struct _HII_GLYPH_INFO {
-  UINTN                                 Signature;
-  LIST_ENTRY                            Entry;
-  CHAR16                                CharId;
-  EFI_HII_GLYPH_INFO                    Cell;
-} HII_GLYPH_INFO;
-
-#define HII_FONT_INFO_SIGNATURE         EFI_SIGNATURE_32 ('h','l','f','i')
-typedef struct _HII_FONT_INFO {
-  UINTN                                 Signature;
-  LIST_ENTRY                            Entry;
-  LIST_ENTRY                            *GlobalEntry;
-  UINT8                                 FontId;
-} HII_FONT_INFO;
-
-#define HII_GLOBAL_FONT_INFO_SIGNATURE  EFI_SIGNATURE_32 ('h','g','f','i')
-typedef struct _HII_GLOBAL_FONT_INFO {
-  UINTN                                 Signature;
-  LIST_ENTRY                            Entry;
-  HII_FONT_PACKAGE_INSTANCE             *FontPackage;
-  UINTN                                 FontInfoSize;
-  EFI_FONT_INFO                         *FontInfo;
-} HII_GLOBAL_FONT_INFO;
-
-//
-// Image Package definitions
-//
-
-#define HII_PIXEL_MASK                  0x80
-
-typedef struct _HII_IMAGE_PACKAGE_INSTANCE {
-  EFI_HII_IMAGE_PACKAGE_HDR             ImagePkgHdr;
-  UINT32                                ImageBlockSize;
-  UINT32                                PaletteInfoSize;
-  UINT8                                 *ImageBlock;
-  UINT8                                 *PaletteBlock;
-} HII_IMAGE_PACKAGE_INSTANCE;
-
-//
-// Keyboard Layout Pacakge definitions
-//
-#define HII_KB_LAYOUT_PACKAGE_SIGNATURE EFI_SIGNATURE_32 ('h','k','l','p')
-typedef struct _HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE {
-  UINTN                                 Signature;
-  UINT8                                 *KeyboardPkg;
-  LIST_ENTRY                            KeyboardEntry;
-} HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE;
-
-//
-// Guid Package definitions
-//
-#define HII_GUID_PACKAGE_SIGNATURE      EFI_SIGNATURE_32 ('h','i','g','p')
-typedef struct _HII_GUID_PACKAGE_INSTANCE {
-  UINTN                                 Signature;
-  UINT8                                 *GuidPkg;
-  LIST_ENTRY                            GuidEntry;
-} HII_GUID_PACKAGE_INSTANCE;
-
-//
-// A package list can contain only one or less than one device path package.
-// This rule also applies to image package since ImageId can not be duplicate.
-//
-typedef struct _HII_DATABASE_PACKAGE_LIST_INSTANCE {
-  EFI_HII_PACKAGE_LIST_HEADER           PackageListHdr;
-  LIST_ENTRY                            GuidPkgHdr;
-  LIST_ENTRY                            FormPkgHdr;
-  LIST_ENTRY                            KeyboardLayoutHdr;
-  LIST_ENTRY                            StringPkgHdr;
-  LIST_ENTRY                            FontPkgHdr;
-  HII_IMAGE_PACKAGE_INSTANCE            *ImagePkg;
-  LIST_ENTRY                            SimpleFontPkgHdr;
-  UINT8                                 *DevicePathPkg;
-} HII_DATABASE_PACKAGE_LIST_INSTANCE;
-
-#define HII_HANDLE_SIGNATURE            EFI_SIGNATURE_32 ('h','i','h','l')
-
-typedef struct {
-  UINTN               Signature;
-  LIST_ENTRY          Handle;
-  UINTN               Key;
-} HII_HANDLE;
-
-#define HII_DATABASE_RECORD_SIGNATURE   EFI_SIGNATURE_32 ('h','i','d','r')
-
-typedef struct _HII_DATABASE_RECORD {
-  UINTN                                 Signature;
-  HII_DATABASE_PACKAGE_LIST_INSTANCE    *PackageList;
-  EFI_HANDLE                            DriverHandle;
-  EFI_HII_HANDLE                        Handle;
-  LIST_ENTRY                            DatabaseEntry;
-} HII_DATABASE_RECORD;
-
-#define HII_DATABASE_NOTIFY_SIGNATURE   EFI_SIGNATURE_32 ('h','i','d','n')
-
-typedef struct _HII_DATABASE_NOTIFY {
-  UINTN                                 Signature;
-  EFI_HANDLE                            NotifyHandle;
-  UINT8                                 PackageType;
-  EFI_GUID                              *PackageGuid;
-  EFI_HII_DATABASE_NOTIFY               PackageNotifyFn;
-  EFI_HII_DATABASE_NOTIFY_TYPE          NotifyType;
-  LIST_ENTRY                            DatabaseNotifyEntry;
-} HII_DATABASE_NOTIFY;
-
-#define HII_DATABASE_PRIVATE_DATA_SIGNATURE EFI_SIGNATURE_32 ('H', 'i', 'D', 'p')
-
-typedef struct _HII_DATABASE_PRIVATE_DATA {
-  UINTN                                 Signature;
-  LIST_ENTRY                            DatabaseList;
-  LIST_ENTRY                            DatabaseNotifyList;
-  EFI_HII_FONT_PROTOCOL                 HiiFont;
-#ifndef DISABLE_UNUSED_HII_PROTOCOLS
-  EFI_HII_IMAGE_PROTOCOL                HiiImage;
-#endif
-  EFI_HII_STRING_PROTOCOL               HiiString;
-  EFI_HII_DATABASE_PROTOCOL             HiiDatabase;
-  EFI_HII_CONFIG_ROUTING_PROTOCOL       ConfigRouting;
-  LIST_ENTRY                            HiiHandleList;
-  INTN                                  HiiHandleCount;
-  LIST_ENTRY                            FontInfoList;  // global font info list
-  UINTN                                 Attribute;     // default system color
-  EFI_GUID                              CurrentLayoutGuid;
-  EFI_HII_KEYBOARD_LAYOUT               *CurrentLayout;
-} HII_DATABASE_PRIVATE_DATA;
-
-#define HII_FONT_DATABASE_PRIVATE_DATA_FROM_THIS(a) \
-  CR (a, \
-      HII_DATABASE_PRIVATE_DATA, \
-      HiiFont, \
-      HII_DATABASE_PRIVATE_DATA_SIGNATURE \
-      )
-
-#define HII_IMAGE_DATABASE_PRIVATE_DATA_FROM_THIS(a) \
-  CR (a, \
-      HII_DATABASE_PRIVATE_DATA, \
-      HiiImage, \
-      HII_DATABASE_PRIVATE_DATA_SIGNATURE \
-      )
-
-#define HII_STRING_DATABASE_PRIVATE_DATA_FROM_THIS(a) \
-  CR (a, \
-      HII_DATABASE_PRIVATE_DATA, \
-      HiiString, \
-      HII_DATABASE_PRIVATE_DATA_SIGNATURE \
-      )
-
-#define HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS(a) \
-  CR (a, \
-      HII_DATABASE_PRIVATE_DATA, \
-      HiiDatabase, \
-      HII_DATABASE_PRIVATE_DATA_SIGNATURE \
-      )
-
-#define CONFIG_ROUTING_DATABASE_PRIVATE_DATA_FROM_THIS(a) \
-  CR (a, \
-      HII_DATABASE_PRIVATE_DATA, \
-      ConfigRouting, \
-      HII_DATABASE_PRIVATE_DATA_SIGNATURE \
-      )
-
-//
-// Internal function prototypes.
-//
-
-/**
-  This function checks whether a handle is a valid EFI_HII_HANDLE
-
-  @param  Handle                  Pointer to a EFI_HII_HANDLE
-
-  @retval TRUE                    Valid
-  @retval FALSE                   Invalid
-
-**/
-BOOLEAN
-IsHiiHandleValid (
-  EFI_HII_HANDLE Handle
-  )
-;
-
-
-/**
-  This function checks whether EFI_FONT_INFO exists in current database. If
-  FontInfoMask is specified, check what options can be used to make a match.
-  Note that the masks relate to where the system default should be supplied
-  are ignored by this function.
-
-  @param  Private                 Hii database private structure.
-  @param  FontInfo                Points to EFI_FONT_INFO structure.
-  @param  FontInfoMask            If not NULL, describes what options can be used
-                                  to make a match between the font requested and
-                                  the font available. The caller must guarantee
-                                  this mask is valid.
-  @param  FontHandle              On entry, Points to the font handle returned by a
-                                  previous  call to GetFontInfo() or NULL to start
-                                  with the first font.
-  @param  GlobalFontInfo          If not NULL, output the corresponding globa font
-                                  info.
-
-  @retval TRUE                    Existed
-  @retval FALSE                   Not existed
-
-**/
-BOOLEAN
-IsFontInfoExisted (
-  IN  HII_DATABASE_PRIVATE_DATA *Private,
-  IN  EFI_FONT_INFO             *FontInfo,
-  IN  EFI_FONT_INFO_MASK        *FontInfoMask,   OPTIONAL
-  IN  EFI_FONT_HANDLE           FontHandle,      OPTIONAL
-  OUT HII_GLOBAL_FONT_INFO      **GlobalFontInfo OPTIONAL
-  )
-;
-
-
-/**
-  Retrieve system default font and color.
-
-  @param  Private                 HII database driver private data.
-  @param  FontInfo                Points to system default font output-related
-                                  information. It's caller's responsibility to free
-                                  this buffer.
-  @param  FontInfoSize            If not NULL, output the size of buffer FontInfo.
-
-  @retval EFI_SUCCESS             Cell information is added to the GlyphInfoList.
-  @retval EFI_OUT_OF_RESOURCES    The system is out of resources to accomplish the
-                                  task.
-  @retval EFI_INVALID_PARAMETER   Any input parameter is invalid.
-
-**/
-EFI_STATUS
-GetSystemFont (
-  IN  HII_DATABASE_PRIVATE_DATA      *Private,
-  OUT EFI_FONT_DISPLAY_INFO          **FontInfo,
-  OUT UINTN                          *FontInfoSize OPTIONAL
-  )
-;
-
-
-/**
-  Parse all string blocks to find a String block specified by StringId.
-  If StringId = (EFI_STRING_ID) (-1), find out all EFI_HII_SIBT_FONT blocks
-  within this string package and backup its information.
-  If StringId = 0, output the string id of last string block (EFI_HII_SIBT_END).
-
-  @param  Private                 Hii database private structure.
-  @param  StringPackage           Hii string package instance.
-  @param  StringId                The string¡¯s id, which is unique within
-                                  PackageList.
-  @param  BlockType               Output the block type of found string block.
-  @param  StringBlockAddr         Output the block address of found string block.
-  @param  StringTextOffset        Offset, relative to the found block address, of
-                                  the  string text information.
-  @param  LastStringId            Output the last string id when StringId = 0.
-
-  @retval EFI_SUCCESS             The string text and font is retrieved
-                                  successfully.
-  @retval EFI_NOT_FOUND           The specified text or font info can not be found
-                                  out.
-  @retval EFI_OUT_OF_RESOURCES    The system is out of resources to accomplish the
-                                  task.
-
-**/
-EFI_STATUS
-FindStringBlock (
-  IN HII_DATABASE_PRIVATE_DATA        *Private,
-  IN  HII_STRING_PACKAGE_INSTANCE     *StringPackage,
-  IN  EFI_STRING_ID                   StringId,
-  OUT UINT8                           *BlockType, OPTIONAL
-  OUT UINT8                           **StringBlockAddr, OPTIONAL
-  OUT UINTN                           *StringTextOffset, OPTIONAL
-  OUT EFI_STRING_ID                   *LastStringId OPTIONAL
-  )
-;
-
-
-/**
-  Parse all glyph blocks to find a glyph block specified by CharValue.
-  If CharValue = (CHAR16) (-1), collect all default character cell information
-  within this font package and backup its information.
-
-  @param  FontPackage             Hii string package instance.
-  @param  CharValue               Unicode character value, which identifies a glyph
-                                  block.
-  @param  GlyphBuffer             Output the corresponding bitmap data of the found
-                                  block. It is the caller's responsiblity to free
-                                  this buffer.
-  @param  Cell                    Output cell information of the encoded bitmap.
-  @param  GlyphBufferLen          If not NULL, output the length of GlyphBuffer.
-
-  @retval EFI_SUCCESS             The bitmap data is retrieved successfully.
-  @retval EFI_NOT_FOUND           The specified CharValue does not exist in current
-                                  database.
-  @retval EFI_OUT_OF_RESOURCES    The system is out of resources to accomplish the
-                                  task.
-
-**/
-EFI_STATUS
-FindGlyphBlock (
-  IN  HII_FONT_PACKAGE_INSTANCE      *FontPackage,
-  IN  CHAR16                         CharValue,
-  OUT UINT8                          **GlyphBuffer, OPTIONAL
-  OUT EFI_HII_GLYPH_INFO             *Cell, OPTIONAL
-  OUT UINTN                          *GlyphBufferLen OPTIONAL
-  )
-;
-
-//
-// EFI_HII_FONT_PROTOCOL protocol interfaces
-//
-
-
-/**
-  Renders a string to a bitmap or to the display.
-
-  @param  This                    A pointer to the EFI_HII_FONT_PROTOCOL instance.
-  @param  Flags                   Describes how the string is to be drawn.
-  @param  String                  Points to the null-terminated string to be
-                                  displayed.
-  @param  StringInfo              Points to the string output information,
-                                  including the color and font.  If NULL, then the
-                                  string will be output in the default system font
-                                  and color.
-  @param  Blt                     If this points to a non-NULL on entry, this
-                                  points to the image, which is Width pixels   wide
-                                  and Height pixels high. The string will be drawn
-                                  onto this image and
-                                  EFI_HII_OUT_FLAG_CLIP is implied. If this points
-                                  to a NULL on entry, then a              buffer
-                                  will be allocated to hold the generated image and
-                                  the pointer updated on exit. It is the caller¡¯s
-                                  responsibility to free this buffer.
-  @param  BltX,BLTY               Specifies the offset from the left and top edge
-                                  of the image of the first character cell in the
-                                  image.
-  @param  RowInfoArray            If this is non-NULL on entry, then on exit, this
-                                  will point to an allocated buffer    containing
-                                  row information and RowInfoArraySize will be
-                                  updated to contain the        number of elements.
-                                  This array describes the characters which were at
-                                  least partially drawn and the heights of the
-                                  rows. It is the caller¡¯s responsibility to free
-                                  this buffer.
-  @param  RowInfoArraySize        If this is non-NULL on entry, then on exit it
-                                  contains the number of elements in RowInfoArray.
-  @param  ColumnInfoArray         If this is non-NULL, then on return it will be
-                                  filled with the horizontal offset for each
-                                  character in the string on the row where it is
-                                  displayed. Non-printing characters will     have
-                                  the offset ~0. The caller is responsible to
-                                  allocate a buffer large enough so that    there
-                                  is one entry for each character in the string,
-                                  not including the null-terminator. It is possible
-                                  when character display is normalized that some
-                                  character cells overlap.
-
-  @retval EFI_SUCCESS             The string was successfully rendered.
-  @retval EFI_OUT_OF_RESOURCES    Unable to allocate an output buffer for
-                                  RowInfoArray or Blt.
-  @retval EFI_INVALID_PARAMETER   The String was NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiStringToImage (
-  IN  CONST EFI_HII_FONT_PROTOCOL    *This,
-  IN  EFI_HII_OUT_FLAGS              Flags,
-  IN  CONST EFI_STRING               String,
-  IN  CONST EFI_FONT_DISPLAY_INFO    *StringInfo       OPTIONAL,
-  IN  OUT EFI_IMAGE_OUTPUT           **Blt,
-  IN  UINTN                          BltX,
-  IN  UINTN                          BltY,
-  OUT EFI_HII_ROW_INFO               **RowInfoArray    OPTIONAL,
-  OUT UINTN                          *RowInfoArraySize OPTIONAL,
-  OUT UINTN                          *ColumnInfoArray  OPTIONAL
-  )
-;
-
-
-/**
-  Render a string to a bitmap or the screen containing the contents of the specified string.
-
-  @param  This                    A pointer to the EFI_HII_FONT_PROTOCOL instance.
-  @param  Flags                   Describes how the string is to be drawn.
-  @param  PackageList             The package list in the HII database to search
-                                  for the specified string.
-  @param  StringId                The string¡¯s id, which is unique within
-                                  PackageList.
-  @param  Language                Points to the language for the retrieved string.
-                                  If NULL, then the current system language is
-                                  used.
-  @param  StringInfo              Points to the string output information,
-                                  including the color and font.  If NULL, then the
-                                  string will be output in the default system font
-                                  and color.
-  @param  Blt                     If this points to a non-NULL on entry, this
-                                  points to the image, which is Width pixels   wide
-                                  and Height pixels high. The string will be drawn
-                                  onto this image and
-                                  EFI_HII_OUT_FLAG_CLIP is implied. If this points
-                                  to a NULL on entry, then a              buffer
-                                  will be allocated to hold the generated image and
-                                  the pointer updated on exit. It is the caller¡¯s
-                                  responsibility to free this buffer.
-  @param  BltX,BLTY               Specifies the offset from the left and top edge
-                                  of the image of the first character cell in the
-                                  image.
-  @param  RowInfoArray            If this is non-NULL on entry, then on exit, this
-                                  will point to an allocated buffer    containing
-                                  row information and RowInfoArraySize will be
-                                  updated to contain the        number of elements.
-                                  This array describes the characters which were at
-                                  least partially drawn and the heights of the
-                                  rows. It is the caller¡¯s responsibility to free
-                                  this buffer.
-  @param  RowInfoArraySize        If this is non-NULL on entry, then on exit it
-                                  contains the number of elements in RowInfoArray.
-  @param  ColumnInfoArray         If this is non-NULL, then on return it will be
-                                  filled with the horizontal offset for each
-                                  character in the string on the row where it is
-                                  displayed. Non-printing characters will     have
-                                  the offset ~0. The caller is responsible to
-                                  allocate a buffer large enough so that    there
-                                  is one entry for each character in the string,
-                                  not including the null-terminator. It is possible
-                                  when character display is normalized that some
-                                  character cells overlap.
-
-  @retval EFI_SUCCESS             The string was successfully rendered.
-  @retval EFI_OUT_OF_RESOURCES    Unable to allocate an output buffer for
-                                  RowInfoArray or Blt.
-  @retval EFI_INVALID_PARAMETER   The String was NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiStringIdToImage (
-  IN  CONST EFI_HII_FONT_PROTOCOL    *This,
-  IN  EFI_HII_OUT_FLAGS              Flags,
-  IN  EFI_HII_HANDLE                 PackageList,
-  IN  EFI_STRING_ID                  StringId,
-  IN  CONST CHAR8*                   Language,
-  IN  CONST EFI_FONT_DISPLAY_INFO    *StringInfo       OPTIONAL,
-  IN  OUT EFI_IMAGE_OUTPUT           **Blt,
-  IN  UINTN                          BltX,
-  IN  UINTN                          BltY,
-  OUT EFI_HII_ROW_INFO               **RowInfoArray    OPTIONAL,
-  OUT UINTN                          *RowInfoArraySize OPTIONAL,
-  OUT UINTN                          *ColumnInfoArray  OPTIONAL
-  )
-;
-
-
-/**
-  Convert the glyph for a single character into a bitmap.
-
-  @param  This                    A pointer to the EFI_HII_FONT_PROTOCOL instance.
-  @param  Char                    Character to retrieve.
-  @param  StringInfo              Points to the string font and color information
-                                  or NULL if the string should use the default
-                                  system font and color.
-  @param  Blt                     Thus must point to a NULL on entry. A buffer will
-                                  be allocated to hold the output and the pointer
-                                  updated on exit. It is the caller¡¯s
-                                  responsibility to free this buffer.
-  @param  Baseline                Number of pixels from the bottom of the bitmap to
-                                  the baseline.
-
-  @retval EFI_SUCCESS             Glyph bitmap created.
-  @retval EFI_OUT_OF_RESOURCES    Unable to allocate the output buffer Blt.
-  @retval EFI_WARN_UNKNOWN_GLYPH  The glyph was unknown and was replaced with the
-                                  glyph for Unicode character 0xFFFD.
-  @retval EFI_INVALID_PARAMETER   Blt is NULL or *Blt is not NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiGetGlyph (
-  IN  CONST EFI_HII_FONT_PROTOCOL    *This,
-  IN  CHAR16                         Char,
-  IN  CONST EFI_FONT_DISPLAY_INFO    *StringInfo,
-  OUT EFI_IMAGE_OUTPUT               **Blt,
-  OUT UINTN                          *Baseline OPTIONAL
-  )
-;
-
-
-/**
-  This function iterates through fonts which match the specified font, using
-  the specified criteria. If String is non-NULL, then all of the characters in
-  the string must exist in order for a candidate font to be returned.
-
-  @param  This                    A pointer to the EFI_HII_FONT_PROTOCOL instance.
-  @param  FontHandle              On entry, points to the font handle returned by a
-                                   previous call to GetFontInfo() or NULL to start
-                                  with the  first font. On return, points to the
-                                  returned font handle or points to NULL if there
-                                  are no more matching fonts.
-  @param  StringInfoIn            Upon entry, points to the font to return
-                                  information about.
-  @param  StringInfoOut           Upon return, contains the matching font¡¯s
-                                  information.  If NULL, then no information is
-                                  returned. It's caller's responsibility to free
-                                  this buffer.
-  @param  String                  Points to the string which will be tested to
-                                  determine  if all characters are available. If
-                                  NULL, then any font  is acceptable.
-
-  @retval EFI_SUCCESS             Matching font returned successfully.
-  @retval EFI_NOT_FOUND           No matching font was found.
-  @retval EFI_INVALID_PARAMETER   StringInfoIn is NULL.
-  @retval EFI_OUT_OF_RESOURCES    There were insufficient resources to complete the
-                                  request.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiGetFontInfo (
-  IN  CONST EFI_HII_FONT_PROTOCOL    *This,
-  IN  OUT   EFI_FONT_HANDLE          *FontHandle,
-  IN  CONST EFI_FONT_DISPLAY_INFO    *StringInfoIn,
-  OUT       EFI_FONT_DISPLAY_INFO    **StringInfoOut,
-  IN  CONST EFI_STRING               String OPTIONAL
-  )
-;
-
-//
-// EFI_HII_IMAGE_PROTOCOL interfaces
-//
-
-
-/**
-  This function adds the image Image to the group of images owned by PackageList, and returns
-  a new image identifier (ImageId).
-
-  @param  This                    A pointer to the EFI_HII_IMAGE_PROTOCOL instance.
-  @param  PackageList             Handle of the package list where this image will
-                                  be added.
-  @param  ImageId                 On return, contains the new image id, which is
-                                  unique within PackageList.
-  @param  Image                   Points to the image.
-
-  @retval EFI_SUCCESS             The new image was added successfully.
-  @retval EFI_NOT_FOUND           The specified PackageList could not be found in
-                                  database.
-  @retval EFI_OUT_OF_RESOURCES    Could not add the image due to lack of resources.
-  @retval EFI_INVALID_PARAMETER   Image is NULL or ImageId is NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiNewImage (
-  IN  CONST EFI_HII_IMAGE_PROTOCOL   *This,
-  IN  EFI_HII_HANDLE                 PackageList,
-  OUT EFI_IMAGE_ID                   *ImageId,
-  IN  CONST EFI_IMAGE_INPUT          *Image
-  )
-;
-
-
-/**
-  This function retrieves the image specified by ImageId which is associated with
-  the specified PackageList and copies it into the buffer specified by Image.
-
-  @param  This                    A pointer to the EFI_HII_IMAGE_PROTOCOL instance.
-  @param  PackageList             Handle of the package list where this image will
-                                  be searched.
-  @param  ImageId                 The image¡¯s id,, which is unique within
-                                  PackageList.
-  @param  Image                   Points to the image.
-  @param  ImageSize               On entry, points to the size of the buffer
-                                  pointed to by Image, in bytes. On return, points
-                                  to the length of the image, in bytes.
-
-  @retval EFI_SUCCESS             The new image was returned successfully.
-  @retval EFI_NOT_FOUND           The image specified by ImageId is not available.
-  @retval EFI_BUFFER_TOO_SMALL    The buffer specified by ImageSize is too small to
-                                  hold the image.
-  @retval EFI_INVALID_PARAMETER   The Image or ImageSize was NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiGetImage (
-  IN  CONST EFI_HII_IMAGE_PROTOCOL   *This,
-  IN  EFI_HII_HANDLE                 PackageList,
-  IN  EFI_IMAGE_ID                   ImageId,
-  OUT EFI_IMAGE_INPUT                *Image,
-  OUT UINTN                          *ImageSize
-  )
-;
-
-
-/**
-  This function updates the image specified by ImageId in the specified PackageListHandle to
-  the image specified by Image.
-
-  @param  This                    A pointer to the EFI_HII_IMAGE_PROTOCOL instance.
-  @param  PackageList             The package list containing the images.
-  @param  ImageId                 The image¡¯s id,, which is unique within
-                                  PackageList.
-  @param  Image                   Points to the image.
-
-  @retval EFI_SUCCESS             The new image was updated successfully.
-  @retval EFI_NOT_FOUND           The image specified by ImageId is not in the
-                                  database.
-  @retval EFI_INVALID_PARAMETER   The Image was NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiSetImage (
-  IN CONST EFI_HII_IMAGE_PROTOCOL    *This,
-  IN EFI_HII_HANDLE                  PackageList,
-  IN EFI_IMAGE_ID                    ImageId,
-  IN CONST EFI_IMAGE_INPUT           *Image
-  )
-;
-
-
-/**
-  This function renders an image to a bitmap or the screen using the specified
-  color and options. It draws the image on an existing bitmap, allocates a new
-  bitmap or uses the screen. The images can be clipped.
-
-  @param  This                    A pointer to the EFI_HII_IMAGE_PROTOCOL instance.
-  @param  Flags                   Describes how the image is to be drawn.
-  @param  Image                   Points to the image to be displayed.
-  @param  Blt                     If this points to a non-NULL on entry, this
-                                  points to the image, which is Width pixels wide
-                                  and Height pixels high.  The image will be drawn
-                                  onto this image and  EFI_HII_DRAW_FLAG_CLIP is
-                                  implied. If this points to a  NULL on entry, then
-                                  a buffer will be allocated to hold  the generated
-                                  image and the pointer updated on exit. It is the
-                                  caller¡¯s responsibility to free this buffer.
-  @param  BltY                    Specifies the offset from the left and top edge
-                                  of the  output image of the first pixel in the
-                                  image.
-
-  @retval EFI_SUCCESS             The image was successfully drawn.
-  @retval EFI_OUT_OF_RESOURCES    Unable to allocate an output buffer for Blt.
-  @retval EFI_INVALID_PARAMETER   The Image or Blt was NULL.
-  @retval EFI_INVALID_PARAMETER   Any combination of Flags is invalid.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiDrawImage (
-  IN CONST EFI_HII_IMAGE_PROTOCOL    *This,
-  IN EFI_HII_DRAW_FLAGS              Flags,
-  IN CONST EFI_IMAGE_INPUT           *Image,
-  IN OUT EFI_IMAGE_OUTPUT            **Blt,
-  IN UINTN                           BltX,
-  IN UINTN                           BltY
-  )
-;
-
-
-/**
-  This function renders an image to a bitmap or the screen using the specified
-  color and options. It draws the image on an existing bitmap, allocates a new
-  bitmap or uses the screen. The images can be clipped.
-
-  @param  This                    A pointer to the EFI_HII_IMAGE_PROTOCOL instance.
-  @param  Flags                   Describes how the image is to be drawn.
-  @param  PackageList             The package list in the HII database to search
-                                  for the  specified image.
-  @param  ImageId                 The image's id, which is unique within
-                                  PackageList.
-  @param  Blt                     If this points to a non-NULL on entry, this
-                                  points to the image, which is Width pixels wide
-                                  and Height pixels high. The image will be drawn
-                                  onto this image and
-                                  EFI_HII_DRAW_FLAG_CLIP is implied. If this points
-                                  to a  NULL on entry, then a buffer will be
-                                  allocated to hold  the generated image and the
-                                  pointer updated on exit. It is the caller¡¯s
-                                  responsibility to free this buffer.
-  @param  BltY                    Specifies the offset from the left and top edge
-                                  of the  output image of the first pixel in the
-                                  image.
-
-  @retval EFI_SUCCESS             The image was successfully drawn.
-  @retval EFI_OUT_OF_RESOURCES    Unable to allocate an output buffer for Blt.
-  @retval EFI_INVALID_PARAMETER   The Image was NULL.
-  @retval EFI_NOT_FOUND           The specified packagelist could not be found in
-                                  current database.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiDrawImageId (
-  IN CONST EFI_HII_IMAGE_PROTOCOL    *This,
-  IN EFI_HII_DRAW_FLAGS              Flags,
-  IN EFI_HII_HANDLE                  PackageList,
-  IN EFI_IMAGE_ID                    ImageId,
-  IN OUT EFI_IMAGE_OUTPUT            **Blt,
-  IN UINTN                           BltX,
-  IN UINTN                           BltY
-  )
-
-;
-
-//
-// EFI_HII_STRING_PROTOCOL
-//
-
-
-/**
-  This function adds the string String to the group of strings owned by PackageList, with the
-  specified font information StringFontInfo and returns a new string id.
-
-  @param  This                    A pointer to the EFI_HII_STRING_PROTOCOL
-                                  instance.
-  @param  PackageList             Handle of the package list where this string will
-                                  be added.
-  @param  StringId                On return, contains the new strings id, which is
-                                  unique within PackageList.
-  @param  Language                Points to the language for the new string.
-  @param  LanguageName            Points to the printable language name to
-                                  associate with the passed in  Language field.If
-                                  LanguageName is not NULL and the string package
-                                  header's LanguageName  associated with a given
-                                  Language is not zero, the LanguageName being
-                                  passed  in will be ignored.
-  @param  String                  Points to the new null-terminated string.
-  @param  StringFontInfo          Points to the new string¡¯s font information or
-                                  NULL if the string should have the default system
-                                  font, size and style.
-
-  @retval EFI_SUCCESS             The new string was added successfully.
-  @retval EFI_NOT_FOUND           The specified PackageList could not be found in
-                                  database.
-  @retval EFI_OUT_OF_RESOURCES    Could not add the string due to lack of
-                                  resources.
-  @retval EFI_INVALID_PARAMETER   String is NULL or StringId is NULL or Language is
-                                  NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiNewString (
-  IN  CONST EFI_HII_STRING_PROTOCOL   *This,
-  IN  EFI_HII_HANDLE                  PackageList,
-  OUT EFI_STRING_ID                   *StringId,
-  IN  CONST CHAR8                     *Language,
-  IN  CONST CHAR16                    *LanguageName, OPTIONAL
-  IN  CONST EFI_STRING                String,
-  IN  CONST EFI_FONT_INFO             *StringFontInfo OPTIONAL
-  )
-;
-
-
-/**
-  This function retrieves the string specified by StringId which is associated
-  with the specified PackageList in the language Language and copies it into
-  the buffer specified by String.
-
-  @param  This                    A pointer to the EFI_HII_STRING_PROTOCOL
-                                  instance.
-  @param  Language                Points to the language for the retrieved string.
-  @param  PackageList             The package list in the HII database to search
-                                  for the  specified string.
-  @param  StringId                The string's id, which is unique within
-                                  PackageList.
-  @param  String                  Points to the new null-terminated string.
-  @param  StringSize              On entry, points to the size of the buffer
-                                  pointed to by  String, in bytes. On return,
-                                  points to the length of the string, in bytes.
-  @param  StringFontInfo          If not NULL, points to the string¡¯s font
-                                  information.  It's caller's responsibility to
-                                  free this buffer.
-
-  @retval EFI_SUCCESS             The string was returned successfully.
-  @retval EFI_NOT_FOUND           The string specified by StringId is not
-                                  available.
-  @retval EFI_NOT_FOUND           The string specified by StringId is available but
-                                  not in the specified language.
-  @retval EFI_BUFFER_TOO_SMALL    The buffer specified by StringSize is too small
-                                  to  hold the string.
-  @retval EFI_INVALID_PARAMETER   The String or Language or StringSize was NULL.
-  @retval EFI_OUT_OF_RESOURCES    There were insufficient resources to complete the
-                                   request.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiGetString (
-  IN  CONST EFI_HII_STRING_PROTOCOL   *This,
-  IN  CONST CHAR8                     *Language,
-  IN  EFI_HII_HANDLE                  PackageList,
-  IN  EFI_STRING_ID                   StringId,
-  OUT EFI_STRING                      String,
-  IN  OUT UINTN                       *StringSize,
-  OUT EFI_FONT_INFO                   **StringFontInfo OPTIONAL
-  )
-;
-
-
-/**
-  This function updates the string specified by StringId in the specified PackageList to the text
-  specified by String and, optionally, the font information specified by StringFontInfo.
-
-  @param  This                    A pointer to the EFI_HII_STRING_PROTOCOL
-                                  instance.
-  @param  PackageList             The package list containing the strings.
-  @param  StringId                The string¡¯s id, which is unique within
-                                  PackageList.
-  @param  Language                Points to the language for the updated string.
-  @param  String                  Points to the new null-terminated string.
-  @param  StringFontInfo          Points to the string¡¯s font information or NULL
-                                  if the string font information is not changed.
-
-  @retval EFI_SUCCESS             The string was updated successfully.
-  @retval EFI_NOT_FOUND           The string specified by StringId is not in the
-                                  database.
-  @retval EFI_INVALID_PARAMETER   The String or Language was NULL.
-  @retval EFI_OUT_OF_RESOURCES    The system is out of resources to accomplish the
-                                  task.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiSetString (
-  IN CONST EFI_HII_STRING_PROTOCOL    *This,
-  IN EFI_HII_HANDLE                   PackageList,
-  IN EFI_STRING_ID                    StringId,
-  IN CONST CHAR8                      *Language,
-  IN CONST EFI_STRING                 String,
-  IN CONST EFI_FONT_INFO              *StringFontInfo OPTIONAL
-  )
-;
-
-
-/**
-  This function returns the list of supported languages, in the format specified
-  in Appendix M of UEFI 2.1 spec.
-
-  @param  This                    A pointer to the EFI_HII_STRING_PROTOCOL
-                                  instance.
-  @param  PackageList             The package list to examine.
-  @param  Languages               Points to the buffer to hold the returned string.
-  @param  LanguagesSize           On entry, points to the size of the buffer
-                                  pointed to by  Languages, in bytes. On  return,
-                                  points to the length of Languages, in bytes.
-
-  @retval EFI_SUCCESS             The languages were returned successfully.
-  @retval EFI_INVALID_PARAMETER   The Languages or LanguagesSize was NULL.
-  @retval EFI_BUFFER_TOO_SMALL    The LanguagesSize is too small to hold the list
-                                  of  supported languages. LanguageSize is updated
-                                  to contain the required size.
-  @retval EFI_NOT_FOUND           Could not find string package in specified
-                                  packagelist.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiGetLanguages (
-  IN CONST EFI_HII_STRING_PROTOCOL    *This,
-  IN EFI_HII_HANDLE                   PackageList,
-  IN OUT CHAR8                        *Languages,
-  IN OUT UINTN                        *LanguagesSize
-  )
-;
-
-
-/**
-  Each string package has associated with it a single primary language and zero
-  or more secondary languages. This routine returns the secondary languages
-  associated with a package list.
-
-  @param  This                    A pointer to the EFI_HII_STRING_PROTOCOL
-                                  instance.
-  @param  PackageList             The package list to examine.
-  @param  FirstLanguage           Points to the primary language.
-  @param  SecondaryLanguages      Points to the buffer to hold the returned list of
-                                   secondary languages for the specified
-                                  FirstLanguage. If there are no secondary
-                                  languages, the function  returns successfully,
-                                  but this is set to NULL.
-  @param  SecondaryLanguageSize   On entry, points to the size of the buffer
-                                  pointed to  by SecondLanguages, in bytes. On
-                                  return, points to the length of SecondLanguages
-                                  in bytes.
-
-  @retval EFI_SUCCESS             Secondary languages were correctly returned.
-  @retval EFI_INVALID_PARAMETER   FirstLanguage or SecondLanguages or
-                                  SecondLanguagesSize was NULL.
-  @retval EFI_BUFFER_TOO_SMALL    The buffer specified by SecondLanguagesSize is
-                                  too small to hold the returned information.
-                                  SecondLanguageSize is updated to hold the size of
-                                  the buffer required.
-  @retval EFI_NOT_FOUND           The language specified by FirstLanguage is not
-                                  present in the specified package list.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiGetSecondaryLanguages (
-  IN CONST EFI_HII_STRING_PROTOCOL   *This,
-  IN EFI_HII_HANDLE                  PackageList,
-  IN CONST CHAR8                     *FirstLanguage,
-  IN OUT CHAR8                       *SecondLanguages,
-  IN OUT UINTN                       *SecondLanguagesSize
-  )
-;
-
-//
-// EFI_HII_DATABASE_PROTOCOL protocol interfaces
-//
-
-
-/**
-  This function adds the packages in the package list to the database and returns a handle. If there is a
-  EFI_DEVICE_PATH_PROTOCOL associated with the DriverHandle, then this function will
-  create a package of type EFI_PACKAGE_TYPE_DEVICE_PATH and add it to the package list.
-
-  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL
-                                  instance.
-  @param  PackageList             A pointer to an EFI_HII_PACKAGE_LIST_HEADER
-                                  structure.
-  @param  DriverHandle            Associate the package list with this EFI handle.
-  @param  Handle                  A pointer to the EFI_HII_HANDLE instance.
-
-  @retval EFI_SUCCESS             The package list associated with the Handle was
-                                  added to the HII database.
-  @retval EFI_OUT_OF_RESOURCES    Unable to allocate necessary resources for the
-                                  new database contents.
-  @retval EFI_INVALID_PARAMETER   PackageList is NULL or Handle is NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiNewPackageList (
-  IN CONST EFI_HII_DATABASE_PROTOCOL    *This,
-  IN CONST EFI_HII_PACKAGE_LIST_HEADER  *PackageList,
-  IN CONST EFI_HANDLE                   DriverHandle,
-  OUT EFI_HII_HANDLE                    *Handle
-  )
-;
-
-
-/**
-  This function removes the package list that is associated with a handle Handle
-  from the HII database. Before removing the package, any registered functions
-  with the notification type REMOVE_PACK and the same package type will be called.
-
-  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL
-                                  instance.
-  @param  Handle                  The handle that was registered to the data that
-                                  is requested  for removal.
-
-  @retval EFI_SUCCESS             The data associated with the Handle was removed
-                                  from  the HII database.
-  @retval EFI_NOT_FOUND           The specified PackageList could not be found in
-                                  database.
-  @retval EFI_INVALID_PARAMETER   The Handle was not valid.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiRemovePackageList (
-  IN CONST EFI_HII_DATABASE_PROTOCOL    *This,
-  IN EFI_HII_HANDLE                     Handle
-  )
-;
-
-
-/**
-  This function updates the existing package list (which has the specified Handle)
-  in the HII databases, using the new package list specified by PackageList.
-
-  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL
-                                  instance.
-  @param  Handle                  The handle that was registered to the data that
-                                  is  requested to be updated.
-  @param  PackageList             A pointer to an EFI_HII_PACKAGE_LIST_HEADER
-                                  package.
-
-  @retval EFI_SUCCESS             The HII database was successfully updated.
-  @retval EFI_OUT_OF_RESOURCES    Unable to allocate enough memory for the updated
-                                  database.
-  @retval EFI_INVALID_PARAMETER   Handle or PackageList was NULL.
-  @retval EFI_NOT_FOUND           The Handle was not valid or could not be found in
-                                  database.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiUpdatePackageList (
-  IN CONST EFI_HII_DATABASE_PROTOCOL    *This,
-  IN EFI_HII_HANDLE                     Handle,
-  IN CONST EFI_HII_PACKAGE_LIST_HEADER  *PackageList
-  )
-;
-
-
-/**
-  This function returns a list of the package handles of the specified type
-  that are currently active in the database. The pseudo-type
-  EFI_HII_PACKAGE_TYPE_ALL will cause all package handles to be listed.
-
-  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL
-                                  instance.
-  @param  PackageType             Specifies the package type of the packages to
-                                  list or EFI_HII_PACKAGE_TYPE_ALL for all packages
-                                  to be listed.
-  @param  PackageGuid             If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
-                                  this  is the pointer to the GUID which must match
-                                  the Guid field of EFI_HII_GUID_PACKAGE_GUID_HDR.
-                                  Otherwise,  it must be NULL.
-  @param  HandleBufferLength      On input, a pointer to the length of the handle
-                                  buffer.  On output, the length of the handle
-                                  buffer that is required for the handles found.
-  @param  Handle                  An array of EFI_HII_HANDLE instances returned.
-
-  @retval EFI_SUCCESS             The matching handles are outputed successfully.
-  @retval EFI_BUFFER_TO_SMALL     The HandleBufferLength parameter indicates that
-                                  Handle is too small to support the number of
-                                  handles. HandleBufferLength is updated with a
-                                  value that will  enable the data to fit.
-  @retval EFI_NOT_FOUND           No matching handle could not be found in
-                                  database.
-  @retval EFI_INVALID_PARAMETER   Handle or HandleBufferLength was NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiListPackageLists (
-  IN  CONST EFI_HII_DATABASE_PROTOCOL   *This,
-  IN  UINT8                             PackageType,
-  IN  CONST EFI_GUID                    *PackageGuid,
-  IN  OUT UINTN                         *HandleBufferLength,
-  OUT EFI_HII_HANDLE                    *Handle
-  )
-;
-
-
-/**
-  This function will export one or all package lists in the database to a buffer.
-  For each package list exported, this function will call functions registered
-  with EXPORT_PACK and then copy the package list to the buffer.
-
-  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL
-                                  instance.
-  @param  Handle                  An EFI_HII_HANDLE that corresponds to the desired
-                                  package list in the HII database to export or
-                                  NULL to indicate  all package lists should be
-                                  exported.
-  @param  BufferSize              On input, a pointer to the length of the buffer.
-                                  On output, the length of the buffer that is
-                                  required for the exported data.
-  @param  Buffer                  A pointer to a buffer that will contain the
-                                  results of  the export function.
-
-  @retval EFI_SUCCESS             Package exported.
-  @retval EFI_BUFFER_TO_SMALL     The HandleBufferLength parameter indicates that
-                                  Handle is too small to support the number of
-                                  handles.      HandleBufferLength is updated with
-                                  a value that will enable the data to fit.
-  @retval EFI_NOT_FOUND           The specifiecd Handle could not be found in the
-                                  current database.
-  @retval EFI_INVALID_PARAMETER   Handle or Buffer or BufferSize was NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiExportPackageLists (
-  IN  CONST EFI_HII_DATABASE_PROTOCOL   *This,
-  IN  EFI_HII_HANDLE                    Handle,
-  IN  OUT UINTN                         *BufferSize,
-  OUT EFI_HII_PACKAGE_LIST_HEADER       *Buffer
-  )
-;
-
-
-/**
-  This function registers a function which will be called when specified actions related to packages of
-  the specified type occur in the HII database. By registering a function, other HII-related drivers are
-  notified when specific package types are added, removed or updated in the HII database.
-  Each driver or application which registers a notification should use
-  EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify() before exiting.
-
-  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL
-                                  instance.
-  @param  PackageType             Specifies the package type of the packages to
-                                  list or EFI_HII_PACKAGE_TYPE_ALL for all packages
-                                  to be listed.
-  @param  PackageGuid             If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
-                                  this is the pointer to the GUID which must match
-                                  the Guid field of
-                                  EFI_HII_GUID_PACKAGE_GUID_HDR. Otherwise, it must
-                                  be NULL.
-  @param  PackageNotifyFn         Points to the function to be called when the
-                                  event specified by
-                                  NotificationType occurs.
-  @param  NotifyType              Describes the types of notification which this
-                                  function will be receiving.
-  @param  NotifyHandle            Points to the unique handle assigned to the
-                                  registered notification. Can be used in
-                                  EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify()
-                                  to stop notifications.
-
-  @retval EFI_SUCCESS             Notification registered successfully.
-  @retval EFI_OUT_OF_RESOURCES    Unable to allocate necessary data structures
-  @retval EFI_INVALID_PARAMETER   NotifyHandle is NULL.
-  @retval EFI_INVALID_PARAMETER   PackageGuid is not NULL when PackageType is not
-                                  EFI_HII_PACKAGE_TYPE_GUID.
-  @retval EFI_INVALID_PARAMETER   PackageGuid is NULL when PackageType is
-                                  EFI_HII_PACKAGE_TYPE_GUID.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiRegisterPackageNotify (
-  IN  CONST EFI_HII_DATABASE_PROTOCOL   *This,
-  IN  UINT8                             PackageType,
-  IN  CONST EFI_GUID                    *PackageGuid,
-  IN  CONST EFI_HII_DATABASE_NOTIFY     PackageNotifyFn,
-  IN  EFI_HII_DATABASE_NOTIFY_TYPE      NotifyType,
-  OUT EFI_HANDLE                        *NotifyHandle
-  )
-;
-
-
-/**
-  Removes the specified HII database package-related notification.
-
-  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL
-                                  instance.
-  @param  NotifyHandle            The handle of the notification function being
-                                  unregistered.
-
-  @retval EFI_SUCCESS             Notification is unregistered successfully.
-  @retval EFI_INVALID_PARAMETER   The Handle is invalid.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiUnregisterPackageNotify (
-  IN CONST EFI_HII_DATABASE_PROTOCOL    *This,
-  IN EFI_HANDLE                         NotificationHandle
-  )
-;
-
-
-/**
-  This routine retrieves an array of GUID values for each keyboard layout that
-  was previously registered in the system.
-
-  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL
-                                  instance.
-  @param  KeyGuidBufferLength     On input, a pointer to the length of the keyboard
-                                  GUID  buffer. On output, the length of the handle
-                                  buffer  that is required for the handles found.
-  @param  KeyGuidBuffer           An array of keyboard layout GUID instances
-                                  returned.
-
-  @retval EFI_SUCCESS             KeyGuidBuffer was updated successfully.
-  @retval EFI_BUFFER_TOO_SMALL    The KeyGuidBufferLength parameter indicates
-                                  that KeyGuidBuffer is too small to support the
-                                  number of GUIDs. KeyGuidBufferLength is
-                                  updated with a value that will enable the data to
-                                  fit.
-  @retval EFI_INVALID_PARAMETER   The KeyGuidBuffer or KeyGuidBufferLength was
-                                  NULL.
-  @retval EFI_NOT_FOUND           There was no keyboard layout.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiFindKeyboardLayouts (
-  IN  CONST EFI_HII_DATABASE_PROTOCOL   *This,
-  IN  OUT UINT16                        *KeyGuidBufferLength,
-  OUT EFI_GUID                          *KeyGuidBuffer
-  )
-;
-
-
-/**
-  This routine retrieves the requested keyboard layout. The layout is a physical description of the keys
-  on a keyboard and the character(s) that are associated with a particular set of key strokes.
-
-  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL
-                                  instance.
-  @param  KeyGuid                 A pointer to the unique ID associated with a
-                                  given keyboard layout. If KeyGuid is NULL then
-                                  the current layout will be retrieved.
-  @param  KeyboardLayoutLength    On input, a pointer to the length of the
-                                  KeyboardLayout buffer.  On output, the length of
-                                  the data placed into KeyboardLayout.
-  @param  KeyboardLayout          A pointer to a buffer containing the retrieved
-                                  keyboard layout.
-
-  @retval EFI_SUCCESS             The keyboard layout was retrieved successfully.
-  @retval EFI_NOT_FOUND           The requested keyboard layout was not found.
-  @retval EFI_INVALID_PARAMETER   The KeyboardLayout or KeyboardLayoutLength was
-                                  NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiGetKeyboardLayout (
-  IN  CONST EFI_HII_DATABASE_PROTOCOL   *This,
-  IN  CONST EFI_GUID                          *KeyGuid,
-  IN OUT UINT16                         *KeyboardLayoutLength,
-  OUT EFI_HII_KEYBOARD_LAYOUT           *KeyboardLayout
-  )
-;
-
-
-/**
-  This routine sets the default keyboard layout to the one referenced by KeyGuid. When this routine
-  is called, an event will be signaled of the EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID
-  group type. This is so that agents which are sensitive to the current keyboard layout being changed
-  can be notified of this change.
-
-  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL
-                                  instance.
-  @param  KeyGuid                 A pointer to the unique ID associated with a
-                                  given keyboard layout.
-
-  @retval EFI_SUCCESS             The current keyboard layout was successfully set.
-  @retval EFI_NOT_FOUND           The referenced keyboard layout was not found, so
-                                  action was taken.
-  @retval EFI_INVALID_PARAMETER   The KeyGuid was NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiSetKeyboardLayout (
-  IN CONST EFI_HII_DATABASE_PROTOCOL          *This,
-  IN CONST EFI_GUID                           *KeyGuid
-  )
-;
-
-
-/**
-  Return the EFI handle associated with a package list.
-
-  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL
-                                  instance.
-  @param  PackageListHandle       An EFI_HII_HANDLE that corresponds to the desired
-                                  package list in the HIIdatabase.
-  @param  DriverHandle            On return, contains the EFI_HANDLE which was
-                                  registered with the package list in
-                                  NewPackageList().
-
-  @retval EFI_SUCCESS             The DriverHandle was returned successfully.
-  @retval EFI_INVALID_PARAMETER   The PackageListHandle was not valid or
-                                  DriverHandle was NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiGetPackageListHandle (
-  IN  CONST EFI_HII_DATABASE_PROTOCOL         *This,
-  IN  EFI_HII_HANDLE                    PackageListHandle,
-  OUT EFI_HANDLE                        *DriverHandle
-  )
-;
-
-//
-// EFI_HII_CONFIG_ROUTING_PROTOCOL interfaces
-//
-
-
-/**
-  This function allows a caller to extract the current configuration
-  for one or more named elements from one or more drivers.
-
-  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL
-                                  instance.
-  @param  Request                 A null-terminated Unicode string in
-                                  <MultiConfigRequest> format.
-  @param  Progress                On return, points to a character in the Request
-                                  string. Points to the string's null terminator if
-                                  request was successful. Points to the most recent
-                                  & before the first failing name / value pair (or
-                                  the beginning of the string if the failure is in
-                                  the first name / value pair) if the request was
-                                  not successful.
-  @param  Results                 Null-terminated Unicode string in
-                                  <MultiConfigAltResp> format which has all values
-                                  filled in for the names in the Request string.
-                                  String to be allocated by the called function.
-
-  @retval EFI_SUCCESS             The Results string is filled with the values
-                                  corresponding to all requested names.
-  @retval EFI_OUT_OF_RESOURCES    Not enough memory to store the parts of the
-                                  results that must be stored awaiting possible
-                                  future        protocols.
-  @retval EFI_NOT_FOUND           Routing data doesn¡¯t match any known driver.
-                                     Progress set to the ¡°G¡± in ¡°GUID¡± of the
-                                  routing  header that doesn¡¯t match. Note: There
-                                  is no         requirement that all routing data
-                                  be validated before any configuration extraction.
-  @retval EFI_INVALID_PARAMETER   For example, passing in a NULL for the Request
-                                  parameter would result in this type of error. The
-                                  Progress parameter is set to NULL.
-  @retval EFI_INVALID_PARAMETER   Illegal syntax. Progress set to most recent &
-                                  before the error or the beginning of the string.
-  @retval EFI_INVALID_PARAMETER   Unknown name. Progress points to the & before the
-                                  name in question.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiConfigRoutingExtractConfig (
-  IN  CONST EFI_HII_CONFIG_ROUTING_PROTOCOL  *This,
-  IN  CONST EFI_STRING                       Request,
-  OUT EFI_STRING                             *Progress,
-  OUT EFI_STRING                             *Results
-  )
-;
-
-
-/**
-  This function allows the caller to request the current configuration for the
-  entirety of the current HII database and returns the data in a null-terminated Unicode string.
-
-  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL
-                                  instance.
-  @param  Results                 Null-terminated Unicode string in
-                                  <MultiConfigAltResp> format which has all values
-                                  filled in for the names in the Request string.
-                                  String to be allocated by the  called function.
-                                  De-allocation is up to the caller.
-
-  @retval EFI_SUCCESS             The Results string is filled with the values
-                                  corresponding to all requested names.
-  @retval EFI_OUT_OF_RESOURCES    Not enough memory to store the parts of the
-                                  results that must be stored awaiting possible
-                                  future        protocols.
-  @retval EFI_INVALID_PARAMETER   For example, passing in a NULL for the Results
-                                  parameter would result in this type of error.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiConfigRoutingExportConfig (
-  IN  CONST EFI_HII_CONFIG_ROUTING_PROTOCOL  *This,
-  OUT EFI_STRING                             *Results
-  )
-;
-
-
-/**
-  This function processes the results of processing forms and routes it to the
-  appropriate handlers or storage.
-
-  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL
-                                  instance.
-  @param  Configuration           A null-terminated Unicode string in
-                                  <MulltiConfigResp> format.
-  @param  Progress                A pointer to a string filled in with the offset
-                                  of the most recent & before the first failing
-                                  name / value pair (or the beginning of the string
-                                  if the failure is in the first name / value pair)
-                                  or the terminating NULL if all was successful.
-
-  @retval EFI_SUCCESS             The results have been distributed or are awaiting
-                                  distribution.
-  @retval EFI_OUT_OF_RESOURCES    Not enough memory to store the parts of the
-                                  results that must be stored awaiting possible
-                                  future        protocols.
-  @retval EFI_INVALID_PARAMETER   Passing in a NULL for the Configuration parameter
-                                  would result in this type of error.
-  @retval EFI_NOT_FOUND           Target for the specified routing data was not
-                                  found.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiConfigRoutingRoutConfig (
-  IN  CONST EFI_HII_CONFIG_ROUTING_PROTOCOL  *This,
-  IN  CONST EFI_STRING                       Configuration,
-  OUT EFI_STRING                             *Progress
-  )
-;
-
-
-
-/**
-  This helper function is to be called by drivers to map configuration data stored
-  in byte array (¡°block¡±) formats such as UEFI Variables into current configuration strings.
-
-  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL
-                                  instance.
-  @param  ConfigRequest           A null-terminated Unicode string in
-                                  <ConfigRequest> format.
-  @param  Block                   Array of bytes defining the block's
-                                  configuration.
-  @param  BlockSize               Length in bytes of Block.
-  @param  Config                  Filled-in configuration string. String allocated
-                                  by  the function. Returned only if call is
-                                  successful.
-  @param  Progress                A pointer to a string filled in with the offset
-                                  of  the most recent & before the first failing
-                                  name/value pair (or the beginning of the string
-                                  if the failure is in the first name / value pair)
-                                  or the terminating NULL if all was successful.
-
-  @retval EFI_SUCCESS             The request succeeded. Progress points to the
-                                  null terminator at the end of the ConfigRequest
-                                        string.
-  @retval EFI_OUT_OF_RESOURCES    Not enough memory to allocate Config.
-                                  Progress points to the first character of
-                                  ConfigRequest.
-  @retval EFI_INVALID_PARAMETER   Passing in a NULL for the ConfigRequest or
-                                  Block parameter would result in this type of
-                                  error. Progress points to the first character of
-                                  ConfigRequest.
-  @retval EFI_NOT_FOUND           Target for the specified routing data was not
-                                  found. Progress points to the ¡°G¡± in ¡°GUID¡± of
-                                  the      errant routing data.
-  @retval EFI_DEVICE_ERROR        Block not large enough. Progress undefined.
-  @retval EFI_INVALID_PARAMETER   Encountered non <BlockName> formatted string.
-                                       Block is left updated and Progress points at
-                                  the ¡®&¡¯ preceding the first non-<BlockName>.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiBlockToConfig (
-  IN  CONST EFI_HII_CONFIG_ROUTING_PROTOCOL  *This,
-  IN  CONST EFI_STRING                       ConfigRequest,
-  IN  CONST UINT8                            *Block,
-  IN  CONST UINTN                            BlockSize,
-  OUT EFI_STRING                             *Config,
-  OUT EFI_STRING                             *Progress
-  )
-;
-
-
-/**
-  This helper function is to be called by drivers to map configuration strings
-  to configurations stored in byte array (¡°block¡±) formats such as UEFI Variables.
-
-  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL
-                                  instance.
-  @param  ConfigResp              A null-terminated Unicode string in <ConfigResp>
-                                  format.
-  @param  Block                   A possibly null array of bytes representing the
-                                  current  block. Only bytes referenced in the
-                                  ConfigResp string  in the block are modified. If
-                                  this parameter is null or if the *BlockSize
-                                  parameter is (on input) shorter than required by
-                                  the Configuration string, only the BlockSize
-                                  parameter is updated and an appropriate status
-                                  (see below)  is returned.
-  @param  BlockSize               The length of the Block in units of UINT8.  On
-                                  input, this is the size of the Block. On output,
-                                  if successful, contains the index of the  last
-                                  modified byte in the Block.
-  @param  Progress                On return, points to an element of the ConfigResp
-                                   string filled in with the offset of the most
-                                  recent '&' before the first failing name / value
-                                  pair (or  the beginning of the string if the
-                                  failure is in the  first name / value pair) or
-                                  the terminating NULL if all was successful.
-
-  @retval EFI_SUCCESS             The request succeeded. Progress points to the
-                                  null terminator at the end of the ConfigResp
-                                  string.
-  @retval EFI_OUT_OF_RESOURCES    Not enough memory to allocate Config.
-                                  Progress points to the first character of
-                                  ConfigResp.
-  @retval EFI_INVALID_PARAMETER   Passing in a NULL for the ConfigResp or
-                                  Block parameter would result in this type of
-                                  error. Progress points to the first character of
-                                           ConfigResp.
-  @retval EFI_NOT_FOUND           Target for the specified routing data was not
-                                  found. Progress points to the ¡°G¡± in ¡°GUID¡± of
-                                  the      errant routing data.
-  @retval EFI_INVALID_PARAMETER   Encountered non <BlockName> formatted name /
-                                  value pair. Block is left updated and
-                                  Progress points at the ¡®&¡¯ preceding the first
-                                  non-<BlockName>.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiConfigToBlock (
-  IN     CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,
-  IN     CONST EFI_STRING                      ConfigResp,
-  IN OUT UINT8                                 *Block,
-  IN OUT UINTN                                 *BlockSize,
-  OUT    EFI_STRING                            *Progress
-  )
-;
-
-
-/**
-  This helper function is to be called by drivers to extract portions of
-  a larger configuration string.
-
-  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL
-                                  instance.
-  @param  Configuration           A null-terminated Unicode string in
-                                  <MultiConfigAltResp> format.
-  @param  Guid                    A pointer to the GUID value to search for in the
-                                  routing portion of the ConfigResp string when
-                                  retrieving  the requested data. If Guid is NULL,
-                                  then all GUID  values will be searched for.
-  @param  Name                    A pointer to the NAME value to search for in the
-                                  routing portion of the ConfigResp string when
-                                  retrieving  the requested data. If Name is NULL,
-                                  then all Name  values will be searched for.
-  @param  DevicePath              A pointer to the PATH value to search for in the
-                                  routing portion of the ConfigResp string when
-                                  retrieving  the requested data. If DevicePath is
-                                  NULL, then all  DevicePath values will be
-                                  searched for.
-  @param  AltCfgId                A pointer to the ALTCFG value to search for in
-                                  the  routing portion of the ConfigResp string
-                                  when retrieving  the requested data.  If this
-                                  parameter is NULL,  then the current setting will
-                                  be retrieved.
-  @param  AltCfgResp              A pointer to a buffer which will be allocated by
-                                  the  function which contains the retrieved string
-                                  as requested.   This buffer is only allocated if
-                                  the call was successful.
-
-  @retval EFI_SUCCESS             The request succeeded. The requested data was
-                                  extracted  and placed in the newly allocated
-                                  AltCfgResp buffer.
-  @retval EFI_OUT_OF_RESOURCES    Not enough memory to allocate AltCfgResp.
-  @retval EFI_INVALID_PARAMETER   Any parameter is invalid.
-  @retval EFI_NOT_FOUND           Target for the specified routing data was not
-                                  found.
-
-**/
-EFI_STATUS
-EFIAPI
-HiiGetAltCfg (
-  IN  CONST EFI_HII_CONFIG_ROUTING_PROTOCOL    *This,
-  IN  CONST EFI_STRING                         Configuration,
-  IN  CONST EFI_GUID                           *Guid,
-  IN  CONST EFI_STRING                         Name,
-  IN  CONST EFI_DEVICE_PATH_PROTOCOL           *DevicePath,
-  IN  CONST UINT16                             *AltCfgId,
-  OUT EFI_STRING                               *AltCfgResp
-  )
-;
-
-
-//
-// Global variables
-//
-extern EFI_EVENT gHiiKeyboardLayoutChanged;
-
-#include "R8Lib.h"
-
-#endif
+/** @file\r
+\r
+Copyright (c) 2007, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+Module Name:\r
+\r
+    HiiDatabase.h\r
+\r
+Abstract:\r
+\r
+    Private structures definitions in HiiDatabase.\r
+\r
+Revision History\r
+\r
+\r
+**/\r
+\r
+#ifndef __HII_DATABASE_PRIVATE_H__\r
+#define __HII_DATABASE_PRIVATE_H__\r
+\r
+#include <PiDxe.h>\r
+\r
+#include <Protocol/ConsoleControl.h>\r
+#include <Protocol/DevicePath.h>\r
+#include <Protocol/HiiFont.h>\r
+#include <Protocol/HiiImage.h>\r
+#include <Protocol/HiiString.h>\r
+#include <Protocol/HiiDatabase.h>\r
+#include <Protocol/HiiConfigRouting.h>\r
+#include <Protocol/HiiConfigAccess.h>\r
+#include <Protocol/SimpleTextOut.h>\r
+\r
+#include <Guid/HiiKeyBoardLayout.h>\r
+\r
+\r
+#include <Library/DebugLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/UefiDriverEntryPoint.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/DevicePathLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+\r
+#define HII_DATABASE_NOTIFY_GUID \\r
+  { \\r
+    0xc1c76, 0xd79e, 0x42fe, {0x86, 0xb, 0x8b, 0xe8, 0x7b, 0x3e, 0x7a, 0x78} \\r
+  }\r
+\r
+#define MAX_STRING_LENGTH                  1024\r
+#define MAX_FONT_NAME_LEN                  256\r
+#define NARROW_BASELINE                    15\r
+#define WIDE_BASELINE                      14\r
+#define SYS_FONT_INFO_MASK                 0x37\r
+#define REPLACE_UNKNOWN_GLYPH              0xFFFD\r
+#define PROPORTIONAL_GLYPH                 0x80\r
+#define NARROW_GLYPH                       0x40\r
+\r
+#define BITMAP_LEN_1_BIT(Width, Height)  (((Width) + 7) / 8 * (Height))\r
+#define BITMAP_LEN_4_BIT(Width, Height)  (((Width) + 1) / 2 * (Height))\r
+#define BITMAP_LEN_8_BIT(Width, Height)  ((Width) * (Height))\r
+#define BITMAP_LEN_24_BIT(Width, Height) ((Width) * (Height) * 3)\r
+\r
+//\r
+// Storage types\r
+//\r
+#define EFI_HII_VARSTORE_BUFFER            0\r
+#define EFI_HII_VARSTORE_NAME_VALUE        1\r
+#define EFI_HII_VARSTORE_EFI_VARIABLE      2\r
+\r
+#define HII_FORMSET_STORAGE_SIGNATURE           EFI_SIGNATURE_32 ('H', 'S', 'T', 'G')\r
+typedef struct {\r
+  UINTN               Signature;\r
+  LIST_ENTRY          Entry;\r
+\r
+  EFI_HII_HANDLE      HiiHandle;\r
+  EFI_HANDLE          DriverHandle;\r
+\r
+  UINT8               Type;   // EFI_HII_VARSTORE_BUFFER, EFI_HII_VARSTORE_NAME_VALUE, EFI_HII_VARSTORE_EFI_VARIABLE\r
+  EFI_GUID            Guid;\r
+  CHAR16              *Name;\r
+  UINT16              Size;\r
+} HII_FORMSET_STORAGE;\r
+\r
+#define HII_FORMSET_STORAGE_FROM_LINK(a)  CR (a, HII_FORMSET_STORAGE, Link, HII_FORMSET_STORAGE_SIGNATURE)\r
+\r
+\r
+//\r
+// String Package definitions\r
+//\r
+#define HII_STRING_PACKAGE_SIGNATURE    EFI_SIGNATURE_32 ('h','i','s','p')\r
+typedef struct _HII_STRING_PACKAGE_INSTANCE {\r
+  UINTN                                 Signature;\r
+  EFI_HII_STRING_PACKAGE_HDR            *StringPkgHdr;\r
+  UINT8                                 *StringBlock;\r
+  LIST_ENTRY                            StringEntry;\r
+  LIST_ENTRY                            FontInfoList;  // local font info list\r
+  UINT8                                 FontId;\r
+} HII_STRING_PACKAGE_INSTANCE;\r
+\r
+//\r
+// Form Package definitions\r
+//\r
+#define HII_IFR_PACKAGE_SIGNATURE       EFI_SIGNATURE_32 ('h','f','r','p')\r
+typedef struct _HII_IFR_PACKAGE_INSTANCE {\r
+  UINTN                                 Signature;\r
+  EFI_HII_PACKAGE_HEADER                FormPkgHdr;\r
+  UINT8                                 *IfrData;\r
+  LIST_ENTRY                            IfrEntry;\r
+} HII_IFR_PACKAGE_INSTANCE;\r
+\r
+//\r
+// Simple Font Package definitions\r
+//\r
+#define HII_S_FONT_PACKAGE_SIGNATURE    EFI_SIGNATURE_32 ('h','s','f','p')\r
+typedef struct _HII_SIMPLE_FONT_PACKAGE_INSTANCE {\r
+  UINTN                                 Signature;\r
+  EFI_HII_SIMPLE_FONT_PACKAGE_HDR       *SimpleFontPkgHdr;\r
+  LIST_ENTRY                            SimpleFontEntry;\r
+} HII_SIMPLE_FONT_PACKAGE_INSTANCE;\r
+\r
+//\r
+// Font Package definitions\r
+//\r
+#define HII_FONT_PACKAGE_SIGNATURE      EFI_SIGNATURE_32 ('h','i','f','p')\r
+typedef struct _HII_FONT_PACKAGE_INSTANCE {\r
+  UINTN                                 Signature;\r
+  EFI_HII_FONT_PACKAGE_HDR              *FontPkgHdr;\r
+  UINT8                                 *GlyphBlock;\r
+  LIST_ENTRY                            FontEntry;\r
+  LIST_ENTRY                            GlyphInfoList;\r
+} HII_FONT_PACKAGE_INSTANCE;\r
+\r
+#define HII_GLYPH_INFO_SIGNATURE        EFI_SIGNATURE_32 ('h','g','i','s')\r
+typedef struct _HII_GLYPH_INFO {\r
+  UINTN                                 Signature;\r
+  LIST_ENTRY                            Entry;\r
+  CHAR16                                CharId;\r
+  EFI_HII_GLYPH_INFO                    Cell;\r
+} HII_GLYPH_INFO;\r
+\r
+#define HII_FONT_INFO_SIGNATURE         EFI_SIGNATURE_32 ('h','l','f','i')\r
+typedef struct _HII_FONT_INFO {\r
+  UINTN                                 Signature;\r
+  LIST_ENTRY                            Entry;\r
+  LIST_ENTRY                            *GlobalEntry;\r
+  UINT8                                 FontId;\r
+} HII_FONT_INFO;\r
+\r
+#define HII_GLOBAL_FONT_INFO_SIGNATURE  EFI_SIGNATURE_32 ('h','g','f','i')\r
+typedef struct _HII_GLOBAL_FONT_INFO {\r
+  UINTN                                 Signature;\r
+  LIST_ENTRY                            Entry;\r
+  HII_FONT_PACKAGE_INSTANCE             *FontPackage;\r
+  UINTN                                 FontInfoSize;\r
+  EFI_FONT_INFO                         *FontInfo;\r
+} HII_GLOBAL_FONT_INFO;\r
+\r
+//\r
+// Image Package definitions\r
+//\r
+\r
+#define HII_PIXEL_MASK                  0x80\r
+\r
+typedef struct _HII_IMAGE_PACKAGE_INSTANCE {\r
+  EFI_HII_IMAGE_PACKAGE_HDR             ImagePkgHdr;\r
+  UINT32                                ImageBlockSize;\r
+  UINT32                                PaletteInfoSize;\r
+  UINT8                                 *ImageBlock;\r
+  UINT8                                 *PaletteBlock;\r
+} HII_IMAGE_PACKAGE_INSTANCE;\r
+\r
+//\r
+// Keyboard Layout Pacakge definitions\r
+//\r
+#define HII_KB_LAYOUT_PACKAGE_SIGNATURE EFI_SIGNATURE_32 ('h','k','l','p')\r
+typedef struct _HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE {\r
+  UINTN                                 Signature;\r
+  UINT8                                 *KeyboardPkg;\r
+  LIST_ENTRY                            KeyboardEntry;\r
+} HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE;\r
+\r
+//\r
+// Guid Package definitions\r
+//\r
+#define HII_GUID_PACKAGE_SIGNATURE      EFI_SIGNATURE_32 ('h','i','g','p')\r
+typedef struct _HII_GUID_PACKAGE_INSTANCE {\r
+  UINTN                                 Signature;\r
+  UINT8                                 *GuidPkg;\r
+  LIST_ENTRY                            GuidEntry;\r
+} HII_GUID_PACKAGE_INSTANCE;\r
+\r
+//\r
+// A package list can contain only one or less than one device path package.\r
+// This rule also applies to image package since ImageId can not be duplicate.\r
+//\r
+typedef struct _HII_DATABASE_PACKAGE_LIST_INSTANCE {\r
+  EFI_HII_PACKAGE_LIST_HEADER           PackageListHdr;\r
+  LIST_ENTRY                            GuidPkgHdr;\r
+  LIST_ENTRY                            FormPkgHdr;\r
+  LIST_ENTRY                            KeyboardLayoutHdr;\r
+  LIST_ENTRY                            StringPkgHdr;\r
+  LIST_ENTRY                            FontPkgHdr;\r
+  HII_IMAGE_PACKAGE_INSTANCE            *ImagePkg;\r
+  LIST_ENTRY                            SimpleFontPkgHdr;\r
+  UINT8                                 *DevicePathPkg;\r
+} HII_DATABASE_PACKAGE_LIST_INSTANCE;\r
+\r
+#define HII_HANDLE_SIGNATURE            EFI_SIGNATURE_32 ('h','i','h','l')\r
+\r
+typedef struct {\r
+  UINTN               Signature;\r
+  LIST_ENTRY          Handle;\r
+  UINTN               Key;\r
+} HII_HANDLE;\r
+\r
+#define HII_DATABASE_RECORD_SIGNATURE   EFI_SIGNATURE_32 ('h','i','d','r')\r
+\r
+typedef struct _HII_DATABASE_RECORD {\r
+  UINTN                                 Signature;\r
+  HII_DATABASE_PACKAGE_LIST_INSTANCE    *PackageList;\r
+  EFI_HANDLE                            DriverHandle;\r
+  EFI_HII_HANDLE                        Handle;\r
+  LIST_ENTRY                            DatabaseEntry;\r
+} HII_DATABASE_RECORD;\r
+\r
+#define HII_DATABASE_NOTIFY_SIGNATURE   EFI_SIGNATURE_32 ('h','i','d','n')\r
+\r
+typedef struct _HII_DATABASE_NOTIFY {\r
+  UINTN                                 Signature;\r
+  EFI_HANDLE                            NotifyHandle;\r
+  UINT8                                 PackageType;\r
+  EFI_GUID                              *PackageGuid;\r
+  EFI_HII_DATABASE_NOTIFY               PackageNotifyFn;\r
+  EFI_HII_DATABASE_NOTIFY_TYPE          NotifyType;\r
+  LIST_ENTRY                            DatabaseNotifyEntry;\r
+} HII_DATABASE_NOTIFY;\r
+\r
+#define HII_DATABASE_PRIVATE_DATA_SIGNATURE EFI_SIGNATURE_32 ('H', 'i', 'D', 'p')\r
+\r
+typedef struct _HII_DATABASE_PRIVATE_DATA {\r
+  UINTN                                 Signature;\r
+  LIST_ENTRY                            DatabaseList;\r
+  LIST_ENTRY                            DatabaseNotifyList;\r
+  EFI_HII_FONT_PROTOCOL                 HiiFont;\r
+#ifndef DISABLE_UNUSED_HII_PROTOCOLS\r
+  EFI_HII_IMAGE_PROTOCOL                HiiImage;\r
+#endif\r
+  EFI_HII_STRING_PROTOCOL               HiiString;\r
+  EFI_HII_DATABASE_PROTOCOL             HiiDatabase;\r
+  EFI_HII_CONFIG_ROUTING_PROTOCOL       ConfigRouting;\r
+  LIST_ENTRY                            HiiHandleList;\r
+  INTN                                  HiiHandleCount;\r
+  LIST_ENTRY                            FontInfoList;  // global font info list\r
+  UINTN                                 Attribute;     // default system color\r
+  EFI_GUID                              CurrentLayoutGuid;\r
+  EFI_HII_KEYBOARD_LAYOUT               *CurrentLayout;\r
+} HII_DATABASE_PRIVATE_DATA;\r
+\r
+#define HII_FONT_DATABASE_PRIVATE_DATA_FROM_THIS(a) \\r
+  CR (a, \\r
+      HII_DATABASE_PRIVATE_DATA, \\r
+      HiiFont, \\r
+      HII_DATABASE_PRIVATE_DATA_SIGNATURE \\r
+      )\r
+\r
+#define HII_IMAGE_DATABASE_PRIVATE_DATA_FROM_THIS(a) \\r
+  CR (a, \\r
+      HII_DATABASE_PRIVATE_DATA, \\r
+      HiiImage, \\r
+      HII_DATABASE_PRIVATE_DATA_SIGNATURE \\r
+      )\r
+\r
+#define HII_STRING_DATABASE_PRIVATE_DATA_FROM_THIS(a) \\r
+  CR (a, \\r
+      HII_DATABASE_PRIVATE_DATA, \\r
+      HiiString, \\r
+      HII_DATABASE_PRIVATE_DATA_SIGNATURE \\r
+      )\r
+\r
+#define HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS(a) \\r
+  CR (a, \\r
+      HII_DATABASE_PRIVATE_DATA, \\r
+      HiiDatabase, \\r
+      HII_DATABASE_PRIVATE_DATA_SIGNATURE \\r
+      )\r
+\r
+#define CONFIG_ROUTING_DATABASE_PRIVATE_DATA_FROM_THIS(a) \\r
+  CR (a, \\r
+      HII_DATABASE_PRIVATE_DATA, \\r
+      ConfigRouting, \\r
+      HII_DATABASE_PRIVATE_DATA_SIGNATURE \\r
+      )\r
+\r
+//\r
+// Internal function prototypes.\r
+//\r
+\r
+/**\r
+  This function checks whether a handle is a valid EFI_HII_HANDLE\r
+\r
+  @param  Handle                  Pointer to a EFI_HII_HANDLE\r
+\r
+  @retval TRUE                    Valid\r
+  @retval FALSE                   Invalid\r
+\r
+**/\r
+BOOLEAN\r
+IsHiiHandleValid (\r
+  EFI_HII_HANDLE Handle\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  This function checks whether EFI_FONT_INFO exists in current database. If\r
+  FontInfoMask is specified, check what options can be used to make a match.\r
+  Note that the masks relate to where the system default should be supplied\r
+  are ignored by this function.\r
+\r
+  @param  Private                 Hii database private structure.\r
+  @param  FontInfo                Points to EFI_FONT_INFO structure.\r
+  @param  FontInfoMask            If not NULL, describes what options can be used\r
+                                  to make a match between the font requested and\r
+                                  the font available. The caller must guarantee\r
+                                  this mask is valid.\r
+  @param  FontHandle              On entry, Points to the font handle returned by a\r
+                                  previous  call to GetFontInfo() or NULL to start\r
+                                  with the first font.\r
+  @param  GlobalFontInfo          If not NULL, output the corresponding globa font\r
+                                  info.\r
+\r
+  @retval TRUE                    Existed\r
+  @retval FALSE                   Not existed\r
+\r
+**/\r
+BOOLEAN\r
+IsFontInfoExisted (\r
+  IN  HII_DATABASE_PRIVATE_DATA *Private,\r
+  IN  EFI_FONT_INFO             *FontInfo,\r
+  IN  EFI_FONT_INFO_MASK        *FontInfoMask,   OPTIONAL\r
+  IN  EFI_FONT_HANDLE           FontHandle,      OPTIONAL\r
+  OUT HII_GLOBAL_FONT_INFO      **GlobalFontInfo OPTIONAL\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  Retrieve system default font and color.\r
+\r
+  @param  Private                 HII database driver private data.\r
+  @param  FontInfo                Points to system default font output-related\r
+                                  information. It's caller's responsibility to free\r
+                                  this buffer.\r
+  @param  FontInfoSize            If not NULL, output the size of buffer FontInfo.\r
+\r
+  @retval EFI_SUCCESS             Cell information is added to the GlyphInfoList.\r
+  @retval EFI_OUT_OF_RESOURCES    The system is out of resources to accomplish the\r
+                                  task.\r
+  @retval EFI_INVALID_PARAMETER   Any input parameter is invalid.\r
+\r
+**/\r
+EFI_STATUS\r
+GetSystemFont (\r
+  IN  HII_DATABASE_PRIVATE_DATA      *Private,\r
+  OUT EFI_FONT_DISPLAY_INFO          **FontInfo,\r
+  OUT UINTN                          *FontInfoSize OPTIONAL\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  Parse all string blocks to find a String block specified by StringId.\r
+  If StringId = (EFI_STRING_ID) (-1), find out all EFI_HII_SIBT_FONT blocks\r
+  within this string package and backup its information.\r
+  If StringId = 0, output the string id of last string block (EFI_HII_SIBT_END).\r
+\r
+  @param  Private                 Hii database private structure.\r
+  @param  StringPackage           Hii string package instance.\r
+  @param  StringId                The string's id, which is unique within\r
+                                  PackageList.\r
+  @param  BlockType               Output the block type of found string block.\r
+  @param  StringBlockAddr         Output the block address of found string block.\r
+  @param  StringTextOffset        Offset, relative to the found block address, of\r
+                                  the  string text information.\r
+  @param  LastStringId            Output the last string id when StringId = 0.\r
+\r
+  @retval EFI_SUCCESS             The string text and font is retrieved\r
+                                  successfully.\r
+  @retval EFI_NOT_FOUND           The specified text or font info can not be found\r
+                                  out.\r
+  @retval EFI_OUT_OF_RESOURCES    The system is out of resources to accomplish the\r
+                                  task.\r
+\r
+**/\r
+EFI_STATUS\r
+FindStringBlock (\r
+  IN HII_DATABASE_PRIVATE_DATA        *Private,\r
+  IN  HII_STRING_PACKAGE_INSTANCE     *StringPackage,\r
+  IN  EFI_STRING_ID                   StringId,\r
+  OUT UINT8                           *BlockType, OPTIONAL\r
+  OUT UINT8                           **StringBlockAddr, OPTIONAL\r
+  OUT UINTN                           *StringTextOffset, OPTIONAL\r
+  OUT EFI_STRING_ID                   *LastStringId OPTIONAL\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  Parse all glyph blocks to find a glyph block specified by CharValue.\r
+  If CharValue = (CHAR16) (-1), collect all default character cell information\r
+  within this font package and backup its information.\r
+\r
+  @param  FontPackage             Hii string package instance.\r
+  @param  CharValue               Unicode character value, which identifies a glyph\r
+                                  block.\r
+  @param  GlyphBuffer             Output the corresponding bitmap data of the found\r
+                                  block. It is the caller's responsiblity to free\r
+                                  this buffer.\r
+  @param  Cell                    Output cell information of the encoded bitmap.\r
+  @param  GlyphBufferLen          If not NULL, output the length of GlyphBuffer.\r
+\r
+  @retval EFI_SUCCESS             The bitmap data is retrieved successfully.\r
+  @retval EFI_NOT_FOUND           The specified CharValue does not exist in current\r
+                                  database.\r
+  @retval EFI_OUT_OF_RESOURCES    The system is out of resources to accomplish the\r
+                                  task.\r
+\r
+**/\r
+EFI_STATUS\r
+FindGlyphBlock (\r
+  IN  HII_FONT_PACKAGE_INSTANCE      *FontPackage,\r
+  IN  CHAR16                         CharValue,\r
+  OUT UINT8                          **GlyphBuffer, OPTIONAL\r
+  OUT EFI_HII_GLYPH_INFO             *Cell, OPTIONAL\r
+  OUT UINTN                          *GlyphBufferLen OPTIONAL\r
+  )\r
+;\r
+\r
+//\r
+// EFI_HII_FONT_PROTOCOL protocol interfaces\r
+//\r
+\r
+\r
+/**\r
+  Renders a string to a bitmap or to the display.\r
+\r
+  @param  This                    A pointer to the EFI_HII_FONT_PROTOCOL instance.\r
+  @param  Flags                   Describes how the string is to be drawn.\r
+  @param  String                  Points to the null-terminated string to be\r
+                                  displayed.\r
+  @param  StringInfo              Points to the string output information,\r
+                                  including the color and font.  If NULL, then the\r
+                                  string will be output in the default system font\r
+                                  and color.\r
+  @param  Blt                     If this points to a non-NULL on entry, this\r
+                                  points to the image, which is Width pixels   wide\r
+                                  and Height pixels high. The string will be drawn\r
+                                  onto this image and\r
+                                  EFI_HII_OUT_FLAG_CLIP is implied. If this points\r
+                                  to a NULL on entry, then a              buffer\r
+                                  will be allocated to hold the generated image and\r
+                                  the pointer updated on exit. It is the caller's\r
+                                  responsibility to free this buffer.\r
+  @param  BltX,BLTY               Specifies the offset from the left and top edge\r
+                                  of the image of the first character cell in the\r
+                                  image.\r
+  @param  RowInfoArray            If this is non-NULL on entry, then on exit, this\r
+                                  will point to an allocated buffer    containing\r
+                                  row information and RowInfoArraySize will be\r
+                                  updated to contain the        number of elements.\r
+                                  This array describes the characters which were at\r
+                                  least partially drawn and the heights of the\r
+                                  rows. It is the caller's responsibility to free\r
+                                  this buffer.\r
+  @param  RowInfoArraySize        If this is non-NULL on entry, then on exit it\r
+                                  contains the number of elements in RowInfoArray.\r
+  @param  ColumnInfoArray         If this is non-NULL, then on return it will be\r
+                                  filled with the horizontal offset for each\r
+                                  character in the string on the row where it is\r
+                                  displayed. Non-printing characters will     have\r
+                                  the offset ~0. The caller is responsible to\r
+                                  allocate a buffer large enough so that    there\r
+                                  is one entry for each character in the string,\r
+                                  not including the null-terminator. It is possible\r
+                                  when character display is normalized that some\r
+                                  character cells overlap.\r
+\r
+  @retval EFI_SUCCESS             The string was successfully rendered.\r
+  @retval EFI_OUT_OF_RESOURCES    Unable to allocate an output buffer for\r
+                                  RowInfoArray or Blt.\r
+  @retval EFI_INVALID_PARAMETER   The String was NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiStringToImage (\r
+  IN  CONST EFI_HII_FONT_PROTOCOL    *This,\r
+  IN  EFI_HII_OUT_FLAGS              Flags,\r
+  IN  CONST EFI_STRING               String,\r
+  IN  CONST EFI_FONT_DISPLAY_INFO    *StringInfo       OPTIONAL,\r
+  IN  OUT EFI_IMAGE_OUTPUT           **Blt,\r
+  IN  UINTN                          BltX,\r
+  IN  UINTN                          BltY,\r
+  OUT EFI_HII_ROW_INFO               **RowInfoArray    OPTIONAL,\r
+  OUT UINTN                          *RowInfoArraySize OPTIONAL,\r
+  OUT UINTN                          *ColumnInfoArray  OPTIONAL\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  Render a string to a bitmap or the screen containing the contents of the specified string.\r
+\r
+  @param  This                    A pointer to the EFI_HII_FONT_PROTOCOL instance.\r
+  @param  Flags                   Describes how the string is to be drawn.\r
+  @param  PackageList             The package list in the HII database to search\r
+                                  for the specified string.\r
+  @param  StringId                The string's id, which is unique within\r
+                                  PackageList.\r
+  @param  Language                Points to the language for the retrieved string.\r
+                                  If NULL, then the current system language is\r
+                                  used.\r
+  @param  StringInfo              Points to the string output information,\r
+                                  including the color and font.  If NULL, then the\r
+                                  string will be output in the default system font\r
+                                  and color.\r
+  @param  Blt                     If this points to a non-NULL on entry, this\r
+                                  points to the image, which is Width pixels   wide\r
+                                  and Height pixels high. The string will be drawn\r
+                                  onto this image and\r
+                                  EFI_HII_OUT_FLAG_CLIP is implied. If this points\r
+                                  to a NULL on entry, then a              buffer\r
+                                  will be allocated to hold the generated image and\r
+                                  the pointer updated on exit. It is the caller's\r
+                                  responsibility to free this buffer.\r
+  @param  BltX,BLTY               Specifies the offset from the left and top edge\r
+                                  of the image of the first character cell in the\r
+                                  image.\r
+  @param  RowInfoArray            If this is non-NULL on entry, then on exit, this\r
+                                  will point to an allocated buffer    containing\r
+                                  row information and RowInfoArraySize will be\r
+                                  updated to contain the        number of elements.\r
+                                  This array describes the characters which were at\r
+                                  least partially drawn and the heights of the\r
+                                  rows. It is the caller's responsibility to free\r
+                                  this buffer.\r
+  @param  RowInfoArraySize        If this is non-NULL on entry, then on exit it\r
+                                  contains the number of elements in RowInfoArray.\r
+  @param  ColumnInfoArray         If this is non-NULL, then on return it will be\r
+                                  filled with the horizontal offset for each\r
+                                  character in the string on the row where it is\r
+                                  displayed. Non-printing characters will     have\r
+                                  the offset ~0. The caller is responsible to\r
+                                  allocate a buffer large enough so that    there\r
+                                  is one entry for each character in the string,\r
+                                  not including the null-terminator. It is possible\r
+                                  when character display is normalized that some\r
+                                  character cells overlap.\r
+\r
+  @retval EFI_SUCCESS             The string was successfully rendered.\r
+  @retval EFI_OUT_OF_RESOURCES    Unable to allocate an output buffer for\r
+                                  RowInfoArray or Blt.\r
+  @retval EFI_INVALID_PARAMETER   The String was NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiStringIdToImage (\r
+  IN  CONST EFI_HII_FONT_PROTOCOL    *This,\r
+  IN  EFI_HII_OUT_FLAGS              Flags,\r
+  IN  EFI_HII_HANDLE                 PackageList,\r
+  IN  EFI_STRING_ID                  StringId,\r
+  IN  CONST CHAR8*                   Language,\r
+  IN  CONST EFI_FONT_DISPLAY_INFO    *StringInfo       OPTIONAL,\r
+  IN  OUT EFI_IMAGE_OUTPUT           **Blt,\r
+  IN  UINTN                          BltX,\r
+  IN  UINTN                          BltY,\r
+  OUT EFI_HII_ROW_INFO               **RowInfoArray    OPTIONAL,\r
+  OUT UINTN                          *RowInfoArraySize OPTIONAL,\r
+  OUT UINTN                          *ColumnInfoArray  OPTIONAL\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  Convert the glyph for a single character into a bitmap.\r
+\r
+  @param  This                    A pointer to the EFI_HII_FONT_PROTOCOL instance.\r
+  @param  Char                    Character to retrieve.\r
+  @param  StringInfo              Points to the string font and color information\r
+                                  or NULL if the string should use the default\r
+                                  system font and color.\r
+  @param  Blt                     Thus must point to a NULL on entry. A buffer will\r
+                                  be allocated to hold the output and the pointer\r
+                                  updated on exit. It is the caller's\r
+                                  responsibility to free this buffer.\r
+  @param  Baseline                Number of pixels from the bottom of the bitmap to\r
+                                  the baseline.\r
+\r
+  @retval EFI_SUCCESS             Glyph bitmap created.\r
+  @retval EFI_OUT_OF_RESOURCES    Unable to allocate the output buffer Blt.\r
+  @retval EFI_WARN_UNKNOWN_GLYPH  The glyph was unknown and was replaced with the\r
+                                  glyph for Unicode character 0xFFFD.\r
+  @retval EFI_INVALID_PARAMETER   Blt is NULL or *Blt is not NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetGlyph (\r
+  IN  CONST EFI_HII_FONT_PROTOCOL    *This,\r
+  IN  CHAR16                         Char,\r
+  IN  CONST EFI_FONT_DISPLAY_INFO    *StringInfo,\r
+  OUT EFI_IMAGE_OUTPUT               **Blt,\r
+  OUT UINTN                          *Baseline OPTIONAL\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  This function iterates through fonts which match the specified font, using\r
+  the specified criteria. If String is non-NULL, then all of the characters in\r
+  the string must exist in order for a candidate font to be returned.\r
+\r
+  @param  This                    A pointer to the EFI_HII_FONT_PROTOCOL instance.\r
+  @param  FontHandle              On entry, points to the font handle returned by a\r
+                                   previous call to GetFontInfo() or NULL to start\r
+                                  with the  first font. On return, points to the\r
+                                  returned font handle or points to NULL if there\r
+                                  are no more matching fonts.\r
+  @param  StringInfoIn            Upon entry, points to the font to return\r
+                                  information about.\r
+  @param  StringInfoOut           Upon return, contains the matching font's\r
+                                  information.  If NULL, then no information is\r
+                                  returned. It's caller's responsibility to free\r
+                                  this buffer.\r
+  @param  String                  Points to the string which will be tested to\r
+                                  determine  if all characters are available. If\r
+                                  NULL, then any font  is acceptable.\r
+\r
+  @retval EFI_SUCCESS             Matching font returned successfully.\r
+  @retval EFI_NOT_FOUND           No matching font was found.\r
+  @retval EFI_INVALID_PARAMETER   StringInfoIn is NULL.\r
+  @retval EFI_OUT_OF_RESOURCES    There were insufficient resources to complete the\r
+                                  request.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetFontInfo (\r
+  IN  CONST EFI_HII_FONT_PROTOCOL    *This,\r
+  IN  OUT   EFI_FONT_HANDLE          *FontHandle,\r
+  IN  CONST EFI_FONT_DISPLAY_INFO    *StringInfoIn,\r
+  OUT       EFI_FONT_DISPLAY_INFO    **StringInfoOut,\r
+  IN  CONST EFI_STRING               String OPTIONAL\r
+  )\r
+;\r
+\r
+//\r
+// EFI_HII_IMAGE_PROTOCOL interfaces\r
+//\r
+\r
+\r
+/**\r
+  This function adds the image Image to the group of images owned by PackageList, and returns\r
+  a new image identifier (ImageId).\r
+\r
+  @param  This                    A pointer to the EFI_HII_IMAGE_PROTOCOL instance.\r
+  @param  PackageList             Handle of the package list where this image will\r
+                                  be added.\r
+  @param  ImageId                 On return, contains the new image id, which is\r
+                                  unique within PackageList.\r
+  @param  Image                   Points to the image.\r
+\r
+  @retval EFI_SUCCESS             The new image was added successfully.\r
+  @retval EFI_NOT_FOUND           The specified PackageList could not be found in\r
+                                  database.\r
+  @retval EFI_OUT_OF_RESOURCES    Could not add the image due to lack of resources.\r
+  @retval EFI_INVALID_PARAMETER   Image is NULL or ImageId is NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiNewImage (\r
+  IN  CONST EFI_HII_IMAGE_PROTOCOL   *This,\r
+  IN  EFI_HII_HANDLE                 PackageList,\r
+  OUT EFI_IMAGE_ID                   *ImageId,\r
+  IN  CONST EFI_IMAGE_INPUT          *Image\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  This function retrieves the image specified by ImageId which is associated with\r
+  the specified PackageList and copies it into the buffer specified by Image.\r
+\r
+  @param  This                    A pointer to the EFI_HII_IMAGE_PROTOCOL instance.\r
+  @param  PackageList             Handle of the package list where this image will\r
+                                  be searched.\r
+  @param  ImageId                 The image's id,, which is unique within\r
+                                  PackageList.\r
+  @param  Image                   Points to the image.\r
+  @param  ImageSize               On entry, points to the size of the buffer\r
+                                  pointed to by Image, in bytes. On return, points\r
+                                  to the length of the image, in bytes.\r
+\r
+  @retval EFI_SUCCESS             The new image was returned successfully.\r
+  @retval EFI_NOT_FOUND           The image specified by ImageId is not available.\r
+  @retval EFI_BUFFER_TOO_SMALL    The buffer specified by ImageSize is too small to\r
+                                  hold the image.\r
+  @retval EFI_INVALID_PARAMETER   The Image or ImageSize was NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetImage (\r
+  IN  CONST EFI_HII_IMAGE_PROTOCOL   *This,\r
+  IN  EFI_HII_HANDLE                 PackageList,\r
+  IN  EFI_IMAGE_ID                   ImageId,\r
+  OUT EFI_IMAGE_INPUT                *Image,\r
+  OUT UINTN                          *ImageSize\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  This function updates the image specified by ImageId in the specified PackageListHandle to\r
+  the image specified by Image.\r
+\r
+  @param  This                    A pointer to the EFI_HII_IMAGE_PROTOCOL instance.\r
+  @param  PackageList             The package list containing the images.\r
+  @param  ImageId                 The image's id,, which is unique within\r
+                                  PackageList.\r
+  @param  Image                   Points to the image.\r
+\r
+  @retval EFI_SUCCESS             The new image was updated successfully.\r
+  @retval EFI_NOT_FOUND           The image specified by ImageId is not in the\r
+                                  database.\r
+  @retval EFI_INVALID_PARAMETER   The Image was NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiSetImage (\r
+  IN CONST EFI_HII_IMAGE_PROTOCOL    *This,\r
+  IN EFI_HII_HANDLE                  PackageList,\r
+  IN EFI_IMAGE_ID                    ImageId,\r
+  IN CONST EFI_IMAGE_INPUT           *Image\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  This function renders an image to a bitmap or the screen using the specified\r
+  color and options. It draws the image on an existing bitmap, allocates a new\r
+  bitmap or uses the screen. The images can be clipped.\r
+\r
+  @param  This                    A pointer to the EFI_HII_IMAGE_PROTOCOL instance.\r
+  @param  Flags                   Describes how the image is to be drawn.\r
+  @param  Image                   Points to the image to be displayed.\r
+  @param  Blt                     If this points to a non-NULL on entry, this\r
+                                  points to the image, which is Width pixels wide\r
+                                  and Height pixels high.  The image will be drawn\r
+                                  onto this image and  EFI_HII_DRAW_FLAG_CLIP is\r
+                                  implied. If this points to a  NULL on entry, then\r
+                                  a buffer will be allocated to hold  the generated\r
+                                  image and the pointer updated on exit. It is the\r
+                                  caller's responsibility to free this buffer.\r
+  @param  BltY                    Specifies the offset from the left and top edge\r
+                                  of the  output image of the first pixel in the\r
+                                  image.\r
+\r
+  @retval EFI_SUCCESS             The image was successfully drawn.\r
+  @retval EFI_OUT_OF_RESOURCES    Unable to allocate an output buffer for Blt.\r
+  @retval EFI_INVALID_PARAMETER   The Image or Blt was NULL.\r
+  @retval EFI_INVALID_PARAMETER   Any combination of Flags is invalid.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiDrawImage (\r
+  IN CONST EFI_HII_IMAGE_PROTOCOL    *This,\r
+  IN EFI_HII_DRAW_FLAGS              Flags,\r
+  IN CONST EFI_IMAGE_INPUT           *Image,\r
+  IN OUT EFI_IMAGE_OUTPUT            **Blt,\r
+  IN UINTN                           BltX,\r
+  IN UINTN                           BltY\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  This function renders an image to a bitmap or the screen using the specified\r
+  color and options. It draws the image on an existing bitmap, allocates a new\r
+  bitmap or uses the screen. The images can be clipped.\r
+\r
+  @param  This                    A pointer to the EFI_HII_IMAGE_PROTOCOL instance.\r
+  @param  Flags                   Describes how the image is to be drawn.\r
+  @param  PackageList             The package list in the HII database to search\r
+                                  for the  specified image.\r
+  @param  ImageId                 The image's id, which is unique within\r
+                                  PackageList.\r
+  @param  Blt                     If this points to a non-NULL on entry, this\r
+                                  points to the image, which is Width pixels wide\r
+                                  and Height pixels high. The image will be drawn\r
+                                  onto this image and\r
+                                  EFI_HII_DRAW_FLAG_CLIP is implied. If this points\r
+                                  to a  NULL on entry, then a buffer will be\r
+                                  allocated to hold  the generated image and the\r
+                                  pointer updated on exit. It is the caller's\r
+                                  responsibility to free this buffer.\r
+  @param  BltY                    Specifies the offset from the left and top edge\r
+                                  of the  output image of the first pixel in the\r
+                                  image.\r
+\r
+  @retval EFI_SUCCESS             The image was successfully drawn.\r
+  @retval EFI_OUT_OF_RESOURCES    Unable to allocate an output buffer for Blt.\r
+  @retval EFI_INVALID_PARAMETER   The Image was NULL.\r
+  @retval EFI_NOT_FOUND           The specified packagelist could not be found in\r
+                                  current database.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiDrawImageId (\r
+  IN CONST EFI_HII_IMAGE_PROTOCOL    *This,\r
+  IN EFI_HII_DRAW_FLAGS              Flags,\r
+  IN EFI_HII_HANDLE                  PackageList,\r
+  IN EFI_IMAGE_ID                    ImageId,\r
+  IN OUT EFI_IMAGE_OUTPUT            **Blt,\r
+  IN UINTN                           BltX,\r
+  IN UINTN                           BltY\r
+  )\r
+\r
+;\r
+\r
+//\r
+// EFI_HII_STRING_PROTOCOL\r
+//\r
+\r
+\r
+/**\r
+  This function adds the string String to the group of strings owned by PackageList, with the\r
+  specified font information StringFontInfo and returns a new string id.\r
+\r
+  @param  This                    A pointer to the EFI_HII_STRING_PROTOCOL\r
+                                  instance.\r
+  @param  PackageList             Handle of the package list where this string will\r
+                                  be added.\r
+  @param  StringId                On return, contains the new strings id, which is\r
+                                  unique within PackageList.\r
+  @param  Language                Points to the language for the new string.\r
+  @param  LanguageName            Points to the printable language name to\r
+                                  associate with the passed in  Language field.If\r
+                                  LanguageName is not NULL and the string package\r
+                                  header's LanguageName  associated with a given\r
+                                  Language is not zero, the LanguageName being\r
+                                  passed  in will be ignored.\r
+  @param  String                  Points to the new null-terminated string.\r
+  @param  StringFontInfo          Points to the new string's font information or\r
+                                  NULL if the string should have the default system\r
+                                  font, size and style.\r
+\r
+  @retval EFI_SUCCESS             The new string was added successfully.\r
+  @retval EFI_NOT_FOUND           The specified PackageList could not be found in\r
+                                  database.\r
+  @retval EFI_OUT_OF_RESOURCES    Could not add the string due to lack of\r
+                                  resources.\r
+  @retval EFI_INVALID_PARAMETER   String is NULL or StringId is NULL or Language is\r
+                                  NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiNewString (\r
+  IN  CONST EFI_HII_STRING_PROTOCOL   *This,\r
+  IN  EFI_HII_HANDLE                  PackageList,\r
+  OUT EFI_STRING_ID                   *StringId,\r
+  IN  CONST CHAR8                     *Language,\r
+  IN  CONST CHAR16                    *LanguageName, OPTIONAL\r
+  IN  CONST EFI_STRING                String,\r
+  IN  CONST EFI_FONT_INFO             *StringFontInfo OPTIONAL\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  This function retrieves the string specified by StringId which is associated\r
+  with the specified PackageList in the language Language and copies it into\r
+  the buffer specified by String.\r
+\r
+  @param  This                    A pointer to the EFI_HII_STRING_PROTOCOL\r
+                                  instance.\r
+  @param  Language                Points to the language for the retrieved string.\r
+  @param  PackageList             The package list in the HII database to search\r
+                                  for the  specified string.\r
+  @param  StringId                The string's id, which is unique within\r
+                                  PackageList.\r
+  @param  String                  Points to the new null-terminated string.\r
+  @param  StringSize              On entry, points to the size of the buffer\r
+                                  pointed to by  String, in bytes. On return,\r
+                                  points to the length of the string, in bytes.\r
+  @param  StringFontInfo          If not NULL, points to the string's font\r
+                                  information.  It's caller's responsibility to\r
+                                  free this buffer.\r
+\r
+  @retval EFI_SUCCESS             The string was returned successfully.\r
+  @retval EFI_NOT_FOUND           The string specified by StringId is not\r
+                                  available.\r
+  @retval EFI_NOT_FOUND           The string specified by StringId is available but\r
+                                  not in the specified language.\r
+  @retval EFI_BUFFER_TOO_SMALL    The buffer specified by StringSize is too small\r
+                                  to  hold the string.\r
+  @retval EFI_INVALID_PARAMETER   The String or Language or StringSize was NULL.\r
+  @retval EFI_OUT_OF_RESOURCES    There were insufficient resources to complete the\r
+                                   request.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetString (\r
+  IN  CONST EFI_HII_STRING_PROTOCOL   *This,\r
+  IN  CONST CHAR8                     *Language,\r
+  IN  EFI_HII_HANDLE                  PackageList,\r
+  IN  EFI_STRING_ID                   StringId,\r
+  OUT EFI_STRING                      String,\r
+  IN  OUT UINTN                       *StringSize,\r
+  OUT EFI_FONT_INFO                   **StringFontInfo OPTIONAL\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  This function updates the string specified by StringId in the specified PackageList to the text\r
+  specified by String and, optionally, the font information specified by StringFontInfo.\r
+\r
+  @param  This                    A pointer to the EFI_HII_STRING_PROTOCOL\r
+                                  instance.\r
+  @param  PackageList             The package list containing the strings.\r
+  @param  StringId                The string's id, which is unique within\r
+                                  PackageList.\r
+  @param  Language                Points to the language for the updated string.\r
+  @param  String                  Points to the new null-terminated string.\r
+  @param  StringFontInfo          Points to the string's font information or NULL\r
+                                  if the string font information is not changed.\r
+\r
+  @retval EFI_SUCCESS             The string was updated successfully.\r
+  @retval EFI_NOT_FOUND           The string specified by StringId is not in the\r
+                                  database.\r
+  @retval EFI_INVALID_PARAMETER   The String or Language was NULL.\r
+  @retval EFI_OUT_OF_RESOURCES    The system is out of resources to accomplish the\r
+                                  task.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiSetString (\r
+  IN CONST EFI_HII_STRING_PROTOCOL    *This,\r
+  IN EFI_HII_HANDLE                   PackageList,\r
+  IN EFI_STRING_ID                    StringId,\r
+  IN CONST CHAR8                      *Language,\r
+  IN CONST EFI_STRING                 String,\r
+  IN CONST EFI_FONT_INFO              *StringFontInfo OPTIONAL\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  This function returns the list of supported languages, in the format specified\r
+  in Appendix M of UEFI 2.1 spec.\r
+\r
+  @param  This                    A pointer to the EFI_HII_STRING_PROTOCOL\r
+                                  instance.\r
+  @param  PackageList             The package list to examine.\r
+  @param  Languages               Points to the buffer to hold the returned string.\r
+  @param  LanguagesSize           On entry, points to the size of the buffer\r
+                                  pointed to by  Languages, in bytes. On  return,\r
+                                  points to the length of Languages, in bytes.\r
+\r
+  @retval EFI_SUCCESS             The languages were returned successfully.\r
+  @retval EFI_INVALID_PARAMETER   The Languages or LanguagesSize was NULL.\r
+  @retval EFI_BUFFER_TOO_SMALL    The LanguagesSize is too small to hold the list\r
+                                  of  supported languages. LanguageSize is updated\r
+                                  to contain the required size.\r
+  @retval EFI_NOT_FOUND           Could not find string package in specified\r
+                                  packagelist.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetLanguages (\r
+  IN CONST EFI_HII_STRING_PROTOCOL    *This,\r
+  IN EFI_HII_HANDLE                   PackageList,\r
+  IN OUT CHAR8                        *Languages,\r
+  IN OUT UINTN                        *LanguagesSize\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  Each string package has associated with it a single primary language and zero\r
+  or more secondary languages. This routine returns the secondary languages\r
+  associated with a package list.\r
+\r
+  @param  This                    A pointer to the EFI_HII_STRING_PROTOCOL\r
+                                  instance.\r
+  @param  PackageList             The package list to examine.\r
+  @param  FirstLanguage           Points to the primary language.\r
+  @param  SecondaryLanguages      Points to the buffer to hold the returned list of\r
+                                   secondary languages for the specified\r
+                                  FirstLanguage. If there are no secondary\r
+                                  languages, the function  returns successfully,\r
+                                  but this is set to NULL.\r
+  @param  SecondaryLanguageSize   On entry, points to the size of the buffer\r
+                                  pointed to  by SecondLanguages, in bytes. On\r
+                                  return, points to the length of SecondLanguages\r
+                                  in bytes.\r
+\r
+  @retval EFI_SUCCESS             Secondary languages were correctly returned.\r
+  @retval EFI_INVALID_PARAMETER   FirstLanguage or SecondLanguages or\r
+                                  SecondLanguagesSize was NULL.\r
+  @retval EFI_BUFFER_TOO_SMALL    The buffer specified by SecondLanguagesSize is\r
+                                  too small to hold the returned information.\r
+                                  SecondLanguageSize is updated to hold the size of\r
+                                  the buffer required.\r
+  @retval EFI_NOT_FOUND           The language specified by FirstLanguage is not\r
+                                  present in the specified package list.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetSecondaryLanguages (\r
+  IN CONST EFI_HII_STRING_PROTOCOL   *This,\r
+  IN EFI_HII_HANDLE                  PackageList,\r
+  IN CONST CHAR8                     *FirstLanguage,\r
+  IN OUT CHAR8                       *SecondLanguages,\r
+  IN OUT UINTN                       *SecondLanguagesSize\r
+  )\r
+;\r
+\r
+//\r
+// EFI_HII_DATABASE_PROTOCOL protocol interfaces\r
+//\r
+\r
+\r
+/**\r
+  This function adds the packages in the package list to the database and returns a handle. If there is a\r
+  EFI_DEVICE_PATH_PROTOCOL associated with the DriverHandle, then this function will\r
+  create a package of type EFI_PACKAGE_TYPE_DEVICE_PATH and add it to the package list.\r
+\r
+  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                  instance.\r
+  @param  PackageList             A pointer to an EFI_HII_PACKAGE_LIST_HEADER\r
+                                  structure.\r
+  @param  DriverHandle            Associate the package list with this EFI handle.\r
+  @param  Handle                  A pointer to the EFI_HII_HANDLE instance.\r
+\r
+  @retval EFI_SUCCESS             The package list associated with the Handle was\r
+                                  added to the HII database.\r
+  @retval EFI_OUT_OF_RESOURCES    Unable to allocate necessary resources for the\r
+                                  new database contents.\r
+  @retval EFI_INVALID_PARAMETER   PackageList is NULL or Handle is NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiNewPackageList (\r
+  IN CONST EFI_HII_DATABASE_PROTOCOL    *This,\r
+  IN CONST EFI_HII_PACKAGE_LIST_HEADER  *PackageList,\r
+  IN CONST EFI_HANDLE                   DriverHandle,\r
+  OUT EFI_HII_HANDLE                    *Handle\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  This function removes the package list that is associated with a handle Handle\r
+  from the HII database. Before removing the package, any registered functions\r
+  with the notification type REMOVE_PACK and the same package type will be called.\r
+\r
+  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                  instance.\r
+  @param  Handle                  The handle that was registered to the data that\r
+                                  is requested  for removal.\r
+\r
+  @retval EFI_SUCCESS             The data associated with the Handle was removed\r
+                                  from  the HII database.\r
+  @retval EFI_NOT_FOUND           The specified PackageList could not be found in\r
+                                  database.\r
+  @retval EFI_INVALID_PARAMETER   The Handle was not valid.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiRemovePackageList (\r
+  IN CONST EFI_HII_DATABASE_PROTOCOL    *This,\r
+  IN EFI_HII_HANDLE                     Handle\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  This function updates the existing package list (which has the specified Handle)\r
+  in the HII databases, using the new package list specified by PackageList.\r
+\r
+  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                  instance.\r
+  @param  Handle                  The handle that was registered to the data that\r
+                                  is  requested to be updated.\r
+  @param  PackageList             A pointer to an EFI_HII_PACKAGE_LIST_HEADER\r
+                                  package.\r
+\r
+  @retval EFI_SUCCESS             The HII database was successfully updated.\r
+  @retval EFI_OUT_OF_RESOURCES    Unable to allocate enough memory for the updated\r
+                                  database.\r
+  @retval EFI_INVALID_PARAMETER   Handle or PackageList was NULL.\r
+  @retval EFI_NOT_FOUND           The Handle was not valid or could not be found in\r
+                                  database.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiUpdatePackageList (\r
+  IN CONST EFI_HII_DATABASE_PROTOCOL    *This,\r
+  IN EFI_HII_HANDLE                     Handle,\r
+  IN CONST EFI_HII_PACKAGE_LIST_HEADER  *PackageList\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  This function returns a list of the package handles of the specified type\r
+  that are currently active in the database. The pseudo-type\r
+  EFI_HII_PACKAGE_TYPE_ALL will cause all package handles to be listed.\r
+\r
+  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                  instance.\r
+  @param  PackageType             Specifies the package type of the packages to\r
+                                  list or EFI_HII_PACKAGE_TYPE_ALL for all packages\r
+                                  to be listed.\r
+  @param  PackageGuid             If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then\r
+                                  this  is the pointer to the GUID which must match\r
+                                  the Guid field of EFI_HII_GUID_PACKAGE_GUID_HDR.\r
+                                  Otherwise,  it must be NULL.\r
+  @param  HandleBufferLength      On input, a pointer to the length of the handle\r
+                                  buffer.  On output, the length of the handle\r
+                                  buffer that is required for the handles found.\r
+  @param  Handle                  An array of EFI_HII_HANDLE instances returned.\r
+\r
+  @retval EFI_SUCCESS             The matching handles are outputed successfully.\r
+  @retval EFI_BUFFER_TO_SMALL     The HandleBufferLength parameter indicates that\r
+                                  Handle is too small to support the number of\r
+                                  handles. HandleBufferLength is updated with a\r
+                                  value that will  enable the data to fit.\r
+  @retval EFI_NOT_FOUND           No matching handle could not be found in\r
+                                  database.\r
+  @retval EFI_INVALID_PARAMETER   Handle or HandleBufferLength was NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiListPackageLists (\r
+  IN  CONST EFI_HII_DATABASE_PROTOCOL   *This,\r
+  IN  UINT8                             PackageType,\r
+  IN  CONST EFI_GUID                    *PackageGuid,\r
+  IN  OUT UINTN                         *HandleBufferLength,\r
+  OUT EFI_HII_HANDLE                    *Handle\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  This function will export one or all package lists in the database to a buffer.\r
+  For each package list exported, this function will call functions registered\r
+  with EXPORT_PACK and then copy the package list to the buffer.\r
+\r
+  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                  instance.\r
+  @param  Handle                  An EFI_HII_HANDLE that corresponds to the desired\r
+                                  package list in the HII database to export or\r
+                                  NULL to indicate  all package lists should be\r
+                                  exported.\r
+  @param  BufferSize              On input, a pointer to the length of the buffer.\r
+                                  On output, the length of the buffer that is\r
+                                  required for the exported data.\r
+  @param  Buffer                  A pointer to a buffer that will contain the\r
+                                  results of  the export function.\r
+\r
+  @retval EFI_SUCCESS             Package exported.\r
+  @retval EFI_BUFFER_TO_SMALL     The HandleBufferLength parameter indicates that\r
+                                  Handle is too small to support the number of\r
+                                  handles.      HandleBufferLength is updated with\r
+                                  a value that will enable the data to fit.\r
+  @retval EFI_NOT_FOUND           The specifiecd Handle could not be found in the\r
+                                  current database.\r
+  @retval EFI_INVALID_PARAMETER   Handle or Buffer or BufferSize was NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiExportPackageLists (\r
+  IN  CONST EFI_HII_DATABASE_PROTOCOL   *This,\r
+  IN  EFI_HII_HANDLE                    Handle,\r
+  IN  OUT UINTN                         *BufferSize,\r
+  OUT EFI_HII_PACKAGE_LIST_HEADER       *Buffer\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  This function registers a function which will be called when specified actions related to packages of\r
+  the specified type occur in the HII database. By registering a function, other HII-related drivers are\r
+  notified when specific package types are added, removed or updated in the HII database.\r
+  Each driver or application which registers a notification should use\r
+  EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify() before exiting.\r
+\r
+  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                  instance.\r
+  @param  PackageType             Specifies the package type of the packages to\r
+                                  list or EFI_HII_PACKAGE_TYPE_ALL for all packages\r
+                                  to be listed.\r
+  @param  PackageGuid             If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then\r
+                                  this is the pointer to the GUID which must match\r
+                                  the Guid field of\r
+                                  EFI_HII_GUID_PACKAGE_GUID_HDR. Otherwise, it must\r
+                                  be NULL.\r
+  @param  PackageNotifyFn         Points to the function to be called when the\r
+                                  event specified by\r
+                                  NotificationType occurs.\r
+  @param  NotifyType              Describes the types of notification which this\r
+                                  function will be receiving.\r
+  @param  NotifyHandle            Points to the unique handle assigned to the\r
+                                  registered notification. Can be used in\r
+                                  EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify()\r
+                                  to stop notifications.\r
+\r
+  @retval EFI_SUCCESS             Notification registered successfully.\r
+  @retval EFI_OUT_OF_RESOURCES    Unable to allocate necessary data structures\r
+  @retval EFI_INVALID_PARAMETER   NotifyHandle is NULL.\r
+  @retval EFI_INVALID_PARAMETER   PackageGuid is not NULL when PackageType is not\r
+                                  EFI_HII_PACKAGE_TYPE_GUID.\r
+  @retval EFI_INVALID_PARAMETER   PackageGuid is NULL when PackageType is\r
+                                  EFI_HII_PACKAGE_TYPE_GUID.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiRegisterPackageNotify (\r
+  IN  CONST EFI_HII_DATABASE_PROTOCOL   *This,\r
+  IN  UINT8                             PackageType,\r
+  IN  CONST EFI_GUID                    *PackageGuid,\r
+  IN  CONST EFI_HII_DATABASE_NOTIFY     PackageNotifyFn,\r
+  IN  EFI_HII_DATABASE_NOTIFY_TYPE      NotifyType,\r
+  OUT EFI_HANDLE                        *NotifyHandle\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  Removes the specified HII database package-related notification.\r
+\r
+  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                  instance.\r
+  @param  NotifyHandle            The handle of the notification function being\r
+                                  unregistered.\r
+\r
+  @retval EFI_SUCCESS             Notification is unregistered successfully.\r
+  @retval EFI_INVALID_PARAMETER   The Handle is invalid.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiUnregisterPackageNotify (\r
+  IN CONST EFI_HII_DATABASE_PROTOCOL    *This,\r
+  IN EFI_HANDLE                         NotificationHandle\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  This routine retrieves an array of GUID values for each keyboard layout that\r
+  was previously registered in the system.\r
+\r
+  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                  instance.\r
+  @param  KeyGuidBufferLength     On input, a pointer to the length of the keyboard\r
+                                  GUID  buffer. On output, the length of the handle\r
+                                  buffer  that is required for the handles found.\r
+  @param  KeyGuidBuffer           An array of keyboard layout GUID instances\r
+                                  returned.\r
+\r
+  @retval EFI_SUCCESS             KeyGuidBuffer was updated successfully.\r
+  @retval EFI_BUFFER_TOO_SMALL    The KeyGuidBufferLength parameter indicates\r
+                                  that KeyGuidBuffer is too small to support the\r
+                                  number of GUIDs. KeyGuidBufferLength is\r
+                                  updated with a value that will enable the data to\r
+                                  fit.\r
+  @retval EFI_INVALID_PARAMETER   The KeyGuidBuffer or KeyGuidBufferLength was\r
+                                  NULL.\r
+  @retval EFI_NOT_FOUND           There was no keyboard layout.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiFindKeyboardLayouts (\r
+  IN  CONST EFI_HII_DATABASE_PROTOCOL   *This,\r
+  IN  OUT UINT16                        *KeyGuidBufferLength,\r
+  OUT EFI_GUID                          *KeyGuidBuffer\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  This routine retrieves the requested keyboard layout. The layout is a physical description of the keys\r
+  on a keyboard and the character(s) that are associated with a particular set of key strokes.\r
+\r
+  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                  instance.\r
+  @param  KeyGuid                 A pointer to the unique ID associated with a\r
+                                  given keyboard layout. If KeyGuid is NULL then\r
+                                  the current layout will be retrieved.\r
+  @param  KeyboardLayoutLength    On input, a pointer to the length of the\r
+                                  KeyboardLayout buffer.  On output, the length of\r
+                                  the data placed into KeyboardLayout.\r
+  @param  KeyboardLayout          A pointer to a buffer containing the retrieved\r
+                                  keyboard layout.\r
+\r
+  @retval EFI_SUCCESS             The keyboard layout was retrieved successfully.\r
+  @retval EFI_NOT_FOUND           The requested keyboard layout was not found.\r
+  @retval EFI_INVALID_PARAMETER   The KeyboardLayout or KeyboardLayoutLength was\r
+                                  NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetKeyboardLayout (\r
+  IN  CONST EFI_HII_DATABASE_PROTOCOL   *This,\r
+  IN  CONST EFI_GUID                          *KeyGuid,\r
+  IN OUT UINT16                         *KeyboardLayoutLength,\r
+  OUT EFI_HII_KEYBOARD_LAYOUT           *KeyboardLayout\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  This routine sets the default keyboard layout to the one referenced by KeyGuid. When this routine\r
+  is called, an event will be signaled of the EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID\r
+  group type. This is so that agents which are sensitive to the current keyboard layout being changed\r
+  can be notified of this change.\r
+\r
+  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                  instance.\r
+  @param  KeyGuid                 A pointer to the unique ID associated with a\r
+                                  given keyboard layout.\r
+\r
+  @retval EFI_SUCCESS             The current keyboard layout was successfully set.\r
+  @retval EFI_NOT_FOUND           The referenced keyboard layout was not found, so\r
+                                  action was taken.\r
+  @retval EFI_INVALID_PARAMETER   The KeyGuid was NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiSetKeyboardLayout (\r
+  IN CONST EFI_HII_DATABASE_PROTOCOL          *This,\r
+  IN CONST EFI_GUID                           *KeyGuid\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  Return the EFI handle associated with a package list.\r
+\r
+  @param  This                    A pointer to the EFI_HII_DATABASE_PROTOCOL\r
+                                  instance.\r
+  @param  PackageListHandle       An EFI_HII_HANDLE that corresponds to the desired\r
+                                  package list in the HIIdatabase.\r
+  @param  DriverHandle            On return, contains the EFI_HANDLE which was\r
+                                  registered with the package list in\r
+                                  NewPackageList().\r
+\r
+  @retval EFI_SUCCESS             The DriverHandle was returned successfully.\r
+  @retval EFI_INVALID_PARAMETER   The PackageListHandle was not valid or\r
+                                  DriverHandle was NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetPackageListHandle (\r
+  IN  CONST EFI_HII_DATABASE_PROTOCOL         *This,\r
+  IN  EFI_HII_HANDLE                    PackageListHandle,\r
+  OUT EFI_HANDLE                        *DriverHandle\r
+  )\r
+;\r
+\r
+//\r
+// EFI_HII_CONFIG_ROUTING_PROTOCOL interfaces\r
+//\r
+\r
+\r
+/**\r
+  This function allows a caller to extract the current configuration\r
+  for one or more named elements from one or more drivers.\r
+\r
+  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL\r
+                                  instance.\r
+  @param  Request                 A null-terminated Unicode string in\r
+                                  <MultiConfigRequest> format.\r
+  @param  Progress                On return, points to a character in the Request\r
+                                  string. Points to the string's null terminator if\r
+                                  request was successful. Points to the most recent\r
+                                  & before the first failing name / value pair (or\r
+                                  the beginning of the string if the failure is in\r
+                                  the first name / value pair) if the request was\r
+                                  not successful.\r
+  @param  Results                 Null-terminated Unicode string in\r
+                                  <MultiConfigAltResp> format which has all values\r
+                                  filled in for the names in the Request string.\r
+                                  String to be allocated by the called function.\r
+\r
+  @retval EFI_SUCCESS             The Results string is filled with the values\r
+                                  corresponding to all requested names.\r
+  @retval EFI_OUT_OF_RESOURCES    Not enough memory to store the parts of the\r
+                                  results that must be stored awaiting possible\r
+                                  future        protocols.\r
+  @retval EFI_NOT_FOUND           Routing data doesn't match any known driver.\r
+                                     Progress set to the "G" in "GUID" of the\r
+                                  routing  header that doesn't match. Note: There\r
+                                  is no         requirement that all routing data\r
+                                  be validated before any configuration extraction.\r
+  @retval EFI_INVALID_PARAMETER   For example, passing in a NULL for the Request\r
+                                  parameter would result in this type of error. The\r
+                                  Progress parameter is set to NULL.\r
+  @retval EFI_INVALID_PARAMETER   Illegal syntax. Progress set to most recent &\r
+                                  before the error or the beginning of the string.\r
+  @retval EFI_INVALID_PARAMETER   Unknown name. Progress points to the & before the\r
+                                  name in question.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiConfigRoutingExtractConfig (\r
+  IN  CONST EFI_HII_CONFIG_ROUTING_PROTOCOL  *This,\r
+  IN  CONST EFI_STRING                       Request,\r
+  OUT EFI_STRING                             *Progress,\r
+  OUT EFI_STRING                             *Results\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  This function allows the caller to request the current configuration for the\r
+  entirety of the current HII database and returns the data in a null-terminated Unicode string.\r
+\r
+  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL\r
+                                  instance.\r
+  @param  Results                 Null-terminated Unicode string in\r
+                                  <MultiConfigAltResp> format which has all values\r
+                                  filled in for the names in the Request string.\r
+                                  String to be allocated by the  called function.\r
+                                  De-allocation is up to the caller.\r
+\r
+  @retval EFI_SUCCESS             The Results string is filled with the values\r
+                                  corresponding to all requested names.\r
+  @retval EFI_OUT_OF_RESOURCES    Not enough memory to store the parts of the\r
+                                  results that must be stored awaiting possible\r
+                                  future        protocols.\r
+  @retval EFI_INVALID_PARAMETER   For example, passing in a NULL for the Results\r
+                                  parameter would result in this type of error.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiConfigRoutingExportConfig (\r
+  IN  CONST EFI_HII_CONFIG_ROUTING_PROTOCOL  *This,\r
+  OUT EFI_STRING                             *Results\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  This function processes the results of processing forms and routes it to the\r
+  appropriate handlers or storage.\r
+\r
+  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL\r
+                                  instance.\r
+  @param  Configuration           A null-terminated Unicode string in\r
+                                  <MulltiConfigResp> format.\r
+  @param  Progress                A pointer to a string filled in with the offset\r
+                                  of the most recent & before the first failing\r
+                                  name / value pair (or the beginning of the string\r
+                                  if the failure is in the first name / value pair)\r
+                                  or the terminating NULL if all was successful.\r
+\r
+  @retval EFI_SUCCESS             The results have been distributed or are awaiting\r
+                                  distribution.\r
+  @retval EFI_OUT_OF_RESOURCES    Not enough memory to store the parts of the\r
+                                  results that must be stored awaiting possible\r
+                                  future        protocols.\r
+  @retval EFI_INVALID_PARAMETER   Passing in a NULL for the Configuration parameter\r
+                                  would result in this type of error.\r
+  @retval EFI_NOT_FOUND           Target for the specified routing data was not\r
+                                  found.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiConfigRoutingRoutConfig (\r
+  IN  CONST EFI_HII_CONFIG_ROUTING_PROTOCOL  *This,\r
+  IN  CONST EFI_STRING                       Configuration,\r
+  OUT EFI_STRING                             *Progress\r
+  )\r
+;\r
+\r
+\r
+\r
+/**\r
+  This helper function is to be called by drivers to map configuration data stored\r
+  in byte array ("block") formats such as UEFI Variables into current configuration strings.\r
+\r
+  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL\r
+                                  instance.\r
+  @param  ConfigRequest           A null-terminated Unicode string in\r
+                                  <ConfigRequest> format.\r
+  @param  Block                   Array of bytes defining the block's\r
+                                  configuration.\r
+  @param  BlockSize               Length in bytes of Block.\r
+  @param  Config                  Filled-in configuration string. String allocated\r
+                                  by  the function. Returned only if call is\r
+                                  successful.\r
+  @param  Progress                A pointer to a string filled in with the offset\r
+                                  of  the most recent & before the first failing\r
+                                  name/value pair (or the beginning of the string\r
+                                  if the failure is in the first name / value pair)\r
+                                  or the terminating NULL if all was successful.\r
+\r
+  @retval EFI_SUCCESS             The request succeeded. Progress points to the\r
+                                  null terminator at the end of the ConfigRequest\r
+                                        string.\r
+  @retval EFI_OUT_OF_RESOURCES    Not enough memory to allocate Config.\r
+                                  Progress points to the first character of\r
+                                  ConfigRequest.\r
+  @retval EFI_INVALID_PARAMETER   Passing in a NULL for the ConfigRequest or\r
+                                  Block parameter would result in this type of\r
+                                  error. Progress points to the first character of\r
+                                  ConfigRequest.\r
+  @retval EFI_NOT_FOUND           Target for the specified routing data was not\r
+                                  found. Progress points to the "G" in "GUID" of\r
+                                  the      errant routing data.\r
+  @retval EFI_DEVICE_ERROR        Block not large enough. Progress undefined.\r
+  @retval EFI_INVALID_PARAMETER   Encountered non <BlockName> formatted string.\r
+                                       Block is left updated and Progress points at\r
+                                  the '&' preceding the first non-<BlockName>.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiBlockToConfig (\r
+  IN  CONST EFI_HII_CONFIG_ROUTING_PROTOCOL  *This,\r
+  IN  CONST EFI_STRING                       ConfigRequest,\r
+  IN  CONST UINT8                            *Block,\r
+  IN  CONST UINTN                            BlockSize,\r
+  OUT EFI_STRING                             *Config,\r
+  OUT EFI_STRING                             *Progress\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  This helper function is to be called by drivers to map configuration strings\r
+  to configurations stored in byte array ("block") formats such as UEFI Variables.\r
+\r
+  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL\r
+                                  instance.\r
+  @param  ConfigResp              A null-terminated Unicode string in <ConfigResp>\r
+                                  format.\r
+  @param  Block                   A possibly null array of bytes representing the\r
+                                  current  block. Only bytes referenced in the\r
+                                  ConfigResp string  in the block are modified. If\r
+                                  this parameter is null or if the *BlockSize\r
+                                  parameter is (on input) shorter than required by\r
+                                  the Configuration string, only the BlockSize\r
+                                  parameter is updated and an appropriate status\r
+                                  (see below)  is returned.\r
+  @param  BlockSize               The length of the Block in units of UINT8.  On\r
+                                  input, this is the size of the Block. On output,\r
+                                  if successful, contains the index of the  last\r
+                                  modified byte in the Block.\r
+  @param  Progress                On return, points to an element of the ConfigResp\r
+                                   string filled in with the offset of the most\r
+                                  recent '&' before the first failing name / value\r
+                                  pair (or  the beginning of the string if the\r
+                                  failure is in the  first name / value pair) or\r
+                                  the terminating NULL if all was successful.\r
+\r
+  @retval EFI_SUCCESS             The request succeeded. Progress points to the\r
+                                  null terminator at the end of the ConfigResp\r
+                                  string.\r
+  @retval EFI_OUT_OF_RESOURCES    Not enough memory to allocate Config.\r
+                                  Progress points to the first character of\r
+                                  ConfigResp.\r
+  @retval EFI_INVALID_PARAMETER   Passing in a NULL for the ConfigResp or\r
+                                  Block parameter would result in this type of\r
+                                  error. Progress points to the first character of\r
+                                           ConfigResp.\r
+  @retval EFI_NOT_FOUND           Target for the specified routing data was not\r
+                                  found. Progress points to the "G" in "GUID" of\r
+                                  the      errant routing data.\r
+  @retval EFI_INVALID_PARAMETER   Encountered non <BlockName> formatted name /\r
+                                  value pair. Block is left updated and\r
+                                  Progress points at the '&' preceding the first\r
+                                  non-<BlockName>.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiConfigToBlock (\r
+  IN     CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,\r
+  IN     CONST EFI_STRING                      ConfigResp,\r
+  IN OUT UINT8                                 *Block,\r
+  IN OUT UINTN                                 *BlockSize,\r
+  OUT    EFI_STRING                            *Progress\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  This helper function is to be called by drivers to extract portions of\r
+  a larger configuration string.\r
+\r
+  @param  This                    A pointer to the EFI_HII_CONFIG_ROUTING_PROTOCOL\r
+                                  instance.\r
+  @param  Configuration           A null-terminated Unicode string in\r
+                                  <MultiConfigAltResp> format.\r
+  @param  Guid                    A pointer to the GUID value to search for in the\r
+                                  routing portion of the ConfigResp string when\r
+                                  retrieving  the requested data. If Guid is NULL,\r
+                                  then all GUID  values will be searched for.\r
+  @param  Name                    A pointer to the NAME value to search for in the\r
+                                  routing portion of the ConfigResp string when\r
+                                  retrieving  the requested data. If Name is NULL,\r
+                                  then all Name  values will be searched for.\r
+  @param  DevicePath              A pointer to the PATH value to search for in the\r
+                                  routing portion of the ConfigResp string when\r
+                                  retrieving  the requested data. If DevicePath is\r
+                                  NULL, then all  DevicePath values will be\r
+                                  searched for.\r
+  @param  AltCfgId                A pointer to the ALTCFG value to search for in\r
+                                  the  routing portion of the ConfigResp string\r
+                                  when retrieving  the requested data.  If this\r
+                                  parameter is NULL,  then the current setting will\r
+                                  be retrieved.\r
+  @param  AltCfgResp              A pointer to a buffer which will be allocated by\r
+                                  the  function which contains the retrieved string\r
+                                  as requested.   This buffer is only allocated if\r
+                                  the call was successful.\r
+\r
+  @retval EFI_SUCCESS             The request succeeded. The requested data was\r
+                                  extracted  and placed in the newly allocated\r
+                                  AltCfgResp buffer.\r
+  @retval EFI_OUT_OF_RESOURCES    Not enough memory to allocate AltCfgResp.\r
+  @retval EFI_INVALID_PARAMETER   Any parameter is invalid.\r
+  @retval EFI_NOT_FOUND           Target for the specified routing data was not\r
+                                  found.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetAltCfg (\r
+  IN  CONST EFI_HII_CONFIG_ROUTING_PROTOCOL    *This,\r
+  IN  CONST EFI_STRING                         Configuration,\r
+  IN  CONST EFI_GUID                           *Guid,\r
+  IN  CONST EFI_STRING                         Name,\r
+  IN  CONST EFI_DEVICE_PATH_PROTOCOL           *DevicePath,\r
+  IN  CONST UINT16                             *AltCfgId,\r
+  OUT EFI_STRING                               *AltCfgResp\r
+  )\r
+;\r
+\r
+\r
+//\r
+// Global variables\r
+//\r
+extern EFI_EVENT gHiiKeyboardLayoutChanged;\r
+\r
+#include "R8Lib.h"\r
+\r
+#endif\r
index 06d783a8804cd39e0db0867ae1b4ee1d4d97d858..341a50a7e8f3303126f0b914e9a3621fdb0727a2 100644 (file)
@@ -790,7 +790,7 @@ HiiNewImage (
   @param  This                   A pointer to the EFI_HII_IMAGE_PROTOCOL instance.\r
   @param  PackageList            Handle of the package list where this image will\r
                                  be searched.\r
-  @param  ImageId                The image¡¯s id,, which is unique within\r
+  @param  ImageId                The image's id,, which is unique within\r
                                  PackageList.\r
   @param  Image                  Points to the image.\r
   @param  ImageSize              On entry, points to the size of the buffer pointed\r
@@ -993,7 +993,7 @@ HiiGetImage (
 \r
   @param  This                   A pointer to the EFI_HII_IMAGE_PROTOCOL instance.\r
   @param  PackageList            The package list containing the images.\r
-  @param  ImageId                The image¡¯s id,, which is unique within\r
+  @param  ImageId                The image's id,, which is unique within\r
                                  PackageList.\r
   @param  Image                  Points to the image.\r
 \r
@@ -1196,7 +1196,7 @@ HiiSetImage (
                                  this image and  EFI_HII_DRAW_FLAG_CLIP is implied.\r
                                  If this points to a  NULL on entry, then a buffer\r
                                  will be allocated to hold  the generated image and\r
-                                 the pointer updated on exit. It is the caller¡¯s\r
+                                 the pointer updated on exit. It is the caller's\r
                                  responsibility to free this buffer.\r
   @param  BltY                   Specifies the offset from the left and top edge of\r
                                  the  output image of the first pixel in the image.\r
@@ -1441,7 +1441,7 @@ HiiDrawImage (
                                  EFI_HII_DRAW_FLAG_CLIP is implied. If this points\r
                                  to a  NULL on entry, then a buffer will be\r
                                  allocated to hold  the generated image and the\r
-                                 pointer updated on exit. It is the caller¡¯s\r
+                                 pointer updated on exit. It is the caller's\r
                                  responsibility to free this buffer.\r
   @param  BltY                   Specifies the offset from the left and top edge of\r
                                  the  output image of the first pixel in the image.\r
index d408365a891464a23398f319c7482c2a1cc68424..0d830106cd7532a55bc6fd964fffeb25d287e2da 100644 (file)
@@ -249,7 +249,7 @@ GetStringFontInfo (
 \r
   @param  Private                Hii database private structure.\r
   @param  StringPackage          Hii string package instance.\r
-  @param  StringId               The string¡¯s id, which is unique within\r
+  @param  StringId               The string's id, which is unique within\r
                                  PackageList.\r
   @param  BlockType              Output the block type of found string block.\r
   @param  StringBlockAddr        Output the block address of found string block.\r
@@ -567,7 +567,7 @@ FindStringBlock (
 \r
   @param  Private                Hii database private structure.\r
   @param  StringPackage          Hii string package instance.\r
-  @param  StringId               The string¡¯s id, which is unique within\r
+  @param  StringId               The string's id, which is unique within\r
                                  PackageList.\r
   @param  String                 Points to retrieved null-terminated string.\r
   @param  StringSize             On entry, points to the size of the buffer pointed\r
@@ -672,7 +672,7 @@ GetStringWorker (
 \r
   @param  Private                HII database driver private structure.\r
   @param  StringPackage          HII string package instance.\r
-  @param  StringId               The string¡¯s id, which is unique within\r
+  @param  StringId               The string's id, which is unique within\r
                                  PackageList.\r
   @param  String                 Points to the new null-terminated string.\r
   @param  StringFontInfo         Points to the input font info.\r
@@ -909,7 +909,7 @@ SetStringWorker (
                                  not zero, the LanguageName being passed  in will\r
                                  be ignored.\r
   @param  String                 Points to the new null-terminated string.\r
-  @param  StringFontInfo         Points to the new string¡¯s font information or\r
+  @param  StringFontInfo         Points to the new string's font information or\r
                                  NULL if the string should have the default system\r
                                  font, size and style.\r
 \r
@@ -1251,7 +1251,7 @@ HiiNewString (
   @param  StringSize             On entry, points to the size of the buffer pointed\r
                                  to by  String, in bytes. On return, points to the\r
                                  length of the string, in bytes.\r
-  @param  StringFontInfo         If not NULL, points to the string¡¯s font\r
+  @param  StringFontInfo         If not NULL, points to the string's font\r
                                  information.  It's caller's responsibility to free\r
                                  this buffer.\r
 \r
@@ -1334,11 +1334,11 @@ HiiGetString (
 \r
   @param  This                   A pointer to the EFI_HII_STRING_PROTOCOL instance.\r
   @param  PackageList            The package list containing the strings.\r
-  @param  StringId               The string¡¯s id, which is unique within\r
+  @param  StringId               The string's id, which is unique within\r
                                  PackageList.\r
   @param  Language               Points to the language for the updated string.\r
   @param  String                 Points to the new null-terminated string.\r
-  @param  StringFontInfo         Points to the string¡¯s font information or NULL if\r
+  @param  StringFontInfo         Points to the string's font information or NULL if\r
                                  the  string font information is not changed.\r
 \r
   @retval EFI_SUCCESS            The string was updated successfully.\r
index 0733da131b80d30caecd7be2e0120a505371e6c7..6961c0a229a70f8cf70a27d52082d2bd9b7c608e 100644 (file)
-/** @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.
-
-**/
-
-#ifndef __BASE_LIB__
-#define __BASE_LIB__
-
-//
-// Definitions for architecture specific types
-// These include SPIN_LOCK and BASE_LIBRARY_JUMP_BUFFER
-//
-
-//
-// SPIN_LOCK
-//
-typedef volatile 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 4
-
-#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 Destination is not aligned on a 16-bit boundary, 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 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 Length > 0 and Destination is NULL, then ASSERT().
-  If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().
-  If Length > 0 and Source is NULL, then ASSERT().
-  If Length > 0 and Source is not aligned on a 16-bit bounadry, 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 String is not aligned on a 16-bit boundary, 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 String is not aligned on a 16-bit boundary, 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 FirstString is not aligned on a 16-bit boundary, then ASSERT().
-  If SecondString is NULL, then ASSERT().
-  If SecondString is not aligned on a 16-bit boundary, 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 Length > 0 and FirstString is NULL, then ASSERT().
-  If Length > 0 and FirstString is not aligned on a 16-bit bounadary, then ASSERT().
-  If Length > 0 and SecondString is NULL, then ASSERT().
-  If Length > 0 and SecondString is not aligned on a 16-bit bounadary, 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 Destination is not aligned on a 16-bit bounadary, then ASSERT().
-  If Source is NULL, then ASSERT().
-  If Source is not aligned on a 16-bit bounadary, 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 Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().
-  If Length > 0 and Source is NULL, then ASSERT().
-  If Length > 0 and Source is not aligned on a 16-bit boundary, 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 a nibble in the low 4 bits of a byte to a Unicode hexadecimal character.
-
-  This function converts a nibble in the low 4 bits of a byte to a Unicode hexadecimal 
-  character  For example, the nibble  0x01 and 0x0A will converted to L'1' and L'A' 
-  respectively.
-
-  The upper nibble in the input byte will be masked off.
-
-  @param Nibble     The nibble which is in the low 4 bits of the input byte.
-
-  @retval  CHAR16   The Unicode hexadecimal character.
-  
-**/
-CHAR16
-EFIAPI
-NibbleToHexChar (
-  IN UINT8      Nibble
-  )
-;
-
-/** 
-  Convert binary buffer to a Unicode String in a specified sequence. 
-
-  This function converts bytes in the binary Buffer Buf to a Unicode String Str. 
-  Each byte will be represented by two Unicode characters. For example, byte 0xA1 will 
-  be converted into two Unicode character L'A' and L'1'. In the output String, the Unicode Character 
-  for the Most Significant Nibble will be put before the Unicode Character for the Least Significant
-  Nibble. The output string for the buffer containing a single byte 0xA1 will be L"A1". 
-  For a buffer with multiple bytes, the Unicode character produced by the first byte will be put into the 
-  the last character in the output string. The one next to first byte will be put into the
-  character before the last character. This rules applies to the rest of the bytes. The Unicode
-  character by the last byte will be put into the first character in the output string. For example,
-  the input buffer for a 64-bits unsigned integrer 0x12345678abcdef1234 will be converted to
-  a Unicode string equal to L"12345678abcdef1234".
-
-  @param String                        On input, String is pointed to the buffer allocated for the convertion.
-  @param StringLen                     The Length of String buffer to hold the output String. The length must include the tailing '\0' character.
-                                       The StringLen required to convert a N bytes Buffer will be a least equal to or greater 
-                                       than 2*N + 1.
-  @param Buffer                        The pointer to a input buffer.
-  @param BufferSizeInBytes             Lenth in bytes of the input buffer.
-  
-
-  @retval  EFI_SUCCESS                 The convertion is successfull. All bytes in Buffer has been convert to the corresponding
-                                       Unicode character and placed into the right place in String.
-  @retval  EFI_BUFFER_TOO_SMALL        StringSizeInBytes is smaller than 2 * N + 1the number of bytes required to
-                                       complete the convertion. 
-**/
-RETURN_STATUS
-EFIAPI
-BufToHexString (
-  IN OUT       CHAR16               *String,
-  IN OUT       UINTN                *StringLen,
-  IN     CONST UINT8                *Buffer,
-  IN           UINTN                BufferSizeInBytes
-  )
-;
-
-
-/**
-  Convert a Unicode string consisting of hexadecimal characters to a output byte buffer.
-
-  This function converts a Unicode string consisting of characters in the range of Hexadecimal
-  character (L'0' to L'9', L'A' to L'F' and L'a' to L'f') to a output byte buffer. The function will stop
-  at the first non-hexadecimal character or the NULL character. The convertion process can be
-  simply viewed as the reverse operations defined by BufToHexString. Two Unicode characters will be 
-  converted into one byte. The first Unicode character represents the Most Significant Nibble and the
-  second Unicode character represents the Least Significant Nibble in the output byte. 
-  The first pair of Unicode characters represents the last byte in the output buffer. The second pair of Unicode 
-  characters represent the  the byte preceding the last byte. This rule applies to the rest pairs of bytes. 
-  The last pair represent the first byte in the output buffer. 
-
-  For example, a Unciode String L"12345678" will be converted into a buffer wil the following bytes 
-  (first byte is the byte in the lowest memory address): "0x78, 0x56, 0x34, 0x12".
-
-  If String has N valid hexadecimal characters for conversion,  the caller must make sure Buffer is at least 
-  N/2 (if N is even) or (N+1)/2 (if N if odd) bytes. 
-
-  @param Buffer                      The output buffer allocated by the caller.
-  @param BufferSizeInBytes           On input, the size in bytes of Buffer. On output, it is updated to 
-                                     contain the size of the Buffer which is actually used for the converstion.
-                                     For Unicode string with 2*N hexadecimal characters (not including the 
-                                     tailing NULL character), N bytes of Buffer will be used for the output.
-  @param String                      The input hexadecimal string.
-  @param ConvertedStrLen             The number of hexadecimal characters used to produce content in output
-                                     buffer Buffer.
-
-  @retval  RETURN_BUFFER_TOO_SMALL   The input BufferSizeInBytes is too small to hold the output. BufferSizeInBytes
-                                     will be updated to the size required for the converstion.
-  @retval  RETURN_SUCCESS            The convertion is successful or the first Unicode character from String
-                                     is hexadecimal. If ConvertedStrLen is not NULL, it is updated
-                                     to the number of hexadecimal character used for the converstion.
-**/
-RETURN_STATUS
-EFIAPI
-HexStringToBuf (
-  OUT          UINT8                    *Buffer,   
-  IN OUT       UINTN                    *BufferSizeInBytes,
-  IN     CONST CHAR16                   *String,
-  OUT          UINTN                    *ConvertedStrLen  OPTIONAL
-  )
-;
-
-
-/**
-  Test if  a Unicode character is a hexadecimal digit. If true, the input
-  Unicode character is converted to a byte. 
-
-  This function tests if a Unicode character is a hexadecimal digit. If true, the input
-  Unicode character is converted to a byte. For example, Unicode character
-  L'A' will be converted to 0x0A. 
-
-  If Digit is NULL, then ASSERT.
-
-  @retval TRUE        Char is in the range of Hexadecimal number. Digit is updated
-                      to the byte value of the number.
-  @retval FALSE       Char is not in the range of Hexadecimal number. Digit is keep
-                      intact.
-  
-**/
-BOOLEAN
-EFIAPI
-IsHexDigit (
-  OUT UINT8      *Digit,
-  IN  CHAR16      Char
-  )
-;
-
-/**
-  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 is not aligned on a 16-bit boundary, 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.
-
-  @return 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 Length > 0 and Destination is NULL, then ASSERT().
-  If Length > 0 and Source 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 Length > 0 and FirstString is NULL, then ASSERT().
-  If Length > 0 and 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.
-  @param  Length        Maximum number of ASCII characters for compare.
-  
-  @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 Length > 0 and Destination is NULL, then ASSERT().
-  If Length > 0 and 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.
-
-  @return 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  Value 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  Value 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  Value 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  Uint16  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  Uint16  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  Uint32  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  Uint32  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  Uint64  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  Uint64  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
-  );
-
-
-/**
-  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
-  );
-
-
-/**
-  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.  This function
-  supports a variable number of arguments following the NewStack parameter.
-  These additional arguments are ignored on IA-32, x64, and EBC.
-  IPF CPUs expect one additional parameter of type VOID * that specifies
-  the new backing store pointer.
-
-  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
-  );
-
-
-#if defined (MDE_CPU_IPF)
-
-/**
-  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
-  );
-
-
-/**
-  Executes a FC instruction
-  Executes a FC instruction on the cache line specified by Address.
-  The cache line size affected is at least 32-bytes (aligned on a 32-byte boundary).
-  An implementation may flush a larger region.  This function is only available on IPF.
-
-  @param Address       The Address of cache line to be flushed.
-
-  @return The address of FC instruction executed.
-
-**/
-UINT64
-EFIAPI
-AsmFc (
-  IN  UINT64  Address
-  );
-
-
-/**
-  Executes a FC.I instruction.
-  Executes a FC.I instruction on the cache line specified by Address.
-  The cache line size affected is at least 32-bytes (aligned on a 32-byte boundary).
-  An implementation may flush a larger region.  This function is only available on IPF.
-
-  @param Address       The Address of cache line to be flushed.
-
-  @return The address of FC.I instruction executed.
-
-**/
-UINT64
-EFIAPI
-AsmFci (
-  IN  UINT64  Address
-  );
-
-
-/**
-  Reads the current value of a Processor Identifier Register (CPUID).
-  The Index of largest implemented CPUID (One less than the number of implemented CPUID
-  registers) is determined by CPUID [3] bits {7:0}.
-  No parameter checking is performed on Index.  If the Index value is beyond the
-  implemented CPUID register range, a Reserved Register/Field fault may occur.  The caller
-  must either guarantee that Index is valid, or the caller must set up fault handlers to
-  catch the faults.  This function is only available on IPF.
-
-  @param Index         The 8-bit Processor Identifier Register index to read.
-
-  @return The current value of Processor Identifier Register specified by Index.
-
-**/
-UINT64
-EFIAPI
-AsmReadCpuid (
-  IN  UINT8   Index
-  );
-
-
-/**
-  Reads the current value of 64-bit Processor Status Register (PSR).
-  This function is only available on IPF.
-
-  @return The current value of PSR.
-
-**/
-UINT64
-EFIAPI
-AsmReadPsr (
-  VOID
-  );
-
-
-/**
-  Writes the current value of 64-bit Processor Status Register (PSR).
-  No parameter checking is performed on Value.  All bits of Value corresponding to
-  reserved fields of PSR must be 0 or a Reserved Register/Field fault may occur.  The caller must either guarantee that Value is valid, or the caller must set up fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to PSR.
-
-  @return The 64-bit value written to the PSR.
-
-**/
-UINT64
-EFIAPI
-AsmWritePsr (
-  IN UINT64  Value
-  );
-
-
-/**
-  Reads the current value of 64-bit Kernel Register #0 (KR0).
-  This function is only available on IPF.
-
-  @return The current value of KR0.
-
-**/
-UINT64
-EFIAPI
-AsmReadKr0 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of 64-bit Kernel Register #1 (KR1).
-  This function is only available on IPF.
-
-  @return The current value of KR1.
-
-**/
-UINT64
-EFIAPI
-AsmReadKr1 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of 64-bit Kernel Register #2 (KR2).
-  This function is only available on IPF.
-
-  @return The current value of KR2.
-
-**/
-UINT64
-EFIAPI
-AsmReadKr2 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of 64-bit Kernel Register #3 (KR3).
-  This function is only available on IPF.
-
-  @return The current value of KR3.
-
-**/
-UINT64
-EFIAPI
-AsmReadKr3 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of 64-bit Kernel Register #4 (KR4).
-  This function is only available on IPF.
-
-  @return The current value of KR4.
-
-**/
-UINT64
-EFIAPI
-AsmReadKr4 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of 64-bit Kernel Register #5 (KR5).
-  This function is only available on IPF.
-
-  @return The current value of KR5.
-
-**/
-UINT64
-EFIAPI
-AsmReadKr5 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of 64-bit Kernel Register #6 (KR6).
-  This function is only available on IPF.
-
-  @return The current value of KR6.
-
-**/
-UINT64
-EFIAPI
-AsmReadKr6 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of 64-bit Kernel Register #7 (KR7).
-  This function is only available on IPF.
-
-  @return The current value of KR7.
-
-**/
-UINT64
-EFIAPI
-AsmReadKr7 (
-  VOID
-  );
-
-
-/**
-  Write the current value of 64-bit Kernel Register #0 (KR0).
-  This function is only available on IPF.
-
-  @param  Value        The 64-bit value to write to KR0.
-
-  @return The 64-bit value written to the KR0.
-
-**/
-UINT64
-EFIAPI
-AsmWriteKr0 (
-  IN UINT64  Value
-  );
-
-
-/**
-  Write the current value of 64-bit Kernel Register #1 (KR1).
-  This function is only available on IPF.
-
-  @param  Value        The 64-bit value to write to KR1.
-
-  @return The 64-bit value written to the KR1.
-
-**/
-UINT64
-EFIAPI
-AsmWriteKr1 (
-  IN UINT64  Value
-  );
-
-
-/**
-  Write the current value of 64-bit Kernel Register #2 (KR2).
-  This function is only available on IPF.
-
-  @param  Value        The 64-bit value to write to KR2.
-
-  @return The 64-bit value written to the KR2.
-
-**/
-UINT64
-EFIAPI
-AsmWriteKr2 (
-  IN UINT64  Value
-  );
-
-
-/**
-  Write the current value of 64-bit Kernel Register #3 (KR3).
-  This function is only available on IPF.
-
-  @param  Value        The 64-bit value to write to KR3.
-
-  @return The 64-bit value written to the KR3.
-
-**/
-UINT64
-EFIAPI
-AsmWriteKr3 (
-  IN UINT64  Value
-  );
-
-
-/**
-  Write the current value of 64-bit Kernel Register #4 (KR4).
-  This function is only available on IPF.
-
-  @param  Value        The 64-bit value to write to KR4.
-
-  @return The 64-bit value written to the KR4.
-
-**/
-UINT64
-EFIAPI
-AsmWriteKr4 (
-  IN UINT64  Value
-  );
-
-
-/**
-  Write the current value of 64-bit Kernel Register #5 (KR5).
-  This function is only available on IPF.
-
-  @param  Value        The 64-bit value to write to KR5.
-
-  @return The 64-bit value written to the KR5.
-
-**/
-UINT64
-EFIAPI
-AsmWriteKr5 (
-  IN UINT64  Value
-  );
-
-
-/**
-  Write the current value of 64-bit Kernel Register #6 (KR6).
-  This function is only available on IPF.
-
-  @param  Value        The 64-bit value to write to KR6.
-
-  @return The 64-bit value written to the KR6.
-
-**/
-UINT64
-EFIAPI
-AsmWriteKr6 (
-  IN UINT64  Value
-  );
-
-
-/**
-  Write the current value of 64-bit Kernel Register #7 (KR7).
-  This function is only available on IPF.
-
-  @param  Value        The 64-bit value to write to KR7.
-
-  @return The 64-bit value written to the KR7.
-
-**/
-UINT64
-EFIAPI
-AsmWriteKr7 (
-  IN UINT64  Value
-  );
-
-
-/**
-  Reads the current value of Interval Timer Counter Register (ITC).
-  This function is only available on IPF.
-
-  @return The current value of ITC.
-
-**/
-UINT64
-EFIAPI
-AsmReadItc (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Interval Timer Vector Register (ITV).
-  This function is only available on IPF.
-
-  @return The current value of ITV.
-
-**/
-UINT64
-EFIAPI
-AsmReadItv (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Interval Timer Match Register (ITM).
-  This function is only available on IPF.
-
-  @return The current value of ITM.
-**/
-UINT64
-EFIAPI
-AsmReadItm (
-  VOID
-  );
-
-
-/**
-  Writes the current value of 64-bit Interval Timer Counter Register (ITC).
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to ITC.
-
-  @return The 64-bit value written to the ITC.
-
-**/
-UINT64
-EFIAPI
-AsmWriteItc (
-  IN UINT64  Value
-  );
-
-
-/**
-  Writes the current value of 64-bit Interval Timer Match Register (ITM).
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to ITM.
-
-  @return The 64-bit value written to the ITM.
-
-**/
-UINT64
-EFIAPI
-AsmWriteItm (
-  IN UINT64  Value
-  );
-
-
-/**
-  Writes the current value of 64-bit Interval Timer Vector Register (ITV).
-  No parameter checking is performed on Value.  All bits of Value corresponding to
-  reserved fields of ITV must be 0 or a Reserved Register/Field fault may occur.
-  The caller must either guarantee that Value is valid, or the caller must set up
-  fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to ITV.
-
-  @return The 64-bit value written to the ITV.
-
-**/
-UINT64
-EFIAPI
-AsmWriteItv (
-  IN UINT64  Value
-  );
-
-
-/**
-  Reads the current value of Default Control Register (DCR).
-  This function is only available on IPF.
-
-  @return The current value of DCR.
-
-**/
-UINT64
-EFIAPI
-AsmReadDcr (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Interruption Vector Address Register (IVA).
-  This function is only available on IPF.
-
-  @return The current value of IVA.
-**/
-UINT64
-EFIAPI
-AsmReadIva (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Page Table Address Register (PTA).
-  This function is only available on IPF.
-
-  @return The current value of PTA.
-
-**/
-UINT64
-EFIAPI
-AsmReadPta (
-  VOID
-  );
-
-
-/**
-  Writes the current value of 64-bit Default Control Register (DCR).
-  No parameter checking is performed on Value.  All bits of Value corresponding to
-  reserved fields of DCR must be 0 or a Reserved Register/Field fault may occur.
-  The caller must either guarantee that Value is valid, or the caller must set up
-  fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to DCR.
-
-  @return The 64-bit value written to the DCR.
-
-**/
-UINT64
-EFIAPI
-AsmWriteDcr (
-  IN UINT64  Value
-  );
-
-
-/**
-  Writes the current value of 64-bit Interruption Vector Address Register (IVA).
-  The size of vector table is 32 K bytes and is 32 K bytes aligned
-  the low 15 bits of Value is ignored when written.
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to IVA.
-
-  @return The 64-bit value written to the IVA.
-
-**/
-UINT64
-EFIAPI
-AsmWriteIva (
-  IN UINT64  Value
-  );
-
-
-/**
-  Writes the current value of 64-bit Page Table Address Register (PTA).
-  No parameter checking is performed on Value.  All bits of Value corresponding to
-  reserved fields of DCR must be 0 or a Reserved Register/Field fault may occur.
-  The caller must either guarantee that Value is valid, or the caller must set up
-  fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to PTA.
-
-  @return The 64-bit value written to the PTA.
-**/
-UINT64
-EFIAPI
-AsmWritePta (
-  IN UINT64  Value
-  );
-
-
-/**
-  Reads the current value of Local Interrupt ID Register (LID).
-  This function is only available on IPF.
-
-  @return The current value of LID.
-
-**/
-UINT64
-EFIAPI
-AsmReadLid (
-  VOID
-  );
-
-
-/**
-  Reads the current value of External Interrupt Vector Register (IVR).
-  This function is only available on IPF.
-
-  @return The current value of IVR.
-
-**/
-UINT64
-EFIAPI
-AsmReadIvr (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Task Priority Register (TPR).
-  This function is only available on IPF.
-
-  @return The current value of TPR.
-
-**/
-UINT64
-EFIAPI
-AsmReadTpr (
-  VOID
-  );
-
-
-/**
-  Reads the current value of External Interrupt Request Register #0 (IRR0).
-  This function is only available on IPF.
-
-  @return The current value of IRR0.
-
-**/
-UINT64
-EFIAPI
-AsmReadIrr0 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of External Interrupt Request Register #1 (IRR1).
-  This function is only available on IPF.
-
-  @return The current value of IRR1.
-
-**/
-UINT64
-EFIAPI
-AsmReadIrr1 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of External Interrupt Request Register #2 (IRR2).
-  This function is only available on IPF.
-
-  @return The current value of IRR2.
-
-**/
-UINT64
-EFIAPI
-AsmReadIrr2 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of External Interrupt Request Register #3 (IRR3).
-  This function is only available on IPF.
-
-  @return The current value of IRR3.
-
-**/
-UINT64
-EFIAPI
-AsmReadIrr3 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Performance Monitor Vector Register (PMV).
-  This function is only available on IPF.
-
-  @return The current value of PMV.
-
-**/
-UINT64
-EFIAPI
-AsmReadPmv (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Corrected Machine Check Vector Register (CMCV).
-  This function is only available on IPF.
-
-  @return The current value of CMCV.
-
-**/
-UINT64
-EFIAPI
-AsmReadCmcv (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Local Redirection Register #0 (LRR0).
-  This function is only available on IPF.
-
-  @return The current value of LRR0.
-
-**/
-UINT64
-EFIAPI
-AsmReadLrr0 (
-  VOID
-  );
-
-
-/**
-  Reads the current value of Local Redirection Register #1 (LRR1).
-  This function is only available on IPF.
-
-  @return The current value of LRR1.
-
-**/
-UINT64
-EFIAPI
-AsmReadLrr1 (
-  VOID
-  );
-
-
-/**
-  Writes the current value of 64-bit Page Local Interrupt ID Register (LID).
-  No parameter checking is performed on Value.  All bits of Value corresponding to
-  reserved fields of LID must be 0 or a Reserved Register/Field fault may occur.
-  The caller must either guarantee that Value is valid, or the caller must set up
-  fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to LID.
-
-  @return The 64-bit value written to the LID.
-
-**/
-UINT64
-EFIAPI
-AsmWriteLid (
-  IN UINT64  Value
-  );
-
-
-/**
-  Writes the current value of 64-bit Task Priority Register (TPR).
-  No parameter checking is performed on Value.  All bits of Value corresponding to
-  reserved fields of TPR must be 0 or a Reserved Register/Field fault may occur.
-  The caller must either guarantee that Value is valid, or the caller must set up
-  fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to TPR.
-
-  @return The 64-bit value written to the TPR.
-
-**/
-UINT64
-EFIAPI
-AsmWriteTpr (
-  IN UINT64  Value
-  );
-
-
-/**
-  Performs a write operation on End OF External Interrupt Register (EOI).
-  Writes a value of 0 to the EOI Register.  This function is only available on IPF.
-
-**/
-VOID
-EFIAPI
-AsmWriteEoi (
-  VOID
-  );
-
-
-/**
-  Writes the current value of 64-bit Performance Monitor Vector Register (PMV).
-  No parameter checking is performed on Value.  All bits of Value corresponding
-  to reserved fields of PMV must be 0 or a Reserved Register/Field fault may occur.
-  The caller must either guarantee that Value is valid, or the caller must set up
-  fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to PMV.
-
-  @return The 64-bit value written to the PMV.
-
-**/
-UINT64
-EFIAPI
-AsmWritePmv (
-  IN UINT64  Value
-  );
-
-
-/**
-  Writes the current value of 64-bit Corrected Machine Check Vector Register (CMCV).
-  No parameter checking is performed on Value.  All bits of Value corresponding
-  to reserved fields of CMCV must be 0 or a Reserved Register/Field fault may occur.
-  The caller must either guarantee that Value is valid, or the caller must set up
-  fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to CMCV.
-
-  @return The 64-bit value written to the CMCV.
-
-**/
-UINT64
-EFIAPI
-AsmWriteCmcv (
-  IN UINT64  Value
-  );
-
-
-/**
-  Writes the current value of 64-bit Local Redirection Register #0 (LRR0).
-  No parameter checking is performed on Value.  All bits of Value corresponding
-  to reserved fields of LRR0 must be 0 or a Reserved Register/Field fault may occur.
-  The caller must either guarantee that Value is valid, or the caller must set up
-  fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to LRR0.
-
-  @return The 64-bit value written to the LRR0.
-
-**/
-UINT64
-EFIAPI
-AsmWriteLrr0 (
-  IN UINT64  Value
-  );
-
-
-/**
-  Writes the current value of 64-bit Local Redirection Register #1 (LRR1).
-  No parameter checking is performed on Value.  All bits of Value corresponding
-  to reserved fields of LRR1 must be 0 or a Reserved Register/Field fault may occur.
-  The caller must either guarantee that Value is valid, or the caller must
-  set up fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Value         The 64-bit value to write to LRR1.
-
-  @return The 64-bit value written to the LRR1.
-
-**/
-UINT64
-EFIAPI
-AsmWriteLrr1 (
-  IN UINT64  Value
-  );
-
-
-/**
-  Reads the current value of Instruction Breakpoint Register (IBR).
-  
-  The Instruction Breakpoint Registers are used in pairs.  The even numbered
-  registers contain breakpoint addresses, and the odd numbered registers contain
-  breakpoint mask conditions.  At least 4 instruction registers pairs are implemented
-  on all processor models.   Implemented registers are contiguous starting with
-  register 0.  No parameter checking is performed on Index, and if the Index value
-  is beyond the implemented IBR register range, a Reserved Register/Field fault may
-  occur.  The caller must either guarantee that Index is valid, or the caller must
-  set up fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Index         The 8-bit Instruction Breakpoint Register index to read.
-
-  @return The current value of Instruction Breakpoint Register specified by Index.
-
-**/
-UINT64
-EFIAPI
-AsmReadIbr (
-  IN  UINT8   Index
-  );
-
-
-/**
-  Reads the current value of Data Breakpoint Register (DBR).
-
-  The Data Breakpoint Registers are used in pairs.  The even numbered registers
-  contain breakpoint addresses, and odd numbered registers contain breakpoint
-  mask conditions.  At least 4 data registers pairs are implemented on all processor
-  models.  Implemented registers are contiguous starting with register 0.
-  No parameter checking is performed on Index.  If the Index value is beyond
-  the implemented DBR register range, a Reserved Register/Field fault may occur.
-  The caller must either guarantee that Index is valid, or the caller must set up
-  fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Index         The 8-bit Data Breakpoint Register index to read.
-
-  @return The current value of Data Breakpoint Register specified by Index.
-
-**/
-UINT64
-EFIAPI
-AsmReadDbr (
-  IN  UINT8   Index
-  );
-
-
-/**
-  Reads the current value of Performance Monitor Configuration Register (PMC).
-
-  All processor implementations provide at least 4 performance counters
-  (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter overflow
-  status registers (PMC [0]¡­ PMC [3]).  Processor implementations may provide
-  additional implementation-dependent PMC and PMD to increase the number of
-  ¡®generic¡¯ performance counters (PMC/PMD pairs).  The remainder of PMC and PMD
-  register set is implementation dependent.  No parameter checking is performed
-  on Index.  If the Index value is beyond the implemented PMC register range,
-  zero value will be returned.
-  This function is only available on IPF.
-
-  @param Index         The 8-bit Performance Monitor Configuration Register index to read.
-
-  @return The current value of Performance Monitor Configuration Register
-  specified by Index.
-
-**/
-UINT64
-EFIAPI
-AsmReadPmc (
-  IN  UINT8   Index
-  );
-
-
-/**
-  Reads the current value of Performance Monitor Data Register (PMD).
-
-  All processor implementations provide at least 4 performance counters
-  (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter
-  overflow status registers (PMC [0]¡­ PMC [3]).  Processor implementations may
-  provide additional implementation-dependent PMC and PMD to increase the number
-  of ¡®generic¡¯ performance counters (PMC/PMD pairs).  The remainder of PMC and PMD
-  register set is implementation dependent.  No parameter checking is performed
-  on Index.  If the Index value is beyond the implemented PMD register range,
-  zero value will be returned.
-  This function is only available on IPF.
-
-  @param Index         The 8-bit Performance Monitor Data Register index to read.
-
-  @return The current value of Performance Monitor Data Register specified by Index.
-
-**/
-UINT64
-EFIAPI
-AsmReadPmd (
-  IN  UINT8   Index
-  );
-
-
-/**
-  Writes the current value of 64-bit Instruction Breakpoint Register (IBR).
-
-  Writes current value of Instruction Breakpoint Register specified by Index.
-  The Instruction Breakpoint Registers are used in pairs.  The even numbered
-  registers contain breakpoint addresses, and odd numbered registers contain
-  breakpoint mask conditions.  At least 4 instruction registers pairs are implemented
-  on all processor models.  Implemented registers are contiguous starting with
-  register 0.  No parameter checking is performed on Index.  If the Index value
-  is beyond the implemented IBR register range, a Reserved Register/Field fault may
-  occur.  The caller must either guarantee that Index is valid, or the caller must
-  set up fault handlers to catch the faults.
-  This function is only available on IPF.
-
-  @param Index         The 8-bit Instruction Breakpoint Register index to write.
-  @param Value         The 64-bit value to write to IBR.
-
-  @return The 64-bit value written to the IBR.
-
-**/
-UINT64
-EFIAPI
-AsmWriteIbr (
-  IN UINT8   Index,
-  IN UINT64  Value
-  );
-
-
-/**
-  Writes the current value of 64-bit Data Breakpoint Register (DBR).
-
-  Writes current value of Data Breakpoint Register specified by Index.
-  The Data Breakpoint Registers are used in pairs.  The even numbered registers
-  contain breakpoint addresses, and odd numbered registers contain breakpoint
-  mask conditions.  At least 4 data registers pairs are implemented on all processor
-  models.  Implemented registers are contiguous starting with register 0.  No parameter
-  checking is performed on Index.  If the Index value is beyond the implemented
-  DBR register range, a Reserved Register/Field fault may occur.  The caller must
-  either guarantee that Index is valid, or the caller must set up fault handlers to
-  catch the faults.
-  This function is only available on IPF.
-
-  @param Index         The 8-bit Data Breakpoint Register index to write.
-  @param Value         The 64-bit value to write to DBR.
-
-  @return The 64-bit value written to the DBR.
-
-**/
-UINT64
-EFIAPI
-AsmWriteDbr (
-  IN UINT8   Index,
-  IN UINT64  Value
-  );
-
-
-/**
-  Writes the current value of 64-bit Performance Monitor Configuration Register (PMC).
-
-  Writes current value of Performance Monitor Configuration Register specified by Index.
-  All processor implementations provide at least 4 performance counters
-  (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter overflow status
-  registers (PMC [0]¡­ PMC [3]).  Processor implementations may provide additional
-  implementation-dependent PMC and PMD to increase the number of ¡®generic¡¯ performance
-  counters (PMC/PMD pairs).  The remainder of PMC and PMD register set is implementation
-  dependent.  No parameter checking is performed on Index.  If the Index value is
-  beyond the implemented PMC register range, the write is ignored.
-  This function is only available on IPF.
-
-  @param Index         The 8-bit Performance Monitor Configuration Register index to write.
-  @param Value         The 64-bit value to write to PMC.
-
-  @return The 64-bit value written to the PMC.
-
-**/
-UINT64
-EFIAPI
-AsmWritePmc (
-  IN UINT8   Index,
-  IN UINT64  Value
-  );
-
-
-/**
-  Writes the current value of 64-bit Performance Monitor Data Register (PMD).
-
-  Writes current value of Performance Monitor Data Register specified by Index.
-  All processor implementations provide at least 4 performance counters
-  (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter overflow
-  status registers (PMC [0]¡­ PMC [3]).  Processor implementations may provide
-  additional implementation-dependent PMC and PMD to increase the number of ¡®generic¡¯
-  performance counters (PMC/PMD pairs).  The remainder of PMC and PMD register set
-  is implementation dependent.  No parameter checking is performed on Index.  If the
-  Index value is beyond the implemented PMD register range, the write is ignored.
-  This function is only available on IPF.
-
-  @param Index         The 8-bit Performance Monitor Data Register index to write.
-  @param Value         The 64-bit value to write to PMD.
-
-  @return The 64-bit value written to the PMD.
-
-**/
-UINT64
-EFIAPI
-AsmWritePmd (
-  IN UINT8   Index,
-  IN UINT64  Value
-  );
-
-
-/**
-  Reads the current value of 64-bit Global Pointer (GP).
-
-  Reads and returns the current value of GP.
-  This function is only available on IPF.
-
-  @return The current value of GP.
-
-**/
-UINT64
-EFIAPI
-AsmReadGp (
-  VOID
-  );
-
-
-/**
-  Write the current value of 64-bit Global Pointer (GP).
-
-  Writes the current value of GP. The 64-bit value written to the GP is returned.
-  No parameter checking is performed on Value.
-  This function is only available on IPF.
-
-  @param Value  The 64-bit value to write to GP.
-
-  @return The 64-bit value written to the GP.
-
-**/
-UINT64
-EFIAPI
-AsmWriteGp (
-  IN UINT64  Value
-  );
-
-
-/**
-  Reads the current value of 64-bit Stack Pointer (SP).
-
-  Reads and returns the current value of SP.
-  This function is only available on IPF.
-
-  @return The current value of SP.
-
-**/
-UINT64
-EFIAPI
-AsmReadSp (
-  VOID
-  );
-
-
-/**
-  Determines if the CPU is currently executing in virtual, physical, or mixed mode.
-
-  Determines the current execution mode of the CPU.
-  If the CPU is in virtual mode(PSR.RT=1, PSR.DT=1, PSR.IT=1), then 1 is returned.
-  If the CPU is in physical mode(PSR.RT=0, PSR.DT=0, PSR.IT=0), then 0 is returned.
-  If the CPU is not in physical mode or virtual mode, then it is in mixed mode,
-  and -1 is returned.
-  This function is only available on IPF.
-
-  @return  1  The CPU is in virtual mode.
-  @return  0  The CPU is in physical mode.
-  @return -1  The CPU is in mixed mode.
-
-**/
-INT64
-EFIAPI
-AsmCpuVirtual (
-  VOID
-  );
-
-
-/**
-  Makes a PAL procedure call.
-
-  This is a wrapper function to make a PAL procedure call.  Based on the Index
-  value this API will make static or stacked PAL call.  The following table
-  describes the usage of PAL Procedure Index Assignment. Architected procedures
-  may be designated as required or optional.  If a PAL procedure is specified
-  as optional, a unique return code of 0xFFFFFFFFFFFFFFFF is returned in the
-  Status field of the PAL_CALL_RETURN structure.
-  This indicates that the procedure is not present in this PAL implementation.
-  It is the caller¡¯s responsibility to check for this return code after calling
-  any optional PAL procedure.
-  No parameter checking is performed on the 5 input parameters, but there are
-  some common rules that the caller should follow when making a PAL call.  Any
-  address passed to PAL as buffers for return parameters must be 8-byte aligned.
-  Unaligned addresses may cause undefined results.  For those parameters defined
-  as reserved or some fields defined as reserved must be zero filled or the invalid
-  argument return value may be returned or undefined result may occur during the
-  execution of the procedure.  If the PalEntryPoint  does not point to a valid
-  PAL entry point then the system behavior is undefined.  This function is only
-  available on IPF.
-
-  @param PalEntryPoint The PAL procedure calls entry point.
-  @param Index                     The PAL procedure Index number.
-  @param Arg2                        The 2nd parameter for PAL procedure calls.
-  @param Arg3                        The 3rd parameter for PAL procedure calls.
-  @param Arg4                        The 4th parameter for PAL procedure calls.
-
-  @return structure returned from the PAL Call procedure, including the status and return value.
-
-**/
-PAL_CALL_RETURN
-EFIAPI
-AsmPalCall (
-  IN UINT64  PalEntryPoint,
-  IN UINT64  Index,
-  IN UINT64  Arg2,
-  IN UINT64  Arg3,
-  IN UINT64  Arg4
-  );
-
-
-/**
-  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
-  );
-
-
-//
-// Bugbug: This call should be removed after
-//         the PalCall Instance issue has been fixed.
-//
-/**
-  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_CALL_RETURN
-PalCallStatic (
-  IN      CONST VOID                *PalEntryPoint,
-  IN      UINT64                    Arg1,
-  IN      UINT64                    Arg2,
-  IN      UINT64                    Arg3,
-  IN      UINT64                    Arg4
-  );
-
-
-#elif defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)
-//
-// 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
-  );
-
-#else
-
-#endif
-
-#endif
-
-
+/** @file\r
+  Memory-only library functions with no library constructor/destructor\r
+\r
+  Copyright (c) 2006 - 2007, Intel Corporation\r
+  All rights reserved. This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\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 volatile 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 4\r
+\r
+#elif defined (MDE_CPU_IPF)\r
+\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 Destination is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Source is NULL, then ASSERT().\r
+  If Source is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Source and Destination overlap, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  @param  Destination 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
+\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 Length > 0 and Destination is NULL, then ASSERT().\r
+  If Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length > 0 and Source is NULL, then ASSERT().\r
+  If Length > 0 and Source is not aligned on a 16-bit bounadry, then ASSERT().\r
+  If Source and Destination overlap, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters 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
+\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 String is not aligned on a 16-bit boundary, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters 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
+\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 String is not aligned on a 16-bit boundary, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters 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
+\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 FirstString is not aligned on a 16-bit boundary, then ASSERT().\r
+  If SecondString is NULL, then ASSERT().\r
+  If SecondString is not aligned on a 16-bit boundary, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more\r
+  than PcdMaximumUnicodeStringLength Unicode characters 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
+/**\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 Length > 0 and FirstString is NULL, then ASSERT().\r
+  If Length > 0 and FirstString is not aligned on a 16-bit bounadary, then ASSERT().\r
+  If Length > 0 and SecondString is NULL, then ASSERT().\r
+  If Length > 0 and SecondString is not aligned on a 16-bit bounadary, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and FirstString contains more\r
+  than PcdMaximumUnicodeStringLength Unicode characters 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
+\r
+/**\r
+  Concatenates one Null-terminated Unicode string to another Null-terminated\r
+  Unicode string, and returns the concatenated Unicode string.\r
+\r
+  This function concatenates two Null-terminated Unicode strings. The contents\r
+  of Null-terminated Unicode string Source are concatenated to the end of\r
+  Null-terminated Unicode string Destination. The Null-terminated concatenated\r
+  Unicode String is returned. If Source and Destination overlap, then the\r
+  results are undefined.\r
+\r
+  If Destination is NULL, then ASSERT().\r
+  If Destination is not aligned on a 16-bit bounadary, then ASSERT().\r
+  If Source is NULL, then ASSERT().\r
+  If Source is not aligned on a 16-bit bounadary, then ASSERT().\r
+  If Source and Destination overlap, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and Destination contains more\r
+  than PcdMaximumUnicodeStringLength Unicode characters 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
+\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 Length > 0 and Destination is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length > 0 and Source is NULL, then ASSERT().\r
+  If Length > 0 and Source is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Source and Destination overlap, then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and Destination contains more\r
+  than PcdMaximumUnicodeStringLength Unicode characters 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
+/**\r
+  Returns the first occurance of a Null-terminated Unicode sub-string\r
+  in a Null-terminated Unicode string.\r
+\r
+  This function scans the contents of the Null-terminated Unicode string\r
+  specified by String and returns the first occurrence of SearchString.\r
+  If SearchString is not found in String, then NULL is returned.  If\r
+  the length of SearchString is zero, then String is\r
+  returned.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If String is not aligned on a 16-bit boundary, then ASSERT().\r
+  If SearchString is NULL, then ASSERT().\r
+  If SearchString is not aligned on a 16-bit boundary, then ASSERT().\r
+\r
+  If PcdMaximumUnicodeStringLength is not zero, and SearchString\r
+  or String contains more than PcdMaximumUnicodeStringLength Unicode\r
+  characters not including the Null-terminator, then ASSERT().\r
+\r
+  @param  String                                 Pointer to a Null-terminated Unicode string.\r
+  @param  SearchString Pointer to a Null-terminated Unicode string to search for.\r
+\r
+  @retval NULL            If the SearchString does not appear in String.\r
+  @retval !NULL           If there is a match.\r
+\r
+**/\r
+CHAR16 *\r
+EFIAPI\r
+StrStr (\r
+  IN      CONST CHAR16               *String,\r
+  IN      CONST CHAR16               *SearchString\r
+  );\r
+\r
+/**\r
+  Convert a Null-terminated Unicode decimal string to a value of\r
+  type UINTN.\r
+\r
+  This function returns a value of type UINTN by interpreting the contents\r
+  of the Unicode string specified by String as a decimal number. The format\r
+  of the input Unicode string String is:\r
+\r
+                  [spaces] [decimal digits].\r
+\r
+  The valid decimal digit character is in the range [0-9]. The\r
+  function will ignore the pad space, which includes spaces or\r
+  tab characters, before [decimal digits]. The running zero in the\r
+  beginning of [decimal digits] will be ignored. Then, the function\r
+  stops at the first character that is a not a valid decimal character\r
+  or a Null-terminator, whichever one comes first.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If String is not aligned in a 16-bit boundary, then ASSERT().\r
+  If String has only pad spaces, then 0 is returned.\r
+  If String has no pad spaces or valid decimal digits,\r
+  then 0 is returned.\r
+  If the number represented by String overflows according\r
+  to the range defined by UINTN, then ASSERT().\r
+\r
+  If PcdMaximumUnicodeStringLength is not zero, and String contains\r
+  more than PcdMaximumUnicodeStringLength Unicode characters not including\r
+  the Null-terminator, then ASSERT().\r
+\r
+  @param  String                           Pointer to a Null-terminated Unicode string.\r
+\r
+  @retval UINTN\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+StrDecimalToUintn (\r
+  IN      CONST CHAR16               *String\r
+  );\r
+\r
+/**\r
+  Convert a Null-terminated Unicode decimal string to a value of\r
+  type UINT64.\r
+\r
+  This function returns a value of type UINT64 by interpreting the contents\r
+  of the Unicode string specified by String as a decimal number. The format\r
+  of the input Unicode string String is:\r
+\r
+                  [spaces] [decimal digits].\r
+\r
+  The valid decimal digit character is in the range [0-9]. The\r
+  function will ignore the pad space, which includes spaces or\r
+  tab characters, before [decimal digits]. The running zero in the\r
+  beginning of [decimal digits] will be ignored. Then, the function\r
+  stops at the first character that is a not a valid decimal character\r
+  or a Null-terminator, whichever one comes first.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If String is not aligned in a 16-bit boundary, then ASSERT().\r
+  If String has only pad spaces, then 0 is returned.\r
+  If String has no pad spaces or valid decimal digits,\r
+  then 0 is returned.\r
+  If the number represented by String overflows according\r
+  to the range defined by UINT64, then ASSERT().\r
+\r
+  If PcdMaximumUnicodeStringLength is not zero, and String contains\r
+  more than PcdMaximumUnicodeStringLength Unicode characters not including\r
+  the Null-terminator, then ASSERT().\r
+\r
+  @param  String                           Pointer to a Null-terminated Unicode string.\r
+\r
+  @retval UINT64\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+StrDecimalToUint64 (\r
+  IN      CONST CHAR16               *String\r
+  );\r
\r
+\r
+/**\r
+  Convert a Null-terminated Unicode hexadecimal string to a value of type UINTN.\r
+\r
+  This function returns a value of type UINTN by interpreting the contents\r
+  of the Unicode string specified by String as a hexadecimal number.\r
+  The format of the input Unicode string String is:\r
+\r
+                  [spaces][zeros][x][hexadecimal digits].\r
+\r
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].\r
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.\r
+  If "x" appears in the input string, it must be prefixed with at least one 0.\r
+  The function will ignore the pad space, which includes spaces or tab characters,\r
+  before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or\r
+  [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the\r
+  first valid hexadecimal digit. Then, the function stops at the first character that is\r
+  a not a valid hexadecimal character or NULL, whichever one comes first.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If String is not aligned in a 16-bit boundary, then ASSERT().\r
+  If String has only pad spaces, then zero is returned.\r
+  If String has no leading pad spaces, leading zeros or valid hexadecimal digits,\r
+  then zero is returned.\r
+  If the number represented by String overflows according to the range defined by\r
+  UINTN, then ASSERT().\r
+\r
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator,\r
+  then ASSERT().\r
+\r
+  @param  String                           Pointer to a Null-terminated Unicode string.\r
+\r
+  @retval UINTN\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+StrHexToUintn (\r
+  IN      CONST CHAR16               *String\r
+  );\r
+\r
+\r
+/**\r
+  Convert a Null-terminated Unicode hexadecimal string to a value of type UINT64.\r
+\r
+  This function returns a value of type UINT64 by interpreting the contents\r
+  of the Unicode string specified by String as a hexadecimal number.\r
+  The format of the input Unicode string String is\r
+\r
+                  [spaces][zeros][x][hexadecimal digits].\r
+\r
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].\r
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix.\r
+  If "x" appears in the input string, it must be prefixed with at least one 0.\r
+  The function will ignore the pad space, which includes spaces or tab characters,\r
+  before [zeros], [x] or [hexadecimal digit]. The running zero before [x] or\r
+  [hexadecimal digit] will be ignored. Then, the decoding starts after [x] or the\r
+  first valid hexadecimal digit. Then, the function stops at the first character that is\r
+  a not a valid hexadecimal character or NULL, whichever one comes first.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If String is not aligned in a 16-bit boundary, then ASSERT().\r
+  If String has only pad spaces, then zero is returned.\r
+  If String has no leading pad spaces, leading zeros or valid hexadecimal digits,\r
+  then zero is returned.\r
+  If the number represented by String overflows according to the range defined by\r
+  UINT64, then ASSERT().\r
+\r
+  If PcdMaximumUnicodeStringLength is not zero, and String contains more than\r
+  PcdMaximumUnicodeStringLength Unicode characters not including the Null-terminator,\r
+  then ASSERT().\r
+\r
+  @param  String                           Pointer to a Null-terminated Unicode string.\r
+\r
+  @retval UINT64\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+StrHexToUint64 (\r
+  IN      CONST CHAR16               *String\r
+  );\r
+\r
+/**\r
+  Convert a nibble in the low 4 bits of a byte to a Unicode hexadecimal character.\r
+\r
+  This function converts a nibble in the low 4 bits of a byte to a Unicode hexadecimal \r
+  character  For example, the nibble  0x01 and 0x0A will converted to L'1' and L'A' \r
+  respectively.\r
+\r
+  The upper nibble in the input byte will be masked off.\r
+\r
+  @param Nibble     The nibble which is in the low 4 bits of the input byte.\r
+\r
+  @retval  CHAR16   The Unicode hexadecimal character.\r
+  \r
+**/\r
+CHAR16\r
+EFIAPI\r
+NibbleToHexChar (\r
+  IN UINT8      Nibble\r
+  )\r
+;\r
+\r
+/** \r
+  Convert binary buffer to a Unicode String in a specified sequence. \r
+\r
+  This function converts bytes in the binary Buffer Buf to a Unicode String Str. \r
+  Each byte will be represented by two Unicode characters. For example, byte 0xA1 will \r
+  be converted into two Unicode character L'A' and L'1'. In the output String, the Unicode Character \r
+  for the Most Significant Nibble will be put before the Unicode Character for the Least Significant\r
+  Nibble. The output string for the buffer containing a single byte 0xA1 will be L"A1". \r
+  For a buffer with multiple bytes, the Unicode character produced by the first byte will be put into the \r
+  the last character in the output string. The one next to first byte will be put into the\r
+  character before the last character. This rules applies to the rest of the bytes. The Unicode\r
+  character by the last byte will be put into the first character in the output string. For example,\r
+  the input buffer for a 64-bits unsigned integrer 0x12345678abcdef1234 will be converted to\r
+  a Unicode string equal to L"12345678abcdef1234".\r
+\r
+  @param String                        On input, String is pointed to the buffer allocated for the convertion.\r
+  @param StringLen                     The Length of String buffer to hold the output String. The length must include the tailing '\0' character.\r
+                                       The StringLen required to convert a N bytes Buffer will be a least equal to or greater \r
+                                       than 2*N + 1.\r
+  @param Buffer                        The pointer to a input buffer.\r
+  @param BufferSizeInBytes             Lenth in bytes of the input buffer.\r
+  \r
+\r
+  @retval  EFI_SUCCESS                 The convertion is successfull. All bytes in Buffer has been convert to the corresponding\r
+                                       Unicode character and placed into the right place in String.\r
+  @retval  EFI_BUFFER_TOO_SMALL        StringSizeInBytes is smaller than 2 * N + 1the number of bytes required to\r
+                                       complete the convertion. \r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+BufToHexString (\r
+  IN OUT       CHAR16               *String,\r
+  IN OUT       UINTN                *StringLen,\r
+  IN     CONST UINT8                *Buffer,\r
+  IN           UINTN                BufferSizeInBytes\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  Convert a Unicode string consisting of hexadecimal characters to a output byte buffer.\r
+\r
+  This function converts a Unicode string consisting of characters in the range of Hexadecimal\r
+  character (L'0' to L'9', L'A' to L'F' and L'a' to L'f') to a output byte buffer. The function will stop\r
+  at the first non-hexadecimal character or the NULL character. The convertion process can be\r
+  simply viewed as the reverse operations defined by BufToHexString. Two Unicode characters will be \r
+  converted into one byte. The first Unicode character represents the Most Significant Nibble and the\r
+  second Unicode character represents the Least Significant Nibble in the output byte. \r
+  The first pair of Unicode characters represents the last byte in the output buffer. The second pair of Unicode \r
+  characters represent the  the byte preceding the last byte. This rule applies to the rest pairs of bytes. \r
+  The last pair represent the first byte in the output buffer. \r
+\r
+  For example, a Unciode String L"12345678" will be converted into a buffer wil the following bytes \r
+  (first byte is the byte in the lowest memory address): "0x78, 0x56, 0x34, 0x12".\r
+\r
+  If String has N valid hexadecimal characters for conversion,  the caller must make sure Buffer is at least \r
+  N/2 (if N is even) or (N+1)/2 (if N if odd) bytes. \r
+\r
+  @param Buffer                      The output buffer allocated by the caller.\r
+  @param BufferSizeInBytes           On input, the size in bytes of Buffer. On output, it is updated to \r
+                                     contain the size of the Buffer which is actually used for the converstion.\r
+                                     For Unicode string with 2*N hexadecimal characters (not including the \r
+                                     tailing NULL character), N bytes of Buffer will be used for the output.\r
+  @param String                      The input hexadecimal string.\r
+  @param ConvertedStrLen             The number of hexadecimal characters used to produce content in output\r
+                                     buffer Buffer.\r
+\r
+  @retval  RETURN_BUFFER_TOO_SMALL   The input BufferSizeInBytes is too small to hold the output. BufferSizeInBytes\r
+                                     will be updated to the size required for the converstion.\r
+  @retval  RETURN_SUCCESS            The convertion is successful or the first Unicode character from String\r
+                                     is hexadecimal. If ConvertedStrLen is not NULL, it is updated\r
+                                     to the number of hexadecimal character used for the converstion.\r
+**/\r
+RETURN_STATUS\r
+EFIAPI\r
+HexStringToBuf (\r
+  OUT          UINT8                    *Buffer,   \r
+  IN OUT       UINTN                    *BufferSizeInBytes,\r
+  IN     CONST CHAR16                   *String,\r
+  OUT          UINTN                    *ConvertedStrLen  OPTIONAL\r
+  )\r
+;\r
+\r
+\r
+/**\r
+  Test if  a Unicode character is a hexadecimal digit. If true, the input\r
+  Unicode character is converted to a byte. \r
+\r
+  This function tests if a Unicode character is a hexadecimal digit. If true, the input\r
+  Unicode character is converted to a byte. For example, Unicode character\r
+  L'A' will be converted to 0x0A. \r
+\r
+  If Digit is NULL, then ASSERT.\r
+\r
+  @retval TRUE        Char is in the range of Hexadecimal number. Digit is updated\r
+                      to the byte value of the number.\r
+  @retval FALSE       Char is not in the range of Hexadecimal number. Digit is keep\r
+                      intact.\r
+  \r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+IsHexDigit (\r
+  OUT UINT8      *Digit,\r
+  IN  CHAR16      Char\r
+  )\r
+;\r
+\r
+/**\r
+  Convert one Null-terminated Unicode string to a Null-terminated\r
+  ASCII string and returns the ASCII string.\r
+\r
+  This function converts the content of the Unicode string Source\r
+  to the ASCII string Destination by copying the lower 8 bits of\r
+  each Unicode character. It returns Destination.\r
+\r
+  If any Unicode characters in Source contain non-zero value in\r
+  the upper 8 bits, then ASSERT().\r
+\r
+  If Destination is NULL, then ASSERT().\r
+  If Source is NULL, then ASSERT().\r
+  If Source is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Source and Destination overlap, then ASSERT().\r
+\r
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains\r
+  more than PcdMaximumUnicodeStringLength Unicode characters not including\r
+  the Null-terminator, then ASSERT().\r
+\r
+  If PcdMaximumAsciiStringLength is not zero, and Source contains more\r
+  than PcdMaximumAsciiStringLength Unicode characters not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  @param  Source        Pointer to a Null-terminated Unicode string.\r
+  @param  Destination   Pointer to a Null-terminated ASCII string.\r
+\r
+  @return Destination\r
+\r
+**/\r
+CHAR8 *\r
+EFIAPI\r
+UnicodeStrToAsciiStr (\r
+  IN      CONST CHAR16               *Source,\r
+  OUT    CHAR8                           *Destination\r
+  );\r
+\r
+\r
+/**\r
+  Copies one Null-terminated ASCII string to another Null-terminated ASCII\r
+  string and returns the new ASCII string.\r
+\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
+\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
+\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 Length > 0 and Destination is NULL, then ASSERT().\r
+  If Length > 0 and Source is NULL, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero and String contains more than\r
+  PcdMaximumAsciiStringLength ASCII characters 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
+\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
+\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
+/**\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
+\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 Length > 0 and FirstString is NULL, then ASSERT().\r
+  If Length > 0 and SecondString is NULL, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero and FirstString contains more than\r
+  PcdMaximumAsciiStringLength ASCII characters 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
+  @param  Length        Maximum number of ASCII characters for compare.\r
+  \r
+  @retval 0   FirstString is identical to SecondString.\r
+  @retval !=0 FirstString is not identical to SecondString.\r
+\r
+**/\r
+INTN\r
+EFIAPI\r
+AsciiStrnCmp (\r
+  IN      CONST CHAR8               *FirstString,\r
+  IN      CONST CHAR8               *SecondString,\r
+  IN      UINTN                     Length\r
+  );\r
+\r
+\r
+/**\r
+  Concatenates one Null-terminated ASCII string to another Null-terminated\r
+  ASCII string, and returns the concatenated ASCII string.\r
+\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
+\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 Length > 0 and Destination is NULL, then ASSERT().\r
+  If Length > 0 and Source is NULL, then ASSERT().\r
+  If Source and Destination overlap, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero, and Destination contains more 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
+\r
+/**\r
+  Returns the first occurance of a Null-terminated ASCII sub-string\r
+  in a Null-terminated ASCII string.\r
+\r
+  This function scans the contents of the ASCII string specified by String\r
+  and returns the first occurrence of SearchString. If SearchString is not\r
+  found in String, then NULL is returned. If the length of SearchString is zero,\r
+  then String is returned.\r
+\r
+  If String is NULL, then ASSERT().\r
+  If SearchString is NULL, then ASSERT().\r
+\r
+  If PcdMaximumAsciiStringLength is not zero, and SearchString or\r
+  String contains more than PcdMaximumAsciiStringLength Unicode characters\r
+  not including the Null-terminator, then ASSERT().\r
+\r
+  @param  String                                 Pointer to a Null-terminated ASCII string.\r
+  @param  SearchString   Pointer to a Null-terminated ASCII string to search for.\r
+\r
+  @retval NULL            If the SearchString does not appear in String.\r
+  @retval !NULL           If there is a match.\r
+\r
+**/\r
+CHAR8 *\r
+EFIAPI\r
+AsciiStrStr (\r
+  IN      CONST CHAR8                  *String,\r
+  IN      CONST CHAR8                  *SearchString\r
+  );\r
+\r
+\r
+/**\r
+  Convert a Null-terminated ASCII decimal string to a value of type\r
+  UINTN.\r
+\r
+  This function returns a value of type UINTN by interpreting the contents\r
+  of the ASCII string String as a decimal number. The format of the input\r
+  ASCII string String is:\r
+\r
+                    [spaces] [decimal digits].\r
+\r
+  The valid decimal digit character is in the range [0-9]. The function will\r
+  ignore the pad space, which includes spaces or tab characters, before the digits.\r
+  The running zero in the beginning of [decimal digits] will be ignored. Then, the\r
+  function stops at the first character that is a not a valid decimal character or\r
+  Null-terminator, whichever on comes first.\r
+\r
+  If String has only pad spaces, then 0 is returned.\r
+  If String has no pad spaces or valid decimal digits, then 0 is returned.\r
+  If the number represented by String overflows according to the range defined by\r
+  UINTN, then ASSERT().\r
+  If String is NULL, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero, and String contains more than\r
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
+  then ASSERT().\r
+\r
+  @param  String                           Pointer to a Null-terminated ASCII string.\r
+\r
+  @retval UINTN\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsciiStrDecimalToUintn (\r
+  IN      CONST CHAR8               *String\r
+  );\r
+\r
+\r
+/**\r
+  Convert a Null-terminated ASCII decimal string to a value of type\r
+  UINT64.\r
+\r
+  This function returns a value of type UINT64 by interpreting the contents\r
+  of the ASCII string String as a decimal number. The format of the input\r
+  ASCII string String is:\r
+\r
+                    [spaces] [decimal digits].\r
+\r
+  The valid decimal digit character is in the range [0-9]. The function will\r
+  ignore the pad space, which includes spaces or tab characters, before the digits.\r
+  The running zero in the beginning of [decimal digits] will be ignored. Then, the\r
+  function stops at the first character that is a not a valid decimal character or\r
+  Null-terminator, whichever on comes first.\r
+\r
+  If String has only pad spaces, then 0 is returned.\r
+  If String has no pad spaces or valid decimal digits, then 0 is returned.\r
+  If the number represented by String overflows according to the range defined by\r
+  UINT64, then ASSERT().\r
+  If String is NULL, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero, and String contains more than\r
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
+  then ASSERT().\r
+\r
+  @param  String                           Pointer to a Null-terminated ASCII string.\r
+\r
+  @retval UINT64\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsciiStrDecimalToUint64 (\r
+  IN      CONST CHAR8                *String\r
+  );\r
+\r
+\r
+/**\r
+  Convert a Null-terminated ASCII hexadecimal string to a value of type UINTN.\r
+\r
+  This function returns a value of type UINTN by interpreting the contents of\r
+  the ASCII string String as a hexadecimal number. The format of the input ASCII\r
+  string String is:\r
+\r
+                  [spaces][zeros][x][hexadecimal digits].\r
+\r
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].\r
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x"\r
+  appears in the input string, it must be prefixed with at least one 0. The function\r
+  will ignore the pad space, which includes spaces or tab characters, before [zeros],\r
+  [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits]\r
+  will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal\r
+  digit. Then, the function stops at the first character that is a not a valid\r
+  hexadecimal character or Null-terminator, whichever on comes first.\r
+\r
+  If String has only pad spaces, then 0 is returned.\r
+  If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then\r
+  0 is returned.\r
+\r
+  If the number represented by String overflows according to the range defined by UINTN,\r
+  then ASSERT().\r
+  If String is NULL, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero,\r
+  and String contains more than PcdMaximumAsciiStringLength ASCII characters not including\r
+  the Null-terminator, then ASSERT().\r
+\r
+  @param  String                           Pointer to a Null-terminated ASCII string.\r
+\r
+  @retval UINTN\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+AsciiStrHexToUintn (\r
+  IN      CONST CHAR8                *String\r
+  );\r
+\r
+\r
+/**\r
+  Convert a Null-terminated ASCII hexadecimal string to a value of type UINT64.\r
+\r
+  This function returns a value of type UINT64 by interpreting the contents of\r
+  the ASCII string String as a hexadecimal number. The format of the input ASCII\r
+  string String is:\r
+\r
+                  [spaces][zeros][x][hexadecimal digits].\r
+\r
+  The valid hexadecimal digit character is in the range [0-9], [a-f] and [A-F].\r
+  The prefix "0x" is optional. Both "x" and "X" is allowed in "0x" prefix. If "x"\r
+  appears in the input string, it must be prefixed with at least one 0. The function\r
+  will ignore the pad space, which includes spaces or tab characters, before [zeros],\r
+  [x] or [hexadecimal digits]. The running zero before [x] or [hexadecimal digits]\r
+  will be ignored. Then, the decoding starts after [x] or the first valid hexadecimal\r
+  digit. Then, the function stops at the first character that is a not a valid\r
+  hexadecimal character or Null-terminator, whichever on comes first.\r
+\r
+  If String has only pad spaces, then 0 is returned.\r
+  If String has no leading pad spaces, leading zeros or valid hexadecimal digits, then\r
+  0 is returned.\r
+\r
+  If the number represented by String overflows according to the range defined by UINT64,\r
+  then ASSERT().\r
+  If String is NULL, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero,\r
+  and String contains more than PcdMaximumAsciiStringLength ASCII characters not including\r
+  the Null-terminator, then ASSERT().\r
+\r
+  @param  String                           Pointer to a Null-terminated ASCII string.\r
+\r
+  @retval UINT64\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsciiStrHexToUint64 (\r
+  IN      CONST CHAR8                  *String\r
+  );\r
+\r
+\r
+/**\r
+  Convert one Null-terminated ASCII string to a Null-terminated\r
+  Unicode string and returns the Unicode string.\r
+\r
+  This function converts the contents of the ASCII string Source to the Unicode\r
+  string Destination, and returns Destination.  The function terminates the\r
+  Unicode string Destination by appending a Null-terminator character at the end.\r
+  The caller is responsible to make sure Destination points to a buffer with size\r
+  equal or greater than ((AsciiStrLen (Source) + 1) * sizeof (CHAR16)) in bytes.\r
+\r
+  If Destination is NULL, then ASSERT().\r
+  If Destination is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Source is NULL, then ASSERT().\r
+  If Source and Destination overlap, then ASSERT().\r
+  If PcdMaximumAsciiStringLength is not zero, and Source contains more than\r
+  PcdMaximumAsciiStringLength ASCII characters not including the Null-terminator,\r
+  then ASSERT().\r
+  If PcdMaximumUnicodeStringLength is not zero, and Source contains more than\r
+  PcdMaximumUnicodeStringLength ASCII characters not including the\r
+  Null-terminator, then ASSERT().\r
+\r
+  @param  Source        Pointer to a Null-terminated ASCII string.\r
+  @param  Destination   Pointer to a Null-terminated Unicode string.\r
+\r
+  @return Destination\r
+\r
+**/\r
+CHAR16 *\r
+EFIAPI\r
+AsciiStrToUnicodeStr (\r
+  IN      CONST CHAR8                *Source,\r
+  OUT    CHAR16                        *Destination\r
+  );\r
+\r
+\r
+/**\r
+  Converts an 8-bit value to an 8-bit BCD value.\r
+\r
+  Converts the 8-bit value specified by Value to BCD. The BCD value is\r
+  returned.\r
+\r
+  If Value >= 100, then ASSERT().\r
+\r
+  @param  Value The 8-bit value to convert to BCD. Range 0..99.\r
+\r
+  @return The BCD value\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+DecimalToBcd8 (\r
+  IN      UINT8                     Value\r
+  );\r
+\r
+\r
+/**\r
+  Converts an 8-bit BCD value to an 8-bit value.\r
+\r
+  Converts the 8-bit BCD value specified by Value to an 8-bit value. The 8-bit\r
+  value is returned.\r
+\r
+  If Value >= 0xA0, then ASSERT().\r
+  If (Value & 0x0F) >= 0x0A, then ASSERT().\r
+\r
+  @param  Value The 8-bit BCD value to convert to an 8-bit value.\r
+\r
+  @return The 8-bit value is returned.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+BcdToDecimal8 (\r
+  IN      UINT8                     Value\r
+  );\r
+\r
+\r
+//\r
+// Linked List Functions and Macros\r
+//\r
+\r
+/**\r
+  Initializes the head node of a doubly linked list that is declared as a\r
+  global variable in a module.\r
+\r
+  Initializes the forward and backward links of a new linked list. After\r
+  initializing a linked list with this macro, the other linked list functions\r
+  may be used to add and remove nodes from the linked list. This macro results\r
+  in smaller executables by initializing the linked list in the data section,\r
+  instead if calling the InitializeListHead() function to perform the\r
+  equivalent operation.\r
+\r
+  @param  ListHead  The head note of a list to initiailize.\r
+\r
+**/\r
+#define INITIALIZE_LIST_HEAD_VARIABLE(ListHead)  {&ListHead, &ListHead}\r
+\r
+\r
+/**\r
+  Initializes the head node of a doubly linked list, and returns the pointer to\r
+  the head node of the doubly linked list.\r
+\r
+  Initializes the forward and backward links of a new linked list. After\r
+  initializing a linked list with this function, the other linked list\r
+  functions may be used to add and remove nodes from the linked list. It is up\r
+  to the caller of this function to allocate the memory for ListHead.\r
+\r
+  If ListHead is NULL, then ASSERT().\r
+\r
+  @param  ListHead  A pointer to the head node of a new doubly linked list.\r
+\r
+  @return ListHead\r
+\r
+**/\r
+LIST_ENTRY *\r
+EFIAPI\r
+InitializeListHead (\r
+  IN      LIST_ENTRY                *ListHead\r
+  );\r
+\r
+\r
+/**\r
+  Adds a node to the beginning of a doubly linked list, and returns the pointer\r
+  to the head node of the doubly linked list.\r
+\r
+  Adds the node Entry at the beginning of the doubly linked list denoted by\r
+  ListHead, and returns ListHead.\r
+\r
+  If ListHead is NULL, then ASSERT().\r
+  If Entry is NULL, then ASSERT().\r
+  If ListHead was not initialized with InitializeListHead(), then ASSERT().\r
+  If PcdMaximumLinkedListLenth is not zero, and prior to insertion the number\r
+  of nodes in ListHead, including the ListHead node, is greater than or\r
+  equal to PcdMaximumLinkedListLength, then ASSERT().\r
+\r
+  @param  ListHead  A pointer to the head node of a doubly linked list.\r
+  @param  Entry     A pointer to a node that is to be inserted at the beginning\r
+                    of a doubly linked list.\r
+\r
+  @return ListHead\r
+\r
+**/\r
+LIST_ENTRY *\r
+EFIAPI\r
+InsertHeadList (\r
+  IN      LIST_ENTRY                *ListHead,\r
+  IN      LIST_ENTRY                *Entry\r
+  );\r
+\r
+\r
+/**\r
+  Adds a node to the end of a doubly linked list, and returns the pointer to\r
+  the head node of the doubly linked list.\r
+\r
+  Adds the node Entry to the end of the doubly linked list denoted by ListHead,\r
+  and returns ListHead.\r
+\r
+  If ListHead is NULL, then ASSERT().\r
+  If Entry is NULL, then ASSERT().\r
+  If ListHead was not initialized with InitializeListHead(), then ASSERT().\r
+  If PcdMaximumLinkedListLenth is not zero, and prior to insertion the number\r
+  of nodes in ListHead, including the ListHead node, is greater than or\r
+  equal to PcdMaximumLinkedListLength, then ASSERT().\r
+\r
+  @param  ListHead  A pointer to the head node of a doubly linked list.\r
+  @param  Entry     A pointer to a node that is to be added at the end of the\r
+                    doubly linked list.\r
+\r
+  @return ListHead\r
+\r
+**/\r
+LIST_ENTRY *\r
+EFIAPI\r
+InsertTailList (\r
+  IN      LIST_ENTRY                *ListHead,\r
+  IN      LIST_ENTRY                *Entry\r
+  );\r
+\r
+\r
+/**\r
+  Retrieves the first node of a doubly linked list.\r
+\r
+  Returns the first node of a doubly linked list. List must have been\r
+  initialized with InitializeListHead(). If List is empty, then NULL is\r
+  returned.\r
+\r
+  If List is NULL, then ASSERT().\r
+  If List was not initialized with InitializeListHead(), then ASSERT().\r
+  If PcdMaximumLinkedListLenth is not zero, and 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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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  Value 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
+/**\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  Value 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
+/**\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  Value 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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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  Uint16  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
+/**\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  Uint16  Pointer to a 16-bit value that may be unaligned.\r
+  @param  Value   16-bit value to write to Buffer.\r
+\r
+  @return Value\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+WriteUnaligned16 (\r
+  OUT     UINT16                    *Uint16,\r
+  IN      UINT16                    Value\r
+  );\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
+/**\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
+/**\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  Uint32  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
+/**\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  Uint32  Pointer to a 32-bit value that may be unaligned.\r
+  @param  Value   32-bit value to write to Buffer.\r
+\r
+  @return Value\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+WriteUnaligned32 (\r
+  OUT     UINT32                    *Uint32,\r
+  IN      UINT32                    Value\r
+  );\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  Uint64  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
+/**\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  Uint64  Pointer to a 64-bit value that may be unaligned.\r
+  @param  Value   64-bit value to write to Buffer.\r
+\r
+  @return Value\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+WriteUnaligned64 (\r
+  OUT     UINT64                    *Uint64,\r
+  IN      UINT64                    Value\r
+  );\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+//\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+//\r
+// Base Library Checksum Functions\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
+\r
+/**\r
+  Returns the two's complement checksum of all elements in a buffer\r
+  of 8-bit values.\r
+\r
+  This function first calculates the sum of the 8-bit values in the\r
+  buffer specified by Buffer and Length.  The carry bits in the result\r
+  of addition are dropped. Then, the two's complement of the sum is\r
+  returned.  If Length is 0, then 0 is returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the checksum operation.\r
+  @param  Length           The size, in bytes, of Buffer.\r
+\r
+  @return Checksum       The 2's complement checksum of Buffer.\r
+\r
+**/\r
+UINT8\r
+EFIAPI\r
+CalculateCheckSum8 (\r
+  IN      CONST UINT8                  *Buffer,\r
+  IN      UINTN                                      Length\r
+  );\r
+\r
+\r
+/**\r
+  Returns the sum of all elements in a buffer of 16-bit values.  During\r
+  calculation, the carry bits are dropped.\r
+\r
+  This function calculates the sum of the 16-bit values in the buffer\r
+  specified by Buffer and Length. The carry bits in result of addition are dropped.\r
+  The 16-bit result is returned.  If Length is 0, then 0 is returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the sum operation.\r
+  @param  Length           The size, in bytes, of Buffer.\r
+\r
+  @return Sum         The sum of Buffer with carry bits dropped during additions.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+CalculateSum16 (\r
+  IN      CONST UINT16                 *Buffer,\r
+  IN      UINTN                                      Length\r
+  );\r
+\r
+\r
+/**\r
+  Returns the two's complement checksum of all elements in a buffer of\r
+  16-bit values.\r
+\r
+  This function first calculates the sum of the 16-bit values in the buffer\r
+  specified by Buffer and Length.  The carry bits in the result of addition\r
+  are dropped. Then, the two's complement of the sum is returned.  If Length\r
+  is 0, then 0 is returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 16-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the checksum operation.\r
+  @param  Length           The size, in bytes, of Buffer.\r
+\r
+  @return Checksum       The 2's complement checksum of Buffer.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+CalculateCheckSum16 (\r
+  IN      CONST UINT16                 *Buffer,\r
+  IN      UINTN                                      Length\r
+  );\r
+\r
+\r
+/**\r
+  Returns the sum of all elements in a buffer of 32-bit values.  During\r
+  calculation, the carry bits are dropped.\r
+\r
+  This function calculates the sum of the 32-bit values in the buffer\r
+  specified by Buffer and Length. The carry bits in result of addition are dropped.\r
+  The 32-bit result is returned.  If Length is 0, then 0 is returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 32-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 32-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the sum operation.\r
+  @param  Length           The size, in bytes, of Buffer.\r
+\r
+  @return Sum         The sum of Buffer with carry bits dropped during additions.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+CalculateSum32 (\r
+  IN      CONST UINT32                 *Buffer,\r
+  IN      UINTN                                      Length\r
+  );\r
+\r
+\r
+/**\r
+  Returns the two's complement checksum of all elements in a buffer of\r
+  32-bit values.\r
+\r
+  This function first calculates the sum of the 32-bit values in the buffer\r
+  specified by Buffer and Length.  The carry bits in the result of addition\r
+  are dropped. Then, the two's complement of the sum is returned.  If Length\r
+  is 0, then 0 is returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 32-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 32-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the checksum operation.\r
+  @param  Length           The size, in bytes, of Buffer.\r
+\r
+  @return Checksum       The 2's complement checksum of Buffer.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+CalculateCheckSum32 (\r
+  IN      CONST UINT32                 *Buffer,\r
+  IN      UINTN                                      Length\r
+  );\r
+\r
+\r
+/**\r
+  Returns the sum of all elements in a buffer of 64-bit values.  During\r
+  calculation, the carry bits are dropped.\r
+\r
+  This function calculates the sum of the 64-bit values in the buffer\r
+  specified by Buffer and Length. The carry bits in result of addition are dropped.\r
+  The 64-bit result is returned.  If Length is 0, then 0 is returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 64-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 64-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the sum operation.\r
+  @param  Length           The size, in bytes, of Buffer.\r
+\r
+  @return Sum         The sum of Buffer with carry bits dropped during additions.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+CalculateSum64 (\r
+  IN      CONST UINT64                 *Buffer,\r
+  IN      UINTN                                      Length\r
+  );\r
+\r
+\r
+/**\r
+  Returns the two's complement checksum of all elements in a buffer of\r
+  64-bit values.\r
+\r
+  This function first calculates the sum of the 64-bit values in the buffer\r
+  specified by Buffer and Length.  The carry bits in the result of addition\r
+  are dropped. Then, the two's complement of the sum is returned.  If Length\r
+  is 0, then 0 is returned.\r
+\r
+  If Buffer is NULL, then ASSERT().\r
+  If Buffer is not aligned on a 64-bit boundary, then ASSERT().\r
+  If Length is not aligned on a 64-bit boundary, then ASSERT().\r
+  If Length is greater than (MAX_ADDRESS - Buffer + 1), then ASSERT().\r
+\r
+  @param  Buffer                       Pointer to the buffer to carry out the checksum operation.\r
+  @param  Length           The size, in bytes, of Buffer.\r
+\r
+  @return Checksum       The 2's complement checksum of Buffer.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+CalculateCheckSum64 (\r
+  IN      CONST UINT64                 *Buffer,\r
+  IN      UINTN                                      Length\r
+  );\r
+\r
+\r
+//\r
+// Base Library CPU Functions\r
+//\r
+typedef\r
+VOID\r
+(EFIAPI *SWITCH_STACK_ENTRY_POINT) (\r
+  IN      VOID                      *Context1,  OPTIONAL\r
+  IN      VOID                      *Context2   OPTIONAL\r
+  );\r
+\r
+\r
+/**\r
+  Used to serialize load and store operations.\r
+\r
+  All loads and stores that proceed calls to this function are guaranteed to be\r
+  globally visible when this function returns.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+MemoryFence (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Saves the current CPU context that can be restored with a call to LongJump()\r
+  and returns 0.\r
+\r
+  Saves the current CPU context in the buffer specified by JumpBuffer and\r
+  returns 0. The initial call to SetJump() must always return 0. Subsequent\r
+  calls to LongJump() cause a non-zero value to be returned by SetJump().\r
+\r
+  If JumpBuffer is NULL, then ASSERT().\r
+  For IPF CPUs, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().\r
+\r
+  @param  JumpBuffer  A pointer to CPU context buffer.\r
+\r
+  @retval 0 Indicates a return from SetJump().\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+SetJump (\r
+  OUT     BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer\r
+  );\r
+\r
+\r
+/**\r
+  Restores the CPU context that was saved with SetJump().\r
+\r
+  Restores the CPU context from the buffer specified by JumpBuffer. This\r
+  function never returns to the caller. Instead is resumes execution based on\r
+  the state of JumpBuffer.\r
+\r
+  If JumpBuffer is NULL, then ASSERT().\r
+  For IPF CPUs, if JumpBuffer is not aligned on a 16-byte boundary, then ASSERT().\r
+  If Value is 0, then ASSERT().\r
+\r
+  @param  JumpBuffer  A pointer to CPU context buffer.\r
+  @param  Value       The value to return when the SetJump() context is\r
+                      restored and must be non-zero.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+LongJump (\r
+  IN      BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer,\r
+  IN      UINTN                     Value\r
+  );\r
+\r
+\r
+/**\r
+  Enables CPU interrupts.\r
+\r
+  Enables CPU interrupts.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+EnableInterrupts (\r
+  VOID\r
+  );\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
+/**\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
+/**\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
+/**\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
+/**\r
+  Set the current CPU interrupt state.\r
+\r
+  Sets the current CPU interrupt state to the state specified by\r
+  InterruptState. If InterruptState is TRUE, then interrupts are enabled. If\r
+  InterruptState is FALSE, then interrupts are disabled. InterruptState is\r
+  returned.\r
+\r
+  @param  InterruptState  TRUE if interrupts should enabled. FALSE if\r
+                          interrupts should be disabled.\r
+\r
+  @return InterruptState\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+SetInterruptState (\r
+  IN      BOOLEAN                   InterruptState\r
+  );\r
+\r
+\r
+/**\r
+  Requests CPU to pause for a short period of time.\r
+\r
+  Requests CPU to pause for a short period of time. Typically used in MP\r
+  systems to prevent memory starvation while waiting for a spin lock.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+CpuPause (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Transfers control to a function starting with a new stack.\r
+\r
+  Transfers control to the function specified by EntryPoint using the\r
+  new stack specified by NewStack and passing in the parameters specified\r
+  by Context1 and Context2.  Context1 and Context2 are optional and may\r
+  be NULL.  The function EntryPoint must never return.  This function\r
+  supports a variable number of arguments following the NewStack parameter.\r
+  These additional arguments are ignored on IA-32, x64, and EBC.\r
+  IPF CPUs expect one additional parameter of type VOID * that specifies\r
+  the new backing store pointer.\r
+\r
+  If EntryPoint is NULL, then ASSERT().\r
+  If NewStack is NULL, then ASSERT().\r
+\r
+  @param  EntryPoint  A pointer to function to call with the new stack.\r
+  @param  Context1    A pointer to the context to pass into the EntryPoint\r
+                      function.\r
+  @param  Context2    A pointer to the context to pass into the EntryPoint\r
+                      function.\r
+  @param  NewStack    A pointer to the new stack to use for the EntryPoint\r
+                      function.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+SwitchStack (\r
+  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
+  IN      VOID                      *Context1,  OPTIONAL\r
+  IN      VOID                      *Context2,  OPTIONAL\r
+  IN      VOID                      *NewStack,\r
+  ...\r
+  );\r
+\r
+\r
+/**\r
+  Generates a breakpoint on the CPU.\r
+\r
+  Generates a breakpoint on the CPU. The breakpoint must be implemented such\r
+  that code can resume normal execution after the breakpoint.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+CpuBreakpoint (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Executes an infinite loop.\r
+\r
+  Forces the CPU to execute an infinite loop. A debugger may be used to skip\r
+  past the loop and the code that follows the loop must execute properly. This\r
+  implies that the infinite loop must not cause the code that follow it to be\r
+  optimized away.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+CpuDeadLoop (\r
+  VOID\r
+  );\r
+\r
+\r
+#if defined (MDE_CPU_IPF)\r
+\r
+/**\r
+  Flush a range of  cache lines in the cache coherency domain of the calling\r
+  CPU.\r
+\r
+  Invalidates the  cache lines specified by Address and Length. If Address is\r
+  not aligned on a cache line boundary, then entire cache line containing\r
+  Address is invalidated. If Address + Length is not aligned on a cache line\r
+  boundary, then the entire instruction cache line containing Address + Length\r
+  -1 is invalidated. This function may choose to invalidate the entire\r
+  instruction cache if that is more efficient than invalidating the specified\r
+  range. If Length is 0, the no instruction cache lines are invalidated.\r
+  Address is returned.\r
+\r
+  If Length is greater than (MAX_ADDRESS - Address + 1), then ASSERT().\r
+\r
+  @param  Address The base address of the instruction lines to invalidate. If\r
+                  the CPU is in a physical addressing mode, then Address is a\r
+                  physical address. If the CPU is in a virtual addressing mode,\r
+                  then Address is a virtual address.\r
+\r
+  @param  Length  The number of bytes to invalidate from the instruction cache.\r
+\r
+  @return Address\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+IpfFlushCacheRange (\r
+  IN      VOID                      *Address,\r
+  IN      UINTN                     Length\r
+  );\r
+\r
+\r
+/**\r
+  Executes a FC instruction\r
+  Executes a FC instruction on the cache line specified by Address.\r
+  The cache line size affected is at least 32-bytes (aligned on a 32-byte boundary).\r
+  An implementation may flush a larger region.  This function is only available on IPF.\r
+\r
+  @param Address       The Address of cache line to be flushed.\r
+\r
+  @return The address of FC instruction executed.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmFc (\r
+  IN  UINT64  Address\r
+  );\r
+\r
+\r
+/**\r
+  Executes a FC.I instruction.\r
+  Executes a FC.I instruction on the cache line specified by Address.\r
+  The cache line size affected is at least 32-bytes (aligned on a 32-byte boundary).\r
+  An implementation may flush a larger region.  This function is only available on IPF.\r
+\r
+  @param Address       The Address of cache line to be flushed.\r
+\r
+  @return The address of FC.I instruction executed.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmFci (\r
+  IN  UINT64  Address\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of a Processor Identifier Register (CPUID).\r
+  The Index of largest implemented CPUID (One less than the number of implemented CPUID\r
+  registers) is determined by CPUID [3] bits {7:0}.\r
+  No parameter checking is performed on Index.  If the Index value is beyond the\r
+  implemented CPUID register range, a Reserved Register/Field fault may occur.  The caller\r
+  must either guarantee that Index is valid, or the caller must set up fault handlers to\r
+  catch the faults.  This function is only available on IPF.\r
+\r
+  @param Index         The 8-bit Processor Identifier Register index to read.\r
+\r
+  @return The current value of Processor Identifier Register specified by Index.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadCpuid (\r
+  IN  UINT8   Index\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Processor Status Register (PSR).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of PSR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadPsr (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Processor Status Register (PSR).\r
+  No parameter checking is performed on Value.  All bits of Value corresponding to\r
+  reserved fields of PSR must be 0 or a Reserved Register/Field fault may occur.  The caller must either guarantee that Value is valid, or the caller must set up fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to PSR.\r
+\r
+  @return The 64-bit value written to the PSR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWritePsr (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #0 (KR0).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of KR0.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr0 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #1 (KR1).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of KR1.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr1 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #2 (KR2).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of KR2.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr2 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #3 (KR3).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of KR3.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr3 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #4 (KR4).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of KR4.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr4 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #5 (KR5).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of KR5.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr5 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #6 (KR6).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of KR6.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr6 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Kernel Register #7 (KR7).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of KR7.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadKr7 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #0 (KR0).\r
+  This function is only available on IPF.\r
+\r
+  @param  Value        The 64-bit value to write to KR0.\r
+\r
+  @return The 64-bit value written to the KR0.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr0 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #1 (KR1).\r
+  This function is only available on IPF.\r
+\r
+  @param  Value        The 64-bit value to write to KR1.\r
+\r
+  @return The 64-bit value written to the KR1.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr1 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #2 (KR2).\r
+  This function is only available on IPF.\r
+\r
+  @param  Value        The 64-bit value to write to KR2.\r
+\r
+  @return The 64-bit value written to the KR2.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr2 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #3 (KR3).\r
+  This function is only available on IPF.\r
+\r
+  @param  Value        The 64-bit value to write to KR3.\r
+\r
+  @return The 64-bit value written to the KR3.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr3 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #4 (KR4).\r
+  This function is only available on IPF.\r
+\r
+  @param  Value        The 64-bit value to write to KR4.\r
+\r
+  @return The 64-bit value written to the KR4.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr4 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #5 (KR5).\r
+  This function is only available on IPF.\r
+\r
+  @param  Value        The 64-bit value to write to KR5.\r
+\r
+  @return The 64-bit value written to the KR5.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr5 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #6 (KR6).\r
+  This function is only available on IPF.\r
+\r
+  @param  Value        The 64-bit value to write to KR6.\r
+\r
+  @return The 64-bit value written to the KR6.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr6 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Kernel Register #7 (KR7).\r
+  This function is only available on IPF.\r
+\r
+  @param  Value        The 64-bit value to write to KR7.\r
+\r
+  @return The 64-bit value written to the KR7.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteKr7 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Interval Timer Counter Register (ITC).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of ITC.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadItc (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Interval Timer Vector Register (ITV).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of ITV.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadItv (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Interval Timer Match Register (ITM).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of ITM.\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadItm (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Interval Timer Counter Register (ITC).\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to ITC.\r
+\r
+  @return The 64-bit value written to the ITC.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteItc (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Interval Timer Match Register (ITM).\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to ITM.\r
+\r
+  @return The 64-bit value written to the ITM.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteItm (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Interval Timer Vector Register (ITV).\r
+  No parameter checking is performed on Value.  All bits of Value corresponding to\r
+  reserved fields of ITV must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to ITV.\r
+\r
+  @return The 64-bit value written to the ITV.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteItv (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Default Control Register (DCR).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of DCR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadDcr (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Interruption Vector Address Register (IVA).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of IVA.\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadIva (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Page Table Address Register (PTA).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of PTA.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadPta (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Default Control Register (DCR).\r
+  No parameter checking is performed on Value.  All bits of Value corresponding to\r
+  reserved fields of DCR must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to DCR.\r
+\r
+  @return The 64-bit value written to the DCR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteDcr (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Interruption Vector Address Register (IVA).\r
+  The size of vector table is 32 K bytes and is 32 K bytes aligned\r
+  the low 15 bits of Value is ignored when written.\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to IVA.\r
+\r
+  @return The 64-bit value written to the IVA.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteIva (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Page Table Address Register (PTA).\r
+  No parameter checking is performed on Value.  All bits of Value corresponding to\r
+  reserved fields of DCR must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to PTA.\r
+\r
+  @return The 64-bit value written to the PTA.\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWritePta (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Local Interrupt ID Register (LID).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of LID.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadLid (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of External Interrupt Vector Register (IVR).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of IVR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadIvr (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Task Priority Register (TPR).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of TPR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadTpr (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of External Interrupt Request Register #0 (IRR0).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of IRR0.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadIrr0 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of External Interrupt Request Register #1 (IRR1).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of IRR1.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadIrr1 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of External Interrupt Request Register #2 (IRR2).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of IRR2.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadIrr2 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of External Interrupt Request Register #3 (IRR3).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of IRR3.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadIrr3 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Performance Monitor Vector Register (PMV).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of PMV.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadPmv (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Corrected Machine Check Vector Register (CMCV).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of CMCV.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadCmcv (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Local Redirection Register #0 (LRR0).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of LRR0.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadLrr0 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Local Redirection Register #1 (LRR1).\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of LRR1.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadLrr1 (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Page Local Interrupt ID Register (LID).\r
+  No parameter checking is performed on Value.  All bits of Value corresponding to\r
+  reserved fields of LID must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to LID.\r
+\r
+  @return The 64-bit value written to the LID.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteLid (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Task Priority Register (TPR).\r
+  No parameter checking is performed on Value.  All bits of Value corresponding to\r
+  reserved fields of TPR must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to TPR.\r
+\r
+  @return The 64-bit value written to the TPR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteTpr (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Performs a write operation on End OF External Interrupt Register (EOI).\r
+  Writes a value of 0 to the EOI Register.  This function is only available on IPF.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmWriteEoi (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Performance Monitor Vector Register (PMV).\r
+  No parameter checking is performed on Value.  All bits of Value corresponding\r
+  to reserved fields of PMV must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to PMV.\r
+\r
+  @return The 64-bit value written to the PMV.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWritePmv (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Corrected Machine Check Vector Register (CMCV).\r
+  No parameter checking is performed on Value.  All bits of Value corresponding\r
+  to reserved fields of CMCV must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to CMCV.\r
+\r
+  @return The 64-bit value written to the CMCV.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteCmcv (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Local Redirection Register #0 (LRR0).\r
+  No parameter checking is performed on Value.  All bits of Value corresponding\r
+  to reserved fields of LRR0 must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to LRR0.\r
+\r
+  @return The 64-bit value written to the LRR0.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteLrr0 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Local Redirection Register #1 (LRR1).\r
+  No parameter checking is performed on Value.  All bits of Value corresponding\r
+  to reserved fields of LRR1 must be 0 or a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Value is valid, or the caller must\r
+  set up fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Value         The 64-bit value to write to LRR1.\r
+\r
+  @return The 64-bit value written to the LRR1.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteLrr1 (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Instruction Breakpoint Register (IBR).\r
+  \r
+  The Instruction Breakpoint Registers are used in pairs.  The even numbered\r
+  registers contain breakpoint addresses, and the odd numbered registers contain\r
+  breakpoint mask conditions.  At least 4 instruction registers pairs are implemented\r
+  on all processor models.   Implemented registers are contiguous starting with\r
+  register 0.  No parameter checking is performed on Index, and if the Index value\r
+  is beyond the implemented IBR register range, a Reserved Register/Field fault may\r
+  occur.  The caller must either guarantee that Index is valid, or the caller must\r
+  set up fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Index         The 8-bit Instruction Breakpoint Register index to read.\r
+\r
+  @return The current value of Instruction Breakpoint Register specified by Index.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadIbr (\r
+  IN  UINT8   Index\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Data Breakpoint Register (DBR).\r
+\r
+  The Data Breakpoint Registers are used in pairs.  The even numbered registers\r
+  contain breakpoint addresses, and odd numbered registers contain breakpoint\r
+  mask conditions.  At least 4 data registers pairs are implemented on all processor\r
+  models.  Implemented registers are contiguous starting with register 0.\r
+  No parameter checking is performed on Index.  If the Index value is beyond\r
+  the implemented DBR register range, a Reserved Register/Field fault may occur.\r
+  The caller must either guarantee that Index is valid, or the caller must set up\r
+  fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Index         The 8-bit Data Breakpoint Register index to read.\r
+\r
+  @return The current value of Data Breakpoint Register specified by Index.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadDbr (\r
+  IN  UINT8   Index\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Performance Monitor Configuration Register (PMC).\r
+\r
+  All processor implementations provide at least 4 performance counters\r
+  (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter overflow\r
+  status registers (PMC [0]... PMC [3]).  Processor implementations may provide\r
+  additional implementation-dependent PMC and PMD to increase the number of\r
+  'generic' performance counters (PMC/PMD pairs).  The remainder of PMC and PMD\r
+  register set is implementation dependent.  No parameter checking is performed\r
+  on Index.  If the Index value is beyond the implemented PMC register range,\r
+  zero value will be returned.\r
+  This function is only available on IPF.\r
+\r
+  @param Index         The 8-bit Performance Monitor Configuration Register index to read.\r
+\r
+  @return The current value of Performance Monitor Configuration Register\r
+  specified by Index.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadPmc (\r
+  IN  UINT8   Index\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of Performance Monitor Data Register (PMD).\r
+\r
+  All processor implementations provide at least 4 performance counters\r
+  (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter\r
+  overflow status registers (PMC [0]... PMC [3]).  Processor implementations may\r
+  provide additional implementation-dependent PMC and PMD to increase the number\r
+  of 'generic' performance counters (PMC/PMD pairs).  The remainder of PMC and PMD\r
+  register set is implementation dependent.  No parameter checking is performed\r
+  on Index.  If the Index value is beyond the implemented PMD register range,\r
+  zero value will be returned.\r
+  This function is only available on IPF.\r
+\r
+  @param Index         The 8-bit Performance Monitor Data Register index to read.\r
+\r
+  @return The current value of Performance Monitor Data Register specified by Index.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadPmd (\r
+  IN  UINT8   Index\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Instruction Breakpoint Register (IBR).\r
+\r
+  Writes current value of Instruction Breakpoint Register specified by Index.\r
+  The Instruction Breakpoint Registers are used in pairs.  The even numbered\r
+  registers contain breakpoint addresses, and odd numbered registers contain\r
+  breakpoint mask conditions.  At least 4 instruction registers pairs are implemented\r
+  on all processor models.  Implemented registers are contiguous starting with\r
+  register 0.  No parameter checking is performed on Index.  If the Index value\r
+  is beyond the implemented IBR register range, a Reserved Register/Field fault may\r
+  occur.  The caller must either guarantee that Index is valid, or the caller must\r
+  set up fault handlers to catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Index         The 8-bit Instruction Breakpoint Register index to write.\r
+  @param Value         The 64-bit value to write to IBR.\r
+\r
+  @return The 64-bit value written to the IBR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteIbr (\r
+  IN UINT8   Index,\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Data Breakpoint Register (DBR).\r
+\r
+  Writes current value of Data Breakpoint Register specified by Index.\r
+  The Data Breakpoint Registers are used in pairs.  The even numbered registers\r
+  contain breakpoint addresses, and odd numbered registers contain breakpoint\r
+  mask conditions.  At least 4 data registers pairs are implemented on all processor\r
+  models.  Implemented registers are contiguous starting with register 0.  No parameter\r
+  checking is performed on Index.  If the Index value is beyond the implemented\r
+  DBR register range, a Reserved Register/Field fault may occur.  The caller must\r
+  either guarantee that Index is valid, or the caller must set up fault handlers to\r
+  catch the faults.\r
+  This function is only available on IPF.\r
+\r
+  @param Index         The 8-bit Data Breakpoint Register index to write.\r
+  @param Value         The 64-bit value to write to DBR.\r
+\r
+  @return The 64-bit value written to the DBR.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteDbr (\r
+  IN UINT8   Index,\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Performance Monitor Configuration Register (PMC).\r
+\r
+  Writes current value of Performance Monitor Configuration Register specified by Index.\r
+  All processor implementations provide at least 4 performance counters\r
+  (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter overflow status\r
+  registers (PMC [0]... PMC [3]).  Processor implementations may provide additional\r
+  implementation-dependent PMC and PMD to increase the number of 'generic' performance\r
+  counters (PMC/PMD pairs).  The remainder of PMC and PMD register set is implementation\r
+  dependent.  No parameter checking is performed on Index.  If the Index value is\r
+  beyond the implemented PMC register range, the write is ignored.\r
+  This function is only available on IPF.\r
+\r
+  @param Index         The 8-bit Performance Monitor Configuration Register index to write.\r
+  @param Value         The 64-bit value to write to PMC.\r
+\r
+  @return The 64-bit value written to the PMC.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWritePmc (\r
+  IN UINT8   Index,\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Writes the current value of 64-bit Performance Monitor Data Register (PMD).\r
+\r
+  Writes current value of Performance Monitor Data Register specified by Index.\r
+  All processor implementations provide at least 4 performance counters\r
+  (PMC/PMD [4]...PMC/PMD [7] pairs), and 4 performance monitor counter overflow\r
+  status registers (PMC [0]... PMC [3]).  Processor implementations may provide\r
+  additional implementation-dependent PMC and PMD to increase the number of 'generic'\r
+  performance counters (PMC/PMD pairs).  The remainder of PMC and PMD register set\r
+  is implementation dependent.  No parameter checking is performed on Index.  If the\r
+  Index value is beyond the implemented PMD register range, the write is ignored.\r
+  This function is only available on IPF.\r
+\r
+  @param Index         The 8-bit Performance Monitor Data Register index to write.\r
+  @param Value         The 64-bit value to write to PMD.\r
+\r
+  @return The 64-bit value written to the PMD.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWritePmd (\r
+  IN UINT8   Index,\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Global Pointer (GP).\r
+\r
+  Reads and returns the current value of GP.\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of GP.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadGp (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Write the current value of 64-bit Global Pointer (GP).\r
+\r
+  Writes the current value of GP. The 64-bit value written to the GP is returned.\r
+  No parameter checking is performed on Value.\r
+  This function is only available on IPF.\r
+\r
+  @param Value  The 64-bit value to write to GP.\r
+\r
+  @return The 64-bit value written to the GP.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmWriteGp (\r
+  IN UINT64  Value\r
+  );\r
+\r
+\r
+/**\r
+  Reads the current value of 64-bit Stack Pointer (SP).\r
+\r
+  Reads and returns the current value of SP.\r
+  This function is only available on IPF.\r
+\r
+  @return The current value of SP.\r
+\r
+**/\r
+UINT64\r
+EFIAPI\r
+AsmReadSp (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Determines if the CPU is currently executing in virtual, physical, or mixed mode.\r
+\r
+  Determines the current execution mode of the CPU.\r
+  If the CPU is in virtual mode(PSR.RT=1, PSR.DT=1, PSR.IT=1), then 1 is returned.\r
+  If the CPU is in physical mode(PSR.RT=0, PSR.DT=0, PSR.IT=0), then 0 is returned.\r
+  If the CPU is not in physical mode or virtual mode, then it is in mixed mode,\r
+  and -1 is returned.\r
+  This function is only available on IPF.\r
+\r
+  @return  1  The CPU is in virtual mode.\r
+  @return  0  The CPU is in physical mode.\r
+  @return -1  The CPU is in mixed mode.\r
+\r
+**/\r
+INT64\r
+EFIAPI\r
+AsmCpuVirtual (\r
+  VOID\r
+  );\r
+\r
+\r
+/**\r
+  Makes a PAL procedure call.\r
+\r
+  This is a wrapper function to make a PAL procedure call.  Based on the Index\r
+  value this API will make static or stacked PAL call.  The following table\r
+  describes the usage of PAL Procedure Index Assignment. Architected procedures\r
+  may be designated as required or optional.  If a PAL procedure is specified\r
+  as optional, a unique return code of 0xFFFFFFFFFFFFFFFF is returned in the\r
+  Status field of the PAL_CALL_RETURN structure.\r
+  This indicates that the procedure is not present in this PAL implementation.\r
+  It is the caller's responsibility to check for this return code after calling\r
+  any optional PAL procedure.\r
+  No parameter checking is performed on the 5 input parameters, but there are\r
+  some common rules that the caller should follow when making a PAL call.  Any\r
+  address passed to PAL as buffers for return parameters must be 8-byte aligned.\r
+  Unaligned addresses may cause undefined results.  For those parameters defined\r
+  as reserved or some fields defined as reserved must be zero filled or the invalid\r
+  argument return value may be returned or undefined result may occur during the\r
+  execution of the procedure.  If the PalEntryPoint  does not point to a valid\r
+  PAL entry point then the system behavior is undefined.  This function is only\r
+  available on IPF.\r
+\r
+  @param PalEntryPoint The PAL procedure calls entry point.\r
+  @param Index                     The PAL procedure Index number.\r
+  @param Arg2                        The 2nd parameter for PAL procedure calls.\r
+  @param Arg3                        The 3rd parameter for PAL procedure calls.\r
+  @param Arg4                        The 4th parameter for PAL procedure calls.\r
+\r
+  @return structure returned from the PAL Call procedure, including the status and return value.\r
+\r
+**/\r
+PAL_CALL_RETURN\r
+EFIAPI\r
+AsmPalCall (\r
+  IN UINT64  PalEntryPoint,\r
+  IN UINT64  Index,\r
+  IN UINT64  Arg2,\r
+  IN UINT64  Arg3,\r
+  IN UINT64  Arg4\r
+  );\r
+\r
+\r
+/**\r
+  Transfers control to a function starting with a new stack.\r
+\r
+  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
+\r
+//\r
+// Bugbug: This call should be removed after\r
+//         the PalCall Instance issue has been fixed.\r
+//\r
+/**\r
+  Performs a PAL call using static calling convention.\r
+\r
+  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_CALL_RETURN\r
+PalCallStatic (\r
+  IN      CONST VOID                *PalEntryPoint,\r
+  IN      UINT64                    Arg1,\r
+  IN      UINT64                    Arg2,\r
+  IN      UINT64                    Arg3,\r
+  IN      UINT64                    Arg4\r
+  );\r
+\r
+\r
+#elif defined (MDE_CPU_IA32) || defined (MDE_CPU_X64)\r
+//\r
+// IA32 and X64 Specific Functions\r
+//\r
+//\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
+/**\r
+  Retrieves CPUID information using an extended leaf identifier.\r
+\r
+  Executes the CPUID instruction with EAX set to the value specified by Index\r
+  and ECX set to the value specified by SubIndex. This function always returns\r
+  Index. This function is only available on IA-32 and x64.\r
+\r
+  If Eax is not NULL, then the value of EAX after CPUID is returned in Eax.\r
+  If Ebx is not NULL, then the value of EBX after CPUID is returned in Ebx.\r
+  If Ecx is not NULL, then the value of ECX after CPUID is returned in Ecx.\r
+  If Edx is not NULL, then the value of EDX after CPUID is returned in Edx.\r
+\r
+  @param  Index     The 32-bit value to load into EAX prior to invoking the\r
+                    CPUID instruction.\r
+  @param  SubIndex  The 32-bit value to load into ECX prior to invoking the\r
+                    CPUID instruction.\r
+  @param  Eax       Pointer to the 32-bit EAX value returned by the CPUID\r
+                    instruction. This is an optional parameter that may be\r
+                    NULL.\r
+  @param  Ebx       Pointer to the 32-bit EBX value returned by the CPUID\r
+                    instruction. This is an optional parameter that may be\r
+                    NULL.\r
+  @param  Ecx       Pointer to the 32-bit ECX value returned by the CPUID\r
+                    instruction. This is an optional parameter that may be\r
+                    NULL.\r
+  @param  Edx       Pointer to the 32-bit EDX value returned by the CPUID\r
+                    instruction. This is an optional parameter that may be\r
+                    NULL.\r
+\r
+  @return Index\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+AsmCpuidEx (\r
+  IN      UINT32                    Index,\r
+  IN      UINT32                    SubIndex,\r
+  OUT     UINT32                    *Eax,  OPTIONAL\r
+  OUT     UINT32                    *Ebx,  OPTIONAL\r
+  OUT     UINT32                    *Ecx,  OPTIONAL\r
+  OUT     UINT32                    *Edx   OPTIONAL\r
+  );\r
+\r
+\r
+/**\r
+  Returns the lower 32-bits of a Machine Specific Register(MSR).\r
+\r
+  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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+/**\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
+//\r
+// 16-bit thunking services\r
+//\r
+\r
+/**\r
+  Retrieves the properties for 16-bit thunk functions.\r
+\r
+  Computes the size of the buffer and stack below 1MB required to use the\r
+  AsmPrepareThunk16(), AsmThunk16() and AsmPrepareAndThunk16() functions. This\r
+  buffer size is returned in RealModeBufferSize, and the stack size is returned\r
+  in ExtraStackSize. If parameters are passed to the 16-bit real mode code,\r
+  then the actual minimum stack size is ExtraStackSize plus the maximum number\r
+  of bytes that need to be passed to the 16-bit real mode code.\r
+\r
+  If RealModeBufferSize is NULL, then ASSERT().\r
+  If ExtraStackSize is NULL, then ASSERT().\r
+\r
+  @param  RealModeBufferSize  A pointer to the size of the buffer below 1MB\r
+                              required to use the 16-bit thunk functions.\r
+  @param  ExtraStackSize      A pointer to the extra size of stack below 1MB\r
+                              that the 16-bit thunk functions require for\r
+                              temporary storage in the transition to and from\r
+                              16-bit real mode.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+AsmGetThunk16Properties (\r
+  OUT     UINT32                    *RealModeBufferSize,\r
+  OUT     UINT32                    *ExtraStackSize\r
+  );\r
+\r
+\r
+/**\r
+  Prepares all structures a code required to use AsmThunk16().\r
+\r
+  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
+/**\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
+/**\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
+#else\r
+\r
+#endif\r
+\r
+#endif\r
+\r
+\r
index e0004c38acd1e8865aab12441b6abe46c8d83fca..c0b06e4b3f174e3460e3743aea089774e7032854 100644 (file)
@@ -1069,7 +1069,7 @@ typedef struct {
 \r
   PAL Procedure - PAL_FIXED_ADDR.\r
 \r
-  Return the fixed component of a processor¡¯s directed address.\r
+  Return the fixed component of a processor's directed address.\r
   It is required by IPF. It is required by IPF. The PAL\r
   procedure supports the Static Registers calling convention. It\r
   could be called at physical mode and virtual mode.\r
@@ -3239,7 +3239,7 @@ typedef struct {
 /**\r
 \r
   @param Mode  Bit2:0, Indicates the mode of operation for this\r
-               procedure: 0 - Query mode 1 ¨C Error inject mode\r
+               procedure: 0 - Query mode 1 - Error inject mode\r
                (err_inj should also be specified) 2 - Cancel\r
                outstanding trigger. All other fields in\r
                PAL_MC_ERROR_TYPE_INFO,\r
@@ -3409,7 +3409,7 @@ typedef struct {
 \r
 /**\r
 \r
-   Buffer Pointed to by err_data_buffer ¨C TLB\r
+   Buffer Pointed to by err_data_buffer - TLB\r
 \r
 **/\r
 typedef struct {\r
@@ -3865,7 +3865,7 @@ typedef struct {
                       when transitioning to virtual mode\r
                       operations.\r
 \r
-  @return R9    Virtualization Service Address ¨C VSA specifies\r
+  @return R9    Virtualization Service Address - VSA specifies\r
                 the virtual base address of the PAL\r
                 virtualization services in this virtual\r
                 environment.\r
@@ -4037,7 +4037,7 @@ typedef struct {
   as required or optional.  If a PAL procedure is specified as optional, a unique return\r
   code of 0xFFFFFFFFFFFFFFFF is returned in the Status field of the PAL_CALL_RETURN structure.\r
   This indicates that the procedure is not present in this PAL implementation.  It is the\r
-  caller¡¯s responsibility to check for this return code after calling any optional PAL\r
+  caller's responsibility to check for this return code after calling any optional PAL\r
   procedure. No parameter checking is performed on the 4 input parameters, but there are\r
   some common rules that the caller should follow when making a PAL call.  Any address\r
   passed to PAL as buffers for return parameters must be 8-byte aligned.  Unaligned addresses\r
index f7a0ba01669ed37e3e266f4754ef9dd027a8a597..b2a47fb40c28ef1bd53348cd30436b0fae301068 100644 (file)
@@ -91,7 +91,7 @@ typedef struct {
   EFI_HOB_GENERIC_HEADER            Header;\r
   EFI_HOB_MEMORY_ALLOCATION_HEADER  AllocDescriptor;\r
   //\r
-  // Additional data pertaining to the ¡°Name¡± Guid memory\r
+  // Additional data pertaining to the "Name" Guid memory\r
   // may go here.\r
   //\r
 } EFI_HOB_MEMORY_ALLOCATION;\r
@@ -109,7 +109,7 @@ typedef struct {
 \r
 //\r
 // Defines the location of the boot-strap \r
-// processor (BSP) BSPStore (¡°Backing Store Pointer Store¡±).\r
+// processor (BSP) BSPStore ("Backing Store Pointer Store").\r
 // This HOB is valid for the Itanium processor family only \r
 // register overflow store.\r
 // \r
index 1c013bea2d1d7b60ab2f53883183db44a9286fe0..87b893ccd2724884252fc3f3b04efe3b9f9cfb62 100644 (file)
@@ -60,7 +60,7 @@ EFI_STATUS
 \r
 \r
 /**                                                              \r
-  This PPI¡¯s single member function decompresses a compression\r
+  This PPI's single member function decompresses a compression\r
   encapsulated section. It is used by the PEI Foundation to\r
   process sectioned files. Prior to the installation of this PPI,\r
   compression sections will be ignored.\r
index f4f85086ca480211e592ca2bba14da1bfcbc5b60..566d5f121e2fbe9d5710b432f2eb08973bd752ce 100644 (file)
@@ -33,12 +33,12 @@ typedef struct _EFI_PEI_READ_ONLY_VARIABLE2_PPI  EFI_PEI_READ_ONLY_VARIABLE2_PPI
 \r
   @param  This            A pointer to this instance of the EFI_PEI_READ_ONLY_VARIABLE2_PPI.\r
 \r
-  @param  VariableName    A pointer to a null-terminated string that is the variable¡¯s name.\r
+  @param  VariableName    A pointer to a null-terminated string that is the variable's name.\r
 \r
-  @param  VendorGuid      A pointer to an EFI_GUID that is the variable¡¯s GUID. The combination of\r
+  @param  VendorGuid      A pointer to an EFI_GUID that is the variable's GUID. The combination of\r
                           VariableGuid and VariableName must be unique.\r
 \r
-  @param  Attributes      If non-NULL, on return, points to the variable¡¯s attributes. See ¡°Related Definitons¡±\r
+  @param  Attributes      If non-NULL, on return, points to the variable's attributes. See "Related Definitons"\r
                           below for possible attribute values.\r
 \r
   @param  DataSize        On entry, points to the size in bytes of the Data buffer. On return, points to the size of\r
@@ -84,11 +84,11 @@ EFI_STATUS
 \r
   @param  VariableNameSize  On entry, points to the size of the buffer pointed to by VariableName.\r
 \r
-  @param  VariableName      On entry, a pointer to a null-terminated string that is the variable¡¯s name.\r
-                            On return, points to the next variable¡¯s null-terminated name string.\r
+  @param  VariableName      On entry, a pointer to a null-terminated string that is the variable's name.\r
+                            On return, points to the next variable's null-terminated name string.\r
 \r
-  @param  VendorGuid        On entry, a pointer to an UEFI _GUID that is the variable¡¯s GUID. \r
-                            On return, a pointer to the next variable¡¯s GUID.\r
+  @param  VendorGuid        On entry, a pointer to an UEFI _GUID that is the variable's GUID. \r
+                            On return, a pointer to the next variable's GUID.\r
 \r
 \r
   @retval EFI_SUCCESS           The variable was read successfully.\r
index 644416f6e5df4bbc5c3e11c3971591f145871473..df9bbac93fc82192bb78486d7fd6997ebb50418a 100644 (file)
@@ -308,7 +308,7 @@ EFI_STATUS
   EFI_HII_OUT_FLAG_CLIP_CLEAN_X is set. This flag cannot be used\r
   with EFI_HII_OUT_FLAG_CLIP_CLEAN_X. If\r
   EFI_HII_OUT_FLAG_TRANSPARENT is set, then BackgroundColor is\r
-  ignored and all off¡± pixels in the character¡¯s glyph will\r
+  ignored and all off" pixels in the character's glyph will\r
   use the pixel value from Blt. This flag cannot be used if Blt\r
   is NULL upon entry. If EFI_HII_IGNORE_IF_NO_GLYPH is set, then\r
   characters which have no glyphs are not drawn. Otherwise, they\r
index c1f346de29619b7773c8052c52c44bc606ca76b3..686e271c8288b9e94964b4764b73c136018a3569 100644 (file)
@@ -268,7 +268,7 @@ EFI_STATUS
   configuration information from the platform. For every call to\r
   Query() there must be a matching call to Response() so the\r
   UEFI driver can inform the platform how it used the\r
-  information passed in from Query(). It¡¯s legal for a UEFI\r
+  information passed in from Query(). It's legal for a UEFI\r
   driver to use Response() to inform the platform it does not\r
   understand the data returned via Query() and thus no action was\r
   taken.\r
index 5fe9a2e0bb9750d937aa6f921b70886b951beac0..2d67d33fe3bfab5246517e5fc51fb501269c2659 100644 (file)
@@ -1,16 +1,16 @@
-/** @file
+/** @file\r
   TCG Service Protocol as defined in TCG_EFI_Protocol_1_20_Final\r
-  See http://trustedcomputinggroup.org for the latest specification
-
-  Copyright (c) 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.
-
+  See http://trustedcomputinggroup.org for the latest specification\r
+\r
+  Copyright (c) 2007, Intel Corporation\r
+  All rights reserved. This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
 **/\r
 \r
 #ifndef _TCG_SERVICE_PROTOCOL_H_\r
@@ -213,7 +213,7 @@ EFI_STATUS
   @param  LogEvent           This service abstracts the capability to add \r
                              an entry to the Event Log.\r
   @param  PassThroughToTPM   This service provides a pass-through capability \r
-                             from the caller to the system¡¯s TPM.\r
+                             from the caller to the system's TPM.\r
   @param  HashLogExtendEvent This service abstracts the capability to do a hash \r
                              operation on a data buffer, extend a specific TPM PCR \r
                              with the hash result, and add an entry to the Event Log. \r
index dd7247fe8d5d1c2ee529553a4b96c28d1a7a9414..d30a0968939c4ab73ededf5612c4fe57bde71115 100644 (file)
@@ -1397,8 +1397,8 @@ typedef struct {
 #define EFI_AFFECTED_BY_STANDARD_SHIFT       0x0001\r
 //\r
 // This key is affected by the caps lock so that if a keyboard driver\r
-// would need to disambiguate between a key which had a ¡°1¡± defined\r
-// versus a ¡°a¡± character.  Having this bit turned on would tell\r
+// would need to disambiguate between a key which had a "1" defined\r
+// versus a "a" character.  Having this bit turned on would tell\r
 // the keyboard driver to use the appropriate shifted state or not.\r
 //\r
 #define EFI_AFFECTED_BY_CAPS_LOCK            0x0002\r
index b356c359476c6eba89e1fda0fe61657c3846d58b..3d55a2cb27d3aed8591ca70b87a92f48c20933c7 100644 (file)
@@ -318,7 +318,7 @@ EFI_STATUS
 \r
 \r
 //\r
-// These types can be ORed together as needed ¨C for example,\r
+// These types can be ORed together as needed - for example,\r
 // EVT_TIMER might be Ored with EVT_NOTIFY_WAIT or\r
 // EVT_NOTIFY_SIGNAL.\r
 //\r
@@ -341,7 +341,7 @@ EFI_STATUS
 #define EFI_EVENT_SIGNAL_VIRTUAL_ADDRESS_CHANGE     EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE\r
 \r
 //\r
-// The event¡¯s NotifyContext pointer points to a runtime memory\r
+// The event's NotifyContext pointer points to a runtime memory\r
 // address.\r
 // The event is deprecated in UEFI2.0 and later specifications.\r
 //\r
index 9e70a787291b35c706c993783731fad8063a46e3..ba0072dd939c233566bc9eee6fd383879e5c4080 100644 (file)
@@ -28,7 +28,7 @@
 //  as optional, a unique return code of 0xFFFFFFFFFFFFFFFF is returned in the\r
 //  Status field of the PAL_CALL_RETURN structure.\r
 //  This indicates that the procedure is not present in this PAL implementation.\r
-//  It is the caller¡¯s responsibility to check for this return code after calling\r
+//  It is the caller's responsibility to check for this return code after calling\r
 //  any optional PAL procedure.\r
 //  No parameter checking is performed on the 5 input parameters, but there are\r
 //  some common rules that the caller should follow when making a PAL call.  Any\r
index 0c1d137d67f6869d6d01cd57c49184ba37751ba9..74c33067ee2bd052a60223de64e085b1a9ecce12 100644 (file)
@@ -24,7 +24,7 @@
   as required or optional.  If a PAL procedure is specified as optional, a unique return\r
   code of 0xFFFFFFFFFFFFFFFF is returned in the Status field of the PAL_CALL_RETURN structure.\r
   This indicates that the procedure is not present in this PAL implementation.  It is the\r
-  caller¡¯s responsibility to check for this return code after calling any optional PAL\r
+  caller's responsibility to check for this return code after calling any optional PAL\r
   procedure. No parameter checking is performed on the 4 input parameters, but there are\r
   some common rules that the caller should follow when making a PAL call.  Any address\r
   passed to PAL as buffers for return parameters must be 8-byte aligned.  Unaligned addresses\r
index eeb30d617d31349837fa1385504a47effcbc0735..b1a9b10cb7f9214dbc7778209d0d0fa0e048c5ce 100644 (file)
@@ -33,7 +33,7 @@
   as required or optional.  If a PAL procedure is specified as optional, a unique return\r
   code of 0xFFFFFFFFFFFFFFFF is returned in the Status field of the PAL_CALL_RETURN structure.\r
   This indicates that the procedure is not present in this PAL implementation.  It is the\r
-  caller¡¯s responsibility to check for this return code after calling any optional PAL\r
+  caller's responsibility to check for this return code after calling any optional PAL\r
   procedure. No parameter checking is performed on the 4 input parameters, but there are\r
   some common rules that the caller should follow when making a PAL call.  Any address\r
   passed to PAL as buffers for return parameters must be 8-byte aligned.  Unaligned addresses\r