public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Wu, Hao A" <hao.a.wu@intel.com>
To: "Ni, Ruiyu" <ruiyu.ni@intel.com>,
	"edk2-devel@lists.01.org" <edk2-devel@lists.01.org>
Cc: "Gao, Liming" <liming.gao@intel.com>
Subject: Re: [PATCH] EmulatorPkg: formalize line endings
Date: Wed, 29 Aug 2018 05:06:11 +0000	[thread overview]
Message-ID: <B80AF82E9BFB8E4FBD8C89DA810C6A0931E3CEAB@SHSMSX104.ccr.corp.intel.com> (raw)
In-Reply-To: <20180829033955.105432-1-ruiyu.ni@intel.com>

Reviewed-by: Hao Wu <hao.a.wu@intel.com>

Best Regards,
Hao Wu


> -----Original Message-----
> From: Ni, Ruiyu
> Sent: Wednesday, August 29, 2018 11:40 AM
> To: edk2-devel@lists.01.org
> Cc: Wu, Hao A; Gao, Liming
> Subject: [PATCH] EmulatorPkg: formalize line endings
> 
> The patch is the result of running
> "BaseTools/Scripts/FormatDosFiles.py EmulatorPkg/"
> 
> No functionality impact.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
> Cc: Hao A Wu <hao.a.wu@intel.com>
> Cc: Liming Gao <liming.gao@intel.com>
> ---
>  EmulatorPkg/CpuRuntimeDxe/Cpu.c                    |   24 +-
>  EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c             |    2 +-
>  EmulatorPkg/EmuGopDxe/Gop.h                        |  390 +--
>  EmulatorPkg/EmuGopDxe/GopInput.c                   | 1800 +++++------
>  EmulatorPkg/EmuGopDxe/GopScreen.c                  |  832 ++---
>  EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c                  |    2 +-
>  EmulatorPkg/Include/Library/EmuMagicPageLib.h      |   76 +-
>  EmulatorPkg/Include/Library/EmuThunkLib.h          |   84 +-
>  EmulatorPkg/Include/Library/PpiListLib.h           |   42 +-
>  EmulatorPkg/Include/Library/SmbiosLib.h            |  404 +--
>  EmulatorPkg/Include/Protocol/EmuBlockIo.h          |    2 +-
>  EmulatorPkg/Include/Protocol/EmuFileSystem.h       |  280 +-
>  EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h   |  268 +-
>  .../Library/DevicePathTextLib/DevicePathTextLib.c  |    2 +-
>  .../DevicePathTextLib/DevicePathTextLib.inf        |    2 +-
>  EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c          |    2 +-
>  .../DxeEmuPeCoffExtraActionLib.inf                 |   96 +-
>  .../DxeEmuStdErrSerialPortLib.c                    |    2 +-
>  EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c  |    2 +-
>  .../PeiServicesTablePointer.c                      |   12 +-
>  .../PeiEmuPeCoffExtraActionLib.inf                 |   98 +-
>  .../PeiServicesTablePointer.c                      |   12 +-
>  .../PeiServicesTablePointer.c                      |   12 +-
>  EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf    |    2 +-
>  EmulatorPkg/Library/SecPeiServicesLib/FwVol.c      |  562 ++--
>  EmulatorPkg/Library/SecPpiListLib/PpiListLib.c     |   34 +-
>  EmulatorPkg/Library/SmbiosLib/SmbiosLib.c          |  704 ++---
>  EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf        |   94 +-
>  .../MiscSubClassPlatformDxe/MiscSubClassDriver.h   |    4 +-
>  .../MiscSubclassDriverEntryPoint.c                 |    4 +-
>  EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c  |   18 +-
>  .../PlatformSmbiosDxe/PlatformSmbiosDxe.inf        |    4 +-
>  EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c        |   26 +-
>  EmulatorPkg/Sec/Ia32/SwitchRam.asm                 |   26 +-
>  EmulatorPkg/Sec/Sec.c                              |  298 +-
>  EmulatorPkg/Sec/Sec.h                              |  102 +-
>  EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c       |   78 +-
>  EmulatorPkg/Unix/Host/BlockIo.c                    |    2 +-
>  EmulatorPkg/Unix/Host/EmuThunk.c                   |  880 +++---
>  EmulatorPkg/Unix/Host/Host.c                       |   14 +-
>  EmulatorPkg/Unix/Host/Host.h                       |    2 +-
>  EmulatorPkg/Unix/Host/Ia32/Gasket.S                | 2984 +++++++++---------
>  EmulatorPkg/Unix/Host/Ia32/SwitchStack.c           |  148 +-
>  EmulatorPkg/Unix/Host/MemoryAllocationLib.c        |  290 +-
>  EmulatorPkg/Unix/Host/PosixFileSystem.c            | 3112 +++++++++----------
>  EmulatorPkg/Unix/Host/Pthreads.c                   |  470 +--
>  EmulatorPkg/Unix/Host/X11GraphicsWindow.c          | 2056 ++++++------
>  EmulatorPkg/Unix/Host/X64/Gasket.S                 | 3262 ++++++++++----------
>  EmulatorPkg/Unix/lldbefi.py                        | 1080 +++----
>  EmulatorPkg/Win/Host/WinBlockIo.c                  |    2 +-
>  EmulatorPkg/Win/Host/WinHost.h                     |    2 +-
>  51 files changed, 10353 insertions(+), 10353 deletions(-)
> 
> diff --git a/EmulatorPkg/CpuRuntimeDxe/Cpu.c
> b/EmulatorPkg/CpuRuntimeDxe/Cpu.c
> index 47fb7f07e8..83e876509a 100644
> --- a/EmulatorPkg/CpuRuntimeDxe/Cpu.c
> +++ b/EmulatorPkg/CpuRuntimeDxe/Cpu.c
> @@ -63,7 +63,7 @@ SMBIOS_TABLE_TYPE4 mCpuSmbiosType4 = {
>        0, //  ProcessorXModel:    4;
>        0, //  ProcessorXFamily:   8;
>        0, //  ProcessorReserved2: 4;
> -    },
> +    },
>      {  // PROCESSOR_FEATURE_FLAGS
>        0, //  ProcessorFpu       :1;
>        0, //  ProcessorVme       :1;
> @@ -100,13 +100,13 @@ SMBIOS_TABLE_TYPE4 mCpuSmbiosType4 = {
>    },
>    3,                    // ProcessorVersion String;
>    {                     // Voltage;
> -    1,  // ProcessorVoltageCapability5V        :1;
> -    1,  // ProcessorVoltageCapability3_3V      :1;
> -    1,  // ProcessorVoltageCapability2_9V      :1;
> +    1,  // ProcessorVoltageCapability5V        :1;
> +    1,  // ProcessorVoltageCapability3_3V      :1;
> +    1,  // ProcessorVoltageCapability2_9V      :1;
>      0,  // ProcessorVoltageCapabilityReserved  :1; ///< Bit 3, must be zero.
>      0,  // ProcessorVoltageReserved            :3; ///< Bits 4-6, must be zero.
>      0   // ProcessorVoltageIndicateLegacy      :1;
> -  },
> +  },
>    0,                      // ExternalClock;
>    0,                      // MaxSpeed;
>    0,                      // CurrentSpeed;
> @@ -151,26 +151,26 @@ CHAR8 *mCpuSmbiosType4Strings[] = {
>      "Not Found",
>      NULL
>    };
> -
> +
>    ...
>    LogSmbiosData (
> -    (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
> +    (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
>      gSmbiosType12Strings
>      );
> 
>    @param  Template    Fixed SMBIOS structure, required.
> -  @param  StringArray Array of strings to convert to an SMBIOS string pack.
> +  @param  StringArray Array of strings to convert to an SMBIOS string pack.
>                        NULL is OK.
> 
>  **/
>  EFI_STATUS
>  LogSmbiosData (
>    IN  EFI_SMBIOS_TABLE_HEADER *Template,
> -  IN  CHAR8                   **StringPack
> +  IN  CHAR8                   **StringPack
>    )
>  {
>    EFI_STATUS                Status;
> -  EFI_SMBIOS_PROTOCOL       *Smbios;
> +  EFI_SMBIOS_PROTOCOL       *Smbios;
>    EFI_SMBIOS_HANDLE         SmbiosHandle;
>    EFI_SMBIOS_TABLE_HEADER   *Record;
>    UINTN                     Index;
> @@ -219,7 +219,7 @@ LogSmbiosData (
>      Str += StringSize;
>    }
>    *Str = 0;
> -
> +
>    SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
>    Status = Smbios->Add (
>                       Smbios,
> @@ -228,7 +228,7 @@ LogSmbiosData (
>                       Record
>                       );
>    ASSERT_EFI_ERROR (Status);
> -
> +
>    FreePool (Record);
>    return Status;
>  }
> diff --git a/EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c
> b/EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c
> index e77de2c7bc..b9ac6ce080 100644
> --- a/EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c
> +++ b/EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c
> @@ -61,7 +61,7 @@ EmuBlockIo2Reset (
>    @param[in]       MediaId    Id of the media, changes every time the media is
>                                replaced.
>    @param[in]       Lba        The starting Logical Block Address to read from.
> -  @param[in, out]  Token	    A pointer to the token associated with the
> transaction.
> +  @param[in, out]  Token      A pointer to the token associated with the
> transaction.
>    @param[in]       BufferSize Size of Buffer, must be a multiple of device block
> size.
>    @param[out]      Buffer     A pointer to the destination buffer for the data.
> The
>                                caller is responsible for either having implicit or
> diff --git a/EmulatorPkg/EmuGopDxe/Gop.h b/EmulatorPkg/EmuGopDxe/Gop.h
> index 6f7b082618..3b533013ce 100644
> --- a/EmulatorPkg/EmuGopDxe/Gop.h
> +++ b/EmulatorPkg/EmuGopDxe/Gop.h
> @@ -1,195 +1,195 @@
> -/*++ @file
> -
> -Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
> -Portions copyright (c) 2010,Apple Inc. All rights reserved.<BR>
> -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 __UGA_H_
> -#define __UGA_H_
> -
> -#include <PiDxe.h>
> -
> -#include <Protocol/GraphicsOutput.h>
> -#include <Protocol/SimpleTextIn.h>
> -#include <Protocol/SimpleTextInEx.h>
> -#include <Protocol/SimplePointer.h>
> -#include <Protocol/EmuIoThunk.h>
> -#include <Protocol/EmuGraphicsWindow.h>
> -
> -#include <Guid/EventGroup.h>
> -
> -#include <Library/DebugLib.h>
> -#include <Library/BaseLib.h>
> -#include <Library/UefiDriverEntryPoint.h>
> -#include <Library/UefiLib.h>
> -#include <Library/BaseMemoryLib.h>
> -#include <Library/MemoryAllocationLib.h>
> -#include <Library/UefiBootServicesTableLib.h>
> -#include <Library/KeyMapLib.h>
> -
> -
> -#define MAX_Q 256
> -
> -typedef struct {
> -  UINTN         Front;
> -  UINTN         Rear;
> -  UINTN         Count;
> -  EFI_INPUT_KEY Q[MAX_Q];
> -} GOP_QUEUE_FIXED;
> -
> -#define EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE SIGNATURE_32
> ('U', 'g', 'S', 'n')
> -typedef struct _EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY {
> -  UINTN                                 Signature;
> -  EFI_HANDLE                            NotifyHandle;
> -  EFI_KEY_DATA                          KeyData;
> -  EFI_KEY_NOTIFY_FUNCTION               KeyNotificationFn;
> -  EFI_EVENT                             Event;
> -  LIST_ENTRY                            NotifyEntry;
> -} EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY;
> -
> -#define GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER 0xffff
> -
> -typedef struct {
> -  UINT32                     HorizontalResolution;
> -  UINT32                     VerticalResolution;
> -  UINT32                     ColorDepth;
> -  UINT32                     RefreshRate;
> -} GOP_MODE_DATA;
> -
> -
> -
> -extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
> -extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
> -
> -#define EMU_UGA_CLASS_NAME       L"EmuGopWindow"
> -
> -#define GOP_PRIVATE_DATA_SIGNATURE  SIGNATURE_32 ('G', 'o', 'p', 'N')
> -typedef struct {
> -  UINT64                            Signature;
> -
> -  EFI_HANDLE                        Handle;
> -  EFI_GRAPHICS_OUTPUT_PROTOCOL      GraphicsOutput;
> -  EFI_SIMPLE_TEXT_INPUT_PROTOCOL    SimpleTextIn;
> -  EFI_SIMPLE_POINTER_PROTOCOL       SimplePointer;
> -
> -  EMU_IO_THUNK_PROTOCOL             *EmuIoThunk;
> -  EMU_GRAPHICS_WINDOW_PROTOCOL      *EmuGraphicsWindow;
> -
> -  EFI_UNICODE_STRING_TABLE          *ControllerNameTable;
> -
> -  EFI_SIMPLE_POINTER_MODE           PointerMode;
> -  //
> -  // GOP Private Data for QueryMode ()
> -  //
> -  GOP_MODE_DATA                     *ModeData;
> -
> -
> -  //
> -  // UGA Private Data knowing when to start hardware
> -  //
> -  BOOLEAN                           HardwareNeedsStarting;
> -
> -  CHAR16                            *WindowName;
> -
> -  GOP_QUEUE_FIXED                   Queue;
> -
> -  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleTextInEx;
> -  EFI_KEY_STATE                     KeyState;
> -  LIST_ENTRY                        NotifyList;
> -} GOP_PRIVATE_DATA;
> -
> -
> -#define GOP_PRIVATE_DATA_FROM_THIS(a)  \
> -         CR(a, GOP_PRIVATE_DATA, GraphicsOutput,
> GOP_PRIVATE_DATA_SIGNATURE)
> -
> -#define GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS(a)  \
> -         CR(a, GOP_PRIVATE_DATA, SimpleTextIn,
> GOP_PRIVATE_DATA_SIGNATURE)
> -
> -#define GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS(a)  \
> -         CR(a, GOP_PRIVATE_DATA, SimpleTextInEx,
> GOP_PRIVATE_DATA_SIGNATURE)
> -
> -#define GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS(a)  \
> -         CR(a, GOP_PRIVATE_DATA, SimplePointer,
> GOP_PRIVATE_DATA_SIGNATURE)
> -
> -
> -//
> -// Global Protocol Variables
> -//
> -extern EFI_DRIVER_BINDING_PROTOCOL  gEmuGopDriverBinding;
> -extern EFI_COMPONENT_NAME_PROTOCOL  gEmuGopComponentName;
> -extern EFI_COMPONENT_NAME2_PROTOCOL gEmuGopComponentName2;
> -
> -//
> -// Gop Hardware abstraction internal worker functions
> -//
> -EFI_STATUS
> -EmuGopSupported (
> -  IN  EMU_IO_THUNK_PROTOCOL  *EmuIoThunk
> -  );
> -
> -EFI_STATUS
> -EmuGopConstructor (
> -  IN  GOP_PRIVATE_DATA    *Private
> -  );
> -
> -EFI_STATUS
> -EmuGopDestructor (
> -  IN  GOP_PRIVATE_DATA    *Private
> -  );
> -
> -
> -EFI_STATUS
> -GopPrivateAddQ (
> -  IN  GOP_PRIVATE_DATA    *Private,
> -  IN  EFI_INPUT_KEY       Key
> -  );
> -
> -EFI_STATUS
> -EmuGopInitializeSimpleTextInForWindow (
> -  IN  GOP_PRIVATE_DATA    *Private
> -  );
> -
> -EFI_STATUS
> -EmuGopInitializeSimplePointerForWindow (
> -  IN  GOP_PRIVATE_DATA    *Private
> -  );
> -
> -EFI_STATUS
> -EmuGopStartWindow (
> -  IN  GOP_PRIVATE_DATA    *Private,
> -  IN  UINT32              HorizontalResolution,
> -  IN  UINT32              VerticalResolution,
> -  IN  UINT32              ColorDepth,
> -  IN  UINT32              RefreshRate
> -  );
> -
> -VOID
> -EFIAPI
> -ShutdownGopEvent (
> -  IN EFI_EVENT  Event,
> -  IN VOID       *Context
> -  );
> -
> -VOID
> -EFIAPI
> -GopPrivateMakeCallbackFunction (
> -  IN VOID           *Context,
> -  IN EFI_KEY_DATA   *KeyData
> -  );
> -
> -VOID
> -EFIAPI
> -GopPrivateBreakCallbackFunction (
> -  IN VOID           *Context,
> -  IN EFI_KEY_DATA   *KeyData
> -  );
> -
> -#endif
> +/*++ @file
> +
> +Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
> +Portions copyright (c) 2010,Apple Inc. All rights reserved.<BR>
> +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 __UGA_H_
> +#define __UGA_H_
> +
> +#include <PiDxe.h>
> +
> +#include <Protocol/GraphicsOutput.h>
> +#include <Protocol/SimpleTextIn.h>
> +#include <Protocol/SimpleTextInEx.h>
> +#include <Protocol/SimplePointer.h>
> +#include <Protocol/EmuIoThunk.h>
> +#include <Protocol/EmuGraphicsWindow.h>
> +
> +#include <Guid/EventGroup.h>
> +
> +#include <Library/DebugLib.h>
> +#include <Library/BaseLib.h>
> +#include <Library/UefiDriverEntryPoint.h>
> +#include <Library/UefiLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/KeyMapLib.h>
> +
> +
> +#define MAX_Q 256
> +
> +typedef struct {
> +  UINTN         Front;
> +  UINTN         Rear;
> +  UINTN         Count;
> +  EFI_INPUT_KEY Q[MAX_Q];
> +} GOP_QUEUE_FIXED;
> +
> +#define EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE SIGNATURE_32
> ('U', 'g', 'S', 'n')
> +typedef struct _EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY {
> +  UINTN                                 Signature;
> +  EFI_HANDLE                            NotifyHandle;
> +  EFI_KEY_DATA                          KeyData;
> +  EFI_KEY_NOTIFY_FUNCTION               KeyNotificationFn;
> +  EFI_EVENT                             Event;
> +  LIST_ENTRY                            NotifyEntry;
> +} EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY;
> +
> +#define GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER 0xffff
> +
> +typedef struct {
> +  UINT32                     HorizontalResolution;
> +  UINT32                     VerticalResolution;
> +  UINT32                     ColorDepth;
> +  UINT32                     RefreshRate;
> +} GOP_MODE_DATA;
> +
> +
> +
> +extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
> +extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
> +
> +#define EMU_UGA_CLASS_NAME       L"EmuGopWindow"
> +
> +#define GOP_PRIVATE_DATA_SIGNATURE  SIGNATURE_32 ('G', 'o', 'p', 'N')
> +typedef struct {
> +  UINT64                            Signature;
> +
> +  EFI_HANDLE                        Handle;
> +  EFI_GRAPHICS_OUTPUT_PROTOCOL      GraphicsOutput;
> +  EFI_SIMPLE_TEXT_INPUT_PROTOCOL    SimpleTextIn;
> +  EFI_SIMPLE_POINTER_PROTOCOL       SimplePointer;
> +
> +  EMU_IO_THUNK_PROTOCOL             *EmuIoThunk;
> +  EMU_GRAPHICS_WINDOW_PROTOCOL      *EmuGraphicsWindow;
> +
> +  EFI_UNICODE_STRING_TABLE          *ControllerNameTable;
> +
> +  EFI_SIMPLE_POINTER_MODE           PointerMode;
> +  //
> +  // GOP Private Data for QueryMode ()
> +  //
> +  GOP_MODE_DATA                     *ModeData;
> +
> +
> +  //
> +  // UGA Private Data knowing when to start hardware
> +  //
> +  BOOLEAN                           HardwareNeedsStarting;
> +
> +  CHAR16                            *WindowName;
> +
> +  GOP_QUEUE_FIXED                   Queue;
> +
> +  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleTextInEx;
> +  EFI_KEY_STATE                     KeyState;
> +  LIST_ENTRY                        NotifyList;
> +} GOP_PRIVATE_DATA;
> +
> +
> +#define GOP_PRIVATE_DATA_FROM_THIS(a)  \
> +         CR(a, GOP_PRIVATE_DATA, GraphicsOutput,
> GOP_PRIVATE_DATA_SIGNATURE)
> +
> +#define GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS(a)  \
> +         CR(a, GOP_PRIVATE_DATA, SimpleTextIn,
> GOP_PRIVATE_DATA_SIGNATURE)
> +
> +#define GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS(a)  \
> +         CR(a, GOP_PRIVATE_DATA, SimpleTextInEx,
> GOP_PRIVATE_DATA_SIGNATURE)
> +
> +#define GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS(a)  \
> +         CR(a, GOP_PRIVATE_DATA, SimplePointer,
> GOP_PRIVATE_DATA_SIGNATURE)
> +
> +
> +//
> +// Global Protocol Variables
> +//
> +extern EFI_DRIVER_BINDING_PROTOCOL  gEmuGopDriverBinding;
> +extern EFI_COMPONENT_NAME_PROTOCOL  gEmuGopComponentName;
> +extern EFI_COMPONENT_NAME2_PROTOCOL gEmuGopComponentName2;
> +
> +//
> +// Gop Hardware abstraction internal worker functions
> +//
> +EFI_STATUS
> +EmuGopSupported (
> +  IN  EMU_IO_THUNK_PROTOCOL  *EmuIoThunk
> +  );
> +
> +EFI_STATUS
> +EmuGopConstructor (
> +  IN  GOP_PRIVATE_DATA    *Private
> +  );
> +
> +EFI_STATUS
> +EmuGopDestructor (
> +  IN  GOP_PRIVATE_DATA    *Private
> +  );
> +
> +
> +EFI_STATUS
> +GopPrivateAddQ (
> +  IN  GOP_PRIVATE_DATA    *Private,
> +  IN  EFI_INPUT_KEY       Key
> +  );
> +
> +EFI_STATUS
> +EmuGopInitializeSimpleTextInForWindow (
> +  IN  GOP_PRIVATE_DATA    *Private
> +  );
> +
> +EFI_STATUS
> +EmuGopInitializeSimplePointerForWindow (
> +  IN  GOP_PRIVATE_DATA    *Private
> +  );
> +
> +EFI_STATUS
> +EmuGopStartWindow (
> +  IN  GOP_PRIVATE_DATA    *Private,
> +  IN  UINT32              HorizontalResolution,
> +  IN  UINT32              VerticalResolution,
> +  IN  UINT32              ColorDepth,
> +  IN  UINT32              RefreshRate
> +  );
> +
> +VOID
> +EFIAPI
> +ShutdownGopEvent (
> +  IN EFI_EVENT  Event,
> +  IN VOID       *Context
> +  );
> +
> +VOID
> +EFIAPI
> +GopPrivateMakeCallbackFunction (
> +  IN VOID           *Context,
> +  IN EFI_KEY_DATA   *KeyData
> +  );
> +
> +VOID
> +EFIAPI
> +GopPrivateBreakCallbackFunction (
> +  IN VOID           *Context,
> +  IN EFI_KEY_DATA   *KeyData
> +  );
> +
> +#endif
> diff --git a/EmulatorPkg/EmuGopDxe/GopInput.c
> b/EmulatorPkg/EmuGopDxe/GopInput.c
> index cf37a7bd70..1d40b1d7d6 100644
> --- a/EmulatorPkg/EmuGopDxe/GopInput.c
> +++ b/EmulatorPkg/EmuGopDxe/GopInput.c
> @@ -1,900 +1,900 @@
> -/*++ @file
> -
> -Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
> -Portions copyright (c) 2010 0 2011,Apple Inc. All rights reserved.<BR>
> -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.
> -
> -
> -**/
> -
> -#include "Gop.h"
> -
> -
> -BOOLEAN
> -GopPrivateIsKeyRegistered (
> -  IN EFI_KEY_DATA  *RegsiteredData,
> -  IN EFI_KEY_DATA  *InputData
> -  )
> -/*++
> -
> -Routine Description:
> -
> -Arguments:
> -
> -  RegsiteredData    - A pointer to a buffer that is filled in with the keystroke
> -                      state data for the key that was registered.
> -  InputData         - A pointer to a buffer that is filled in with the keystroke
> -                      state data for the key that was pressed.
> -
> -Returns:
> -  TRUE              - Key be pressed matches a registered key.
> -  FLASE             - Match failed.
> -
> -**/
> -{
> -  ASSERT (RegsiteredData != NULL && InputData != NULL);
> -
> -  if ((RegsiteredData->Key.ScanCode    != InputData->Key.ScanCode) ||
> -      (RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) {
> -    return FALSE;
> -  }
> -
> -  //
> -  // Assume KeyShiftState/KeyToggleState = 0 in Registered key data means
> these state could be ignored.
> -  //
> -  if (RegsiteredData->KeyState.KeyShiftState != 0 &&
> -      RegsiteredData->KeyState.KeyShiftState != InputData-
> >KeyState.KeyShiftState) {
> -    return FALSE;
> -  }
> -  if (RegsiteredData->KeyState.KeyToggleState != 0 &&
> -      RegsiteredData->KeyState.KeyToggleState != InputData-
> >KeyState.KeyToggleState) {
> -    return FALSE;
> -  }
> -
> -  return TRUE;
> -
> -}
> -
> -
> -VOID
> -EFIAPI
> -GopPrivateMakeCallbackFunction (
> -  IN VOID           *Context,
> -  IN EFI_KEY_DATA   *KeyData
> -  )
> -{
> -  LIST_ENTRY                        *Link;
> -  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY  *CurrentNotify;
> -  GOP_PRIVATE_DATA                  *Private = (GOP_PRIVATE_DATA *)Context;
> -
> -  KeyMapMake (KeyData);
> -
> -  for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link =
> Link->ForwardLink) {
> -    CurrentNotify = CR (
> -                      Link,
> -                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
> -                      NotifyEntry,
> -                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
> -                      );
> -    if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
> -      // We could be called at a high TPL so signal an event to call the registered
> function
> -      // at a lower TPL.
> -      gBS->SignalEvent (CurrentNotify->Event);
> -    }
> -  }
> -}
> -
> -
> -VOID
> -EFIAPI
> -GopPrivateBreakCallbackFunction (
> -  IN VOID           *Context,
> -  IN EFI_KEY_DATA   *KeyData
> -  )
> -{
> -  KeyMapBreak (KeyData);
> -}
> -
> -
> -
> -//
> -// Simple Text In implementation.
> -//
> -
> -/**
> -  Reset the input device and optionally run diagnostics
> -
> -  @param  This                 Protocol instance pointer.
> -  @param  ExtendedVerification Driver may perform diagnostics on reset.
> -
> -  @retval EFI_SUCCESS          The device was reset.
> -  @retval EFI_DEVICE_ERROR     The device is not functioning properly and
> could not be reset.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimpleTextInReset (
> -  IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL       *This,
> -  IN BOOLEAN                              ExtendedVerification
> -  )
> -{
> -  GOP_PRIVATE_DATA  *Private;
> -  EFI_KEY_DATA      KeyData;
> -  EFI_TPL           OldTpl;
> -
> -  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
> -  if (Private->EmuGraphicsWindow == NULL) {
> -    return EFI_SUCCESS;
> -  }
> -
> -  //
> -  // Enter critical section
> -  //
> -  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> -
> -  //
> -  // A reset is draining the Queue
> -  //
> -  while (Private->EmuGraphicsWindow->GetKey (Private-
> >EmuGraphicsWindow, &KeyData) == EFI_SUCCESS)
> -    ;
> -
> -  //
> -  // Leave critical section and return
> -  //
> -  gBS->RestoreTPL (OldTpl);
> -  return EFI_SUCCESS;
> -}
> -
> -
> -/**
> -  Reads the next keystroke from the input device. The WaitForKey Event can
> -  be used to test for existence of a keystroke via WaitForEvent () call.
> -
> -  @param  This  Protocol instance pointer.
> -  @param  Key   A pointer to a buffer that is filled in with the keystroke
> -                information for the key that was pressed.
> -
> -  @retval EFI_SUCCESS      The keystroke information was returned.
> -  @retval EFI_NOT_READY    There was no keystroke data available.
> -  @retval EFI_DEVICE_ERROR The keystroke information was not returned due
> to
> -                           hardware errors.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimpleTextInReadKeyStroke (
> -  IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL       *This,
> -  OUT EFI_INPUT_KEY                       *Key
> -  )
> -{
> -  GOP_PRIVATE_DATA  *Private;
> -  EFI_STATUS        Status;
> -  EFI_TPL           OldTpl;
> -  EFI_KEY_DATA      KeyData;
> -
> -  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
> -  if (Private->EmuGraphicsWindow == NULL) {
> -    return EFI_NOT_READY;
> -  }
> -
> -  //
> -  // Enter critical section
> -  //
> -  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
> -
> -  Status  = Private->EmuGraphicsWindow->GetKey (Private-
> >EmuGraphicsWindow, &KeyData);
> -  if (!EFI_ERROR (Status)) {
> -    if ((KeyData.Key.ScanCode == 0) && (KeyData.Key.UnicodeChar == 0)) {
> -      // Modifier key was pressed
> -      Status = EFI_NOT_READY;
> -    } else {
> -      CopyMem (Key, &KeyData.Key, sizeof (EFI_INPUT_KEY));
> -    }
> -  }
> -
> -  //
> -  // Leave critical section and return
> -  //
> -  gBS->RestoreTPL (OldTpl);
> -
> -  return Status;
> -}
> -
> -
> -
> -/**
> -  SimpleTextIn and SimpleTextInEx Notify Wait Event
> -
> -  @param  Event                 Event whose notification function is being invoked.
> -  @param  Context               Pointer to GOP_PRIVATE_DATA.
> -
> -**/
> -VOID
> -EFIAPI
> -EmuGopSimpleTextInWaitForKey (
> -  IN EFI_EVENT          Event,
> -  IN VOID               *Context
> -  )
> -{
> -  GOP_PRIVATE_DATA  *Private;
> -  EFI_STATUS        Status;
> -  EFI_TPL           OldTpl;
> -
> -  Private = (GOP_PRIVATE_DATA *) Context;
> -  if (Private->EmuGraphicsWindow == NULL) {
> -    return;
> -  }
> -
> -  //
> -  // Enter critical section
> -  //
> -  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
> -
> -  Status  = Private->EmuGraphicsWindow->CheckKey (Private-
> >EmuGraphicsWindow);
> -  if (!EFI_ERROR (Status)) {
> -    //
> -    // If a there is a key in the queue signal our event.
> -    //
> -    gBS->SignalEvent (Event);
> -  }
> -  //
> -  // Leave critical section and return
> -  //
> -  gBS->RestoreTPL (OldTpl);
> -}
> -
> -
> -//
> -// Simple Text Input Ex protocol functions
> -//
> -
> -
> -/**
> -  The Reset() function resets the input device hardware. As part
> -  of initialization process, the firmware/device will make a quick
> -  but reasonable attempt to verify that the device is functioning.
> -  If the ExtendedVerification flag is TRUE the firmware may take
> -  an extended amount of time to verify the device is operating on
> -  reset. Otherwise the reset operation is to occur as quickly as
> -  possible. The hardware verification process is not defined by
> -  this specification and is left up to the platform firmware or
> -  driver to implement.
> -
> -  @param This                 A pointer to the
> EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
> -
> -  @param ExtendedVerification Indicates that the driver may
> -                              perform a more exhaustive
> -                              verification operation of the
> -                              device during reset.
> -
> -
> -  @retval EFI_SUCCESS       The device was reset.
> -
> -  @retval EFI_DEVICE_ERROR  The device is not functioning
> -                            correctly and could not be reset.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimpleTextInExResetEx (
> -  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
> -  IN BOOLEAN                            ExtendedVerification
> -  )
> -/*++
> -
> -  Routine Description:
> -    Reset the input device and optionaly run diagnostics
> -
> -  Arguments:
> -    This                 - Protocol instance pointer.
> -    ExtendedVerification - Driver may perform diagnostics on reset.
> -
> -  Returns:
> -    EFI_SUCCESS           - The device was reset.
> -
> -**/
> -{
> -  return EFI_SUCCESS;
> -}
> -
> -
> -
> -/**
> -  The function reads the next keystroke from the input device. If
> -  there is no pending keystroke the function returns
> -  EFI_NOT_READY. If there is a pending keystroke, then
> -  KeyData.Key.ScanCode is the EFI scan code defined in Error!
> -  Reference source not found. The KeyData.Key.UnicodeChar is the
> -  actual printable character or is zero if the key does not
> -  represent a printable character (control key, function key,
> -  etc.). The KeyData.KeyState is shift state for the character
> -  reflected in KeyData.Key.UnicodeChar or KeyData.Key.ScanCode .
> -  When interpreting the data from this function, it should be
> -  noted that if a class of printable characters that are
> -  normally adjusted by shift modifiers (e.g. Shift Key + "f"
> -  key) would be presented solely as a KeyData.Key.UnicodeChar
> -  without the associated shift state. So in the previous example
> -  of a Shift Key + "f" key being pressed, the only pertinent
> -  data returned would be KeyData.Key.UnicodeChar with the value
> -  of "F". This of course would not typically be the case for
> -  non-printable characters such as the pressing of the Right
> -  Shift Key + F10 key since the corresponding returned data
> -  would be reflected both in the KeyData.KeyState.KeyShiftState
> -  and KeyData.Key.ScanCode values. UEFI drivers which implement
> -  the EFI_SIMPLE_TEXT_INPUT_EX protocol are required to return
> -  KeyData.Key and KeyData.KeyState values. These drivers must
> -  always return the most current state of
> -  KeyData.KeyState.KeyShiftState and
> -  KeyData.KeyState.KeyToggleState. It should also be noted that
> -  certain input devices may not be able to produce shift or toggle
> -  state information, and in those cases the high order bit in the
> -  respective Toggle and Shift state fields should not be active.
> -
> -
> -  @param This     A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL
> instance.
> -
> -  @param KeyData  A pointer to a buffer that is filled in with
> -                  the keystroke state data for the key that was
> -                  pressed.
> -
> -
> -  @retval EFI_SUCCESS     The keystroke information was
> -                          returned.
> -
> -  @retval EFI_NOT_READY   There was no keystroke data available.
> -                          EFI_DEVICE_ERROR The keystroke
> -                          information was not returned due to
> -                          hardware errors.
> -
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimpleTextInExReadKeyStrokeEx (
> -  IN  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
> -  OUT EFI_KEY_DATA                      *KeyData
> -  )
> -/*++
> -
> -  Routine Description:
> -    Reads the next keystroke from the input device. The WaitForKey Event can
> -    be used to test for existance of a keystroke via WaitForEvent () call.
> -
> -  Arguments:
> -    This       - Protocol instance pointer.
> -    KeyData    - A pointer to a buffer that is filled in with the keystroke
> -                 state data for the key that was pressed.
> -
> -  Returns:
> -    EFI_SUCCESS           - The keystroke information was returned.
> -    EFI_NOT_READY         - There was no keystroke data availiable.
> -    EFI_DEVICE_ERROR      - The keystroke information was not returned due to
> -                            hardware errors.
> -    EFI_INVALID_PARAMETER - KeyData is NULL.
> -
> -**/
> -{
> -  EFI_STATUS        Status;
> -  GOP_PRIVATE_DATA  *Private;
> -  EFI_TPL           OldTpl;
> -
> -
> -  if (KeyData == NULL) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> -  if (Private->EmuGraphicsWindow == NULL) {
> -    return EFI_NOT_READY;
> -  }
> -
> -  //
> -  // Enter critical section
> -  //
> -  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
> -
> -  Status  = Private->EmuGraphicsWindow->GetKey(Private-
> >EmuGraphicsWindow, KeyData);
> -
> -  //
> -  // Leave critical section and return
> -  //
> -  gBS->RestoreTPL (OldTpl);
> -
> -  return Status;
> -}
> -
> -
> -
> -/**
> -  The SetState() function allows the input device hardware to
> -  have state settings adjusted.
> -
> -  @param This           A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL
> instance.
> -
> -  @param KeyToggleState Pointer to the EFI_KEY_TOGGLE_STATE to
> -                        set the state for the input device.
> -
> -
> -  @retval EFI_SUCCESS       The device state was set appropriately.
> -
> -  @retval EFI_DEVICE_ERROR  The device is not functioning
> -                            correctly and could not have the
> -                            setting adjusted.
> -
> -  @retval EFI_UNSUPPORTED   The device does not support the
> -                            ability to have its state set.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimpleTextInExSetState (
> -  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
> -  IN EFI_KEY_TOGGLE_STATE               *KeyToggleState
> -  )
> -{
> -  GOP_PRIVATE_DATA  *Private;
> -  EFI_STATUS        Status;
> -  EFI_TPL           OldTpl;
> -
> -  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> -  if (Private->EmuGraphicsWindow == NULL) {
> -    return EFI_NOT_READY;
> -  }
> -
> -  //
> -  // Enter critical section
> -  //
> -  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
> -
> -  Status  = Private->EmuGraphicsWindow->KeySetState (Private-
> >EmuGraphicsWindow, KeyToggleState);
> -  //
> -  // Leave critical section and return
> -  //
> -  gBS->RestoreTPL (OldTpl);
> -
> -  return Status;
> -}
> -
> -
> -/**
> -  SimpleTextIn and SimpleTextInEx Notify Wait Event
> -
> -  @param  Event                 Event whose notification function is being invoked.
> -  @param  Context               Pointer to GOP_PRIVATE_DATA.
> -
> -**/
> -VOID
> -EFIAPI
> -EmuGopRegisterKeyCallback (
> -  IN EFI_EVENT          Event,
> -  IN VOID               *Context
> -  )
> -{
> -  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *ExNotify =
> (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *)Context;
> -
> -  ExNotify->KeyNotificationFn (&ExNotify->KeyData);
> -}
> -
> -
> -
> -/**
> -  The RegisterKeystrokeNotify() function registers a function
> -  which will be called when a specified keystroke will occur.
> -
> -  @param This                     A pointer to the
> EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
> -
> -  @param KeyData                  A pointer to a buffer that is filled in with
> -                                  the keystroke information for the key that was
> -                                  pressed.
> -
> -  @param KeyNotificationFunction  Points to the function to be
> -                                  called when the key sequence
> -                                  is typed specified by KeyData.
> -
> -
> -  @param NotifyHandle             Points to the unique handle assigned to
> -                                  the registered notification.
> -
> -  @retval EFI_SUCCESS           The device state was set
> -                                appropriately.
> -
> -  @retval EFI_OUT_OF_RESOURCES  Unable to allocate necessary
> -                                data structures.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimpleTextInExRegisterKeyNotify (
> -  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
> -  IN EFI_KEY_DATA                       *KeyData,
> -  IN EFI_KEY_NOTIFY_FUNCTION            KeyNotificationFunction,
> -  OUT EFI_HANDLE                        *NotifyHandle
> -  )
> -{
> -  EFI_STATUS                          Status;
> -  GOP_PRIVATE_DATA                    *Private;
> -  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY     *CurrentNotify;
> -  LIST_ENTRY                          *Link;
> -  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY     *NewNotify;
> -
> -  if (KeyData == NULL || KeyNotificationFunction == NULL || NotifyHandle ==
> NULL) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> -
> -  //
> -  // Return EFI_SUCCESS if the (KeyData, NotificationFunction) is already
> registered.
> -  //
> -  for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link =
> Link->ForwardLink) {
> -    CurrentNotify = CR (
> -                      Link,
> -                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
> -                      NotifyEntry,
> -                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
> -                      );
> -    if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
> -      if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) {
> -        *NotifyHandle = CurrentNotify->NotifyHandle;
> -        return EFI_SUCCESS;
> -      }
> -    }
> -  }
> -
> -  //
> -  // Allocate resource to save the notification function
> -  //
> -  NewNotify = (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) AllocateZeroPool
> (sizeof (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY));
> -  if (NewNotify == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  NewNotify->Signature         =
> EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE;
> -  NewNotify->KeyNotificationFn = KeyNotificationFunction;
> -  NewNotify->NotifyHandle      = (EFI_HANDLE) NewNotify;
> -  CopyMem (&NewNotify->KeyData, KeyData, sizeof (KeyData));
> -  InsertTailList (&Private->NotifyList, &NewNotify->NotifyEntry);
> -
> -  Status = gBS->CreateEvent (
> -                  EVT_NOTIFY_SIGNAL,
> -                  TPL_NOTIFY,
> -                  EmuGopRegisterKeyCallback,
> -                  NewNotify,
> -                  &NewNotify->Event
> -                  );
> -  ASSERT_EFI_ERROR (Status);
> -
> -
> -  *NotifyHandle = NewNotify->NotifyHandle;
> -
> -  return EFI_SUCCESS;
> -
> -}
> -
> -
> -/**
> -  The UnregisterKeystrokeNotify() function removes the
> -  notification which was previously registered.
> -
> -  @param This               A pointer to the
> EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
> -
> -  @param NotificationHandle The handle of the notification
> -                            function being unregistered.
> -
> -  @retval EFI_SUCCESS The device state was set appropriately.
> -
> -  @retval EFI_INVALID_PARAMETER The NotificationHandle is
> -                                invalid.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimpleTextInExUnregisterKeyNotify (
> -  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
> -  IN EFI_HANDLE                         NotificationHandle
> -  )
> -/*++
> -
> -  Routine Description:
> -    Remove a registered notification function from a particular keystroke.
> -
> -  Arguments:
> -    This                    - Protocol instance pointer.
> -    NotificationHandle      - The handle of the notification function being
> unregistered.
> -
> -  Returns:
> -    EFI_SUCCESS             - The notification function was unregistered
> successfully.
> -    EFI_INVALID_PARAMETER   - The NotificationHandle is invalid.
> -
> -**/
> -{
> -  GOP_PRIVATE_DATA                   *Private;
> -  LIST_ENTRY                         *Link;
> -  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
> -
> -  if (NotificationHandle == NULL) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  if (((EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) NotificationHandle)-
> >Signature != EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> -
> -  for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link =
> Link->ForwardLink) {
> -    CurrentNotify = CR (
> -                      Link,
> -                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
> -                      NotifyEntry,
> -                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
> -                      );
> -    if (CurrentNotify->NotifyHandle == NotificationHandle) {
> -      //
> -      // Remove the notification function from NotifyList and free resources
> -      //
> -      RemoveEntryList (&CurrentNotify->NotifyEntry);
> -
> -      gBS->CloseEvent (CurrentNotify->Event);
> -
> -      gBS->FreePool (CurrentNotify);
> -      return EFI_SUCCESS;
> -    }
> -  }
> -
> -  //
> -  // Can not find the specified Notification Handle
> -  //
> -  return EFI_INVALID_PARAMETER;
> -}
> -
> -
> -
> -/**
> -  Initialize SimplelTextIn and SimpleTextInEx protocols in the Private
> -  context structure.
> -
> -  @param  Private               Context structure to fill in.
> -
> -  @return EFI_SUCCESS           Initialization was a success
> -
> -**/
> -EFI_STATUS
> -EmuGopInitializeSimpleTextInForWindow (
> -  IN  GOP_PRIVATE_DATA    *Private
> -  )
> -{
> -  EFI_STATUS  Status;
> -
> -  //
> -  // Initialize Simple Text In protoocol
> -  //
> -  Private->SimpleTextIn.Reset         = EmuGopSimpleTextInReset;
> -  Private->SimpleTextIn.ReadKeyStroke = EmuGopSimpleTextInReadKeyStroke;
> -
> -  Status = gBS->CreateEvent (
> -                  EVT_NOTIFY_WAIT,
> -                  TPL_NOTIFY,
> -                  EmuGopSimpleTextInWaitForKey,
> -                  Private,
> -                  &Private->SimpleTextIn.WaitForKey
> -                  );
> -  ASSERT_EFI_ERROR (Status);
> -
> -
> -  //
> -  // Initialize Simple Text In Ex
> -  //
> -
> -  Private->SimpleTextInEx.Reset               = EmuGopSimpleTextInExResetEx;
> -  Private->SimpleTextInEx.ReadKeyStrokeEx     =
> EmuGopSimpleTextInExReadKeyStrokeEx;
> -  Private->SimpleTextInEx.SetState            = EmuGopSimpleTextInExSetState;
> -  Private->SimpleTextInEx.RegisterKeyNotify   =
> EmuGopSimpleTextInExRegisterKeyNotify;
> -  Private->SimpleTextInEx.UnregisterKeyNotify =
> EmuGopSimpleTextInExUnregisterKeyNotify;
> -
> -  Private->SimpleTextInEx.Reset (&Private->SimpleTextInEx, FALSE);
> -
> -  InitializeListHead (&Private->NotifyList);
> -
> -  Status = gBS->CreateEvent (
> -                  EVT_NOTIFY_WAIT,
> -                  TPL_NOTIFY,
> -                  EmuGopSimpleTextInWaitForKey,
> -                  Private,
> -                  &Private->SimpleTextInEx.WaitForKeyEx
> -                  );
> -  ASSERT_EFI_ERROR (Status);
> -
> -
> -  return Status;
> -}
> -
> -
> -
> -
> -
> -
> -
> -//
> -// Simple Pointer implementation.
> -//
> -
> -
> -/**
> -  Resets the pointer device hardware.
> -
> -  @param  This                  A pointer to the EFI_SIMPLE_POINTER_PROTOCOL
> -                                instance.
> -  @param  ExtendedVerification  Indicates that the driver may perform a more
> exhaustive
> -                                verification operation of the device during reset.
> -
> -  @retval EFI_SUCCESS           The device was reset.
> -  @retval EFI_DEVICE_ERROR      The device is not functioning correctly and
> could not be reset.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimplePointerReset (
> -  IN EFI_SIMPLE_POINTER_PROTOCOL          *This,
> -  IN BOOLEAN                              ExtendedVerification
> -  )
> -{
> -  GOP_PRIVATE_DATA             *Private;
> -  EFI_SIMPLE_POINTER_STATE     State;
> -  EFI_TPL                      OldTpl;
> -
> -  Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);
> -  if (Private->EmuGraphicsWindow == NULL) {
> -    return EFI_SUCCESS;
> -  }
> -
> -  //
> -  // Enter critical section
> -  //
> -  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> -
> -  //
> -  // A reset is draining the Queue
> -  //
> -  while (Private->EmuGraphicsWindow->GetPointerState (Private-
> >EmuGraphicsWindow, &State) == EFI_SUCCESS)
> -    ;
> -
> -  //
> -  // Leave critical section and return
> -  //
> -  gBS->RestoreTPL (OldTpl);
> -  return EFI_SUCCESS;
> -}
> -
> -
> -/**
> -  Retrieves the current state of a pointer device.
> -
> -  @param  This                  A pointer to the EFI_SIMPLE_POINTER_PROTOCOL
> -                                instance.
> -  @param  State                 A pointer to the state information on the pointer
> device.
> -
> -  @retval EFI_SUCCESS           The state of the pointer device was returned in
> State.
> -  @retval EFI_NOT_READY         The state of the pointer device has not
> changed since the last call to
> -                                GetState().
> -  @retval EFI_DEVICE_ERROR      A device error occurred while attempting to
> retrieve the pointer device's
> -                                current state.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimplePointerGetState (
> -  IN EFI_SIMPLE_POINTER_PROTOCOL          *This,
> -  IN OUT EFI_SIMPLE_POINTER_STATE         *State
> -  )
> -{
> -  GOP_PRIVATE_DATA  *Private;
> -  EFI_STATUS        Status;
> -  EFI_TPL           OldTpl;
> -
> -  Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);
> -  if (Private->EmuGraphicsWindow == NULL) {
> -    return EFI_NOT_READY;
> -  }
> -
> -  //
> -  // Enter critical section
> -  //
> -  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
> -
> -  Status  = Private->EmuGraphicsWindow->GetPointerState (Private-
> >EmuGraphicsWindow, State);
> -  //
> -  // Leave critical section and return
> -  //
> -  gBS->RestoreTPL (OldTpl);
> -
> -  return Status;
> -}
> -
> -
> -/**
> -  SimplePointer Notify Wait Event
> -
> -  @param  Event                 Event whose notification function is being invoked.
> -  @param  Context               Pointer to GOP_PRIVATE_DATA.
> -
> -**/
> -VOID
> -EFIAPI
> -EmuGopSimplePointerWaitForInput (
> -  IN EFI_EVENT          Event,
> -  IN VOID               *Context
> -  )
> -{
> -  GOP_PRIVATE_DATA  *Private;
> -  EFI_STATUS        Status;
> -  EFI_TPL           OldTpl;
> -
> -  Private = (GOP_PRIVATE_DATA *) Context;
> -  if (Private->EmuGraphicsWindow == NULL) {
> -    return;
> -  }
> -
> -  //
> -  // Enter critical section
> -  //
> -  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
> -
> -  Status  = Private->EmuGraphicsWindow->CheckPointer (Private-
> >EmuGraphicsWindow);
> -  if (!EFI_ERROR (Status)) {
> -    //
> -    // If the pointer state has changed, signal our event.
> -    //
> -    gBS->SignalEvent (Event);
> -  }
> -  //
> -  // Leave critical section and return
> -  //
> -  gBS->RestoreTPL (OldTpl);
> -}
> -
> -
> -/**
> -  SimplePointer constructor
> -
> -  @param  Private Context structure to fill in.
> -
> -  @retval EFI_SUCCESS Constructor had success
> -
> -**/
> -EFI_STATUS
> -EmuGopInitializeSimplePointerForWindow (
> -  IN  GOP_PRIVATE_DATA    *Private
> -  )
> -{
> -  EFI_STATUS  Status;
> -
> -  //
> -  // Initialize Simple Pointer protoocol
> -  //
> -  Private->PointerMode.ResolutionX = 1;
> -  Private->PointerMode.ResolutionY = 1;
> -  Private->PointerMode.ResolutionZ = 1;
> -  Private->PointerMode.LeftButton  = TRUE;
> -  Private->PointerMode.RightButton = TRUE;
> -
> -  Private->SimplePointer.Reset     = EmuGopSimplePointerReset;
> -  Private->SimplePointer.GetState  = EmuGopSimplePointerGetState;
> -  Private->SimplePointer.Mode      = &Private->PointerMode;
> -
> -  Status = gBS->CreateEvent (
> -                  EVT_NOTIFY_WAIT,
> -                  TPL_NOTIFY,
> -                  EmuGopSimplePointerWaitForInput,
> -                  Private,
> -                  &Private->SimplePointer.WaitForInput
> -                  );
> -
> -  return Status;
> -}
> +/*++ @file
> +
> +Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
> +Portions copyright (c) 2010 0 2011,Apple Inc. All rights reserved.<BR>
> +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.
> +
> +
> +**/
> +
> +#include "Gop.h"
> +
> +
> +BOOLEAN
> +GopPrivateIsKeyRegistered (
> +  IN EFI_KEY_DATA  *RegsiteredData,
> +  IN EFI_KEY_DATA  *InputData
> +  )
> +/*++
> +
> +Routine Description:
> +
> +Arguments:
> +
> +  RegsiteredData    - A pointer to a buffer that is filled in with the keystroke
> +                      state data for the key that was registered.
> +  InputData         - A pointer to a buffer that is filled in with the keystroke
> +                      state data for the key that was pressed.
> +
> +Returns:
> +  TRUE              - Key be pressed matches a registered key.
> +  FLASE             - Match failed.
> +
> +**/
> +{
> +  ASSERT (RegsiteredData != NULL && InputData != NULL);
> +
> +  if ((RegsiteredData->Key.ScanCode    != InputData->Key.ScanCode) ||
> +      (RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) {
> +    return FALSE;
> +  }
> +
> +  //
> +  // Assume KeyShiftState/KeyToggleState = 0 in Registered key data means
> these state could be ignored.
> +  //
> +  if (RegsiteredData->KeyState.KeyShiftState != 0 &&
> +      RegsiteredData->KeyState.KeyShiftState != InputData-
> >KeyState.KeyShiftState) {
> +    return FALSE;
> +  }
> +  if (RegsiteredData->KeyState.KeyToggleState != 0 &&
> +      RegsiteredData->KeyState.KeyToggleState != InputData-
> >KeyState.KeyToggleState) {
> +    return FALSE;
> +  }
> +
> +  return TRUE;
> +
> +}
> +
> +
> +VOID
> +EFIAPI
> +GopPrivateMakeCallbackFunction (
> +  IN VOID           *Context,
> +  IN EFI_KEY_DATA   *KeyData
> +  )
> +{
> +  LIST_ENTRY                        *Link;
> +  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY  *CurrentNotify;
> +  GOP_PRIVATE_DATA                  *Private = (GOP_PRIVATE_DATA *)Context;
> +
> +  KeyMapMake (KeyData);
> +
> +  for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link
> = Link->ForwardLink) {
> +    CurrentNotify = CR (
> +                      Link,
> +                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
> +                      NotifyEntry,
> +                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
> +                      );
> +    if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
> +      // We could be called at a high TPL so signal an event to call the
> registered function
> +      // at a lower TPL.
> +      gBS->SignalEvent (CurrentNotify->Event);
> +    }
> +  }
> +}
> +
> +
> +VOID
> +EFIAPI
> +GopPrivateBreakCallbackFunction (
> +  IN VOID           *Context,
> +  IN EFI_KEY_DATA   *KeyData
> +  )
> +{
> +  KeyMapBreak (KeyData);
> +}
> +
> +
> +
> +//
> +// Simple Text In implementation.
> +//
> +
> +/**
> +  Reset the input device and optionally run diagnostics
> +
> +  @param  This                 Protocol instance pointer.
> +  @param  ExtendedVerification Driver may perform diagnostics on reset.
> +
> +  @retval EFI_SUCCESS          The device was reset.
> +  @retval EFI_DEVICE_ERROR     The device is not functioning properly and
> could not be reset.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimpleTextInReset (
> +  IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL       *This,
> +  IN BOOLEAN                              ExtendedVerification
> +  )
> +{
> +  GOP_PRIVATE_DATA  *Private;
> +  EFI_KEY_DATA      KeyData;
> +  EFI_TPL           OldTpl;
> +
> +  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
> +  if (Private->EmuGraphicsWindow == NULL) {
> +    return EFI_SUCCESS;
> +  }
> +
> +  //
> +  // Enter critical section
> +  //
> +  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> +
> +  //
> +  // A reset is draining the Queue
> +  //
> +  while (Private->EmuGraphicsWindow->GetKey (Private-
> >EmuGraphicsWindow, &KeyData) == EFI_SUCCESS)
> +    ;
> +
> +  //
> +  // Leave critical section and return
> +  //
> +  gBS->RestoreTPL (OldTpl);
> +  return EFI_SUCCESS;
> +}
> +
> +
> +/**
> +  Reads the next keystroke from the input device. The WaitForKey Event can
> +  be used to test for existence of a keystroke via WaitForEvent () call.
> +
> +  @param  This  Protocol instance pointer.
> +  @param  Key   A pointer to a buffer that is filled in with the keystroke
> +                information for the key that was pressed.
> +
> +  @retval EFI_SUCCESS      The keystroke information was returned.
> +  @retval EFI_NOT_READY    There was no keystroke data available.
> +  @retval EFI_DEVICE_ERROR The keystroke information was not returned due
> to
> +                           hardware errors.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimpleTextInReadKeyStroke (
> +  IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL       *This,
> +  OUT EFI_INPUT_KEY                       *Key
> +  )
> +{
> +  GOP_PRIVATE_DATA  *Private;
> +  EFI_STATUS        Status;
> +  EFI_TPL           OldTpl;
> +  EFI_KEY_DATA      KeyData;
> +
> +  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
> +  if (Private->EmuGraphicsWindow == NULL) {
> +    return EFI_NOT_READY;
> +  }
> +
> +  //
> +  // Enter critical section
> +  //
> +  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
> +
> +  Status  = Private->EmuGraphicsWindow->GetKey (Private-
> >EmuGraphicsWindow, &KeyData);
> +  if (!EFI_ERROR (Status)) {
> +    if ((KeyData.Key.ScanCode == 0) && (KeyData.Key.UnicodeChar == 0)) {
> +      // Modifier key was pressed
> +      Status = EFI_NOT_READY;
> +    } else {
> +      CopyMem (Key, &KeyData.Key, sizeof (EFI_INPUT_KEY));
> +    }
> +  }
> +
> +  //
> +  // Leave critical section and return
> +  //
> +  gBS->RestoreTPL (OldTpl);
> +
> +  return Status;
> +}
> +
> +
> +
> +/**
> +  SimpleTextIn and SimpleTextInEx Notify Wait Event
> +
> +  @param  Event                 Event whose notification function is being invoked.
> +  @param  Context               Pointer to GOP_PRIVATE_DATA.
> +
> +**/
> +VOID
> +EFIAPI
> +EmuGopSimpleTextInWaitForKey (
> +  IN EFI_EVENT          Event,
> +  IN VOID               *Context
> +  )
> +{
> +  GOP_PRIVATE_DATA  *Private;
> +  EFI_STATUS        Status;
> +  EFI_TPL           OldTpl;
> +
> +  Private = (GOP_PRIVATE_DATA *) Context;
> +  if (Private->EmuGraphicsWindow == NULL) {
> +    return;
> +  }
> +
> +  //
> +  // Enter critical section
> +  //
> +  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
> +
> +  Status  = Private->EmuGraphicsWindow->CheckKey (Private-
> >EmuGraphicsWindow);
> +  if (!EFI_ERROR (Status)) {
> +    //
> +    // If a there is a key in the queue signal our event.
> +    //
> +    gBS->SignalEvent (Event);
> +  }
> +  //
> +  // Leave critical section and return
> +  //
> +  gBS->RestoreTPL (OldTpl);
> +}
> +
> +
> +//
> +// Simple Text Input Ex protocol functions
> +//
> +
> +
> +/**
> +  The Reset() function resets the input device hardware. As part
> +  of initialization process, the firmware/device will make a quick
> +  but reasonable attempt to verify that the device is functioning.
> +  If the ExtendedVerification flag is TRUE the firmware may take
> +  an extended amount of time to verify the device is operating on
> +  reset. Otherwise the reset operation is to occur as quickly as
> +  possible. The hardware verification process is not defined by
> +  this specification and is left up to the platform firmware or
> +  driver to implement.
> +
> +  @param This                 A pointer to the
> EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
> +
> +  @param ExtendedVerification Indicates that the driver may
> +                              perform a more exhaustive
> +                              verification operation of the
> +                              device during reset.
> +
> +
> +  @retval EFI_SUCCESS       The device was reset.
> +
> +  @retval EFI_DEVICE_ERROR  The device is not functioning
> +                            correctly and could not be reset.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimpleTextInExResetEx (
> +  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
> +  IN BOOLEAN                            ExtendedVerification
> +  )
> +/*++
> +
> +  Routine Description:
> +    Reset the input device and optionaly run diagnostics
> +
> +  Arguments:
> +    This                 - Protocol instance pointer.
> +    ExtendedVerification - Driver may perform diagnostics on reset.
> +
> +  Returns:
> +    EFI_SUCCESS           - The device was reset.
> +
> +**/
> +{
> +  return EFI_SUCCESS;
> +}
> +
> +
> +
> +/**
> +  The function reads the next keystroke from the input device. If
> +  there is no pending keystroke the function returns
> +  EFI_NOT_READY. If there is a pending keystroke, then
> +  KeyData.Key.ScanCode is the EFI scan code defined in Error!
> +  Reference source not found. The KeyData.Key.UnicodeChar is the
> +  actual printable character or is zero if the key does not
> +  represent a printable character (control key, function key,
> +  etc.). The KeyData.KeyState is shift state for the character
> +  reflected in KeyData.Key.UnicodeChar or KeyData.Key.ScanCode .
> +  When interpreting the data from this function, it should be
> +  noted that if a class of printable characters that are
> +  normally adjusted by shift modifiers (e.g. Shift Key + "f"
> +  key) would be presented solely as a KeyData.Key.UnicodeChar
> +  without the associated shift state. So in the previous example
> +  of a Shift Key + "f" key being pressed, the only pertinent
> +  data returned would be KeyData.Key.UnicodeChar with the value
> +  of "F". This of course would not typically be the case for
> +  non-printable characters such as the pressing of the Right
> +  Shift Key + F10 key since the corresponding returned data
> +  would be reflected both in the KeyData.KeyState.KeyShiftState
> +  and KeyData.Key.ScanCode values. UEFI drivers which implement
> +  the EFI_SIMPLE_TEXT_INPUT_EX protocol are required to return
> +  KeyData.Key and KeyData.KeyState values. These drivers must
> +  always return the most current state of
> +  KeyData.KeyState.KeyShiftState and
> +  KeyData.KeyState.KeyToggleState. It should also be noted that
> +  certain input devices may not be able to produce shift or toggle
> +  state information, and in those cases the high order bit in the
> +  respective Toggle and Shift state fields should not be active.
> +
> +
> +  @param This     A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL
> instance.
> +
> +  @param KeyData  A pointer to a buffer that is filled in with
> +                  the keystroke state data for the key that was
> +                  pressed.
> +
> +
> +  @retval EFI_SUCCESS     The keystroke information was
> +                          returned.
> +
> +  @retval EFI_NOT_READY   There was no keystroke data available.
> +                          EFI_DEVICE_ERROR The keystroke
> +                          information was not returned due to
> +                          hardware errors.
> +
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimpleTextInExReadKeyStrokeEx (
> +  IN  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
> +  OUT EFI_KEY_DATA                      *KeyData
> +  )
> +/*++
> +
> +  Routine Description:
> +    Reads the next keystroke from the input device. The WaitForKey Event can
> +    be used to test for existance of a keystroke via WaitForEvent () call.
> +
> +  Arguments:
> +    This       - Protocol instance pointer.
> +    KeyData    - A pointer to a buffer that is filled in with the keystroke
> +                 state data for the key that was pressed.
> +
> +  Returns:
> +    EFI_SUCCESS           - The keystroke information was returned.
> +    EFI_NOT_READY         - There was no keystroke data availiable.
> +    EFI_DEVICE_ERROR      - The keystroke information was not returned due to
> +                            hardware errors.
> +    EFI_INVALID_PARAMETER - KeyData is NULL.
> +
> +**/
> +{
> +  EFI_STATUS        Status;
> +  GOP_PRIVATE_DATA  *Private;
> +  EFI_TPL           OldTpl;
> +
> +
> +  if (KeyData == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> +  if (Private->EmuGraphicsWindow == NULL) {
> +    return EFI_NOT_READY;
> +  }
> +
> +  //
> +  // Enter critical section
> +  //
> +  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
> +
> +  Status  = Private->EmuGraphicsWindow->GetKey(Private-
> >EmuGraphicsWindow, KeyData);
> +
> +  //
> +  // Leave critical section and return
> +  //
> +  gBS->RestoreTPL (OldTpl);
> +
> +  return Status;
> +}
> +
> +
> +
> +/**
> +  The SetState() function allows the input device hardware to
> +  have state settings adjusted.
> +
> +  @param This           A pointer to the
> EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
> +
> +  @param KeyToggleState Pointer to the EFI_KEY_TOGGLE_STATE to
> +                        set the state for the input device.
> +
> +
> +  @retval EFI_SUCCESS       The device state was set appropriately.
> +
> +  @retval EFI_DEVICE_ERROR  The device is not functioning
> +                            correctly and could not have the
> +                            setting adjusted.
> +
> +  @retval EFI_UNSUPPORTED   The device does not support the
> +                            ability to have its state set.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimpleTextInExSetState (
> +  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
> +  IN EFI_KEY_TOGGLE_STATE               *KeyToggleState
> +  )
> +{
> +  GOP_PRIVATE_DATA  *Private;
> +  EFI_STATUS        Status;
> +  EFI_TPL           OldTpl;
> +
> +  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> +  if (Private->EmuGraphicsWindow == NULL) {
> +    return EFI_NOT_READY;
> +  }
> +
> +  //
> +  // Enter critical section
> +  //
> +  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
> +
> +  Status  = Private->EmuGraphicsWindow->KeySetState (Private-
> >EmuGraphicsWindow, KeyToggleState);
> +  //
> +  // Leave critical section and return
> +  //
> +  gBS->RestoreTPL (OldTpl);
> +
> +  return Status;
> +}
> +
> +
> +/**
> +  SimpleTextIn and SimpleTextInEx Notify Wait Event
> +
> +  @param  Event                 Event whose notification function is being invoked.
> +  @param  Context               Pointer to GOP_PRIVATE_DATA.
> +
> +**/
> +VOID
> +EFIAPI
> +EmuGopRegisterKeyCallback (
> +  IN EFI_EVENT          Event,
> +  IN VOID               *Context
> +  )
> +{
> +  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *ExNotify =
> (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *)Context;
> +
> +  ExNotify->KeyNotificationFn (&ExNotify->KeyData);
> +}
> +
> +
> +
> +/**
> +  The RegisterKeystrokeNotify() function registers a function
> +  which will be called when a specified keystroke will occur.
> +
> +  @param This                     A pointer to the
> EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
> +
> +  @param KeyData                  A pointer to a buffer that is filled in with
> +                                  the keystroke information for the key that was
> +                                  pressed.
> +
> +  @param KeyNotificationFunction  Points to the function to be
> +                                  called when the key sequence
> +                                  is typed specified by KeyData.
> +
> +
> +  @param NotifyHandle             Points to the unique handle assigned to
> +                                  the registered notification.
> +
> +  @retval EFI_SUCCESS           The device state was set
> +                                appropriately.
> +
> +  @retval EFI_OUT_OF_RESOURCES  Unable to allocate necessary
> +                                data structures.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimpleTextInExRegisterKeyNotify (
> +  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
> +  IN EFI_KEY_DATA                       *KeyData,
> +  IN EFI_KEY_NOTIFY_FUNCTION            KeyNotificationFunction,
> +  OUT EFI_HANDLE                        *NotifyHandle
> +  )
> +{
> +  EFI_STATUS                          Status;
> +  GOP_PRIVATE_DATA                    *Private;
> +  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY     *CurrentNotify;
> +  LIST_ENTRY                          *Link;
> +  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY     *NewNotify;
> +
> +  if (KeyData == NULL || KeyNotificationFunction == NULL || NotifyHandle ==
> NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> +
> +  //
> +  // Return EFI_SUCCESS if the (KeyData, NotificationFunction) is already
> registered.
> +  //
> +  for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link
> = Link->ForwardLink) {
> +    CurrentNotify = CR (
> +                      Link,
> +                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
> +                      NotifyEntry,
> +                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
> +                      );
> +    if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
> +      if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) {
> +        *NotifyHandle = CurrentNotify->NotifyHandle;
> +        return EFI_SUCCESS;
> +      }
> +    }
> +  }
> +
> +  //
> +  // Allocate resource to save the notification function
> +  //
> +  NewNotify = (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) AllocateZeroPool
> (sizeof (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY));
> +  if (NewNotify == NULL) {
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  NewNotify->Signature         =
> EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE;
> +  NewNotify->KeyNotificationFn = KeyNotificationFunction;
> +  NewNotify->NotifyHandle      = (EFI_HANDLE) NewNotify;
> +  CopyMem (&NewNotify->KeyData, KeyData, sizeof (KeyData));
> +  InsertTailList (&Private->NotifyList, &NewNotify->NotifyEntry);
> +
> +  Status = gBS->CreateEvent (
> +                  EVT_NOTIFY_SIGNAL,
> +                  TPL_NOTIFY,
> +                  EmuGopRegisterKeyCallback,
> +                  NewNotify,
> +                  &NewNotify->Event
> +                  );
> +  ASSERT_EFI_ERROR (Status);
> +
> +
> +  *NotifyHandle = NewNotify->NotifyHandle;
> +
> +  return EFI_SUCCESS;
> +
> +}
> +
> +
> +/**
> +  The UnregisterKeystrokeNotify() function removes the
> +  notification which was previously registered.
> +
> +  @param This               A pointer to the
> EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
> +
> +  @param NotificationHandle The handle of the notification
> +                            function being unregistered.
> +
> +  @retval EFI_SUCCESS The device state was set appropriately.
> +
> +  @retval EFI_INVALID_PARAMETER The NotificationHandle is
> +                                invalid.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimpleTextInExUnregisterKeyNotify (
> +  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
> +  IN EFI_HANDLE                         NotificationHandle
> +  )
> +/*++
> +
> +  Routine Description:
> +    Remove a registered notification function from a particular keystroke.
> +
> +  Arguments:
> +    This                    - Protocol instance pointer.
> +    NotificationHandle      - The handle of the notification function being
> unregistered.
> +
> +  Returns:
> +    EFI_SUCCESS             - The notification function was unregistered
> successfully.
> +    EFI_INVALID_PARAMETER   - The NotificationHandle is invalid.
> +
> +**/
> +{
> +  GOP_PRIVATE_DATA                   *Private;
> +  LIST_ENTRY                         *Link;
> +  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
> +
> +  if (NotificationHandle == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  if (((EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) NotificationHandle)-
> >Signature != EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> +
> +  for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link
> = Link->ForwardLink) {
> +    CurrentNotify = CR (
> +                      Link,
> +                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
> +                      NotifyEntry,
> +                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
> +                      );
> +    if (CurrentNotify->NotifyHandle == NotificationHandle) {
> +      //
> +      // Remove the notification function from NotifyList and free resources
> +      //
> +      RemoveEntryList (&CurrentNotify->NotifyEntry);
> +
> +      gBS->CloseEvent (CurrentNotify->Event);
> +
> +      gBS->FreePool (CurrentNotify);
> +      return EFI_SUCCESS;
> +    }
> +  }
> +
> +  //
> +  // Can not find the specified Notification Handle
> +  //
> +  return EFI_INVALID_PARAMETER;
> +}
> +
> +
> +
> +/**
> +  Initialize SimplelTextIn and SimpleTextInEx protocols in the Private
> +  context structure.
> +
> +  @param  Private               Context structure to fill in.
> +
> +  @return EFI_SUCCESS           Initialization was a success
> +
> +**/
> +EFI_STATUS
> +EmuGopInitializeSimpleTextInForWindow (
> +  IN  GOP_PRIVATE_DATA    *Private
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  //
> +  // Initialize Simple Text In protoocol
> +  //
> +  Private->SimpleTextIn.Reset         = EmuGopSimpleTextInReset;
> +  Private->SimpleTextIn.ReadKeyStroke = EmuGopSimpleTextInReadKeyStroke;
> +
> +  Status = gBS->CreateEvent (
> +                  EVT_NOTIFY_WAIT,
> +                  TPL_NOTIFY,
> +                  EmuGopSimpleTextInWaitForKey,
> +                  Private,
> +                  &Private->SimpleTextIn.WaitForKey
> +                  );
> +  ASSERT_EFI_ERROR (Status);
> +
> +
> +  //
> +  // Initialize Simple Text In Ex
> +  //
> +
> +  Private->SimpleTextInEx.Reset               = EmuGopSimpleTextInExResetEx;
> +  Private->SimpleTextInEx.ReadKeyStrokeEx     =
> EmuGopSimpleTextInExReadKeyStrokeEx;
> +  Private->SimpleTextInEx.SetState            = EmuGopSimpleTextInExSetState;
> +  Private->SimpleTextInEx.RegisterKeyNotify   =
> EmuGopSimpleTextInExRegisterKeyNotify;
> +  Private->SimpleTextInEx.UnregisterKeyNotify =
> EmuGopSimpleTextInExUnregisterKeyNotify;
> +
> +  Private->SimpleTextInEx.Reset (&Private->SimpleTextInEx, FALSE);
> +
> +  InitializeListHead (&Private->NotifyList);
> +
> +  Status = gBS->CreateEvent (
> +                  EVT_NOTIFY_WAIT,
> +                  TPL_NOTIFY,
> +                  EmuGopSimpleTextInWaitForKey,
> +                  Private,
> +                  &Private->SimpleTextInEx.WaitForKeyEx
> +                  );
> +  ASSERT_EFI_ERROR (Status);
> +
> +
> +  return Status;
> +}
> +
> +
> +
> +
> +
> +
> +
> +//
> +// Simple Pointer implementation.
> +//
> +
> +
> +/**
> +  Resets the pointer device hardware.
> +
> +  @param  This                  A pointer to the EFI_SIMPLE_POINTER_PROTOCOL
> +                                instance.
> +  @param  ExtendedVerification  Indicates that the driver may perform a
> more exhaustive
> +                                verification operation of the device during reset.
> +
> +  @retval EFI_SUCCESS           The device was reset.
> +  @retval EFI_DEVICE_ERROR      The device is not functioning correctly and
> could not be reset.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimplePointerReset (
> +  IN EFI_SIMPLE_POINTER_PROTOCOL          *This,
> +  IN BOOLEAN                              ExtendedVerification
> +  )
> +{
> +  GOP_PRIVATE_DATA             *Private;
> +  EFI_SIMPLE_POINTER_STATE     State;
> +  EFI_TPL                      OldTpl;
> +
> +  Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);
> +  if (Private->EmuGraphicsWindow == NULL) {
> +    return EFI_SUCCESS;
> +  }
> +
> +  //
> +  // Enter critical section
> +  //
> +  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> +
> +  //
> +  // A reset is draining the Queue
> +  //
> +  while (Private->EmuGraphicsWindow->GetPointerState (Private-
> >EmuGraphicsWindow, &State) == EFI_SUCCESS)
> +    ;
> +
> +  //
> +  // Leave critical section and return
> +  //
> +  gBS->RestoreTPL (OldTpl);
> +  return EFI_SUCCESS;
> +}
> +
> +
> +/**
> +  Retrieves the current state of a pointer device.
> +
> +  @param  This                  A pointer to the EFI_SIMPLE_POINTER_PROTOCOL
> +                                instance.
> +  @param  State                 A pointer to the state information on the pointer
> device.
> +
> +  @retval EFI_SUCCESS           The state of the pointer device was returned in
> State.
> +  @retval EFI_NOT_READY         The state of the pointer device has not
> changed since the last call to
> +                                GetState().
> +  @retval EFI_DEVICE_ERROR      A device error occurred while attempting to
> retrieve the pointer device's
> +                                current state.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimplePointerGetState (
> +  IN EFI_SIMPLE_POINTER_PROTOCOL          *This,
> +  IN OUT EFI_SIMPLE_POINTER_STATE         *State
> +  )
> +{
> +  GOP_PRIVATE_DATA  *Private;
> +  EFI_STATUS        Status;
> +  EFI_TPL           OldTpl;
> +
> +  Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);
> +  if (Private->EmuGraphicsWindow == NULL) {
> +    return EFI_NOT_READY;
> +  }
> +
> +  //
> +  // Enter critical section
> +  //
> +  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
> +
> +  Status  = Private->EmuGraphicsWindow->GetPointerState (Private-
> >EmuGraphicsWindow, State);
> +  //
> +  // Leave critical section and return
> +  //
> +  gBS->RestoreTPL (OldTpl);
> +
> +  return Status;
> +}
> +
> +
> +/**
> +  SimplePointer Notify Wait Event
> +
> +  @param  Event                 Event whose notification function is being invoked.
> +  @param  Context               Pointer to GOP_PRIVATE_DATA.
> +
> +**/
> +VOID
> +EFIAPI
> +EmuGopSimplePointerWaitForInput (
> +  IN EFI_EVENT          Event,
> +  IN VOID               *Context
> +  )
> +{
> +  GOP_PRIVATE_DATA  *Private;
> +  EFI_STATUS        Status;
> +  EFI_TPL           OldTpl;
> +
> +  Private = (GOP_PRIVATE_DATA *) Context;
> +  if (Private->EmuGraphicsWindow == NULL) {
> +    return;
> +  }
> +
> +  //
> +  // Enter critical section
> +  //
> +  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
> +
> +  Status  = Private->EmuGraphicsWindow->CheckPointer (Private-
> >EmuGraphicsWindow);
> +  if (!EFI_ERROR (Status)) {
> +    //
> +    // If the pointer state has changed, signal our event.
> +    //
> +    gBS->SignalEvent (Event);
> +  }
> +  //
> +  // Leave critical section and return
> +  //
> +  gBS->RestoreTPL (OldTpl);
> +}
> +
> +
> +/**
> +  SimplePointer constructor
> +
> +  @param  Private Context structure to fill in.
> +
> +  @retval EFI_SUCCESS Constructor had success
> +
> +**/
> +EFI_STATUS
> +EmuGopInitializeSimplePointerForWindow (
> +  IN  GOP_PRIVATE_DATA    *Private
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  //
> +  // Initialize Simple Pointer protoocol
> +  //
> +  Private->PointerMode.ResolutionX = 1;
> +  Private->PointerMode.ResolutionY = 1;
> +  Private->PointerMode.ResolutionZ = 1;
> +  Private->PointerMode.LeftButton  = TRUE;
> +  Private->PointerMode.RightButton = TRUE;
> +
> +  Private->SimplePointer.Reset     = EmuGopSimplePointerReset;
> +  Private->SimplePointer.GetState  = EmuGopSimplePointerGetState;
> +  Private->SimplePointer.Mode      = &Private->PointerMode;
> +
> +  Status = gBS->CreateEvent (
> +                  EVT_NOTIFY_WAIT,
> +                  TPL_NOTIFY,
> +                  EmuGopSimplePointerWaitForInput,
> +                  Private,
> +                  &Private->SimplePointer.WaitForInput
> +                  );
> +
> +  return Status;
> +}
> diff --git a/EmulatorPkg/EmuGopDxe/GopScreen.c
> b/EmulatorPkg/EmuGopDxe/GopScreen.c
> index aa21fa68de..761d945c15 100644
> --- a/EmulatorPkg/EmuGopDxe/GopScreen.c
> +++ b/EmulatorPkg/EmuGopDxe/GopScreen.c
> @@ -1,416 +1,416 @@
> -/*++ @file
> -
> -Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
> -Portions copyright (c) 2010 - 2011, Apple Inc. 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:
> -
> -    EmuGopScreen.c
> -
> -Abstract:
> -
> -  This file produces the graphics abstration of UGA. It is called by
> -  EmuGopDriver.c file which deals with the EFI 1.1 driver model.
> -  This file just does graphics.
> -
> -**/
> -
> -#include "Gop.h"
> -
> -
> -EFI_EVENT               mGopScreenExitBootServicesEvent;
> -
> -GOP_MODE_DATA mGopModeData[] = {
> -    { 800,  600, 0, 0 },
> -    { 640,  480, 0, 0 },
> -    { 720,  400, 0, 0 },
> -    {1024,  768, 0, 0 },
> -    {1280, 1024, 0, 0 }
> -    };
> -
> -
> -/**
> -  Returns information for an available graphics mode that the graphics device
> -  and the set of active video output devices supports.
> -
> -  @param  This                  The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
> -  @param  ModeNumber            The mode number to return information on.
> -  @param  SizeOfInfo            A pointer to the size, in bytes, of the Info buffer.
> -  @param  Info                  A pointer to callee allocated buffer that returns
> information about ModeNumber.
> -
> -  @retval EFI_SUCCESS           Mode information returned.
> -  @retval EFI_BUFFER_TOO_SMALL  The Info buffer was too small.
> -  @retval EFI_DEVICE_ERROR      A hardware error occurred trying to retrieve
> the video mode.
> -  @retval EFI_NOT_STARTED       Video display is not initialized. Call SetMode ()
> -  @retval EFI_INVALID_PARAMETER One of the input args was NULL.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopQuerytMode (
> -  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL          *This,
> -  IN  UINT32                                ModeNumber,
> -  OUT UINTN                                 *SizeOfInfo,
> -  OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  **Info
> -  )
> -{
> -  GOP_PRIVATE_DATA  *Private;
> -
> -  Private = GOP_PRIVATE_DATA_FROM_THIS (This);
> -
> -  if (Info == NULL || SizeOfInfo == NULL || (UINTN) ModeNumber >= This-
> >Mode->MaxMode) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  *Info = AllocatePool (sizeof
> (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
> -  if (*Info == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
> -
> -  (*Info)->Version = 0;
> -  (*Info)->HorizontalResolution = Private-
> >ModeData[ModeNumber].HorizontalResolution;
> -  (*Info)->VerticalResolution   = Private-
> >ModeData[ModeNumber].VerticalResolution;
> -  (*Info)->PixelFormat = PixelBltOnly;
> -  (*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution;
> -
> -  return EFI_SUCCESS;
> -}
> -
> -
> -
> -/**
> -  Set the video device into the specified mode and clears the visible portions of
> -  the output display to black.
> -
> -  @param  This              The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
> -  @param  ModeNumber        Abstraction that defines the current video mode.
> -
> -  @retval EFI_SUCCESS       The graphics mode specified by ModeNumber was
> selected.
> -  @retval EFI_DEVICE_ERROR  The device had an error and could not complete
> the request.
> -  @retval EFI_UNSUPPORTED   ModeNumber is not supported by this device.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSetMode (
> -  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL  *This,
> -  IN  UINT32                        ModeNumber
> -  )
> -{
> -  EFI_STATUS                      Status;
> -  GOP_PRIVATE_DATA                *Private;
> -  GOP_MODE_DATA                   *ModeData;
> -  EFI_GRAPHICS_OUTPUT_BLT_PIXEL   Fill;
> -
> -  Private = GOP_PRIVATE_DATA_FROM_THIS (This);
> -
> -  if (ModeNumber >= This->Mode->MaxMode) {
> -    return EFI_UNSUPPORTED;
> -  }
> -
> -  ModeData = &Private->ModeData[ModeNumber];
> -  This->Mode->Mode = ModeNumber;
> -  Private->GraphicsOutput.Mode->Info->HorizontalResolution = ModeData-
> >HorizontalResolution;
> -  Private->GraphicsOutput.Mode->Info->VerticalResolution = ModeData-
> >VerticalResolution;
> -  Private->GraphicsOutput.Mode->Info->PixelsPerScanLine = ModeData-
> >HorizontalResolution;
> -
> -  if (Private->HardwareNeedsStarting) {
> -    Status = EmuGopStartWindow (
> -              Private,
> -              ModeData->HorizontalResolution,
> -              ModeData->VerticalResolution,
> -              ModeData->ColorDepth,
> -              ModeData->RefreshRate
> -              );
> -    if (EFI_ERROR (Status)) {
> -      return EFI_DEVICE_ERROR;
> -    }
> -
> -    Private->HardwareNeedsStarting = FALSE;
> -  }
> -
> -
> -  Status = Private->EmuGraphicsWindow->Size(
> -                            Private->EmuGraphicsWindow,
> -                            ModeData->HorizontalResolution,
> -                            ModeData->VerticalResolution
> -                            );
> -
> -
> -  Fill.Red                      = 0x7f;
> -  Fill.Green                    = 0x7F;
> -  Fill.Blue                     = 0x7f;
> -  This->Blt (
> -          This,
> -          &Fill,
> -          EfiBltVideoFill,
> -          0,
> -          0,
> -          0,
> -          0,
> -          ModeData->HorizontalResolution,
> -          ModeData->VerticalResolution,
> -          ModeData->HorizontalResolution * sizeof
> (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
> -          );
> -  return EFI_SUCCESS;
> -}
> -
> -
> -
> -/**
> -  Blt a rectangle of pixels on the graphics screen. Blt stands for BLock Transfer.
> -
> -  @param  This         Protocol instance pointer.
> -  @param  BltBuffer    Buffer containing data to blit into video buffer. This
> -                       buffer has a size of
> Width*Height*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
> -  @param  BltOperation Operation to perform on BlitBuffer and video
> memory
> -  @param  SourceX      X coordinate of source for the BltBuffer.
> -  @param  SourceY      Y coordinate of source for the BltBuffer.
> -  @param  DestinationX X coordinate of destination for the BltBuffer.
> -  @param  DestinationY Y coordinate of destination for the BltBuffer.
> -  @param  Width        Width of rectangle in BltBuffer in pixels.
> -  @param  Height       Hight of rectangle in BltBuffer in pixels.
> -  @param  Delta        OPTIONAL
> -
> -  @retval EFI_SUCCESS           The Blt operation completed.
> -  @retval EFI_INVALID_PARAMETER BltOperation is not valid.
> -  @retval EFI_DEVICE_ERROR      A hardware error occured writting to the
> video buffer.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopBlt (
> -  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL            *This,
> -  IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL           *BltBuffer,   OPTIONAL
> -  IN  EFI_GRAPHICS_OUTPUT_BLT_OPERATION       BltOperation,
> -  IN  UINTN                                   SourceX,
> -  IN  UINTN                                   SourceY,
> -  IN  UINTN                                   DestinationX,
> -  IN  UINTN                                   DestinationY,
> -  IN  UINTN                                   Width,
> -  IN  UINTN                                   Height,
> -  IN  UINTN                                   Delta         OPTIONAL
> -  )
> -{
> -  GOP_PRIVATE_DATA  *Private;
> -  EFI_TPL           OriginalTPL;
> -  EFI_STATUS        Status;
> -  EMU_GRAPHICS_WINDOWS__BLT_ARGS      GopBltArgs;
> -
> -  Private = GOP_PRIVATE_DATA_FROM_THIS (This);
> -
> -  if ((UINT32)BltOperation >= EfiGraphicsOutputBltOperationMax) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  if (Width == 0 || Height == 0) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -  //
> -  // If Delta is zero, then the entire BltBuffer is being used, so Delta
> -  // is the number of bytes in each row of BltBuffer.  Since BltBuffer is Width
> pixels size,
> -  // the number of bytes in each row can be computed.
> -  //
> -  if (Delta == 0) {
> -    Delta = Width * sizeof (EFI_UGA_PIXEL);
> -  }
> -
> -  //
> -  // We have to raise to TPL Notify, so we make an atomic write the frame
> buffer.
> -  // We would not want a timer based event (Cursor, ...) to come in while we
> are
> -  // doing this operation.
> -  //
> -  OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY);
> -
> -  //
> -  // Pack UGA Draw protocol parameters to
> EMU_GRAPHICS_WINDOWS__BLT_ARGS structure to adapt to
> -  // GopBlt() API of Unix UGA IO protocol.
> -  //
> -  GopBltArgs.DestinationX = DestinationX;
> -  GopBltArgs.DestinationY = DestinationY;
> -  GopBltArgs.Height       = Height;
> -  GopBltArgs.Width        = Width;
> -  GopBltArgs.SourceX      = SourceX;
> -  GopBltArgs.SourceY      = SourceY;
> -  GopBltArgs.Delta        = Delta;
> -  Status = Private->EmuGraphicsWindow->Blt (
> -                            Private->EmuGraphicsWindow,
> -                            (EFI_UGA_PIXEL *)BltBuffer,
> -                            (EFI_UGA_BLT_OPERATION)BltOperation,
> -                            &GopBltArgs
> -                            );
> -
> -  gBS->RestoreTPL (OriginalTPL);
> -
> -  return Status;
> -}
> -
> -
> -//
> -// Construction and Destruction functions
> -//
> -
> -EFI_STATUS
> -EmuGopSupported (
> -  IN  EMU_IO_THUNK_PROTOCOL  *EmuIoThunk
> -  )
> -{
> -  //
> -  // Check to see if the IO abstraction represents a device type we support.
> -  //
> -  // This would be replaced a check of PCI subsystem ID, etc.
> -  //
> -  if (!CompareGuid (EmuIoThunk->Protocol,
> &gEmuGraphicsWindowProtocolGuid)) {
> -    return EFI_UNSUPPORTED;
> -  }
> -
> -  return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -EmuGopStartWindow (
> -  IN  GOP_PRIVATE_DATA    *Private,
> -  IN  UINT32              HorizontalResolution,
> -  IN  UINT32              VerticalResolution,
> -  IN  UINT32              ColorDepth,
> -  IN  UINT32              RefreshRate
> -  )
> -{
> -  EFI_STATUS          Status;
> -
> -  //
> -  // Register to be notified on exit boot services so we can destroy the window.
> -  //
> -  Status = gBS->CreateEvent (
> -                  EVT_SIGNAL_EXIT_BOOT_SERVICES,
> -                  TPL_CALLBACK,
> -                  ShutdownGopEvent,
> -                  Private,
> -                  &mGopScreenExitBootServicesEvent
> -                  );
> -
> -  Status = Private->EmuIoThunk->Open (Private->EmuIoThunk);
> -  if (!EFI_ERROR (Status)) {
> -    Private->EmuGraphicsWindow = Private->EmuIoThunk->Interface;
> -
> -    // Register callback to support RegisterKeyNotify()
> -    Status  = Private->EmuGraphicsWindow->RegisterKeyNotify (
> -                                            Private->EmuGraphicsWindow,
> -                                            GopPrivateMakeCallbackFunction,
> -                                            GopPrivateBreakCallbackFunction,
> -                                            Private
> -                                            );
> -    ASSERT_EFI_ERROR (Status);
> -  }
> -  return Status;
> -}
> -
> -EFI_STATUS
> -EmuGopConstructor (
> -  GOP_PRIVATE_DATA    *Private
> -  )
> -{
> -  Private->ModeData = mGopModeData;
> -
> -  Private->GraphicsOutput.QueryMode      = EmuGopQuerytMode;
> -  Private->GraphicsOutput.SetMode        = EmuGopSetMode;
> -  Private->GraphicsOutput.Blt            = EmuGopBlt;
> -
> -  //
> -  // Allocate buffer for Graphics Output Protocol mode information
> -  //
> -  Private->GraphicsOutput.Mode = AllocatePool (sizeof
> (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE));
> -  if (Private->GraphicsOutput.Mode == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -  Private->GraphicsOutput.Mode->Info = AllocatePool (sizeof
> (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
> -  if (Private->GraphicsOutput.Mode->Info == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  Private->GraphicsOutput.Mode->MaxMode = sizeof(mGopModeData) /
> sizeof(GOP_MODE_DATA);
> -  //
> -  // Till now, we have no idea about the window size.
> -  //
> -  Private->GraphicsOutput.Mode->Mode =
> GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;
> -  Private->GraphicsOutput.Mode->Info->Version = 0;
> -  Private->GraphicsOutput.Mode->Info->HorizontalResolution = 0;
> -  Private->GraphicsOutput.Mode->Info->VerticalResolution = 0;
> -  Private->GraphicsOutput.Mode->Info->PixelFormat = PixelBltOnly;
> -  Private->GraphicsOutput.Mode->SizeOfInfo = sizeof
> (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
> -  Private->GraphicsOutput.Mode->FrameBufferBase =
> (EFI_PHYSICAL_ADDRESS) (UINTN) NULL;
> -  Private->GraphicsOutput.Mode->FrameBufferSize = 0;
> -
> -  Private->HardwareNeedsStarting  = TRUE;
> -  Private->EmuGraphicsWindow                  = NULL;
> -
> -  EmuGopInitializeSimpleTextInForWindow (Private);
> -
> -  EmuGopInitializeSimplePointerForWindow (Private);
> -
> -  return EFI_SUCCESS;
> -}
> -
> -
> -
> -EFI_STATUS
> -EmuGopDestructor (
> -  GOP_PRIVATE_DATA     *Private
> -  )
> -{
> -  if (!Private->HardwareNeedsStarting) {
> -    Private->EmuIoThunk->Close (Private->EmuIoThunk);
> -    Private->EmuGraphicsWindow = NULL;
> -  }
> -
> -  //
> -  // Free graphics output protocol occupied resource
> -  //
> -  if (Private->GraphicsOutput.Mode != NULL) {
> -    if (Private->GraphicsOutput.Mode->Info != NULL) {
> -      FreePool (Private->GraphicsOutput.Mode->Info);
> -    }
> -    FreePool (Private->GraphicsOutput.Mode);
> -  }
> -
> -  return EFI_SUCCESS;
> -}
> -
> -
> -VOID
> -EFIAPI
> -ShutdownGopEvent (
> -  IN EFI_EVENT  Event,
> -  IN VOID       *Context
> -  )
> -/*++
> -
> -Routine Description:
> -
> -  This is the UGA screen's callback notification function for exit-boot-services.
> -  All we do here is call EmuGopDestructor().
> -
> -Arguments:
> -
> -  Event   - not used
> -  Context - pointer to the Private structure.
> -
> -Returns:
> -
> -  None.
> -
> -**/
> -{
> -  EmuGopDestructor (Context);
> -}
> -
> +/*++ @file
> +
> +Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
> +Portions copyright (c) 2010 - 2011, Apple Inc. 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:
> +
> +    EmuGopScreen.c
> +
> +Abstract:
> +
> +  This file produces the graphics abstration of UGA. It is called by
> +  EmuGopDriver.c file which deals with the EFI 1.1 driver model.
> +  This file just does graphics.
> +
> +**/
> +
> +#include "Gop.h"
> +
> +
> +EFI_EVENT               mGopScreenExitBootServicesEvent;
> +
> +GOP_MODE_DATA mGopModeData[] = {
> +    { 800,  600, 0, 0 },
> +    { 640,  480, 0, 0 },
> +    { 720,  400, 0, 0 },
> +    {1024,  768, 0, 0 },
> +    {1280, 1024, 0, 0 }
> +    };
> +
> +
> +/**
> +  Returns information for an available graphics mode that the graphics device
> +  and the set of active video output devices supports.
> +
> +  @param  This                  The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
> +  @param  ModeNumber            The mode number to return information on.
> +  @param  SizeOfInfo            A pointer to the size, in bytes, of the Info buffer.
> +  @param  Info                  A pointer to callee allocated buffer that returns
> information about ModeNumber.
> +
> +  @retval EFI_SUCCESS           Mode information returned.
> +  @retval EFI_BUFFER_TOO_SMALL  The Info buffer was too small.
> +  @retval EFI_DEVICE_ERROR      A hardware error occurred trying to retrieve
> the video mode.
> +  @retval EFI_NOT_STARTED       Video display is not initialized. Call SetMode ()
> +  @retval EFI_INVALID_PARAMETER One of the input args was NULL.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopQuerytMode (
> +  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL          *This,
> +  IN  UINT32                                ModeNumber,
> +  OUT UINTN                                 *SizeOfInfo,
> +  OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  **Info
> +  )
> +{
> +  GOP_PRIVATE_DATA  *Private;
> +
> +  Private = GOP_PRIVATE_DATA_FROM_THIS (This);
> +
> +  if (Info == NULL || SizeOfInfo == NULL || (UINTN) ModeNumber >= This-
> >Mode->MaxMode) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  *Info = AllocatePool (sizeof
> (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
> +  if (*Info == NULL) {
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
> +
> +  (*Info)->Version = 0;
> +  (*Info)->HorizontalResolution = Private-
> >ModeData[ModeNumber].HorizontalResolution;
> +  (*Info)->VerticalResolution   = Private-
> >ModeData[ModeNumber].VerticalResolution;
> +  (*Info)->PixelFormat = PixelBltOnly;
> +  (*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution;
> +
> +  return EFI_SUCCESS;
> +}
> +
> +
> +
> +/**
> +  Set the video device into the specified mode and clears the visible portions of
> +  the output display to black.
> +
> +  @param  This              The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
> +  @param  ModeNumber        Abstraction that defines the current video mode.
> +
> +  @retval EFI_SUCCESS       The graphics mode specified by ModeNumber was
> selected.
> +  @retval EFI_DEVICE_ERROR  The device had an error and could not
> complete the request.
> +  @retval EFI_UNSUPPORTED   ModeNumber is not supported by this device.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSetMode (
> +  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL  *This,
> +  IN  UINT32                        ModeNumber
> +  )
> +{
> +  EFI_STATUS                      Status;
> +  GOP_PRIVATE_DATA                *Private;
> +  GOP_MODE_DATA                   *ModeData;
> +  EFI_GRAPHICS_OUTPUT_BLT_PIXEL   Fill;
> +
> +  Private = GOP_PRIVATE_DATA_FROM_THIS (This);
> +
> +  if (ModeNumber >= This->Mode->MaxMode) {
> +    return EFI_UNSUPPORTED;
> +  }
> +
> +  ModeData = &Private->ModeData[ModeNumber];
> +  This->Mode->Mode = ModeNumber;
> +  Private->GraphicsOutput.Mode->Info->HorizontalResolution = ModeData-
> >HorizontalResolution;
> +  Private->GraphicsOutput.Mode->Info->VerticalResolution = ModeData-
> >VerticalResolution;
> +  Private->GraphicsOutput.Mode->Info->PixelsPerScanLine = ModeData-
> >HorizontalResolution;
> +
> +  if (Private->HardwareNeedsStarting) {
> +    Status = EmuGopStartWindow (
> +              Private,
> +              ModeData->HorizontalResolution,
> +              ModeData->VerticalResolution,
> +              ModeData->ColorDepth,
> +              ModeData->RefreshRate
> +              );
> +    if (EFI_ERROR (Status)) {
> +      return EFI_DEVICE_ERROR;
> +    }
> +
> +    Private->HardwareNeedsStarting = FALSE;
> +  }
> +
> +
> +  Status = Private->EmuGraphicsWindow->Size(
> +                            Private->EmuGraphicsWindow,
> +                            ModeData->HorizontalResolution,
> +                            ModeData->VerticalResolution
> +                            );
> +
> +
> +  Fill.Red                      = 0x7f;
> +  Fill.Green                    = 0x7F;
> +  Fill.Blue                     = 0x7f;
> +  This->Blt (
> +          This,
> +          &Fill,
> +          EfiBltVideoFill,
> +          0,
> +          0,
> +          0,
> +          0,
> +          ModeData->HorizontalResolution,
> +          ModeData->VerticalResolution,
> +          ModeData->HorizontalResolution * sizeof
> (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
> +          );
> +  return EFI_SUCCESS;
> +}
> +
> +
> +
> +/**
> +  Blt a rectangle of pixels on the graphics screen. Blt stands for BLock Transfer.
> +
> +  @param  This         Protocol instance pointer.
> +  @param  BltBuffer    Buffer containing data to blit into video buffer. This
> +                       buffer has a size of
> Width*Height*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
> +  @param  BltOperation Operation to perform on BlitBuffer and video
> memory
> +  @param  SourceX      X coordinate of source for the BltBuffer.
> +  @param  SourceY      Y coordinate of source for the BltBuffer.
> +  @param  DestinationX X coordinate of destination for the BltBuffer.
> +  @param  DestinationY Y coordinate of destination for the BltBuffer.
> +  @param  Width        Width of rectangle in BltBuffer in pixels.
> +  @param  Height       Hight of rectangle in BltBuffer in pixels.
> +  @param  Delta        OPTIONAL
> +
> +  @retval EFI_SUCCESS           The Blt operation completed.
> +  @retval EFI_INVALID_PARAMETER BltOperation is not valid.
> +  @retval EFI_DEVICE_ERROR      A hardware error occured writting to the
> video buffer.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopBlt (
> +  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL            *This,
> +  IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL           *BltBuffer,   OPTIONAL
> +  IN  EFI_GRAPHICS_OUTPUT_BLT_OPERATION       BltOperation,
> +  IN  UINTN                                   SourceX,
> +  IN  UINTN                                   SourceY,
> +  IN  UINTN                                   DestinationX,
> +  IN  UINTN                                   DestinationY,
> +  IN  UINTN                                   Width,
> +  IN  UINTN                                   Height,
> +  IN  UINTN                                   Delta         OPTIONAL
> +  )
> +{
> +  GOP_PRIVATE_DATA  *Private;
> +  EFI_TPL           OriginalTPL;
> +  EFI_STATUS        Status;
> +  EMU_GRAPHICS_WINDOWS__BLT_ARGS      GopBltArgs;
> +
> +  Private = GOP_PRIVATE_DATA_FROM_THIS (This);
> +
> +  if ((UINT32)BltOperation >= EfiGraphicsOutputBltOperationMax) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  if (Width == 0 || Height == 0) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +  //
> +  // If Delta is zero, then the entire BltBuffer is being used, so Delta
> +  // is the number of bytes in each row of BltBuffer.  Since BltBuffer is Width
> pixels size,
> +  // the number of bytes in each row can be computed.
> +  //
> +  if (Delta == 0) {
> +    Delta = Width * sizeof (EFI_UGA_PIXEL);
> +  }
> +
> +  //
> +  // We have to raise to TPL Notify, so we make an atomic write the frame
> buffer.
> +  // We would not want a timer based event (Cursor, ...) to come in while we
> are
> +  // doing this operation.
> +  //
> +  OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY);
> +
> +  //
> +  // Pack UGA Draw protocol parameters to
> EMU_GRAPHICS_WINDOWS__BLT_ARGS structure to adapt to
> +  // GopBlt() API of Unix UGA IO protocol.
> +  //
> +  GopBltArgs.DestinationX = DestinationX;
> +  GopBltArgs.DestinationY = DestinationY;
> +  GopBltArgs.Height       = Height;
> +  GopBltArgs.Width        = Width;
> +  GopBltArgs.SourceX      = SourceX;
> +  GopBltArgs.SourceY      = SourceY;
> +  GopBltArgs.Delta        = Delta;
> +  Status = Private->EmuGraphicsWindow->Blt (
> +                            Private->EmuGraphicsWindow,
> +                            (EFI_UGA_PIXEL *)BltBuffer,
> +                            (EFI_UGA_BLT_OPERATION)BltOperation,
> +                            &GopBltArgs
> +                            );
> +
> +  gBS->RestoreTPL (OriginalTPL);
> +
> +  return Status;
> +}
> +
> +
> +//
> +// Construction and Destruction functions
> +//
> +
> +EFI_STATUS
> +EmuGopSupported (
> +  IN  EMU_IO_THUNK_PROTOCOL  *EmuIoThunk
> +  )
> +{
> +  //
> +  // Check to see if the IO abstraction represents a device type we support.
> +  //
> +  // This would be replaced a check of PCI subsystem ID, etc.
> +  //
> +  if (!CompareGuid (EmuIoThunk->Protocol,
> &gEmuGraphicsWindowProtocolGuid)) {
> +    return EFI_UNSUPPORTED;
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +EmuGopStartWindow (
> +  IN  GOP_PRIVATE_DATA    *Private,
> +  IN  UINT32              HorizontalResolution,
> +  IN  UINT32              VerticalResolution,
> +  IN  UINT32              ColorDepth,
> +  IN  UINT32              RefreshRate
> +  )
> +{
> +  EFI_STATUS          Status;
> +
> +  //
> +  // Register to be notified on exit boot services so we can destroy the window.
> +  //
> +  Status = gBS->CreateEvent (
> +                  EVT_SIGNAL_EXIT_BOOT_SERVICES,
> +                  TPL_CALLBACK,
> +                  ShutdownGopEvent,
> +                  Private,
> +                  &mGopScreenExitBootServicesEvent
> +                  );
> +
> +  Status = Private->EmuIoThunk->Open (Private->EmuIoThunk);
> +  if (!EFI_ERROR (Status)) {
> +    Private->EmuGraphicsWindow = Private->EmuIoThunk->Interface;
> +
> +    // Register callback to support RegisterKeyNotify()
> +    Status  = Private->EmuGraphicsWindow->RegisterKeyNotify (
> +                                            Private->EmuGraphicsWindow,
> +                                            GopPrivateMakeCallbackFunction,
> +                                            GopPrivateBreakCallbackFunction,
> +                                            Private
> +                                            );
> +    ASSERT_EFI_ERROR (Status);
> +  }
> +  return Status;
> +}
> +
> +EFI_STATUS
> +EmuGopConstructor (
> +  GOP_PRIVATE_DATA    *Private
> +  )
> +{
> +  Private->ModeData = mGopModeData;
> +
> +  Private->GraphicsOutput.QueryMode      = EmuGopQuerytMode;
> +  Private->GraphicsOutput.SetMode        = EmuGopSetMode;
> +  Private->GraphicsOutput.Blt            = EmuGopBlt;
> +
> +  //
> +  // Allocate buffer for Graphics Output Protocol mode information
> +  //
> +  Private->GraphicsOutput.Mode = AllocatePool (sizeof
> (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE));
> +  if (Private->GraphicsOutput.Mode == NULL) {
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +  Private->GraphicsOutput.Mode->Info = AllocatePool (sizeof
> (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
> +  if (Private->GraphicsOutput.Mode->Info == NULL) {
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  Private->GraphicsOutput.Mode->MaxMode = sizeof(mGopModeData) /
> sizeof(GOP_MODE_DATA);
> +  //
> +  // Till now, we have no idea about the window size.
> +  //
> +  Private->GraphicsOutput.Mode->Mode =
> GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;
> +  Private->GraphicsOutput.Mode->Info->Version = 0;
> +  Private->GraphicsOutput.Mode->Info->HorizontalResolution = 0;
> +  Private->GraphicsOutput.Mode->Info->VerticalResolution = 0;
> +  Private->GraphicsOutput.Mode->Info->PixelFormat = PixelBltOnly;
> +  Private->GraphicsOutput.Mode->SizeOfInfo = sizeof
> (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
> +  Private->GraphicsOutput.Mode->FrameBufferBase =
> (EFI_PHYSICAL_ADDRESS) (UINTN) NULL;
> +  Private->GraphicsOutput.Mode->FrameBufferSize = 0;
> +
> +  Private->HardwareNeedsStarting  = TRUE;
> +  Private->EmuGraphicsWindow                  = NULL;
> +
> +  EmuGopInitializeSimpleTextInForWindow (Private);
> +
> +  EmuGopInitializeSimplePointerForWindow (Private);
> +
> +  return EFI_SUCCESS;
> +}
> +
> +
> +
> +EFI_STATUS
> +EmuGopDestructor (
> +  GOP_PRIVATE_DATA     *Private
> +  )
> +{
> +  if (!Private->HardwareNeedsStarting) {
> +    Private->EmuIoThunk->Close (Private->EmuIoThunk);
> +    Private->EmuGraphicsWindow = NULL;
> +  }
> +
> +  //
> +  // Free graphics output protocol occupied resource
> +  //
> +  if (Private->GraphicsOutput.Mode != NULL) {
> +    if (Private->GraphicsOutput.Mode->Info != NULL) {
> +      FreePool (Private->GraphicsOutput.Mode->Info);
> +    }
> +    FreePool (Private->GraphicsOutput.Mode);
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +
> +VOID
> +EFIAPI
> +ShutdownGopEvent (
> +  IN EFI_EVENT  Event,
> +  IN VOID       *Context
> +  )
> +/*++
> +
> +Routine Description:
> +
> +  This is the UGA screen's callback notification function for exit-boot-services.
> +  All we do here is call EmuGopDestructor().
> +
> +Arguments:
> +
> +  Event   - not used
> +  Context - pointer to the Private structure.
> +
> +Returns:
> +
> +  None.
> +
> +**/
> +{
> +  EmuGopDestructor (Context);
> +}
> +
> diff --git a/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c
> b/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c
> index 09d16fd8b6..0031baea52 100644
> --- a/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c
> +++ b/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c
> @@ -42,7 +42,7 @@ EFI_SIMPLE_NETWORK_PROTOCOL gEmuSnpTemplate =
> {
>    NULL                      // Mode
>   };
> 
> -EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {
> +EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {
>    EfiSimpleNetworkStopped,      //  State
>    NET_ETHER_ADDR_LEN,           //  HwAddressSize
>    NET_ETHER_HEADER_SIZE,        //  MediaHeaderSize
> diff --git a/EmulatorPkg/Include/Library/EmuMagicPageLib.h
> b/EmulatorPkg/Include/Library/EmuMagicPageLib.h
> index e0c339a3b8..edae364b06 100644
> --- a/EmulatorPkg/Include/Library/EmuMagicPageLib.h
> +++ b/EmulatorPkg/Include/Library/EmuMagicPageLib.h
> @@ -1,38 +1,38 @@
> -/*++ @file
> -The PCD, gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage, points to a
> magic page
> -of memory that is like SRAM on an embedded system. This file defines what
> goes
> -where in the magic page.
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> -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 __EMU_MAGIC_PAGE_LIB_H__
> -#define __EMU_MAGIC_PAGE_LIB_H__
> -
> -#include <PiPei.h>
> -#include <Library/PcdLib.h>
> -#include <Protocol/EmuThunk.h>
> -
> -typedef struct {
> -  // Used by PEI Core and PEIMs to store the PEI Services pointer.
> -  // Privilege issues prevent using the PI mechanism in the emulator.
> -  CONST EFI_PEI_SERVICES **PeiServicesTablePointer;
> -
> -  // Used by SecPeiServicesLib
> -  EFI_PEI_PPI_DESCRIPTOR  *PpiList;
> -
> -  // Needed by PEI PEI PeCoffLoaderExtraActionLib
> -  EMU_THUNK_PROTOCOL   *Thunk;
> -} EMU_MAGIC_PAGE_LAYOUT;
> -
> -#define EMU_MAGIC_PAGE() ((EMU_MAGIC_PAGE_LAYOUT
> *)((UINTN)PcdGet64 (PcdPeiServicesTablePage)))
> -
> -#endif
> +/*++ @file
> +The PCD, gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage, points to a
> magic page
> +of memory that is like SRAM on an embedded system. This file defines what
> goes
> +where in the magic page.
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> +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 __EMU_MAGIC_PAGE_LIB_H__
> +#define __EMU_MAGIC_PAGE_LIB_H__
> +
> +#include <PiPei.h>
> +#include <Library/PcdLib.h>
> +#include <Protocol/EmuThunk.h>
> +
> +typedef struct {
> +  // Used by PEI Core and PEIMs to store the PEI Services pointer.
> +  // Privilege issues prevent using the PI mechanism in the emulator.
> +  CONST EFI_PEI_SERVICES **PeiServicesTablePointer;
> +
> +  // Used by SecPeiServicesLib
> +  EFI_PEI_PPI_DESCRIPTOR  *PpiList;
> +
> +  // Needed by PEI PEI PeCoffLoaderExtraActionLib
> +  EMU_THUNK_PROTOCOL   *Thunk;
> +} EMU_MAGIC_PAGE_LAYOUT;
> +
> +#define EMU_MAGIC_PAGE() ((EMU_MAGIC_PAGE_LAYOUT
> *)((UINTN)PcdGet64 (PcdPeiServicesTablePage)))
> +
> +#endif
> diff --git a/EmulatorPkg/Include/Library/EmuThunkLib.h
> b/EmulatorPkg/Include/Library/EmuThunkLib.h
> index 98b22e16ee..e18a613d94 100644
> --- a/EmulatorPkg/Include/Library/EmuThunkLib.h
> +++ b/EmulatorPkg/Include/Library/EmuThunkLib.h
> @@ -1,42 +1,42 @@
> -/*++ @file
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> -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 __EMU_THUNK_LIB_H__
> -#define __EMU_THUNK_LIB_H__
> -
> -#include <Protocol/EmuThunk.h>
> -
> -
> -extern EMU_THUNK_PROTOCOL   *gEmuThunk;
> -
> -
> -/**
> -  Serach the EMU IO Thunk database for a matching EMU IO Thunk
> -  Protocol instance.
> -
> -  @param  Protocol   Protocol to search for.
> -  @param  Instance   Instance of protocol to search for.
> -
> -  @retval NULL       Protocol and Instance not found.
> -  @retval other      EMU IO Thunk protocol that matched.
> -
> -**/
> -EMU_IO_THUNK_PROTOCOL *
> -EFIAPI
> -GetIoThunkInstance (
> -  IN  EFI_GUID  *Protocol,
> -  IN  UINTN     Instance
> -  );
> -
> -
> -#endif
> +/*++ @file
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> +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 __EMU_THUNK_LIB_H__
> +#define __EMU_THUNK_LIB_H__
> +
> +#include <Protocol/EmuThunk.h>
> +
> +
> +extern EMU_THUNK_PROTOCOL   *gEmuThunk;
> +
> +
> +/**
> +  Serach the EMU IO Thunk database for a matching EMU IO Thunk
> +  Protocol instance.
> +
> +  @param  Protocol   Protocol to search for.
> +  @param  Instance   Instance of protocol to search for.
> +
> +  @retval NULL       Protocol and Instance not found.
> +  @retval other      EMU IO Thunk protocol that matched.
> +
> +**/
> +EMU_IO_THUNK_PROTOCOL *
> +EFIAPI
> +GetIoThunkInstance (
> +  IN  EFI_GUID  *Protocol,
> +  IN  UINTN     Instance
> +  );
> +
> +
> +#endif
> diff --git a/EmulatorPkg/Include/Library/PpiListLib.h
> b/EmulatorPkg/Include/Library/PpiListLib.h
> index c1271b23c8..fad1473a41 100644
> --- a/EmulatorPkg/Include/Library/PpiListLib.h
> +++ b/EmulatorPkg/Include/Library/PpiListLib.h
> @@ -1,21 +1,21 @@
> -/*++ @file
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> -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 __PPI_LIST_LIB_H__
> -#define __PPI_LIST_LIB_H__
> -
> -
> -extern CONST EFI_PEI_PPI_DESCRIPTOR  *gPpiList;
> -
> -
> -#endif
> +/*++ @file
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> +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 __PPI_LIST_LIB_H__
> +#define __PPI_LIST_LIB_H__
> +
> +
> +extern CONST EFI_PEI_PPI_DESCRIPTOR  *gPpiList;
> +
> +
> +#endif
> diff --git a/EmulatorPkg/Include/Library/SmbiosLib.h
> b/EmulatorPkg/Include/Library/SmbiosLib.h
> index 8ee14e07dd..6dcb7336d5 100644
> --- a/EmulatorPkg/Include/Library/SmbiosLib.h
> +++ b/EmulatorPkg/Include/Library/SmbiosLib.h
> @@ -1,202 +1,202 @@
> -/** @file
> -  Provides library functions for common SMBIOS operations. Only available to
> DXE
> -  and UEFI module types.
> -
> -
> -Copyright (c) 2012, Apple Inc. All rights reserved.
> -Portitions Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
> -This program and the accompanying materials are licensed and made
> available under
> -the terms and conditions of the BSD License that 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 _SMBIOS_LIB_H__
> -#define _SMBIOS_LIB_H__
> -
> -#include <IndustryStandard/SmBios.h>
> -#include <Protocol/Smbios.h>
> -
> -
> -///
> -/// Cache copy of the SMBIOS Protocol pointer
> -///
> -extern EFI_SMBIOS_PROTOCOL *gSmbios;
> -
> -
> -///
> -/// Template for SMBIOS table initialization.
> -/// The SMBIOS_TABLE_STRING types in the formated area must match the
> -/// StringArray sequene.
> -///
> -typedef struct {
> -  //
> -  // formatted area of a given SMBIOS record
> -  //
> -  SMBIOS_STRUCTURE    *Entry;
> -  //
> -  // NULL terminated array of ASCII strings to be added to the SMBIOS record.
> -  //
> -  CHAR8               **StringArray;
> -} SMBIOS_TEMPLATE_ENTRY;
> -
> -
> -/**
> -  Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
> -  entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
> -
> -  @param  Template   Array of SMBIOS_TEMPLATE_ENTRY entries.
> -
> -  @retval EFI_SUCCESS          New SMBIOS tables were created.
> -  @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibInitializeFromTemplate (
> -  IN  SMBIOS_TEMPLATE_ENTRY   *Template
> -  );
> -
> -
> -
> -/**
> -  Create SMBIOS record.
> -
> -  Converts a fixed SMBIOS structure and an array of pointers to strings into
> -  an SMBIOS record where the strings are cat'ed on the end of the fixed record
> -  and terminated via a double NULL and add to SMBIOS table.
> -
> -  SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
> -    { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof
> (SMBIOS_TABLE_TYPE12), 0 },
> -    1 // StringCount
> -  };
> -  CHAR8 *gSmbiosType12Strings[] = {
> -    "Not Found",
> -    NULL
> -  };
> -
> -  ...
> -  AddSmbiosEntryFromTemplate (
> -    (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
> -    gSmbiosType12Strings
> -    );
> -
> -  @param  SmbiosEntry   Fixed SMBIOS structure
> -  @param  StringArray   Array of strings to convert to an SMBIOS string pack.
> -                        NULL is OK.
> -
> -  @retval EFI_SUCCESS          New SmbiosEntry was added to SMBIOS table.
> -  @retval EFI_OUT_OF_RESOURCES SmbiosEntry was not added.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibCreateEntry (
> -  IN  SMBIOS_STRUCTURE *SmbiosEntry,
> -  IN  CHAR8            **StringArray
> -  );
> -
> -
> -/**
> -  Update the string associated with an existing SMBIOS record.
> -
> -  This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> -  SMBIOS record is defined by how many strings were present when Add() was
> called.
> -
> -  @param[in]    SmbiosHandle    SMBIOS Handle of structure that will have its
> string updated.
> -  @param[in]    StringNumber    The non-zero string number of the string to
> update.
> -  @param[in]    String          Update the StringNumber string with String.
> -
> -  @retval EFI_SUCCESS           SmbiosHandle had its StringNumber String
> updated.
> -  @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> -  @retval EFI_UNSUPPORTED       String was not added because it is longer
> than the SMBIOS Table supports.
> -  @retval EFI_NOT_FOUND         The StringNumber.is not valid for this SMBIOS
> record.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibUpdateString (
> -  IN  EFI_SMBIOS_HANDLE     SmbiosHandle,
> -  IN  SMBIOS_TABLE_STRING   StringNumber,
> -  IN  CHAR8                 *String
> -  );
> -
> -/**
> -  Update the string associated with an existing SMBIOS record.
> -
> -  This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> -  SMBIOS record is defined by how many strings were present when Add() was
> called.
> -
> -  @param[in]    SmbiosHandle    SMBIOS Handle of structure that will have its
> string updated.
> -  @param[in]    StringNumber    The non-zero string number of the string to
> update.
> -  @param[in]    String          Update the StringNumber string with String.
> -
> -  @retval EFI_SUCCESS           SmbiosHandle had its StringNumber String
> updated.
> -  @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> -  @retval EFI_UNSUPPORTED       String was not added because it is longer
> than the SMBIOS Table supports.
> -  @retval EFI_NOT_FOUND         The StringNumber.is not valid for this SMBIOS
> record.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibUpdateUnicodeString (
> -  IN  EFI_SMBIOS_HANDLE     SmbiosHandle,
> -  IN  SMBIOS_TABLE_STRING   StringNumber,
> -  IN  CHAR16                *String
> -  );
> -
> -/**
> -  Allow caller to read a specific SMBIOS string
> -
> -  @param[in]    Header          SMBIOS record that contains the string.
> -  @param[in[    StringNumber    Instance of SMBIOS string 1 - N.
> -
> -  @retval NULL                  Instance of Type SMBIOS string was not found.
> -  @retval Other                 Pointer to matching SMBIOS string.
> -**/
> -CHAR8 *
> -EFIAPI
> -SmbiosLibReadString (
> -  IN SMBIOS_STRUCTURE   *Header,
> -  IN EFI_SMBIOS_STRING  StringNumber
> -  );
> -
> -
> -/**
> -  Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
> -
> -  @param[in]    Type            Type of the next SMBIOS record to return.
> -  @param[in[    Instance        Instance of SMBIOS record 0 - N-1.
> -  @param[out]   SmbiosHandle    Returns SMBIOS handle for the matching
> record.
> -
> -  @retval NULL                  Instance of Type SMBIOS record was not found.
> -  @retval Other                 Pointer to matching SMBIOS record.
> -**/
> -SMBIOS_STRUCTURE *
> -EFIAPI
> -SmbiosLibGetRecord (
> -  IN  EFI_SMBIOS_TYPE   Type,
> -  IN  UINTN             Instance,
> -  OUT EFI_SMBIOS_HANDLE *SmbiosHandle
> -  );
> -
> -/**
> -  Remove an SMBIOS record.
> -
> -  This function removes an SMBIOS record using the handle specified by
> SmbiosHandle.
> -
> -  @param[in]    SmbiosHandle        The handle of the SMBIOS record to
> remove.
> -
> -  @retval EFI_SUCCESS               SMBIOS record was removed.
> -  @retval EFI_INVALID_PARAMETER     SmbiosHandle does not specify a valid
> SMBIOS record.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibRemove (
> -  OUT EFI_SMBIOS_HANDLE SmbiosHandle
> -  );
> -
> -
> -
> -
> -#endif
> +/** @file
> +  Provides library functions for common SMBIOS operations. Only available to
> DXE
> +  and UEFI module types.
> +
> +
> +Copyright (c) 2012, Apple Inc. All rights reserved.
> +Portitions Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
> +This program and the accompanying materials are licensed and made
> available under
> +the terms and conditions of the BSD License that 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 _SMBIOS_LIB_H__
> +#define _SMBIOS_LIB_H__
> +
> +#include <IndustryStandard/SmBios.h>
> +#include <Protocol/Smbios.h>
> +
> +
> +///
> +/// Cache copy of the SMBIOS Protocol pointer
> +///
> +extern EFI_SMBIOS_PROTOCOL *gSmbios;
> +
> +
> +///
> +/// Template for SMBIOS table initialization.
> +/// The SMBIOS_TABLE_STRING types in the formated area must match the
> +/// StringArray sequene.
> +///
> +typedef struct {
> +  //
> +  // formatted area of a given SMBIOS record
> +  //
> +  SMBIOS_STRUCTURE    *Entry;
> +  //
> +  // NULL terminated array of ASCII strings to be added to the SMBIOS record.
> +  //
> +  CHAR8               **StringArray;
> +} SMBIOS_TEMPLATE_ENTRY;
> +
> +
> +/**
> +  Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
> +  entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
> +
> +  @param  Template   Array of SMBIOS_TEMPLATE_ENTRY entries.
> +
> +  @retval EFI_SUCCESS          New SMBIOS tables were created.
> +  @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibInitializeFromTemplate (
> +  IN  SMBIOS_TEMPLATE_ENTRY   *Template
> +  );
> +
> +
> +
> +/**
> +  Create SMBIOS record.
> +
> +  Converts a fixed SMBIOS structure and an array of pointers to strings into
> +  an SMBIOS record where the strings are cat'ed on the end of the fixed
> record
> +  and terminated via a double NULL and add to SMBIOS table.
> +
> +  SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
> +    { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof
> (SMBIOS_TABLE_TYPE12), 0 },
> +    1 // StringCount
> +  };
> +  CHAR8 *gSmbiosType12Strings[] = {
> +    "Not Found",
> +    NULL
> +  };
> +
> +  ...
> +  AddSmbiosEntryFromTemplate (
> +    (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
> +    gSmbiosType12Strings
> +    );
> +
> +  @param  SmbiosEntry   Fixed SMBIOS structure
> +  @param  StringArray   Array of strings to convert to an SMBIOS string pack.
> +                        NULL is OK.
> +
> +  @retval EFI_SUCCESS          New SmbiosEntry was added to SMBIOS table.
> +  @retval EFI_OUT_OF_RESOURCES SmbiosEntry was not added.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibCreateEntry (
> +  IN  SMBIOS_STRUCTURE *SmbiosEntry,
> +  IN  CHAR8            **StringArray
> +  );
> +
> +
> +/**
> +  Update the string associated with an existing SMBIOS record.
> +
> +  This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> +  SMBIOS record is defined by how many strings were present when Add() was
> called.
> +
> +  @param[in]    SmbiosHandle    SMBIOS Handle of structure that will have its
> string updated.
> +  @param[in]    StringNumber    The non-zero string number of the string to
> update.
> +  @param[in]    String          Update the StringNumber string with String.
> +
> +  @retval EFI_SUCCESS           SmbiosHandle had its StringNumber String
> updated.
> +  @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> +  @retval EFI_UNSUPPORTED       String was not added because it is longer
> than the SMBIOS Table supports.
> +  @retval EFI_NOT_FOUND         The StringNumber.is not valid for this SMBIOS
> record.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibUpdateString (
> +  IN  EFI_SMBIOS_HANDLE     SmbiosHandle,
> +  IN  SMBIOS_TABLE_STRING   StringNumber,
> +  IN  CHAR8                 *String
> +  );
> +
> +/**
> +  Update the string associated with an existing SMBIOS record.
> +
> +  This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> +  SMBIOS record is defined by how many strings were present when Add() was
> called.
> +
> +  @param[in]    SmbiosHandle    SMBIOS Handle of structure that will have its
> string updated.
> +  @param[in]    StringNumber    The non-zero string number of the string to
> update.
> +  @param[in]    String          Update the StringNumber string with String.
> +
> +  @retval EFI_SUCCESS           SmbiosHandle had its StringNumber String
> updated.
> +  @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> +  @retval EFI_UNSUPPORTED       String was not added because it is longer
> than the SMBIOS Table supports.
> +  @retval EFI_NOT_FOUND         The StringNumber.is not valid for this SMBIOS
> record.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibUpdateUnicodeString (
> +  IN  EFI_SMBIOS_HANDLE     SmbiosHandle,
> +  IN  SMBIOS_TABLE_STRING   StringNumber,
> +  IN  CHAR16                *String
> +  );
> +
> +/**
> +  Allow caller to read a specific SMBIOS string
> +
> +  @param[in]    Header          SMBIOS record that contains the string.
> +  @param[in[    StringNumber    Instance of SMBIOS string 1 - N.
> +
> +  @retval NULL                  Instance of Type SMBIOS string was not found.
> +  @retval Other                 Pointer to matching SMBIOS string.
> +**/
> +CHAR8 *
> +EFIAPI
> +SmbiosLibReadString (
> +  IN SMBIOS_STRUCTURE   *Header,
> +  IN EFI_SMBIOS_STRING  StringNumber
> +  );
> +
> +
> +/**
> +  Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
> +
> +  @param[in]    Type            Type of the next SMBIOS record to return.
> +  @param[in[    Instance        Instance of SMBIOS record 0 - N-1.
> +  @param[out]   SmbiosHandle    Returns SMBIOS handle for the matching
> record.
> +
> +  @retval NULL                  Instance of Type SMBIOS record was not found.
> +  @retval Other                 Pointer to matching SMBIOS record.
> +**/
> +SMBIOS_STRUCTURE *
> +EFIAPI
> +SmbiosLibGetRecord (
> +  IN  EFI_SMBIOS_TYPE   Type,
> +  IN  UINTN             Instance,
> +  OUT EFI_SMBIOS_HANDLE *SmbiosHandle
> +  );
> +
> +/**
> +  Remove an SMBIOS record.
> +
> +  This function removes an SMBIOS record using the handle specified by
> SmbiosHandle.
> +
> +  @param[in]    SmbiosHandle        The handle of the SMBIOS record to
> remove.
> +
> +  @retval EFI_SUCCESS               SMBIOS record was removed.
> +  @retval EFI_INVALID_PARAMETER     SmbiosHandle does not specify a valid
> SMBIOS record.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibRemove (
> +  OUT EFI_SMBIOS_HANDLE SmbiosHandle
> +  );
> +
> +
> +
> +
> +#endif
> diff --git a/EmulatorPkg/Include/Protocol/EmuBlockIo.h
> b/EmulatorPkg/Include/Protocol/EmuBlockIo.h
> index 8e5463c74e..45ca5b9a7a 100644
> --- a/EmulatorPkg/Include/Protocol/EmuBlockIo.h
> +++ b/EmulatorPkg/Include/Protocol/EmuBlockIo.h
> @@ -62,7 +62,7 @@ EFI_STATUS
>    @param[in]       MediaId    Id of the media, changes every time the media is
>                                replaced.
>    @param[in]       Lba        The starting Logical Block Address to read from.
> -  @param[in, out]  Token	    A pointer to the token associated with the
> transaction.
> +  @param[in, out]  Token      A pointer to the token associated with the
> transaction.
>    @param[in]       BufferSize Size of Buffer, must be a multiple of device block
> size.
>    @param[out]      Buffer     A pointer to the destination buffer for the data.
> The
>                                caller is responsible for either having implicit or
> diff --git a/EmulatorPkg/Include/Protocol/EmuFileSystem.h
> b/EmulatorPkg/Include/Protocol/EmuFileSystem.h
> index 6d8717479b..d13853877e 100644
> --- a/EmulatorPkg/Include/Protocol/EmuFileSystem.h
> +++ b/EmulatorPkg/Include/Protocol/EmuFileSystem.h
> @@ -1,140 +1,140 @@
> -/** @file
> -  SimpleFileSystem protocol as defined in the UEFI 2.0 specification.
> -
> -  The SimpleFileSystem protocol is the programmatic access to the FAT
> (12,16,32)
> -  file system specified in UEFI 2.0. It can also be used to abstract a file
> -  system other than FAT.
> -
> -  UEFI 2.0 can boot from any valid EFI image contained in a SimpleFileSystem.
> -
> -Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
> -Portions copyright (c) 2011, Apple Inc. All rights reserved.
> -This program and the accompanying materials are licensed and made
> available under
> -the terms and conditions of the BSD License that 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 _EMU_UGA_IO_H_
> -#define _EMU_UGA_IO_H_
> -
> -#include <Protocol/SimplePointer.h>
> -#include <Protocol/SimpleTextIn.h>
> -#include <Protocol/SimpleTextInEx.h>
> -#include <Protocol/UgaDraw.h>
> -
> -#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
> - { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA,
> 0xC1 } }
> -
> -typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL
> EMU_GRAPHICS_WINDOW_PROTOCOL;
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
> -  EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> -  );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
> -  EMU_GRAPHICS_WINDOW_PROTOCOL  *Uga,
> -  UINT32                        Width,
> -  UINT32                        Height
> -  );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
> -  EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> -  );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
> -  EMU_GRAPHICS_WINDOW_PROTOCOL  *Uga,
> -  EFI_KEY_DATA                  *key
> -  );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
> -  IN EMU_GRAPHICS_WINDOW_PROTOCOL   *GraphicsWindows,
> -  IN EFI_KEY_TOGGLE_STATE           *KeyToggleState
> -  );
> -
> -
> -typedef
> -VOID
> -(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
> -  IN VOID           *Context,
> -  IN EFI_KEY_DATA   *KeyData
> -  );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
> -  IN EMU_GRAPHICS_WINDOW_PROTOCOL                       *GraphicsWindows,
> -  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK   CallBack,
> -  IN VOID                                               *Context
> -  );
> -
> -
> -typedef struct {
> -    UINTN                                   SourceX;
> -    UINTN                                   SourceY;
> -    UINTN                                   DestinationX;
> -    UINTN                                   DestinationY;
> -    UINTN                                   Width;
> -    UINTN                                   Height;
> -    UINTN                                   Delta;
> -} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
> -  IN  EMU_GRAPHICS_WINDOW_PROTOCOL            *GraphicsWindows,
> -  IN  EFI_UGA_PIXEL                           *BltBuffer OPTIONAL,
> -  IN  EFI_UGA_BLT_OPERATION                   BltOperation,
> -  IN  EMU_GRAPHICS_WINDOWS__BLT_ARGS          *Args
> -  );
> -
> -typedef
> -BOOLEAN
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
> -  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,
> -  IN  EFI_KEY_DATA                  *KeyData
> -  );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
> -  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
> -  );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
> -  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,
> -  EFI_SIMPLE_POINTER_STATE      *state
> -  );
> -
> -struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
> -  EMU_GRAPHICS_WINDOWS_SIZE                    Size;
> -  EMU_GRAPHICS_WINDOWS_CHECK_KEY               CheckKey;
> -  EMU_GRAPHICS_WINDOWS_KEY_SET_STATE           KeySetState;
> -  EMU_GRAPHICS_WINDOWS_GET_KEY                 GetKey;
> -  EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY     RegisterKeyNotify;
> -  EMU_GRAPHICS_WINDOWS_BLT                     Blt;
> -  EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED          IsKeyPressed;
> -  EMU_GRAPHICS_WINDOWS_CHECK_POINTER           CheckPointer;
> -  EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE       GetPointerState;
> -};
> -
> -
> -extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
> -
> -#endif
> +/** @file
> +  SimpleFileSystem protocol as defined in the UEFI 2.0 specification.
> +
> +  The SimpleFileSystem protocol is the programmatic access to the FAT
> (12,16,32)
> +  file system specified in UEFI 2.0. It can also be used to abstract a file
> +  system other than FAT.
> +
> +  UEFI 2.0 can boot from any valid EFI image contained in a SimpleFileSystem.
> +
> +Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
> +Portions copyright (c) 2011, Apple Inc. All rights reserved.
> +This program and the accompanying materials are licensed and made
> available under
> +the terms and conditions of the BSD License that 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 _EMU_UGA_IO_H_
> +#define _EMU_UGA_IO_H_
> +
> +#include <Protocol/SimplePointer.h>
> +#include <Protocol/SimpleTextIn.h>
> +#include <Protocol/SimpleTextInEx.h>
> +#include <Protocol/UgaDraw.h>
> +
> +#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
> + { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA,
> 0xC1 } }
> +
> +typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL
> EMU_GRAPHICS_WINDOW_PROTOCOL;
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
> +  EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> +  );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
> +  EMU_GRAPHICS_WINDOW_PROTOCOL  *Uga,
> +  UINT32                        Width,
> +  UINT32                        Height
> +  );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
> +  EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> +  );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
> +  EMU_GRAPHICS_WINDOW_PROTOCOL  *Uga,
> +  EFI_KEY_DATA                  *key
> +  );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
> +  IN EMU_GRAPHICS_WINDOW_PROTOCOL   *GraphicsWindows,
> +  IN EFI_KEY_TOGGLE_STATE           *KeyToggleState
> +  );
> +
> +
> +typedef
> +VOID
> +(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
> +  IN VOID           *Context,
> +  IN EFI_KEY_DATA   *KeyData
> +  );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
> +  IN EMU_GRAPHICS_WINDOW_PROTOCOL                       *GraphicsWindows,
> +  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK   CallBack,
> +  IN VOID                                               *Context
> +  );
> +
> +
> +typedef struct {
> +    UINTN                                   SourceX;
> +    UINTN                                   SourceY;
> +    UINTN                                   DestinationX;
> +    UINTN                                   DestinationY;
> +    UINTN                                   Width;
> +    UINTN                                   Height;
> +    UINTN                                   Delta;
> +} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
> +  IN  EMU_GRAPHICS_WINDOW_PROTOCOL            *GraphicsWindows,
> +  IN  EFI_UGA_PIXEL                           *BltBuffer OPTIONAL,
> +  IN  EFI_UGA_BLT_OPERATION                   BltOperation,
> +  IN  EMU_GRAPHICS_WINDOWS__BLT_ARGS          *Args
> +  );
> +
> +typedef
> +BOOLEAN
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
> +  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,
> +  IN  EFI_KEY_DATA                  *KeyData
> +  );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
> +  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
> +  );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
> +  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,
> +  EFI_SIMPLE_POINTER_STATE      *state
> +  );
> +
> +struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
> +  EMU_GRAPHICS_WINDOWS_SIZE                    Size;
> +  EMU_GRAPHICS_WINDOWS_CHECK_KEY               CheckKey;
> +  EMU_GRAPHICS_WINDOWS_KEY_SET_STATE           KeySetState;
> +  EMU_GRAPHICS_WINDOWS_GET_KEY                 GetKey;
> +  EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY     RegisterKeyNotify;
> +  EMU_GRAPHICS_WINDOWS_BLT                     Blt;
> +  EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED          IsKeyPressed;
> +  EMU_GRAPHICS_WINDOWS_CHECK_POINTER           CheckPointer;
> +  EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE       GetPointerState;
> +};
> +
> +
> +extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
> +
> +#endif
> diff --git a/EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h
> b/EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h
> index 844159a766..e502fc68da 100644
> --- a/EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h
> +++ b/EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h
> @@ -1,134 +1,134 @@
> -/*++ @file
> -
> -Copyright (c) 2006, Tristan Gingold. All rights reserved.<BR>
> -Portitions copyright (c) 2010 - 2011, Apple Inc. 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 _EMU_UGA_IO_H_
> -#define _EMU_UGA_IO_H_
> -
> -#include <Protocol/SimplePointer.h>
> -#include <Protocol/SimpleTextIn.h>
> -#include <Protocol/SimpleTextInEx.h>
> -#include <Protocol/UgaDraw.h>
> -
> -#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
> - { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA,
> 0xC1 } }
> -
> -typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL
> EMU_GRAPHICS_WINDOW_PROTOCOL;
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
> -  EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> -  );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
> -  EMU_GRAPHICS_WINDOW_PROTOCOL  *Uga,
> -  UINT32                        Width,
> -  UINT32                        Height
> -  );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
> -  EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> -  );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
> -  EMU_GRAPHICS_WINDOW_PROTOCOL  *Uga,
> -  EFI_KEY_DATA                  *key
> -  );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
> -  IN EMU_GRAPHICS_WINDOW_PROTOCOL   *GraphicsWindows,
> -  IN EFI_KEY_TOGGLE_STATE           *KeyToggleState
> -  );
> -
> -
> -typedef
> -VOID
> -(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
> -  IN VOID           *Context,
> -  IN EFI_KEY_DATA   *KeyData
> -  );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
> -  IN EMU_GRAPHICS_WINDOW_PROTOCOL                       *GraphicsWindows,
> -  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> MakeCallBack,
> -  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> BreakCallBack,
> -  IN VOID                                               *Context
> -  );
> -
> -
> -typedef struct {
> -    UINTN                                   SourceX;
> -    UINTN                                   SourceY;
> -    UINTN                                   DestinationX;
> -    UINTN                                   DestinationY;
> -    UINTN                                   Width;
> -    UINTN                                   Height;
> -    UINTN                                   Delta;
> -} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
> -  IN  EMU_GRAPHICS_WINDOW_PROTOCOL            *GraphicsWindows,
> -  IN  EFI_UGA_PIXEL                           *BltBuffer OPTIONAL,
> -  IN  EFI_UGA_BLT_OPERATION                   BltOperation,
> -  IN  EMU_GRAPHICS_WINDOWS__BLT_ARGS          *Args
> -  );
> -
> -typedef
> -BOOLEAN
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
> -  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,
> -  IN  EFI_KEY_DATA                  *KeyData
> -  );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
> -  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
> -  );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
> -  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,
> -  EFI_SIMPLE_POINTER_STATE      *state
> -  );
> -
> -struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
> -  EMU_GRAPHICS_WINDOWS_SIZE                    Size;
> -  EMU_GRAPHICS_WINDOWS_CHECK_KEY               CheckKey;
> -  EMU_GRAPHICS_WINDOWS_KEY_SET_STATE           KeySetState;
> -  EMU_GRAPHICS_WINDOWS_GET_KEY                 GetKey;
> -  EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY     RegisterKeyNotify;
> -  EMU_GRAPHICS_WINDOWS_BLT                     Blt;
> -  EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED          IsKeyPressed;
> -  EMU_GRAPHICS_WINDOWS_CHECK_POINTER           CheckPointer;
> -  EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE       GetPointerState;
> -};
> -
> -
> -extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
> -
> -#endif
> +/*++ @file
> +
> +Copyright (c) 2006, Tristan Gingold. All rights reserved.<BR>
> +Portitions copyright (c) 2010 - 2011, Apple Inc. 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 _EMU_UGA_IO_H_
> +#define _EMU_UGA_IO_H_
> +
> +#include <Protocol/SimplePointer.h>
> +#include <Protocol/SimpleTextIn.h>
> +#include <Protocol/SimpleTextInEx.h>
> +#include <Protocol/UgaDraw.h>
> +
> +#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
> + { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA,
> 0xC1 } }
> +
> +typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL
> EMU_GRAPHICS_WINDOW_PROTOCOL;
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
> +  EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> +  );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
> +  EMU_GRAPHICS_WINDOW_PROTOCOL  *Uga,
> +  UINT32                        Width,
> +  UINT32                        Height
> +  );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
> +  EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> +  );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
> +  EMU_GRAPHICS_WINDOW_PROTOCOL  *Uga,
> +  EFI_KEY_DATA                  *key
> +  );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
> +  IN EMU_GRAPHICS_WINDOW_PROTOCOL   *GraphicsWindows,
> +  IN EFI_KEY_TOGGLE_STATE           *KeyToggleState
> +  );
> +
> +
> +typedef
> +VOID
> +(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
> +  IN VOID           *Context,
> +  IN EFI_KEY_DATA   *KeyData
> +  );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
> +  IN EMU_GRAPHICS_WINDOW_PROTOCOL                       *GraphicsWindows,
> +  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> MakeCallBack,
> +  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> BreakCallBack,
> +  IN VOID                                               *Context
> +  );
> +
> +
> +typedef struct {
> +    UINTN                                   SourceX;
> +    UINTN                                   SourceY;
> +    UINTN                                   DestinationX;
> +    UINTN                                   DestinationY;
> +    UINTN                                   Width;
> +    UINTN                                   Height;
> +    UINTN                                   Delta;
> +} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
> +  IN  EMU_GRAPHICS_WINDOW_PROTOCOL            *GraphicsWindows,
> +  IN  EFI_UGA_PIXEL                           *BltBuffer OPTIONAL,
> +  IN  EFI_UGA_BLT_OPERATION                   BltOperation,
> +  IN  EMU_GRAPHICS_WINDOWS__BLT_ARGS          *Args
> +  );
> +
> +typedef
> +BOOLEAN
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
> +  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,
> +  IN  EFI_KEY_DATA                  *KeyData
> +  );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
> +  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
> +  );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
> +  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,
> +  EFI_SIMPLE_POINTER_STATE      *state
> +  );
> +
> +struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
> +  EMU_GRAPHICS_WINDOWS_SIZE                    Size;
> +  EMU_GRAPHICS_WINDOWS_CHECK_KEY               CheckKey;
> +  EMU_GRAPHICS_WINDOWS_KEY_SET_STATE           KeySetState;
> +  EMU_GRAPHICS_WINDOWS_GET_KEY                 GetKey;
> +  EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY     RegisterKeyNotify;
> +  EMU_GRAPHICS_WINDOWS_BLT                     Blt;
> +  EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED          IsKeyPressed;
> +  EMU_GRAPHICS_WINDOWS_CHECK_POINTER           CheckPointer;
> +  EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE       GetPointerState;
> +};
> +
> +
> +extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
> +
> +#endif
> diff --git a/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c
> b/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c
> index 7478a5ef2a..aa2066e132 100644
> --- a/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c
> +++ b/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c
> @@ -180,4 +180,4 @@ DevicePathToTextLibConstructor (
>    DevicePathFromTextAddFilter (L"EmuThread", DevPathFromTextEmuThread);
>    DevicePathFromTextAddFilter (L"EmuFs", DevPathFromTextEmuFs);
>    return EFI_SUCCESS;
> -}
> \ No newline at end of file
> +}
> diff --git a/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf
> b/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf
> index f5726785e1..c484f8ec16 100644
> --- a/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf
> +++ b/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf
> @@ -45,4 +45,4 @@ [Protocols]
>    gEmuGraphicsWindowProtocolGuid
>    gEfiSimpleFileSystemProtocolGuid
>    gEmuBlockIoProtocolGuid
> -  gEmuThreadThunkProtocolGuid
> \ No newline at end of file
> +  gEmuThreadThunkProtocolGuid
> diff --git a/EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c
> b/EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c
> index 22f8da7b64..7dd2d49451 100644
> --- a/EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c
> +++ b/EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c
> @@ -85,4 +85,4 @@ GetIoThunkInstance (
>    }
> 
>    return NULL;
> -}
> \ No newline at end of file
> +}
> diff --git
> a/EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActio
> nLib.inf
> b/EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActio
> nLib.inf
> index f79ebc78e2..682231b83e 100644
> ---
> a/EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActio
> nLib.inf
> +++
> b/EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActio
> nLib.inf
> @@ -1,48 +1,48 @@
> -## @file
> -# PeCoff extra action libary for DXE phase that run Emu emulator.
> -#
> -# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
> -# Portions copyright (c) 2011, Apple Inc. 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.
> -
> -#
> -#
> -##
> -
> -[Defines]
> -  INF_VERSION                    = 0x00010005
> -  BASE_NAME                      = DxeEmuPeCoffExtraActionLib
> -  FILE_GUID                      = 68FCD487-D230-6846-95B1-5E1F2EF942C4
> -  MODULE_TYPE                    = DXE_DRIVER
> -  VERSION_STRING                 = 1.0
> -  LIBRARY_CLASS                  = PeCoffExtraActionLib|DXE_CORE DXE_DRIVER
> DXE_RUNTIME_DRIVER UEFI_DRIVER
> -
> -  CONSTRUCTOR                    = DxeEmuPeCoffLibExtraActionConstructor
> -
> -#
> -# The following information is for reference only and not required by the build
> tools.
> -#
> -#  VALID_ARCHITECTURES           = IA32
> -#
> -
> -[Sources]
> -  DxeEmuPeCoffExtraActionLib.c
> -
> -[Packages]
> -  MdePkg/MdePkg.dec
> -  EmulatorPkg/EmulatorPkg.dec
> -
> -[LibraryClasses]
> -  DebugLib
> -  HobLib
> -  BaseMemoryLib
> -
> -[Protocols]
> -  gEmuThunkProtocolGuid                     # PROTOCOL ALWAYS_CONSUMED
> -
> +## @file
> +# PeCoff extra action libary for DXE phase that run Emu emulator.
> +#
> +# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
> +# Portions copyright (c) 2011, Apple Inc. 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.
> +
> +#
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010005
> +  BASE_NAME                      = DxeEmuPeCoffExtraActionLib
> +  FILE_GUID                      = 68FCD487-D230-6846-95B1-5E1F2EF942C4
> +  MODULE_TYPE                    = DXE_DRIVER
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = PeCoffExtraActionLib|DXE_CORE DXE_DRIVER
> DXE_RUNTIME_DRIVER UEFI_DRIVER
> +
> +  CONSTRUCTOR                    = DxeEmuPeCoffLibExtraActionConstructor
> +
> +#
> +# The following information is for reference only and not required by the build
> tools.
> +#
> +#  VALID_ARCHITECTURES           = IA32
> +#
> +
> +[Sources]
> +  DxeEmuPeCoffExtraActionLib.c
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  EmulatorPkg/EmulatorPkg.dec
> +
> +[LibraryClasses]
> +  DebugLib
> +  HobLib
> +  BaseMemoryLib
> +
> +[Protocols]
> +  gEmuThunkProtocolGuid                     # PROTOCOL ALWAYS_CONSUMED
> +
> diff --git
> a/EmulatorPkg/Library/DxeEmuStdErrSerialPortLib/DxeEmuStdErrSerialPortLib.
> c
> b/EmulatorPkg/Library/DxeEmuStdErrSerialPortLib/DxeEmuStdErrSerialPortLib.
> c
> index 00d9f19369..6bd44bfd0d 100644
> ---
> a/EmulatorPkg/Library/DxeEmuStdErrSerialPortLib/DxeEmuStdErrSerialPortLib.
> c
> +++
> b/EmulatorPkg/Library/DxeEmuStdErrSerialPortLib/DxeEmuStdErrSerialPortLib.
> c
> @@ -69,7 +69,7 @@ SerialPortWrite (
>    if (gEmuThunk == NULL) {
>      return NumberOfBytes;
>    }
> -
> +
>    return gEmuThunk->WriteStdErr (Buffer, NumberOfBytes);
>  }
> 
> diff --git a/EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c
> b/EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c
> index e555026601..b995266cc8 100644
> --- a/EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c
> +++ b/EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c
> @@ -47,4 +47,4 @@ KeyMapBreak (
>    )
>  {
>    return EFI_SUCCESS;
> -}
> \ No newline at end of file
> +}
> diff --git
> a/EmulatorPkg/Library/PeiCoreServicesTablePointerLib/PeiServicesTablePointe
> r.c
> b/EmulatorPkg/Library/PeiCoreServicesTablePointerLib/PeiServicesTablePointe
> r.c
> index 06f995b0d3..72b68c283c 100644
> ---
> a/EmulatorPkg/Library/PeiCoreServicesTablePointerLib/PeiServicesTablePointe
> r.c
> +++
> b/EmulatorPkg/Library/PeiCoreServicesTablePointerLib/PeiServicesTablePointe
> r.c
> @@ -89,16 +89,16 @@ PeiServicesTablePointerLibConstructor (
>  }
> 
>  /**
> -  Perform CPU specific actions required to migrate the PEI Services Table
> +  Perform CPU specific actions required to migrate the PEI Services Table
>    pointer from temporary RAM to permanent RAM.
> 
> -  For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
> +  For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
>    immediately preceding the Interrupt Descriptor Table (IDT) in memory.
> -  For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
> +  For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
>    immediately preceding the Interrupt Descriptor Table (IDT) in memory.
>    For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in
> -  a dedicated CPU register.  This means that there is no memory storage
> -  associated with storing the PEI Services Table pointer, so no additional
> +  a dedicated CPU register.  This means that there is no memory storage
> +  associated with storing the PEI Services Table pointer, so no additional
>    migration actions are required for Itanium or ARM CPUs.
> 
>  **/
> @@ -109,7 +109,7 @@ MigratePeiServicesTablePointer (
>    )
>  {
>    //
> -  //  PEI Services Table pointer is cached in the global variable. No additional
> +  //  PEI Services Table pointer is cached in the global variable. No additional
>    //  migration actions are required.
>    //
>    return;
> diff --git
> a/EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraAction
> Lib.inf
> b/EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraAction
> Lib.inf
> index 9a757f7294..fdaf19ab6c 100644
> ---
> a/EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraAction
> Lib.inf
> +++
> b/EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraAction
> Lib.inf
> @@ -1,49 +1,49 @@
> -## @file
> -# PeCoff extra action libary for Pei phase that run Emu emulator.
> -#
> -# Lib to provide memory journal status code reporting Routines
> -# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
> -# Portions copyright (c) 2011, Apple Inc. 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.
> -
> -#
> -#
> -##
> -
> -[Defines]
> -  INF_VERSION                    = 0x00010005
> -  BASE_NAME                      = PeiEmuPeCoffExtraActionLib
> -  FILE_GUID                      = 79C4E72A-730B-F040-8129-95877B3A97A8
> -  MODULE_TYPE                    = PEIM
> -  VERSION_STRING                 = 1.0
> -  LIBRARY_CLASS                  = PeCoffExtraActionLib|PEI_CORE PEIM
> -
> -#
> -# The following information is for reference only and not required by the build
> tools.
> -#
> -#  VALID_ARCHITECTURES           = IA32
> -#
> -
> -[Sources]
> -  PeiEmuPeCoffExtraActionLib.c
> -
> -[Packages]
> -  MdePkg/MdePkg.dec
> -  EmulatorPkg/EmulatorPkg.dec
> -
> -[LibraryClasses]
> -  BaseLib
> -  PeiServicesLib
> -  DebugLib
> -
> -[Ppis]
> -  gEmuThunkPpiGuid                          # PPI ALWAYS_CONSUMED
> -
> -[Pcd]
> -  gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage
> +## @file
> +# PeCoff extra action libary for Pei phase that run Emu emulator.
> +#
> +# Lib to provide memory journal status code reporting Routines
> +# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
> +# Portions copyright (c) 2011, Apple Inc. 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.
> +
> +#
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010005
> +  BASE_NAME                      = PeiEmuPeCoffExtraActionLib
> +  FILE_GUID                      = 79C4E72A-730B-F040-8129-95877B3A97A8
> +  MODULE_TYPE                    = PEIM
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = PeCoffExtraActionLib|PEI_CORE PEIM
> +
> +#
> +# The following information is for reference only and not required by the build
> tools.
> +#
> +#  VALID_ARCHITECTURES           = IA32
> +#
> +
> +[Sources]
> +  PeiEmuPeCoffExtraActionLib.c
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  EmulatorPkg/EmulatorPkg.dec
> +
> +[LibraryClasses]
> +  BaseLib
> +  PeiServicesLib
> +  DebugLib
> +
> +[Ppis]
> +  gEmuThunkPpiGuid                          # PPI ALWAYS_CONSUMED
> +
> +[Pcd]
> +  gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage
> diff --git
> a/EmulatorPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c
> b/EmulatorPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c
> index 5aaf296389..d79688820b 100644
> ---
> a/EmulatorPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c
> +++
> b/EmulatorPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c
> @@ -134,16 +134,16 @@ PeiServicesTablePointerLibConstructor (
>  }
> 
>  /**
> -  Perform CPU specific actions required to migrate the PEI Services Table
> +  Perform CPU specific actions required to migrate the PEI Services Table
>    pointer from temporary RAM to permanent RAM.
> 
> -  For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
> +  For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
>    immediately preceding the Interrupt Descriptor Table (IDT) in memory.
> -  For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
> +  For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
>    immediately preceding the Interrupt Descriptor Table (IDT) in memory.
>    For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in
> -  a dedicated CPU register.  This means that there is no memory storage
> -  associated with storing the PEI Services Table pointer, so no additional
> +  a dedicated CPU register.  This means that there is no memory storage
> +  associated with storing the PEI Services Table pointer, so no additional
>    migration actions are required for Itanium or ARM CPUs.
> 
>  **/
> @@ -154,7 +154,7 @@ MigratePeiServicesTablePointer (
>    )
>  {
>    //
> -  //  PEI Services Table pointer is cached in the global variable. No additional
> +  //  PEI Services Table pointer is cached in the global variable. No additional
>    //  migration actions are required.
>    //
>    return;
> diff --git
> a/EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTable
> Pointer.c
> b/EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTable
> Pointer.c
> index fa04ed3e04..383460b342 100644
> ---
> a/EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTable
> Pointer.c
> +++
> b/EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTable
> Pointer.c
> @@ -72,16 +72,16 @@ GetPeiServicesTablePointer (
>  }
> 
>  /**
> -  Perform CPU specific actions required to migrate the PEI Services Table
> +  Perform CPU specific actions required to migrate the PEI Services Table
>    pointer from temporary RAM to permanent RAM.
> 
> -  For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
> +  For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
>    immediately preceding the Interrupt Descriptor Table (IDT) in memory.
> -  For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
> +  For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
>    immediately preceding the Interrupt Descriptor Table (IDT) in memory.
>    For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in
> -  a dedicated CPU register.  This means that there is no memory storage
> -  associated with storing the PEI Services Table pointer, so no additional
> +  a dedicated CPU register.  This means that there is no memory storage
> +  associated with storing the PEI Services Table pointer, so no additional
>    migration actions are required for Itanium or ARM CPUs.
> 
>  **/
> @@ -92,7 +92,7 @@ MigratePeiServicesTablePointer (
>    )
>  {
>    //
> -  //  PEI Services Table pointer is cached in SRAM. No additional
> +  //  PEI Services Table pointer is cached in SRAM. No additional
>    //  migration actions are required.
>    //
>    return;
> diff --git a/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf
> b/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf
> index e473b52376..0f23178533 100644
> --- a/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf
> +++ b/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf
> @@ -44,4 +44,4 @@ [LibraryClasses]
>    PeiServicesLib
> 
>  [Ppis]
> -  gEmuThunkPpiGuid
> \ No newline at end of file
> +  gEmuThunkPpiGuid
> diff --git a/EmulatorPkg/Library/SecPeiServicesLib/FwVol.c
> b/EmulatorPkg/Library/SecPeiServicesLib/FwVol.c
> index 7fa4ddb594..a48f2b5f53 100644
> --- a/EmulatorPkg/Library/SecPeiServicesLib/FwVol.c
> +++ b/EmulatorPkg/Library/SecPeiServicesLib/FwVol.c
> @@ -1,281 +1,281 @@
> -/*++ @file
> -  A simple FV stack so the SEC can extract the SEC Core from an
> -  FV.
> -
> -Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#include <PiPei.h>
> -
> -
> -#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
> -  (ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment)
> - 1))
> -
> -EFI_FFS_FILE_STATE
> -GetFileState (
> -  IN UINT8                ErasePolarity,
> -  IN EFI_FFS_FILE_HEADER  *FfsHeader
> -  )
> -/*++
> -
> -Routine Description:
> -  Returns the highest bit set of the State field
> -
> -Arguments:
> -  ErasePolarity   - Erase Polarity  as defined by EFI_FVB2_ERASE_POLARITY
> -                    in the Attributes field.
> -  FfsHeader       - Pointer to FFS File Header.
> -
> -Returns:
> -  Returns the highest bit in the State field
> -
> -**/
> -{
> -  EFI_FFS_FILE_STATE  FileState;
> -  EFI_FFS_FILE_STATE  HighestBit;
> -
> -  FileState = FfsHeader->State;
> -
> -  if (ErasePolarity != 0) {
> -    FileState = (EFI_FFS_FILE_STATE)~FileState;
> -  }
> -
> -  HighestBit = 0x80;
> -  while (HighestBit != 0 && (HighestBit & FileState) == 0) {
> -    HighestBit >>= 1;
> -  }
> -
> -  return HighestBit;
> -}
> -
> -UINT8
> -CalculateHeaderChecksum (
> -  IN EFI_FFS_FILE_HEADER  *FileHeader
> -  )
> -/*++
> -
> -Routine Description:
> -  Calculates the checksum of the header of a file.
> -
> -Arguments:
> -  FileHeader       - Pointer to FFS File Header.
> -
> -Returns:
> -  Checksum of the header.
> -
> -**/
> -{
> -  UINT8 *ptr;
> -  UINTN Index;
> -  UINT8 Sum;
> -
> -  Sum = 0;
> -  ptr = (UINT8 *) FileHeader;
> -
> -  for (Index = 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index += 4) {
> -    Sum = (UINT8) (Sum + ptr[Index]);
> -    Sum = (UINT8) (Sum + ptr[Index + 1]);
> -    Sum = (UINT8) (Sum + ptr[Index + 2]);
> -    Sum = (UINT8) (Sum + ptr[Index + 3]);
> -  }
> -
> -  for (; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) {
> -    Sum = (UINT8) (Sum + ptr[Index]);
> -  }
> -  //
> -  // State field (since this indicates the different state of file).
> -  //
> -  Sum = (UINT8) (Sum - FileHeader->State);
> -  //
> -  // Checksum field of the file is not part of the header checksum.
> -  //
> -  Sum = (UINT8) (Sum - FileHeader->IntegrityCheck.Checksum.File);
> -
> -  return Sum;
> -}
> -
> -EFI_STATUS
> -SecFfsFindNextFile (
> -  IN EFI_FV_FILETYPE             SearchType,
> -  IN EFI_PEI_FV_HANDLE           FvHandle,
> -  IN OUT EFI_PEI_FILE_HANDLE     *FileHandle
> -  )
> -/*++
> -
> -Routine Description:
> -    Given the input file pointer, search for the next matching file in the
> -    FFS volume as defined by SearchType. The search starts from FileHeader
> inside
> -    the Firmware Volume defined by FwVolHeader.
> -
> -Arguments:
> -    SearchType - Filter to find only files of this type.
> -                 Type EFI_FV_FILETYPE_ALL causes no filtering to be done.
> -    FwVolHeader - Pointer to the FV header of the volume to search.
> -                  This parameter must point to a valid FFS volume.
> -    FileHeader  - Pointer to the current file from which to begin searching.
> -                  This pointer will be updated upon return to reflect the file
> -                  found.
> -
> -Returns:
> -    EFI_NOT_FOUND - No files matching the search criteria were found
> -    EFI_SUCCESS
> -
> -**/
> -{
> -  EFI_FFS_FILE_HEADER *FfsFileHeader;
> -  UINT32              FileLength;
> -  UINT32              FileOccupiedSize;
> -  UINT32              FileOffset;
> -  UINT64              FvLength;
> -  UINT8               ErasePolarity;
> -  UINT8               FileState;
> -  EFI_FIRMWARE_VOLUME_HEADER  *FwVolHeader;
> -  EFI_FFS_FILE_HEADER         **FileHeader;
> -
> -  //
> -  // Convert the handle of FV to FV header for memory-mapped firmware
> volume
> -  //
> -  FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) FvHandle;
> -  FileHeader  = (EFI_FFS_FILE_HEADER **)FileHandle;
> -
> -  FvLength = FwVolHeader->FvLength;
> -  if (FwVolHeader->Attributes & EFI_FVB2_ERASE_POLARITY) {
> -    ErasePolarity = 1;
> -  } else {
> -    ErasePolarity = 0;
> -  }
> -  //
> -  // If FileHeader is not specified (NULL) start with the first file in the
> -  // firmware volume.  Otherwise, start from the FileHeader.
> -  //
> -  if (*FileHeader == NULL) {
> -    FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FwVolHeader +
> FwVolHeader->HeaderLength);
> -  } else {
> -    //
> -    // Length is 24 bits wide so mask upper 8 bits
> -    // FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.
> -    //
> -    FileLength        = *(UINT32 *) (*FileHeader)->Size & 0x00FFFFFF;
> -    FileOccupiedSize  = GET_OCCUPIED_SIZE (FileLength, 8);
> -    FfsFileHeader     = (EFI_FFS_FILE_HEADER *) ((UINT8 *) *FileHeader +
> FileOccupiedSize);
> -  }
> -
> -  FileOffset = (UINT32) ((UINT8 *) FfsFileHeader - (UINT8 *) FwVolHeader);
> -
> -  while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) {
> -    //
> -    // Get FileState which is the highest bit of the State
> -    //
> -    FileState = GetFileState (ErasePolarity, FfsFileHeader);
> -
> -    switch (FileState) {
> -
> -    case EFI_FILE_HEADER_INVALID:
> -      FileOffset += sizeof (EFI_FFS_FILE_HEADER);
> -      FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + sizeof
> (EFI_FFS_FILE_HEADER));
> -      break;
> -
> -    case EFI_FILE_DATA_VALID:
> -    case EFI_FILE_MARKED_FOR_UPDATE:
> -      if (CalculateHeaderChecksum (FfsFileHeader) == 0) {
> -        FileLength        = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
> -        FileOccupiedSize  = GET_OCCUPIED_SIZE (FileLength, 8);
> -
> -        if ((SearchType == FfsFileHeader->Type) || (SearchType ==
> EFI_FV_FILETYPE_ALL)) {
> -
> -          *FileHeader = FfsFileHeader;
> -
> -          return EFI_SUCCESS;
> -        }
> -
> -        FileOffset += FileOccupiedSize;
> -        FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader +
> FileOccupiedSize);
> -      } else {
> -        return EFI_NOT_FOUND;
> -      }
> -      break;
> -
> -    case EFI_FILE_DELETED:
> -      FileLength        = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
> -      FileOccupiedSize  = GET_OCCUPIED_SIZE (FileLength, 8);
> -      FileOffset += FileOccupiedSize;
> -      FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader +
> FileOccupiedSize);
> -      break;
> -
> -    default:
> -      return EFI_NOT_FOUND;
> -
> -    }
> -  }
> -
> -  return EFI_NOT_FOUND;
> -}
> -
> -EFI_STATUS
> -SecFfsFindSectionData (
> -  IN EFI_SECTION_TYPE      SectionType,
> -  IN EFI_FFS_FILE_HEADER   *FfsFileHeader,
> -  IN OUT VOID              **SectionData
> -  )
> -/*++
> -
> -Routine Description:
> -    Given the input file pointer, search for the next matching section in the
> -    FFS volume.
> -
> -Arguments:
> -    SearchType    - Filter to find only sections of this type.
> -    FfsFileHeader - Pointer to the current file to search.
> -    SectionData   - Pointer to the Section matching SectionType in FfsFileHeader.
> -                     NULL if section not found
> -
> -Returns:
> -    EFI_NOT_FOUND - No files matching the search criteria were found
> -    EFI_SUCCESS
> -
> -**/
> -{
> -  UINT32                    FileSize;
> -  EFI_COMMON_SECTION_HEADER *Section;
> -  UINT32                    SectionLength;
> -  UINT32                    ParsedLength;
> -
> -  //
> -  // Size is 24 bits wide so mask upper 8 bits.
> -  //    Does not include FfsFileHeader header size
> -  // FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
> -  //
> -  Section   = (EFI_COMMON_SECTION_HEADER *) (FfsFileHeader + 1);
> -  FileSize  = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
> -  FileSize -= sizeof (EFI_FFS_FILE_HEADER);
> -
> -  *SectionData  = NULL;
> -  ParsedLength  = 0;
> -  while (ParsedLength < FileSize) {
> -    if (Section->Type == SectionType) {
> -      *SectionData = (VOID *) (Section + 1);
> -      return EFI_SUCCESS;
> -    }
> -    //
> -    // Size is 24 bits wide so mask upper 8 bits.
> -    // SectionLength is adjusted it is 4 byte aligned.
> -    // Go to the next section
> -    //
> -    SectionLength = *(UINT32 *) Section->Size & 0x00FFFFFF;
> -    SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
> -
> -    ParsedLength += SectionLength;
> -    Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section +
> SectionLength);
> -  }
> -
> -  return EFI_NOT_FOUND;
> -}
> -
> +/*++ @file
> +  A simple FV stack so the SEC can extract the SEC Core from an
> +  FV.
> +
> +Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
> +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.
> +
> +**/
> +
> +#include <PiPei.h>
> +
> +
> +#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
> +  (ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) &
> ((Alignment) - 1))
> +
> +EFI_FFS_FILE_STATE
> +GetFileState (
> +  IN UINT8                ErasePolarity,
> +  IN EFI_FFS_FILE_HEADER  *FfsHeader
> +  )
> +/*++
> +
> +Routine Description:
> +  Returns the highest bit set of the State field
> +
> +Arguments:
> +  ErasePolarity   - Erase Polarity  as defined by EFI_FVB2_ERASE_POLARITY
> +                    in the Attributes field.
> +  FfsHeader       - Pointer to FFS File Header.
> +
> +Returns:
> +  Returns the highest bit in the State field
> +
> +**/
> +{
> +  EFI_FFS_FILE_STATE  FileState;
> +  EFI_FFS_FILE_STATE  HighestBit;
> +
> +  FileState = FfsHeader->State;
> +
> +  if (ErasePolarity != 0) {
> +    FileState = (EFI_FFS_FILE_STATE)~FileState;
> +  }
> +
> +  HighestBit = 0x80;
> +  while (HighestBit != 0 && (HighestBit & FileState) == 0) {
> +    HighestBit >>= 1;
> +  }
> +
> +  return HighestBit;
> +}
> +
> +UINT8
> +CalculateHeaderChecksum (
> +  IN EFI_FFS_FILE_HEADER  *FileHeader
> +  )
> +/*++
> +
> +Routine Description:
> +  Calculates the checksum of the header of a file.
> +
> +Arguments:
> +  FileHeader       - Pointer to FFS File Header.
> +
> +Returns:
> +  Checksum of the header.
> +
> +**/
> +{
> +  UINT8 *ptr;
> +  UINTN Index;
> +  UINT8 Sum;
> +
> +  Sum = 0;
> +  ptr = (UINT8 *) FileHeader;
> +
> +  for (Index = 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index += 4) {
> +    Sum = (UINT8) (Sum + ptr[Index]);
> +    Sum = (UINT8) (Sum + ptr[Index + 1]);
> +    Sum = (UINT8) (Sum + ptr[Index + 2]);
> +    Sum = (UINT8) (Sum + ptr[Index + 3]);
> +  }
> +
> +  for (; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) {
> +    Sum = (UINT8) (Sum + ptr[Index]);
> +  }
> +  //
> +  // State field (since this indicates the different state of file).
> +  //
> +  Sum = (UINT8) (Sum - FileHeader->State);
> +  //
> +  // Checksum field of the file is not part of the header checksum.
> +  //
> +  Sum = (UINT8) (Sum - FileHeader->IntegrityCheck.Checksum.File);
> +
> +  return Sum;
> +}
> +
> +EFI_STATUS
> +SecFfsFindNextFile (
> +  IN EFI_FV_FILETYPE             SearchType,
> +  IN EFI_PEI_FV_HANDLE           FvHandle,
> +  IN OUT EFI_PEI_FILE_HANDLE     *FileHandle
> +  )
> +/*++
> +
> +Routine Description:
> +    Given the input file pointer, search for the next matching file in the
> +    FFS volume as defined by SearchType. The search starts from FileHeader
> inside
> +    the Firmware Volume defined by FwVolHeader.
> +
> +Arguments:
> +    SearchType - Filter to find only files of this type.
> +                 Type EFI_FV_FILETYPE_ALL causes no filtering to be done.
> +    FwVolHeader - Pointer to the FV header of the volume to search.
> +                  This parameter must point to a valid FFS volume.
> +    FileHeader  - Pointer to the current file from which to begin searching.
> +                  This pointer will be updated upon return to reflect the file
> +                  found.
> +
> +Returns:
> +    EFI_NOT_FOUND - No files matching the search criteria were found
> +    EFI_SUCCESS
> +
> +**/
> +{
> +  EFI_FFS_FILE_HEADER *FfsFileHeader;
> +  UINT32              FileLength;
> +  UINT32              FileOccupiedSize;
> +  UINT32              FileOffset;
> +  UINT64              FvLength;
> +  UINT8               ErasePolarity;
> +  UINT8               FileState;
> +  EFI_FIRMWARE_VOLUME_HEADER  *FwVolHeader;
> +  EFI_FFS_FILE_HEADER         **FileHeader;
> +
> +  //
> +  // Convert the handle of FV to FV header for memory-mapped firmware
> volume
> +  //
> +  FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) FvHandle;
> +  FileHeader  = (EFI_FFS_FILE_HEADER **)FileHandle;
> +
> +  FvLength = FwVolHeader->FvLength;
> +  if (FwVolHeader->Attributes & EFI_FVB2_ERASE_POLARITY) {
> +    ErasePolarity = 1;
> +  } else {
> +    ErasePolarity = 0;
> +  }
> +  //
> +  // If FileHeader is not specified (NULL) start with the first file in the
> +  // firmware volume.  Otherwise, start from the FileHeader.
> +  //
> +  if (*FileHeader == NULL) {
> +    FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FwVolHeader +
> FwVolHeader->HeaderLength);
> +  } else {
> +    //
> +    // Length is 24 bits wide so mask upper 8 bits
> +    // FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.
> +    //
> +    FileLength        = *(UINT32 *) (*FileHeader)->Size & 0x00FFFFFF;
> +    FileOccupiedSize  = GET_OCCUPIED_SIZE (FileLength, 8);
> +    FfsFileHeader     = (EFI_FFS_FILE_HEADER *) ((UINT8 *) *FileHeader +
> FileOccupiedSize);
> +  }
> +
> +  FileOffset = (UINT32) ((UINT8 *) FfsFileHeader - (UINT8 *) FwVolHeader);
> +
> +  while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) {
> +    //
> +    // Get FileState which is the highest bit of the State
> +    //
> +    FileState = GetFileState (ErasePolarity, FfsFileHeader);
> +
> +    switch (FileState) {
> +
> +    case EFI_FILE_HEADER_INVALID:
> +      FileOffset += sizeof (EFI_FFS_FILE_HEADER);
> +      FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader +
> sizeof (EFI_FFS_FILE_HEADER));
> +      break;
> +
> +    case EFI_FILE_DATA_VALID:
> +    case EFI_FILE_MARKED_FOR_UPDATE:
> +      if (CalculateHeaderChecksum (FfsFileHeader) == 0) {
> +        FileLength        = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
> +        FileOccupiedSize  = GET_OCCUPIED_SIZE (FileLength, 8);
> +
> +        if ((SearchType == FfsFileHeader->Type) || (SearchType ==
> EFI_FV_FILETYPE_ALL)) {
> +
> +          *FileHeader = FfsFileHeader;
> +
> +          return EFI_SUCCESS;
> +        }
> +
> +        FileOffset += FileOccupiedSize;
> +        FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader +
> FileOccupiedSize);
> +      } else {
> +        return EFI_NOT_FOUND;
> +      }
> +      break;
> +
> +    case EFI_FILE_DELETED:
> +      FileLength        = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
> +      FileOccupiedSize  = GET_OCCUPIED_SIZE (FileLength, 8);
> +      FileOffset += FileOccupiedSize;
> +      FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader +
> FileOccupiedSize);
> +      break;
> +
> +    default:
> +      return EFI_NOT_FOUND;
> +
> +    }
> +  }
> +
> +  return EFI_NOT_FOUND;
> +}
> +
> +EFI_STATUS
> +SecFfsFindSectionData (
> +  IN EFI_SECTION_TYPE      SectionType,
> +  IN EFI_FFS_FILE_HEADER   *FfsFileHeader,
> +  IN OUT VOID              **SectionData
> +  )
> +/*++
> +
> +Routine Description:
> +    Given the input file pointer, search for the next matching section in the
> +    FFS volume.
> +
> +Arguments:
> +    SearchType    - Filter to find only sections of this type.
> +    FfsFileHeader - Pointer to the current file to search.
> +    SectionData   - Pointer to the Section matching SectionType in FfsFileHeader.
> +                     NULL if section not found
> +
> +Returns:
> +    EFI_NOT_FOUND - No files matching the search criteria were found
> +    EFI_SUCCESS
> +
> +**/
> +{
> +  UINT32                    FileSize;
> +  EFI_COMMON_SECTION_HEADER *Section;
> +  UINT32                    SectionLength;
> +  UINT32                    ParsedLength;
> +
> +  //
> +  // Size is 24 bits wide so mask upper 8 bits.
> +  //    Does not include FfsFileHeader header size
> +  // FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
> +  //
> +  Section   = (EFI_COMMON_SECTION_HEADER *) (FfsFileHeader + 1);
> +  FileSize  = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
> +  FileSize -= sizeof (EFI_FFS_FILE_HEADER);
> +
> +  *SectionData  = NULL;
> +  ParsedLength  = 0;
> +  while (ParsedLength < FileSize) {
> +    if (Section->Type == SectionType) {
> +      *SectionData = (VOID *) (Section + 1);
> +      return EFI_SUCCESS;
> +    }
> +    //
> +    // Size is 24 bits wide so mask upper 8 bits.
> +    // SectionLength is adjusted it is 4 byte aligned.
> +    // Go to the next section
> +    //
> +    SectionLength = *(UINT32 *) Section->Size & 0x00FFFFFF;
> +    SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
> +
> +    ParsedLength += SectionLength;
> +    Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section +
> SectionLength);
> +  }
> +
> +  return EFI_NOT_FOUND;
> +}
> +
> diff --git a/EmulatorPkg/Library/SecPpiListLib/PpiListLib.c
> b/EmulatorPkg/Library/SecPpiListLib/PpiListLib.c
> index f9c0c3d677..b8c5504b70 100644
> --- a/EmulatorPkg/Library/SecPpiListLib/PpiListLib.c
> +++ b/EmulatorPkg/Library/SecPpiListLib/PpiListLib.c
> @@ -1,17 +1,17 @@
> -/*++ @file
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#include <PiPei.h>
> -
> -CONST EFI_PEI_PPI_DESCRIPTOR  *gPpiList = NULL;
> -
> +/*++ @file
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> +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.
> +
> +**/
> +
> +#include <PiPei.h>
> +
> +CONST EFI_PEI_PPI_DESCRIPTOR  *gPpiList = NULL;
> +
> diff --git a/EmulatorPkg/Library/SmbiosLib/SmbiosLib.c
> b/EmulatorPkg/Library/SmbiosLib/SmbiosLib.c
> index 3382d7d2a6..7bdadb32a3 100644
> --- a/EmulatorPkg/Library/SmbiosLib/SmbiosLib.c
> +++ b/EmulatorPkg/Library/SmbiosLib/SmbiosLib.c
> @@ -1,352 +1,352 @@
> -/** @file
> -  Provides library functions for common SMBIOS operations. Only available to
> DXE
> -  and UEFI module types.
> -
> -
> -Copyright (c) 2012, Apple Inc. All rights reserved.
> -Portitions Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
> -This program and the accompanying materials are licensed and made
> available under
> -the terms and conditions of the BSD License that 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.
> -
> -**/
> -
> -#include <PiDxe.h>
> -#include <Library/BaseLib.h>
> -#include <Library/BaseMemoryLib.h>
> -#include <Library/DebugLib.h>
> -#include <Library/MemoryAllocationLib.h>
> -#include <Library/UefiBootServicesTableLib.h>
> -#include <Library/UefiLib.h>
> -#include <Library/SmbiosLib.h>
> -
> -
> -EFI_SMBIOS_PROTOCOL *gSmbios = NULL;
> -
> -
> -/**
> -  Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
> -  entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
> -
> -  @param  Template   Array of SMBIOS_TEMPLATE_ENTRY entries.
> -
> -  @retval EFI_SUCCESS          New SMBIOS tables were created.
> -  @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibInitializeFromTemplate (
> -  IN  SMBIOS_TEMPLATE_ENTRY   *Template
> -  )
> -{
> -  EFI_STATUS    Status;
> -  UINTN         Index;
> -
> -  if (Template == NULL) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  Status = EFI_SUCCESS;
> -
> -  for (Index = 0; Template[Index].Entry != NULL; Index++) {
> -    Status = SmbiosLibCreateEntry (Template[Index].Entry,
> Template[Index].StringArray);
> -  }
> -
> -  return Status;
> -}
> -
> -
> -
> -/**
> -  Create SMBIOS record.
> -
> -  Converts a fixed SMBIOS structure and an array of pointers to strings into
> -  an SMBIOS record where the strings are cat'ed on the end of the fixed record
> -  and terminated via a double NULL and add to SMBIOS table.
> -
> -  SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
> -    { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof
> (SMBIOS_TABLE_TYPE12), 0 },
> -    1 // StringCount
> -  };
> -  CHAR8 *gSmbiosType12Strings[] = {
> -    "Not Found",
> -    NULL
> -  };
> -
> -  ...
> -  CreateSmbiosEntry (
> -    (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
> -    gSmbiosType12Strings
> -    );
> -
> -  @param  SmbiosEntry   Fixed SMBIOS structure
> -  @param  StringArray   Array of strings to convert to an SMBIOS string pack.
> -                        NULL is OK.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibCreateEntry (
> -  IN  SMBIOS_STRUCTURE *SmbiosEntry,
> -  IN  CHAR8            **StringArray
> -  )
> -{
> -  EFI_STATUS                Status;
> -  EFI_SMBIOS_HANDLE         SmbiosHandle;
> -  EFI_SMBIOS_TABLE_HEADER   *Record;
> -  UINTN                     Index;
> -  UINTN                     StringSize;
> -  UINTN                     Size;
> -  CHAR8                     *Str;
> -
> -  // Calculate the size of the fixed record and optional string pack
> -  Size = SmbiosEntry->Length;
> -  if (StringArray == NULL) {
> -    Size += 2; // Min string section is double null
> -  } else if (StringArray[0] == NULL) {
> -    Size += 2; // Min string section is double null
> -  } else {
> -    for (Index = 0; StringArray[Index] != NULL; Index++) {
> -      StringSize = AsciiStrSize (StringArray[Index]);
> -      Size += StringSize;
> -    }
> -    // Don't forget the terminating double null
> -    Size += 1;
> -  }
> -
> -  // Copy over Template
> -  Record = (EFI_SMBIOS_TABLE_HEADER *)AllocateZeroPool (Size);
> -  if (Record == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -  CopyMem (Record, SmbiosEntry, SmbiosEntry->Length);
> -
> -  if (StringArray != NULL) {
> -    // Append string pack
> -    Str = ((CHAR8 *)Record) + Record->Length;
> -    for (Index = 0; StringArray[Index] != NULL; Index++) {
> -      StringSize = AsciiStrSize (StringArray[Index]);
> -      CopyMem (Str, StringArray[Index], StringSize);
> -      Str += StringSize;
> -    }
> -    *Str = 0;
> -  }
> -
> -  SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
> -  Status = gSmbios->Add (
> -                     gSmbios,
> -                     gImageHandle,
> -                     &SmbiosHandle,
> -                     Record
> -                     );
> -
> -  FreePool (Record);
> -  return Status;
> -}
> -
> -
> -
> -/**
> -  Update the string associated with an existing SMBIOS record.
> -
> -  This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> -  SMBIOS record is defined by how many strings were present when Add() was
> called.
> -
> -  @param[in]    SmbiosHandle    SMBIOS Handle of structure that will have its
> string updated.
> -  @param[in]    StringNumber    The non-zero string number of the string to
> update.
> -  @param[in]    String          Update the StringNumber string with String.
> -
> -  @retval EFI_SUCCESS           SmbiosHandle had its StringNumber String
> updated.
> -  @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> -  @retval EFI_UNSUPPORTED       String was not added because it is longer
> than the SMBIOS Table supports.
> -  @retval EFI_NOT_FOUND         The StringNumber.is not valid for this SMBIOS
> record.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibUpdateString (
> -  IN  EFI_SMBIOS_HANDLE     SmbiosHandle,
> -  IN  SMBIOS_TABLE_STRING   StringNumber,
> -  IN  CHAR8                 *String
> -  )
> -{
> -  UINTN StringIndex;
> -
> -  if (String == NULL) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  if (*String == '\0') {
> -    // A string with no data is not legal in SMBIOS
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  StringIndex = StringNumber;
> -  return gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex,
> String);
> -}
> -
> -
> -/**
> -  Update the string associated with an existing SMBIOS record.
> -
> -  This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> -  SMBIOS record is defined by how many strings were present when Add() was
> called.
> -
> -  @param[in]    SmbiosHandle    SMBIOS Handle of structure that will have its
> string updated.
> -  @param[in]    StringNumber    The non-zero string number of the string to
> update.
> -  @param[in]    String          Update the StringNumber string with String.
> -
> -  @retval EFI_SUCCESS           SmbiosHandle had its StringNumber String
> updated.
> -  @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> -  @retval EFI_UNSUPPORTED       String was not added because it is longer
> than the SMBIOS Table supports.
> -  @retval EFI_NOT_FOUND         The StringNumber.is not valid for this SMBIOS
> record.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibUpdateUnicodeString (
> -  IN  EFI_SMBIOS_HANDLE     SmbiosHandle,
> -  IN  SMBIOS_TABLE_STRING   StringNumber,
> -  IN  CHAR16                *String
> -  )
> -{
> -  EFI_STATUS  Status;
> -  UINTN       StringIndex;
> -  CHAR8       *Ascii;
> -
> -  if (String == NULL) {
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  if (*String == '\0') {
> -    // A string with no data is not legal in SMBIOS
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  Ascii = AllocateZeroPool (StrSize (String));
> -  if (Ascii == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -  UnicodeStrToAsciiStr (String, Ascii);
> -
> -  StringIndex = StringNumber;
> -  Status = gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex,
> Ascii);
> -
> -  FreePool (Ascii);
> -  return Status;
> -}
> -
> -
> -/**
> -  Allow caller to read a specific SMBIOS string
> -
> -  @param[in]    Header          SMBIOS record that contains the string.
> -  @param[in[    StringNumber    Instance of SMBIOS string 1 - N.
> -
> -  @retval NULL                  Instance of Type SMBIOS string was not found.
> -  @retval Other                 Pointer to matching SMBIOS string.
> -**/
> -CHAR8 *
> -EFIAPI
> -SmbiosLibReadString (
> -  IN SMBIOS_STRUCTURE   *Header,
> -  IN EFI_SMBIOS_STRING  StringNumber
> -  )
> -{
> -  CHAR8       *Data;
> -  UINTN       Match;
> -
> -  Data = (CHAR8 *)Header + Header->Length;
> -  for (Match = 1;!(*Data == 0 && *(Data+1) == 0); ) {
> -    if (StringNumber == Match) {
> -      return Data;
> -    }
> -    Data++;
> -    if (*(Data - 1) == '\0') {
> -      Match++;
> -    }
> -  }
> -
> -  return NULL;
> -}
> -
> -
> -/**
> -  Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
> -
> -  @param[in]    Type            Type of the next SMBIOS record to return.
> -  @param[in[    Instance        Instance of SMBIOS record 0 - N-1.
> -  @param[out]   SmbiosHandle    Returns SMBIOS handle for the matching
> record.
> -
> -  @retval NULL                  Instance of Type SMBIOS record was not found.
> -  @retval Other                 Pointer to matching SMBIOS record.
> -**/
> -SMBIOS_STRUCTURE *
> -EFIAPI
> -SmbiosLibGetRecord (
> -  IN  EFI_SMBIOS_TYPE   Type,
> -  IN  UINTN             Instance,
> -  OUT EFI_SMBIOS_HANDLE *SmbiosHandle
> -  )
> -{
> -  EFI_STATUS              Status;
> -  EFI_SMBIOS_TABLE_HEADER *Record;
> -  UINTN                   Match;
> -
> -  Match         = 0;
> -  *SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
> -  do {
> -    Status = gSmbios->GetNext (gSmbios, SmbiosHandle, &Type, &Record,
> NULL);
> -    if (!EFI_ERROR (Status)) {
> -      if (Match == Instance) {
> -        return (SMBIOS_STRUCTURE *)Record;
> -      }
> -      Match++;
> -    }
> -  } while (!EFI_ERROR (Status));
> -
> -  return NULL;
> -}
> -
> -
> -/**
> -  Remove an SMBIOS record.
> -
> -  This function removes an SMBIOS record using the handle specified by
> SmbiosHandle.
> -
> -  @param[in]    SmbiosHandle        The handle of the SMBIOS record to
> remove.
> -
> -  @retval EFI_SUCCESS               SMBIOS record was removed.
> -  @retval EFI_INVALID_PARAMETER     SmbiosHandle does not specify a valid
> SMBIOS record.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibRemove (
> -  OUT EFI_SMBIOS_HANDLE SmbiosHandle
> -  )
> -{
> -  return gSmbios->Remove (gSmbios, SmbiosHandle);
> -}
> -
> -
> -
> -/**
> -
> -  @param  ImageHandle  ImageHandle of the loaded driver.
> -  @param  SystemTable  Pointer to the EFI System Table.
> -
> -  @retval  EFI_SUCCESS            Register successfully.
> -  @retval  EFI_OUT_OF_RESOURCES   No enough memory to register this
> handler.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibConstructor (
> -  IN EFI_HANDLE        ImageHandle,
> -  IN EFI_SYSTEM_TABLE  *SystemTable
> -  )
> -{
> -  return gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID
> **)&gSmbios);
> -}
> -
> +/** @file
> +  Provides library functions for common SMBIOS operations. Only available to
> DXE
> +  and UEFI module types.
> +
> +
> +Copyright (c) 2012, Apple Inc. All rights reserved.
> +Portitions Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
> +This program and the accompanying materials are licensed and made
> available under
> +the terms and conditions of the BSD License that 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.
> +
> +**/
> +
> +#include <PiDxe.h>
> +#include <Library/BaseLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/UefiLib.h>
> +#include <Library/SmbiosLib.h>
> +
> +
> +EFI_SMBIOS_PROTOCOL *gSmbios = NULL;
> +
> +
> +/**
> +  Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
> +  entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
> +
> +  @param  Template   Array of SMBIOS_TEMPLATE_ENTRY entries.
> +
> +  @retval EFI_SUCCESS          New SMBIOS tables were created.
> +  @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibInitializeFromTemplate (
> +  IN  SMBIOS_TEMPLATE_ENTRY   *Template
> +  )
> +{
> +  EFI_STATUS    Status;
> +  UINTN         Index;
> +
> +  if (Template == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Status = EFI_SUCCESS;
> +
> +  for (Index = 0; Template[Index].Entry != NULL; Index++) {
> +    Status = SmbiosLibCreateEntry (Template[Index].Entry,
> Template[Index].StringArray);
> +  }
> +
> +  return Status;
> +}
> +
> +
> +
> +/**
> +  Create SMBIOS record.
> +
> +  Converts a fixed SMBIOS structure and an array of pointers to strings into
> +  an SMBIOS record where the strings are cat'ed on the end of the fixed
> record
> +  and terminated via a double NULL and add to SMBIOS table.
> +
> +  SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
> +    { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof
> (SMBIOS_TABLE_TYPE12), 0 },
> +    1 // StringCount
> +  };
> +  CHAR8 *gSmbiosType12Strings[] = {
> +    "Not Found",
> +    NULL
> +  };
> +
> +  ...
> +  CreateSmbiosEntry (
> +    (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
> +    gSmbiosType12Strings
> +    );
> +
> +  @param  SmbiosEntry   Fixed SMBIOS structure
> +  @param  StringArray   Array of strings to convert to an SMBIOS string pack.
> +                        NULL is OK.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibCreateEntry (
> +  IN  SMBIOS_STRUCTURE *SmbiosEntry,
> +  IN  CHAR8            **StringArray
> +  )
> +{
> +  EFI_STATUS                Status;
> +  EFI_SMBIOS_HANDLE         SmbiosHandle;
> +  EFI_SMBIOS_TABLE_HEADER   *Record;
> +  UINTN                     Index;
> +  UINTN                     StringSize;
> +  UINTN                     Size;
> +  CHAR8                     *Str;
> +
> +  // Calculate the size of the fixed record and optional string pack
> +  Size = SmbiosEntry->Length;
> +  if (StringArray == NULL) {
> +    Size += 2; // Min string section is double null
> +  } else if (StringArray[0] == NULL) {
> +    Size += 2; // Min string section is double null
> +  } else {
> +    for (Index = 0; StringArray[Index] != NULL; Index++) {
> +      StringSize = AsciiStrSize (StringArray[Index]);
> +      Size += StringSize;
> +    }
> +    // Don't forget the terminating double null
> +    Size += 1;
> +  }
> +
> +  // Copy over Template
> +  Record = (EFI_SMBIOS_TABLE_HEADER *)AllocateZeroPool (Size);
> +  if (Record == NULL) {
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +  CopyMem (Record, SmbiosEntry, SmbiosEntry->Length);
> +
> +  if (StringArray != NULL) {
> +    // Append string pack
> +    Str = ((CHAR8 *)Record) + Record->Length;
> +    for (Index = 0; StringArray[Index] != NULL; Index++) {
> +      StringSize = AsciiStrSize (StringArray[Index]);
> +      CopyMem (Str, StringArray[Index], StringSize);
> +      Str += StringSize;
> +    }
> +    *Str = 0;
> +  }
> +
> +  SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
> +  Status = gSmbios->Add (
> +                     gSmbios,
> +                     gImageHandle,
> +                     &SmbiosHandle,
> +                     Record
> +                     );
> +
> +  FreePool (Record);
> +  return Status;
> +}
> +
> +
> +
> +/**
> +  Update the string associated with an existing SMBIOS record.
> +
> +  This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> +  SMBIOS record is defined by how many strings were present when Add() was
> called.
> +
> +  @param[in]    SmbiosHandle    SMBIOS Handle of structure that will have its
> string updated.
> +  @param[in]    StringNumber    The non-zero string number of the string to
> update.
> +  @param[in]    String          Update the StringNumber string with String.
> +
> +  @retval EFI_SUCCESS           SmbiosHandle had its StringNumber String
> updated.
> +  @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> +  @retval EFI_UNSUPPORTED       String was not added because it is longer
> than the SMBIOS Table supports.
> +  @retval EFI_NOT_FOUND         The StringNumber.is not valid for this SMBIOS
> record.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibUpdateString (
> +  IN  EFI_SMBIOS_HANDLE     SmbiosHandle,
> +  IN  SMBIOS_TABLE_STRING   StringNumber,
> +  IN  CHAR8                 *String
> +  )
> +{
> +  UINTN StringIndex;
> +
> +  if (String == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  if (*String == '\0') {
> +    // A string with no data is not legal in SMBIOS
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  StringIndex = StringNumber;
> +  return gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex,
> String);
> +}
> +
> +
> +/**
> +  Update the string associated with an existing SMBIOS record.
> +
> +  This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> +  SMBIOS record is defined by how many strings were present when Add() was
> called.
> +
> +  @param[in]    SmbiosHandle    SMBIOS Handle of structure that will have its
> string updated.
> +  @param[in]    StringNumber    The non-zero string number of the string to
> update.
> +  @param[in]    String          Update the StringNumber string with String.
> +
> +  @retval EFI_SUCCESS           SmbiosHandle had its StringNumber String
> updated.
> +  @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> +  @retval EFI_UNSUPPORTED       String was not added because it is longer
> than the SMBIOS Table supports.
> +  @retval EFI_NOT_FOUND         The StringNumber.is not valid for this SMBIOS
> record.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibUpdateUnicodeString (
> +  IN  EFI_SMBIOS_HANDLE     SmbiosHandle,
> +  IN  SMBIOS_TABLE_STRING   StringNumber,
> +  IN  CHAR16                *String
> +  )
> +{
> +  EFI_STATUS  Status;
> +  UINTN       StringIndex;
> +  CHAR8       *Ascii;
> +
> +  if (String == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  if (*String == '\0') {
> +    // A string with no data is not legal in SMBIOS
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Ascii = AllocateZeroPool (StrSize (String));
> +  if (Ascii == NULL) {
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +  UnicodeStrToAsciiStr (String, Ascii);
> +
> +  StringIndex = StringNumber;
> +  Status = gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex,
> Ascii);
> +
> +  FreePool (Ascii);
> +  return Status;
> +}
> +
> +
> +/**
> +  Allow caller to read a specific SMBIOS string
> +
> +  @param[in]    Header          SMBIOS record that contains the string.
> +  @param[in[    StringNumber    Instance of SMBIOS string 1 - N.
> +
> +  @retval NULL                  Instance of Type SMBIOS string was not found.
> +  @retval Other                 Pointer to matching SMBIOS string.
> +**/
> +CHAR8 *
> +EFIAPI
> +SmbiosLibReadString (
> +  IN SMBIOS_STRUCTURE   *Header,
> +  IN EFI_SMBIOS_STRING  StringNumber
> +  )
> +{
> +  CHAR8       *Data;
> +  UINTN       Match;
> +
> +  Data = (CHAR8 *)Header + Header->Length;
> +  for (Match = 1;!(*Data == 0 && *(Data+1) == 0); ) {
> +    if (StringNumber == Match) {
> +      return Data;
> +    }
> +    Data++;
> +    if (*(Data - 1) == '\0') {
> +      Match++;
> +    }
> +  }
> +
> +  return NULL;
> +}
> +
> +
> +/**
> +  Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
> +
> +  @param[in]    Type            Type of the next SMBIOS record to return.
> +  @param[in[    Instance        Instance of SMBIOS record 0 - N-1.
> +  @param[out]   SmbiosHandle    Returns SMBIOS handle for the matching
> record.
> +
> +  @retval NULL                  Instance of Type SMBIOS record was not found.
> +  @retval Other                 Pointer to matching SMBIOS record.
> +**/
> +SMBIOS_STRUCTURE *
> +EFIAPI
> +SmbiosLibGetRecord (
> +  IN  EFI_SMBIOS_TYPE   Type,
> +  IN  UINTN             Instance,
> +  OUT EFI_SMBIOS_HANDLE *SmbiosHandle
> +  )
> +{
> +  EFI_STATUS              Status;
> +  EFI_SMBIOS_TABLE_HEADER *Record;
> +  UINTN                   Match;
> +
> +  Match         = 0;
> +  *SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
> +  do {
> +    Status = gSmbios->GetNext (gSmbios, SmbiosHandle, &Type, &Record,
> NULL);
> +    if (!EFI_ERROR (Status)) {
> +      if (Match == Instance) {
> +        return (SMBIOS_STRUCTURE *)Record;
> +      }
> +      Match++;
> +    }
> +  } while (!EFI_ERROR (Status));
> +
> +  return NULL;
> +}
> +
> +
> +/**
> +  Remove an SMBIOS record.
> +
> +  This function removes an SMBIOS record using the handle specified by
> SmbiosHandle.
> +
> +  @param[in]    SmbiosHandle        The handle of the SMBIOS record to
> remove.
> +
> +  @retval EFI_SUCCESS               SMBIOS record was removed.
> +  @retval EFI_INVALID_PARAMETER     SmbiosHandle does not specify a valid
> SMBIOS record.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibRemove (
> +  OUT EFI_SMBIOS_HANDLE SmbiosHandle
> +  )
> +{
> +  return gSmbios->Remove (gSmbios, SmbiosHandle);
> +}
> +
> +
> +
> +/**
> +
> +  @param  ImageHandle  ImageHandle of the loaded driver.
> +  @param  SystemTable  Pointer to the EFI System Table.
> +
> +  @retval  EFI_SUCCESS            Register successfully.
> +  @retval  EFI_OUT_OF_RESOURCES   No enough memory to register this
> handler.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibConstructor (
> +  IN EFI_HANDLE        ImageHandle,
> +  IN EFI_SYSTEM_TABLE  *SystemTable
> +  )
> +{
> +  return gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID
> **)&gSmbios);
> +}
> +
> diff --git a/EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf
> b/EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf
> index 0593c47d48..8f4d4c6307 100644
> --- a/EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf
> +++ b/EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf
> @@ -1,47 +1,47 @@
> -## @file
> -# SMBIOS Library
> -#
> -# Copyright (c) 2012, Apple Inc. All rights reserved.
> -# Portions copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
> -#
> -#  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.
> -#
> -#
> -##
> -
> -[Defines]
> -  INF_VERSION                    = 0x00010005
> -  BASE_NAME                      = SmbiosLib
> -  FILE_GUID                      = 881863A2-09FD-3E44-8D62-7AE038D03747
> -  MODULE_TYPE                    = DXE_DRIVER
> -  VERSION_STRING                 = 1.0
> -  LIBRARY_CLASS                  = SmbiosLib|DXE_CORE DXE_DRIVER
> DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER SMM_CORE
> UEFI_APPLICATION UEFI_DRIVER
> -
> -  CONSTRUCTOR                    = SmbiosLibConstructor
> -
> -
> -[Sources]
> -  SmbiosLib.c
> -
> -[Packages]
> -  MdePkg/MdePkg.dec
> -  EmulatorPkg/EmulatorPkg.dec
> -
> -[LibraryClasses]
> -  BaseLib
> -  BaseMemoryLib
> -  DebugLib
> -  MemoryAllocationLib
> -  UefiBootServicesTableLib
> -  UefiLib
> -
> -[Protocols]
> -  gEfiSmbiosProtocolGuid
> -
> -[Depex]
> -  gEfiSmbiosProtocolGuid
> \ No newline at end of file
> +## @file
> +# SMBIOS Library
> +#
> +# Copyright (c) 2012, Apple Inc. All rights reserved.
> +# Portions copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
> +#
> +#  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.
> +#
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010005
> +  BASE_NAME                      = SmbiosLib
> +  FILE_GUID                      = 881863A2-09FD-3E44-8D62-7AE038D03747
> +  MODULE_TYPE                    = DXE_DRIVER
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = SmbiosLib|DXE_CORE DXE_DRIVER
> DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER SMM_CORE
> UEFI_APPLICATION UEFI_DRIVER
> +
> +  CONSTRUCTOR                    = SmbiosLibConstructor
> +
> +
> +[Sources]
> +  SmbiosLib.c
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  EmulatorPkg/EmulatorPkg.dec
> +
> +[LibraryClasses]
> +  BaseLib
> +  BaseMemoryLib
> +  DebugLib
> +  MemoryAllocationLib
> +  UefiBootServicesTableLib
> +  UefiLib
> +
> +[Protocols]
> +  gEfiSmbiosProtocolGuid
> +
> +[Depex]
> +  gEfiSmbiosProtocolGuid
> diff --git a/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubClassDriver.h
> b/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubClassDriver.h
> index c7749f3f17..e4d7cb67c8 100644
> --- a/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubClassDriver.h
> +++ b/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubClassDriver.h
> @@ -112,8 +112,8 @@ extern EFI_HII_HANDLE               mHiiHandle;
>    @param  Smbios                The EFI_SMBIOS_PROTOCOL instance.
>    @param  SmbiosHandle          A unique handle will be assigned to the SMBIOS
> record.
>    @param  Record                The data for the fixed portion of the SMBIOS
> record. The format of the record is
> -                                determined by EFI_SMBIOS_TABLE_HEADER.Type. The size
> of the formatted area is defined
> -                                by EFI_SMBIOS_TABLE_HEADER.Length and either
> followed by a double-null (0x0000) or
> +                                determined by EFI_SMBIOS_TABLE_HEADER.Type. The
> size of the formatted area is defined
> +                                by EFI_SMBIOS_TABLE_HEADER.Length and either
> followed by a double-null (0x0000) or
>                                  a set of null terminated strings and a null.
> 
>    @retval EFI_SUCCESS           Record was added.
> diff --git
> a/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c
> b/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c
> index 65fec01158..ab8ee258c8 100644
> --- a/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c
> +++ b/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c
> @@ -174,8 +174,8 @@ Returns:
>    @param  Smbios                The EFI_SMBIOS_PROTOCOL instance.
>    @param  SmbiosHandle          A unique handle will be assigned to the SMBIOS
> record.
>    @param  Record                The data for the fixed portion of the SMBIOS
> record. The format of the record is
> -                                determined by EFI_SMBIOS_TABLE_HEADER.Type. The size
> of the formatted area is defined
> -                                by EFI_SMBIOS_TABLE_HEADER.Length and either
> followed by a double-null (0x0000) or
> +                                determined by EFI_SMBIOS_TABLE_HEADER.Type. The
> size of the formatted area is defined
> +                                by EFI_SMBIOS_TABLE_HEADER.Length and either
> followed by a double-null (0x0000) or
>                                  a set of null terminated strings and a null.
> 
>    @retval EFI_SUCCESS           Record was added.
> diff --git a/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c
> b/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c
> index 123e090ed0..676d324e6b 100644
> --- a/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c
> +++ b/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c
> @@ -66,10 +66,10 @@ CreatePlatformSmbiosMemoryRecords (
>    while ((HobPtr.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,
> HobPtr.Raw)) != NULL) {
>      if (HobPtr.ResourceDescriptor->ResourceType ==
> EFI_RESOURCE_SYSTEM_MEMORY) {
>        gSmbiosType19Template.ExtendedStartingAddress =
> HobPtr.ResourceDescriptor->PhysicalStart;
> -      gSmbiosType19Template.ExtendedEndingAddress =
> -        HobPtr.ResourceDescriptor->PhysicalStart +
> +      gSmbiosType19Template.ExtendedEndingAddress =
> +        HobPtr.ResourceDescriptor->PhysicalStart +
>          HobPtr.ResourceDescriptor->ResourceLength - 1;
> -
> +
>        SmbiosLibCreateEntry ((SMBIOS_STRUCTURE *)&gSmbiosType19Template,
> NULL);
>      }
>      HobPtr.Raw = GET_NEXT_HOB (HobPtr);
> @@ -97,7 +97,7 @@ PlatfomrSmbiosDriverEntryPoint (
>    EFI_SMBIOS_HANDLE           SmbiosHandle;
>    SMBIOS_STRUCTURE_POINTER    Smbios;
> 
> -  // Phase 0 - Patch table to make SMBIOS 2.7 structures smaller to conform
> +  // Phase 0 - Patch table to make SMBIOS 2.7 structures smaller to conform
>    //           to an early version of the specification.
> 
>    // Phase 1 - Initialize SMBIOS tables from template
> @@ -112,18 +112,18 @@ PlatfomrSmbiosDriverEntryPoint (
>      Smbios.Type0->BiosSize = (UINT8)DivU64x32 (FixedPcdGet64
> (PcdEmuFirmwareFdSize), 64*1024) - 1;
> 
>      SmbiosLibUpdateUnicodeString (
> -      SmbiosHandle,
> -      Smbios.Type0->BiosVersion,
> +      SmbiosHandle,
> +      Smbios.Type0->BiosVersion,
>        (CHAR16 *) PcdGetPtr (PcdFirmwareVersionString)
>        );
>      SmbiosLibUpdateUnicodeString (
> -      SmbiosHandle,
> -      Smbios.Type0->BiosReleaseDate,
> +      SmbiosHandle,
> +      Smbios.Type0->BiosReleaseDate,
>        (CHAR16 *) PcdGetPtr (PcdFirmwareReleaseDateString)
>        );
>    }
> 
> -  // Phase 3 - Create tables from scratch
> +  // Phase 3 - Create tables from scratch
> 
>    // Create Type 13 record from EFI Variables
>    // Do we need this record for EFI as the info is available from EFI varaibles
> diff --git a/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.inf
> b/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.inf
> index 737310f470..bee1abb3eb 100644
> --- a/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.inf
> +++ b/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.inf
> @@ -1,7 +1,7 @@
>  ## @file
>  # Platform SMBIOS driver that fills in SMBIOS table entries.
>  #
> -# Copyright (c) 2012, Apple Inc. All rights reserved.
> +# Copyright (c) 2012, Apple Inc. All rights reserved.
>  # Portions copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
>  #
>  #  This program and the accompanying materials
> @@ -52,4 +52,4 @@ [Pcd]
>    gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareFdSize
> 
>  [Depex]
> -  TRUE
> \ No newline at end of file
> +  TRUE
> diff --git a/EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c
> b/EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c
> index c79e57b304..27679518ef 100644
> --- a/EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c
> +++ b/EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c
> @@ -8,7 +8,7 @@
>      Processor Information (Type 4) - CPU Driver
>      Cache Information (Type 7) - For cache that is external to processor
>      System Slots (Type 9) - If system has slots
> -    Physical Memory Array (Type 16)
> +    Physical Memory Array (Type 16)
>      Memory Device (Type 17) - For each socketed system-memory Device
>      Memory Array Mapped Address (Type 19) - One per contiguous block per
> Physical Memroy Array
>      System Boot Information (Type 32)
> @@ -69,9 +69,9 @@ SMBIOS_TABLE_TYPE0 gSmbiosType0Template = {
>      0,    //  PrinterIsSupported                :1;
>      0,    //  CgaMonoIsSupported                :1;
>      0,    //  NecPc98                           :1;
> -    0     //  ReservedForVendor                 :32; ///< Bits 32-63. Bits 32-47
> reserved for BIOS vendor
> -                                                 ///< and bits 48-63 reserved for System Vendor.
> -  },
> +    0     //  ReservedForVendor                 :32; ///< Bits 32-63. Bits 32-47
> reserved for BIOS vendor
> +                                                 ///< and bits 48-63 reserved for System Vendor.
> +  },
>    {       // BIOSCharacteristicsExtensionBytes[]
>      0x81, //  AcpiIsSupported                   :1;
>            //  UsbLegacyIsSupported              :1;
> @@ -108,7 +108,7 @@ SMBIOS_TABLE_TYPE1 gSmbiosType1Template = {
>    3,    // Version String
>    4,    // SerialNumber String
>    { 0x25EF0280, 0xEC82, 0x42B0, { 0x8F, 0xB6, 0x10, 0xAD, 0xCC, 0xC6, 0x7C,
> 0x02 } },
> -  SystemWakeupTypePowerSwitch,
> +  SystemWakeupTypePowerSwitch,
>    5,    // SKUNumber String
>    6,    // Family String
>  };
> @@ -119,7 +119,7 @@ CHAR8  *gSmbiosType1Strings[] = {
>    "System Serial#",
>    "System SKU#",
>    "edk2",
> -  NULL
> +  NULL
>  };
> 
>  SMBIOS_TABLE_TYPE2  gSmbiosType2Template = {
> @@ -139,7 +139,7 @@ SMBIOS_TABLE_TYPE2  gSmbiosType2Template = {
>    },
>    6,    // LocationInChassis String
>    0,                        // ChassisHandle;
> -  BaseBoardTypeMotherBoard, // BoardType;
> +  BaseBoardTypeMotherBoard, // BoardType;
>    0,                        // NumberOfContainedObjectHandles;
>    { 0 }                     // ContainedObjectHandles[1];
>  };
> @@ -150,7 +150,7 @@ CHAR8  *gSmbiosType2Strings[] = {
>    "Base Board Serial#",
>    "Base Board Asset Tag#",
>    "Part Component",
> -  NULL
> +  NULL
>  };
> 
>  SMBIOS_TABLE_TYPE3  gSmbiosType3Template = {
> @@ -160,10 +160,10 @@ SMBIOS_TABLE_TYPE3  gSmbiosType3Template = {
>    2,                        // Version String
>    3,                        // SerialNumber String
>    4,                        // AssetTag String
> -  ChassisStateSafe,         // BootupState;
> -  ChassisStateSafe,         // PowerSupplyState;
> -  ChassisStateSafe,         // ThermalState;
> -  ChassisSecurityStatusNone,// SecurityStatus;
> +  ChassisStateSafe,         // BootupState;
> +  ChassisStateSafe,         // PowerSupplyState;
> +  ChassisStateSafe,         // ThermalState;
> +  ChassisSecurityStatusNone,// SecurityStatus;
>    { 0, 0, 0, 0 },           // OemDefined[4];
>    0,    // Height;
>    0,    // NumberofPowerCords;
> @@ -176,7 +176,7 @@ CHAR8  *gSmbiosType3Strings[] = {
>    "EmulatorPkg",
>    "Chassis Board Serial#",
>    "Chassis Board Asset Tag#",
> -  NULL
> +  NULL
>  };
> 
>  SMBIOS_TABLE_TYPE8  gSmbiosType8Template1 = {
> diff --git a/EmulatorPkg/Sec/Ia32/SwitchRam.asm
> b/EmulatorPkg/Sec/Ia32/SwitchRam.asm
> index a2e1f3e910..731ee0ffdb 100644
> --- a/EmulatorPkg/Sec/Ia32/SwitchRam.asm
> +++ b/EmulatorPkg/Sec/Ia32/SwitchRam.asm
> @@ -22,7 +22,7 @@
>      .586p
>      .model  flat,C
>      .code
> -
> +
>  ;------------------------------------------------------------------------------
>  ; VOID
>  ; EFIAPI
> @@ -30,7 +30,7 @@
>  ;   UINT32   TemporaryMemoryBase,
>  ;   UINT32   PermenentMemoryBase
>  ;   );
> -;------------------------------------------------------------------------------
> +;------------------------------------------------------------------------------
>  SecSwitchStack   PROC
>      ;
>      ; Save three register: eax, ebx, ecx
> @@ -39,16 +39,16 @@ SecSwitchStack   PROC
>      push  ebx
>      push  ecx
>      push  edx
> -
> +
>      ;
>      ; !!CAUTION!! this function address's is pushed into stack after
>      ; migration of whole temporary memory, so need save it to permenent
>      ; memory at first!
>      ;
> -
> +
>      mov   ebx, [esp + 20]          ; Save the first parameter
>      mov   ecx, [esp + 24]          ; Save the second parameter
> -
> +
>      ;
>      ; Save this function's return address into permenent memory at first.
>      ; Then, Fixup the esp point to permenent memory
> @@ -57,17 +57,17 @@ SecSwitchStack   PROC
>      sub   eax, ebx
>      add   eax, ecx
>      mov   edx, dword ptr [esp]         ; copy pushed register's value to permenent
> memory
> -    mov   dword ptr [eax], edx
> +    mov   dword ptr [eax], edx
>      mov   edx, dword ptr [esp + 4]
> -    mov   dword ptr [eax + 4], edx
> +    mov   dword ptr [eax + 4], edx
>      mov   edx, dword ptr [esp + 8]
> -    mov   dword ptr [eax + 8], edx
> +    mov   dword ptr [eax + 8], edx
>      mov   edx, dword ptr [esp + 12]
> -    mov   dword ptr [eax + 12], edx
> +    mov   dword ptr [eax + 12], edx
>      mov   edx, dword ptr [esp + 16]    ; Update this function's return address into
> permenent memory
> -    mov   dword ptr [eax + 16], edx
> +    mov   dword ptr [eax + 16], edx
>      mov   esp, eax                     ; From now, esp is pointed to permenent memory
> -
> +
>      ;
>      ; Fixup the ebp point to permenent memory
>      ;
> @@ -75,7 +75,7 @@ SecSwitchStack   PROC
>      sub   eax, ebx
>      add   eax, ecx
>      mov   ebp, eax                ; From now, ebp is pointed to permenent memory
> -
> +
>      ;
>      ; Fixup callee's ebp point for PeiDispatch
>      ;
> @@ -83,7 +83,7 @@ SecSwitchStack   PROC
>      sub   eax, ebx
>      add   eax, ecx
>      mov   dword ptr [ebp], eax    ; From now, Temporary's PPI caller's stack is in
> permenent memory
> -
> +
>      pop   edx
>      pop   ecx
>      pop   ebx
> diff --git a/EmulatorPkg/Sec/Sec.c b/EmulatorPkg/Sec/Sec.c
> index 8a015682dd..4132e9d9b7 100644
> --- a/EmulatorPkg/Sec/Sec.c
> +++ b/EmulatorPkg/Sec/Sec.c
> @@ -1,149 +1,149 @@
> -/*++ @file
> -  Stub SEC that is called from the OS appliation that is the root of the emulator.
> -
> -  The OS application will call the SEC with the PEI Entry Point API.
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#include "Sec.h"
> -
> -
> -
> -EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {
> -  SecTemporaryRamSupport
> -};
> -
> -
> -EFI_PEI_PPI_DESCRIPTOR  gPrivateDispatchTable[] = {
> -  {
> -    EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
> -    &gEfiTemporaryRamSupportPpiGuid,
> -    &mSecTemporaryRamSupportPpi
> -  }
> -};
> -
> -
> -
> -/**
> -  The entry point of PE/COFF Image for the PEI Core, that has been hijacked by
> this
> -  SEC that sits on top of an OS application. So the entry and exit of this module
> -  has the same API.
> -
> -  This function is the entry point for the PEI Foundation, which allows the SEC
> phase
> -  to pass information about the stack, temporary RAM and the Boot Firmware
> Volume.
> -  In addition, it also allows the SEC phase to pass services and data forward for
> use
> -  during the PEI phase in the form of one or more PPIs.
> -  There is no limit to the number of additional PPIs that can be passed from
> SEC into
> -  the PEI Foundation. As part of its initialization phase, the PEI Foundation will
> add
> -  these SEC-hosted PPIs to its PPI database such that both the PEI Foundation
> and any
> -  modules can leverage the associated service calls and/or code in these early
> PPIs.
> -  This function is required to call ProcessModuleEntryPointList() with the
> Context
> -  parameter set to NULL.  ProcessModuleEntryPoint() is never expected to
> return.
> -  The PEI Core is responsible for calling ProcessLibraryConstructorList() as soon
> as
> -  the PEI Services Table and the file handle for the PEI Core itself have been
> established.
> -  If ProcessModuleEntryPointList() returns, then ASSERT() and halt the system.
> -
> -  @param SecCoreData  Points to a data structure containing information
> about the PEI
> -                      core's operating environment, such as the size and location of
> -                      temporary RAM, the stack location and the BFV location.
> -
> -  @param PpiList      Points to a list of one or more PPI descriptors to be
> installed
> -                      initially by the PEI core. An empty PPI list consists of a single
> -                      descriptor with the end-tag
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST.
> -                      As part of its initialization phase, the PEI Foundation will add
> -                      these SEC-hosted PPIs to its PPI database such that both the PEI
> -                      Foundation and any modules can leverage the associated service
> calls
> -                      and/or code in these early PPIs.
> -
> -**/
> -VOID
> -EFIAPI
> -_ModuleEntryPoint (
> -  IN EFI_SEC_PEI_HAND_OFF   *SecCoreData,
> -  IN EFI_PEI_PPI_DESCRIPTOR *PpiList
> -  )
> -{
> -  EFI_STATUS                Status;
> -  EFI_PEI_FV_HANDLE         VolumeHandle;
> -  EFI_PEI_FILE_HANDLE       FileHandle;
> -  VOID                      *PeCoffImage;
> -  EFI_PEI_CORE_ENTRY_POINT  EntryPoint;
> -  EFI_PEI_PPI_DESCRIPTOR    *Ppi;
> -  EFI_PEI_PPI_DESCRIPTOR    *SecPpiList;
> -  UINTN                     SecReseveredMemorySize;
> -  UINTN                     Index;
> -
> -  EMU_MAGIC_PAGE()->PpiList = PpiList;
> -  ProcessLibraryConstructorList ();
> -
> -  DEBUG ((EFI_D_ERROR, "SEC Has Started\n"));
> -
> -  //
> -  // Add Our PPIs to the list
> -  //
> -  SecReseveredMemorySize = sizeof (gPrivateDispatchTable);
> -  for (Ppi = PpiList, Index = 1; ; Ppi++, Index++) {
> -    SecReseveredMemorySize += sizeof (EFI_PEI_PPI_DESCRIPTOR);
> -
> -    if ((Ppi->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) ==
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) {
> -      // Since we are appending, need to clear out privious list terminator.
> -      Ppi->Flags &= ~EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
> -      break;
> -    }
> -  }
> -
> -  // Keep everything on a good alignment
> -  SecReseveredMemorySize = ALIGN_VALUE (SecReseveredMemorySize,
> CPU_STACK_ALIGNMENT);
> -
> -#if 0
> -  // Tell the PEI Core to not use our buffer in temp RAM
> -  SecPpiList = (EFI_PEI_PPI_DESCRIPTOR *)SecCoreData-
> >PeiTemporaryRamBase;
> -  SecCoreData->PeiTemporaryRamBase = (VOID *)((UINTN)SecCoreData-
> >PeiTemporaryRamBase + SecReseveredMemorySize);
> -  SecCoreData->PeiTemporaryRamSize -= SecReseveredMemorySize;
> -#else
> -  {
> -    //
> -    // When I subtrack from SecCoreData->PeiTemporaryRamBase PEI Core
> crashes? Either there is a bug
> -    // or I don't understand temp RAM correctly?
> -    //
> -    EFI_PEI_PPI_DESCRIPTOR    PpiArray[10];
> -
> -    SecPpiList = &PpiArray[0];
> -    ASSERT (sizeof (PpiArray) >= SecReseveredMemorySize);
> -  }
> -#endif
> -  // Copy existing list, and append our entries.
> -  CopyMem (SecPpiList, PpiList, sizeof (EFI_PEI_PPI_DESCRIPTOR) * Index);
> -  CopyMem (&SecPpiList[Index], gPrivateDispatchTable, sizeof
> (gPrivateDispatchTable));
> -
> -  // Find PEI Core and transfer control
> -  VolumeHandle = (EFI_PEI_FV_HANDLE)(UINTN)SecCoreData-
> >BootFirmwareVolumeBase;
> -  FileHandle   = NULL;
> -  Status = PeiServicesFfsFindNextFile (EFI_FV_FILETYPE_PEI_CORE,
> VolumeHandle, &FileHandle);
> -  ASSERT_EFI_ERROR (Status);
> -
> -  Status = PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle,
> &PeCoffImage);
> -  ASSERT_EFI_ERROR (Status);
> -
> -  Status = PeCoffLoaderGetEntryPoint (PeCoffImage, (VOID **)&EntryPoint);
> -  ASSERT_EFI_ERROR (Status);
> -
> -  // Transfer control to PEI Core
> -  EntryPoint (SecCoreData, SecPpiList);
> -
> -  // PEI Core never returns
> -  ASSERT (FALSE);
> -  return;
> -}
> -
> -
> -
> +/*++ @file
> +  Stub SEC that is called from the OS appliation that is the root of the emulator.
> +
> +  The OS application will call the SEC with the PEI Entry Point API.
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> +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.
> +
> +**/
> +
> +#include "Sec.h"
> +
> +
> +
> +EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {
> +  SecTemporaryRamSupport
> +};
> +
> +
> +EFI_PEI_PPI_DESCRIPTOR  gPrivateDispatchTable[] = {
> +  {
> +    EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
> +    &gEfiTemporaryRamSupportPpiGuid,
> +    &mSecTemporaryRamSupportPpi
> +  }
> +};
> +
> +
> +
> +/**
> +  The entry point of PE/COFF Image for the PEI Core, that has been hijacked by
> this
> +  SEC that sits on top of an OS application. So the entry and exit of this module
> +  has the same API.
> +
> +  This function is the entry point for the PEI Foundation, which allows the SEC
> phase
> +  to pass information about the stack, temporary RAM and the Boot Firmware
> Volume.
> +  In addition, it also allows the SEC phase to pass services and data forward for
> use
> +  during the PEI phase in the form of one or more PPIs.
> +  There is no limit to the number of additional PPIs that can be passed from
> SEC into
> +  the PEI Foundation. As part of its initialization phase, the PEI Foundation will
> add
> +  these SEC-hosted PPIs to its PPI database such that both the PEI Foundation
> and any
> +  modules can leverage the associated service calls and/or code in these early
> PPIs.
> +  This function is required to call ProcessModuleEntryPointList() with the
> Context
> +  parameter set to NULL.  ProcessModuleEntryPoint() is never expected to
> return.
> +  The PEI Core is responsible for calling ProcessLibraryConstructorList() as
> soon as
> +  the PEI Services Table and the file handle for the PEI Core itself have been
> established.
> +  If ProcessModuleEntryPointList() returns, then ASSERT() and halt the system.
> +
> +  @param SecCoreData  Points to a data structure containing information
> about the PEI
> +                      core's operating environment, such as the size and location of
> +                      temporary RAM, the stack location and the BFV location.
> +
> +  @param PpiList      Points to a list of one or more PPI descriptors to be
> installed
> +                      initially by the PEI core. An empty PPI list consists of a single
> +                      descriptor with the end-tag
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST.
> +                      As part of its initialization phase, the PEI Foundation will add
> +                      these SEC-hosted PPIs to its PPI database such that both the PEI
> +                      Foundation and any modules can leverage the associated service
> calls
> +                      and/or code in these early PPIs.
> +
> +**/
> +VOID
> +EFIAPI
> +_ModuleEntryPoint (
> +  IN EFI_SEC_PEI_HAND_OFF   *SecCoreData,
> +  IN EFI_PEI_PPI_DESCRIPTOR *PpiList
> +  )
> +{
> +  EFI_STATUS                Status;
> +  EFI_PEI_FV_HANDLE         VolumeHandle;
> +  EFI_PEI_FILE_HANDLE       FileHandle;
> +  VOID                      *PeCoffImage;
> +  EFI_PEI_CORE_ENTRY_POINT  EntryPoint;
> +  EFI_PEI_PPI_DESCRIPTOR    *Ppi;
> +  EFI_PEI_PPI_DESCRIPTOR    *SecPpiList;
> +  UINTN                     SecReseveredMemorySize;
> +  UINTN                     Index;
> +
> +  EMU_MAGIC_PAGE()->PpiList = PpiList;
> +  ProcessLibraryConstructorList ();
> +
> +  DEBUG ((EFI_D_ERROR, "SEC Has Started\n"));
> +
> +  //
> +  // Add Our PPIs to the list
> +  //
> +  SecReseveredMemorySize = sizeof (gPrivateDispatchTable);
> +  for (Ppi = PpiList, Index = 1; ; Ppi++, Index++) {
> +    SecReseveredMemorySize += sizeof (EFI_PEI_PPI_DESCRIPTOR);
> +
> +    if ((Ppi->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) ==
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) {
> +      // Since we are appending, need to clear out privious list terminator.
> +      Ppi->Flags &= ~EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
> +      break;
> +    }
> +  }
> +
> +  // Keep everything on a good alignment
> +  SecReseveredMemorySize = ALIGN_VALUE (SecReseveredMemorySize,
> CPU_STACK_ALIGNMENT);
> +
> +#if 0
> +  // Tell the PEI Core to not use our buffer in temp RAM
> +  SecPpiList = (EFI_PEI_PPI_DESCRIPTOR *)SecCoreData-
> >PeiTemporaryRamBase;
> +  SecCoreData->PeiTemporaryRamBase = (VOID *)((UINTN)SecCoreData-
> >PeiTemporaryRamBase + SecReseveredMemorySize);
> +  SecCoreData->PeiTemporaryRamSize -= SecReseveredMemorySize;
> +#else
> +  {
> +    //
> +    // When I subtrack from SecCoreData->PeiTemporaryRamBase PEI Core
> crashes? Either there is a bug
> +    // or I don't understand temp RAM correctly?
> +    //
> +    EFI_PEI_PPI_DESCRIPTOR    PpiArray[10];
> +
> +    SecPpiList = &PpiArray[0];
> +    ASSERT (sizeof (PpiArray) >= SecReseveredMemorySize);
> +  }
> +#endif
> +  // Copy existing list, and append our entries.
> +  CopyMem (SecPpiList, PpiList, sizeof (EFI_PEI_PPI_DESCRIPTOR) * Index);
> +  CopyMem (&SecPpiList[Index], gPrivateDispatchTable, sizeof
> (gPrivateDispatchTable));
> +
> +  // Find PEI Core and transfer control
> +  VolumeHandle = (EFI_PEI_FV_HANDLE)(UINTN)SecCoreData-
> >BootFirmwareVolumeBase;
> +  FileHandle   = NULL;
> +  Status = PeiServicesFfsFindNextFile (EFI_FV_FILETYPE_PEI_CORE,
> VolumeHandle, &FileHandle);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  Status = PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle,
> &PeCoffImage);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  Status = PeCoffLoaderGetEntryPoint (PeCoffImage, (VOID **)&EntryPoint);
> +  ASSERT_EFI_ERROR (Status);
> +
> +  // Transfer control to PEI Core
> +  EntryPoint (SecCoreData, SecPpiList);
> +
> +  // PEI Core never returns
> +  ASSERT (FALSE);
> +  return;
> +}
> +
> +
> +
> diff --git a/EmulatorPkg/Sec/Sec.h b/EmulatorPkg/Sec/Sec.h
> index 4782578efa..c5781201eb 100644
> --- a/EmulatorPkg/Sec/Sec.h
> +++ b/EmulatorPkg/Sec/Sec.h
> @@ -1,51 +1,51 @@
> -/*++ @file
> -  Stub SEC that is called from the OS appliation that is the root of the emulator.
> -
> -  The OS application will call the SEC with the PEI Entry Point API.
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> -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 __SEC_H___
> -#define __SEC_H___
> -
> -
> -#include <PiPei.h>
> -#include <Library/EmuMagicPageLib.h>
> -#include <Library/DebugLib.h>
> -#include <Library/PeiServicesLib.h>
> -#include <Library/PeCoffGetEntryPointLib.h>
> -#include <Library/BaseMemoryLib.h>
> -
> -#include <Ppi/TemporaryRamSupport.h>
> -
> -
> -//
> -// I think this shold be defined in a MdePkg include file?
> -//
> -VOID
> -EFIAPI
> -ProcessLibraryConstructorList (
> -  VOID
> -  );
> -
> -EFI_STATUS
> -EFIAPI
> -SecTemporaryRamSupport (
> -  IN CONST EFI_PEI_SERVICES   **PeiServices,
> -  IN EFI_PHYSICAL_ADDRESS     TemporaryMemoryBase,
> -  IN EFI_PHYSICAL_ADDRESS     PermanentMemoryBase,
> -  IN UINTN                    CopySize
> -  );
> -
> -
> -#endif
> -
> +/*++ @file
> +  Stub SEC that is called from the OS appliation that is the root of the emulator.
> +
> +  The OS application will call the SEC with the PEI Entry Point API.
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> +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 __SEC_H___
> +#define __SEC_H___
> +
> +
> +#include <PiPei.h>
> +#include <Library/EmuMagicPageLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/PeiServicesLib.h>
> +#include <Library/PeCoffGetEntryPointLib.h>
> +#include <Library/BaseMemoryLib.h>
> +
> +#include <Ppi/TemporaryRamSupport.h>
> +
> +
> +//
> +// I think this shold be defined in a MdePkg include file?
> +//
> +VOID
> +EFIAPI
> +ProcessLibraryConstructorList (
> +  VOID
> +  );
> +
> +EFI_STATUS
> +EFIAPI
> +SecTemporaryRamSupport (
> +  IN CONST EFI_PEI_SERVICES   **PeiServices,
> +  IN EFI_PHYSICAL_ADDRESS     TemporaryMemoryBase,
> +  IN EFI_PHYSICAL_ADDRESS     PermanentMemoryBase,
> +  IN UINTN                    CopySize
> +  );
> +
> +
> +#endif
> +
> diff --git a/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c
> b/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c
> index 4ba27c2a6a..42103e100a 100644
> --- a/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c
> +++ b/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c
> @@ -47,8 +47,8 @@ typedef struct {
>    VOID                        *CurrentReadPointer;
>    VOID                        *EndReadPointer;
> 
> -	UINT32
> 	    ReceivedPackets;
> -	UINT32
> 	    DroppedPackets;
> +  UINT32                      ReceivedPackets;
> +  UINT32                      DroppedPackets;
> 
>  } EMU_SNP_PRIVATE;
> 
> @@ -200,8 +200,8 @@ EmuSnpStart (
>    struct ifreq       BoundIf;
>    struct bpf_program BpfProgram;
>    struct bpf_insn    *FilterProgram;
> -	u_int							 Value;
> -	u_int  						 ReadBufferSize;
> +  u_int               Value;
> +  u_int               ReadBufferSize;
>    UINT16             Temp16;
>    UINT32             Temp32;
> 
> @@ -229,23 +229,23 @@ EmuSnpStart (
>      }
> 
>      //
> -		// Get the read buffer size.
> -		//
> -		if (ioctl (Private->BpfFd, BIOCGBLEN, &ReadBufferSize) < 0) {
> -			goto DeviceErrorExit;
> -		}
> -
> -		//
> -		// Default value from BIOCGBLEN is usually too small, so use a
> much larger size, if necessary.
> -		//
> -		if (ReadBufferSize < FixedPcdGet32
> (PcdNetworkPacketFilterSize)) {
> -			ReadBufferSize = FixedPcdGet32
> (PcdNetworkPacketFilterSize);
> -			if (ioctl (Private->BpfFd, BIOCSBLEN, &ReadBufferSize)
> < 0) {
> -				goto DeviceErrorExit;
> -			}
> -		}
> -
> -		//
> +    // Get the read buffer size.
> +    //
> +    if (ioctl (Private->BpfFd, BIOCGBLEN, &ReadBufferSize) < 0) {
> +      goto DeviceErrorExit;
> +    }
> +
> +    //
> +    // Default value from BIOCGBLEN is usually too small, so use a much larger
> size, if necessary.
> +    //
> +    if (ReadBufferSize < FixedPcdGet32 (PcdNetworkPacketFilterSize)) {
> +      ReadBufferSize = FixedPcdGet32 (PcdNetworkPacketFilterSize);
> +      if (ioctl (Private->BpfFd, BIOCSBLEN, &ReadBufferSize) < 0) {
> +        goto DeviceErrorExit;
> +      }
> +    }
> +
> +    //
>      // Associate our interface with this BPF file descriptor.
>      //
>      AsciiStrCpy (BoundIf.ifr_name, Private->InterfaceName);
> @@ -254,7 +254,7 @@ EmuSnpStart (
>      }
> 
>      //
> -		// Enable immediate mode.
> +    // Enable immediate mode.
>      //
>      Value = 1;
>      if (ioctl (Private->BpfFd, BIOCIMMEDIATE, &Value) < 0) {
> @@ -286,8 +286,8 @@ EmuSnpStart (
>      //
>      // Allocate read buffer.
>      //
> -		Private->ReadBufferSize = ReadBufferSize;
> -		Private->ReadBuffer = malloc (Private->ReadBufferSize);
> +    Private->ReadBufferSize = ReadBufferSize;
> +    Private->ReadBuffer = malloc (Private->ReadBufferSize);
>      if (Private->ReadBuffer == NULL) {
>        goto ErrorExit;
>      }
> @@ -295,7 +295,7 @@ EmuSnpStart (
>      Private->CurrentReadPointer = Private->EndReadPointer = Private-
> >ReadBuffer;
> 
>      //
> -		// Install our packet filter: successful reads should only produce
> broadcast or unicast
> +    // Install our packet filter: successful reads should only produce broadcast
> or unicast
>      // packets directed to our fake MAC address.
>      //
>      FilterProgram = malloc (sizeof (mFilterInstructionTemplate)) ;
> @@ -906,7 +906,7 @@ EmuSnpReceive (
>  {
>    EMU_SNP_PRIVATE    *Private;
>    struct bpf_hdr     *BpfHeader;
> -	struct bpf_stat	   BpfStats;
> +  struct bpf_stat     BpfStats;
>    ETHERNET_HEADER    *EnetHeader;
>    ssize_t            Result;
> 
> @@ -916,19 +916,19 @@ EmuSnpReceive (
>      return EFI_NOT_STARTED;
>    }
> 
> -	ZeroMem (&BpfStats, sizeof( BpfStats));
> +  ZeroMem (&BpfStats, sizeof( BpfStats));
> 
> -	if (ioctl (Private->BpfFd, BIOCGSTATS, &BpfStats) == 0) {
> -		Private->ReceivedPackets += BpfStats.bs_recv;
> -		if (BpfStats.bs_drop > Private->DroppedPackets) {
> -			printf (
> -			  "SNP: STATS: RCVD = %d DROPPED = %d.  Probably
> need to increase BPF PcdNetworkPacketFilterSize?\n",
> -				BpfStats.bs_recv,
> -				BpfStats.bs_drop - Private->DroppedPackets
> -				);
> -			Private->DroppedPackets = BpfStats.bs_drop;
> -		}
> -	}
> +  if (ioctl (Private->BpfFd, BIOCGSTATS, &BpfStats) == 0) {
> +    Private->ReceivedPackets += BpfStats.bs_recv;
> +    if (BpfStats.bs_drop > Private->DroppedPackets) {
> +      printf (
> +        "SNP: STATS: RCVD = %d DROPPED = %d.  Probably need to increase BPF
> PcdNetworkPacketFilterSize?\n",
> +        BpfStats.bs_recv,
> +        BpfStats.bs_drop - Private->DroppedPackets
> +        );
> +      Private->DroppedPackets = BpfStats.bs_drop;
> +    }
> +  }
> 
>    //
>    // Do we have any remaining packets from the previous read?
> @@ -1004,7 +1004,7 @@ GetInterfaceMacAddr (
>    EMU_SNP_PRIVATE    *Private
>    )
>  {
> -	EFI_STATUS				  Status;
> +  EFI_STATUS          Status;
>    struct ifaddrs      *IfAddrs;
>    struct ifaddrs      *If;
>    struct sockaddr_dl  *IfSdl;
> diff --git a/EmulatorPkg/Unix/Host/BlockIo.c
> b/EmulatorPkg/Unix/Host/BlockIo.c
> index fa05fbc107..3b87a9e5b1 100644
> --- a/EmulatorPkg/Unix/Host/BlockIo.c
> +++ b/EmulatorPkg/Unix/Host/BlockIo.c
> @@ -347,7 +347,7 @@ EmuBlockIoReadWriteCommon (
>    @param[in]       MediaId    Id of the media, changes every time the media is
>                                replaced.
>    @param[in]       Lba        The starting Logical Block Address to read from.
> -  @param[in, out]  Token	    A pointer to the token associated with the
> transaction.
> +  @param[in, out]  Token      A pointer to the token associated with the
> transaction.
>    @param[in]       BufferSize Size of Buffer, must be a multiple of device block
> size.
>    @param[out]      Buffer     A pointer to the destination buffer for the data.
> The
>                                caller is responsible for either having implicit or
> diff --git a/EmulatorPkg/Unix/Host/EmuThunk.c
> b/EmulatorPkg/Unix/Host/EmuThunk.c
> index a7b12b14e5..1a2037f931 100644
> --- a/EmulatorPkg/Unix/Host/EmuThunk.c
> +++ b/EmulatorPkg/Unix/Host/EmuThunk.c
> @@ -1,440 +1,440 @@
> -/*++ @file
> -  Since the SEC is the only program in our emulation we
> -  must use a UEFI/PI mechanism to export APIs to other modules.
> -  This is the role of the EFI_EMU_THUNK_PROTOCOL.
> -
> -  The mUnixThunkTable exists so that a change to
> EFI_EMU_THUNK_PROTOCOL
> -  will cause an error in initializing the array if all the member functions
> -  are not added. It looks like adding a element to end and not initializing
> -  it may cause the table to be initaliized with the members at the end being
> -  set to zero. This is bad as jumping to zero will crash.
> -
> -Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR>
> -Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> -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.
> -
> -**/
> -
> -#include "Host.h"
> -
> -#ifdef __APPLE__
> -#define DebugAssert _Mangle__DebugAssert
> -
> -#include <assert.h>
> -#include <CoreServices/CoreServices.h>
> -#include <mach/mach.h>
> -#include <mach/mach_time.h>
> -
> -#undef DebugAssert
> -#endif
> -
> -int settimer_initialized;
> -struct timeval settimer_timeval;
> -void (*settimer_callback)(UINT64 delta);
> -
> -BOOLEAN gEmulatorInterruptEnabled = FALSE;
> -
> -
> -UINTN
> -SecWriteStdErr (
> -  IN UINT8     *Buffer,
> -  IN UINTN     NumberOfBytes
> -  )
> -{
> -  ssize_t Return;
> -
> -  Return = write (STDERR_FILENO, (const void *)Buffer,
> (size_t)NumberOfBytes);
> -
> -  return (Return == -1) ? 0 : Return;
> -}
> -
> -
> -EFI_STATUS
> -SecConfigStdIn (
> -  VOID
> -  )
> -{
> -  struct termios tty;
> -
> -  //
> -  // Need to turn off line buffering, ECHO, and make it unbuffered.
> -  //
> -  tcgetattr (STDIN_FILENO, &tty);
> -  tty.c_lflag &= ~(ICANON | ECHO);
> -  tcsetattr (STDIN_FILENO, TCSANOW, &tty);
> -
> -//  setvbuf (STDIN_FILENO, NULL, _IONBF, 0);
> -
> -  // now ioctl FIONREAD will do what we need
> -  return EFI_SUCCESS;
> -}
> -
> -UINTN
> -SecWriteStdOut (
> -  IN UINT8     *Buffer,
> -  IN UINTN     NumberOfBytes
> -  )
> -{
> -  ssize_t Return;
> -
> -  Return = write (STDOUT_FILENO, (const void *)Buffer,
> (size_t)NumberOfBytes);
> -
> -  return (Return == -1) ? 0 : Return;
> -}
> -
> -UINTN
> -SecReadStdIn (
> -  IN UINT8     *Buffer,
> -  IN UINTN     NumberOfBytes
> -  )
> -{
> -  ssize_t Return;
> -
> -  Return = read (STDIN_FILENO, Buffer, (size_t)NumberOfBytes);
> -
> -  return (Return == -1) ? 0 : Return;
> -}
> -
> -BOOLEAN
> -SecPollStdIn (
> -  VOID
> -  )
> -{
> -  int Result;
> -  int Bytes;
> -
> -  Result = ioctl (STDIN_FILENO, FIONREAD, &Bytes);
> -  if (Result == -1) {
> -    return FALSE;
> -  }
> -
> -  return (BOOLEAN)(Bytes > 0);
> -}
> -
> -
> -VOID *
> -SecMalloc (
> -  IN  UINTN Size
> -  )
> -{
> -  return malloc ((size_t)Size);
> -}
> -
> -VOID *
> -SecValloc (
> -  IN  UINTN Size
> -  )
> -{
> -  return valloc ((size_t)Size);
> -}
> -
> -BOOLEAN
> -SecFree (
> -  IN  VOID *Ptr
> -  )
> -{
> -  if (EfiSystemMemoryRange (Ptr)) {
> -    // If an address range is in the EFI memory map it was alloced via EFI.
> -    // So don't free those ranges and let the caller know.
> -    return FALSE;
> -  }
> -
> -  free (Ptr);
> -  return TRUE;
> -}
> -
> -
> -void
> -settimer_handler (int sig)
> -{
> -  struct timeval timeval;
> -  UINT64 delta;
> -
> -  gettimeofday (&timeval, NULL);
> -  delta = ((UINT64)timeval.tv_sec * 1000) + (timeval.tv_usec / 1000)
> -    - ((UINT64)settimer_timeval.tv_sec * 1000)
> -    - (settimer_timeval.tv_usec / 1000);
> -  settimer_timeval = timeval;
> -
> -  if (settimer_callback) {
> -    ReverseGasketUint64 (settimer_callback, delta);
> -  }
> -}
> -
> -VOID
> -SecSetTimer (
> -  IN  UINT64                  PeriodMs,
> -  IN  EMU_SET_TIMER_CALLBACK  CallBack
> -  )
> -{
> -  struct itimerval timerval;
> -  UINT32 remainder;
> -
> -  if (!settimer_initialized) {
> -    struct sigaction act;
> -
> -    settimer_initialized = 1;
> -    act.sa_handler = settimer_handler;
> -    act.sa_flags = 0;
> -    sigemptyset (&act.sa_mask);
> -    gEmulatorInterruptEnabled = TRUE;
> -    if (sigaction (SIGALRM, &act, NULL) != 0) {
> -      printf ("SetTimer: sigaction error %s\n", strerror (errno));
> -    }
> -    if (gettimeofday (&settimer_timeval, NULL) != 0) {
> -      printf ("SetTimer: gettimeofday error %s\n", strerror (errno));
> -    }
> -  }
> -  timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);
> -  DivU64x32Remainder(PeriodMs, 1000, &remainder);
> -  timerval.it_value.tv_usec = remainder * 1000;
> -  timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);
> -  timerval.it_interval = timerval.it_value;
> -
> -  if (setitimer (ITIMER_REAL, &timerval, NULL) != 0) {
> -    printf ("SetTimer: setitimer error %s\n", strerror (errno));
> -  }
> -  settimer_callback = CallBack;
> -}
> -
> -
> -VOID
> -SecEnableInterrupt (
> -  VOID
> -  )
> -{
> -  sigset_t  sigset;
> -
> -  gEmulatorInterruptEnabled = TRUE;
> -  // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
> -  // by enabling/disabling SIGALRM.
> -  sigemptyset (&sigset);
> -  sigaddset (&sigset, SIGALRM);
> -  pthread_sigmask (SIG_UNBLOCK, &sigset, NULL);
> -}
> -
> -
> -VOID
> -SecDisableInterrupt (
> -  VOID
> -  )
> -{
> -  sigset_t  sigset;
> -
> -  // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
> -  // by enabling/disabling SIGALRM.
> -  sigemptyset (&sigset);
> -  sigaddset (&sigset, SIGALRM);
> -  pthread_sigmask (SIG_BLOCK, &sigset, NULL);
> -  gEmulatorInterruptEnabled = FALSE;
> -}
> -
> -
> -BOOLEAN
> -SecInterruptEanbled (void)
> -{
> -  return gEmulatorInterruptEnabled;
> -}
> -
> -
> -UINT64
> -QueryPerformanceFrequency (
> -  VOID
> -  )
> -{
> -  // Hard code to nanoseconds
> -  return 1000000000ULL;
> -}
> -
> -UINT64
> -QueryPerformanceCounter (
> -  VOID
> -  )
> -{
> -#if __APPLE__
> -  UINT64          Start;
> -  static mach_timebase_info_data_t    sTimebaseInfo;
> -
> -
> -  Start = mach_absolute_time ();
> -
> -  // Convert to nanoseconds.
> -
> -  // If this is the first time we've run, get the timebase.
> -  // We can use denom == 0 to indicate that sTimebaseInfo is
> -  // uninitialised because it makes no sense to have a zero
> -  // denominator is a fraction.
> -
> -  if ( sTimebaseInfo.denom == 0 ) {
> -      (void) mach_timebase_info(&sTimebaseInfo);
> -  }
> -
> -  // Do the maths. We hope that the multiplication doesn't
> -  // overflow; the price you pay for working in fixed point.
> -
> -  return (Start * sTimebaseInfo.numer) / sTimebaseInfo.denom;
> -#else
> -  // Need to figure out what to do for Linux?
> -  return 0;
> -#endif
> -}
> -
> -
> -
> -VOID
> -SecSleep (
> -  IN  UINT64 Nanoseconds
> -  )
> -{
> -  struct timespec rq, rm;
> -  struct timeval  start, end;
> -  unsigned long  MicroSec;
> -
> -  rq.tv_sec  = DivU64x32 (Nanoseconds, 1000000000);
> -  rq.tv_nsec = ModU64x32 (Nanoseconds, 1000000000);
> -
> -  //
> -  // nanosleep gets interrupted by our timer tic.
> -  // we need to track wall clock time or we will stall for way too long
> -  //
> -  gettimeofday (&start, NULL);
> -  end.tv_sec  = start.tv_sec + rq.tv_sec;
> -  MicroSec = (start.tv_usec + rq.tv_nsec/1000);
> -  end.tv_usec = MicroSec % 1000000;
> -  if (MicroSec > 1000000) {
> -    end.tv_sec++;
> -  }
> -
> -  while (nanosleep (&rq, &rm) == -1) {
> -    if (errno != EINTR) {
> -      break;
> -    }
> -    gettimeofday (&start, NULL);
> -    if (start.tv_sec > end.tv_sec) {
> -      break;
> -    } if ((start.tv_sec == end.tv_sec) && (start.tv_usec > end.tv_usec)) {
> -      break;
> -    }
> -    rq = rm;
> -  }
> -}
> -
> -
> -VOID
> -SecCpuSleep (
> -  VOID
> -  )
> -{
> -  struct timespec rq, rm;
> -
> -  // nanosleep gets interrupted by the timer tic
> -  rq.tv_sec  = 1;
> -  rq.tv_nsec = 0;
> -
> -  nanosleep (&rq, &rm);
> -}
> -
> -
> -VOID
> -SecExit (
> -  UINTN   Status
> -  )
> -{
> -  exit (Status);
> -}
> -
> -
> -VOID
> -SecGetTime (
> -  OUT  EFI_TIME               *Time,
> -  OUT EFI_TIME_CAPABILITIES   *Capabilities OPTIONAL
> -  )
> -{
> -  struct tm *tm;
> -  time_t t;
> -
> -  t = time (NULL);
> -  tm = localtime (&t);
> -
> -  Time->Year = 1900 + tm->tm_year;
> -  Time->Month = tm->tm_mon + 1;
> -  Time->Day = tm->tm_mday;
> -  Time->Hour = tm->tm_hour;
> -  Time->Minute = tm->tm_min;
> -  Time->Second = tm->tm_sec;
> -  Time->Nanosecond = 0;
> -  Time->TimeZone = timezone;
> -  Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0)
> -    | (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
> -
> -  if (Capabilities != NULL) {
> -    Capabilities->Resolution  = 1;
> -    Capabilities->Accuracy    = 50000000;
> -    Capabilities->SetsToZero  = FALSE;
> -  }
> -}
> -
> -
> -
> -VOID
> -SecSetTime (
> -  IN  EFI_TIME               *Time
> -  )
> -{
> -  // Don't change the time on the system
> -  // We could save delta to localtime() and have SecGetTime adjust return
> values?
> -  return;
> -}
> -
> -
> -EFI_STATUS
> -SecGetNextProtocol (
> -  IN  BOOLEAN                 EmuBusDriver,
> -  OUT EMU_IO_THUNK_PROTOCOL   **Instance   OPTIONAL
> -  )
> -{
> -  return GetNextThunkProtocol (EmuBusDriver, Instance);
> -}
> -
> -
> -EMU_THUNK_PROTOCOL gEmuThunkProtocol = {
> -  GasketSecWriteStdErr,
> -  GasketSecConfigStdIn,
> -  GasketSecWriteStdOut,
> -  GasketSecReadStdIn,
> -  GasketSecPollStdIn,
> -  GasketSecMalloc,
> -  GasketSecValloc,
> -  GasketSecFree,
> -  GasketSecPeCoffGetEntryPoint,
> -  GasketSecPeCoffRelocateImageExtraAction,
> -  GasketSecPeCoffUnloadImageExtraAction,
> -  GasketSecEnableInterrupt,
> -  GasketSecDisableInterrupt,
> -  GasketQueryPerformanceFrequency,
> -  GasketQueryPerformanceCounter,
> -  GasketSecSleep,
> -  GasketSecCpuSleep,
> -  GasketSecExit,
> -  GasketSecGetTime,
> -  GasketSecSetTime,
> -  GasketSecSetTimer,
> -  GasketSecGetNextProtocol
> -};
> -
> -
> -VOID
> -SecInitThunkProtocol (
> -  VOID
> -  )
> -{
> -  // timezone and daylight lib globals depend on tzset be called 1st.
> -  tzset ();
> -}
> -
> +/*++ @file
> +  Since the SEC is the only program in our emulation we
> +  must use a UEFI/PI mechanism to export APIs to other modules.
> +  This is the role of the EFI_EMU_THUNK_PROTOCOL.
> +
> +  The mUnixThunkTable exists so that a change to
> EFI_EMU_THUNK_PROTOCOL
> +  will cause an error in initializing the array if all the member functions
> +  are not added. It looks like adding a element to end and not initializing
> +  it may cause the table to be initaliized with the members at the end being
> +  set to zero. This is bad as jumping to zero will crash.
> +
> +Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR>
> +Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> +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.
> +
> +**/
> +
> +#include "Host.h"
> +
> +#ifdef __APPLE__
> +#define DebugAssert _Mangle__DebugAssert
> +
> +#include <assert.h>
> +#include <CoreServices/CoreServices.h>
> +#include <mach/mach.h>
> +#include <mach/mach_time.h>
> +
> +#undef DebugAssert
> +#endif
> +
> +int settimer_initialized;
> +struct timeval settimer_timeval;
> +void (*settimer_callback)(UINT64 delta);
> +
> +BOOLEAN gEmulatorInterruptEnabled = FALSE;
> +
> +
> +UINTN
> +SecWriteStdErr (
> +  IN UINT8     *Buffer,
> +  IN UINTN     NumberOfBytes
> +  )
> +{
> +  ssize_t Return;
> +
> +  Return = write (STDERR_FILENO, (const void *)Buffer,
> (size_t)NumberOfBytes);
> +
> +  return (Return == -1) ? 0 : Return;
> +}
> +
> +
> +EFI_STATUS
> +SecConfigStdIn (
> +  VOID
> +  )
> +{
> +  struct termios tty;
> +
> +  //
> +  // Need to turn off line buffering, ECHO, and make it unbuffered.
> +  //
> +  tcgetattr (STDIN_FILENO, &tty);
> +  tty.c_lflag &= ~(ICANON | ECHO);
> +  tcsetattr (STDIN_FILENO, TCSANOW, &tty);
> +
> +//  setvbuf (STDIN_FILENO, NULL, _IONBF, 0);
> +
> +  // now ioctl FIONREAD will do what we need
> +  return EFI_SUCCESS;
> +}
> +
> +UINTN
> +SecWriteStdOut (
> +  IN UINT8     *Buffer,
> +  IN UINTN     NumberOfBytes
> +  )
> +{
> +  ssize_t Return;
> +
> +  Return = write (STDOUT_FILENO, (const void *)Buffer,
> (size_t)NumberOfBytes);
> +
> +  return (Return == -1) ? 0 : Return;
> +}
> +
> +UINTN
> +SecReadStdIn (
> +  IN UINT8     *Buffer,
> +  IN UINTN     NumberOfBytes
> +  )
> +{
> +  ssize_t Return;
> +
> +  Return = read (STDIN_FILENO, Buffer, (size_t)NumberOfBytes);
> +
> +  return (Return == -1) ? 0 : Return;
> +}
> +
> +BOOLEAN
> +SecPollStdIn (
> +  VOID
> +  )
> +{
> +  int Result;
> +  int Bytes;
> +
> +  Result = ioctl (STDIN_FILENO, FIONREAD, &Bytes);
> +  if (Result == -1) {
> +    return FALSE;
> +  }
> +
> +  return (BOOLEAN)(Bytes > 0);
> +}
> +
> +
> +VOID *
> +SecMalloc (
> +  IN  UINTN Size
> +  )
> +{
> +  return malloc ((size_t)Size);
> +}
> +
> +VOID *
> +SecValloc (
> +  IN  UINTN Size
> +  )
> +{
> +  return valloc ((size_t)Size);
> +}
> +
> +BOOLEAN
> +SecFree (
> +  IN  VOID *Ptr
> +  )
> +{
> +  if (EfiSystemMemoryRange (Ptr)) {
> +    // If an address range is in the EFI memory map it was alloced via EFI.
> +    // So don't free those ranges and let the caller know.
> +    return FALSE;
> +  }
> +
> +  free (Ptr);
> +  return TRUE;
> +}
> +
> +
> +void
> +settimer_handler (int sig)
> +{
> +  struct timeval timeval;
> +  UINT64 delta;
> +
> +  gettimeofday (&timeval, NULL);
> +  delta = ((UINT64)timeval.tv_sec * 1000) + (timeval.tv_usec / 1000)
> +    - ((UINT64)settimer_timeval.tv_sec * 1000)
> +    - (settimer_timeval.tv_usec / 1000);
> +  settimer_timeval = timeval;
> +
> +  if (settimer_callback) {
> +    ReverseGasketUint64 (settimer_callback, delta);
> +  }
> +}
> +
> +VOID
> +SecSetTimer (
> +  IN  UINT64                  PeriodMs,
> +  IN  EMU_SET_TIMER_CALLBACK  CallBack
> +  )
> +{
> +  struct itimerval timerval;
> +  UINT32 remainder;
> +
> +  if (!settimer_initialized) {
> +    struct sigaction act;
> +
> +    settimer_initialized = 1;
> +    act.sa_handler = settimer_handler;
> +    act.sa_flags = 0;
> +    sigemptyset (&act.sa_mask);
> +    gEmulatorInterruptEnabled = TRUE;
> +    if (sigaction (SIGALRM, &act, NULL) != 0) {
> +      printf ("SetTimer: sigaction error %s\n", strerror (errno));
> +    }
> +    if (gettimeofday (&settimer_timeval, NULL) != 0) {
> +      printf ("SetTimer: gettimeofday error %s\n", strerror (errno));
> +    }
> +  }
> +  timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);
> +  DivU64x32Remainder(PeriodMs, 1000, &remainder);
> +  timerval.it_value.tv_usec = remainder * 1000;
> +  timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);
> +  timerval.it_interval = timerval.it_value;
> +
> +  if (setitimer (ITIMER_REAL, &timerval, NULL) != 0) {
> +    printf ("SetTimer: setitimer error %s\n", strerror (errno));
> +  }
> +  settimer_callback = CallBack;
> +}
> +
> +
> +VOID
> +SecEnableInterrupt (
> +  VOID
> +  )
> +{
> +  sigset_t  sigset;
> +
> +  gEmulatorInterruptEnabled = TRUE;
> +  // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
> +  // by enabling/disabling SIGALRM.
> +  sigemptyset (&sigset);
> +  sigaddset (&sigset, SIGALRM);
> +  pthread_sigmask (SIG_UNBLOCK, &sigset, NULL);
> +}
> +
> +
> +VOID
> +SecDisableInterrupt (
> +  VOID
> +  )
> +{
> +  sigset_t  sigset;
> +
> +  // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
> +  // by enabling/disabling SIGALRM.
> +  sigemptyset (&sigset);
> +  sigaddset (&sigset, SIGALRM);
> +  pthread_sigmask (SIG_BLOCK, &sigset, NULL);
> +  gEmulatorInterruptEnabled = FALSE;
> +}
> +
> +
> +BOOLEAN
> +SecInterruptEanbled (void)
> +{
> +  return gEmulatorInterruptEnabled;
> +}
> +
> +
> +UINT64
> +QueryPerformanceFrequency (
> +  VOID
> +  )
> +{
> +  // Hard code to nanoseconds
> +  return 1000000000ULL;
> +}
> +
> +UINT64
> +QueryPerformanceCounter (
> +  VOID
> +  )
> +{
> +#if __APPLE__
> +  UINT64          Start;
> +  static mach_timebase_info_data_t    sTimebaseInfo;
> +
> +
> +  Start = mach_absolute_time ();
> +
> +  // Convert to nanoseconds.
> +
> +  // If this is the first time we've run, get the timebase.
> +  // We can use denom == 0 to indicate that sTimebaseInfo is
> +  // uninitialised because it makes no sense to have a zero
> +  // denominator is a fraction.
> +
> +  if ( sTimebaseInfo.denom == 0 ) {
> +      (void) mach_timebase_info(&sTimebaseInfo);
> +  }
> +
> +  // Do the maths. We hope that the multiplication doesn't
> +  // overflow; the price you pay for working in fixed point.
> +
> +  return (Start * sTimebaseInfo.numer) / sTimebaseInfo.denom;
> +#else
> +  // Need to figure out what to do for Linux?
> +  return 0;
> +#endif
> +}
> +
> +
> +
> +VOID
> +SecSleep (
> +  IN  UINT64 Nanoseconds
> +  )
> +{
> +  struct timespec rq, rm;
> +  struct timeval  start, end;
> +  unsigned long  MicroSec;
> +
> +  rq.tv_sec  = DivU64x32 (Nanoseconds, 1000000000);
> +  rq.tv_nsec = ModU64x32 (Nanoseconds, 1000000000);
> +
> +  //
> +  // nanosleep gets interrupted by our timer tic.
> +  // we need to track wall clock time or we will stall for way too long
> +  //
> +  gettimeofday (&start, NULL);
> +  end.tv_sec  = start.tv_sec + rq.tv_sec;
> +  MicroSec = (start.tv_usec + rq.tv_nsec/1000);
> +  end.tv_usec = MicroSec % 1000000;
> +  if (MicroSec > 1000000) {
> +    end.tv_sec++;
> +  }
> +
> +  while (nanosleep (&rq, &rm) == -1) {
> +    if (errno != EINTR) {
> +      break;
> +    }
> +    gettimeofday (&start, NULL);
> +    if (start.tv_sec > end.tv_sec) {
> +      break;
> +    } if ((start.tv_sec == end.tv_sec) && (start.tv_usec > end.tv_usec)) {
> +      break;
> +    }
> +    rq = rm;
> +  }
> +}
> +
> +
> +VOID
> +SecCpuSleep (
> +  VOID
> +  )
> +{
> +  struct timespec rq, rm;
> +
> +  // nanosleep gets interrupted by the timer tic
> +  rq.tv_sec  = 1;
> +  rq.tv_nsec = 0;
> +
> +  nanosleep (&rq, &rm);
> +}
> +
> +
> +VOID
> +SecExit (
> +  UINTN   Status
> +  )
> +{
> +  exit (Status);
> +}
> +
> +
> +VOID
> +SecGetTime (
> +  OUT  EFI_TIME               *Time,
> +  OUT EFI_TIME_CAPABILITIES   *Capabilities OPTIONAL
> +  )
> +{
> +  struct tm *tm;
> +  time_t t;
> +
> +  t = time (NULL);
> +  tm = localtime (&t);
> +
> +  Time->Year = 1900 + tm->tm_year;
> +  Time->Month = tm->tm_mon + 1;
> +  Time->Day = tm->tm_mday;
> +  Time->Hour = tm->tm_hour;
> +  Time->Minute = tm->tm_min;
> +  Time->Second = tm->tm_sec;
> +  Time->Nanosecond = 0;
> +  Time->TimeZone = timezone;
> +  Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0)
> +    | (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
> +
> +  if (Capabilities != NULL) {
> +    Capabilities->Resolution  = 1;
> +    Capabilities->Accuracy    = 50000000;
> +    Capabilities->SetsToZero  = FALSE;
> +  }
> +}
> +
> +
> +
> +VOID
> +SecSetTime (
> +  IN  EFI_TIME               *Time
> +  )
> +{
> +  // Don't change the time on the system
> +  // We could save delta to localtime() and have SecGetTime adjust return
> values?
> +  return;
> +}
> +
> +
> +EFI_STATUS
> +SecGetNextProtocol (
> +  IN  BOOLEAN                 EmuBusDriver,
> +  OUT EMU_IO_THUNK_PROTOCOL   **Instance   OPTIONAL
> +  )
> +{
> +  return GetNextThunkProtocol (EmuBusDriver, Instance);
> +}
> +
> +
> +EMU_THUNK_PROTOCOL gEmuThunkProtocol = {
> +  GasketSecWriteStdErr,
> +  GasketSecConfigStdIn,
> +  GasketSecWriteStdOut,
> +  GasketSecReadStdIn,
> +  GasketSecPollStdIn,
> +  GasketSecMalloc,
> +  GasketSecValloc,
> +  GasketSecFree,
> +  GasketSecPeCoffGetEntryPoint,
> +  GasketSecPeCoffRelocateImageExtraAction,
> +  GasketSecPeCoffUnloadImageExtraAction,
> +  GasketSecEnableInterrupt,
> +  GasketSecDisableInterrupt,
> +  GasketQueryPerformanceFrequency,
> +  GasketQueryPerformanceCounter,
> +  GasketSecSleep,
> +  GasketSecCpuSleep,
> +  GasketSecExit,
> +  GasketSecGetTime,
> +  GasketSecSetTime,
> +  GasketSecSetTimer,
> +  GasketSecGetNextProtocol
> +};
> +
> +
> +VOID
> +SecInitThunkProtocol (
> +  VOID
> +  )
> +{
> +  // timezone and daylight lib globals depend on tzset be called 1st.
> +  tzset ();
> +}
> +
> diff --git a/EmulatorPkg/Unix/Host/Host.c b/EmulatorPkg/Unix/Host/Host.c
> index f84b22f576..9aba7c854d 100644
> --- a/EmulatorPkg/Unix/Host/Host.c
> +++ b/EmulatorPkg/Unix/Host/Host.c
> @@ -1148,7 +1148,7 @@ GdbScriptAddImage (
> 
>    if (ImageContext->PdbPointer != NULL && !IsPdbFile (ImageContext-
> >PdbPointer)) {
>      FILE  *GdbTempFile;
> -    if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
> +    if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
>        GdbTempFile = fopen (gGdbWorkingFileName, "a");
>        if (GdbTempFile != NULL) {
>          long unsigned int SymbolsAddr = (long unsigned int)(ImageContext-
> >ImageAddress + ImageContext->SizeOfHeaders);
> @@ -1170,13 +1170,13 @@ GdbScriptAddImage (
>        GdbTempFile = fopen (gGdbWorkingFileName, "w");
>        if (GdbTempFile != NULL) {
>          fprintf (
> -          GdbTempFile,
> -          "add-symbol-file %s 0x%08lx\n",
> -          ImageContext->PdbPointer,
> +          GdbTempFile,
> +          "add-symbol-file %s 0x%08lx\n",
> +          ImageContext->PdbPointer,
>            (long unsigned int)(ImageContext->ImageAddress + ImageContext-
> >SizeOfHeaders)
>            );
>          fclose (GdbTempFile);
> -
> +
>          //
>          // Target for gdb breakpoint in a script that uses gGdbWorkingFileName
> to set a breakpoint.
>          // Hey what can you say scripting in gdb is not that great....
> @@ -1225,7 +1225,7 @@ GdbScriptRemoveImage (
>      return;
>    }
> 
> -  if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
> +  if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
>      //
>      // Write the file we need for the gdb script
>      //
> @@ -1256,7 +1256,7 @@ GdbScriptRemoveImage (
>        SecGdbScriptBreak (ImageContext->PdbPointer, strlen (ImageContext-
> >PdbPointer) + 1, 0, 0);
>      } else {
>        ASSERT (FALSE);
> -    }
> +    }
>    }
>  }
> 
> diff --git a/EmulatorPkg/Unix/Host/Host.h b/EmulatorPkg/Unix/Host/Host.h
> index 66c7c8df12..f7db46cdcd 100644
> --- a/EmulatorPkg/Unix/Host/Host.h
> +++ b/EmulatorPkg/Unix/Host/Host.h
> @@ -82,7 +82,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY
> KIND, EITHER EXPRESS OR IMPLIED.
>  #undef NTOHS
>  #undef HTONS
>  #undef B0
> -#undef CR3
> +#undef CR3
> 
>  #include <PiPei.h>
>  #include <Uefi.h>
> diff --git a/EmulatorPkg/Unix/Host/Ia32/Gasket.S
> b/EmulatorPkg/Unix/Host/Ia32/Gasket.S
> index aa90ea8095..5664cc54b4 100644
> --- a/EmulatorPkg/Unix/Host/Ia32/Gasket.S
> +++ b/EmulatorPkg/Unix/Host/Ia32/Gasket.S
> @@ -1,1492 +1,1492 @@
> -#------------------------------------------------------------------------------
> -#
> -# Manage differenced between UNIX ABI and EFI/Windows ABI
> -#
> -# For IA-32 the only difference is Mac OS X requires a 16-byte aligned stack.
> -# For Linux this stack adjustment is a no-op, but we may as well make the
> -# the code common.
> -#
> -# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> -# 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.
> -#
> -#------------------------------------------------------------------------------
> -
> -
> -
> -  .text
> -
> -//
> -// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)
> -//
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)
> -ASM_PFX(GasketSecWriteStdErr):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  12(%ebp), %eax
> -  movl  %eax, 4(%esp)
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call  ASM_PFX(SecWriteStdErr)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)
> -ASM_PFX(GasketSecConfigStdIn):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  12(%ebp), %eax
> -  movl  %eax, 4(%esp)
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call  ASM_PFX(SecConfigStdIn)
> -
> -  leave
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)
> -ASM_PFX(GasketSecWriteStdOut):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  12(%ebp), %eax
> -  movl  %eax, 4(%esp)
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call  ASM_PFX(SecWriteStdOut)
> -
> -  leave
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)
> -ASM_PFX(GasketSecReadStdIn):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  12(%ebp), %eax
> -  movl  %eax, 4(%esp)
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call  ASM_PFX(SecReadStdIn)
> -
> -  leave
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)
> -ASM_PFX(GasketSecPollStdIn):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  12(%ebp), %eax
> -  movl  %eax, 4(%esp)
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call  ASM_PFX(SecPollStdIn)
> -
> -  leave
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecMalloc)
> -ASM_PFX(GasketSecMalloc):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(SecMalloc)
> -
> -  leave
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecValloc)
> -ASM_PFX(GasketSecValloc):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(SecValloc)
> -
> -  leave
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecFree)
> -ASM_PFX(GasketSecFree):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(SecFree)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecSetTimer)
> -ASM_PFX(GasketSecSetTimer):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $40, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	8(%ebp), %eax
> -	movl	12(%ebp), %edx
> -	movl	%edx, 4(%esp)
> -	movl	%eax, (%esp)
> -
> -  call  ASM_PFX(SecSetTimer)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)
> -ASM_PFX(GasketSecEnableInterrupt):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -
> -  call    ASM_PFX(SecEnableInterrupt)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)
> -ASM_PFX(GasketSecDisableInterrupt):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -
> -  call    ASM_PFX(SecDisableInterrupt)
> -
> -  leave
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)
> -ASM_PFX(GasketQueryPerformanceFrequency):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -
> -  call    ASM_PFX(QueryPerformanceFrequency)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)
> -ASM_PFX(GasketQueryPerformanceCounter):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -
> -  call    ASM_PFX(QueryPerformanceCounter)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecSleep)
> -ASM_PFX(GasketSecSleep):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	8(%ebp), %eax
> -	movl	12(%ebp), %ecx
> -	movl	%ecx, 4(%esp)
> -	movl	%eax, (%esp)
> -
> -  call  ASM_PFX(SecSleep)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)
> -ASM_PFX(GasketSecCpuSleep):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -
> -  call  ASM_PFX(SecCpuSleep)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecExit)
> -ASM_PFX(GasketSecExit):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(SecExit)     // Less to do as we will never return to EFI ABI
> world
> -LDEAD_LOOP:
> -  jmp  LDEAD_LOOP              // _exit should never return
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecGetTime)
> -ASM_PFX(GasketSecGetTime):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  12(%ebp), %eax
> -  movl  %eax, 4(%esp)
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call  ASM_PFX(SecGetTime)
> -
> -  leave
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecSetTime)
> -ASM_PFX(GasketSecSetTime):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  12(%ebp), %eax
> -  movl  %eax, 4(%esp)
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call  ASM_PFX(SecSetTime)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)
> -ASM_PFX(GasketSecGetNextProtocol):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $40, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	20(%ebp), %eax
> -	movl	%eax, 12(%esp)
> -	movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(SecGetNextProtocol)
> -
> -  leave
> -  ret
> -
> -// PPIs produced by SEC
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)
> -ASM_PFX(GasketSecPeCoffGetEntryPoint):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  12(%ebp), %eax
> -  movl  %eax, 4(%esp)
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(SecPeCoffGetEntryPoint)
> -
> -  leave
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)
> -ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(SecPeCoffRelocateImageExtraAction)
> -
> -  leave
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)
> -ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(SecPeCoffUnloadImageExtraAction)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)
> -ASM_PFX(GasketSecEmuThunkAddress):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -
> -  call    ASM_PFX(SecEmuThunkAddress)
> -
> -  leave
> -  ret
> -
> -//
> -// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
> -//
> -
> -ASM_GLOBAL ASM_PFX(GasketX11Size)
> -ASM_PFX(GasketX11Size):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $40, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	20(%ebp), %eax
> -	movl	%eax, 12(%esp)
> -	movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(X11Size)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11CheckKey)
> -ASM_PFX(GasketX11CheckKey):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(X11CheckKey)
> -
> -  leave
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GetKey)
> -ASM_PFX(GasketX11GetKey):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  12(%ebp), %eax
> -  movl  %eax, 4(%esp)
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(X11GetKey)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11KeySetState)
> -ASM_PFX(GasketX11KeySetState):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  12(%ebp), %eax
> -  movl  %eax, 4(%esp)
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(X11KeySetState)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)
> -ASM_PFX(GasketX11RegisterKeyNotify):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $40, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	20(%ebp), %eax
> -	movl	%eax, 12(%esp)
> -	movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(X11RegisterKeyNotify)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11Blt)
> -ASM_PFX(GasketX11Blt):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $40, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	20(%ebp), %eax
> -	movl	%eax, 12(%esp)
> -	movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(X11Blt)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)
> -ASM_PFX(GasketX11CheckPointer):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(X11CheckPointer)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)
> -ASM_PFX(GasketX11GetPointerState):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  12(%ebp), %eax
> -  movl  %eax, 4(%esp)
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(X11GetPointerState)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)
> -ASM_PFX(GasketX11GraphicsWindowOpen):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(X11GraphicsWindowOpen)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)
> -ASM_PFX(GasketX11GraphicsWindowClose):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  12(%ebp), %eax
> -  movl  %eax, 4(%esp)
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(X11GraphicsWindowClose)
> -
> -  leave
> -  ret
> -
> -
> -// Pthreads
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)
> -ASM_PFX(GasketPthreadMutexLock):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(PthreadMutexLock)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)
> -ASM_PFX(GasketPthreadMutexUnLock):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(PthreadMutexUnLock)
> -
> -  leave
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)
> -ASM_PFX(GasketPthreadMutexTryLock):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(PthreadMutexTryLock)
> -
> -  leave
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)
> -ASM_PFX(GasketPthreadMutexInit):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -
> -  call    ASM_PFX(PthreadMutexInit)
> -
> -  leave
> -  ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)
> -ASM_PFX(GasketPthreadMutexDestroy):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(PthreadMutexDestroy)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadCreate)
> -ASM_PFX(GasketPthreadCreate):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $40, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	20(%ebp), %eax
> -	movl	%eax, 12(%esp)
> -	movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(PthreadCreate)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadExit)
> -ASM_PFX(GasketPthreadExit):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(PthreadExit)
> -
> -  leave
> -  ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadSelf)
> -ASM_PFX(GasketPthreadSelf):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -
> -  call    ASM_PFX(PthreadSelf)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadOpen)
> -ASM_PFX(GasketPthreadOpen):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(PthreadOpen)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadClose)
> -ASM_PFX(GasketPthreadClose):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(PthreadClose)
> -
> -  leave
> -  ret
> -
> -
> -
> -
> -//
> -// UNIX ABI to EFI ABI call
> -//
> -// UINTN
> -// ReverseGasketUint64 (
> -//   void *Api,
> -//   UINTN Arg1
> -//   );
> -ASM_GLOBAL ASM_PFX(ReverseGasketUint64)
> -ASM_PFX(ReverseGasketUint64):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -	subl	$8, %esp
> -	movl	16(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, (%esp)
> -	calll	*8(%ebp)
> -	addl	$8, %esp
> -	popl	%ebp
> -	ret
> -
> -
> -
> -//
> -// UNIX ABI to EFI ABI call
> -//
> -// UINTN
> -// ReverseGasketUint64Uint64 (
> -//   void *Api,
> -//   UINTN Arg1
> -//   UINTN Arg2
> -//   );
> -ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)
> -ASM_PFX(ReverseGasketUint64Uint64):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -	subl	$24, %esp
> -	movl	24(%ebp), %eax
> -	movl	%eax, 12(%esp)
> -	movl	20(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	16(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, (%esp)
> -	calll	*8(%ebp)
> -	addl	$24, %esp
> -	popl	%ebp
> -	ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)
> -ASM_PFX(GasketSecUnixPeiAutoScan):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $40, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(SecUnixPeiAutoScan)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)
> -ASM_PFX(GasketSecUnixFdAddress):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $40, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	20(%ebp), %eax
> -	movl	%eax, 12(%esp)
> -	movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(SecUnixFdAddress)
> -
> -  leave
> -  ret
> -
> -
> -// EmuIoThunk SimpleFileSystem
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)
> -ASM_PFX(GasketPosixOpenVolume):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $40, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	20(%ebp), %eax
> -	movl	%eax, 12(%esp)
> -	movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(PosixOpenVolume)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)
> -ASM_PFX(GasketPosixFileOpen):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $56, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	28(%ebp), %eax
> -	movl	32(%ebp), %ecx
> -	movl	%ecx, 24(%esp)
> -	movl	%eax, 20(%esp)
> -	movl	20(%ebp), %eax
> -	movl	24(%ebp), %ecx
> -	movl	%ecx, 16(%esp)
> -	movl	%eax, 12(%esp)
> -	movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(PosixFileOpen)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)
> -ASM_PFX(GasketPosixFileCLose):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(PosixFileCLose)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)
> -ASM_PFX(GasketPosixFileDelete):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(PosixFileDelete)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileRead)
> -ASM_PFX(GasketPosixFileRead):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $40, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(PosixFileRead)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)
> -ASM_PFX(GasketPosixFileWrite):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $40, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(PosixFileWrite)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)
> -ASM_PFX(GasketPosixFileSetPossition):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $40, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	12(%ebp), %eax
> -	movl	16(%ebp), %ecx
> -	movl	%ecx, 8(%esp)
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(PosixFileSetPossition)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)
> -ASM_PFX(GasketPosixFileGetPossition):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  12(%ebp), %eax
> -  movl  %eax, 4(%esp)
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(PosixFileGetPossition)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)
> -ASM_PFX(GasketPosixFileGetInfo):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $40, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	20(%ebp), %eax
> -	movl	%eax, 12(%esp)
> -	movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(PosixFileGetInfo)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)
> -ASM_PFX(GasketPosixFileSetInfo):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $40, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	20(%ebp), %eax
> -	movl	%eax, 12(%esp)
> -	movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(PosixFileSetInfo)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)
> -ASM_PFX(GasketPosixFileFlush):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(PosixFileFlush)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)
> -ASM_PFX(GasketPosixFileSystmeThunkOpen):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(PosixFileSystmeThunkOpen)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)
> -ASM_PFX(GasketPosixFileSystmeThunkClose):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(PosixFileSystmeThunkClose)
> -
> -  leave
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)
> -ASM_PFX(GasketEmuBlockIoReset):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  12(%ebp), %eax
> -  movl  %eax, 4(%esp)
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(EmuBlockIoReset)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)
> -ASM_PFX(GasketEmuBlockIoReadBlocks):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $56, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	32(%ebp), %eax
> -	movl	%eax, 24(%esp)
> -	movl	28(%ebp), %eax
> -	movl	%eax, 20(%esp)
> -	movl	24(%ebp), %eax
> -	movl	%eax, 16(%esp)
> -	movl	16(%ebp), %eax
> -	movl	20(%ebp), %edx
> -	movl	%edx, 12(%esp)
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(EmuBlockIoReadBlocks)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)
> -ASM_PFX(GasketEmuBlockIoWriteBlocks):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $56, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	32(%ebp), %eax
> -	movl	%eax, 24(%esp)
> -	movl	28(%ebp), %eax
> -	movl	%eax, 20(%esp)
> -	movl	24(%ebp), %eax
> -	movl	%eax, 16(%esp)
> -	movl	16(%ebp), %eax
> -	movl	20(%ebp), %edx
> -	movl	%edx, 12(%esp)
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(EmuBlockIoWriteBlocks)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)
> -ASM_PFX(GasketEmuBlockIoFlushBlocks):  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  12(%ebp), %eax
> -  movl  %eax, 4(%esp)
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -
> -  call    ASM_PFX(EmuBlockIoFlushBlocks)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)
> -ASM_PFX(GasketEmuBlockIoCreateMapping):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  12(%ebp), %eax
> -  movl  %eax, 4(%esp)
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(EmuBlockIoCreateMapping)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)
> -ASM_PFX(GasketBlockIoThunkOpen):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(EmuBlockIoThunkOpen)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)
> -ASM_PFX(GasketBlockIoThunkClose):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(EmuBlockIoThunkClose)
> -
> -  leave
> -  ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)
> -ASM_PFX(GasketSnpCreateMapping):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  12(%ebp), %eax
> -  movl  %eax, 4(%esp)
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(EmuSnpCreateMapping)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStart)
> -ASM_PFX(GasketSnpStart):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(EmuSnpStart)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStop)
> -ASM_PFX(GasketSnpStop):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(EmuSnpStop)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpInitialize)
> -ASM_PFX(GasketSnpInitialize):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $40, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(EmuSnpInitialize)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpReset)
> -ASM_PFX(GasketSnpReset):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  12(%ebp), %eax
> -  movl  %eax, 4(%esp)
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(EmuSnpReset)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpShutdown)
> -ASM_PFX(GasketSnpShutdown):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(EmuSnpShutdown)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)
> -ASM_PFX(GasketSnpReceiveFilters):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $40, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	28(%ebp), %eax
> -	movl	%eax, 20(%esp)
> -	movl	24(%ebp), %eax
> -	movl	%eax, 16(%esp)
> -	movl	20(%ebp), %eax
> -	movl	%eax, 12(%esp)
> -	movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(EmuSnpReceiveFilters)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)
> -ASM_PFX(GasketSnpStationAddress):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $40, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  leave
> -  ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStatistics)
> -ASM_PFX(GasketSnpStatistics):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $40, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	20(%ebp), %eax
> -	movl	%eax, 12(%esp)
> -	movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(EmuSnpStatistics)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)
> -ASM_PFX(GasketSnpMCastIpToMac):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $40, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	20(%ebp), %eax
> -	movl	%eax, 12(%esp)
> -	movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(EmuSnpMCastIpToMac)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpNvData)
> -ASM_PFX(GasketSnpNvData):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $40, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	24(%ebp), %eax
> -	movl	%eax, 16(%esp)
> -	movl	20(%ebp), %eax
> -	movl	%eax, 12(%esp)
> -	movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(EmuSnpNvData)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)
> -ASM_PFX(GasketSnpGetStatus):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $40, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(EmuSnpGetStatus)
> -
> -  leave
> -  ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpTransmit)
> -ASM_PFX(GasketSnpTransmit):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $56, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	32(%ebp), %eax
> -	movl	%eax, 24(%esp)
> -	movl	28(%ebp), %eax
> -	movl	%eax, 20(%esp)
> -	movl	24(%ebp), %eax
> -	movl	%eax, 16(%esp)
> -	movl	20(%ebp), %eax
> -	movl	%eax, 12(%esp)
> -	movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(EmuSnpTransmit)
> -
> -  leave
> -  ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpReceive)
> -ASM_PFX(GasketSnpReceive):
> -	pushl	%ebp
> -	movl	%esp, %ebp
> -  subl  $56, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -	movl	32(%ebp), %eax
> -	movl	%eax, 24(%esp)
> -	movl	28(%ebp), %eax
> -	movl	%eax, 20(%esp)
> -	movl	24(%ebp), %eax
> -	movl	%eax, 16(%esp)
> -	movl	20(%ebp), %eax
> -	movl	%eax, 12(%esp)
> -	movl	16(%ebp), %eax
> -	movl	%eax, 8(%esp)
> -	movl	12(%ebp), %eax
> -	movl	%eax, 4(%esp)
> -	movl	8(%ebp), %eax
> -	movl	%eax, (%esp)
> -
> -  call    ASM_PFX(EmuSnpReceive)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)
> -ASM_PFX(GasketSnpThunkOpen):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(EmuSnpThunkOpen)
> -
> -  leave
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)
> -ASM_PFX(GasketSnpThunkClose):
> -  pushl %ebp
> -  movl  %esp, %ebp
> -  subl  $24, %esp      // sub extra 16 from the stack for alignment
> -  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> -  movl  8(%ebp), %eax
> -  movl  %eax, (%esp)
> -
> -  call    ASM_PFX(EmuSnpThunkClose)
> -
> -  leave
> -  ret
> -
> -
> +#------------------------------------------------------------------------------
> +#
> +# Manage differenced between UNIX ABI and EFI/Windows ABI
> +#
> +# For IA-32 the only difference is Mac OS X requires a 16-byte aligned stack.
> +# For Linux this stack adjustment is a no-op, but we may as well make the
> +# the code common.
> +#
> +# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> +# 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.
> +#
> +#------------------------------------------------------------------------------
> +
> +
> +
> +  .text
> +
> +//
> +// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)
> +//
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)
> +ASM_PFX(GasketSecWriteStdErr):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call  ASM_PFX(SecWriteStdErr)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)
> +ASM_PFX(GasketSecConfigStdIn):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call  ASM_PFX(SecConfigStdIn)
> +
> +  leave
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)
> +ASM_PFX(GasketSecWriteStdOut):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call  ASM_PFX(SecWriteStdOut)
> +
> +  leave
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)
> +ASM_PFX(GasketSecReadStdIn):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call  ASM_PFX(SecReadStdIn)
> +
> +  leave
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)
> +ASM_PFX(GasketSecPollStdIn):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call  ASM_PFX(SecPollStdIn)
> +
> +  leave
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecMalloc)
> +ASM_PFX(GasketSecMalloc):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(SecMalloc)
> +
> +  leave
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecValloc)
> +ASM_PFX(GasketSecValloc):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(SecValloc)
> +
> +  leave
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecFree)
> +ASM_PFX(GasketSecFree):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(SecFree)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecSetTimer)
> +ASM_PFX(GasketSecSetTimer):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $40, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  8(%ebp), %eax
> +  movl  12(%ebp), %edx
> +  movl  %edx, 4(%esp)
> +  movl  %eax, (%esp)
> +
> +  call  ASM_PFX(SecSetTimer)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)
> +ASM_PFX(GasketSecEnableInterrupt):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +
> +  call    ASM_PFX(SecEnableInterrupt)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)
> +ASM_PFX(GasketSecDisableInterrupt):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +
> +  call    ASM_PFX(SecDisableInterrupt)
> +
> +  leave
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)
> +ASM_PFX(GasketQueryPerformanceFrequency):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +
> +  call    ASM_PFX(QueryPerformanceFrequency)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)
> +ASM_PFX(GasketQueryPerformanceCounter):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +
> +  call    ASM_PFX(QueryPerformanceCounter)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecSleep)
> +ASM_PFX(GasketSecSleep):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  12(%ebp), %ecx
> +  movl  %ecx, 4(%esp)
> +  movl  %eax, (%esp)
> +
> +  call  ASM_PFX(SecSleep)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)
> +ASM_PFX(GasketSecCpuSleep):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +
> +  call  ASM_PFX(SecCpuSleep)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecExit)
> +ASM_PFX(GasketSecExit):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(SecExit)     // Less to do as we will never return to EFI ABI
> world
> +LDEAD_LOOP:
> +  jmp  LDEAD_LOOP              // _exit should never return
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecGetTime)
> +ASM_PFX(GasketSecGetTime):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call  ASM_PFX(SecGetTime)
> +
> +  leave
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecSetTime)
> +ASM_PFX(GasketSecSetTime):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call  ASM_PFX(SecSetTime)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)
> +ASM_PFX(GasketSecGetNextProtocol):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $40, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  20(%ebp), %eax
> +  movl  %eax, 12(%esp)
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(SecGetNextProtocol)
> +
> +  leave
> +  ret
> +
> +// PPIs produced by SEC
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)
> +ASM_PFX(GasketSecPeCoffGetEntryPoint):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(SecPeCoffGetEntryPoint)
> +
> +  leave
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)
> +ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(SecPeCoffRelocateImageExtraAction)
> +
> +  leave
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)
> +ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(SecPeCoffUnloadImageExtraAction)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)
> +ASM_PFX(GasketSecEmuThunkAddress):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +
> +  call    ASM_PFX(SecEmuThunkAddress)
> +
> +  leave
> +  ret
> +
> +//
> +// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
> +//
> +
> +ASM_GLOBAL ASM_PFX(GasketX11Size)
> +ASM_PFX(GasketX11Size):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $40, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  20(%ebp), %eax
> +  movl  %eax, 12(%esp)
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(X11Size)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11CheckKey)
> +ASM_PFX(GasketX11CheckKey):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(X11CheckKey)
> +
> +  leave
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GetKey)
> +ASM_PFX(GasketX11GetKey):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(X11GetKey)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11KeySetState)
> +ASM_PFX(GasketX11KeySetState):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(X11KeySetState)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)
> +ASM_PFX(GasketX11RegisterKeyNotify):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $40, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  20(%ebp), %eax
> +  movl  %eax, 12(%esp)
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(X11RegisterKeyNotify)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11Blt)
> +ASM_PFX(GasketX11Blt):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $40, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  20(%ebp), %eax
> +  movl  %eax, 12(%esp)
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(X11Blt)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)
> +ASM_PFX(GasketX11CheckPointer):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(X11CheckPointer)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)
> +ASM_PFX(GasketX11GetPointerState):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(X11GetPointerState)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)
> +ASM_PFX(GasketX11GraphicsWindowOpen):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(X11GraphicsWindowOpen)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)
> +ASM_PFX(GasketX11GraphicsWindowClose):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(X11GraphicsWindowClose)
> +
> +  leave
> +  ret
> +
> +
> +// Pthreads
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)
> +ASM_PFX(GasketPthreadMutexLock):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(PthreadMutexLock)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)
> +ASM_PFX(GasketPthreadMutexUnLock):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(PthreadMutexUnLock)
> +
> +  leave
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)
> +ASM_PFX(GasketPthreadMutexTryLock):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(PthreadMutexTryLock)
> +
> +  leave
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)
> +ASM_PFX(GasketPthreadMutexInit):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +
> +  call    ASM_PFX(PthreadMutexInit)
> +
> +  leave
> +  ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)
> +ASM_PFX(GasketPthreadMutexDestroy):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(PthreadMutexDestroy)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadCreate)
> +ASM_PFX(GasketPthreadCreate):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $40, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  20(%ebp), %eax
> +  movl  %eax, 12(%esp)
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(PthreadCreate)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadExit)
> +ASM_PFX(GasketPthreadExit):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(PthreadExit)
> +
> +  leave
> +  ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadSelf)
> +ASM_PFX(GasketPthreadSelf):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +
> +  call    ASM_PFX(PthreadSelf)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadOpen)
> +ASM_PFX(GasketPthreadOpen):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(PthreadOpen)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadClose)
> +ASM_PFX(GasketPthreadClose):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(PthreadClose)
> +
> +  leave
> +  ret
> +
> +
> +
> +
> +//
> +// UNIX ABI to EFI ABI call
> +//
> +// UINTN
> +// ReverseGasketUint64 (
> +//   void *Api,
> +//   UINTN Arg1
> +//   );
> +ASM_GLOBAL ASM_PFX(ReverseGasketUint64)
> +ASM_PFX(ReverseGasketUint64):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $8, %esp
> +  movl  16(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, (%esp)
> +  calll  *8(%ebp)
> +  addl  $8, %esp
> +  popl  %ebp
> +  ret
> +
> +
> +
> +//
> +// UNIX ABI to EFI ABI call
> +//
> +// UINTN
> +// ReverseGasketUint64Uint64 (
> +//   void *Api,
> +//   UINTN Arg1
> +//   UINTN Arg2
> +//   );
> +ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)
> +ASM_PFX(ReverseGasketUint64Uint64):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp
> +  movl  24(%ebp), %eax
> +  movl  %eax, 12(%esp)
> +  movl  20(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  16(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, (%esp)
> +  calll  *8(%ebp)
> +  addl  $24, %esp
> +  popl  %ebp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)
> +ASM_PFX(GasketSecUnixPeiAutoScan):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $40, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(SecUnixPeiAutoScan)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)
> +ASM_PFX(GasketSecUnixFdAddress):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $40, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  20(%ebp), %eax
> +  movl  %eax, 12(%esp)
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(SecUnixFdAddress)
> +
> +  leave
> +  ret
> +
> +
> +// EmuIoThunk SimpleFileSystem
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)
> +ASM_PFX(GasketPosixOpenVolume):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $40, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  20(%ebp), %eax
> +  movl  %eax, 12(%esp)
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(PosixOpenVolume)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)
> +ASM_PFX(GasketPosixFileOpen):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $56, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  28(%ebp), %eax
> +  movl  32(%ebp), %ecx
> +  movl  %ecx, 24(%esp)
> +  movl  %eax, 20(%esp)
> +  movl  20(%ebp), %eax
> +  movl  24(%ebp), %ecx
> +  movl  %ecx, 16(%esp)
> +  movl  %eax, 12(%esp)
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(PosixFileOpen)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)
> +ASM_PFX(GasketPosixFileCLose):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(PosixFileCLose)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)
> +ASM_PFX(GasketPosixFileDelete):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(PosixFileDelete)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileRead)
> +ASM_PFX(GasketPosixFileRead):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $40, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(PosixFileRead)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)
> +ASM_PFX(GasketPosixFileWrite):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $40, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(PosixFileWrite)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)
> +ASM_PFX(GasketPosixFileSetPossition):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $40, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  12(%ebp), %eax
> +  movl  16(%ebp), %ecx
> +  movl  %ecx, 8(%esp)
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(PosixFileSetPossition)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)
> +ASM_PFX(GasketPosixFileGetPossition):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(PosixFileGetPossition)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)
> +ASM_PFX(GasketPosixFileGetInfo):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $40, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  20(%ebp), %eax
> +  movl  %eax, 12(%esp)
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(PosixFileGetInfo)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)
> +ASM_PFX(GasketPosixFileSetInfo):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $40, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  20(%ebp), %eax
> +  movl  %eax, 12(%esp)
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(PosixFileSetInfo)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)
> +ASM_PFX(GasketPosixFileFlush):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(PosixFileFlush)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)
> +ASM_PFX(GasketPosixFileSystmeThunkOpen):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(PosixFileSystmeThunkOpen)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)
> +ASM_PFX(GasketPosixFileSystmeThunkClose):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(PosixFileSystmeThunkClose)
> +
> +  leave
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)
> +ASM_PFX(GasketEmuBlockIoReset):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(EmuBlockIoReset)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)
> +ASM_PFX(GasketEmuBlockIoReadBlocks):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $56, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  32(%ebp), %eax
> +  movl  %eax, 24(%esp)
> +  movl  28(%ebp), %eax
> +  movl  %eax, 20(%esp)
> +  movl  24(%ebp), %eax
> +  movl  %eax, 16(%esp)
> +  movl  16(%ebp), %eax
> +  movl  20(%ebp), %edx
> +  movl  %edx, 12(%esp)
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(EmuBlockIoReadBlocks)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)
> +ASM_PFX(GasketEmuBlockIoWriteBlocks):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $56, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  32(%ebp), %eax
> +  movl  %eax, 24(%esp)
> +  movl  28(%ebp), %eax
> +  movl  %eax, 20(%esp)
> +  movl  24(%ebp), %eax
> +  movl  %eax, 16(%esp)
> +  movl  16(%ebp), %eax
> +  movl  20(%ebp), %edx
> +  movl  %edx, 12(%esp)
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(EmuBlockIoWriteBlocks)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)
> +ASM_PFX(GasketEmuBlockIoFlushBlocks):  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +
> +  call    ASM_PFX(EmuBlockIoFlushBlocks)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)
> +ASM_PFX(GasketEmuBlockIoCreateMapping):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(EmuBlockIoCreateMapping)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)
> +ASM_PFX(GasketBlockIoThunkOpen):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(EmuBlockIoThunkOpen)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)
> +ASM_PFX(GasketBlockIoThunkClose):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(EmuBlockIoThunkClose)
> +
> +  leave
> +  ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)
> +ASM_PFX(GasketSnpCreateMapping):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(EmuSnpCreateMapping)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStart)
> +ASM_PFX(GasketSnpStart):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(EmuSnpStart)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStop)
> +ASM_PFX(GasketSnpStop):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(EmuSnpStop)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpInitialize)
> +ASM_PFX(GasketSnpInitialize):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $40, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(EmuSnpInitialize)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpReset)
> +ASM_PFX(GasketSnpReset):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(EmuSnpReset)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpShutdown)
> +ASM_PFX(GasketSnpShutdown):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(EmuSnpShutdown)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)
> +ASM_PFX(GasketSnpReceiveFilters):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $40, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  28(%ebp), %eax
> +  movl  %eax, 20(%esp)
> +  movl  24(%ebp), %eax
> +  movl  %eax, 16(%esp)
> +  movl  20(%ebp), %eax
> +  movl  %eax, 12(%esp)
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(EmuSnpReceiveFilters)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)
> +ASM_PFX(GasketSnpStationAddress):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $40, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  leave
> +  ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStatistics)
> +ASM_PFX(GasketSnpStatistics):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $40, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  20(%ebp), %eax
> +  movl  %eax, 12(%esp)
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(EmuSnpStatistics)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)
> +ASM_PFX(GasketSnpMCastIpToMac):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $40, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  20(%ebp), %eax
> +  movl  %eax, 12(%esp)
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(EmuSnpMCastIpToMac)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpNvData)
> +ASM_PFX(GasketSnpNvData):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $40, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  24(%ebp), %eax
> +  movl  %eax, 16(%esp)
> +  movl  20(%ebp), %eax
> +  movl  %eax, 12(%esp)
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(EmuSnpNvData)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)
> +ASM_PFX(GasketSnpGetStatus):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $40, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(EmuSnpGetStatus)
> +
> +  leave
> +  ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpTransmit)
> +ASM_PFX(GasketSnpTransmit):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $56, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  32(%ebp), %eax
> +  movl  %eax, 24(%esp)
> +  movl  28(%ebp), %eax
> +  movl  %eax, 20(%esp)
> +  movl  24(%ebp), %eax
> +  movl  %eax, 16(%esp)
> +  movl  20(%ebp), %eax
> +  movl  %eax, 12(%esp)
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(EmuSnpTransmit)
> +
> +  leave
> +  ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpReceive)
> +ASM_PFX(GasketSnpReceive):
> +  pushl  %ebp
> +  movl  %esp, %ebp
> +  subl  $56, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  32(%ebp), %eax
> +  movl  %eax, 24(%esp)
> +  movl  28(%ebp), %eax
> +  movl  %eax, 20(%esp)
> +  movl  24(%ebp), %eax
> +  movl  %eax, 16(%esp)
> +  movl  20(%ebp), %eax
> +  movl  %eax, 12(%esp)
> +  movl  16(%ebp), %eax
> +  movl  %eax, 8(%esp)
> +  movl  12(%ebp), %eax
> +  movl  %eax, 4(%esp)
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(EmuSnpReceive)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)
> +ASM_PFX(GasketSnpThunkOpen):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(EmuSnpThunkOpen)
> +
> +  leave
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)
> +ASM_PFX(GasketSnpThunkClose):
> +  pushl %ebp
> +  movl  %esp, %ebp
> +  subl  $24, %esp      // sub extra 16 from the stack for alignment
> +  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
> +  movl  8(%ebp), %eax
> +  movl  %eax, (%esp)
> +
> +  call    ASM_PFX(EmuSnpThunkClose)
> +
> +  leave
> +  ret
> +
> +
> diff --git a/EmulatorPkg/Unix/Host/Ia32/SwitchStack.c
> b/EmulatorPkg/Unix/Host/Ia32/SwitchStack.c
> index 118083f4b5..79baeaf1f2 100644
> --- a/EmulatorPkg/Unix/Host/Ia32/SwitchStack.c
> +++ b/EmulatorPkg/Unix/Host/Ia32/SwitchStack.c
> @@ -1,74 +1,74 @@
> -/*++
> -
> -Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
> -Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
> -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.
> -
> -
> ---*/
> -
> -#include "Host.h"
> -
> -
> -/**
> -  Transfers control to a function starting with a new stack.
> -
> -  Transfers control to the function specified by EntryPoint using the new stack
> -  specified by NewStack and passing in the parameters specified by Context1
> and
> -  Context2. Context1 and Context2 are optional and may be NULL. The function
> -  EntryPoint must never return.
> -
> -  If EntryPoint is NULL, then ASSERT().
> -  If NewStack is NULL, then ASSERT().
> -
> -  @param  EntryPoint  A pointer to function to call with the new stack.
> -  @param  Context1    A pointer to the context to pass into the EntryPoint
> -                      function.
> -  @param  Context2    A pointer to the context to pass into the EntryPoint
> -                      function.
> -  @param  NewStack    A pointer to the new stack to use for the EntryPoint
> -                      function.
> -
> -**/
> -VOID
> -EFIAPI
> -PeiSwitchStacks (
> -  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
> -  IN      VOID                      *Context1,  OPTIONAL
> -  IN      VOID                      *Context2,  OPTIONAL
> -  IN      VOID                      *NewStack
> -  )
> -{
> -  BASE_LIBRARY_JUMP_BUFFER  JumpBuffer;
> -
> -  ASSERT (EntryPoint != NULL);
> -  ASSERT (NewStack != NULL);
> -
> -  //
> -  // Stack should be aligned with CPU_STACK_ALIGNMENT
> -  //
> -  ASSERT (((UINTN)NewStack & (CPU_STACK_ALIGNMENT - 1)) == 0);
> -
> -  JumpBuffer.Eip = (UINTN)EntryPoint;
> -  JumpBuffer.Esp = (UINTN)NewStack - sizeof (VOID*);
> -  JumpBuffer.Esp -= sizeof (Context1) + sizeof (Context2);
> -  ((VOID**)JumpBuffer.Esp)[1] = Context1;
> -  ((VOID**)JumpBuffer.Esp)[2] = Context2;
> -
> -  LongJump (&JumpBuffer, (UINTN)-1);
> -
> -
> -  //
> -  // PeiSwitchStacks () will never return
> -  //
> -  ASSERT (FALSE);
> -}
> -
> -
> -
> +/*++
> +
> +Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
> +Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
> +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.
> +
> +
> +--*/
> +
> +#include "Host.h"
> +
> +
> +/**
> +  Transfers control to a function starting with a new stack.
> +
> +  Transfers control to the function specified by EntryPoint using the new stack
> +  specified by NewStack and passing in the parameters specified by Context1
> and
> +  Context2. Context1 and Context2 are optional and may be NULL. The
> function
> +  EntryPoint must never return.
> +
> +  If EntryPoint is NULL, then ASSERT().
> +  If NewStack is NULL, then ASSERT().
> +
> +  @param  EntryPoint  A pointer to function to call with the new stack.
> +  @param  Context1    A pointer to the context to pass into the EntryPoint
> +                      function.
> +  @param  Context2    A pointer to the context to pass into the EntryPoint
> +                      function.
> +  @param  NewStack    A pointer to the new stack to use for the EntryPoint
> +                      function.
> +
> +**/
> +VOID
> +EFIAPI
> +PeiSwitchStacks (
> +  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
> +  IN      VOID                      *Context1,  OPTIONAL
> +  IN      VOID                      *Context2,  OPTIONAL
> +  IN      VOID                      *NewStack
> +  )
> +{
> +  BASE_LIBRARY_JUMP_BUFFER  JumpBuffer;
> +
> +  ASSERT (EntryPoint != NULL);
> +  ASSERT (NewStack != NULL);
> +
> +  //
> +  // Stack should be aligned with CPU_STACK_ALIGNMENT
> +  //
> +  ASSERT (((UINTN)NewStack & (CPU_STACK_ALIGNMENT - 1)) == 0);
> +
> +  JumpBuffer.Eip = (UINTN)EntryPoint;
> +  JumpBuffer.Esp = (UINTN)NewStack - sizeof (VOID*);
> +  JumpBuffer.Esp -= sizeof (Context1) + sizeof (Context2);
> +  ((VOID**)JumpBuffer.Esp)[1] = Context1;
> +  ((VOID**)JumpBuffer.Esp)[2] = Context2;
> +
> +  LongJump (&JumpBuffer, (UINTN)-1);
> +
> +
> +  //
> +  // PeiSwitchStacks () will never return
> +  //
> +  ASSERT (FALSE);
> +}
> +
> +
> +
> diff --git a/EmulatorPkg/Unix/Host/MemoryAllocationLib.c
> b/EmulatorPkg/Unix/Host/MemoryAllocationLib.c
> index 9db91b83d9..df39358e2a 100644
> --- a/EmulatorPkg/Unix/Host/MemoryAllocationLib.c
> +++ b/EmulatorPkg/Unix/Host/MemoryAllocationLib.c
> @@ -1,145 +1,145 @@
> -/*++ @file
> -
> -  Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
> -
> -  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.
> -
> -**/
> -
> -#include "Base.h"
> -#include "Library/BaseMemoryLib.h"
> -#include "Library/MemoryAllocationLib.h"
> -
> -#include <stdlib.h>
> -
> -/**
> -  Allocates a buffer of type EfiBootServicesData.
> -
> -  Allocates the number bytes specified by AllocationSize of type
> EfiBootServicesData and returns a
> -  pointer to the allocated buffer.  If AllocationSize is 0, then a valid buffer of 0
> size is
> -  returned.  If there is not enough memory remaining to satisfy the request,
> then NULL is returned.
> -
> -  @param  AllocationSize        The number of bytes to allocate.
> -
> -  @return A pointer to the allocated buffer or NULL if allocation fails.
> -
> -**/
> -VOID *
> -EFIAPI
> -AllocatePool (
> -  IN UINTN  AllocationSize
> -  )
> -{
> -  return (VOID*) malloc (AllocationSize);
> -}
> -
> -
> -/**
> -  Allocates and zeros a buffer of type EfiBootServicesData.
> -
> -  Allocates the number bytes specified by AllocationSize of type
> EfiBootServicesData, clears the
> -  buffer with zeros, and returns a pointer to the allocated buffer.  If
> AllocationSize is 0, then a
> -  valid buffer of 0 size is returned.  If there is not enough memory remaining to
> satisfy the
> -  request, then NULL is returned.
> -
> -  @param  AllocationSize        The number of bytes to allocate and zero.
> -
> -  @return A pointer to the allocated buffer or NULL if allocation fails.
> -
> -**/
> -VOID *
> -EFIAPI
> -AllocateZeroPool (
> -  IN UINTN  AllocationSize
> -  )
> -{
> -  VOID *Buffer;
> -
> -  Buffer = AllocatePool (AllocationSize);
> -  if (Buffer == NULL) {
> -    return NULL;
> -  }
> -
> -  ZeroMem (Buffer, AllocationSize);
> -
> -  return Buffer;
> -}
> -
> -
> -/**
> -  Reallocates a buffer of type EfiBootServicesData.
> -
> -  Allocates and zeros the number bytes specified by NewSize from memory of
> type
> -  EfiBootServicesData.  If OldBuffer is not NULL, then the smaller of OldSize
> and
> -  NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
> -  OldBuffer is freed.  A pointer to the newly allocated buffer is returned.
> -  If NewSize is 0, then a valid buffer of 0 size is  returned.  If there is not
> -  enough memory remaining to satisfy the request, then NULL is returned.
> -
> -  If the allocation of the new buffer is successful and the smaller of NewSize
> and OldSize
> -  is greater than (MAX_ADDRESS - OldBuffer + 1), then ASSERT().
> -
> -  @param  OldSize        The size, in bytes, of OldBuffer.
> -  @param  NewSize        The size, in bytes, of the buffer to reallocate.
> -  @param  OldBuffer      The buffer to copy to the allocated buffer.  This is an
> optional
> -                         parameter that may be NULL.
> -
> -  @return A pointer to the allocated buffer or NULL if allocation fails.
> -
> -**/
> -VOID *
> -EFIAPI
> -ReallocatePool (
> -  IN UINTN  OldSize,
> -  IN UINTN  NewSize,
> -  IN VOID   *OldBuffer  OPTIONAL
> -  )
> -{
> -  VOID *NewBuffer;
> -
> -  NewBuffer = AllocatePool (NewSize);
> -  if (NewBuffer == NULL) {
> -    return NULL;
> -  }
> -
> -  if (OldBuffer != NULL) {
> -    if (OldSize > 0) {
> -      CopyMem (NewBuffer, OldBuffer, OldSize);
> -    }
> -
> -    FreePool (OldBuffer);
> -  }
> -
> -  return NewBuffer;
> -}
> -
> -
> -/**
> -  Frees a buffer that was previously allocated with one of the pool allocation
> functions in the
> -  Memory Allocation Library.
> -
> -  Frees the buffer specified by Buffer.  Buffer must have been allocated on a
> previous call to the
> -  pool allocation services of the Memory Allocation Library.  If it is not possible
> to free pool
> -  resources, then this function will perform no actions.
> -
> -  If Buffer was not allocated with a pool allocation function in the Memory
> Allocation Library,
> -  then ASSERT().
> -
> -  @param  Buffer                Pointer to the buffer to free.
> -
> -**/
> -VOID
> -EFIAPI
> -FreePool (
> -  IN VOID   *Buffer
> -  )
> -{
> -  free ((void *) Buffer);
> -}
> -
> +/*++ @file
> +
> +  Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
> +
> +  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.
> +
> +**/
> +
> +#include "Base.h"
> +#include "Library/BaseMemoryLib.h"
> +#include "Library/MemoryAllocationLib.h"
> +
> +#include <stdlib.h>
> +
> +/**
> +  Allocates a buffer of type EfiBootServicesData.
> +
> +  Allocates the number bytes specified by AllocationSize of type
> EfiBootServicesData and returns a
> +  pointer to the allocated buffer.  If AllocationSize is 0, then a valid buffer of 0
> size is
> +  returned.  If there is not enough memory remaining to satisfy the request,
> then NULL is returned.
> +
> +  @param  AllocationSize        The number of bytes to allocate.
> +
> +  @return A pointer to the allocated buffer or NULL if allocation fails.
> +
> +**/
> +VOID *
> +EFIAPI
> +AllocatePool (
> +  IN UINTN  AllocationSize
> +  )
> +{
> +  return (VOID*) malloc (AllocationSize);
> +}
> +
> +
> +/**
> +  Allocates and zeros a buffer of type EfiBootServicesData.
> +
> +  Allocates the number bytes specified by AllocationSize of type
> EfiBootServicesData, clears the
> +  buffer with zeros, and returns a pointer to the allocated buffer.  If
> AllocationSize is 0, then a
> +  valid buffer of 0 size is returned.  If there is not enough memory remaining
> to satisfy the
> +  request, then NULL is returned.
> +
> +  @param  AllocationSize        The number of bytes to allocate and zero.
> +
> +  @return A pointer to the allocated buffer or NULL if allocation fails.
> +
> +**/
> +VOID *
> +EFIAPI
> +AllocateZeroPool (
> +  IN UINTN  AllocationSize
> +  )
> +{
> +  VOID *Buffer;
> +
> +  Buffer = AllocatePool (AllocationSize);
> +  if (Buffer == NULL) {
> +    return NULL;
> +  }
> +
> +  ZeroMem (Buffer, AllocationSize);
> +
> +  return Buffer;
> +}
> +
> +
> +/**
> +  Reallocates a buffer of type EfiBootServicesData.
> +
> +  Allocates and zeros the number bytes specified by NewSize from memory of
> type
> +  EfiBootServicesData.  If OldBuffer is not NULL, then the smaller of OldSize
> and
> +  NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
> +  OldBuffer is freed.  A pointer to the newly allocated buffer is returned.
> +  If NewSize is 0, then a valid buffer of 0 size is  returned.  If there is not
> +  enough memory remaining to satisfy the request, then NULL is returned.
> +
> +  If the allocation of the new buffer is successful and the smaller of NewSize
> and OldSize
> +  is greater than (MAX_ADDRESS - OldBuffer + 1), then ASSERT().
> +
> +  @param  OldSize        The size, in bytes, of OldBuffer.
> +  @param  NewSize        The size, in bytes, of the buffer to reallocate.
> +  @param  OldBuffer      The buffer to copy to the allocated buffer.  This is an
> optional
> +                         parameter that may be NULL.
> +
> +  @return A pointer to the allocated buffer or NULL if allocation fails.
> +
> +**/
> +VOID *
> +EFIAPI
> +ReallocatePool (
> +  IN UINTN  OldSize,
> +  IN UINTN  NewSize,
> +  IN VOID   *OldBuffer  OPTIONAL
> +  )
> +{
> +  VOID *NewBuffer;
> +
> +  NewBuffer = AllocatePool (NewSize);
> +  if (NewBuffer == NULL) {
> +    return NULL;
> +  }
> +
> +  if (OldBuffer != NULL) {
> +    if (OldSize > 0) {
> +      CopyMem (NewBuffer, OldBuffer, OldSize);
> +    }
> +
> +    FreePool (OldBuffer);
> +  }
> +
> +  return NewBuffer;
> +}
> +
> +
> +/**
> +  Frees a buffer that was previously allocated with one of the pool allocation
> functions in the
> +  Memory Allocation Library.
> +
> +  Frees the buffer specified by Buffer.  Buffer must have been allocated on a
> previous call to the
> +  pool allocation services of the Memory Allocation Library.  If it is not possible
> to free pool
> +  resources, then this function will perform no actions.
> +
> +  If Buffer was not allocated with a pool allocation function in the Memory
> Allocation Library,
> +  then ASSERT().
> +
> +  @param  Buffer                Pointer to the buffer to free.
> +
> +**/
> +VOID
> +EFIAPI
> +FreePool (
> +  IN VOID   *Buffer
> +  )
> +{
> +  free ((void *) Buffer);
> +}
> +
> diff --git a/EmulatorPkg/Unix/Host/PosixFileSystem.c
> b/EmulatorPkg/Unix/Host/PosixFileSystem.c
> index 98e8c894eb..529543d6eb 100644
> --- a/EmulatorPkg/Unix/Host/PosixFileSystem.c
> +++ b/EmulatorPkg/Unix/Host/PosixFileSystem.c
> @@ -1,1556 +1,1556 @@
> -/*++ @file
> - POSIX Pthreads to emulate APs and implement threads
> -
> -Copyright (c) 2011, Apple Inc. 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.
> -
> -
> -**/
> -
> -#include "Host.h"
> -
> -
> -#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE SIGNATURE_32 ('E',
> 'P', 'f', 's')
> -
> -typedef struct {
> -  UINTN                           Signature;
> -  EMU_IO_THUNK_PROTOCOL           *Thunk;
> -  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL SimpleFileSystem;
> -  CHAR8                           *FilePath;
> -  CHAR16                          *VolumeLabel;
> -  BOOLEAN                         FileHandlesOpen;
> -} EMU_SIMPLE_FILE_SYSTEM_PRIVATE;
> -
> -#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS(a) \
> -  CR (a, \
> -      EMU_SIMPLE_FILE_SYSTEM_PRIVATE, \
> -      SimpleFileSystem, \
> -      EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE \
> -      )
> -
> -
> -#define EMU_EFI_FILE_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'P', 'f', 'i')
> -
> -typedef struct {
> -  UINTN                           Signature;
> -  EMU_IO_THUNK_PROTOCOL           *Thunk;
> -  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;
> -  EFI_FILE_PROTOCOL               EfiFile;
> -  int                             fd;
> -  DIR                             *Dir;
> -  BOOLEAN                         IsRootDirectory;
> -  BOOLEAN                         IsDirectoryPath;
> -  BOOLEAN                         IsOpenedByRead;
> -  char                            *FileName;
> -  struct dirent                   *Dirent;
> -} EMU_EFI_FILE_PRIVATE;
> -
> -#define EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS(a) \
> -  CR (a, \
> -      EMU_EFI_FILE_PRIVATE, \
> -      EfiFile, \
> -      EMU_EFI_FILE_PRIVATE_SIGNATURE \
> -      )
> -
> -EFI_STATUS
> -PosixFileGetInfo (
> -  IN EFI_FILE_PROTOCOL        *This,
> -  IN EFI_GUID                 *InformationType,
> -  IN OUT UINTN                *BufferSize,
> -  OUT VOID                    *Buffer
> -  );
> -
> -EFI_STATUS
> -PosixFileSetInfo (
> -  IN EFI_FILE_PROTOCOL        *This,
> -  IN EFI_GUID                 *InformationType,
> -  IN UINTN                    BufferSize,
> -  IN VOID                     *Buffer
> -  );
> -
> -
> -EFI_FILE_PROTOCOL gPosixFileProtocol = {
> -  EFI_FILE_REVISION,
> -  GasketPosixFileOpen,
> -  GasketPosixFileCLose,
> -  GasketPosixFileDelete,
> -  GasketPosixFileRead,
> -  GasketPosixFileWrite,
> -  GasketPosixFileGetPossition,
> -  GasketPosixFileSetPossition,
> -  GasketPosixFileGetInfo,
> -  GasketPosixFileSetInfo,
> -  GasketPosixFileFlush
> -};
> -
> -EFI_SIMPLE_FILE_SYSTEM_PROTOCOL gPosixFileSystemProtocol = {
> -  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION,
> -  GasketPosixOpenVolume,
> -};
> -
> -
> -/**
> -  Open the root directory on a volume.
> -
> -  @param  This Protocol instance pointer.
> -  @param  Root Returns an Open file handle for the root directory
> -
> -  @retval EFI_SUCCESS          The device was opened.
> -  @retval EFI_UNSUPPORTED      This volume does not support the file system.
> -  @retval EFI_NO_MEDIA         The device has no media.
> -  @retval EFI_DEVICE_ERROR     The device reported an error.
> -  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> -  @retval EFI_ACCESS_DENIED    The service denied access to the file.
> -  @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of
> resources.
> -
> -**/
> -EFI_STATUS
> -PosixOpenVolume (
> -  IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL    *This,
> -  OUT EFI_FILE_PROTOCOL                 **Root
> -  )
> -{
> -  EFI_STATUS                        Status;
> -  EMU_SIMPLE_FILE_SYSTEM_PRIVATE    *Private;
> -  EMU_EFI_FILE_PRIVATE              *PrivateFile;
> -
> -  Private     = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (This);
> -
> -  Status = EFI_OUT_OF_RESOURCES;
> -  PrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));
> -  if (PrivateFile == NULL) {
> -    goto Done;
> -  }
> -
> -  PrivateFile->FileName = malloc (AsciiStrSize (Private->FilePath));
> -  if (PrivateFile->FileName == NULL) {
> -    goto Done;
> -  }
> -  AsciiStrCpy (PrivateFile->FileName, Private->FilePath);
> -
> -  PrivateFile->Signature            = EMU_EFI_FILE_PRIVATE_SIGNATURE;
> -  PrivateFile->Thunk                = Private->Thunk;
> -  PrivateFile->SimpleFileSystem     = This;
> -  PrivateFile->IsRootDirectory      = TRUE;
> -  PrivateFile->IsDirectoryPath      = TRUE;
> -  PrivateFile->IsOpenedByRead       = TRUE;
> -
> -  CopyMem (&PrivateFile->EfiFile, &gPosixFileProtocol, sizeof
> (EFI_FILE_PROTOCOL));
> -
> -  PrivateFile->fd                   = -1;
> -  PrivateFile->Dir                  = NULL;
> -  PrivateFile->Dirent               = NULL;
> -
> -  *Root = &PrivateFile->EfiFile;
> -
> -  PrivateFile->Dir = opendir (PrivateFile->FileName);
> -  if (PrivateFile->Dir == NULL) {
> -    Status = EFI_ACCESS_DENIED;
> -  } else {
> -    Status = EFI_SUCCESS;
> -  }
> -
> -Done:
> -  if (EFI_ERROR (Status)) {
> -    if (PrivateFile != NULL) {
> -      if (PrivateFile->FileName != NULL) {
> -        free (PrivateFile->FileName);
> -      }
> -
> -      free (PrivateFile);
> -    }
> -
> -    *Root = NULL;
> -  }
> -
> -  return Status;
> -}
> -
> -
> -EFI_STATUS
> -ErrnoToEfiStatus ()
> -{
> -  switch (errno) {
> -  case EACCES:
> -    return EFI_ACCESS_DENIED;
> -
> -  case EDQUOT:
> -  case ENOSPC:
> -    return EFI_VOLUME_FULL;
> -
> -  default:
> -    return EFI_DEVICE_ERROR;
> -  }
> -}
> -
> -VOID
> -CutPrefix (
> -  IN  CHAR8  *Str,
> -  IN  UINTN   Count
> -  )
> -{
> -  CHAR8  *Pointer;
> -
> -  if (AsciiStrLen (Str) < Count) {
> -    ASSERT (0);
> -  }
> -
> -  for (Pointer = Str; *(Pointer + Count); Pointer++) {
> -    *Pointer = *(Pointer + Count);
> -  }
> -
> -  *Pointer = *(Pointer + Count);
> -}
> -
> -
> -VOID
> -PosixSystemTimeToEfiTime (
> -  IN  time_t                SystemTime,
> -  OUT EFI_TIME              *Time
> -  )
> -{
> -  struct tm *tm;
> -
> -  tm           = gmtime (&SystemTime);
> -  Time->Year   = tm->tm_year;
> -  Time->Month  = tm->tm_mon + 1;
> -  Time->Day    = tm->tm_mday;
> -  Time->Hour   = tm->tm_hour;
> -  Time->Minute = tm->tm_min;
> -  Time->Second = tm->tm_sec;
> -  Time->Nanosecond = 0;
> -
> -  Time->TimeZone = timezone;
> -  Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0) | (tm-
> >tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
> -}
> -
> -
> -EFI_STATUS
> -UnixSimpleFileSystemFileInfo (
> -  EMU_EFI_FILE_PRIVATE            *PrivateFile,
> -  IN     CHAR8                    *FileName,
> -  IN OUT UINTN                    *BufferSize,
> -  OUT    VOID                     *Buffer
> -  )
> -{
> -  EFI_STATUS                  Status;
> -  UINTN                       Size;
> -  UINTN                       NameSize;
> -  UINTN                       ResultSize;
> -  EFI_FILE_INFO               *Info;
> -  CHAR8                       *RealFileName;
> -  CHAR8                       *TempPointer;
> -  CHAR16                      *BufferFileName;
> -  struct stat                 buf;
> -
> -  if (FileName != NULL) {
> -    RealFileName = FileName;
> -  } else if (PrivateFile->IsRootDirectory) {
> -    RealFileName = "";
> -  } else {
> -    RealFileName  = PrivateFile->FileName;
> -  }
> -
> -  TempPointer = RealFileName;
> -  while (*TempPointer) {
> -    if (*TempPointer == '/') {
> -      RealFileName = TempPointer + 1;
> -    }
> -
> -    TempPointer++;
> -  }
> -
> -  Size        = SIZE_OF_EFI_FILE_INFO;
> -  NameSize    = AsciiStrSize (RealFileName) * 2;
> -  ResultSize  = Size + NameSize;
> -
> -  if (*BufferSize < ResultSize) {
> -    *BufferSize = ResultSize;
> -    return EFI_BUFFER_TOO_SMALL;
> -  }
> -  if (stat (FileName == NULL ? PrivateFile->FileName : FileName, &buf) < 0) {
> -    return EFI_DEVICE_ERROR;
> -  }
> -
> -  Status  = EFI_SUCCESS;
> -
> -  Info    = Buffer;
> -  ZeroMem (Info, ResultSize);
> -
> -  Info->Size          = ResultSize;
> -  Info->FileSize      = buf.st_size;
> -  Info->PhysicalSize  = MultU64x32 (buf.st_blocks, buf.st_blksize);
> -
> -  PosixSystemTimeToEfiTime (buf.st_ctime, &Info->CreateTime);
> -  PosixSystemTimeToEfiTime (buf.st_atime, &Info->LastAccessTime);
> -  PosixSystemTimeToEfiTime (buf.st_mtime, &Info->ModificationTime);
> -
> -  if (!(buf.st_mode & S_IWUSR)) {
> -    Info->Attribute |= EFI_FILE_READ_ONLY;
> -  }
> -
> -  if (S_ISDIR(buf.st_mode)) {
> -    Info->Attribute |= EFI_FILE_DIRECTORY;
> -  }
> -
> -
> -  BufferFileName = (CHAR16 *)((CHAR8 *) Buffer + Size);
> -  while (*RealFileName) {
> -    *BufferFileName++ = *RealFileName++;
> -  }
> -  *BufferFileName = 0;
> -
> -  *BufferSize = ResultSize;
> -  return Status;
> -}
> -
> -BOOLEAN
> -IsZero (
> -  IN VOID   *Buffer,
> -  IN UINTN  Length
> -  )
> -{
> -  if (Buffer == NULL || Length == 0) {
> -    return FALSE;
> -  }
> -
> -  if (*(UINT8 *) Buffer != 0) {
> -    return FALSE;
> -  }
> -
> -  if (Length > 1) {
> -    if (!CompareMem (Buffer, (UINT8 *) Buffer + 1, Length - 1)) {
> -      return FALSE;
> -    }
> -  }
> -
> -  return TRUE;
> -}
> -
> -
> -
> -/**
> -  Opens a new file relative to the source file's location.
> -
> -  @param  This       The protocol instance pointer.
> -  @param  NewHandle  Returns File Handle for FileName.
> -  @param  FileName   Null terminated string. "\", ".", and ".." are supported.
> -  @param  OpenMode   Open mode for file.
> -  @param  Attributes Only used for EFI_FILE_MODE_CREATE.
> -
> -  @retval EFI_SUCCESS          The device was opened.
> -  @retval EFI_NOT_FOUND        The specified file could not be found on the
> device.
> -  @retval EFI_NO_MEDIA         The device has no media.
> -  @retval EFI_MEDIA_CHANGED    The media has changed.
> -  @retval EFI_DEVICE_ERROR     The device reported an error.
> -  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> -  @retval EFI_ACCESS_DENIED    The service denied access to the file.
> -  @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of
> resources.
> -  @retval EFI_VOLUME_FULL      The volume is full.
> -
> -**/
> -EFI_STATUS
> -PosixFileOpen (
> -  IN EFI_FILE_PROTOCOL        *This,
> -  OUT EFI_FILE_PROTOCOL       **NewHandle,
> -  IN CHAR16                   *FileName,
> -  IN UINT64                   OpenMode,
> -  IN UINT64                   Attributes
> -  )
> -{
> -  EFI_FILE_PROTOCOL                 *Root;
> -  EMU_EFI_FILE_PRIVATE              *PrivateFile;
> -  EMU_EFI_FILE_PRIVATE              *NewPrivateFile;
> -  EMU_SIMPLE_FILE_SYSTEM_PRIVATE    *PrivateRoot;
> -  EFI_STATUS                        Status;
> -  CHAR16                            *Src;
> -  char                              *Dst;
> -  CHAR8                             *RealFileName;
> -  char                              *ParseFileName;
> -  char                              *GuardPointer;
> -  CHAR8                             TempChar;
> -  UINTN                             Count;
> -  BOOLEAN                           TrailingDash;
> -  BOOLEAN                           LoopFinish;
> -  UINTN                             InfoSize;
> -  EFI_FILE_INFO                     *Info;
> -  struct stat                       finfo;
> -  int                               res;
> -
> -
> -  PrivateFile     = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> -  PrivateRoot     = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS
> (PrivateFile->SimpleFileSystem);
> -  NewPrivateFile  = NULL;
> -  Status          = EFI_OUT_OF_RESOURCES;
> -
> -  //
> -  // BUGBUG: assume an open of root
> -  // if current location, return current data
> -  //
> -  TrailingDash = FALSE;
> -  if ((StrCmp (FileName, L"\\") == 0) ||
> -      (StrCmp (FileName, L".") == 0 && PrivateFile->IsRootDirectory)) {
> -OpenRoot:
> -    Status          = PosixOpenVolume (PrivateFile->SimpleFileSystem, &Root);
> -    NewPrivateFile  = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (Root);
> -    goto Done;
> -  }
> -
> -  if (FileName[StrLen (FileName) - 1] == L'\\') {
> -    TrailingDash = TRUE;
> -    FileName[StrLen (FileName) - 1]  = 0;
> -  }
> -
> -  //
> -  // Attempt to open the file
> -  //
> -  NewPrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));
> -  if (NewPrivateFile == NULL) {
> -    goto Done;
> -  }
> -
> -  CopyMem (NewPrivateFile, PrivateFile, sizeof (EMU_EFI_FILE_PRIVATE));
> -
> -  NewPrivateFile->FileName = malloc (AsciiStrSize (PrivateFile->FileName) + 1
> + StrLen (FileName) + 1);
> -  if (NewPrivateFile->FileName == NULL) {
> -    goto Done;
> -  }
> -
> -  if (*FileName == L'\\') {
> -    AsciiStrCpy (NewPrivateFile->FileName, PrivateRoot->FilePath);
> -    // Skip first '\'.
> -    Src = FileName + 1;
> -  } else {
> -    AsciiStrCpy (NewPrivateFile->FileName, PrivateFile->FileName);
> -    Src = FileName;
> -  }
> -  Dst = NewPrivateFile->FileName + AsciiStrLen (NewPrivateFile->FileName);
> -  GuardPointer = NewPrivateFile->FileName + AsciiStrLen (PrivateRoot-
> >FilePath);
> -  *Dst++ = '/';
> -  // Convert unicode to ascii and '\' to '/'
> -  while (*Src) {
> -    if (*Src == '\\') {
> -      *Dst++ = '/';
> -    } else {
> -      *Dst++ = *Src;
> -    }
> -    Src++;
> -  }
> -  *Dst = 0;
> -
> -
> -  //
> -  // Get rid of . and .., except leading . or ..
> -  //
> -
> -  //
> -  // GuardPointer protect simplefilesystem root path not be destroyed
> -  //
> -
> -  LoopFinish    = FALSE;
> -  while (!LoopFinish) {
> -    LoopFinish = TRUE;
> -
> -    for (ParseFileName = GuardPointer; *ParseFileName; ParseFileName++) {
> -      if (*ParseFileName == '.' &&
> -          (*(ParseFileName + 1) == 0 || *(ParseFileName + 1) == '/') &&
> -          *(ParseFileName - 1) == '/'
> -          ) {
> -
> -        //
> -        // cut /.
> -        //
> -        CutPrefix (ParseFileName - 1, 2);
> -        LoopFinish = FALSE;
> -        break;
> -      }
> -
> -      if (*ParseFileName == '.' &&
> -          *(ParseFileName + 1) == '.' &&
> -          (*(ParseFileName + 2) == 0 || *(ParseFileName + 2) == '/') &&
> -          *(ParseFileName - 1) == '/'
> -          ) {
> -
> -        ParseFileName--;
> -        Count = 3;
> -
> -        while (ParseFileName != GuardPointer) {
> -          ParseFileName--;
> -          Count++;
> -          if (*ParseFileName == '/') {
> -            break;
> -          }
> -        }
> -
> -        //
> -        // cut /.. and its left directory
> -        //
> -        CutPrefix (ParseFileName, Count);
> -        LoopFinish = FALSE;
> -        break;
> -      }
> -    }
> -  }
> -
> -  if (AsciiStrCmp (NewPrivateFile->FileName, PrivateRoot->FilePath) == 0) {
> -    NewPrivateFile->IsRootDirectory = TRUE;
> -    free (NewPrivateFile->FileName);
> -    free (NewPrivateFile);
> -    goto OpenRoot;
> -  }
> -
> -  RealFileName = NewPrivateFile->FileName + AsciiStrLen(NewPrivateFile-
> >FileName) - 1;
> -  while (RealFileName > NewPrivateFile->FileName && *RealFileName != '/') {
> -    RealFileName--;
> -  }
> -
> -  TempChar            = *(RealFileName - 1);
> -  *(RealFileName - 1) = 0;
> -  *(RealFileName - 1) = TempChar;
> -
> -
> -  //
> -  // Test whether file or directory
> -  //
> -  NewPrivateFile->IsRootDirectory = FALSE;
> -  NewPrivateFile->fd = -1;
> -  NewPrivateFile->Dir = NULL;
> -  if (OpenMode & EFI_FILE_MODE_CREATE) {
> -    if (Attributes & EFI_FILE_DIRECTORY) {
> -      NewPrivateFile->IsDirectoryPath = TRUE;
> -    } else {
> -      NewPrivateFile->IsDirectoryPath = FALSE;
> -    }
> -  } else {
> -    res = stat (NewPrivateFile->FileName, &finfo);
> -    if (res == 0 && S_ISDIR(finfo.st_mode)) {
> -      NewPrivateFile->IsDirectoryPath = TRUE;
> -    } else {
> -      NewPrivateFile->IsDirectoryPath = FALSE;
> -    }
> -  }
> -
> -  if (OpenMode & EFI_FILE_MODE_WRITE) {
> -    NewPrivateFile->IsOpenedByRead = FALSE;
> -  } else {
> -    NewPrivateFile->IsOpenedByRead = TRUE;
> -  }
> -
> -  Status = EFI_SUCCESS;
> -
> -  //
> -  // deal with directory
> -  //
> -  if (NewPrivateFile->IsDirectoryPath) {
> -    if ((OpenMode & EFI_FILE_MODE_CREATE)) {
> -      //
> -      // Create a directory
> -      //
> -      if (mkdir (NewPrivateFile->FileName, 0777) != 0) {
> -        if (errno != EEXIST) {
> -          //free (TempFileName);
> -          Status = EFI_ACCESS_DENIED;
> -          goto Done;
> -        }
> -      }
> -    }
> -
> -    NewPrivateFile->Dir = opendir (NewPrivateFile->FileName);
> -    if (NewPrivateFile->Dir == NULL) {
> -      if (errno == EACCES) {
> -        Status = EFI_ACCESS_DENIED;
> -      } else {
> -        Status = EFI_NOT_FOUND;
> -      }
> -
> -      goto Done;
> -    }
> -
> -  } else {
> -    //
> -    // deal with file
> -    //
> -    NewPrivateFile->fd = open (
> -                          NewPrivateFile->FileName,
> -                          ((OpenMode & EFI_FILE_MODE_CREATE) ? O_CREAT : 0) |
> (NewPrivateFile->IsOpenedByRead ? O_RDONLY : O_RDWR),
> -                          0666
> -                          );
> -    if (NewPrivateFile->fd < 0) {
> -      if (errno == ENOENT) {
> -        Status = EFI_NOT_FOUND;
> -      } else {
> -        Status = EFI_ACCESS_DENIED;
> -      }
> -    }
> -  }
> -
> -  if ((OpenMode & EFI_FILE_MODE_CREATE) && Status == EFI_SUCCESS) {
> -    //
> -    // Set the attribute
> -    //
> -    InfoSize  = 0;
> -    Info      = NULL;
> -    Status    = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid,
> &InfoSize, Info);
> -    if (Status != EFI_BUFFER_TOO_SMALL) {
> -      Status = EFI_DEVICE_ERROR;
> -      goto Done;
> -    }
> -
> -    Info = malloc (InfoSize);
> -    if (Info == NULL) {
> -      goto Done;
> -    }
> -
> -    Status = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid,
> &InfoSize, Info);
> -    if (EFI_ERROR (Status)) {
> -      goto Done;
> -    }
> -
> -    Info->Attribute = Attributes;
> -    PosixFileSetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, InfoSize, Info);
> -
> -    free (Info);
> -  }
> -
> -Done: ;
> -  if (TrailingDash) {
> -    FileName[StrLen (FileName) + 1]  = 0;
> -    FileName[StrLen (FileName)]      = L'\\';
> -  }
> -
> -  if (EFI_ERROR (Status)) {
> -    if (NewPrivateFile) {
> -      if (NewPrivateFile->FileName) {
> -        free (NewPrivateFile->FileName);
> -      }
> -
> -      free (NewPrivateFile);
> -    }
> -  } else {
> -    *NewHandle = &NewPrivateFile->EfiFile;
> -  }
> -
> -  return Status;
> -}
> -
> -
> -
> -/**
> -  Close the file handle
> -
> -  @param  This          Protocol instance pointer.
> -
> -  @retval EFI_SUCCESS   The device was opened.
> -
> -**/
> -EFI_STATUS
> -PosixFileCLose (
> -  IN EFI_FILE_PROTOCOL  *This
> -  )
> -{
> -  EMU_EFI_FILE_PRIVATE *PrivateFile;
> -
> -  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> -
> -  if (PrivateFile->fd >= 0) {
> -    close (PrivateFile->fd);
> -  }
> -  if (PrivateFile->Dir != NULL) {
> -    closedir (PrivateFile->Dir);
> -  }
> -
> -  PrivateFile->fd = -1;
> -  PrivateFile->Dir = NULL;
> -
> -  if (PrivateFile->FileName) {
> -    free (PrivateFile->FileName);
> -  }
> -
> -  free (PrivateFile);
> -
> -  return EFI_SUCCESS;
> -}
> -
> -
> -/**
> -  Close and delete the file handle.
> -
> -  @param  This                     Protocol instance pointer.
> -
> -  @retval EFI_SUCCESS              The device was opened.
> -  @retval EFI_WARN_DELETE_FAILURE  The handle was closed but the file was
> not deleted.
> -
> -**/
> -EFI_STATUS
> -PosixFileDelete (
> -  IN EFI_FILE_PROTOCOL  *This
> -  )
> -{
> -  EFI_STATUS              Status;
> -  EMU_EFI_FILE_PRIVATE   *PrivateFile;
> -
> -  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> -  Status      = EFI_WARN_DELETE_FAILURE;
> -
> -  if (PrivateFile->IsDirectoryPath) {
> -    if (PrivateFile->Dir != NULL) {
> -      closedir (PrivateFile->Dir);
> -      PrivateFile->Dir = NULL;
> -    }
> -
> -    if (rmdir (PrivateFile->FileName) == 0) {
> -      Status = EFI_SUCCESS;
> -    }
> -  } else {
> -    close (PrivateFile->fd);
> -    PrivateFile->fd = -1;
> -
> -    if (!PrivateFile->IsOpenedByRead) {
> -      if (!unlink (PrivateFile->FileName)) {
> -        Status = EFI_SUCCESS;
> -      }
> -    }
> -  }
> -
> -  free (PrivateFile->FileName);
> -  free (PrivateFile);
> -
> -  return Status;
> -}
> -
> -
> -/**
> -  Read data from the file.
> -
> -  @param  This       Protocol instance pointer.
> -  @param  BufferSize On input size of buffer, on output amount of data in
> buffer.
> -  @param  Buffer     The buffer in which data is read.
> -
> -  @retval EFI_SUCCESS          Data was read.
> -  @retval EFI_NO_MEDIA         The device has no media.
> -  @retval EFI_DEVICE_ERROR     The device reported an error.
> -  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> -  @retval EFI_BUFFER_TO_SMALL  BufferSize is too small. BufferSize contains
> required size.
> -
> -**/
> -EFI_STATUS
> -PosixFileRead (
> -  IN EFI_FILE_PROTOCOL        *This,
> -  IN OUT UINTN                *BufferSize,
> -  OUT VOID                    *Buffer
> -  )
> -{
> -  EMU_EFI_FILE_PRIVATE    *PrivateFile;
> -  EFI_STATUS              Status;
> -  int                     Res;
> -  UINTN                   Size;
> -  UINTN                   NameSize;
> -  UINTN                   ResultSize;
> -  CHAR8                   *FullFileName;
> -
> -
> -  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> -
> -  if (!PrivateFile->IsDirectoryPath) {
> -    if (PrivateFile->fd < 0) {
> -      Status = EFI_DEVICE_ERROR;
> -      goto Done;
> -    }
> -
> -    Res = read (PrivateFile->fd, Buffer, *BufferSize);
> -    if (Res < 0) {
> -      Status = EFI_DEVICE_ERROR;
> -      goto Done;
> -    }
> -    *BufferSize = Res;
> -    Status = EFI_SUCCESS;
> -    goto Done;
> -  }
> -
> -  //
> -  // Read on a directory.
> -  //
> -  if (PrivateFile->Dir == NULL) {
> -    Status = EFI_DEVICE_ERROR;
> -    goto Done;
> -  }
> -
> -  if (PrivateFile->Dirent == NULL) {
> -    PrivateFile->Dirent = readdir (PrivateFile->Dir);
> -    if (PrivateFile->Dirent == NULL) {
> -      *BufferSize = 0;
> -      Status = EFI_SUCCESS;
> -      goto Done;
> -    }
> -  }
> -
> -  Size        = SIZE_OF_EFI_FILE_INFO;
> -  NameSize    = AsciiStrLen (PrivateFile->Dirent->d_name) + 1;
> -  ResultSize  = Size + 2 * NameSize;
> -
> -  if (*BufferSize < ResultSize) {
> -    *BufferSize = ResultSize;
> -    Status = EFI_BUFFER_TOO_SMALL;
> -    goto Done;
> -  }
> -  Status  = EFI_SUCCESS;
> -
> -  *BufferSize = ResultSize;
> -
> -  FullFileName = malloc (AsciiStrLen(PrivateFile->FileName) + 1 + NameSize);
> -  if (FullFileName == NULL) {
> -    Status = EFI_OUT_OF_RESOURCES;
> -    goto Done;
> -  }
> -
> -  AsciiStrCpy (FullFileName, PrivateFile->FileName);
> -  AsciiStrCat (FullFileName, "/");
> -  AsciiStrCat (FullFileName, PrivateFile->Dirent->d_name);
> -  Status = UnixSimpleFileSystemFileInfo (
> -            PrivateFile,
> -            FullFileName,
> -            BufferSize,
> -            Buffer
> -            );
> -  free (FullFileName);
> -
> -  PrivateFile->Dirent = NULL;
> -
> -Done:
> -  return Status;
> -}
> -
> -
> -
> -/**
> -  Write data to a file.
> -
> -  @param  This       Protocol instance pointer.
> -  @param  BufferSize On input size of buffer, on output amount of data in
> buffer.
> -  @param  Buffer     The buffer in which data to write.
> -
> -  @retval EFI_SUCCESS          Data was written.
> -  @retval EFI_UNSUPPORTED      Writes to Open directory are not supported.
> -  @retval EFI_NO_MEDIA         The device has no media.
> -  @retval EFI_DEVICE_ERROR     The device reported an error.
> -  @retval EFI_DEVICE_ERROR     An attempt was made to write to a deleted
> file.
> -  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> -  @retval EFI_WRITE_PROTECTED  The device is write protected.
> -  @retval EFI_ACCESS_DENIED    The file was open for read only.
> -  @retval EFI_VOLUME_FULL      The volume is full.
> -
> -**/
> -EFI_STATUS
> -PosixFileWrite (
> -  IN EFI_FILE_PROTOCOL        *This,
> -  IN OUT UINTN                *BufferSize,
> -  IN VOID                     *Buffer
> -  )
> -{
> -  EMU_EFI_FILE_PRIVATE  *PrivateFile;
> -  int                   Res;
> -
> -
> -  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> -
> -  if (PrivateFile->fd < 0) {
> -    return EFI_DEVICE_ERROR;
> -  }
> -
> -  if (PrivateFile->IsDirectoryPath) {
> -    return EFI_UNSUPPORTED;
> -  }
> -
> -  if (PrivateFile->IsOpenedByRead) {
> -    return EFI_ACCESS_DENIED;
> -  }
> -
> -  Res = write (PrivateFile->fd, Buffer, *BufferSize);
> -  if (Res == (UINTN)-1) {
> -    return ErrnoToEfiStatus ();
> -  }
> -
> -  *BufferSize = Res;
> -  return EFI_SUCCESS;
> -}
> -
> -
> -
> -/**
> -  Set a files current position
> -
> -  @param  This            Protocol instance pointer.
> -  @param  Position        Byte position from the start of the file.
> -
> -  @retval EFI_SUCCESS     Data was written.
> -  @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open.
> -
> -**/
> -EFI_STATUS
> -PosixFileSetPossition (
> -  IN EFI_FILE_PROTOCOL        *This,
> -  IN UINT64                   Position
> -  )
> -{
> -  EMU_EFI_FILE_PRIVATE    *PrivateFile;
> -  off_t                   Pos;
> -
> -  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> -
> -  if (PrivateFile->IsDirectoryPath) {
> -    if (Position != 0) {
> -      return EFI_UNSUPPORTED;
> -    }
> -
> -    if (PrivateFile->Dir == NULL) {
> -      return EFI_DEVICE_ERROR;
> -    }
> -    rewinddir (PrivateFile->Dir);
> -    return EFI_SUCCESS;
> -  } else {
> -    if (Position == (UINT64) -1) {
> -      Pos = lseek (PrivateFile->fd, 0, SEEK_END);
> -    } else {
> -      Pos = lseek (PrivateFile->fd, Position, SEEK_SET);
> -    }
> -    if (Pos == (off_t)-1) {
> -      return ErrnoToEfiStatus ();
> -    }
> -    return EFI_SUCCESS;
> -  }
> -}
> -
> -
> -
> -/**
> -  Get a file's current position
> -
> -  @param  This            Protocol instance pointer.
> -  @param  Position        Byte position from the start of the file.
> -
> -  @retval EFI_SUCCESS     Data was written.
> -  @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open..
> -
> -**/
> -EFI_STATUS
> -PosixFileGetPossition (
> -  IN EFI_FILE_PROTOCOL        *This,
> -  OUT UINT64                  *Position
> -  )
> -{
> -  EFI_STATUS            Status;
> -  EMU_EFI_FILE_PRIVATE  *PrivateFile;
> -
> -  PrivateFile   = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> -
> -  if (PrivateFile->IsDirectoryPath) {
> -    Status = EFI_UNSUPPORTED;
> -  } else {
> -    *Position = (UINT64)lseek (PrivateFile->fd, 0, SEEK_CUR);
> -    Status = (*Position == (UINT64) -1) ? ErrnoToEfiStatus () : EFI_SUCCESS;
> -  }
> -
> -  return Status;
> -}
> -
> -
> -/**
> -  Get information about a file.
> -
> -  @param  This            Protocol instance pointer.
> -  @param  InformationType Type of information to return in Buffer.
> -  @param  BufferSize      On input size of buffer, on output amount of data in
> buffer.
> -  @param  Buffer          The buffer to return data.
> -
> -  @retval EFI_SUCCESS          Data was returned.
> -  @retval EFI_UNSUPPORTED      InformationType is not supported.
> -  @retval EFI_NO_MEDIA         The device has no media.
> -  @retval EFI_DEVICE_ERROR     The device reported an error.
> -  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> -  @retval EFI_WRITE_PROTECTED  The device is write protected.
> -  @retval EFI_ACCESS_DENIED    The file was open for read only.
> -  @retval EFI_BUFFER_TOO_SMALL Buffer was too small; required size
> returned in BufferSize.
> -
> -**/
> -EFI_STATUS
> -PosixFileGetInfo (
> -  IN EFI_FILE_PROTOCOL        *This,
> -  IN EFI_GUID                 *InformationType,
> -  IN OUT UINTN                *BufferSize,
> -  OUT VOID                    *Buffer
> -  )
> -{
> -  EFI_STATUS                        Status;
> -  EMU_EFI_FILE_PRIVATE              *PrivateFile;
> -  EFI_FILE_SYSTEM_INFO              *FileSystemInfoBuffer;
> -  int                               UnixStatus;
> -  EMU_SIMPLE_FILE_SYSTEM_PRIVATE    *PrivateRoot;
> -  struct statfs                     buf;
> -
> -  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> -  PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS
> (PrivateFile->SimpleFileSystem);
> -
> -  Status = EFI_SUCCESS;
> -  if (CompareGuid (InformationType, &gEfiFileInfoGuid)) {
> -    Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, BufferSize, Buffer);
> -  } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
> -    if (*BufferSize < SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel)) {
> -      *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel);
> -      return EFI_BUFFER_TOO_SMALL;
> -    }
> -
> -    UnixStatus = statfs (PrivateFile->FileName, &buf);
> -    if (UnixStatus < 0) {
> -      return EFI_DEVICE_ERROR;
> -    }
> -
> -    FileSystemInfoBuffer            = (EFI_FILE_SYSTEM_INFO *) Buffer;
> -    FileSystemInfoBuffer->Size      = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize
> (PrivateRoot->VolumeLabel);
> -    FileSystemInfoBuffer->ReadOnly  = FALSE;
> -
> -    //
> -    // Succeeded
> -    //
> -    FileSystemInfoBuffer->VolumeSize  = MultU64x32 (buf.f_blocks, buf.f_bsize);
> -    FileSystemInfoBuffer->FreeSpace   = MultU64x32 (buf.f_bavail, buf.f_bsize);
> -    FileSystemInfoBuffer->BlockSize   = buf.f_bsize;
> -
> -
> -    StrCpy ((CHAR16 *) FileSystemInfoBuffer->VolumeLabel, PrivateRoot-
> >VolumeLabel);
> -    *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel);
> -
> -  } else if (CompareGuid (InformationType,
> &gEfiFileSystemVolumeLabelInfoIdGuid)) {
> -    if (*BufferSize < StrSize (PrivateRoot->VolumeLabel)) {
> -      *BufferSize = StrSize (PrivateRoot->VolumeLabel);
> -      return EFI_BUFFER_TOO_SMALL;
> -    }
> -
> -    StrCpy ((CHAR16 *) Buffer, PrivateRoot->VolumeLabel);
> -    *BufferSize = StrSize (PrivateRoot->VolumeLabel);
> -
> -  }
> -
> -  return Status;
> -}
> -
> -
> -/**
> -  Set information about a file
> -
> -  @param  File            Protocol instance pointer.
> -  @param  InformationType Type of information in Buffer.
> -  @param  BufferSize      Size of buffer.
> -  @param  Buffer          The data to write.
> -
> -  @retval EFI_SUCCESS          Data was returned.
> -  @retval EFI_UNSUPPORTED      InformationType is not supported.
> -  @retval EFI_NO_MEDIA         The device has no media.
> -  @retval EFI_DEVICE_ERROR     The device reported an error.
> -  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> -  @retval EFI_WRITE_PROTECTED  The device is write protected.
> -  @retval EFI_ACCESS_DENIED    The file was open for read only.
> -
> -**/
> -EFI_STATUS
> -PosixFileSetInfo (
> -  IN EFI_FILE_PROTOCOL        *This,
> -  IN EFI_GUID                 *InformationType,
> -  IN UINTN                    BufferSize,
> -  IN VOID                     *Buffer
> -  )
> -{
> -  EMU_SIMPLE_FILE_SYSTEM_PRIVATE    *PrivateRoot;
> -  EMU_EFI_FILE_PRIVATE              *PrivateFile;
> -  EFI_FILE_INFO                     *OldFileInfo;
> -  EFI_FILE_INFO                     *NewFileInfo;
> -  EFI_STATUS                        Status;
> -  UINTN                             OldInfoSize;
> -  mode_t                            NewAttr;
> -  struct stat                       OldAttr;
> -  CHAR8                             *OldFileName;
> -  CHAR8                             *NewFileName;
> -  CHAR8                             *CharPointer;
> -  BOOLEAN                           AttrChangeFlag;
> -  BOOLEAN                           NameChangeFlag;
> -  BOOLEAN                           SizeChangeFlag;
> -  BOOLEAN                           TimeChangeFlag;
> -  struct tm                         NewLastAccessSystemTime;
> -  struct tm                         NewLastWriteSystemTime;
> -  EFI_FILE_SYSTEM_INFO              *NewFileSystemInfo;
> -  CHAR8                             *AsciiFilePtr;
> -  CHAR16                            *UnicodeFilePtr;
> -  int                               UnixStatus;
> -  struct utimbuf                    Utime;
> -
> -
> -  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> -  PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS
> (PrivateFile->SimpleFileSystem);
> -  errno       = 0;
> -  Status      = EFI_UNSUPPORTED;
> -  OldFileInfo = NewFileInfo = NULL;
> -  OldFileName = NewFileName = NULL;
> -  AttrChangeFlag = NameChangeFlag = SizeChangeFlag = TimeChangeFlag =
> FALSE;
> -
> -  //
> -  // Set file system information.
> -  //
> -  if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
> -    if (BufferSize < (SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel))) {
> -      Status = EFI_BAD_BUFFER_SIZE;
> -      goto Done;
> -    }
> -
> -    NewFileSystemInfo = (EFI_FILE_SYSTEM_INFO *) Buffer;
> -
> -    free (PrivateRoot->VolumeLabel);
> -
> -    PrivateRoot->VolumeLabel = malloc (StrSize (NewFileSystemInfo-
> >VolumeLabel));
> -    if (PrivateRoot->VolumeLabel == NULL) {
> -      goto Done;
> -    }
> -
> -    StrCpy (PrivateRoot->VolumeLabel, NewFileSystemInfo->VolumeLabel);
> -
> -    Status = EFI_SUCCESS;
> -    goto Done;
> -  }
> -
> -  //
> -  // Set volume label information.
> -  //
> -  if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid))
> {
> -    if (BufferSize < StrSize (PrivateRoot->VolumeLabel)) {
> -      Status = EFI_BAD_BUFFER_SIZE;
> -      goto Done;
> -    }
> -
> -    StrCpy (PrivateRoot->VolumeLabel, (CHAR16 *) Buffer);
> -
> -    Status = EFI_SUCCESS;
> -    goto Done;
> -  }
> -
> -  if (!CompareGuid (InformationType, &gEfiFileInfoGuid)) {
> -    Status = EFI_UNSUPPORTED;
> -    goto Done;
> -  }
> -
> -  if (BufferSize < SIZE_OF_EFI_FILE_INFO) {
> -    Status = EFI_BAD_BUFFER_SIZE;
> -    goto Done;
> -  }
> -
> -  //
> -  // Set file/directory information.
> -  //
> -
> -  //
> -  // Check for invalid set file information parameters.
> -  //
> -  NewFileInfo = (EFI_FILE_INFO *) Buffer;
> -  if (NewFileInfo->Size <= sizeof (EFI_FILE_INFO) ||
> -      (NewFileInfo->Attribute &~(EFI_FILE_VALID_ATTR)) ||
> -      (sizeof (UINTN) == 4 && NewFileInfo->Size > 0xFFFFFFFF)
> -      ) {
> -    Status = EFI_INVALID_PARAMETER;
> -    goto Done;
> -  }
> -
> -  //
> -  // Get current file information so we can determine what kind
> -  // of change request this is.
> -  //
> -  OldInfoSize = 0;
> -  Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize, NULL);
> -  if (Status != EFI_BUFFER_TOO_SMALL) {
> -    Status = EFI_DEVICE_ERROR;
> -    goto Done;
> -  }
> -
> -  OldFileInfo = malloc (OldInfoSize);
> -  if (OldFileInfo == NULL) {
> -    goto Done;
> -  }
> -
> -  Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize,
> OldFileInfo);
> -  if (EFI_ERROR (Status)) {
> -    goto Done;
> -  }
> -
> -  OldFileName = malloc (AsciiStrSize (PrivateFile->FileName));
> -  if (OldFileInfo == NULL) {
> -    goto Done;
> -  }
> -
> -  AsciiStrCpy (OldFileName, PrivateFile->FileName);
> -
> -  //
> -  // Make full pathname from new filename and rootpath.
> -  //
> -  if (NewFileInfo->FileName[0] == '\\') {
> -    NewFileName = malloc (AsciiStrLen (PrivateRoot->FilePath) + 1 + StrLen
> (NewFileInfo->FileName) + 1);
> -    if (NewFileName == NULL) {
> -      goto Done;
> -    }
> -
> -    AsciiStrCpy (NewFileName, PrivateRoot->FilePath);
> -    AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);
> -    UnicodeFilePtr = NewFileInfo->FileName + 1;
> -    *AsciiFilePtr++ ='/';
> -  } else {
> -    NewFileName = malloc (AsciiStrLen (PrivateFile->FileName) + 2 + StrLen
> (NewFileInfo->FileName) + 1);
> -    if (NewFileName == NULL) {
> -      goto Done;
> -    }
> -
> -    AsciiStrCpy (NewFileName, PrivateRoot->FilePath);
> -    AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);
> -    if ((AsciiFilePtr[-1] != '/') && (NewFileInfo->FileName[0] != '/')) {
> -      // make sure there is a / between Root FilePath and NewFileInfo Filename
> -      AsciiFilePtr[0] = '/';
> -      AsciiFilePtr[1] = '\0';
> -      AsciiFilePtr++;
> -    }
> -    UnicodeFilePtr = NewFileInfo->FileName;
> -  }
> -  // Convert to ascii.
> -  while (*UnicodeFilePtr) {
> -    *AsciiFilePtr++ = *UnicodeFilePtr++;
> -  }
> -  *AsciiFilePtr = 0;
> -
> -  //
> -  // Is there an attribute change request?
> -  //
> -  if (NewFileInfo->Attribute != OldFileInfo->Attribute) {
> -    if ((NewFileInfo->Attribute & EFI_FILE_DIRECTORY) != (OldFileInfo-
> >Attribute & EFI_FILE_DIRECTORY)) {
> -      Status = EFI_INVALID_PARAMETER;
> -      goto Done;
> -    }
> -
> -    AttrChangeFlag = TRUE;
> -  }
> -
> -  //
> -  // Is there a name change request?
> -  // bugbug: - Should really use EFI_UNICODE_COLLATION_PROTOCOL
> -  //
> -  if (StrCmp (NewFileInfo->FileName, OldFileInfo->FileName)) {
> -    NameChangeFlag = TRUE;
> -  }
> -
> -  //
> -  // Is there a size change request?
> -  //
> -  if (NewFileInfo->FileSize != OldFileInfo->FileSize) {
> -    SizeChangeFlag = TRUE;
> -  }
> -
> -  //
> -  // Is there a time stamp change request?
> -  //
> -  if (!IsZero (&NewFileInfo->CreateTime, sizeof (EFI_TIME)) &&
> -      CompareMem (&NewFileInfo->CreateTime, &OldFileInfo->CreateTime,
> sizeof (EFI_TIME))
> -      ) {
> -    TimeChangeFlag = TRUE;
> -  } else if (!IsZero (&NewFileInfo->LastAccessTime, sizeof (EFI_TIME)) &&
> -             CompareMem (&NewFileInfo->LastAccessTime, &OldFileInfo-
> >LastAccessTime, sizeof (EFI_TIME))
> -             ) {
> -    TimeChangeFlag = TRUE;
> -  } else if (!IsZero (&NewFileInfo->ModificationTime, sizeof (EFI_TIME)) &&
> -             CompareMem (&NewFileInfo->ModificationTime, &OldFileInfo-
> >ModificationTime, sizeof (EFI_TIME))
> -             ) {
> -    TimeChangeFlag = TRUE;
> -  }
> -
> -  //
> -  // All done if there are no change requests being made.
> -  //
> -  if (!(AttrChangeFlag || NameChangeFlag || SizeChangeFlag ||
> TimeChangeFlag)) {
> -    Status = EFI_SUCCESS;
> -    goto Done;
> -  }
> -
> -  //
> -  // Set file or directory information.
> -  //
> -  if (stat (OldFileName, &OldAttr) != 0) {
> -    Status = ErrnoToEfiStatus ();
> -    goto Done;
> -  }
> -
> -  //
> -  // Name change.
> -  //
> -  if (NameChangeFlag) {
> -    //
> -    // Close the handles first
> -    //
> -    if (PrivateFile->IsOpenedByRead) {
> -      Status = EFI_ACCESS_DENIED;
> -      goto Done;
> -    }
> -
> -    for (CharPointer = NewFileName; *CharPointer != 0 && *CharPointer != L'/';
> CharPointer++) {
> -    }
> -
> -    if (*CharPointer != 0) {
> -      Status = EFI_ACCESS_DENIED;
> -      goto Done;
> -    }
> -
> -    UnixStatus = rename (OldFileName, NewFileName);
> -    if (UnixStatus == 0) {
> -      //
> -      // modify file name
> -      //
> -      free (PrivateFile->FileName);
> -
> -      PrivateFile->FileName = malloc (AsciiStrSize (NewFileName));
> -      if (PrivateFile->FileName == NULL) {
> -        goto Done;
> -      }
> -
> -      AsciiStrCpy (PrivateFile->FileName, NewFileName);
> -    } else {
> -      Status    = EFI_DEVICE_ERROR;
> -      goto Done;
> -    }
> -  }
> -
> -  //
> -  //  Size change
> -  //
> -  if (SizeChangeFlag) {
> -    if (PrivateFile->IsDirectoryPath) {
> -      Status = EFI_UNSUPPORTED;
> -      goto Done;
> -    }
> -
> -    if (PrivateFile->IsOpenedByRead || OldFileInfo->Attribute &
> EFI_FILE_READ_ONLY) {
> -      Status = EFI_ACCESS_DENIED;
> -      goto Done;
> -    }
> -
> -    if (ftruncate (PrivateFile->fd, NewFileInfo->FileSize) != 0) {
> -      Status = ErrnoToEfiStatus ();
> -      goto Done;
> -    }
> -
> -  }
> -
> -  //
> -  // Time change
> -  //
> -  if (TimeChangeFlag) {
> -    NewLastAccessSystemTime.tm_year    = NewFileInfo->LastAccessTime.Year;
> -    NewLastAccessSystemTime.tm_mon     = NewFileInfo-
> >LastAccessTime.Month;
> -    NewLastAccessSystemTime.tm_mday    = NewFileInfo->LastAccessTime.Day;
> -    NewLastAccessSystemTime.tm_hour    = NewFileInfo->LastAccessTime.Hour;
> -    NewLastAccessSystemTime.tm_min     = NewFileInfo-
> >LastAccessTime.Minute;
> -    NewLastAccessSystemTime.tm_sec     = NewFileInfo-
> >LastAccessTime.Second;
> -    NewLastAccessSystemTime.tm_isdst   = 0;
> -
> -    Utime.actime = mktime (&NewLastAccessSystemTime);
> -
> -    NewLastWriteSystemTime.tm_year    = NewFileInfo->ModificationTime.Year;
> -    NewLastWriteSystemTime.tm_mon     = NewFileInfo-
> >ModificationTime.Month;
> -    NewLastWriteSystemTime.tm_mday    = NewFileInfo-
> >ModificationTime.Day;
> -    NewLastWriteSystemTime.tm_hour    = NewFileInfo-
> >ModificationTime.Hour;
> -    NewLastWriteSystemTime.tm_min     = NewFileInfo-
> >ModificationTime.Minute;
> -    NewLastWriteSystemTime.tm_sec     = NewFileInfo-
> >ModificationTime.Second;
> -    NewLastWriteSystemTime.tm_isdst   = 0;
> -
> -    Utime.modtime = mktime (&NewLastWriteSystemTime);
> -
> -    if (Utime.actime == (time_t)-1 || Utime.modtime == (time_t)-1) {
> -      goto Done;
> -    }
> -
> -    if (utime (PrivateFile->FileName, &Utime) == -1) {
> -      Status = ErrnoToEfiStatus ();
> -      goto Done;
> -    }
> -  }
> -
> -  //
> -  // No matter about AttrChangeFlag, Attribute must be set.
> -  // Because operation before may cause attribute change.
> -  //
> -  NewAttr = OldAttr.st_mode;
> -
> -  if (NewFileInfo->Attribute & EFI_FILE_READ_ONLY) {
> -    NewAttr &= ~(S_IRUSR | S_IRGRP | S_IROTH);
> -  } else {
> -    NewAttr |= S_IRUSR;
> -  }
> -
> -  if (chmod (NewFileName, NewAttr) != 0) {
> -    Status = ErrnoToEfiStatus ();
> -  }
> -
> -Done:
> -  if (OldFileInfo != NULL) {
> -    free (OldFileInfo);
> -  }
> -
> -  if (OldFileName != NULL) {
> -    free (OldFileName);
> -  }
> -
> -  if (NewFileName != NULL) {
> -    free (NewFileName);
> -  }
> -
> -  return Status;
> -}
> -
> -
> -/**
> -  Flush data back for the file handle.
> -
> -  @param  This Protocol instance pointer.
> -
> -  @retval EFI_SUCCESS          Data was written.
> -  @retval EFI_UNSUPPORTED      Writes to Open directory are not supported.
> -  @retval EFI_NO_MEDIA         The device has no media.
> -  @retval EFI_DEVICE_ERROR     The device reported an error.
> -  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> -  @retval EFI_WRITE_PROTECTED  The device is write protected.
> -  @retval EFI_ACCESS_DENIED    The file was open for read only.
> -  @retval EFI_VOLUME_FULL      The volume is full.
> -
> -**/
> -EFI_STATUS
> -PosixFileFlush (
> -  IN EFI_FILE_PROTOCOL  *This
> -  )
> -{
> -  EMU_EFI_FILE_PRIVATE     *PrivateFile;
> -
> -
> -  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> -
> -  if (PrivateFile->IsDirectoryPath) {
> -    return EFI_UNSUPPORTED;
> -  }
> -
> -  if (PrivateFile->IsOpenedByRead) {
> -    return EFI_ACCESS_DENIED;
> -  }
> -
> -  if (PrivateFile->fd < 0) {
> -    return EFI_DEVICE_ERROR;
> -  }
> -
> -  if (fsync (PrivateFile->fd) != 0) {
> -    return ErrnoToEfiStatus ();
> -  }
> -
> -  return EFI_SUCCESS;
> -}
> -
> -
> -
> -EFI_STATUS
> -PosixFileSystmeThunkOpen (
> -  IN  EMU_IO_THUNK_PROTOCOL   *This
> -  )
> -{
> -  EMU_SIMPLE_FILE_SYSTEM_PRIVATE  *Private;
> -  UINTN                           i;
> -
> -  if (This->Private != NULL) {
> -    return EFI_ALREADY_STARTED;
> -  }
> -
> -  if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {
> -    return EFI_UNSUPPORTED;
> -  }
> -
> -  Private = malloc (sizeof (EMU_SIMPLE_FILE_SYSTEM_PRIVATE));
> -  if (Private == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  Private->FilePath = malloc (StrLen (This->ConfigString) + 1);
> -  if (Private->FilePath == NULL) {
> -    free (Private);
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  // Convert Unicode to Ascii
> -  for (i = 0; This->ConfigString[i] != 0; i++) {
> -    Private->FilePath[i] = This->ConfigString[i];
> -  }
> -  Private->FilePath[i] = 0;
> -
> -
> -  Private->VolumeLabel = malloc (StrSize (L"EFI_EMULATED"));
> -  if (Private->VolumeLabel == NULL) {
> -    free (Private->FilePath);
> -    free (Private);
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -  StrCpy (Private->VolumeLabel, L"EFI_EMULATED");
> -
> -  Private->Signature = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE;
> -  Private->Thunk     = This;
> -  CopyMem (&Private->SimpleFileSystem, &gPosixFileSystemProtocol, sizeof
> (Private->SimpleFileSystem));
> -  Private->FileHandlesOpen = FALSE;
> -
> -  This->Interface = &Private->SimpleFileSystem;
> -  This->Private   = Private;
> -  return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -PosixFileSystmeThunkClose (
> -  IN  EMU_IO_THUNK_PROTOCOL   *This
> -  )
> -{
> -  EMU_SIMPLE_FILE_SYSTEM_PRIVATE  *Private;
> -
> -  if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {
> -    return EFI_UNSUPPORTED;
> -  }
> -
> -  Private = This->Private;
> -
> -  if (Private->FileHandlesOpen) {
> -    //
> -    // Close only supported if all the EFI_FILE_HANDLEs have been closed.
> -    //
> -    return EFI_NOT_READY;
> -  }
> -
> -  if (This->Private != NULL) {
> -    if (Private->VolumeLabel != NULL) {
> -      free (Private->VolumeLabel);
> -    }
> -    free (This->Private);
> -    This->Private = NULL;
> -  }
> -
> -  return EFI_SUCCESS;
> -}
> -
> -
> -EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo = {
> -  &gEfiSimpleFileSystemProtocolGuid,
> -  NULL,
> -  NULL,
> -  0,
> -  GasketPosixFileSystmeThunkOpen,
> -  GasketPosixFileSystmeThunkClose,
> -  NULL
> -};
> -
> -
> +/*++ @file
> + POSIX Pthreads to emulate APs and implement threads
> +
> +Copyright (c) 2011, Apple Inc. 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.
> +
> +
> +**/
> +
> +#include "Host.h"
> +
> +
> +#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE SIGNATURE_32 ('E',
> 'P', 'f', 's')
> +
> +typedef struct {
> +  UINTN                           Signature;
> +  EMU_IO_THUNK_PROTOCOL           *Thunk;
> +  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL SimpleFileSystem;
> +  CHAR8                           *FilePath;
> +  CHAR16                          *VolumeLabel;
> +  BOOLEAN                         FileHandlesOpen;
> +} EMU_SIMPLE_FILE_SYSTEM_PRIVATE;
> +
> +#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS(a) \
> +  CR (a, \
> +      EMU_SIMPLE_FILE_SYSTEM_PRIVATE, \
> +      SimpleFileSystem, \
> +      EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE \
> +      )
> +
> +
> +#define EMU_EFI_FILE_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'P', 'f', 'i')
> +
> +typedef struct {
> +  UINTN                           Signature;
> +  EMU_IO_THUNK_PROTOCOL           *Thunk;
> +  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;
> +  EFI_FILE_PROTOCOL               EfiFile;
> +  int                             fd;
> +  DIR                             *Dir;
> +  BOOLEAN                         IsRootDirectory;
> +  BOOLEAN                         IsDirectoryPath;
> +  BOOLEAN                         IsOpenedByRead;
> +  char                            *FileName;
> +  struct dirent                   *Dirent;
> +} EMU_EFI_FILE_PRIVATE;
> +
> +#define EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS(a) \
> +  CR (a, \
> +      EMU_EFI_FILE_PRIVATE, \
> +      EfiFile, \
> +      EMU_EFI_FILE_PRIVATE_SIGNATURE \
> +      )
> +
> +EFI_STATUS
> +PosixFileGetInfo (
> +  IN EFI_FILE_PROTOCOL        *This,
> +  IN EFI_GUID                 *InformationType,
> +  IN OUT UINTN                *BufferSize,
> +  OUT VOID                    *Buffer
> +  );
> +
> +EFI_STATUS
> +PosixFileSetInfo (
> +  IN EFI_FILE_PROTOCOL        *This,
> +  IN EFI_GUID                 *InformationType,
> +  IN UINTN                    BufferSize,
> +  IN VOID                     *Buffer
> +  );
> +
> +
> +EFI_FILE_PROTOCOL gPosixFileProtocol = {
> +  EFI_FILE_REVISION,
> +  GasketPosixFileOpen,
> +  GasketPosixFileCLose,
> +  GasketPosixFileDelete,
> +  GasketPosixFileRead,
> +  GasketPosixFileWrite,
> +  GasketPosixFileGetPossition,
> +  GasketPosixFileSetPossition,
> +  GasketPosixFileGetInfo,
> +  GasketPosixFileSetInfo,
> +  GasketPosixFileFlush
> +};
> +
> +EFI_SIMPLE_FILE_SYSTEM_PROTOCOL gPosixFileSystemProtocol = {
> +  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION,
> +  GasketPosixOpenVolume,
> +};
> +
> +
> +/**
> +  Open the root directory on a volume.
> +
> +  @param  This Protocol instance pointer.
> +  @param  Root Returns an Open file handle for the root directory
> +
> +  @retval EFI_SUCCESS          The device was opened.
> +  @retval EFI_UNSUPPORTED      This volume does not support the file system.
> +  @retval EFI_NO_MEDIA         The device has no media.
> +  @retval EFI_DEVICE_ERROR     The device reported an error.
> +  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> +  @retval EFI_ACCESS_DENIED    The service denied access to the file.
> +  @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of
> resources.
> +
> +**/
> +EFI_STATUS
> +PosixOpenVolume (
> +  IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL    *This,
> +  OUT EFI_FILE_PROTOCOL                 **Root
> +  )
> +{
> +  EFI_STATUS                        Status;
> +  EMU_SIMPLE_FILE_SYSTEM_PRIVATE    *Private;
> +  EMU_EFI_FILE_PRIVATE              *PrivateFile;
> +
> +  Private     = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (This);
> +
> +  Status = EFI_OUT_OF_RESOURCES;
> +  PrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));
> +  if (PrivateFile == NULL) {
> +    goto Done;
> +  }
> +
> +  PrivateFile->FileName = malloc (AsciiStrSize (Private->FilePath));
> +  if (PrivateFile->FileName == NULL) {
> +    goto Done;
> +  }
> +  AsciiStrCpy (PrivateFile->FileName, Private->FilePath);
> +
> +  PrivateFile->Signature            = EMU_EFI_FILE_PRIVATE_SIGNATURE;
> +  PrivateFile->Thunk                = Private->Thunk;
> +  PrivateFile->SimpleFileSystem     = This;
> +  PrivateFile->IsRootDirectory      = TRUE;
> +  PrivateFile->IsDirectoryPath      = TRUE;
> +  PrivateFile->IsOpenedByRead       = TRUE;
> +
> +  CopyMem (&PrivateFile->EfiFile, &gPosixFileProtocol, sizeof
> (EFI_FILE_PROTOCOL));
> +
> +  PrivateFile->fd                   = -1;
> +  PrivateFile->Dir                  = NULL;
> +  PrivateFile->Dirent               = NULL;
> +
> +  *Root = &PrivateFile->EfiFile;
> +
> +  PrivateFile->Dir = opendir (PrivateFile->FileName);
> +  if (PrivateFile->Dir == NULL) {
> +    Status = EFI_ACCESS_DENIED;
> +  } else {
> +    Status = EFI_SUCCESS;
> +  }
> +
> +Done:
> +  if (EFI_ERROR (Status)) {
> +    if (PrivateFile != NULL) {
> +      if (PrivateFile->FileName != NULL) {
> +        free (PrivateFile->FileName);
> +      }
> +
> +      free (PrivateFile);
> +    }
> +
> +    *Root = NULL;
> +  }
> +
> +  return Status;
> +}
> +
> +
> +EFI_STATUS
> +ErrnoToEfiStatus ()
> +{
> +  switch (errno) {
> +  case EACCES:
> +    return EFI_ACCESS_DENIED;
> +
> +  case EDQUOT:
> +  case ENOSPC:
> +    return EFI_VOLUME_FULL;
> +
> +  default:
> +    return EFI_DEVICE_ERROR;
> +  }
> +}
> +
> +VOID
> +CutPrefix (
> +  IN  CHAR8  *Str,
> +  IN  UINTN   Count
> +  )
> +{
> +  CHAR8  *Pointer;
> +
> +  if (AsciiStrLen (Str) < Count) {
> +    ASSERT (0);
> +  }
> +
> +  for (Pointer = Str; *(Pointer + Count); Pointer++) {
> +    *Pointer = *(Pointer + Count);
> +  }
> +
> +  *Pointer = *(Pointer + Count);
> +}
> +
> +
> +VOID
> +PosixSystemTimeToEfiTime (
> +  IN  time_t                SystemTime,
> +  OUT EFI_TIME              *Time
> +  )
> +{
> +  struct tm *tm;
> +
> +  tm           = gmtime (&SystemTime);
> +  Time->Year   = tm->tm_year;
> +  Time->Month  = tm->tm_mon + 1;
> +  Time->Day    = tm->tm_mday;
> +  Time->Hour   = tm->tm_hour;
> +  Time->Minute = tm->tm_min;
> +  Time->Second = tm->tm_sec;
> +  Time->Nanosecond = 0;
> +
> +  Time->TimeZone = timezone;
> +  Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0) | (tm-
> >tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
> +}
> +
> +
> +EFI_STATUS
> +UnixSimpleFileSystemFileInfo (
> +  EMU_EFI_FILE_PRIVATE            *PrivateFile,
> +  IN     CHAR8                    *FileName,
> +  IN OUT UINTN                    *BufferSize,
> +  OUT    VOID                     *Buffer
> +  )
> +{
> +  EFI_STATUS                  Status;
> +  UINTN                       Size;
> +  UINTN                       NameSize;
> +  UINTN                       ResultSize;
> +  EFI_FILE_INFO               *Info;
> +  CHAR8                       *RealFileName;
> +  CHAR8                       *TempPointer;
> +  CHAR16                      *BufferFileName;
> +  struct stat                 buf;
> +
> +  if (FileName != NULL) {
> +    RealFileName = FileName;
> +  } else if (PrivateFile->IsRootDirectory) {
> +    RealFileName = "";
> +  } else {
> +    RealFileName  = PrivateFile->FileName;
> +  }
> +
> +  TempPointer = RealFileName;
> +  while (*TempPointer) {
> +    if (*TempPointer == '/') {
> +      RealFileName = TempPointer + 1;
> +    }
> +
> +    TempPointer++;
> +  }
> +
> +  Size        = SIZE_OF_EFI_FILE_INFO;
> +  NameSize    = AsciiStrSize (RealFileName) * 2;
> +  ResultSize  = Size + NameSize;
> +
> +  if (*BufferSize < ResultSize) {
> +    *BufferSize = ResultSize;
> +    return EFI_BUFFER_TOO_SMALL;
> +  }
> +  if (stat (FileName == NULL ? PrivateFile->FileName : FileName, &buf) < 0) {
> +    return EFI_DEVICE_ERROR;
> +  }
> +
> +  Status  = EFI_SUCCESS;
> +
> +  Info    = Buffer;
> +  ZeroMem (Info, ResultSize);
> +
> +  Info->Size          = ResultSize;
> +  Info->FileSize      = buf.st_size;
> +  Info->PhysicalSize  = MultU64x32 (buf.st_blocks, buf.st_blksize);
> +
> +  PosixSystemTimeToEfiTime (buf.st_ctime, &Info->CreateTime);
> +  PosixSystemTimeToEfiTime (buf.st_atime, &Info->LastAccessTime);
> +  PosixSystemTimeToEfiTime (buf.st_mtime, &Info->ModificationTime);
> +
> +  if (!(buf.st_mode & S_IWUSR)) {
> +    Info->Attribute |= EFI_FILE_READ_ONLY;
> +  }
> +
> +  if (S_ISDIR(buf.st_mode)) {
> +    Info->Attribute |= EFI_FILE_DIRECTORY;
> +  }
> +
> +
> +  BufferFileName = (CHAR16 *)((CHAR8 *) Buffer + Size);
> +  while (*RealFileName) {
> +    *BufferFileName++ = *RealFileName++;
> +  }
> +  *BufferFileName = 0;
> +
> +  *BufferSize = ResultSize;
> +  return Status;
> +}
> +
> +BOOLEAN
> +IsZero (
> +  IN VOID   *Buffer,
> +  IN UINTN  Length
> +  )
> +{
> +  if (Buffer == NULL || Length == 0) {
> +    return FALSE;
> +  }
> +
> +  if (*(UINT8 *) Buffer != 0) {
> +    return FALSE;
> +  }
> +
> +  if (Length > 1) {
> +    if (!CompareMem (Buffer, (UINT8 *) Buffer + 1, Length - 1)) {
> +      return FALSE;
> +    }
> +  }
> +
> +  return TRUE;
> +}
> +
> +
> +
> +/**
> +  Opens a new file relative to the source file's location.
> +
> +  @param  This       The protocol instance pointer.
> +  @param  NewHandle  Returns File Handle for FileName.
> +  @param  FileName   Null terminated string. "\", ".", and ".." are supported.
> +  @param  OpenMode   Open mode for file.
> +  @param  Attributes Only used for EFI_FILE_MODE_CREATE.
> +
> +  @retval EFI_SUCCESS          The device was opened.
> +  @retval EFI_NOT_FOUND        The specified file could not be found on the
> device.
> +  @retval EFI_NO_MEDIA         The device has no media.
> +  @retval EFI_MEDIA_CHANGED    The media has changed.
> +  @retval EFI_DEVICE_ERROR     The device reported an error.
> +  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> +  @retval EFI_ACCESS_DENIED    The service denied access to the file.
> +  @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of
> resources.
> +  @retval EFI_VOLUME_FULL      The volume is full.
> +
> +**/
> +EFI_STATUS
> +PosixFileOpen (
> +  IN EFI_FILE_PROTOCOL        *This,
> +  OUT EFI_FILE_PROTOCOL       **NewHandle,
> +  IN CHAR16                   *FileName,
> +  IN UINT64                   OpenMode,
> +  IN UINT64                   Attributes
> +  )
> +{
> +  EFI_FILE_PROTOCOL                 *Root;
> +  EMU_EFI_FILE_PRIVATE              *PrivateFile;
> +  EMU_EFI_FILE_PRIVATE              *NewPrivateFile;
> +  EMU_SIMPLE_FILE_SYSTEM_PRIVATE    *PrivateRoot;
> +  EFI_STATUS                        Status;
> +  CHAR16                            *Src;
> +  char                              *Dst;
> +  CHAR8                             *RealFileName;
> +  char                              *ParseFileName;
> +  char                              *GuardPointer;
> +  CHAR8                             TempChar;
> +  UINTN                             Count;
> +  BOOLEAN                           TrailingDash;
> +  BOOLEAN                           LoopFinish;
> +  UINTN                             InfoSize;
> +  EFI_FILE_INFO                     *Info;
> +  struct stat                       finfo;
> +  int                               res;
> +
> +
> +  PrivateFile     = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> +  PrivateRoot     = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS
> (PrivateFile->SimpleFileSystem);
> +  NewPrivateFile  = NULL;
> +  Status          = EFI_OUT_OF_RESOURCES;
> +
> +  //
> +  // BUGBUG: assume an open of root
> +  // if current location, return current data
> +  //
> +  TrailingDash = FALSE;
> +  if ((StrCmp (FileName, L"\\") == 0) ||
> +      (StrCmp (FileName, L".") == 0 && PrivateFile->IsRootDirectory)) {
> +OpenRoot:
> +    Status          = PosixOpenVolume (PrivateFile->SimpleFileSystem, &Root);
> +    NewPrivateFile  = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (Root);
> +    goto Done;
> +  }
> +
> +  if (FileName[StrLen (FileName) - 1] == L'\\') {
> +    TrailingDash = TRUE;
> +    FileName[StrLen (FileName) - 1]  = 0;
> +  }
> +
> +  //
> +  // Attempt to open the file
> +  //
> +  NewPrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));
> +  if (NewPrivateFile == NULL) {
> +    goto Done;
> +  }
> +
> +  CopyMem (NewPrivateFile, PrivateFile, sizeof (EMU_EFI_FILE_PRIVATE));
> +
> +  NewPrivateFile->FileName = malloc (AsciiStrSize (PrivateFile->FileName) + 1
> + StrLen (FileName) + 1);
> +  if (NewPrivateFile->FileName == NULL) {
> +    goto Done;
> +  }
> +
> +  if (*FileName == L'\\') {
> +    AsciiStrCpy (NewPrivateFile->FileName, PrivateRoot->FilePath);
> +    // Skip first '\'.
> +    Src = FileName + 1;
> +  } else {
> +    AsciiStrCpy (NewPrivateFile->FileName, PrivateFile->FileName);
> +    Src = FileName;
> +  }
> +  Dst = NewPrivateFile->FileName + AsciiStrLen (NewPrivateFile->FileName);
> +  GuardPointer = NewPrivateFile->FileName + AsciiStrLen (PrivateRoot-
> >FilePath);
> +  *Dst++ = '/';
> +  // Convert unicode to ascii and '\' to '/'
> +  while (*Src) {
> +    if (*Src == '\\') {
> +      *Dst++ = '/';
> +    } else {
> +      *Dst++ = *Src;
> +    }
> +    Src++;
> +  }
> +  *Dst = 0;
> +
> +
> +  //
> +  // Get rid of . and .., except leading . or ..
> +  //
> +
> +  //
> +  // GuardPointer protect simplefilesystem root path not be destroyed
> +  //
> +
> +  LoopFinish    = FALSE;
> +  while (!LoopFinish) {
> +    LoopFinish = TRUE;
> +
> +    for (ParseFileName = GuardPointer; *ParseFileName; ParseFileName++) {
> +      if (*ParseFileName == '.' &&
> +          (*(ParseFileName + 1) == 0 || *(ParseFileName + 1) == '/') &&
> +          *(ParseFileName - 1) == '/'
> +          ) {
> +
> +        //
> +        // cut /.
> +        //
> +        CutPrefix (ParseFileName - 1, 2);
> +        LoopFinish = FALSE;
> +        break;
> +      }
> +
> +      if (*ParseFileName == '.' &&
> +          *(ParseFileName + 1) == '.' &&
> +          (*(ParseFileName + 2) == 0 || *(ParseFileName + 2) == '/') &&
> +          *(ParseFileName - 1) == '/'
> +          ) {
> +
> +        ParseFileName--;
> +        Count = 3;
> +
> +        while (ParseFileName != GuardPointer) {
> +          ParseFileName--;
> +          Count++;
> +          if (*ParseFileName == '/') {
> +            break;
> +          }
> +        }
> +
> +        //
> +        // cut /.. and its left directory
> +        //
> +        CutPrefix (ParseFileName, Count);
> +        LoopFinish = FALSE;
> +        break;
> +      }
> +    }
> +  }
> +
> +  if (AsciiStrCmp (NewPrivateFile->FileName, PrivateRoot->FilePath) == 0) {
> +    NewPrivateFile->IsRootDirectory = TRUE;
> +    free (NewPrivateFile->FileName);
> +    free (NewPrivateFile);
> +    goto OpenRoot;
> +  }
> +
> +  RealFileName = NewPrivateFile->FileName + AsciiStrLen(NewPrivateFile-
> >FileName) - 1;
> +  while (RealFileName > NewPrivateFile->FileName && *RealFileName != '/') {
> +    RealFileName--;
> +  }
> +
> +  TempChar            = *(RealFileName - 1);
> +  *(RealFileName - 1) = 0;
> +  *(RealFileName - 1) = TempChar;
> +
> +
> +  //
> +  // Test whether file or directory
> +  //
> +  NewPrivateFile->IsRootDirectory = FALSE;
> +  NewPrivateFile->fd = -1;
> +  NewPrivateFile->Dir = NULL;
> +  if (OpenMode & EFI_FILE_MODE_CREATE) {
> +    if (Attributes & EFI_FILE_DIRECTORY) {
> +      NewPrivateFile->IsDirectoryPath = TRUE;
> +    } else {
> +      NewPrivateFile->IsDirectoryPath = FALSE;
> +    }
> +  } else {
> +    res = stat (NewPrivateFile->FileName, &finfo);
> +    if (res == 0 && S_ISDIR(finfo.st_mode)) {
> +      NewPrivateFile->IsDirectoryPath = TRUE;
> +    } else {
> +      NewPrivateFile->IsDirectoryPath = FALSE;
> +    }
> +  }
> +
> +  if (OpenMode & EFI_FILE_MODE_WRITE) {
> +    NewPrivateFile->IsOpenedByRead = FALSE;
> +  } else {
> +    NewPrivateFile->IsOpenedByRead = TRUE;
> +  }
> +
> +  Status = EFI_SUCCESS;
> +
> +  //
> +  // deal with directory
> +  //
> +  if (NewPrivateFile->IsDirectoryPath) {
> +    if ((OpenMode & EFI_FILE_MODE_CREATE)) {
> +      //
> +      // Create a directory
> +      //
> +      if (mkdir (NewPrivateFile->FileName, 0777) != 0) {
> +        if (errno != EEXIST) {
> +          //free (TempFileName);
> +          Status = EFI_ACCESS_DENIED;
> +          goto Done;
> +        }
> +      }
> +    }
> +
> +    NewPrivateFile->Dir = opendir (NewPrivateFile->FileName);
> +    if (NewPrivateFile->Dir == NULL) {
> +      if (errno == EACCES) {
> +        Status = EFI_ACCESS_DENIED;
> +      } else {
> +        Status = EFI_NOT_FOUND;
> +      }
> +
> +      goto Done;
> +    }
> +
> +  } else {
> +    //
> +    // deal with file
> +    //
> +    NewPrivateFile->fd = open (
> +                          NewPrivateFile->FileName,
> +                          ((OpenMode & EFI_FILE_MODE_CREATE) ? O_CREAT : 0) |
> (NewPrivateFile->IsOpenedByRead ? O_RDONLY : O_RDWR),
> +                          0666
> +                          );
> +    if (NewPrivateFile->fd < 0) {
> +      if (errno == ENOENT) {
> +        Status = EFI_NOT_FOUND;
> +      } else {
> +        Status = EFI_ACCESS_DENIED;
> +      }
> +    }
> +  }
> +
> +  if ((OpenMode & EFI_FILE_MODE_CREATE) && Status == EFI_SUCCESS) {
> +    //
> +    // Set the attribute
> +    //
> +    InfoSize  = 0;
> +    Info      = NULL;
> +    Status    = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid,
> &InfoSize, Info);
> +    if (Status != EFI_BUFFER_TOO_SMALL) {
> +      Status = EFI_DEVICE_ERROR;
> +      goto Done;
> +    }
> +
> +    Info = malloc (InfoSize);
> +    if (Info == NULL) {
> +      goto Done;
> +    }
> +
> +    Status = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid,
> &InfoSize, Info);
> +    if (EFI_ERROR (Status)) {
> +      goto Done;
> +    }
> +
> +    Info->Attribute = Attributes;
> +    PosixFileSetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, InfoSize, Info);
> +
> +    free (Info);
> +  }
> +
> +Done: ;
> +  if (TrailingDash) {
> +    FileName[StrLen (FileName) + 1]  = 0;
> +    FileName[StrLen (FileName)]      = L'\\';
> +  }
> +
> +  if (EFI_ERROR (Status)) {
> +    if (NewPrivateFile) {
> +      if (NewPrivateFile->FileName) {
> +        free (NewPrivateFile->FileName);
> +      }
> +
> +      free (NewPrivateFile);
> +    }
> +  } else {
> +    *NewHandle = &NewPrivateFile->EfiFile;
> +  }
> +
> +  return Status;
> +}
> +
> +
> +
> +/**
> +  Close the file handle
> +
> +  @param  This          Protocol instance pointer.
> +
> +  @retval EFI_SUCCESS   The device was opened.
> +
> +**/
> +EFI_STATUS
> +PosixFileCLose (
> +  IN EFI_FILE_PROTOCOL  *This
> +  )
> +{
> +  EMU_EFI_FILE_PRIVATE *PrivateFile;
> +
> +  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> +
> +  if (PrivateFile->fd >= 0) {
> +    close (PrivateFile->fd);
> +  }
> +  if (PrivateFile->Dir != NULL) {
> +    closedir (PrivateFile->Dir);
> +  }
> +
> +  PrivateFile->fd = -1;
> +  PrivateFile->Dir = NULL;
> +
> +  if (PrivateFile->FileName) {
> +    free (PrivateFile->FileName);
> +  }
> +
> +  free (PrivateFile);
> +
> +  return EFI_SUCCESS;
> +}
> +
> +
> +/**
> +  Close and delete the file handle.
> +
> +  @param  This                     Protocol instance pointer.
> +
> +  @retval EFI_SUCCESS              The device was opened.
> +  @retval EFI_WARN_DELETE_FAILURE  The handle was closed but the file was
> not deleted.
> +
> +**/
> +EFI_STATUS
> +PosixFileDelete (
> +  IN EFI_FILE_PROTOCOL  *This
> +  )
> +{
> +  EFI_STATUS              Status;
> +  EMU_EFI_FILE_PRIVATE   *PrivateFile;
> +
> +  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> +  Status      = EFI_WARN_DELETE_FAILURE;
> +
> +  if (PrivateFile->IsDirectoryPath) {
> +    if (PrivateFile->Dir != NULL) {
> +      closedir (PrivateFile->Dir);
> +      PrivateFile->Dir = NULL;
> +    }
> +
> +    if (rmdir (PrivateFile->FileName) == 0) {
> +      Status = EFI_SUCCESS;
> +    }
> +  } else {
> +    close (PrivateFile->fd);
> +    PrivateFile->fd = -1;
> +
> +    if (!PrivateFile->IsOpenedByRead) {
> +      if (!unlink (PrivateFile->FileName)) {
> +        Status = EFI_SUCCESS;
> +      }
> +    }
> +  }
> +
> +  free (PrivateFile->FileName);
> +  free (PrivateFile);
> +
> +  return Status;
> +}
> +
> +
> +/**
> +  Read data from the file.
> +
> +  @param  This       Protocol instance pointer.
> +  @param  BufferSize On input size of buffer, on output amount of data in
> buffer.
> +  @param  Buffer     The buffer in which data is read.
> +
> +  @retval EFI_SUCCESS          Data was read.
> +  @retval EFI_NO_MEDIA         The device has no media.
> +  @retval EFI_DEVICE_ERROR     The device reported an error.
> +  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> +  @retval EFI_BUFFER_TO_SMALL  BufferSize is too small. BufferSize contains
> required size.
> +
> +**/
> +EFI_STATUS
> +PosixFileRead (
> +  IN EFI_FILE_PROTOCOL        *This,
> +  IN OUT UINTN                *BufferSize,
> +  OUT VOID                    *Buffer
> +  )
> +{
> +  EMU_EFI_FILE_PRIVATE    *PrivateFile;
> +  EFI_STATUS              Status;
> +  int                     Res;
> +  UINTN                   Size;
> +  UINTN                   NameSize;
> +  UINTN                   ResultSize;
> +  CHAR8                   *FullFileName;
> +
> +
> +  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> +
> +  if (!PrivateFile->IsDirectoryPath) {
> +    if (PrivateFile->fd < 0) {
> +      Status = EFI_DEVICE_ERROR;
> +      goto Done;
> +    }
> +
> +    Res = read (PrivateFile->fd, Buffer, *BufferSize);
> +    if (Res < 0) {
> +      Status = EFI_DEVICE_ERROR;
> +      goto Done;
> +    }
> +    *BufferSize = Res;
> +    Status = EFI_SUCCESS;
> +    goto Done;
> +  }
> +
> +  //
> +  // Read on a directory.
> +  //
> +  if (PrivateFile->Dir == NULL) {
> +    Status = EFI_DEVICE_ERROR;
> +    goto Done;
> +  }
> +
> +  if (PrivateFile->Dirent == NULL) {
> +    PrivateFile->Dirent = readdir (PrivateFile->Dir);
> +    if (PrivateFile->Dirent == NULL) {
> +      *BufferSize = 0;
> +      Status = EFI_SUCCESS;
> +      goto Done;
> +    }
> +  }
> +
> +  Size        = SIZE_OF_EFI_FILE_INFO;
> +  NameSize    = AsciiStrLen (PrivateFile->Dirent->d_name) + 1;
> +  ResultSize  = Size + 2 * NameSize;
> +
> +  if (*BufferSize < ResultSize) {
> +    *BufferSize = ResultSize;
> +    Status = EFI_BUFFER_TOO_SMALL;
> +    goto Done;
> +  }
> +  Status  = EFI_SUCCESS;
> +
> +  *BufferSize = ResultSize;
> +
> +  FullFileName = malloc (AsciiStrLen(PrivateFile->FileName) + 1 + NameSize);
> +  if (FullFileName == NULL) {
> +    Status = EFI_OUT_OF_RESOURCES;
> +    goto Done;
> +  }
> +
> +  AsciiStrCpy (FullFileName, PrivateFile->FileName);
> +  AsciiStrCat (FullFileName, "/");
> +  AsciiStrCat (FullFileName, PrivateFile->Dirent->d_name);
> +  Status = UnixSimpleFileSystemFileInfo (
> +            PrivateFile,
> +            FullFileName,
> +            BufferSize,
> +            Buffer
> +            );
> +  free (FullFileName);
> +
> +  PrivateFile->Dirent = NULL;
> +
> +Done:
> +  return Status;
> +}
> +
> +
> +
> +/**
> +  Write data to a file.
> +
> +  @param  This       Protocol instance pointer.
> +  @param  BufferSize On input size of buffer, on output amount of data in
> buffer.
> +  @param  Buffer     The buffer in which data to write.
> +
> +  @retval EFI_SUCCESS          Data was written.
> +  @retval EFI_UNSUPPORTED      Writes to Open directory are not supported.
> +  @retval EFI_NO_MEDIA         The device has no media.
> +  @retval EFI_DEVICE_ERROR     The device reported an error.
> +  @retval EFI_DEVICE_ERROR     An attempt was made to write to a deleted
> file.
> +  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> +  @retval EFI_WRITE_PROTECTED  The device is write protected.
> +  @retval EFI_ACCESS_DENIED    The file was open for read only.
> +  @retval EFI_VOLUME_FULL      The volume is full.
> +
> +**/
> +EFI_STATUS
> +PosixFileWrite (
> +  IN EFI_FILE_PROTOCOL        *This,
> +  IN OUT UINTN                *BufferSize,
> +  IN VOID                     *Buffer
> +  )
> +{
> +  EMU_EFI_FILE_PRIVATE  *PrivateFile;
> +  int                   Res;
> +
> +
> +  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> +
> +  if (PrivateFile->fd < 0) {
> +    return EFI_DEVICE_ERROR;
> +  }
> +
> +  if (PrivateFile->IsDirectoryPath) {
> +    return EFI_UNSUPPORTED;
> +  }
> +
> +  if (PrivateFile->IsOpenedByRead) {
> +    return EFI_ACCESS_DENIED;
> +  }
> +
> +  Res = write (PrivateFile->fd, Buffer, *BufferSize);
> +  if (Res == (UINTN)-1) {
> +    return ErrnoToEfiStatus ();
> +  }
> +
> +  *BufferSize = Res;
> +  return EFI_SUCCESS;
> +}
> +
> +
> +
> +/**
> +  Set a files current position
> +
> +  @param  This            Protocol instance pointer.
> +  @param  Position        Byte position from the start of the file.
> +
> +  @retval EFI_SUCCESS     Data was written.
> +  @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open.
> +
> +**/
> +EFI_STATUS
> +PosixFileSetPossition (
> +  IN EFI_FILE_PROTOCOL        *This,
> +  IN UINT64                   Position
> +  )
> +{
> +  EMU_EFI_FILE_PRIVATE    *PrivateFile;
> +  off_t                   Pos;
> +
> +  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> +
> +  if (PrivateFile->IsDirectoryPath) {
> +    if (Position != 0) {
> +      return EFI_UNSUPPORTED;
> +    }
> +
> +    if (PrivateFile->Dir == NULL) {
> +      return EFI_DEVICE_ERROR;
> +    }
> +    rewinddir (PrivateFile->Dir);
> +    return EFI_SUCCESS;
> +  } else {
> +    if (Position == (UINT64) -1) {
> +      Pos = lseek (PrivateFile->fd, 0, SEEK_END);
> +    } else {
> +      Pos = lseek (PrivateFile->fd, Position, SEEK_SET);
> +    }
> +    if (Pos == (off_t)-1) {
> +      return ErrnoToEfiStatus ();
> +    }
> +    return EFI_SUCCESS;
> +  }
> +}
> +
> +
> +
> +/**
> +  Get a file's current position
> +
> +  @param  This            Protocol instance pointer.
> +  @param  Position        Byte position from the start of the file.
> +
> +  @retval EFI_SUCCESS     Data was written.
> +  @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open..
> +
> +**/
> +EFI_STATUS
> +PosixFileGetPossition (
> +  IN EFI_FILE_PROTOCOL        *This,
> +  OUT UINT64                  *Position
> +  )
> +{
> +  EFI_STATUS            Status;
> +  EMU_EFI_FILE_PRIVATE  *PrivateFile;
> +
> +  PrivateFile   = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> +
> +  if (PrivateFile->IsDirectoryPath) {
> +    Status = EFI_UNSUPPORTED;
> +  } else {
> +    *Position = (UINT64)lseek (PrivateFile->fd, 0, SEEK_CUR);
> +    Status = (*Position == (UINT64) -1) ? ErrnoToEfiStatus () : EFI_SUCCESS;
> +  }
> +
> +  return Status;
> +}
> +
> +
> +/**
> +  Get information about a file.
> +
> +  @param  This            Protocol instance pointer.
> +  @param  InformationType Type of information to return in Buffer.
> +  @param  BufferSize      On input size of buffer, on output amount of data in
> buffer.
> +  @param  Buffer          The buffer to return data.
> +
> +  @retval EFI_SUCCESS          Data was returned.
> +  @retval EFI_UNSUPPORTED      InformationType is not supported.
> +  @retval EFI_NO_MEDIA         The device has no media.
> +  @retval EFI_DEVICE_ERROR     The device reported an error.
> +  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> +  @retval EFI_WRITE_PROTECTED  The device is write protected.
> +  @retval EFI_ACCESS_DENIED    The file was open for read only.
> +  @retval EFI_BUFFER_TOO_SMALL Buffer was too small; required size
> returned in BufferSize.
> +
> +**/
> +EFI_STATUS
> +PosixFileGetInfo (
> +  IN EFI_FILE_PROTOCOL        *This,
> +  IN EFI_GUID                 *InformationType,
> +  IN OUT UINTN                *BufferSize,
> +  OUT VOID                    *Buffer
> +  )
> +{
> +  EFI_STATUS                        Status;
> +  EMU_EFI_FILE_PRIVATE              *PrivateFile;
> +  EFI_FILE_SYSTEM_INFO              *FileSystemInfoBuffer;
> +  int                               UnixStatus;
> +  EMU_SIMPLE_FILE_SYSTEM_PRIVATE    *PrivateRoot;
> +  struct statfs                     buf;
> +
> +  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> +  PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS
> (PrivateFile->SimpleFileSystem);
> +
> +  Status = EFI_SUCCESS;
> +  if (CompareGuid (InformationType, &gEfiFileInfoGuid)) {
> +    Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, BufferSize, Buffer);
> +  } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
> +    if (*BufferSize < SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel)) {
> +      *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel);
> +      return EFI_BUFFER_TOO_SMALL;
> +    }
> +
> +    UnixStatus = statfs (PrivateFile->FileName, &buf);
> +    if (UnixStatus < 0) {
> +      return EFI_DEVICE_ERROR;
> +    }
> +
> +    FileSystemInfoBuffer            = (EFI_FILE_SYSTEM_INFO *) Buffer;
> +    FileSystemInfoBuffer->Size      = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize
> (PrivateRoot->VolumeLabel);
> +    FileSystemInfoBuffer->ReadOnly  = FALSE;
> +
> +    //
> +    // Succeeded
> +    //
> +    FileSystemInfoBuffer->VolumeSize  = MultU64x32 (buf.f_blocks, buf.f_bsize);
> +    FileSystemInfoBuffer->FreeSpace   = MultU64x32 (buf.f_bavail, buf.f_bsize);
> +    FileSystemInfoBuffer->BlockSize   = buf.f_bsize;
> +
> +
> +    StrCpy ((CHAR16 *) FileSystemInfoBuffer->VolumeLabel, PrivateRoot-
> >VolumeLabel);
> +    *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel);
> +
> +  } else if (CompareGuid (InformationType,
> &gEfiFileSystemVolumeLabelInfoIdGuid)) {
> +    if (*BufferSize < StrSize (PrivateRoot->VolumeLabel)) {
> +      *BufferSize = StrSize (PrivateRoot->VolumeLabel);
> +      return EFI_BUFFER_TOO_SMALL;
> +    }
> +
> +    StrCpy ((CHAR16 *) Buffer, PrivateRoot->VolumeLabel);
> +    *BufferSize = StrSize (PrivateRoot->VolumeLabel);
> +
> +  }
> +
> +  return Status;
> +}
> +
> +
> +/**
> +  Set information about a file
> +
> +  @param  File            Protocol instance pointer.
> +  @param  InformationType Type of information in Buffer.
> +  @param  BufferSize      Size of buffer.
> +  @param  Buffer          The data to write.
> +
> +  @retval EFI_SUCCESS          Data was returned.
> +  @retval EFI_UNSUPPORTED      InformationType is not supported.
> +  @retval EFI_NO_MEDIA         The device has no media.
> +  @retval EFI_DEVICE_ERROR     The device reported an error.
> +  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> +  @retval EFI_WRITE_PROTECTED  The device is write protected.
> +  @retval EFI_ACCESS_DENIED    The file was open for read only.
> +
> +**/
> +EFI_STATUS
> +PosixFileSetInfo (
> +  IN EFI_FILE_PROTOCOL        *This,
> +  IN EFI_GUID                 *InformationType,
> +  IN UINTN                    BufferSize,
> +  IN VOID                     *Buffer
> +  )
> +{
> +  EMU_SIMPLE_FILE_SYSTEM_PRIVATE    *PrivateRoot;
> +  EMU_EFI_FILE_PRIVATE              *PrivateFile;
> +  EFI_FILE_INFO                     *OldFileInfo;
> +  EFI_FILE_INFO                     *NewFileInfo;
> +  EFI_STATUS                        Status;
> +  UINTN                             OldInfoSize;
> +  mode_t                            NewAttr;
> +  struct stat                       OldAttr;
> +  CHAR8                             *OldFileName;
> +  CHAR8                             *NewFileName;
> +  CHAR8                             *CharPointer;
> +  BOOLEAN                           AttrChangeFlag;
> +  BOOLEAN                           NameChangeFlag;
> +  BOOLEAN                           SizeChangeFlag;
> +  BOOLEAN                           TimeChangeFlag;
> +  struct tm                         NewLastAccessSystemTime;
> +  struct tm                         NewLastWriteSystemTime;
> +  EFI_FILE_SYSTEM_INFO              *NewFileSystemInfo;
> +  CHAR8                             *AsciiFilePtr;
> +  CHAR16                            *UnicodeFilePtr;
> +  int                               UnixStatus;
> +  struct utimbuf                    Utime;
> +
> +
> +  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> +  PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS
> (PrivateFile->SimpleFileSystem);
> +  errno       = 0;
> +  Status      = EFI_UNSUPPORTED;
> +  OldFileInfo = NewFileInfo = NULL;
> +  OldFileName = NewFileName = NULL;
> +  AttrChangeFlag = NameChangeFlag = SizeChangeFlag = TimeChangeFlag =
> FALSE;
> +
> +  //
> +  // Set file system information.
> +  //
> +  if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
> +    if (BufferSize < (SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel))) {
> +      Status = EFI_BAD_BUFFER_SIZE;
> +      goto Done;
> +    }
> +
> +    NewFileSystemInfo = (EFI_FILE_SYSTEM_INFO *) Buffer;
> +
> +    free (PrivateRoot->VolumeLabel);
> +
> +    PrivateRoot->VolumeLabel = malloc (StrSize (NewFileSystemInfo-
> >VolumeLabel));
> +    if (PrivateRoot->VolumeLabel == NULL) {
> +      goto Done;
> +    }
> +
> +    StrCpy (PrivateRoot->VolumeLabel, NewFileSystemInfo->VolumeLabel);
> +
> +    Status = EFI_SUCCESS;
> +    goto Done;
> +  }
> +
> +  //
> +  // Set volume label information.
> +  //
> +  if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid))
> {
> +    if (BufferSize < StrSize (PrivateRoot->VolumeLabel)) {
> +      Status = EFI_BAD_BUFFER_SIZE;
> +      goto Done;
> +    }
> +
> +    StrCpy (PrivateRoot->VolumeLabel, (CHAR16 *) Buffer);
> +
> +    Status = EFI_SUCCESS;
> +    goto Done;
> +  }
> +
> +  if (!CompareGuid (InformationType, &gEfiFileInfoGuid)) {
> +    Status = EFI_UNSUPPORTED;
> +    goto Done;
> +  }
> +
> +  if (BufferSize < SIZE_OF_EFI_FILE_INFO) {
> +    Status = EFI_BAD_BUFFER_SIZE;
> +    goto Done;
> +  }
> +
> +  //
> +  // Set file/directory information.
> +  //
> +
> +  //
> +  // Check for invalid set file information parameters.
> +  //
> +  NewFileInfo = (EFI_FILE_INFO *) Buffer;
> +  if (NewFileInfo->Size <= sizeof (EFI_FILE_INFO) ||
> +      (NewFileInfo->Attribute &~(EFI_FILE_VALID_ATTR)) ||
> +      (sizeof (UINTN) == 4 && NewFileInfo->Size > 0xFFFFFFFF)
> +      ) {
> +    Status = EFI_INVALID_PARAMETER;
> +    goto Done;
> +  }
> +
> +  //
> +  // Get current file information so we can determine what kind
> +  // of change request this is.
> +  //
> +  OldInfoSize = 0;
> +  Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize,
> NULL);
> +  if (Status != EFI_BUFFER_TOO_SMALL) {
> +    Status = EFI_DEVICE_ERROR;
> +    goto Done;
> +  }
> +
> +  OldFileInfo = malloc (OldInfoSize);
> +  if (OldFileInfo == NULL) {
> +    goto Done;
> +  }
> +
> +  Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize,
> OldFileInfo);
> +  if (EFI_ERROR (Status)) {
> +    goto Done;
> +  }
> +
> +  OldFileName = malloc (AsciiStrSize (PrivateFile->FileName));
> +  if (OldFileInfo == NULL) {
> +    goto Done;
> +  }
> +
> +  AsciiStrCpy (OldFileName, PrivateFile->FileName);
> +
> +  //
> +  // Make full pathname from new filename and rootpath.
> +  //
> +  if (NewFileInfo->FileName[0] == '\\') {
> +    NewFileName = malloc (AsciiStrLen (PrivateRoot->FilePath) + 1 + StrLen
> (NewFileInfo->FileName) + 1);
> +    if (NewFileName == NULL) {
> +      goto Done;
> +    }
> +
> +    AsciiStrCpy (NewFileName, PrivateRoot->FilePath);
> +    AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);
> +    UnicodeFilePtr = NewFileInfo->FileName + 1;
> +    *AsciiFilePtr++ ='/';
> +  } else {
> +    NewFileName = malloc (AsciiStrLen (PrivateFile->FileName) + 2 + StrLen
> (NewFileInfo->FileName) + 1);
> +    if (NewFileName == NULL) {
> +      goto Done;
> +    }
> +
> +    AsciiStrCpy (NewFileName, PrivateRoot->FilePath);
> +    AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);
> +    if ((AsciiFilePtr[-1] != '/') && (NewFileInfo->FileName[0] != '/')) {
> +      // make sure there is a / between Root FilePath and NewFileInfo Filename
> +      AsciiFilePtr[0] = '/';
> +      AsciiFilePtr[1] = '\0';
> +      AsciiFilePtr++;
> +    }
> +    UnicodeFilePtr = NewFileInfo->FileName;
> +  }
> +  // Convert to ascii.
> +  while (*UnicodeFilePtr) {
> +    *AsciiFilePtr++ = *UnicodeFilePtr++;
> +  }
> +  *AsciiFilePtr = 0;
> +
> +  //
> +  // Is there an attribute change request?
> +  //
> +  if (NewFileInfo->Attribute != OldFileInfo->Attribute) {
> +    if ((NewFileInfo->Attribute & EFI_FILE_DIRECTORY) != (OldFileInfo-
> >Attribute & EFI_FILE_DIRECTORY)) {
> +      Status = EFI_INVALID_PARAMETER;
> +      goto Done;
> +    }
> +
> +    AttrChangeFlag = TRUE;
> +  }
> +
> +  //
> +  // Is there a name change request?
> +  // bugbug: - Should really use EFI_UNICODE_COLLATION_PROTOCOL
> +  //
> +  if (StrCmp (NewFileInfo->FileName, OldFileInfo->FileName)) {
> +    NameChangeFlag = TRUE;
> +  }
> +
> +  //
> +  // Is there a size change request?
> +  //
> +  if (NewFileInfo->FileSize != OldFileInfo->FileSize) {
> +    SizeChangeFlag = TRUE;
> +  }
> +
> +  //
> +  // Is there a time stamp change request?
> +  //
> +  if (!IsZero (&NewFileInfo->CreateTime, sizeof (EFI_TIME)) &&
> +      CompareMem (&NewFileInfo->CreateTime, &OldFileInfo->CreateTime,
> sizeof (EFI_TIME))
> +      ) {
> +    TimeChangeFlag = TRUE;
> +  } else if (!IsZero (&NewFileInfo->LastAccessTime, sizeof (EFI_TIME)) &&
> +             CompareMem (&NewFileInfo->LastAccessTime, &OldFileInfo-
> >LastAccessTime, sizeof (EFI_TIME))
> +             ) {
> +    TimeChangeFlag = TRUE;
> +  } else if (!IsZero (&NewFileInfo->ModificationTime, sizeof (EFI_TIME)) &&
> +             CompareMem (&NewFileInfo->ModificationTime, &OldFileInfo-
> >ModificationTime, sizeof (EFI_TIME))
> +             ) {
> +    TimeChangeFlag = TRUE;
> +  }
> +
> +  //
> +  // All done if there are no change requests being made.
> +  //
> +  if (!(AttrChangeFlag || NameChangeFlag || SizeChangeFlag ||
> TimeChangeFlag)) {
> +    Status = EFI_SUCCESS;
> +    goto Done;
> +  }
> +
> +  //
> +  // Set file or directory information.
> +  //
> +  if (stat (OldFileName, &OldAttr) != 0) {
> +    Status = ErrnoToEfiStatus ();
> +    goto Done;
> +  }
> +
> +  //
> +  // Name change.
> +  //
> +  if (NameChangeFlag) {
> +    //
> +    // Close the handles first
> +    //
> +    if (PrivateFile->IsOpenedByRead) {
> +      Status = EFI_ACCESS_DENIED;
> +      goto Done;
> +    }
> +
> +    for (CharPointer = NewFileName; *CharPointer != 0 && *CharPointer != L'/';
> CharPointer++) {
> +    }
> +
> +    if (*CharPointer != 0) {
> +      Status = EFI_ACCESS_DENIED;
> +      goto Done;
> +    }
> +
> +    UnixStatus = rename (OldFileName, NewFileName);
> +    if (UnixStatus == 0) {
> +      //
> +      // modify file name
> +      //
> +      free (PrivateFile->FileName);
> +
> +      PrivateFile->FileName = malloc (AsciiStrSize (NewFileName));
> +      if (PrivateFile->FileName == NULL) {
> +        goto Done;
> +      }
> +
> +      AsciiStrCpy (PrivateFile->FileName, NewFileName);
> +    } else {
> +      Status    = EFI_DEVICE_ERROR;
> +      goto Done;
> +    }
> +  }
> +
> +  //
> +  //  Size change
> +  //
> +  if (SizeChangeFlag) {
> +    if (PrivateFile->IsDirectoryPath) {
> +      Status = EFI_UNSUPPORTED;
> +      goto Done;
> +    }
> +
> +    if (PrivateFile->IsOpenedByRead || OldFileInfo->Attribute &
> EFI_FILE_READ_ONLY) {
> +      Status = EFI_ACCESS_DENIED;
> +      goto Done;
> +    }
> +
> +    if (ftruncate (PrivateFile->fd, NewFileInfo->FileSize) != 0) {
> +      Status = ErrnoToEfiStatus ();
> +      goto Done;
> +    }
> +
> +  }
> +
> +  //
> +  // Time change
> +  //
> +  if (TimeChangeFlag) {
> +    NewLastAccessSystemTime.tm_year    = NewFileInfo->LastAccessTime.Year;
> +    NewLastAccessSystemTime.tm_mon     = NewFileInfo-
> >LastAccessTime.Month;
> +    NewLastAccessSystemTime.tm_mday    = NewFileInfo->LastAccessTime.Day;
> +    NewLastAccessSystemTime.tm_hour    = NewFileInfo->LastAccessTime.Hour;
> +    NewLastAccessSystemTime.tm_min     = NewFileInfo-
> >LastAccessTime.Minute;
> +    NewLastAccessSystemTime.tm_sec     = NewFileInfo-
> >LastAccessTime.Second;
> +    NewLastAccessSystemTime.tm_isdst   = 0;
> +
> +    Utime.actime = mktime (&NewLastAccessSystemTime);
> +
> +    NewLastWriteSystemTime.tm_year    = NewFileInfo-
> >ModificationTime.Year;
> +    NewLastWriteSystemTime.tm_mon     = NewFileInfo-
> >ModificationTime.Month;
> +    NewLastWriteSystemTime.tm_mday    = NewFileInfo-
> >ModificationTime.Day;
> +    NewLastWriteSystemTime.tm_hour    = NewFileInfo-
> >ModificationTime.Hour;
> +    NewLastWriteSystemTime.tm_min     = NewFileInfo-
> >ModificationTime.Minute;
> +    NewLastWriteSystemTime.tm_sec     = NewFileInfo-
> >ModificationTime.Second;
> +    NewLastWriteSystemTime.tm_isdst   = 0;
> +
> +    Utime.modtime = mktime (&NewLastWriteSystemTime);
> +
> +    if (Utime.actime == (time_t)-1 || Utime.modtime == (time_t)-1) {
> +      goto Done;
> +    }
> +
> +    if (utime (PrivateFile->FileName, &Utime) == -1) {
> +      Status = ErrnoToEfiStatus ();
> +      goto Done;
> +    }
> +  }
> +
> +  //
> +  // No matter about AttrChangeFlag, Attribute must be set.
> +  // Because operation before may cause attribute change.
> +  //
> +  NewAttr = OldAttr.st_mode;
> +
> +  if (NewFileInfo->Attribute & EFI_FILE_READ_ONLY) {
> +    NewAttr &= ~(S_IRUSR | S_IRGRP | S_IROTH);
> +  } else {
> +    NewAttr |= S_IRUSR;
> +  }
> +
> +  if (chmod (NewFileName, NewAttr) != 0) {
> +    Status = ErrnoToEfiStatus ();
> +  }
> +
> +Done:
> +  if (OldFileInfo != NULL) {
> +    free (OldFileInfo);
> +  }
> +
> +  if (OldFileName != NULL) {
> +    free (OldFileName);
> +  }
> +
> +  if (NewFileName != NULL) {
> +    free (NewFileName);
> +  }
> +
> +  return Status;
> +}
> +
> +
> +/**
> +  Flush data back for the file handle.
> +
> +  @param  This Protocol instance pointer.
> +
> +  @retval EFI_SUCCESS          Data was written.
> +  @retval EFI_UNSUPPORTED      Writes to Open directory are not supported.
> +  @retval EFI_NO_MEDIA         The device has no media.
> +  @retval EFI_DEVICE_ERROR     The device reported an error.
> +  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> +  @retval EFI_WRITE_PROTECTED  The device is write protected.
> +  @retval EFI_ACCESS_DENIED    The file was open for read only.
> +  @retval EFI_VOLUME_FULL      The volume is full.
> +
> +**/
> +EFI_STATUS
> +PosixFileFlush (
> +  IN EFI_FILE_PROTOCOL  *This
> +  )
> +{
> +  EMU_EFI_FILE_PRIVATE     *PrivateFile;
> +
> +
> +  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> +
> +  if (PrivateFile->IsDirectoryPath) {
> +    return EFI_UNSUPPORTED;
> +  }
> +
> +  if (PrivateFile->IsOpenedByRead) {
> +    return EFI_ACCESS_DENIED;
> +  }
> +
> +  if (PrivateFile->fd < 0) {
> +    return EFI_DEVICE_ERROR;
> +  }
> +
> +  if (fsync (PrivateFile->fd) != 0) {
> +    return ErrnoToEfiStatus ();
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +
> +
> +EFI_STATUS
> +PosixFileSystmeThunkOpen (
> +  IN  EMU_IO_THUNK_PROTOCOL   *This
> +  )
> +{
> +  EMU_SIMPLE_FILE_SYSTEM_PRIVATE  *Private;
> +  UINTN                           i;
> +
> +  if (This->Private != NULL) {
> +    return EFI_ALREADY_STARTED;
> +  }
> +
> +  if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {
> +    return EFI_UNSUPPORTED;
> +  }
> +
> +  Private = malloc (sizeof (EMU_SIMPLE_FILE_SYSTEM_PRIVATE));
> +  if (Private == NULL) {
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  Private->FilePath = malloc (StrLen (This->ConfigString) + 1);
> +  if (Private->FilePath == NULL) {
> +    free (Private);
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  // Convert Unicode to Ascii
> +  for (i = 0; This->ConfigString[i] != 0; i++) {
> +    Private->FilePath[i] = This->ConfigString[i];
> +  }
> +  Private->FilePath[i] = 0;
> +
> +
> +  Private->VolumeLabel = malloc (StrSize (L"EFI_EMULATED"));
> +  if (Private->VolumeLabel == NULL) {
> +    free (Private->FilePath);
> +    free (Private);
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +  StrCpy (Private->VolumeLabel, L"EFI_EMULATED");
> +
> +  Private->Signature = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE;
> +  Private->Thunk     = This;
> +  CopyMem (&Private->SimpleFileSystem, &gPosixFileSystemProtocol, sizeof
> (Private->SimpleFileSystem));
> +  Private->FileHandlesOpen = FALSE;
> +
> +  This->Interface = &Private->SimpleFileSystem;
> +  This->Private   = Private;
> +  return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +PosixFileSystmeThunkClose (
> +  IN  EMU_IO_THUNK_PROTOCOL   *This
> +  )
> +{
> +  EMU_SIMPLE_FILE_SYSTEM_PRIVATE  *Private;
> +
> +  if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {
> +    return EFI_UNSUPPORTED;
> +  }
> +
> +  Private = This->Private;
> +
> +  if (Private->FileHandlesOpen) {
> +    //
> +    // Close only supported if all the EFI_FILE_HANDLEs have been closed.
> +    //
> +    return EFI_NOT_READY;
> +  }
> +
> +  if (This->Private != NULL) {
> +    if (Private->VolumeLabel != NULL) {
> +      free (Private->VolumeLabel);
> +    }
> +    free (This->Private);
> +    This->Private = NULL;
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +
> +EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo = {
> +  &gEfiSimpleFileSystemProtocolGuid,
> +  NULL,
> +  NULL,
> +  0,
> +  GasketPosixFileSystmeThunkOpen,
> +  GasketPosixFileSystmeThunkClose,
> +  NULL
> +};
> +
> +
> diff --git a/EmulatorPkg/Unix/Host/Pthreads.c
> b/EmulatorPkg/Unix/Host/Pthreads.c
> index c60c298099..cb9ffeea84 100644
> --- a/EmulatorPkg/Unix/Host/Pthreads.c
> +++ b/EmulatorPkg/Unix/Host/Pthreads.c
> @@ -1,235 +1,235 @@
> -/*++ @file
> - POSIX Pthreads to emulate APs and implement threads
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.
> -Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
> -
> -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.
> -
> -
> -**/
> -
> -#include "Host.h"
> -#include <pthread.h>
> -
> -
> -UINTN
> -EFIAPI
> -PthreadMutexLock (
> -  IN VOID *Mutex
> -  )
> -{
> -  return (UINTN)pthread_mutex_lock ((pthread_mutex_t *)Mutex);
> -}
> -
> -
> -
> -UINTN
> -EFIAPI
> -PthreadMutexUnLock (
> -  IN VOID *Mutex
> -  )
> -{
> -  return (UINTN)pthread_mutex_unlock ((pthread_mutex_t *)Mutex);
> -}
> -
> -
> -UINTN
> -EFIAPI
> -PthreadMutexTryLock (
> -  IN VOID *Mutex
> -  )
> -{
> -  return (UINTN)pthread_mutex_trylock ((pthread_mutex_t *)Mutex);
> -}
> -
> -
> -VOID *
> -PthreadMutexInit (
> -  IN VOID
> -  )
> -{
> -  pthread_mutex_t *Mutex;
> -  int             err;
> -
> -  Mutex = malloc (sizeof (pthread_mutex_t));
> -  err = pthread_mutex_init (Mutex, NULL);
> -  if (err == 0) {
> -    return Mutex;
> -  }
> -
> -  return NULL;
> -}
> -
> -
> -UINTN
> -PthreadMutexDestroy (
> -  IN VOID *Mutex
> -  )
> -{
> -  if (Mutex != NULL) {
> -    return pthread_mutex_destroy ((pthread_mutex_t *)Mutex);
> -  }
> -
> -  return -1;
> -}
> -
> -// Can't store this data on PthreadCreate stack so we need a global
> -typedef struct {
> -  pthread_mutex_t             Mutex;
> -  THREAD_THUNK_THREAD_ENTRY   Start;
> -} THREAD_MANGLE;
> -
> -THREAD_MANGLE mThreadMangle = {
> -  PTHREAD_MUTEX_INITIALIZER,
> -  NULL
> -};
> -
> -VOID *
> -SecFakePthreadStart (
> -  VOID  *Context
> -  )
> -{
> -  THREAD_THUNK_THREAD_ENTRY Start;
> -  sigset_t                  SigMask;
> -
> -  // Save global on the stack before we unlock
> -  Start   = mThreadMangle.Start;
> -  pthread_mutex_unlock (&mThreadMangle.Mutex);
> -
> -  // Mask all signals to the APs
> -  sigfillset (&SigMask);
> -  pthread_sigmask (SIG_BLOCK, &SigMask, NULL);
> -
> -  //
> -  // We have to start the thread in SEC as we need to follow
> -  // OS X calling conventions. We can then call back into
> -  // to the callers Start.
> -  //
> -  // This is a great example of how all problems in computer
> -  // science can be solved by adding another level of indirection
> -  //
> - return  (VOID *)ReverseGasketUint64 ((CALL_BACK)Start, (UINTN)Context);
> -}
> -
> -UINTN
> -PthreadCreate (
> -  IN  VOID                      *Thread,
> -  IN  VOID                      *Attribute,
> -  IN  THREAD_THUNK_THREAD_ENTRY Start,
> -  IN  VOID                      *Context
> -  )
> -{
> -  int         err;
> -  BOOLEAN     EnabledOnEntry;
> -
> -  //
> -  // Threads inherit interrupt state so disable interrupts before we start thread
> -  //
> -  if (SecInterruptEanbled ()) {
> -    SecDisableInterrupt ();
> -    EnabledOnEntry = TRUE;
> -  } else {
> -    EnabledOnEntry = FALSE;
> -  }
> -
> -  // Aquire lock for global, SecFakePthreadStart runs in a different thread.
> -  pthread_mutex_lock (&mThreadMangle.Mutex);
> -  mThreadMangle.Start   = Start;
> -
> -  err = pthread_create (Thread, Attribute, SecFakePthreadStart, Context);
> -  if (err != 0) {
> -    // Thread failed to launch so release the lock;
> -    pthread_mutex_unlock (&mThreadMangle.Mutex);
> -  }
> -
> -  if (EnabledOnEntry) {
> -    // Restore interrupt state
> -    SecEnableInterrupt ();
> -  }
> -
> -  return err;
> -}
> -
> -
> -VOID
> -PthreadExit (
> -  IN VOID *ValuePtr
> -  )
> -{
> -  pthread_exit (ValuePtr);
> -  return;
> -}
> -
> -
> -UINTN
> -PthreadSelf (
> -  VOID
> -  )
> -{
> -  // POSIX currently allows pthread_t to be a structure or arithmetic type.
> -  // Check out sys/types.h to make sure this will work if you are porting.
> -  // On OS X (Darwin) pthread_t is a pointer to a structure so this code works.
> -  return (UINTN)pthread_self ();
> -}
> -
> -
> -EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {
> -  GasketPthreadMutexLock,
> -  GasketPthreadMutexUnLock,
> -  GasketPthreadMutexTryLock,
> -  GasketPthreadMutexInit,
> -  GasketPthreadMutexDestroy,
> -  GasketPthreadCreate,
> -  GasketPthreadExit,
> -  GasketPthreadSelf
> -};
> -
> -
> -EFI_STATUS
> -PthreadOpen (
> -  IN  EMU_IO_THUNK_PROTOCOL   *This
> -  )
> -{
> -  if (This->Instance != 0) {
> -    // Only single instance is supported
> -    return EFI_NOT_FOUND;
> -  }
> -
> -  if (This->ConfigString[0] == L'0') {
> -    // If AP count is zero no need for threads
> -    return EFI_NOT_FOUND;
> -  }
> -
> -  This->Interface = &gPthreadThunk;
> -
> -  return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -PthreadClose (
> -  IN  EMU_IO_THUNK_PROTOCOL   *This
> -  )
> -{
> -  return EFI_SUCCESS;
> -}
> -
> -
> -EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {
> -  &gEmuThreadThunkProtocolGuid,
> -  NULL,
> -  NULL,
> -  0,
> -  GasketPthreadOpen,
> -  GasketPthreadClose,
> -  NULL
> -};
> -
> -
> +/*++ @file
> + POSIX Pthreads to emulate APs and implement threads
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.
> +Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
> +
> +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.
> +
> +
> +**/
> +
> +#include "Host.h"
> +#include <pthread.h>
> +
> +
> +UINTN
> +EFIAPI
> +PthreadMutexLock (
> +  IN VOID *Mutex
> +  )
> +{
> +  return (UINTN)pthread_mutex_lock ((pthread_mutex_t *)Mutex);
> +}
> +
> +
> +
> +UINTN
> +EFIAPI
> +PthreadMutexUnLock (
> +  IN VOID *Mutex
> +  )
> +{
> +  return (UINTN)pthread_mutex_unlock ((pthread_mutex_t *)Mutex);
> +}
> +
> +
> +UINTN
> +EFIAPI
> +PthreadMutexTryLock (
> +  IN VOID *Mutex
> +  )
> +{
> +  return (UINTN)pthread_mutex_trylock ((pthread_mutex_t *)Mutex);
> +}
> +
> +
> +VOID *
> +PthreadMutexInit (
> +  IN VOID
> +  )
> +{
> +  pthread_mutex_t *Mutex;
> +  int             err;
> +
> +  Mutex = malloc (sizeof (pthread_mutex_t));
> +  err = pthread_mutex_init (Mutex, NULL);
> +  if (err == 0) {
> +    return Mutex;
> +  }
> +
> +  return NULL;
> +}
> +
> +
> +UINTN
> +PthreadMutexDestroy (
> +  IN VOID *Mutex
> +  )
> +{
> +  if (Mutex != NULL) {
> +    return pthread_mutex_destroy ((pthread_mutex_t *)Mutex);
> +  }
> +
> +  return -1;
> +}
> +
> +// Can't store this data on PthreadCreate stack so we need a global
> +typedef struct {
> +  pthread_mutex_t             Mutex;
> +  THREAD_THUNK_THREAD_ENTRY   Start;
> +} THREAD_MANGLE;
> +
> +THREAD_MANGLE mThreadMangle = {
> +  PTHREAD_MUTEX_INITIALIZER,
> +  NULL
> +};
> +
> +VOID *
> +SecFakePthreadStart (
> +  VOID  *Context
> +  )
> +{
> +  THREAD_THUNK_THREAD_ENTRY Start;
> +  sigset_t                  SigMask;
> +
> +  // Save global on the stack before we unlock
> +  Start   = mThreadMangle.Start;
> +  pthread_mutex_unlock (&mThreadMangle.Mutex);
> +
> +  // Mask all signals to the APs
> +  sigfillset (&SigMask);
> +  pthread_sigmask (SIG_BLOCK, &SigMask, NULL);
> +
> +  //
> +  // We have to start the thread in SEC as we need to follow
> +  // OS X calling conventions. We can then call back into
> +  // to the callers Start.
> +  //
> +  // This is a great example of how all problems in computer
> +  // science can be solved by adding another level of indirection
> +  //
> + return  (VOID *)ReverseGasketUint64 ((CALL_BACK)Start, (UINTN)Context);
> +}
> +
> +UINTN
> +PthreadCreate (
> +  IN  VOID                      *Thread,
> +  IN  VOID                      *Attribute,
> +  IN  THREAD_THUNK_THREAD_ENTRY Start,
> +  IN  VOID                      *Context
> +  )
> +{
> +  int         err;
> +  BOOLEAN     EnabledOnEntry;
> +
> +  //
> +  // Threads inherit interrupt state so disable interrupts before we start thread
> +  //
> +  if (SecInterruptEanbled ()) {
> +    SecDisableInterrupt ();
> +    EnabledOnEntry = TRUE;
> +  } else {
> +    EnabledOnEntry = FALSE;
> +  }
> +
> +  // Aquire lock for global, SecFakePthreadStart runs in a different thread.
> +  pthread_mutex_lock (&mThreadMangle.Mutex);
> +  mThreadMangle.Start   = Start;
> +
> +  err = pthread_create (Thread, Attribute, SecFakePthreadStart, Context);
> +  if (err != 0) {
> +    // Thread failed to launch so release the lock;
> +    pthread_mutex_unlock (&mThreadMangle.Mutex);
> +  }
> +
> +  if (EnabledOnEntry) {
> +    // Restore interrupt state
> +    SecEnableInterrupt ();
> +  }
> +
> +  return err;
> +}
> +
> +
> +VOID
> +PthreadExit (
> +  IN VOID *ValuePtr
> +  )
> +{
> +  pthread_exit (ValuePtr);
> +  return;
> +}
> +
> +
> +UINTN
> +PthreadSelf (
> +  VOID
> +  )
> +{
> +  // POSIX currently allows pthread_t to be a structure or arithmetic type.
> +  // Check out sys/types.h to make sure this will work if you are porting.
> +  // On OS X (Darwin) pthread_t is a pointer to a structure so this code works.
> +  return (UINTN)pthread_self ();
> +}
> +
> +
> +EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {
> +  GasketPthreadMutexLock,
> +  GasketPthreadMutexUnLock,
> +  GasketPthreadMutexTryLock,
> +  GasketPthreadMutexInit,
> +  GasketPthreadMutexDestroy,
> +  GasketPthreadCreate,
> +  GasketPthreadExit,
> +  GasketPthreadSelf
> +};
> +
> +
> +EFI_STATUS
> +PthreadOpen (
> +  IN  EMU_IO_THUNK_PROTOCOL   *This
> +  )
> +{
> +  if (This->Instance != 0) {
> +    // Only single instance is supported
> +    return EFI_NOT_FOUND;
> +  }
> +
> +  if (This->ConfigString[0] == L'0') {
> +    // If AP count is zero no need for threads
> +    return EFI_NOT_FOUND;
> +  }
> +
> +  This->Interface = &gPthreadThunk;
> +
> +  return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +PthreadClose (
> +  IN  EMU_IO_THUNK_PROTOCOL   *This
> +  )
> +{
> +  return EFI_SUCCESS;
> +}
> +
> +
> +EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {
> +  &gEmuThreadThunkProtocolGuid,
> +  NULL,
> +  NULL,
> +  0,
> +  GasketPthreadOpen,
> +  GasketPthreadClose,
> +  NULL
> +};
> +
> +
> diff --git a/EmulatorPkg/Unix/Host/X11GraphicsWindow.c
> b/EmulatorPkg/Unix/Host/X11GraphicsWindow.c
> index adb9b2b830..a3cc28c223 100644
> --- a/EmulatorPkg/Unix/Host/X11GraphicsWindow.c
> +++ b/EmulatorPkg/Unix/Host/X11GraphicsWindow.c
> @@ -1,1028 +1,1028 @@
> -/*++ @file
> -
> -Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
> -Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> -
> -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.
> -
> -**/
> -
> -#include "Host.h"
> -
> -#include <sys/ipc.h>
> -#include <sys/shm.h>
> -
> -#include <X11/Xlib.h>
> -#include <X11/Xutil.h>
> -#include <X11/Xos.h>
> -#include <X11/extensions/XShm.h>
> -#include <X11/keysym.h>
> -#include <X11/cursorfont.h>
> -
> -#define KEYSYM_LOWER  0
> -#define KEYSYM_UPPER  1
> -
> -
> -struct uga_drv_shift_mask {
> -  unsigned char shift;
> -  unsigned char size;
> -  unsigned char csize;
> -};
> -
> -#define NBR_KEYS 32
> -typedef struct {
> -  EMU_GRAPHICS_WINDOW_PROTOCOL GraphicsIo;
> -
> -  Display     *display;
> -  int         screen;      // values for window_size in main
> -  Window      win;
> -  GC          gc;
> -  Visual      *visual;
> -
> -  int           depth;
> -  unsigned int  width;
> -  unsigned int  height;
> -  unsigned int  line_bytes;
> -  unsigned int  pixel_shift;
> -  unsigned char *image_data;
> -
> -  struct uga_drv_shift_mask r, g, b;
> -
> -  int             use_shm;
> -  XShmSegmentInfo xshm_info;
> -  XImage          *image;
> -  char            *Title;
> -
> -  unsigned int key_rd;
> -  unsigned int key_wr;
> -  unsigned int key_count;
> -  EFI_KEY_DATA keys[NBR_KEYS];
> -
> -  EFI_KEY_STATE KeyState;
> -
> -  EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> MakeRegisterdKeyCallback;
> -  EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> BreakRegisterdKeyCallback;
> -  VOID                                                *RegisterdKeyCallbackContext;
> -
> -  int                        previous_x;
> -  int                        previous_y;
> -  EFI_SIMPLE_POINTER_STATE   pointer_state;
> -  int                        pointer_state_changed;
> -} GRAPHICS_IO_PRIVATE;
> -
> -void
> -HandleEvents(
> -  IN GRAPHICS_IO_PRIVATE *Drv
> -  );
> -
> -void
> -fill_shift_mask (
> -  IN  struct uga_drv_shift_mask *sm,
> -  IN  unsigned long             mask
> -  )
> -{
> -  sm->shift = 0;
> -  sm->size = 0;
> -  while ((mask & 1) == 0) {
> -    mask >>= 1;
> -    sm->shift++;
> -  }
> -  while (mask & 1) {
> -    sm->size++;
> -    mask >>= 1;
> -  }
> -  sm->csize = 8 - sm->size;
> -}
> -
> -int
> -TryCreateShmImage (
> -  IN  GRAPHICS_IO_PRIVATE *Drv
> -  )
> -{
> -  Drv->image = XShmCreateImage (
> -                 Drv->display, Drv->visual,
> -                 Drv->depth, ZPixmap, NULL, &Drv->xshm_info,
> -                 Drv->width, Drv->height
> -                 );
> -  if (Drv->image == NULL) {
> -    return 0;
> -  }
> -
> -  switch (Drv->image->bitmap_unit) {
> -  case 32:
> -    Drv->pixel_shift = 2;
> -    break;
> -  case 16:
> -    Drv->pixel_shift = 1;
> -    break;
> -  case 8:
> -    Drv->pixel_shift = 0;
> -    break;
> -  }
> -
> -  Drv->xshm_info.shmid = shmget (
> -                          IPC_PRIVATE, Drv->image->bytes_per_line * Drv->image-
> >height,
> -                          IPC_CREAT | 0777
> -                          );
> -  if (Drv->xshm_info.shmid < 0) {
> -    XDestroyImage(Drv->image);
> -    return 0;
> -  }
> -
> -  Drv->image_data = shmat (Drv->xshm_info.shmid, NULL, 0);
> -  if(!Drv->image_data) {
> -    shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
> -    XDestroyImage(Drv->image);
> -    return 0;
> -  }
> -
> -#ifndef __APPLE__
> -  //
> -  // This closes shared memory in real time on OS X. Only closes after folks quit
> using
> -  // it on Linux.
> -  //
> -  shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
> -#endif
> -
> -  Drv->xshm_info.shmaddr = (char*)Drv->image_data;
> -  Drv->image->data = (char*)Drv->image_data;
> -
> -  if (!XShmAttach (Drv->display, &Drv->xshm_info)) {
> -    shmdt (Drv->image_data);
> -    XDestroyImage(Drv->image);
> -    return 0;
> -  }
> -  return 1;
> -}
> -
> -
> -EFI_STATUS
> -X11Size (
> -  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsIo,
> -  IN  UINT32                        Width,
> -  IN  UINT32                        Height
> -  )
> -{
> -  GRAPHICS_IO_PRIVATE *Drv;
> -  XSizeHints          size_hints;
> -
> -  // Destroy current buffer if created.
> -  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> -  if (Drv->image != NULL) {
> -    // Before destroy buffer, need to make sure the buffer available for access.
> -    XDestroyImage (Drv->image);
> -
> -    if (Drv->use_shm) {
> -      shmdt (Drv->image_data);
> -    }
> -
> -    Drv->image_data = NULL;
> -    Drv->image = NULL;
> -  }
> -
> -  Drv->width = Width;
> -  Drv->height = Height;
> -  XResizeWindow (Drv->display, Drv->win, Width, Height);
> -
> -  // Allocate image.
> -  if (XShmQueryExtension(Drv->display) && TryCreateShmImage(Drv)) {
> -    Drv->use_shm = 1;
> -  } else {
> -    Drv->use_shm = 0;
> -    if (Drv->depth > 16) {
> -      Drv->pixel_shift = 2;
> -    } else if (Drv->depth > 8) {
> -      Drv->pixel_shift = 1;
> -    } else {
> -      Drv->pixel_shift = 0;
> -    }
> -
> -    Drv->image_data = malloc ((Drv->width * Drv->height) << Drv->pixel_shift);
> -    Drv->image = XCreateImage (
> -                    Drv->display, Drv->visual, Drv->depth,
> -                    ZPixmap, 0, (char *)Drv->image_data,
> -                    Drv->width, Drv->height,
> -                    8 << Drv->pixel_shift, 0
> -                    );
> -  }
> -
> -  Drv->line_bytes = Drv->image->bytes_per_line;
> -
> -  fill_shift_mask (&Drv->r, Drv->image->red_mask);
> -  fill_shift_mask (&Drv->g, Drv->image->green_mask);
> -  fill_shift_mask (&Drv->b, Drv->image->blue_mask);
> -
> -  // Set WM hints.
> -  size_hints.flags = PSize | PMinSize | PMaxSize;
> -  size_hints.min_width = size_hints.max_width = size_hints.base_width = Width;
> -  size_hints.min_height = size_hints.max_height = size_hints.base_height =
> Height;
> -  XSetWMNormalHints (Drv->display, Drv->win, &size_hints);
> -
> -  XMapWindow (Drv->display, Drv->win);
> -  HandleEvents (Drv);
> -  return EFI_SUCCESS;
> -}
> -
> -void
> -handleKeyEvent (
> -  IN  GRAPHICS_IO_PRIVATE *Drv,
> -  IN  XEvent              *ev,
> -  IN  BOOLEAN             Make
> -  )
> -{
> -  KeySym        *KeySym;
> -  EFI_KEY_DATA  KeyData;
> -  int           KeySymArraySize;
> -
> -  if (Make) {
> -    if (Drv->key_count == NBR_KEYS) {
> -      return;
> -    }
> -  }
> -
> -  // keycode is a physical key on the keyboard
> -  // KeySym is a mapping of a physical key
> -  // KeyboardMapping is the array of KeySym for a given keycode. key, shifted
> key, option key, command key, ...
> -  //
> -  // Returns an array of KeySymArraySize of KeySym for the keycode. [0] is
> lower case, [1] is upper case,
> -  // [2] and [3] are based on option and command modifiers. The problem we
> have is command V
> -  // could be mapped to a crazy Unicode character so the old scheme of
> returning a string.
> -  //
> -  KeySym = XGetKeyboardMapping (Drv->display, ev->xkey.keycode, 1,
> &KeySymArraySize);
> -
> -  KeyData.Key.ScanCode = 0;
> -  KeyData.Key.UnicodeChar = 0;
> -  KeyData.KeyState.KeyShiftState = 0;
> -
> -  //
> -  // Skipping EFI_SCROLL_LOCK_ACTIVE & EFI_NUM_LOCK_ACTIVE since they
> are not on Macs
> -  //
> -  if ((ev->xkey.state & LockMask) == 0) {
> -    Drv->KeyState.KeyToggleState &= ~EFI_CAPS_LOCK_ACTIVE;
> -  } else {
> -    if (Make) {
> -      Drv->KeyState.KeyToggleState |= EFI_CAPS_LOCK_ACTIVE;
> -    }
> -  }
> -
> -  // Skipping EFI_MENU_KEY_PRESSED and EFI_SYS_REQ_PRESSED
> -
> -  switch (*KeySym) {
> -  case XK_Control_R:
> -    if (Make) {
> -      Drv->KeyState.KeyShiftState |=  EFI_RIGHT_CONTROL_PRESSED;
> -    } else {
> -      Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_CONTROL_PRESSED;
> -    }
> -   break;
> -  case XK_Control_L:
> -    if (Make) {
> -      Drv->KeyState.KeyShiftState |=  EFI_LEFT_CONTROL_PRESSED;
> -    } else {
> -      Drv->KeyState.KeyShiftState &= ~EFI_LEFT_CONTROL_PRESSED;
> -    }
> -    break;
> -
> -  case XK_Shift_R:
> -    if (Make) {
> -      Drv->KeyState.KeyShiftState |=  EFI_RIGHT_SHIFT_PRESSED;
> -    } else {
> -      Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_SHIFT_PRESSED;
> -    }
> -    break;
> -  case XK_Shift_L:
> -    if (Make) {
> -      Drv->KeyState.KeyShiftState |=  EFI_LEFT_SHIFT_PRESSED;
> -    } else {
> -      Drv->KeyState.KeyShiftState &= ~EFI_LEFT_SHIFT_PRESSED;
> -    }
> -    break;
> -
> -  case XK_Mode_switch:
> -    if (Make) {
> -      Drv->KeyState.KeyShiftState |=  EFI_LEFT_ALT_PRESSED;
> -    } else {
> -      Drv->KeyState.KeyShiftState &= ~EFI_LEFT_ALT_PRESSED;
> -    }
> -    break;
> -
> -  case XK_Meta_R:
> -    if (Make) {
> -      Drv->KeyState.KeyShiftState |=  EFI_RIGHT_LOGO_PRESSED;
> -    } else {
> -      Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_LOGO_PRESSED;
> -    }
> -    break;
> -  case XK_Meta_L:
> -    if (Make) {
> -      Drv->KeyState.KeyShiftState |=  EFI_LEFT_LOGO_PRESSED;
> -    } else {
> -      Drv->KeyState.KeyShiftState &= ~EFI_LEFT_LOGO_PRESSED;
> -    }
> -    break;
> -
> -  case XK_KP_Home:
> -  case XK_Home:       KeyData.Key.ScanCode = SCAN_HOME;       break;
> -
> -  case XK_KP_End:
> -  case XK_End:        KeyData.Key.ScanCode = SCAN_END;        break;
> -
> -  case XK_KP_Left:
> -  case XK_Left:       KeyData.Key.ScanCode = SCAN_LEFT;       break;
> -
> -  case XK_KP_Right:
> -  case XK_Right:      KeyData.Key.ScanCode = SCAN_RIGHT;      break;
> -
> -  case XK_KP_Up:
> -  case XK_Up:         KeyData.Key.ScanCode = SCAN_UP;         break;
> -
> -  case XK_KP_Down:
> -  case XK_Down:       KeyData.Key.ScanCode = SCAN_DOWN;       break;
> -
> -  case XK_KP_Delete:
> -  case XK_Delete:       KeyData.Key.ScanCode = SCAN_DELETE;     break;
> -
> -  case XK_KP_Insert:
> -  case XK_Insert:     KeyData.Key.ScanCode = SCAN_INSERT;     break;
> -
> -  case XK_KP_Page_Up:
> -  case XK_Page_Up:    KeyData.Key.ScanCode = SCAN_PAGE_UP;    break;
> -
> -  case XK_KP_Page_Down:
> -  case XK_Page_Down:  KeyData.Key.ScanCode = SCAN_PAGE_DOWN;  break;
> -
> -  case XK_Escape:     KeyData.Key.ScanCode = SCAN_ESC;        break;
> -
> -  case XK_Pause:      KeyData.Key.ScanCode = SCAN_PAUSE;      break;
> -
> -  case XK_KP_F1:
> -  case XK_F1:   KeyData.Key.ScanCode = SCAN_F1;   break;
> -
> -  case XK_KP_F2:
> -  case XK_F2:   KeyData.Key.ScanCode = SCAN_F2;   break;
> -
> -  case XK_KP_F3:
> -  case XK_F3:   KeyData.Key.ScanCode = SCAN_F3;   break;
> -
> -  case XK_KP_F4:
> -  case XK_F4:   KeyData.Key.ScanCode = SCAN_F4;   break;
> -
> -  case XK_F5:   KeyData.Key.ScanCode = SCAN_F5;   break;
> -  case XK_F6:   KeyData.Key.ScanCode = SCAN_F6;   break;
> -  case XK_F7:   KeyData.Key.ScanCode = SCAN_F7;   break;
> -
> -  // Don't map into X11 by default on a Mac
> -  // System Preferences->Keyboard->Keyboard Shortcuts can be configured
> -  // to not use higher function keys as shortcuts and the will show up
> -  // in X11.
> -  case XK_F8:   KeyData.Key.ScanCode = SCAN_F8;   break;
> -  case XK_F9:   KeyData.Key.ScanCode = SCAN_F9;   break;
> -  case XK_F10:  KeyData.Key.ScanCode = SCAN_F10;  break;
> -
> -  case XK_F11:  KeyData.Key.ScanCode = SCAN_F11;  break;
> -  case XK_F12:  KeyData.Key.ScanCode = SCAN_F12;  break;
> -
> -  case XK_F13:  KeyData.Key.ScanCode = SCAN_F13;  break;
> -  case XK_F14:  KeyData.Key.ScanCode = SCAN_F14;  break;
> -  case XK_F15:  KeyData.Key.ScanCode = SCAN_F15;  break;
> -  case XK_F16:  KeyData.Key.ScanCode = SCAN_F16;  break;
> -  case XK_F17:  KeyData.Key.ScanCode = SCAN_F17;  break;
> -  case XK_F18:  KeyData.Key.ScanCode = SCAN_F18;  break;
> -  case XK_F19:  KeyData.Key.ScanCode = SCAN_F19;  break;
> -  case XK_F20:  KeyData.Key.ScanCode = SCAN_F20;  break;
> -  case XK_F21:  KeyData.Key.ScanCode = SCAN_F21;  break;
> -  case XK_F22:  KeyData.Key.ScanCode = SCAN_F22;  break;
> -  case XK_F23:  KeyData.Key.ScanCode = SCAN_F23;  break;
> -  case XK_F24:  KeyData.Key.ScanCode = SCAN_F24;  break;
> -
> -  // No mapping in X11
> -  //case XK_:   KeyData.Key.ScanCode = SCAN_MUTE;            break;
> -  //case XK_:   KeyData.Key.ScanCode = SCAN_VOLUME_UP;       break;
> -  //case XK_:   KeyData.Key.ScanCode = SCAN_VOLUME_DOWN;     break;
> -  //case XK_:   KeyData.Key.ScanCode = SCAN_BRIGHTNESS_UP;   break;
> -  //case XK_:   KeyData.Key.ScanCode = SCAN_BRIGHTNESS_DOWN; break;
> -  //case XK_:   KeyData.Key.ScanCode = SCAN_SUSPEND;         break;
> -  //case XK_:   KeyData.Key.ScanCode = SCAN_HIBERNATE;       break;
> -  //case XK_:   KeyData.Key.ScanCode = SCAN_TOGGLE_DISPLAY;  break;
> -  //case XK_:   KeyData.Key.ScanCode = SCAN_RECOVERY;        break;
> -  //case XK_:   KeyData.Key.ScanCode = SCAN_EJECT;           break;
> -
> -  case XK_BackSpace:  KeyData.Key.UnicodeChar = 0x0008; break;
> -
> -  case XK_KP_Tab:
> -  case XK_Tab:        KeyData.Key.UnicodeChar = 0x0009; break;
> -
> -  case XK_Linefeed:   KeyData.Key.UnicodeChar = 0x000a; break;
> -
> -  case XK_KP_Enter:
> -  case XK_Return:     KeyData.Key.UnicodeChar = 0x000d; break;
> -
> -  case XK_KP_Equal      : KeyData.Key.UnicodeChar = L'='; break;
> -  case XK_KP_Multiply   : KeyData.Key.UnicodeChar = L'*'; break;
> -  case XK_KP_Add        : KeyData.Key.UnicodeChar = L'+'; break;
> -  case XK_KP_Separator  : KeyData.Key.UnicodeChar = L'~'; break;
> -  case XK_KP_Subtract   : KeyData.Key.UnicodeChar = L'-'; break;
> -  case XK_KP_Decimal    : KeyData.Key.UnicodeChar = L'.'; break;
> -  case XK_KP_Divide     : KeyData.Key.UnicodeChar = L'/'; break;
> -
> -  case XK_KP_0    : KeyData.Key.UnicodeChar = L'0'; break;
> -  case XK_KP_1    : KeyData.Key.UnicodeChar = L'1'; break;
> -  case XK_KP_2    : KeyData.Key.UnicodeChar = L'2'; break;
> -  case XK_KP_3    : KeyData.Key.UnicodeChar = L'3'; break;
> -  case XK_KP_4    : KeyData.Key.UnicodeChar = L'4'; break;
> -  case XK_KP_5    : KeyData.Key.UnicodeChar = L'5'; break;
> -  case XK_KP_6    : KeyData.Key.UnicodeChar = L'6'; break;
> -  case XK_KP_7    : KeyData.Key.UnicodeChar = L'7'; break;
> -  case XK_KP_8    : KeyData.Key.UnicodeChar = L'8'; break;
> -  case XK_KP_9    : KeyData.Key.UnicodeChar = L'9'; break;
> -
> -  default:
> -    ;
> -  }
> -
> -  // The global state is our state
> -  KeyData.KeyState.KeyShiftState = Drv->KeyState.KeyShiftState;
> -  KeyData.KeyState.KeyToggleState = Drv->KeyState.KeyToggleState;
> -
> -  if (*KeySym < XK_BackSpace) {
> -    if (((Drv->KeyState.KeyShiftState & (EFI_LEFT_SHIFT_PRESSED |
> EFI_RIGHT_SHIFT_PRESSED)) != 0) ||
> -        ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) != 0) ) {
> -
> -      KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_UPPER];
> -
> -      // Per UEFI spec since we converted the Unicode clear the shift bits we
> pass up
> -      KeyData.KeyState.KeyShiftState &= ~(EFI_LEFT_SHIFT_PRESSED |
> EFI_RIGHT_SHIFT_PRESSED);
> -    } else {
> -      KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_LOWER];
> -    }
> -  } else {
> -    // XK_BackSpace is the start of XK_MISCELLANY. These are the XK_? keys we
> process in this file
> -    ;
> -  }
> -
> -  if (Make) {
> -    memcpy (&Drv->keys[Drv->key_wr], &KeyData, sizeof (EFI_KEY_DATA));
> -    Drv->key_wr = (Drv->key_wr + 1) % NBR_KEYS;
> -    Drv->key_count++;
> -    if (Drv->MakeRegisterdKeyCallback != NULL) {
> -      ReverseGasketUint64Uint64 (Drv->MakeRegisterdKeyCallback ,Drv-
> >RegisterdKeyCallbackContext, &KeyData);
> -    }
> -  } else {
> -    if (Drv->BreakRegisterdKeyCallback != NULL) {
> -      ReverseGasketUint64Uint64 (Drv->BreakRegisterdKeyCallback ,Drv-
> >RegisterdKeyCallbackContext, &KeyData);
> -    }
> -  }
> -}
> -
> -
> -void
> -handleMouseMoved(
> -  IN  GRAPHICS_IO_PRIVATE   *Drv,
> -  IN  XEvent                *ev
> -  )
> -{
> -  if (ev->xmotion.x != Drv->previous_x) {
> -    Drv->pointer_state.RelativeMovementX += ( ev->xmotion.x - Drv-
> >previous_x );
> -    Drv->previous_x = ev->xmotion.x;
> -    Drv->pointer_state_changed = 1;
> -  }
> -
> -  if (ev->xmotion.y != Drv->previous_y) {
> -    Drv->pointer_state.RelativeMovementY += ( ev->xmotion.y - Drv-
> >previous_y );
> -    Drv->previous_y = ev->xmotion.y;
> -    Drv->pointer_state_changed = 1;
> -  }
> -
> -  Drv->pointer_state.RelativeMovementZ = 0;
> -}
> -
> -void
> -handleMouseDown (
> -  IN  GRAPHICS_IO_PRIVATE *Drv,
> -  IN  XEvent              *ev,
> -  IN  BOOLEAN             Pressed
> -  )
> -{
> -  if (ev->xbutton.button == Button1) {
> -    Drv->pointer_state_changed = (Drv->pointer_state.LeftButton != Pressed);
> -    Drv->pointer_state.LeftButton = Pressed;
> -  }
> -  if ( ev->xbutton.button == Button2 ) {
> -    Drv->pointer_state_changed = (Drv->pointer_state.RightButton != Pressed);
> -    Drv->pointer_state.RightButton = Pressed;
> -  }
> -}
> -
> -void
> -Redraw (
> -  IN  GRAPHICS_IO_PRIVATE *Drv,
> -  IN  UINTN               X,
> -  IN  UINTN               Y,
> -  IN  UINTN               Width,
> -  IN  UINTN               Height
> -  )
> -{
> -  if (Drv->use_shm) {
> -    XShmPutImage (
> -      Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height,
> False
> -      );
> -  } else {
> -    XPutImage (
> -      Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height
> -      );
> -  }
> -  XFlush(Drv->display);
> -}
> -
> -void
> -HandleEvent(GRAPHICS_IO_PRIVATE *Drv, XEvent *ev)
> -{
> -  switch (ev->type) {
> -  case Expose:
> -    Redraw (Drv, ev->xexpose.x, ev->xexpose.y,
> -      ev->xexpose.width, ev->xexpose.height);
> -    break;
> -  case GraphicsExpose:
> -    Redraw (Drv, ev->xgraphicsexpose.x, ev->xgraphicsexpose.y,
> -      ev->xgraphicsexpose.width, ev->xgraphicsexpose.height);
> -    break;
> -  case KeyPress:
> -    handleKeyEvent (Drv, ev, TRUE);
> -    break;
> -  case KeyRelease:
> -    handleKeyEvent (Drv, ev, FALSE);
> -    break;
> -  case MappingNotify:
> -    XRefreshKeyboardMapping (&ev->xmapping);
> -    break;
> -  case MotionNotify:
> -    handleMouseMoved (Drv, ev);
> -    break;
> -  case ButtonPress:
> -    handleMouseDown (Drv, ev, TRUE);
> -  break;
> -  case ButtonRelease:
> -    handleMouseDown (Drv, ev, FALSE);
> -  break;
> -#if 0
> -  case DestroyNotify:
> -    XCloseDisplay (Drv->display);
> -    exit (1);
> -    break;
> -#endif
> -  case NoExpose:
> -  default:
> -    break;
> -  }
> -}
> -
> -void
> -HandleEvents (
> -  IN  GRAPHICS_IO_PRIVATE *Drv
> -  )
> -{
> -  XEvent ev;
> -
> -  while (XPending (Drv->display) != 0) {
> -    XNextEvent (Drv->display, &ev);
> -    HandleEvent (Drv, &ev);
> -  }
> -}
> -
> -unsigned long
> -X11PixelToColor (
> -  IN  GRAPHICS_IO_PRIVATE *Drv,
> -  IN  EFI_UGA_PIXEL       pixel
> -  )
> -{
> -  return ((pixel.Red   >> Drv->r.csize) << Drv->r.shift)
> -       | ((pixel.Green >> Drv->g.csize) << Drv->g.shift)
> -       | ((pixel.Blue  >> Drv->b.csize) << Drv->b.shift);
> -}
> -
> -EFI_UGA_PIXEL
> -X11ColorToPixel (
> -  IN  GRAPHICS_IO_PRIVATE *Drv,
> -  IN  unsigned long       val
> -  )
> -{
> -  EFI_UGA_PIXEL Pixel;
> -
> -  memset (&Pixel, 0, sizeof (EFI_UGA_PIXEL));
> -
> -  // Truncation not an issue since X11 and EFI are both using 8 bits per color
> -  Pixel.Red =   (val >> Drv->r.shift) << Drv->r.csize;
> -  Pixel.Green = (val >> Drv->g.shift) << Drv->g.csize;
> -  Pixel.Blue =  (val >> Drv->b.shift) << Drv->b.csize;
> -
> -  return Pixel;
> -}
> -
> -
> -EFI_STATUS
> -X11CheckKey (
> -  IN  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo
> -  )
> -{
> -  GRAPHICS_IO_PRIVATE  *Drv;
> -
> -  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> -
> -  HandleEvents (Drv);
> -
> -  if (Drv->key_count != 0) {
> -    return EFI_SUCCESS;
> -  }
> -
> -  return EFI_NOT_READY;
> -}
> -
> -EFI_STATUS
> -X11GetKey (
> -  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsIo,
> -  IN  EFI_KEY_DATA                  *KeyData
> -  )
> -{
> -  EFI_STATUS          EfiStatus;
> -  GRAPHICS_IO_PRIVATE *Drv;
> -
> -  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> -
> -  EfiStatus = X11CheckKey (GraphicsIo);
> -  if (EFI_ERROR (EfiStatus)) {
> -    return EfiStatus;
> -  }
> -
> -  CopyMem (KeyData, &Drv->keys[Drv->key_rd], sizeof (EFI_KEY_DATA));
> -  Drv->key_rd = (Drv->key_rd + 1) % NBR_KEYS;
> -  Drv->key_count--;
> -
> -  return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -X11KeySetState (
> -  IN EMU_GRAPHICS_WINDOW_PROTOCOL   *GraphicsIo,
> -  IN EFI_KEY_TOGGLE_STATE           *KeyToggleState
> -  )
> -{
> -  GRAPHICS_IO_PRIVATE  *Drv;
> -
> -  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> -
> -  if (*KeyToggleState & EFI_CAPS_LOCK_ACTIVE) {
> -    if ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) == 0) {
> -      //
> -      // We could create an XKeyEvent and send a XK_Caps_Lock to
> -      // the UGA/GOP Window
> -      //
> -    }
> -  }
> -
> -  Drv->KeyState.KeyToggleState = *KeyToggleState;
> -  return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -X11RegisterKeyNotify (
> -  IN EMU_GRAPHICS_WINDOW_PROTOCOL                        *GraphicsIo,
> -  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> MakeCallBack,
> -  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> BreakCallBack,
> -  IN VOID                                                *Context
> -  )
> -{
> -  GRAPHICS_IO_PRIVATE  *Drv;
> -
> -  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> -
> -  Drv->MakeRegisterdKeyCallback    = MakeCallBack;
> -  Drv->BreakRegisterdKeyCallback   = BreakCallBack;
> -  Drv->RegisterdKeyCallbackContext = Context;
> -
> -  return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -X11Blt (
> -  IN EMU_GRAPHICS_WINDOW_PROTOCOL             *GraphicsIo,
> -  IN  EFI_UGA_PIXEL                           *BltBuffer OPTIONAL,
> -  IN  EFI_UGA_BLT_OPERATION                   BltOperation,
> -  IN  EMU_GRAPHICS_WINDOWS__BLT_ARGS          *Args
> -  )
> -{
> -  GRAPHICS_IO_PRIVATE *Private;
> -  UINTN             DstY;
> -  UINTN             SrcY;
> -  UINTN             DstX;
> -  UINTN             SrcX;
> -  UINTN             Index;
> -  EFI_UGA_PIXEL     *Blt;
> -  UINT8             *Dst;
> -  UINT8             *Src;
> -  UINTN             Nbr;
> -  unsigned long     Color;
> -  XEvent            ev;
> -
> -  Private = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> -
> -
> -  //
> -  //  Check bounds
> -  //
> -  if (BltOperation == EfiUgaVideoToBltBuffer
> -      || BltOperation == EfiUgaVideoToVideo) {
> -    //
> -    // Source is Video.
> -    //
> -    if (Args->SourceY + Args->Height > Private->height) {
> -      return EFI_INVALID_PARAMETER;
> -    }
> -
> -    if (Args->SourceX + Args->Width > Private->width) {
> -      return EFI_INVALID_PARAMETER;
> -    }
> -  }
> -
> -  if (BltOperation == EfiUgaBltBufferToVideo
> -      || BltOperation == EfiUgaVideoToVideo
> -      || BltOperation == EfiUgaVideoFill) {
> -    //
> -    // Destination is Video
> -    //
> -    if (Args->DestinationY + Args->Height > Private->height) {
> -      return EFI_INVALID_PARAMETER;
> -    }
> -
> -    if (Args->DestinationX + Args->Width > Private->width) {
> -      return EFI_INVALID_PARAMETER;
> -    }
> -  }
> -
> -  switch (BltOperation) {
> -  case EfiUgaVideoToBltBuffer:
> -    Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->DestinationY * Args-
> >Delta) + Args->DestinationX * sizeof (EFI_UGA_PIXEL));
> -    Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);
> -    for (SrcY = Args->SourceY; SrcY < (Args->Height + Args->SourceY); SrcY++) {
> -      for (SrcX = Args->SourceX; SrcX < (Args->Width + Args->SourceX); SrcX++) {
> -        *Blt++ = X11ColorToPixel (Private, XGetPixel (Private->image, SrcX, SrcY));
> -      }
> -      Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);
> -    }
> -    break;
> -  case EfiUgaBltBufferToVideo:
> -    Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->SourceY * Args->Delta)
> + Args->SourceX * sizeof (EFI_UGA_PIXEL));
> -    Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);
> -    for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY);
> DstY++) {
> -      for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX);
> DstX++) {
> -        XPutPixel(Private->image, DstX, DstY, X11PixelToColor(Private, *Blt));
> -        Blt++;
> -      }
> -      Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);
> -    }
> -    break;
> -  case EfiUgaVideoToVideo:
> -    Dst = Private->image_data + (Args->DestinationX << Private->pixel_shift)
> -          + Args->DestinationY * Private->line_bytes;
> -    Src = Private->image_data + (Args->SourceX << Private->pixel_shift)
> -          + Args->SourceY * Private->line_bytes;
> -    Nbr = Args->Width << Private->pixel_shift;
> -    if (Args->DestinationY < Args->SourceY) {
> -      for (Index = 0; Index < Args->Height; Index++) {
> -        memcpy (Dst, Src, Nbr);
> -        Dst += Private->line_bytes;
> -        Src += Private->line_bytes;
> -      }
> -    } else {
> -      Dst += (Args->Height - 1) * Private->line_bytes;
> -      Src += (Args->Height - 1) * Private->line_bytes;
> -      for (Index = 0; Index < Args->Height; Index++) {
> -      //
> -      // Source and Destination Y may be equal, therefore Dst and Src may
> -      // overlap.
> -      //
> -      memmove (Dst, Src, Nbr);
> -      Dst -= Private->line_bytes;
> -      Src -= Private->line_bytes;
> -      }
> -    }
> -    break;
> -  case EfiUgaVideoFill:
> -    Color = X11PixelToColor(Private, *BltBuffer);
> -    for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY);
> DstY++) {
> -      for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX);
> DstX++) {
> -        XPutPixel(Private->image, DstX, DstY, Color);
> -      }
> -    }
> -    break;
> -  default:
> -    return EFI_INVALID_PARAMETER;
> -  }
> -
> -  //
> -  //  Refresh screen.
> -  //
> -  switch (BltOperation) {
> -  case EfiUgaVideoToVideo:
> -    XCopyArea(
> -      Private->display, Private->win, Private->win, Private->gc,
> -      Args->SourceX, Args->SourceY, Args->Width, Args->Height,
> -      Args->DestinationX, Args->DestinationY
> -      );
> -
> -    while (1) {
> -      XNextEvent (Private->display, &ev);
> -      HandleEvent (Private, &ev);
> -      if (ev.type == NoExpose || ev.type == GraphicsExpose) {
> -        break;
> -      }
> -    }
> -    break;
> -  case EfiUgaVideoFill:
> -    Color = X11PixelToColor (Private, *BltBuffer);
> -    XSetForeground (Private->display, Private->gc, Color);
> -    XFillRectangle (
> -      Private->display, Private->win, Private->gc,
> -      Args->DestinationX, Args->DestinationY, Args->Width, Args->Height
> -      );
> -    XFlush (Private->display);
> -    break;
> -  case EfiUgaBltBufferToVideo:
> -    Redraw (Private, Args->DestinationX, Args->DestinationY, Args->Width,
> Args->Height);
> -    break;
> -  default:
> -    break;
> -  }
> -  return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -X11CheckPointer (
> -  IN  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo
> -  )
> -{
> -  GRAPHICS_IO_PRIVATE  *Drv;
> -
> -  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> -
> -  HandleEvents (Drv);
> -  if (Drv->pointer_state_changed != 0) {
> -    return EFI_SUCCESS;
> -  }
> -
> -  return EFI_NOT_READY;
> -}
> -
> -
> -EFI_STATUS
> -X11GetPointerState (
> -  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsIo,
> -  IN  EFI_SIMPLE_POINTER_STATE      *State
> -  )
> -{
> -  EFI_STATUS          EfiStatus;
> -  GRAPHICS_IO_PRIVATE *Drv;
> -
> -  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> -
> -  EfiStatus = X11CheckPointer (GraphicsIo);
> -  if (EfiStatus != EFI_SUCCESS) {
> -    return EfiStatus;
> -  }
> -
> -  memcpy (State, &Drv->pointer_state, sizeof (EFI_SIMPLE_POINTER_STATE));
> -
> -  Drv->pointer_state.RelativeMovementX = 0;
> -  Drv->pointer_state.RelativeMovementY = 0;
> -  Drv->pointer_state.RelativeMovementZ = 0;
> -  Drv->pointer_state_changed = 0;
> -  return EFI_SUCCESS;
> -}
> -
> -
> -
> -EFI_STATUS
> -X11GraphicsWindowOpen (
> -  IN  EMU_IO_THUNK_PROTOCOL   *This
> -  )
> -{
> -  GRAPHICS_IO_PRIVATE *Drv;
> -  unsigned int        border_width = 0;
> -  char                *display_name = NULL;
> -
> -  Drv = (GRAPHICS_IO_PRIVATE *)calloc (1, sizeof (GRAPHICS_IO_PRIVATE));
> -  if (Drv == NULL) {
> -    return EFI_OUT_OF_RESOURCES;
> -  }
> -
> -  Drv->GraphicsIo.Size                = GasketX11Size;
> -  Drv->GraphicsIo.CheckKey            = GasketX11CheckKey;
> -  Drv->GraphicsIo.GetKey              = GasketX11GetKey;
> -  Drv->GraphicsIo.KeySetState         = GasketX11KeySetState;
> -  Drv->GraphicsIo.RegisterKeyNotify   = GasketX11RegisterKeyNotify;
> -  Drv->GraphicsIo.Blt                 = GasketX11Blt;
> -  Drv->GraphicsIo.CheckPointer        = GasketX11CheckPointer;
> -  Drv->GraphicsIo.GetPointerState     = GasketX11GetPointerState;
> -
> -
> -  Drv->key_count = 0;
> -  Drv->key_rd = 0;
> -  Drv->key_wr = 0;
> -  Drv->KeyState.KeyShiftState      = EFI_SHIFT_STATE_VALID;
> -  Drv->KeyState.KeyToggleState     = EFI_TOGGLE_STATE_VALID;
> -  Drv->MakeRegisterdKeyCallback    = NULL;
> -  Drv->BreakRegisterdKeyCallback   = NULL;
> -  Drv->RegisterdKeyCallbackContext = NULL;
> -
> -
> -  Drv->display = XOpenDisplay (display_name);
> -  if (Drv->display == NULL) {
> -    fprintf (stderr, "uga: cannot connect to X server %s\n", XDisplayName
> (display_name));
> -    free (Drv);
> -    return EFI_DEVICE_ERROR;
> -  }
> -  Drv->screen = DefaultScreen (Drv->display);
> -  Drv->visual = DefaultVisual (Drv->display, Drv->screen);
> -  Drv->win = XCreateSimpleWindow (
> -                Drv->display, RootWindow (Drv->display, Drv->screen),
> -                0, 0, 4, 4, border_width,
> -                WhitePixel (Drv->display, Drv->screen),
> -                BlackPixel (Drv->display, Drv->screen)
> -                );
> -
> -  Drv->depth = DefaultDepth (Drv->display, Drv->screen);
> -  XDefineCursor (Drv->display, Drv->win, XCreateFontCursor (Drv->display,
> XC_pirate));
> -
> -  Drv->Title = malloc (StrSize (This->ConfigString));
> -  UnicodeStrToAsciiStr (This->ConfigString, Drv->Title);
> -  XStoreName (Drv->display, Drv->win, Drv->Title);
> -
> -//  XAutoRepeatOff (Drv->display);
> -  XSelectInput (
> -    Drv->display, Drv->win,
> -    ExposureMask | KeyPressMask | KeyReleaseMask | PointerMotionMask |
> ButtonPressMask | ButtonReleaseMask
> -    );
> -  Drv->gc = DefaultGC (Drv->display, Drv->screen);
> -
> -  This->Private   = (VOID *)Drv;
> -  This->Interface = (VOID *)Drv;
> -  return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -X11GraphicsWindowClose (
> -  IN  EMU_IO_THUNK_PROTOCOL   *This
> -  )
> -{
> -  GRAPHICS_IO_PRIVATE *Drv;
> -
> -  Drv = (GRAPHICS_IO_PRIVATE *)This->Private;
> -
> -  if (Drv == NULL) {
> -    return EFI_SUCCESS;
> -  }
> -
> -  if (Drv->image != NULL) {
> -    XDestroyImage(Drv->image);
> -
> -    if (Drv->use_shm) {
> -      shmdt (Drv->image_data);
> -    }
> -
> -    Drv->image_data = NULL;
> -    Drv->image = NULL;
> -  }
> -  XDestroyWindow (Drv->display, Drv->win);
> -  XCloseDisplay (Drv->display);
> -
> -#ifdef __APPLE__
> -  // Free up the shared memory
> -  shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
> -#endif
> -
> -  free (Drv);
> -  return EFI_SUCCESS;
> -}
> -
> -
> -EMU_IO_THUNK_PROTOCOL gX11ThunkIo = {
> -  &gEmuGraphicsWindowProtocolGuid,
> -  NULL,
> -  NULL,
> -  0,
> -  GasketX11GraphicsWindowOpen,
> -  GasketX11GraphicsWindowClose,
> -  NULL
> -};
> -
> -
> +/*++ @file
> +
> +Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
> +Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> +
> +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.
> +
> +**/
> +
> +#include "Host.h"
> +
> +#include <sys/ipc.h>
> +#include <sys/shm.h>
> +
> +#include <X11/Xlib.h>
> +#include <X11/Xutil.h>
> +#include <X11/Xos.h>
> +#include <X11/extensions/XShm.h>
> +#include <X11/keysym.h>
> +#include <X11/cursorfont.h>
> +
> +#define KEYSYM_LOWER  0
> +#define KEYSYM_UPPER  1
> +
> +
> +struct uga_drv_shift_mask {
> +  unsigned char shift;
> +  unsigned char size;
> +  unsigned char csize;
> +};
> +
> +#define NBR_KEYS 32
> +typedef struct {
> +  EMU_GRAPHICS_WINDOW_PROTOCOL GraphicsIo;
> +
> +  Display     *display;
> +  int         screen;      // values for window_size in main
> +  Window      win;
> +  GC          gc;
> +  Visual      *visual;
> +
> +  int           depth;
> +  unsigned int  width;
> +  unsigned int  height;
> +  unsigned int  line_bytes;
> +  unsigned int  pixel_shift;
> +  unsigned char *image_data;
> +
> +  struct uga_drv_shift_mask r, g, b;
> +
> +  int             use_shm;
> +  XShmSegmentInfo xshm_info;
> +  XImage          *image;
> +  char            *Title;
> +
> +  unsigned int key_rd;
> +  unsigned int key_wr;
> +  unsigned int key_count;
> +  EFI_KEY_DATA keys[NBR_KEYS];
> +
> +  EFI_KEY_STATE KeyState;
> +
> +  EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> MakeRegisterdKeyCallback;
> +  EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> BreakRegisterdKeyCallback;
> +  VOID                                                *RegisterdKeyCallbackContext;
> +
> +  int                        previous_x;
> +  int                        previous_y;
> +  EFI_SIMPLE_POINTER_STATE   pointer_state;
> +  int                        pointer_state_changed;
> +} GRAPHICS_IO_PRIVATE;
> +
> +void
> +HandleEvents(
> +  IN GRAPHICS_IO_PRIVATE *Drv
> +  );
> +
> +void
> +fill_shift_mask (
> +  IN  struct uga_drv_shift_mask *sm,
> +  IN  unsigned long             mask
> +  )
> +{
> +  sm->shift = 0;
> +  sm->size = 0;
> +  while ((mask & 1) == 0) {
> +    mask >>= 1;
> +    sm->shift++;
> +  }
> +  while (mask & 1) {
> +    sm->size++;
> +    mask >>= 1;
> +  }
> +  sm->csize = 8 - sm->size;
> +}
> +
> +int
> +TryCreateShmImage (
> +  IN  GRAPHICS_IO_PRIVATE *Drv
> +  )
> +{
> +  Drv->image = XShmCreateImage (
> +                 Drv->display, Drv->visual,
> +                 Drv->depth, ZPixmap, NULL, &Drv->xshm_info,
> +                 Drv->width, Drv->height
> +                 );
> +  if (Drv->image == NULL) {
> +    return 0;
> +  }
> +
> +  switch (Drv->image->bitmap_unit) {
> +  case 32:
> +    Drv->pixel_shift = 2;
> +    break;
> +  case 16:
> +    Drv->pixel_shift = 1;
> +    break;
> +  case 8:
> +    Drv->pixel_shift = 0;
> +    break;
> +  }
> +
> +  Drv->xshm_info.shmid = shmget (
> +                          IPC_PRIVATE, Drv->image->bytes_per_line * Drv->image-
> >height,
> +                          IPC_CREAT | 0777
> +                          );
> +  if (Drv->xshm_info.shmid < 0) {
> +    XDestroyImage(Drv->image);
> +    return 0;
> +  }
> +
> +  Drv->image_data = shmat (Drv->xshm_info.shmid, NULL, 0);
> +  if(!Drv->image_data) {
> +    shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
> +    XDestroyImage(Drv->image);
> +    return 0;
> +  }
> +
> +#ifndef __APPLE__
> +  //
> +  // This closes shared memory in real time on OS X. Only closes after folks
> quit using
> +  // it on Linux.
> +  //
> +  shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
> +#endif
> +
> +  Drv->xshm_info.shmaddr = (char*)Drv->image_data;
> +  Drv->image->data = (char*)Drv->image_data;
> +
> +  if (!XShmAttach (Drv->display, &Drv->xshm_info)) {
> +    shmdt (Drv->image_data);
> +    XDestroyImage(Drv->image);
> +    return 0;
> +  }
> +  return 1;
> +}
> +
> +
> +EFI_STATUS
> +X11Size (
> +  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsIo,
> +  IN  UINT32                        Width,
> +  IN  UINT32                        Height
> +  )
> +{
> +  GRAPHICS_IO_PRIVATE *Drv;
> +  XSizeHints          size_hints;
> +
> +  // Destroy current buffer if created.
> +  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> +  if (Drv->image != NULL) {
> +    // Before destroy buffer, need to make sure the buffer available for access.
> +    XDestroyImage (Drv->image);
> +
> +    if (Drv->use_shm) {
> +      shmdt (Drv->image_data);
> +    }
> +
> +    Drv->image_data = NULL;
> +    Drv->image = NULL;
> +  }
> +
> +  Drv->width = Width;
> +  Drv->height = Height;
> +  XResizeWindow (Drv->display, Drv->win, Width, Height);
> +
> +  // Allocate image.
> +  if (XShmQueryExtension(Drv->display) && TryCreateShmImage(Drv)) {
> +    Drv->use_shm = 1;
> +  } else {
> +    Drv->use_shm = 0;
> +    if (Drv->depth > 16) {
> +      Drv->pixel_shift = 2;
> +    } else if (Drv->depth > 8) {
> +      Drv->pixel_shift = 1;
> +    } else {
> +      Drv->pixel_shift = 0;
> +    }
> +
> +    Drv->image_data = malloc ((Drv->width * Drv->height) << Drv->pixel_shift);
> +    Drv->image = XCreateImage (
> +                    Drv->display, Drv->visual, Drv->depth,
> +                    ZPixmap, 0, (char *)Drv->image_data,
> +                    Drv->width, Drv->height,
> +                    8 << Drv->pixel_shift, 0
> +                    );
> +  }
> +
> +  Drv->line_bytes = Drv->image->bytes_per_line;
> +
> +  fill_shift_mask (&Drv->r, Drv->image->red_mask);
> +  fill_shift_mask (&Drv->g, Drv->image->green_mask);
> +  fill_shift_mask (&Drv->b, Drv->image->blue_mask);
> +
> +  // Set WM hints.
> +  size_hints.flags = PSize | PMinSize | PMaxSize;
> +  size_hints.min_width = size_hints.max_width = size_hints.base_width = Width;
> +  size_hints.min_height = size_hints.max_height = size_hints.base_height =
> Height;
> +  XSetWMNormalHints (Drv->display, Drv->win, &size_hints);
> +
> +  XMapWindow (Drv->display, Drv->win);
> +  HandleEvents (Drv);
> +  return EFI_SUCCESS;
> +}
> +
> +void
> +handleKeyEvent (
> +  IN  GRAPHICS_IO_PRIVATE *Drv,
> +  IN  XEvent              *ev,
> +  IN  BOOLEAN             Make
> +  )
> +{
> +  KeySym        *KeySym;
> +  EFI_KEY_DATA  KeyData;
> +  int           KeySymArraySize;
> +
> +  if (Make) {
> +    if (Drv->key_count == NBR_KEYS) {
> +      return;
> +    }
> +  }
> +
> +  // keycode is a physical key on the keyboard
> +  // KeySym is a mapping of a physical key
> +  // KeyboardMapping is the array of KeySym for a given keycode. key, shifted
> key, option key, command key, ...
> +  //
> +  // Returns an array of KeySymArraySize of KeySym for the keycode. [0] is
> lower case, [1] is upper case,
> +  // [2] and [3] are based on option and command modifiers. The problem we
> have is command V
> +  // could be mapped to a crazy Unicode character so the old scheme of
> returning a string.
> +  //
> +  KeySym = XGetKeyboardMapping (Drv->display, ev->xkey.keycode, 1,
> &KeySymArraySize);
> +
> +  KeyData.Key.ScanCode = 0;
> +  KeyData.Key.UnicodeChar = 0;
> +  KeyData.KeyState.KeyShiftState = 0;
> +
> +  //
> +  // Skipping EFI_SCROLL_LOCK_ACTIVE & EFI_NUM_LOCK_ACTIVE since they
> are not on Macs
> +  //
> +  if ((ev->xkey.state & LockMask) == 0) {
> +    Drv->KeyState.KeyToggleState &= ~EFI_CAPS_LOCK_ACTIVE;
> +  } else {
> +    if (Make) {
> +      Drv->KeyState.KeyToggleState |= EFI_CAPS_LOCK_ACTIVE;
> +    }
> +  }
> +
> +  // Skipping EFI_MENU_KEY_PRESSED and EFI_SYS_REQ_PRESSED
> +
> +  switch (*KeySym) {
> +  case XK_Control_R:
> +    if (Make) {
> +      Drv->KeyState.KeyShiftState |=  EFI_RIGHT_CONTROL_PRESSED;
> +    } else {
> +      Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_CONTROL_PRESSED;
> +    }
> +   break;
> +  case XK_Control_L:
> +    if (Make) {
> +      Drv->KeyState.KeyShiftState |=  EFI_LEFT_CONTROL_PRESSED;
> +    } else {
> +      Drv->KeyState.KeyShiftState &= ~EFI_LEFT_CONTROL_PRESSED;
> +    }
> +    break;
> +
> +  case XK_Shift_R:
> +    if (Make) {
> +      Drv->KeyState.KeyShiftState |=  EFI_RIGHT_SHIFT_PRESSED;
> +    } else {
> +      Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_SHIFT_PRESSED;
> +    }
> +    break;
> +  case XK_Shift_L:
> +    if (Make) {
> +      Drv->KeyState.KeyShiftState |=  EFI_LEFT_SHIFT_PRESSED;
> +    } else {
> +      Drv->KeyState.KeyShiftState &= ~EFI_LEFT_SHIFT_PRESSED;
> +    }
> +    break;
> +
> +  case XK_Mode_switch:
> +    if (Make) {
> +      Drv->KeyState.KeyShiftState |=  EFI_LEFT_ALT_PRESSED;
> +    } else {
> +      Drv->KeyState.KeyShiftState &= ~EFI_LEFT_ALT_PRESSED;
> +    }
> +    break;
> +
> +  case XK_Meta_R:
> +    if (Make) {
> +      Drv->KeyState.KeyShiftState |=  EFI_RIGHT_LOGO_PRESSED;
> +    } else {
> +      Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_LOGO_PRESSED;
> +    }
> +    break;
> +  case XK_Meta_L:
> +    if (Make) {
> +      Drv->KeyState.KeyShiftState |=  EFI_LEFT_LOGO_PRESSED;
> +    } else {
> +      Drv->KeyState.KeyShiftState &= ~EFI_LEFT_LOGO_PRESSED;
> +    }
> +    break;
> +
> +  case XK_KP_Home:
> +  case XK_Home:       KeyData.Key.ScanCode = SCAN_HOME;       break;
> +
> +  case XK_KP_End:
> +  case XK_End:        KeyData.Key.ScanCode = SCAN_END;        break;
> +
> +  case XK_KP_Left:
> +  case XK_Left:       KeyData.Key.ScanCode = SCAN_LEFT;       break;
> +
> +  case XK_KP_Right:
> +  case XK_Right:      KeyData.Key.ScanCode = SCAN_RIGHT;      break;
> +
> +  case XK_KP_Up:
> +  case XK_Up:         KeyData.Key.ScanCode = SCAN_UP;         break;
> +
> +  case XK_KP_Down:
> +  case XK_Down:       KeyData.Key.ScanCode = SCAN_DOWN;       break;
> +
> +  case XK_KP_Delete:
> +  case XK_Delete:       KeyData.Key.ScanCode = SCAN_DELETE;     break;
> +
> +  case XK_KP_Insert:
> +  case XK_Insert:     KeyData.Key.ScanCode = SCAN_INSERT;     break;
> +
> +  case XK_KP_Page_Up:
> +  case XK_Page_Up:    KeyData.Key.ScanCode = SCAN_PAGE_UP;    break;
> +
> +  case XK_KP_Page_Down:
> +  case XK_Page_Down:  KeyData.Key.ScanCode = SCAN_PAGE_DOWN;  break;
> +
> +  case XK_Escape:     KeyData.Key.ScanCode = SCAN_ESC;        break;
> +
> +  case XK_Pause:      KeyData.Key.ScanCode = SCAN_PAUSE;      break;
> +
> +  case XK_KP_F1:
> +  case XK_F1:   KeyData.Key.ScanCode = SCAN_F1;   break;
> +
> +  case XK_KP_F2:
> +  case XK_F2:   KeyData.Key.ScanCode = SCAN_F2;   break;
> +
> +  case XK_KP_F3:
> +  case XK_F3:   KeyData.Key.ScanCode = SCAN_F3;   break;
> +
> +  case XK_KP_F4:
> +  case XK_F4:   KeyData.Key.ScanCode = SCAN_F4;   break;
> +
> +  case XK_F5:   KeyData.Key.ScanCode = SCAN_F5;   break;
> +  case XK_F6:   KeyData.Key.ScanCode = SCAN_F6;   break;
> +  case XK_F7:   KeyData.Key.ScanCode = SCAN_F7;   break;
> +
> +  // Don't map into X11 by default on a Mac
> +  // System Preferences->Keyboard->Keyboard Shortcuts can be configured
> +  // to not use higher function keys as shortcuts and the will show up
> +  // in X11.
> +  case XK_F8:   KeyData.Key.ScanCode = SCAN_F8;   break;
> +  case XK_F9:   KeyData.Key.ScanCode = SCAN_F9;   break;
> +  case XK_F10:  KeyData.Key.ScanCode = SCAN_F10;  break;
> +
> +  case XK_F11:  KeyData.Key.ScanCode = SCAN_F11;  break;
> +  case XK_F12:  KeyData.Key.ScanCode = SCAN_F12;  break;
> +
> +  case XK_F13:  KeyData.Key.ScanCode = SCAN_F13;  break;
> +  case XK_F14:  KeyData.Key.ScanCode = SCAN_F14;  break;
> +  case XK_F15:  KeyData.Key.ScanCode = SCAN_F15;  break;
> +  case XK_F16:  KeyData.Key.ScanCode = SCAN_F16;  break;
> +  case XK_F17:  KeyData.Key.ScanCode = SCAN_F17;  break;
> +  case XK_F18:  KeyData.Key.ScanCode = SCAN_F18;  break;
> +  case XK_F19:  KeyData.Key.ScanCode = SCAN_F19;  break;
> +  case XK_F20:  KeyData.Key.ScanCode = SCAN_F20;  break;
> +  case XK_F21:  KeyData.Key.ScanCode = SCAN_F21;  break;
> +  case XK_F22:  KeyData.Key.ScanCode = SCAN_F22;  break;
> +  case XK_F23:  KeyData.Key.ScanCode = SCAN_F23;  break;
> +  case XK_F24:  KeyData.Key.ScanCode = SCAN_F24;  break;
> +
> +  // No mapping in X11
> +  //case XK_:   KeyData.Key.ScanCode = SCAN_MUTE;            break;
> +  //case XK_:   KeyData.Key.ScanCode = SCAN_VOLUME_UP;       break;
> +  //case XK_:   KeyData.Key.ScanCode = SCAN_VOLUME_DOWN;     break;
> +  //case XK_:   KeyData.Key.ScanCode = SCAN_BRIGHTNESS_UP;   break;
> +  //case XK_:   KeyData.Key.ScanCode = SCAN_BRIGHTNESS_DOWN; break;
> +  //case XK_:   KeyData.Key.ScanCode = SCAN_SUSPEND;         break;
> +  //case XK_:   KeyData.Key.ScanCode = SCAN_HIBERNATE;       break;
> +  //case XK_:   KeyData.Key.ScanCode = SCAN_TOGGLE_DISPLAY;  break;
> +  //case XK_:   KeyData.Key.ScanCode = SCAN_RECOVERY;        break;
> +  //case XK_:   KeyData.Key.ScanCode = SCAN_EJECT;           break;
> +
> +  case XK_BackSpace:  KeyData.Key.UnicodeChar = 0x0008; break;
> +
> +  case XK_KP_Tab:
> +  case XK_Tab:        KeyData.Key.UnicodeChar = 0x0009; break;
> +
> +  case XK_Linefeed:   KeyData.Key.UnicodeChar = 0x000a; break;
> +
> +  case XK_KP_Enter:
> +  case XK_Return:     KeyData.Key.UnicodeChar = 0x000d; break;
> +
> +  case XK_KP_Equal      : KeyData.Key.UnicodeChar = L'='; break;
> +  case XK_KP_Multiply   : KeyData.Key.UnicodeChar = L'*'; break;
> +  case XK_KP_Add        : KeyData.Key.UnicodeChar = L'+'; break;
> +  case XK_KP_Separator  : KeyData.Key.UnicodeChar = L'~'; break;
> +  case XK_KP_Subtract   : KeyData.Key.UnicodeChar = L'-'; break;
> +  case XK_KP_Decimal    : KeyData.Key.UnicodeChar = L'.'; break;
> +  case XK_KP_Divide     : KeyData.Key.UnicodeChar = L'/'; break;
> +
> +  case XK_KP_0    : KeyData.Key.UnicodeChar = L'0'; break;
> +  case XK_KP_1    : KeyData.Key.UnicodeChar = L'1'; break;
> +  case XK_KP_2    : KeyData.Key.UnicodeChar = L'2'; break;
> +  case XK_KP_3    : KeyData.Key.UnicodeChar = L'3'; break;
> +  case XK_KP_4    : KeyData.Key.UnicodeChar = L'4'; break;
> +  case XK_KP_5    : KeyData.Key.UnicodeChar = L'5'; break;
> +  case XK_KP_6    : KeyData.Key.UnicodeChar = L'6'; break;
> +  case XK_KP_7    : KeyData.Key.UnicodeChar = L'7'; break;
> +  case XK_KP_8    : KeyData.Key.UnicodeChar = L'8'; break;
> +  case XK_KP_9    : KeyData.Key.UnicodeChar = L'9'; break;
> +
> +  default:
> +    ;
> +  }
> +
> +  // The global state is our state
> +  KeyData.KeyState.KeyShiftState = Drv->KeyState.KeyShiftState;
> +  KeyData.KeyState.KeyToggleState = Drv->KeyState.KeyToggleState;
> +
> +  if (*KeySym < XK_BackSpace) {
> +    if (((Drv->KeyState.KeyShiftState & (EFI_LEFT_SHIFT_PRESSED |
> EFI_RIGHT_SHIFT_PRESSED)) != 0) ||
> +        ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) != 0) ) {
> +
> +      KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_UPPER];
> +
> +      // Per UEFI spec since we converted the Unicode clear the shift bits we
> pass up
> +      KeyData.KeyState.KeyShiftState &= ~(EFI_LEFT_SHIFT_PRESSED |
> EFI_RIGHT_SHIFT_PRESSED);
> +    } else {
> +      KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_LOWER];
> +    }
> +  } else {
> +    // XK_BackSpace is the start of XK_MISCELLANY. These are the XK_? keys
> we process in this file
> +    ;
> +  }
> +
> +  if (Make) {
> +    memcpy (&Drv->keys[Drv->key_wr], &KeyData, sizeof (EFI_KEY_DATA));
> +    Drv->key_wr = (Drv->key_wr + 1) % NBR_KEYS;
> +    Drv->key_count++;
> +    if (Drv->MakeRegisterdKeyCallback != NULL) {
> +      ReverseGasketUint64Uint64 (Drv->MakeRegisterdKeyCallback ,Drv-
> >RegisterdKeyCallbackContext, &KeyData);
> +    }
> +  } else {
> +    if (Drv->BreakRegisterdKeyCallback != NULL) {
> +      ReverseGasketUint64Uint64 (Drv->BreakRegisterdKeyCallback ,Drv-
> >RegisterdKeyCallbackContext, &KeyData);
> +    }
> +  }
> +}
> +
> +
> +void
> +handleMouseMoved(
> +  IN  GRAPHICS_IO_PRIVATE   *Drv,
> +  IN  XEvent                *ev
> +  )
> +{
> +  if (ev->xmotion.x != Drv->previous_x) {
> +    Drv->pointer_state.RelativeMovementX += ( ev->xmotion.x - Drv-
> >previous_x );
> +    Drv->previous_x = ev->xmotion.x;
> +    Drv->pointer_state_changed = 1;
> +  }
> +
> +  if (ev->xmotion.y != Drv->previous_y) {
> +    Drv->pointer_state.RelativeMovementY += ( ev->xmotion.y - Drv-
> >previous_y );
> +    Drv->previous_y = ev->xmotion.y;
> +    Drv->pointer_state_changed = 1;
> +  }
> +
> +  Drv->pointer_state.RelativeMovementZ = 0;
> +}
> +
> +void
> +handleMouseDown (
> +  IN  GRAPHICS_IO_PRIVATE *Drv,
> +  IN  XEvent              *ev,
> +  IN  BOOLEAN             Pressed
> +  )
> +{
> +  if (ev->xbutton.button == Button1) {
> +    Drv->pointer_state_changed = (Drv->pointer_state.LeftButton != Pressed);
> +    Drv->pointer_state.LeftButton = Pressed;
> +  }
> +  if ( ev->xbutton.button == Button2 ) {
> +    Drv->pointer_state_changed = (Drv->pointer_state.RightButton != Pressed);
> +    Drv->pointer_state.RightButton = Pressed;
> +  }
> +}
> +
> +void
> +Redraw (
> +  IN  GRAPHICS_IO_PRIVATE *Drv,
> +  IN  UINTN               X,
> +  IN  UINTN               Y,
> +  IN  UINTN               Width,
> +  IN  UINTN               Height
> +  )
> +{
> +  if (Drv->use_shm) {
> +    XShmPutImage (
> +      Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height,
> False
> +      );
> +  } else {
> +    XPutImage (
> +      Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height
> +      );
> +  }
> +  XFlush(Drv->display);
> +}
> +
> +void
> +HandleEvent(GRAPHICS_IO_PRIVATE *Drv, XEvent *ev)
> +{
> +  switch (ev->type) {
> +  case Expose:
> +    Redraw (Drv, ev->xexpose.x, ev->xexpose.y,
> +      ev->xexpose.width, ev->xexpose.height);
> +    break;
> +  case GraphicsExpose:
> +    Redraw (Drv, ev->xgraphicsexpose.x, ev->xgraphicsexpose.y,
> +      ev->xgraphicsexpose.width, ev->xgraphicsexpose.height);
> +    break;
> +  case KeyPress:
> +    handleKeyEvent (Drv, ev, TRUE);
> +    break;
> +  case KeyRelease:
> +    handleKeyEvent (Drv, ev, FALSE);
> +    break;
> +  case MappingNotify:
> +    XRefreshKeyboardMapping (&ev->xmapping);
> +    break;
> +  case MotionNotify:
> +    handleMouseMoved (Drv, ev);
> +    break;
> +  case ButtonPress:
> +    handleMouseDown (Drv, ev, TRUE);
> +  break;
> +  case ButtonRelease:
> +    handleMouseDown (Drv, ev, FALSE);
> +  break;
> +#if 0
> +  case DestroyNotify:
> +    XCloseDisplay (Drv->display);
> +    exit (1);
> +    break;
> +#endif
> +  case NoExpose:
> +  default:
> +    break;
> +  }
> +}
> +
> +void
> +HandleEvents (
> +  IN  GRAPHICS_IO_PRIVATE *Drv
> +  )
> +{
> +  XEvent ev;
> +
> +  while (XPending (Drv->display) != 0) {
> +    XNextEvent (Drv->display, &ev);
> +    HandleEvent (Drv, &ev);
> +  }
> +}
> +
> +unsigned long
> +X11PixelToColor (
> +  IN  GRAPHICS_IO_PRIVATE *Drv,
> +  IN  EFI_UGA_PIXEL       pixel
> +  )
> +{
> +  return ((pixel.Red   >> Drv->r.csize) << Drv->r.shift)
> +       | ((pixel.Green >> Drv->g.csize) << Drv->g.shift)
> +       | ((pixel.Blue  >> Drv->b.csize) << Drv->b.shift);
> +}
> +
> +EFI_UGA_PIXEL
> +X11ColorToPixel (
> +  IN  GRAPHICS_IO_PRIVATE *Drv,
> +  IN  unsigned long       val
> +  )
> +{
> +  EFI_UGA_PIXEL Pixel;
> +
> +  memset (&Pixel, 0, sizeof (EFI_UGA_PIXEL));
> +
> +  // Truncation not an issue since X11 and EFI are both using 8 bits per color
> +  Pixel.Red =   (val >> Drv->r.shift) << Drv->r.csize;
> +  Pixel.Green = (val >> Drv->g.shift) << Drv->g.csize;
> +  Pixel.Blue =  (val >> Drv->b.shift) << Drv->b.csize;
> +
> +  return Pixel;
> +}
> +
> +
> +EFI_STATUS
> +X11CheckKey (
> +  IN  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo
> +  )
> +{
> +  GRAPHICS_IO_PRIVATE  *Drv;
> +
> +  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> +
> +  HandleEvents (Drv);
> +
> +  if (Drv->key_count != 0) {
> +    return EFI_SUCCESS;
> +  }
> +
> +  return EFI_NOT_READY;
> +}
> +
> +EFI_STATUS
> +X11GetKey (
> +  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsIo,
> +  IN  EFI_KEY_DATA                  *KeyData
> +  )
> +{
> +  EFI_STATUS          EfiStatus;
> +  GRAPHICS_IO_PRIVATE *Drv;
> +
> +  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> +
> +  EfiStatus = X11CheckKey (GraphicsIo);
> +  if (EFI_ERROR (EfiStatus)) {
> +    return EfiStatus;
> +  }
> +
> +  CopyMem (KeyData, &Drv->keys[Drv->key_rd], sizeof (EFI_KEY_DATA));
> +  Drv->key_rd = (Drv->key_rd + 1) % NBR_KEYS;
> +  Drv->key_count--;
> +
> +  return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +X11KeySetState (
> +  IN EMU_GRAPHICS_WINDOW_PROTOCOL   *GraphicsIo,
> +  IN EFI_KEY_TOGGLE_STATE           *KeyToggleState
> +  )
> +{
> +  GRAPHICS_IO_PRIVATE  *Drv;
> +
> +  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> +
> +  if (*KeyToggleState & EFI_CAPS_LOCK_ACTIVE) {
> +    if ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) == 0) {
> +      //
> +      // We could create an XKeyEvent and send a XK_Caps_Lock to
> +      // the UGA/GOP Window
> +      //
> +    }
> +  }
> +
> +  Drv->KeyState.KeyToggleState = *KeyToggleState;
> +  return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +X11RegisterKeyNotify (
> +  IN EMU_GRAPHICS_WINDOW_PROTOCOL                        *GraphicsIo,
> +  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> MakeCallBack,
> +  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> BreakCallBack,
> +  IN VOID                                                *Context
> +  )
> +{
> +  GRAPHICS_IO_PRIVATE  *Drv;
> +
> +  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> +
> +  Drv->MakeRegisterdKeyCallback    = MakeCallBack;
> +  Drv->BreakRegisterdKeyCallback   = BreakCallBack;
> +  Drv->RegisterdKeyCallbackContext = Context;
> +
> +  return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +X11Blt (
> +  IN EMU_GRAPHICS_WINDOW_PROTOCOL             *GraphicsIo,
> +  IN  EFI_UGA_PIXEL                           *BltBuffer OPTIONAL,
> +  IN  EFI_UGA_BLT_OPERATION                   BltOperation,
> +  IN  EMU_GRAPHICS_WINDOWS__BLT_ARGS          *Args
> +  )
> +{
> +  GRAPHICS_IO_PRIVATE *Private;
> +  UINTN             DstY;
> +  UINTN             SrcY;
> +  UINTN             DstX;
> +  UINTN             SrcX;
> +  UINTN             Index;
> +  EFI_UGA_PIXEL     *Blt;
> +  UINT8             *Dst;
> +  UINT8             *Src;
> +  UINTN             Nbr;
> +  unsigned long     Color;
> +  XEvent            ev;
> +
> +  Private = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> +
> +
> +  //
> +  //  Check bounds
> +  //
> +  if (BltOperation == EfiUgaVideoToBltBuffer
> +      || BltOperation == EfiUgaVideoToVideo) {
> +    //
> +    // Source is Video.
> +    //
> +    if (Args->SourceY + Args->Height > Private->height) {
> +      return EFI_INVALID_PARAMETER;
> +    }
> +
> +    if (Args->SourceX + Args->Width > Private->width) {
> +      return EFI_INVALID_PARAMETER;
> +    }
> +  }
> +
> +  if (BltOperation == EfiUgaBltBufferToVideo
> +      || BltOperation == EfiUgaVideoToVideo
> +      || BltOperation == EfiUgaVideoFill) {
> +    //
> +    // Destination is Video
> +    //
> +    if (Args->DestinationY + Args->Height > Private->height) {
> +      return EFI_INVALID_PARAMETER;
> +    }
> +
> +    if (Args->DestinationX + Args->Width > Private->width) {
> +      return EFI_INVALID_PARAMETER;
> +    }
> +  }
> +
> +  switch (BltOperation) {
> +  case EfiUgaVideoToBltBuffer:
> +    Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->DestinationY * Args-
> >Delta) + Args->DestinationX * sizeof (EFI_UGA_PIXEL));
> +    Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);
> +    for (SrcY = Args->SourceY; SrcY < (Args->Height + Args->SourceY); SrcY++) {
> +      for (SrcX = Args->SourceX; SrcX < (Args->Width + Args->SourceX); SrcX++) {
> +        *Blt++ = X11ColorToPixel (Private, XGetPixel (Private->image, SrcX,
> SrcY));
> +      }
> +      Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);
> +    }
> +    break;
> +  case EfiUgaBltBufferToVideo:
> +    Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->SourceY * Args->Delta)
> + Args->SourceX * sizeof (EFI_UGA_PIXEL));
> +    Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);
> +    for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY);
> DstY++) {
> +      for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX);
> DstX++) {
> +        XPutPixel(Private->image, DstX, DstY, X11PixelToColor(Private, *Blt));
> +        Blt++;
> +      }
> +      Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);
> +    }
> +    break;
> +  case EfiUgaVideoToVideo:
> +    Dst = Private->image_data + (Args->DestinationX << Private->pixel_shift)
> +          + Args->DestinationY * Private->line_bytes;
> +    Src = Private->image_data + (Args->SourceX << Private->pixel_shift)
> +          + Args->SourceY * Private->line_bytes;
> +    Nbr = Args->Width << Private->pixel_shift;
> +    if (Args->DestinationY < Args->SourceY) {
> +      for (Index = 0; Index < Args->Height; Index++) {
> +        memcpy (Dst, Src, Nbr);
> +        Dst += Private->line_bytes;
> +        Src += Private->line_bytes;
> +      }
> +    } else {
> +      Dst += (Args->Height - 1) * Private->line_bytes;
> +      Src += (Args->Height - 1) * Private->line_bytes;
> +      for (Index = 0; Index < Args->Height; Index++) {
> +      //
> +      // Source and Destination Y may be equal, therefore Dst and Src may
> +      // overlap.
> +      //
> +      memmove (Dst, Src, Nbr);
> +      Dst -= Private->line_bytes;
> +      Src -= Private->line_bytes;
> +      }
> +    }
> +    break;
> +  case EfiUgaVideoFill:
> +    Color = X11PixelToColor(Private, *BltBuffer);
> +    for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY);
> DstY++) {
> +      for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX);
> DstX++) {
> +        XPutPixel(Private->image, DstX, DstY, Color);
> +      }
> +    }
> +    break;
> +  default:
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  //
> +  //  Refresh screen.
> +  //
> +  switch (BltOperation) {
> +  case EfiUgaVideoToVideo:
> +    XCopyArea(
> +      Private->display, Private->win, Private->win, Private->gc,
> +      Args->SourceX, Args->SourceY, Args->Width, Args->Height,
> +      Args->DestinationX, Args->DestinationY
> +      );
> +
> +    while (1) {
> +      XNextEvent (Private->display, &ev);
> +      HandleEvent (Private, &ev);
> +      if (ev.type == NoExpose || ev.type == GraphicsExpose) {
> +        break;
> +      }
> +    }
> +    break;
> +  case EfiUgaVideoFill:
> +    Color = X11PixelToColor (Private, *BltBuffer);
> +    XSetForeground (Private->display, Private->gc, Color);
> +    XFillRectangle (
> +      Private->display, Private->win, Private->gc,
> +      Args->DestinationX, Args->DestinationY, Args->Width, Args->Height
> +      );
> +    XFlush (Private->display);
> +    break;
> +  case EfiUgaBltBufferToVideo:
> +    Redraw (Private, Args->DestinationX, Args->DestinationY, Args->Width,
> Args->Height);
> +    break;
> +  default:
> +    break;
> +  }
> +  return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +X11CheckPointer (
> +  IN  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo
> +  )
> +{
> +  GRAPHICS_IO_PRIVATE  *Drv;
> +
> +  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> +
> +  HandleEvents (Drv);
> +  if (Drv->pointer_state_changed != 0) {
> +    return EFI_SUCCESS;
> +  }
> +
> +  return EFI_NOT_READY;
> +}
> +
> +
> +EFI_STATUS
> +X11GetPointerState (
> +  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsIo,
> +  IN  EFI_SIMPLE_POINTER_STATE      *State
> +  )
> +{
> +  EFI_STATUS          EfiStatus;
> +  GRAPHICS_IO_PRIVATE *Drv;
> +
> +  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> +
> +  EfiStatus = X11CheckPointer (GraphicsIo);
> +  if (EfiStatus != EFI_SUCCESS) {
> +    return EfiStatus;
> +  }
> +
> +  memcpy (State, &Drv->pointer_state, sizeof (EFI_SIMPLE_POINTER_STATE));
> +
> +  Drv->pointer_state.RelativeMovementX = 0;
> +  Drv->pointer_state.RelativeMovementY = 0;
> +  Drv->pointer_state.RelativeMovementZ = 0;
> +  Drv->pointer_state_changed = 0;
> +  return EFI_SUCCESS;
> +}
> +
> +
> +
> +EFI_STATUS
> +X11GraphicsWindowOpen (
> +  IN  EMU_IO_THUNK_PROTOCOL   *This
> +  )
> +{
> +  GRAPHICS_IO_PRIVATE *Drv;
> +  unsigned int        border_width = 0;
> +  char                *display_name = NULL;
> +
> +  Drv = (GRAPHICS_IO_PRIVATE *)calloc (1, sizeof (GRAPHICS_IO_PRIVATE));
> +  if (Drv == NULL) {
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  Drv->GraphicsIo.Size                = GasketX11Size;
> +  Drv->GraphicsIo.CheckKey            = GasketX11CheckKey;
> +  Drv->GraphicsIo.GetKey              = GasketX11GetKey;
> +  Drv->GraphicsIo.KeySetState         = GasketX11KeySetState;
> +  Drv->GraphicsIo.RegisterKeyNotify   = GasketX11RegisterKeyNotify;
> +  Drv->GraphicsIo.Blt                 = GasketX11Blt;
> +  Drv->GraphicsIo.CheckPointer        = GasketX11CheckPointer;
> +  Drv->GraphicsIo.GetPointerState     = GasketX11GetPointerState;
> +
> +
> +  Drv->key_count = 0;
> +  Drv->key_rd = 0;
> +  Drv->key_wr = 0;
> +  Drv->KeyState.KeyShiftState      = EFI_SHIFT_STATE_VALID;
> +  Drv->KeyState.KeyToggleState     = EFI_TOGGLE_STATE_VALID;
> +  Drv->MakeRegisterdKeyCallback    = NULL;
> +  Drv->BreakRegisterdKeyCallback   = NULL;
> +  Drv->RegisterdKeyCallbackContext = NULL;
> +
> +
> +  Drv->display = XOpenDisplay (display_name);
> +  if (Drv->display == NULL) {
> +    fprintf (stderr, "uga: cannot connect to X server %s\n", XDisplayName
> (display_name));
> +    free (Drv);
> +    return EFI_DEVICE_ERROR;
> +  }
> +  Drv->screen = DefaultScreen (Drv->display);
> +  Drv->visual = DefaultVisual (Drv->display, Drv->screen);
> +  Drv->win = XCreateSimpleWindow (
> +                Drv->display, RootWindow (Drv->display, Drv->screen),
> +                0, 0, 4, 4, border_width,
> +                WhitePixel (Drv->display, Drv->screen),
> +                BlackPixel (Drv->display, Drv->screen)
> +                );
> +
> +  Drv->depth = DefaultDepth (Drv->display, Drv->screen);
> +  XDefineCursor (Drv->display, Drv->win, XCreateFontCursor (Drv->display,
> XC_pirate));
> +
> +  Drv->Title = malloc (StrSize (This->ConfigString));
> +  UnicodeStrToAsciiStr (This->ConfigString, Drv->Title);
> +  XStoreName (Drv->display, Drv->win, Drv->Title);
> +
> +//  XAutoRepeatOff (Drv->display);
> +  XSelectInput (
> +    Drv->display, Drv->win,
> +    ExposureMask | KeyPressMask | KeyReleaseMask | PointerMotionMask |
> ButtonPressMask | ButtonReleaseMask
> +    );
> +  Drv->gc = DefaultGC (Drv->display, Drv->screen);
> +
> +  This->Private   = (VOID *)Drv;
> +  This->Interface = (VOID *)Drv;
> +  return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +X11GraphicsWindowClose (
> +  IN  EMU_IO_THUNK_PROTOCOL   *This
> +  )
> +{
> +  GRAPHICS_IO_PRIVATE *Drv;
> +
> +  Drv = (GRAPHICS_IO_PRIVATE *)This->Private;
> +
> +  if (Drv == NULL) {
> +    return EFI_SUCCESS;
> +  }
> +
> +  if (Drv->image != NULL) {
> +    XDestroyImage(Drv->image);
> +
> +    if (Drv->use_shm) {
> +      shmdt (Drv->image_data);
> +    }
> +
> +    Drv->image_data = NULL;
> +    Drv->image = NULL;
> +  }
> +  XDestroyWindow (Drv->display, Drv->win);
> +  XCloseDisplay (Drv->display);
> +
> +#ifdef __APPLE__
> +  // Free up the shared memory
> +  shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
> +#endif
> +
> +  free (Drv);
> +  return EFI_SUCCESS;
> +}
> +
> +
> +EMU_IO_THUNK_PROTOCOL gX11ThunkIo = {
> +  &gEmuGraphicsWindowProtocolGuid,
> +  NULL,
> +  NULL,
> +  0,
> +  GasketX11GraphicsWindowOpen,
> +  GasketX11GraphicsWindowClose,
> +  NULL
> +};
> +
> +
> diff --git a/EmulatorPkg/Unix/Host/X64/Gasket.S
> b/EmulatorPkg/Unix/Host/X64/Gasket.S
> index c339461cd8..118a218818 100644
> --- a/EmulatorPkg/Unix/Host/X64/Gasket.S
> +++ b/EmulatorPkg/Unix/Host/X64/Gasket.S
> @@ -1,1631 +1,1631 @@
> -#------------------------------------------------------------------------------
> -#
> -# Manage differenced between UNIX ABI and EFI/Windows ABI
> -#
> -# EFI  Arg passing: RCX, RDX, R8,  R9
> -#                   Callee allocates 32 bytes on stack to spill registers
> -# UNIX Arg passing: RDI, RSI, RDX, RCX, R8, R9
> -# RSI, RDI calle-save on EFI, scatch on UNIX callign
> -#
> -# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> -# 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.
> -#
> -#------------------------------------------------------------------------------
> -
> -//
> -// Gaskets are EFI ABI to UNIX ABI calls
> -// EFI ABI code will sub 40 (0x28) from %rsp before calling a function
> -//  This is the 32 (0x20) byte to spill registers and 8 bytes to align stack on 16
> byte boundry.
> -//
> -  .text
> -
> -// 32 byte shadow to spill rcx-r9, 8 bytes to align stack on 16 byte boundry
> -// Any call with 0 - 4 arguments allocates 40 bytes on the stack.
> -// For more than 4 args you always have to increase in quanta of 16 so 5 or 6
> args is 56,
> -// 7 or 8 args is 72, and 9 or 10 args is 88
> -
> -
> -
> -  .text
> -
> -//
> -// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)
> -//
> -
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)
> -ASM_PFX(GasketSecWriteStdErr):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> -  pushq    %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -
> -  call  ASM_PFX(SecWriteStdErr)
> -
> -  popq  %rdi            // restore state
> -  popq  %rsi
> -  popq  %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)
> -ASM_PFX(GasketSecConfigStdIn):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> -  pushq    %rdi
> -
> -  call  ASM_PFX(SecConfigStdIn)
> -
> -  popq  %rdi            // restore state
> -  popq  %rsi
> -  popq  %rbp
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)
> -ASM_PFX(GasketSecWriteStdOut):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> -  pushq    %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -
> -  call  ASM_PFX(SecWriteStdOut)
> -
> -  popq  %rdi            // restore state
> -  popq  %rsi
> -  popq  %rbp
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)
> -ASM_PFX(GasketSecReadStdIn):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> -  pushq    %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -
> -  call  ASM_PFX(SecReadStdIn)
> -
> -  popq  %rdi            // restore state
> -  popq  %rsi
> -  popq  %rbp
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)
> -ASM_PFX(GasketSecPollStdIn):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> -  pushq    %rdi
> -
> -  call  ASM_PFX(SecPollStdIn)
> -
> -  popq  %rdi            // restore state
> -  popq  %rsi
> -  popq  %rbp
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecMalloc)
> -ASM_PFX(GasketSecMalloc):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> -  pushq    %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call  ASM_PFX(SecMalloc)
> -
> -  popq  %rdi            // restore state
> -  popq  %rsi
> -  popq  %rbp
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecValloc)
> -ASM_PFX(GasketSecValloc):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> -  pushq    %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call  ASM_PFX(SecValloc)
> -
> -  popq  %rdi            // restore state
> -  popq  %rsi
> -  popq  %rbp
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecFree)
> -ASM_PFX(GasketSecFree):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> -  pushq    %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call  ASM_PFX(SecFree)
> -
> -  popq  %rdi            // restore state
> -  popq  %rsi
> -  popq  %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecSetTimer)
> -ASM_PFX(GasketSecSetTimer):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> -  pushq    %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -
> -  call  ASM_PFX(SecSetTimer)
> -
> -  popq  %rdi            // restore state
> -  popq  %rsi
> -  popq  %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)
> -ASM_PFX(GasketSecEnableInterrupt):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  call    ASM_PFX(SecEnableInterrupt)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)
> -ASM_PFX(GasketSecDisableInterrupt):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  call    ASM_PFX(SecDisableInterrupt)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)
> -ASM_PFX(GasketQueryPerformanceFrequency):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  call    ASM_PFX(QueryPerformanceFrequency)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)
> -ASM_PFX(GasketQueryPerformanceCounter):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  call    ASM_PFX(QueryPerformanceCounter)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecSleep)
> -ASM_PFX(GasketSecSleep):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> -  pushq    %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call  ASM_PFX(SecSleep)
> -
> -  popq  %rdi            // restore state
> -  popq  %rsi
> -  popq  %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)
> -ASM_PFX(GasketSecCpuSleep):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> -  pushq    %rdi
> -
> -  call  ASM_PFX(SecCpuSleep)
> -
> -  popq  %rdi            // restore state
> -  popq  %rsi
> -  popq  %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecExit)
> -ASM_PFX(GasketSecExit):
> -  pushq   %rbp                 // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  movq    %rcx, %rdi           // Swizzle args
> -  call    ASM_PFX(SecExit)     // Less to do as we will never return to EFI ABI
> world
> -LDEAD_LOOP:
> -  jmp  LDEAD_LOOP              // _exit should never return
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecGetTime)
> -ASM_PFX(GasketSecGetTime):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -
> -  call  ASM_PFX(SecGetTime)
> -
> -  popq  %rdi            // restore state
> -  popq  %rsi
> -  popq  %rbp
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecSetTime)
> -ASM_PFX(GasketSecSetTime):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -
> -  call  ASM_PFX(SecSetTime)
> -
> -  popq  %rdi            // restore state
> -  popq  %rsi
> -  popq  %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)
> -ASM_PFX(GasketSecGetNextProtocol):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -  movq    %r9,  %rcx
> -
> -  call    ASM_PFX(SecGetNextProtocol)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -// PPIs produced by SEC
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)
> -ASM_PFX(GasketSecPeCoffGetEntryPoint):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -
> -  call    ASM_PFX(SecPeCoffGetEntryPoint)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)
> -ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(SecPeCoffRelocateImageExtraAction)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)
> -ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(SecPeCoffUnloadImageExtraAction)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)
> -ASM_PFX(GasketSecEmuThunkAddress):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  call    ASM_PFX(SecEmuThunkAddress)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -//
> -// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
> -//
> -
> -ASM_GLOBAL ASM_PFX(GasketX11Size)
> -ASM_PFX(GasketX11Size):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -  movq    %r9,  %rcx
> -
> -  call    ASM_PFX(X11Size)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11CheckKey)
> -ASM_PFX(GasketX11CheckKey):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(X11CheckKey)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GetKey)
> -ASM_PFX(GasketX11GetKey):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -
> -  call    ASM_PFX(X11GetKey)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11KeySetState)
> -ASM_PFX(GasketX11KeySetState):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -
> -  call    ASM_PFX(X11KeySetState)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)
> -ASM_PFX(GasketX11RegisterKeyNotify):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -  movq    %r9,  %rcx
> -
> -  call    ASM_PFX(X11RegisterKeyNotify)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11Blt)
> -ASM_PFX(GasketX11Blt):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -  movq    %r9,  %rcx
> -
> -  call    ASM_PFX(X11Blt)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)
> -ASM_PFX(GasketX11CheckPointer):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(X11CheckPointer)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)
> -ASM_PFX(GasketX11GetPointerState):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -
> -  call    ASM_PFX(X11GetPointerState)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)
> -ASM_PFX(GasketX11GraphicsWindowOpen):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(X11GraphicsWindowOpen)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)
> -ASM_PFX(GasketX11GraphicsWindowClose):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %r9,  %rcx
> -
> -  call    ASM_PFX(X11GraphicsWindowClose)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -// Pthreads
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)
> -ASM_PFX(GasketPthreadMutexLock):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(PthreadMutexLock)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)
> -ASM_PFX(GasketPthreadMutexUnLock):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(PthreadMutexUnLock)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)
> -ASM_PFX(GasketPthreadMutexTryLock):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(PthreadMutexTryLock)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)
> -ASM_PFX(GasketPthreadMutexInit):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -
> -  call    ASM_PFX(PthreadMutexInit)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)
> -ASM_PFX(GasketPthreadMutexDestroy):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(PthreadMutexDestroy)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadCreate)
> -ASM_PFX(GasketPthreadCreate):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -  movq    %r9,  %rcx
> -
> -  call    ASM_PFX(PthreadCreate)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadExit)
> -ASM_PFX(GasketPthreadExit):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(PthreadExit)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadSelf)
> -ASM_PFX(GasketPthreadSelf):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -
> -  call    ASM_PFX(PthreadSelf)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadOpen)
> -ASM_PFX(GasketPthreadOpen):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(PthreadOpen)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadClose)
> -ASM_PFX(GasketPthreadClose):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(PthreadClose)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -
> -
> -//
> -// UNIX ABI to EFI ABI call
> -//
> -// UINTN
> -// ReverseGasketUint64 (
> -//   void *Api,
> -//   UINTN Arg1
> -//   );
> -ASM_GLOBAL ASM_PFX(ReverseGasketUint64)
> -ASM_PFX(ReverseGasketUint64):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  movq    %rdi, %rax    // Swizzle args
> -  movq    %rsi, %rcx
> -
> -  subq  $32, %rsp        // 32-byte shadow space
> -  call  *%rax
> -  addq  $32, %rsp
> -
> -  popq   %rbp
> -  ret
> -
> -//
> -// UNIX ABI to EFI ABI call
> -//
> -// UINTN
> -// ReverseGasketUint64Uint64 (
> -//   void *Api,
> -//   UINTN Arg1
> -//   UINTN Arg2
> -//   );
> -ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)
> -ASM_PFX(ReverseGasketUint64Uint64):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  movq    %rdi, %rax    // Swizzle args
> -  movq    %rsi, %rcx
> -
> -  subq  $32, %rsp        // 32-byte shadow space
> -  call  *%rax
> -  addq  $32, %rsp
> -
> -  popq   %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)
> -ASM_PFX(GasketSecUnixPeiAutoScan):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -
> -  call    ASM_PFX(SecUnixPeiAutoScan)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)
> -ASM_PFX(GasketSecUnixFdAddress):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -  movq    %r9,  %rcx
> -
> -  call    ASM_PFX(SecUnixFdAddress)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -// EmuIoThunk SimpleFileSystem
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)
> -ASM_PFX(GasketPosixOpenVolume):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -  movq    %r9,  %rcx
> -
> -  call    ASM_PFX(PosixOpenVolume)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)
> -ASM_PFX(GasketPosixFileOpen):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -  movq    %r9,  %rcx
> -  movq    48(%rbp), %r8
> -
> -  call    ASM_PFX(PosixFileOpen)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)
> -ASM_PFX(GasketPosixFileCLose):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(PosixFileCLose)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)
> -ASM_PFX(GasketPosixFileDelete):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(PosixFileDelete)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileRead)
> -ASM_PFX(GasketPosixFileRead):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -
> -  call    ASM_PFX(PosixFileRead)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)
> -ASM_PFX(GasketPosixFileWrite):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -
> -  call    ASM_PFX(PosixFileWrite)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)
> -ASM_PFX(GasketPosixFileSetPossition):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -
> -  call    ASM_PFX(PosixFileSetPossition)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)
> -ASM_PFX(GasketPosixFileGetPossition):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -
> -  call    ASM_PFX(PosixFileGetPossition)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)
> -ASM_PFX(GasketPosixFileGetInfo):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -  movq    %r9,  %rcx
> -
> -  call    ASM_PFX(PosixFileGetInfo)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)
> -ASM_PFX(GasketPosixFileSetInfo):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -  movq    %r9,  %rcx
> -
> -  call    ASM_PFX(PosixFileSetInfo)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)
> -ASM_PFX(GasketPosixFileFlush):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(PosixFileFlush)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)
> -ASM_PFX(GasketPosixFileSystmeThunkOpen):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(PosixFileSystmeThunkOpen)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)
> -ASM_PFX(GasketPosixFileSystmeThunkClose):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(PosixFileSystmeThunkClose)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)
> -ASM_PFX(GasketEmuBlockIoReset):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -
> -  call    ASM_PFX(EmuBlockIoReset)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)
> -ASM_PFX(GasketEmuBlockIoReadBlocks):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -  movq    %r9,  %rcx
> -  movq    48(%rbp), %r8
> -  movq    56(%rbp), %r9
> -
> -  call    ASM_PFX(EmuBlockIoReadBlocks)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)
> -ASM_PFX(GasketEmuBlockIoWriteBlocks):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -  movq    %r9,  %rcx
> -  movq    48(%rbp), %r8
> -  movq    56(%rbp), %r9
> -
> -  call    ASM_PFX(EmuBlockIoWriteBlocks)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)
> -ASM_PFX(GasketEmuBlockIoFlushBlocks):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -
> -  call    ASM_PFX(EmuBlockIoFlushBlocks)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)
> -ASM_PFX(GasketEmuBlockIoCreateMapping):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -
> -  call    ASM_PFX(EmuBlockIoCreateMapping)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)
> -ASM_PFX(GasketBlockIoThunkOpen):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(EmuBlockIoThunkOpen)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)
> -ASM_PFX(GasketBlockIoThunkClose):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(EmuBlockIoThunkClose)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)
> -ASM_PFX(GasketSnpCreateMapping):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -
> -  call    ASM_PFX(EmuSnpCreateMapping)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStart)
> -ASM_PFX(GasketSnpStart):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(EmuSnpStart)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStop)
> -ASM_PFX(GasketSnpStop):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(EmuSnpStop)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpInitialize)
> -ASM_PFX(GasketSnpInitialize):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -
> -  call    ASM_PFX(EmuSnpInitialize)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpReset)
> -ASM_PFX(GasketSnpReset):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -
> -  call    ASM_PFX(EmuSnpReset)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpShutdown)
> -ASM_PFX(GasketSnpShutdown):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(EmuSnpShutdown)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)
> -ASM_PFX(GasketSnpReceiveFilters):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -  movq    %r9,  %rcx
> -  movq    48(%rbp), %r8
> -  movq    56(%rbp), %r9
> -
> -  call    ASM_PFX(EmuSnpReceiveFilters)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)
> -ASM_PFX(GasketSnpStationAddress):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -
> -  call    ASM_PFX(EmuSnpStationAddress)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStatistics)
> -ASM_PFX(GasketSnpStatistics):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -  movq    %r9,  %rcx
> -
> -  call    ASM_PFX(EmuSnpStatistics)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)
> -ASM_PFX(GasketSnpMCastIpToMac):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -  movq    %r9,  %rcx
> -
> -  call    ASM_PFX(EmuSnpMCastIpToMac)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpNvData)
> -ASM_PFX(GasketSnpNvData):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -  movq    %r9,  %rcx
> -  movq    48(%rbp), %r8
> -
> -  call    ASM_PFX(EmuSnpNvData)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)
> -ASM_PFX(GasketSnpGetStatus):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -
> -  call    ASM_PFX(EmuSnpGetStatus)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpTransmit)
> -ASM_PFX(GasketSnpTransmit):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -	subq    $16, %rsp       // Allocate space for args on the stack
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -  movq    %r9,  %rcx
> -  movq    48(%rbp), %r8
> -  movq    56(%rbp), %r9
> -  movq    64(%rbp), %rax
> -  movq    %rax,     (%rsp)
> -
> -  call    ASM_PFX(EmuSnpTransmit)
> -	addq    $16, %rsp
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpReceive)
> -ASM_PFX(GasketSnpReceive):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -	subq    $16, %rsp       // Allocate space for args on the stack
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -  movq    %rdx, %rsi
> -  movq    %r8,  %rdx
> -  movq    %r9,  %rcx
> -  movq    48(%rbp), %r8
> -  movq    56(%rbp), %r9
> -  movq    64(%rbp), %rax
> -  movq    %rax,     (%rsp)
> -
> -  call    ASM_PFX(EmuSnpReceive)
> -	addq    $16, %rsp
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)
> -ASM_PFX(GasketSnpThunkOpen):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(EmuSnpThunkOpen)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)
> -ASM_PFX(GasketSnpThunkClose):
> -  pushq   %rbp            // stack frame is for the debugger
> -  movq    %rsp, %rbp
> -
> -  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> -  pushq   %rdi
> -
> -  movq    %rcx, %rdi    // Swizzle args
> -
> -  call    ASM_PFX(EmuSnpThunkClose)
> -
> -  popq    %rdi          // restore state
> -  popq    %rsi
> -  popq    %rbp
> -  ret
> -
> -
> +#------------------------------------------------------------------------------
> +#
> +# Manage differenced between UNIX ABI and EFI/Windows ABI
> +#
> +# EFI  Arg passing: RCX, RDX, R8,  R9
> +#                   Callee allocates 32 bytes on stack to spill registers
> +# UNIX Arg passing: RDI, RSI, RDX, RCX, R8, R9
> +# RSI, RDI calle-save on EFI, scatch on UNIX callign
> +#
> +# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> +# 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.
> +#
> +#------------------------------------------------------------------------------
> +
> +//
> +// Gaskets are EFI ABI to UNIX ABI calls
> +// EFI ABI code will sub 40 (0x28) from %rsp before calling a function
> +//  This is the 32 (0x20) byte to spill registers and 8 bytes to align stack on 16
> byte boundry.
> +//
> +  .text
> +
> +// 32 byte shadow to spill rcx-r9, 8 bytes to align stack on 16 byte boundry
> +// Any call with 0 - 4 arguments allocates 40 bytes on the stack.
> +// For more than 4 args you always have to increase in quanta of 16 so 5 or 6
> args is 56,
> +// 7 or 8 args is 72, and 9 or 10 args is 88
> +
> +
> +
> +  .text
> +
> +//
> +// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)
> +//
> +
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)
> +ASM_PFX(GasketSecWriteStdErr):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq    %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +
> +  call  ASM_PFX(SecWriteStdErr)
> +
> +  popq  %rdi            // restore state
> +  popq  %rsi
> +  popq  %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)
> +ASM_PFX(GasketSecConfigStdIn):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq    %rdi
> +
> +  call  ASM_PFX(SecConfigStdIn)
> +
> +  popq  %rdi            // restore state
> +  popq  %rsi
> +  popq  %rbp
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)
> +ASM_PFX(GasketSecWriteStdOut):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq    %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +
> +  call  ASM_PFX(SecWriteStdOut)
> +
> +  popq  %rdi            // restore state
> +  popq  %rsi
> +  popq  %rbp
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)
> +ASM_PFX(GasketSecReadStdIn):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq    %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +
> +  call  ASM_PFX(SecReadStdIn)
> +
> +  popq  %rdi            // restore state
> +  popq  %rsi
> +  popq  %rbp
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)
> +ASM_PFX(GasketSecPollStdIn):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq    %rdi
> +
> +  call  ASM_PFX(SecPollStdIn)
> +
> +  popq  %rdi            // restore state
> +  popq  %rsi
> +  popq  %rbp
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecMalloc)
> +ASM_PFX(GasketSecMalloc):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq    %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call  ASM_PFX(SecMalloc)
> +
> +  popq  %rdi            // restore state
> +  popq  %rsi
> +  popq  %rbp
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecValloc)
> +ASM_PFX(GasketSecValloc):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq    %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call  ASM_PFX(SecValloc)
> +
> +  popq  %rdi            // restore state
> +  popq  %rsi
> +  popq  %rbp
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecFree)
> +ASM_PFX(GasketSecFree):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq    %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call  ASM_PFX(SecFree)
> +
> +  popq  %rdi            // restore state
> +  popq  %rsi
> +  popq  %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecSetTimer)
> +ASM_PFX(GasketSecSetTimer):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq    %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +
> +  call  ASM_PFX(SecSetTimer)
> +
> +  popq  %rdi            // restore state
> +  popq  %rsi
> +  popq  %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)
> +ASM_PFX(GasketSecEnableInterrupt):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  call    ASM_PFX(SecEnableInterrupt)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)
> +ASM_PFX(GasketSecDisableInterrupt):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  call    ASM_PFX(SecDisableInterrupt)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)
> +ASM_PFX(GasketQueryPerformanceFrequency):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  call    ASM_PFX(QueryPerformanceFrequency)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)
> +ASM_PFX(GasketQueryPerformanceCounter):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  call    ASM_PFX(QueryPerformanceCounter)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecSleep)
> +ASM_PFX(GasketSecSleep):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq    %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call  ASM_PFX(SecSleep)
> +
> +  popq  %rdi            // restore state
> +  popq  %rsi
> +  popq  %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)
> +ASM_PFX(GasketSecCpuSleep):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq    %rdi
> +
> +  call  ASM_PFX(SecCpuSleep)
> +
> +  popq  %rdi            // restore state
> +  popq  %rsi
> +  popq  %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecExit)
> +ASM_PFX(GasketSecExit):
> +  pushq   %rbp                 // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  movq    %rcx, %rdi           // Swizzle args
> +  call    ASM_PFX(SecExit)     // Less to do as we will never return to EFI ABI
> world
> +LDEAD_LOOP:
> +  jmp  LDEAD_LOOP              // _exit should never return
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecGetTime)
> +ASM_PFX(GasketSecGetTime):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +
> +  call  ASM_PFX(SecGetTime)
> +
> +  popq  %rdi            // restore state
> +  popq  %rsi
> +  popq  %rbp
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecSetTime)
> +ASM_PFX(GasketSecSetTime):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +
> +  call  ASM_PFX(SecSetTime)
> +
> +  popq  %rdi            // restore state
> +  popq  %rsi
> +  popq  %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)
> +ASM_PFX(GasketSecGetNextProtocol):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +  movq    %r9,  %rcx
> +
> +  call    ASM_PFX(SecGetNextProtocol)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +// PPIs produced by SEC
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)
> +ASM_PFX(GasketSecPeCoffGetEntryPoint):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +
> +  call    ASM_PFX(SecPeCoffGetEntryPoint)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)
> +ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(SecPeCoffRelocateImageExtraAction)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)
> +ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(SecPeCoffUnloadImageExtraAction)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)
> +ASM_PFX(GasketSecEmuThunkAddress):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  call    ASM_PFX(SecEmuThunkAddress)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +//
> +// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
> +//
> +
> +ASM_GLOBAL ASM_PFX(GasketX11Size)
> +ASM_PFX(GasketX11Size):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +  movq    %r9,  %rcx
> +
> +  call    ASM_PFX(X11Size)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11CheckKey)
> +ASM_PFX(GasketX11CheckKey):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(X11CheckKey)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GetKey)
> +ASM_PFX(GasketX11GetKey):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +
> +  call    ASM_PFX(X11GetKey)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11KeySetState)
> +ASM_PFX(GasketX11KeySetState):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +
> +  call    ASM_PFX(X11KeySetState)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)
> +ASM_PFX(GasketX11RegisterKeyNotify):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +  movq    %r9,  %rcx
> +
> +  call    ASM_PFX(X11RegisterKeyNotify)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11Blt)
> +ASM_PFX(GasketX11Blt):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +  movq    %r9,  %rcx
> +
> +  call    ASM_PFX(X11Blt)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)
> +ASM_PFX(GasketX11CheckPointer):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(X11CheckPointer)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)
> +ASM_PFX(GasketX11GetPointerState):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +
> +  call    ASM_PFX(X11GetPointerState)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)
> +ASM_PFX(GasketX11GraphicsWindowOpen):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(X11GraphicsWindowOpen)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)
> +ASM_PFX(GasketX11GraphicsWindowClose):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %r9,  %rcx
> +
> +  call    ASM_PFX(X11GraphicsWindowClose)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +// Pthreads
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)
> +ASM_PFX(GasketPthreadMutexLock):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(PthreadMutexLock)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)
> +ASM_PFX(GasketPthreadMutexUnLock):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(PthreadMutexUnLock)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)
> +ASM_PFX(GasketPthreadMutexTryLock):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(PthreadMutexTryLock)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)
> +ASM_PFX(GasketPthreadMutexInit):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +
> +  call    ASM_PFX(PthreadMutexInit)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)
> +ASM_PFX(GasketPthreadMutexDestroy):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(PthreadMutexDestroy)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadCreate)
> +ASM_PFX(GasketPthreadCreate):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +  movq    %r9,  %rcx
> +
> +  call    ASM_PFX(PthreadCreate)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadExit)
> +ASM_PFX(GasketPthreadExit):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(PthreadExit)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadSelf)
> +ASM_PFX(GasketPthreadSelf):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +
> +  call    ASM_PFX(PthreadSelf)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadOpen)
> +ASM_PFX(GasketPthreadOpen):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(PthreadOpen)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadClose)
> +ASM_PFX(GasketPthreadClose):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(PthreadClose)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +
> +
> +//
> +// UNIX ABI to EFI ABI call
> +//
> +// UINTN
> +// ReverseGasketUint64 (
> +//   void *Api,
> +//   UINTN Arg1
> +//   );
> +ASM_GLOBAL ASM_PFX(ReverseGasketUint64)
> +ASM_PFX(ReverseGasketUint64):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  movq    %rdi, %rax    // Swizzle args
> +  movq    %rsi, %rcx
> +
> +  subq  $32, %rsp        // 32-byte shadow space
> +  call  *%rax
> +  addq  $32, %rsp
> +
> +  popq   %rbp
> +  ret
> +
> +//
> +// UNIX ABI to EFI ABI call
> +//
> +// UINTN
> +// ReverseGasketUint64Uint64 (
> +//   void *Api,
> +//   UINTN Arg1
> +//   UINTN Arg2
> +//   );
> +ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)
> +ASM_PFX(ReverseGasketUint64Uint64):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  movq    %rdi, %rax    // Swizzle args
> +  movq    %rsi, %rcx
> +
> +  subq  $32, %rsp        // 32-byte shadow space
> +  call  *%rax
> +  addq  $32, %rsp
> +
> +  popq   %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)
> +ASM_PFX(GasketSecUnixPeiAutoScan):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +
> +  call    ASM_PFX(SecUnixPeiAutoScan)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)
> +ASM_PFX(GasketSecUnixFdAddress):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +  movq    %r9,  %rcx
> +
> +  call    ASM_PFX(SecUnixFdAddress)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +// EmuIoThunk SimpleFileSystem
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)
> +ASM_PFX(GasketPosixOpenVolume):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +  movq    %r9,  %rcx
> +
> +  call    ASM_PFX(PosixOpenVolume)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)
> +ASM_PFX(GasketPosixFileOpen):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +  movq    %r9,  %rcx
> +  movq    48(%rbp), %r8
> +
> +  call    ASM_PFX(PosixFileOpen)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)
> +ASM_PFX(GasketPosixFileCLose):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(PosixFileCLose)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)
> +ASM_PFX(GasketPosixFileDelete):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(PosixFileDelete)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileRead)
> +ASM_PFX(GasketPosixFileRead):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +
> +  call    ASM_PFX(PosixFileRead)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)
> +ASM_PFX(GasketPosixFileWrite):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +
> +  call    ASM_PFX(PosixFileWrite)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)
> +ASM_PFX(GasketPosixFileSetPossition):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +
> +  call    ASM_PFX(PosixFileSetPossition)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)
> +ASM_PFX(GasketPosixFileGetPossition):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +
> +  call    ASM_PFX(PosixFileGetPossition)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)
> +ASM_PFX(GasketPosixFileGetInfo):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +  movq    %r9,  %rcx
> +
> +  call    ASM_PFX(PosixFileGetInfo)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)
> +ASM_PFX(GasketPosixFileSetInfo):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +  movq    %r9,  %rcx
> +
> +  call    ASM_PFX(PosixFileSetInfo)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)
> +ASM_PFX(GasketPosixFileFlush):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(PosixFileFlush)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)
> +ASM_PFX(GasketPosixFileSystmeThunkOpen):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(PosixFileSystmeThunkOpen)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)
> +ASM_PFX(GasketPosixFileSystmeThunkClose):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(PosixFileSystmeThunkClose)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)
> +ASM_PFX(GasketEmuBlockIoReset):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +
> +  call    ASM_PFX(EmuBlockIoReset)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)
> +ASM_PFX(GasketEmuBlockIoReadBlocks):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +  movq    %r9,  %rcx
> +  movq    48(%rbp), %r8
> +  movq    56(%rbp), %r9
> +
> +  call    ASM_PFX(EmuBlockIoReadBlocks)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)
> +ASM_PFX(GasketEmuBlockIoWriteBlocks):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +  movq    %r9,  %rcx
> +  movq    48(%rbp), %r8
> +  movq    56(%rbp), %r9
> +
> +  call    ASM_PFX(EmuBlockIoWriteBlocks)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)
> +ASM_PFX(GasketEmuBlockIoFlushBlocks):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +
> +  call    ASM_PFX(EmuBlockIoFlushBlocks)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)
> +ASM_PFX(GasketEmuBlockIoCreateMapping):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +
> +  call    ASM_PFX(EmuBlockIoCreateMapping)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)
> +ASM_PFX(GasketBlockIoThunkOpen):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(EmuBlockIoThunkOpen)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)
> +ASM_PFX(GasketBlockIoThunkClose):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(EmuBlockIoThunkClose)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)
> +ASM_PFX(GasketSnpCreateMapping):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +
> +  call    ASM_PFX(EmuSnpCreateMapping)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStart)
> +ASM_PFX(GasketSnpStart):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(EmuSnpStart)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStop)
> +ASM_PFX(GasketSnpStop):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(EmuSnpStop)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpInitialize)
> +ASM_PFX(GasketSnpInitialize):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +
> +  call    ASM_PFX(EmuSnpInitialize)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpReset)
> +ASM_PFX(GasketSnpReset):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +
> +  call    ASM_PFX(EmuSnpReset)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpShutdown)
> +ASM_PFX(GasketSnpShutdown):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(EmuSnpShutdown)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)
> +ASM_PFX(GasketSnpReceiveFilters):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +  movq    %r9,  %rcx
> +  movq    48(%rbp), %r8
> +  movq    56(%rbp), %r9
> +
> +  call    ASM_PFX(EmuSnpReceiveFilters)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)
> +ASM_PFX(GasketSnpStationAddress):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +
> +  call    ASM_PFX(EmuSnpStationAddress)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStatistics)
> +ASM_PFX(GasketSnpStatistics):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +  movq    %r9,  %rcx
> +
> +  call    ASM_PFX(EmuSnpStatistics)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)
> +ASM_PFX(GasketSnpMCastIpToMac):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +  movq    %r9,  %rcx
> +
> +  call    ASM_PFX(EmuSnpMCastIpToMac)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpNvData)
> +ASM_PFX(GasketSnpNvData):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +  movq    %r9,  %rcx
> +  movq    48(%rbp), %r8
> +
> +  call    ASM_PFX(EmuSnpNvData)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)
> +ASM_PFX(GasketSnpGetStatus):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +
> +  call    ASM_PFX(EmuSnpGetStatus)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpTransmit)
> +ASM_PFX(GasketSnpTransmit):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +  subq    $16, %rsp       // Allocate space for args on the stack
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +  movq    %r9,  %rcx
> +  movq    48(%rbp), %r8
> +  movq    56(%rbp), %r9
> +  movq    64(%rbp), %rax
> +  movq    %rax,     (%rsp)
> +
> +  call    ASM_PFX(EmuSnpTransmit)
> +  addq    $16, %rsp
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpReceive)
> +ASM_PFX(GasketSnpReceive):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +  subq    $16, %rsp       // Allocate space for args on the stack
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +  movq    %rdx, %rsi
> +  movq    %r8,  %rdx
> +  movq    %r9,  %rcx
> +  movq    48(%rbp), %r8
> +  movq    56(%rbp), %r9
> +  movq    64(%rbp), %rax
> +  movq    %rax,     (%rsp)
> +
> +  call    ASM_PFX(EmuSnpReceive)
> +  addq    $16, %rsp
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)
> +ASM_PFX(GasketSnpThunkOpen):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(EmuSnpThunkOpen)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)
> +ASM_PFX(GasketSnpThunkClose):
> +  pushq   %rbp            // stack frame is for the debugger
> +  movq    %rsp, %rbp
> +
> +  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> +  pushq   %rdi
> +
> +  movq    %rcx, %rdi    // Swizzle args
> +
> +  call    ASM_PFX(EmuSnpThunkClose)
> +
> +  popq    %rdi          // restore state
> +  popq    %rsi
> +  popq    %rbp
> +  ret
> +
> +
> diff --git a/EmulatorPkg/Unix/lldbefi.py b/EmulatorPkg/Unix/lldbefi.py
> index 64549ce3ec..a130cbee5c 100755
> --- a/EmulatorPkg/Unix/lldbefi.py
> +++ b/EmulatorPkg/Unix/lldbefi.py
> @@ -1,540 +1,540 @@
> -#!/usr/bin/python
> -
> -#
> -#  Copyright 2014 Apple Inc. All righes 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.
> -#
> -
> -import lldb
> -import os
> -import uuid
> -import string
> -import commands
> -import optparse
> -import shlex
> -
> -guid_dict = {}
> -
> -
> -def EFI_GUID_TypeSummary (valobj,internal_dict):
> -    """ Type summary for EFI GUID, print C Name if known
> -    """
> -    # typedef struct {
> -    #   UINT32  Data1;
> -    #   UINT16  Data2;
> -    #   UINT16  Data3;
> -    #   UINT8   Data4[8];
> -    # } EFI_GUID;
> -    SBError = lldb.SBError()
> -
> -    data1_val = valobj.GetChildMemberWithName('Data1')
> -    data1 = data1_val.GetValueAsUnsigned(0)
> -    data2_val = valobj.GetChildMemberWithName('Data2')
> -    data2 = data2_val.GetValueAsUnsigned(0)
> -    data3_val = valobj.GetChildMemberWithName('Data3')
> -    data3 = data3_val.GetValueAsUnsigned(0)
> -    str = "%x-%x-%x-" % (data1, data2, data3)
> -
> -    data4_val = valobj.GetChildMemberWithName('Data4')
> -    for i in range (data4_val.num_children):
> -        if i == 2:
> -            str +='-'
> -        str += "%02x" %
> data4_val.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)
> -
> -    return guid_dict.get (str.upper(), '')
> -
> -
> -
> -EFI_STATUS_Dict = {
> -    (0x8000000000000000 |  1): "Load Error",
> -    (0x8000000000000000 |  2): "Invalid Parameter",
> -    (0x8000000000000000 |  3): "Unsupported",
> -    (0x8000000000000000 |  4): "Bad Buffer Size",
> -    (0x8000000000000000 |  5): "Buffer Too Small",
> -    (0x8000000000000000 |  6): "Not Ready",
> -    (0x8000000000000000 |  7): "Device Error",
> -    (0x8000000000000000 |  8): "Write Protected",
> -    (0x8000000000000000 |  9): "Out of Resources",
> -    (0x8000000000000000 | 10): "Volume Corrupt",
> -    (0x8000000000000000 | 11): "Volume Full",
> -    (0x8000000000000000 | 12): "No Media",
> -    (0x8000000000000000 | 13): "Media changed",
> -    (0x8000000000000000 | 14): "Not Found",
> -    (0x8000000000000000 | 15): "Access Denied",
> -    (0x8000000000000000 | 16): "No Response",
> -    (0x8000000000000000 | 17): "No mapping",
> -    (0x8000000000000000 | 18): "Time out",
> -    (0x8000000000000000 | 19): "Not started",
> -    (0x8000000000000000 | 20): "Already started",
> -    (0x8000000000000000 | 21): "Aborted",
> -    (0x8000000000000000 | 22): "ICMP Error",
> -    (0x8000000000000000 | 23): "TFTP Error",
> -    (0x8000000000000000 | 24): "Protocol Error",
> -
> -                          0 : "Success",
> -                          1 : "Warning Unknown Glyph",
> -                          2 : "Warning Delete Failure",
> -                          3 : "Warning Write Failure",
> -                          4 : "Warning Buffer Too Small",
> -
> -    (0x80000000         |  1): "Load Error",
> -    (0x80000000         |  2): "Invalid Parameter",
> -    (0x80000000         |  3): "Unsupported",
> -    (0x80000000         |  4): "Bad Buffer Size",
> -    (0x80000000         |  5): "Buffer Too Small",
> -    (0x80000000         |  6): "Not Ready",
> -    (0x80000000         |  7): "Device Error",
> -    (0x80000000         |  8): "Write Protected",
> -    (0x80000000         |  9): "Out of Resources",
> -    (0x80000000         | 10): "Volume Corrupt",
> -    (0x80000000         | 11): "Volume Full",
> -    (0x80000000         | 12): "No Media",
> -    (0x80000000         | 13): "Media changed",
> -    (0x80000000         | 14): "Not Found",
> -    (0x80000000         | 15): "Access Denied",
> -    (0x80000000         | 16): "No Response",
> -    (0x80000000         | 17): "No mapping",
> -    (0x80000000         | 18): "Time out",
> -    (0x80000000         | 19): "Not started",
> -    (0x80000000         | 20): "Already started",
> -    (0x80000000         | 21): "Aborted",
> -    (0x80000000         | 22): "ICMP Error",
> -    (0x80000000         | 23): "TFTP Error",
> -    (0x80000000         | 24): "Protocol Error",
> -}
> -
> -def EFI_STATUS_TypeSummary (valobj,internal_dict):
> -  #
> -  # Return summary string for EFI_STATUS from dictionary
> -  #
> -  Status = valobj.GetValueAsUnsigned(0)
> -  return EFI_STATUS_Dict.get (Status, '')
> -
> -
> -def EFI_TPL_TypeSummary (valobj,internal_dict):
> -  #
> -  # Return TPL values
> -  #
> -
> -  if valobj.TypeIsPointerType():
> -    return ""
> -
> -  Tpl = valobj.GetValueAsUnsigned(0)
> -  if   Tpl < 4:
> -    Str = "%d" % Tpl
> -  elif Tpl == 6:
> -    Str = "TPL_DRIVER (Obsolete Concept in edk2)"
> -  elif Tpl < 8:
> -    Str = "TPL_APPLICATION"
> -    if Tpl - 4 > 0:
> -      Str += " + " + "%d" % (Tpl - 4)
> -  elif Tpl < 16:
> -    Str = "TPL_CALLBACK"
> -    if Tpl - 8 > 0:
> -      Str += " + " + "%d" % (Tpl - 4)
> -  elif Tpl < 31:
> -    Str = "TPL_NOTIFY"
> -    if Tpl - 16 > 0:
> -      Str += " + " + "%d" % (Tpl - 4)
> -  elif Tpl == 31:
> -    Str = "TPL_HIGH_LEVEL"
> -  else:
> -    Str = "Invalid TPL"
> -
> -  return Str
> -
> -
> -def CHAR16_TypeSummary (valobj,internal_dict):
> -  #
> -  # Display EFI CHAR16 'unsigned short' as string
> -  #
> -  SBError = lldb.SBError()
> -  Str = ''
> -  if valobj.TypeIsPointerType():
> -    if valobj.GetValueAsUnsigned () == 0:
> -      return "NULL"
> -
> -    # CHAR16 *   max string size 1024
> -    for i in range (1024):
> -      Char = valobj.GetPointeeData(i,1).GetUnsignedInt16(SBError, 0)
> -      if SBError.fail or Char == 0:
> -        break
> -      Str += unichr (Char)
> -    Str = 'L"' + Str + '"'
> -    return Str.encode ('utf-8', 'replace')
> -
> -  if valobj.num_children == 0:
> -    # CHAR16
> -    if chr (valobj.unsigned) in string.printable:
> -      Str = "L'" + unichr (valobj.unsigned) + "'"
> -      return Str.encode ('utf-8', 'replace')
> -  else:
> -    # CHAR16 []
> -    for i in range (valobj.num_children):
> -      Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt16(SBError, 0)
> -      if Char == 0:
> -        break
> -      Str += unichr (Char)
> -    Str = 'L"' + Str + '"'
> -    return Str.encode ('utf-8', 'replace')
> -
> -  return Str
> -
> -def CHAR8_TypeSummary (valobj,internal_dict):
> -  #
> -  # Display EFI CHAR8 'signed char' as string
> -  # unichr() is used as a junk string can produce an error message like this:
> -  # UnicodeEncodeError: 'ascii' codec can't encode character u'\x90' in
> position 1: ordinal not in range(128)
> -  #
> -  SBError = lldb.SBError()
> -  Str = ''
> -  if valobj.TypeIsPointerType():
> -    if valobj.GetValueAsUnsigned () == 0:
> -      return "NULL"
> -
> -    # CHAR8 *   max string size 1024
> -    for i in range (1024):
> -      Char = valobj.GetPointeeData(i,1).GetUnsignedInt8(SBError, 0)
> -      if SBError.fail or Char == 0:
> -        break
> -      Str += unichr (Char)
> -    Str = '"' + Str + '"'
> -    return Str.encode ('utf-8', 'replace')
> -
> -  if valobj.num_children == 0:
> -    # CHAR8
> -    if chr (valobj.unsigned) in string.printable:
> -      Str = '"' + unichr (valobj.unsigned)  + '"'
> -      return Str.encode ('utf-8', 'replace')
> -  else:
> -    # CHAR8 []
> -    for i in range (valobj.num_children):
> -      Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)
> -      if Char == 0:
> -        break
> -      Str += unichr (Char)
> -    Str = '"' + Str + '"'
> -    return Str.encode ('utf-8', 'replace')
> -
> -  return Str
> -
> -device_path_dict = {
> -  (0x01, 0x01): "PCI_DEVICE_PATH",
> -  (0x01, 0x02): "PCCARD_DEVICE_PATH",
> -  (0x01, 0x03): "MEMMAP_DEVICE_PATH",
> -  (0x01, 0x04): "VENDOR_DEVICE_PATH",
> -  (0x01, 0x05): "CONTROLLER_DEVICE_PATH",
> -  (0x02, 0x01): "ACPI_HID_DEVICE_PATH",
> -  (0x02, 0x02): "ACPI_EXTENDED_HID_DEVICE_PATH",
> -  (0x02, 0x03): "ACPI_ADR_DEVICE_PATH",
> -  (0x03, 0x01): "ATAPI_DEVICE_PATH",
> -  (0x03, 0x12): "SATA_DEVICE_PATH",
> -  (0x03, 0x02): "SCSI_DEVICE_PATH",
> -  (0x03, 0x03): "FIBRECHANNEL_DEVICE_PATH",
> -  (0x03, 0x04): "F1394_DEVICE_PATH",
> -  (0x03, 0x05): "USB_DEVICE_PATH",
> -  (0x03, 0x0f): "USB_CLASS_DEVICE_PATH",
> -  (0x03, 0x10): "FW_SBP2_UNIT_LUN_DEVICE_PATH",
> -  (0x03, 0x11): "DEVICE_LOGICAL_UNIT_DEVICE_PATH",
> -  (0x03, 0x06): "I2O_DEVICE_PATH",
> -  (0x03, 0x0b): "MAC_ADDR_DEVICE_PATH",
> -  (0x03, 0x0c): "IPv4_DEVICE_PATH",
> -  (0x03, 0x09): "INFINIBAND_DEVICE_PATH",
> -  (0x03, 0x0e): "UART_DEVICE_PATH",
> -  (0x03, 0x0a): "VENDOR_DEVICE_PATH",
> -  (0x03, 0x13): "ISCSI_DEVICE_PATH",
> -  (0x04, 0x01): "HARDDRIVE_DEVICE_PATH",
> -  (0x04, 0x02): "CDROM_DEVICE_PATH",
> -  (0x04, 0x03): "VENDOR_DEVICE_PATH",
> -  (0x04, 0x04): "FILEPATH_DEVICE_PATH",
> -  (0x04, 0x05): "MEDIA_PROTOCOL_DEVICE_PATH",
> -  (0x05, 0x01): "BBS_BBS_DEVICE_PATH",
> -  (0x7F, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",
> -  (0xFF, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",
> -}
> -
> -def EFI_DEVICE_PATH_PROTOCOL_TypeSummary (valobj,internal_dict):
> -  #
> -  #
> -  #
> -  if valobj.TypeIsPointerType():
> -    # EFI_DEVICE_PATH_PROTOCOL *
> -    return ""
> -
> -  Str = ""
> -  if valobj.num_children == 3:
> -    # EFI_DEVICE_PATH_PROTOCOL
> -    Type    = valobj.GetChildMemberWithName('Type').unsigned
> -    SubType = valobj.GetChildMemberWithName('SubType').unsigned
> -    if (Type, SubType) in device_path_dict:
> -      TypeStr = device_path_dict[Type, SubType]
> -    else:
> -      TypeStr = ""
> -
> -    LenLow  =
> valobj.GetChildMemberWithName('Length').GetChildAtIndex(0).unsigned
> -    LenHigh =
> valobj.GetChildMemberWithName('Length').GetChildAtIndex(1).unsigned
> -    Len = LenLow + (LenHigh >> 8)
> -
> -    Address = long ("%d" % valobj.addr)
> -    if (Address == lldb.LLDB_INVALID_ADDRESS):
> -      # Need to reserach this, it seems to be the nested struct case
> -      ExprStr = ""
> -    elif (Type & 0x7f == 0x7f):
> -      ExprStr = "End Device Path" if SubType == 0xff else "End This Instance"
> -    else:
> -      ExprStr = "expr *(%s *)0x%08x" % (TypeStr, Address)
> -
> -    Str =  " {\n"
> -    Str += "   (UINT8) Type    = 0x%02x // %s\n" % (Type, "END" if (Type & 0x7f
> == 0x7f) else "")
> -    Str += "   (UINT8) SubType = 0x%02x // %s\n" % (SubType, ExprStr)
> -    Str += "   (UINT8 [2]) Length = { // 0x%04x (%d) bytes\n" % (Len, Len)
> -    Str += "     (UINT8) [0] = 0x%02x\n" % LenLow
> -    Str += "     (UINT8) [1] = 0x%02x\n" % LenHigh
> -    Str +=  "   }\n"
> -    if (Type & 0x7f == 0x7f) and (SubType == 0xff):
> -      pass
> -    elif ExprStr != "":
> -      NextNode = Address + Len
> -      Str += "// Next node 'expr *(EFI_DEVICE_PATH_PROTOCOL *)0x%08x'\n" %
> NextNode
> -
> -  return Str
> -
> -
> -
> -def TypePrintFormating(debugger):
> -    #
> -    # Set the default print formating for EFI types in lldb.
> -    # seems lldb defaults to decimal.
> -    #
> -    category = debugger.GetDefaultCategory()
> -    FormatBool = lldb.SBTypeFormat(lldb.eFormatBoolean)
> -    category.AddTypeFormat(lldb.SBTypeNameSpecifier("BOOLEAN"),
> FormatBool)
> -
> -    FormatHex  = lldb.SBTypeFormat(lldb.eFormatHex)
> -    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT64"), FormatHex)
> -    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT64"), FormatHex)
> -    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT32"), FormatHex)
> -    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT32"), FormatHex)
> -    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT16"), FormatHex)
> -    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT16"), FormatHex)
> -    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT8"), FormatHex)
> -    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT8"), FormatHex)
> -    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINTN"), FormatHex)
> -    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INTN"), FormatHex)
> -    category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR8"), FormatHex)
> -    category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR16"), FormatHex)
> -
> -
> category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_PHYSICAL_ADDRESS"),
> FormatHex)
> -    category.AddTypeFormat(lldb.SBTypeNameSpecifier("PHYSICAL_ADDRESS"),
> FormatHex)
> -    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_STATUS"),
> FormatHex)
> -    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_TPL"), FormatHex)
> -    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_LBA"), FormatHex)
> -    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_BOOT_MODE"),
> FormatHex)
> -    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_FV_FILETYPE"),
> FormatHex)
> -
> -    #
> -    # Smart type printing for EFI
> -    #
> -    debugger.HandleCommand("type summary add EFI_GUID --python-function
> lldbefi.EFI_GUID_TypeSummary")
> -    debugger.HandleCommand("type summary add EFI_STATUS --python-
> function lldbefi.EFI_STATUS_TypeSummary")
> -    debugger.HandleCommand("type summary add EFI_TPL --python-function
> lldbefi.EFI_TPL_TypeSummary")
> -    debugger.HandleCommand("type summary add
> EFI_DEVICE_PATH_PROTOCOL --python-function
> lldbefi.EFI_DEVICE_PATH_PROTOCOL_TypeSummary")
> -
> -    debugger.HandleCommand("type summary add CHAR16 --python-function
> lldbefi.CHAR16_TypeSummary")
> -    debugger.HandleCommand('type summary add --regex "CHAR16 \[[0-9]+\]"
> --python-function lldbefi.CHAR16_TypeSummary')
> -    debugger.HandleCommand("type summary add CHAR8 --python-function
> lldbefi.CHAR8_TypeSummary")
> -    debugger.HandleCommand('type summary add --regex "CHAR8 \[[0-9]+\]" -
> -python-function lldbefi.CHAR8_TypeSummary')
> -
> -
> -gEmulatorBreakWorkaroundNeeded = True
> -
> -def LoadEmulatorEfiSymbols(frame, bp_loc , internal_dict):
> -    #
> -    # This is an lldb breakpoint script, and assumes the breakpoint is on a
> -    # function with the same prototype as SecGdbScriptBreak(). The
> -    # argument names are important as lldb looks them up.
> -    #
> -    # VOID
> -    # SecGdbScriptBreak (
> -    #   char                *FileName,
> -    #   int                 FileNameLength,
> -    #   long unsigned int   LoadAddress,
> -    #   int                 AddSymbolFlag
> -    #   )
> -    # {
> -    #   return;
> -    # }
> -    #
> -    # When the emulator loads a PE/COFF image, it calls the stub function with
> -    # the filename of the symbol file, the length of the FileName, the
> -    # load address and a flag to indicate if this is a load or unload operation
> -    #
> -    global gEmulatorBreakWorkaroundNeeded
> -
> -    if gEmulatorBreakWorkaroundNeeded:
> -        # turn off lldb debug prints on SIGALRM (EFI timer tick)
> -        frame.thread.process.target.debugger.HandleCommand("process handle
> SIGALRM -n false")
> -        gEmulatorBreakWorkaroundNeeded = False
> -
> -    # Convert C string to Python string
> -    Error = lldb.SBError()
> -    FileNamePtr = frame.FindVariable ("FileName").GetValueAsUnsigned()
> -    FileNameLen = frame.FindVariable
> ("FileNameLength").GetValueAsUnsigned()
> -    FileName = frame.thread.process.ReadCStringFromMemory (FileNamePtr,
> FileNameLen, Error)
> -    if not Error.Success():
> -        print "!ReadCStringFromMemory() did not find a %d byte C string at %x" %
> (FileNameLen, FileNamePtr)
> -        # make breakpoint command contiue
> -        frame.GetThread().GetProcess().Continue()
> -
> -    debugger = frame.thread.process.target.debugger
> -    if frame.FindVariable ("AddSymbolFlag").GetValueAsUnsigned() == 1:
> -        LoadAddress = frame.FindVariable ("LoadAddress").GetValueAsUnsigned()
> -
> -        debugger.HandleCommand ("target modules add  %s" % FileName)
> -        print "target modules load --slid 0x%x %s" % (LoadAddress, FileName)
> -        debugger.HandleCommand ("target modules load --slide 0x%x --file %s" %
> (LoadAddress, FileName))
> -    else:
> -        target = debugger.GetSelectedTarget()
> -        for SBModule in target.module_iter():
> -            ModuleName  = SBModule.GetFileSpec().GetDirectory() + '/'
> -            ModuleName += SBModule.GetFileSpec().GetFilename()
> -            if FileName == ModuleName or FileName ==
> SBModule.GetFileSpec().GetFilename():
> -                target.ClearModuleLoadAddress (SBModule)
> -                if not target.RemoveModule (SBModule):
> -                    print "!lldb.target.RemoveModule (%s) FAILED" % SBModule
> -
> -    # make breakpoint command contiue
> -    frame.thread.process.Continue()
> -
> -def GuidToCStructStr (guid, Name=False):
> -  #
> -  # Convert a 16-byte bytesarry (or bytearray compat object) to C guid string
> -  # { 0xB402621F, 0xA940, 0x1E4A, { 0x86, 0x6B, 0x4D, 0xC9, 0x16, 0x2B, 0x34,
> 0x7C } }
> -  #
> -  # Name=True means lookup name in GuidNameDict and us it if you find it
> -  #
> -
> -  if not isinstance (guid, bytearray):
> -    # convert guid object to UUID, and UUID to bytearray
> -    Uuid = uuid.UUID(guid)
> -    guid = bytearray (Uuid.bytes_le)
> -
> -  return "{ 0x%02.2X%02.2X%02.2X%02.2X, 0x%02.2X%02.2X, 0x%02.2X%02.2X,
> { 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X,
> 0x%02.2X } }" % \
> -         (guid[3], guid[2], guid[1], guid[0], guid[5], guid[4], guid[7], guid[6],
> guid[8], guid[9], guid[10], guid[11], guid[12], guid[13], guid[14], guid[15])
> -
> -def ParseGuidString(GuidStr):
> -  #
> -  # Error check and convert C Guid init to string
> -  # ParseGuidString("49152E77-1ADA-4764-B7A2-7AFEFED95E8B")
> -  # ParseGuidString("{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7,
> 0x8A, 0x35, 0x46, 0xD1 } }")
> -  #
> -
> -  if "{" in GuidStr                                                                                         :
> -    # convert C form "{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7,
> 0x8A, 0x35, 0x46, 0xD1 } }"
> -    # to string form BA24B391-73FD-C54C-9EAF-0CA78A3546D1
> -    # make a list of Hex numbers like: ['0xBA24B391', '0x73FD', '0xC54C', '0x9E',
> '0xAF', '0x0C', '0xA7', '0x8A', '0x35', '0x46', '0xD1']
> -    Hex = ''.join(x for x in GuidStr if x not in '{,}').split()
> -    Str = "%08X-%04X-%04X-%02.2X%02.2X-
> %02.2X%02.2X%02.2X%02.2X%02.2X%02.2X" % \
> -          (int(Hex[0], 0), int(Hex[1], 0), int(Hex[2], 0), int(Hex[3], 0), int(Hex[4], 0),
> \
> -           int(Hex[5], 0), int(Hex[6], 0), int(Hex[7], 0), int(Hex[8], 0), int(Hex[9], 0),
> int(Hex[10], 0))
> -  elif GuidStr.count('-') == 4:
> -    # validate "49152E77-1ADA-4764-B7A2-7AFEFED95E8B" form
> -    Check = "%s" % str(uuid.UUID(GuidStr)).upper()
> -    if GuidStr.upper() == Check:
> -      Str = GuidStr.upper()
> -    else:
> -      Ste = ""
> -  else:
> -    Str = ""
> -
> -  return Str
> -
> -
> -def create_guid_options():
> -    usage = "usage: %prog [data]"
> -    description='''lookup EFI_GUID by CName, C struct, or GUID string and print
> out all three.
> -    '''
> -    parser = optparse.OptionParser(description=description,
> prog='guid',usage=usage)
> -    return parser
> -
> -def efi_guid_command(debugger, command, result, dict):
> -    # Use the Shell Lexer to properly parse up command options just like a
> -    # shell would
> -    command_args = shlex.split(command)
> -    parser = create_guid_options()
> -    try:
> -        (options, args) = parser.parse_args(command_args)
> -        if len(args) >= 1:
> -          if args[0] == "{":
> -              # caller forgot to quote the string"
> -              # mark arg[0] a string containing all args[n]
> -              args[0] = ' '.join(args)
> -          GuidStr = ParseGuidString (args[0])
> -          if GuidStr == "":
> -              # return Key of GuidNameDict for value args[0]
> -              GuidStr = [Key for Key, Value in guid_dict.iteritems() if Value ==
> args[0]][0]
> -          GuidStr = GuidStr.upper()
> -    except:
> -        # if you don't handle exceptions, passing an incorrect argument to the
> OptionParser will cause LLDB to exit
> -        # (courtesy of OptParse dealing with argument errors by throwing
> SystemExit)
> -        result.SetError ("option parsing failed")
> -        return
> -
> -
> -    if len(args) >= 1:
> -        if GuidStr in guid_dict:
> -            print "%s = %s" % (guid_dict[GuidStr], GuidStr)
> -            print "%s = %s" % (guid_dict[GuidStr], GuidToCStructStr (GuidStr))
> -        else:
> -            print GuidStr
> -    else:
> -        # dump entire dictionary
> -        width = max(len(v) for k,v in guid_dict.iteritems())
> -        for value in sorted(guid_dict, key=guid_dict.get):
> -            print '%-*s %s %s' % (width, guid_dict[value], value,
> GuidToCStructStr(value))
> -
> -    return
> -
> -
> -#
> -########## Code that runs when this script is imported into LLDB
> ###########
> -#
> -def __lldb_init_module (debugger, internal_dict):
> -    # This initializer is being run from LLDB in the embedded command
> interpreter
> -    # Make the options so we can generate the help text for the new LLDB
> -    # command line command prior to registering it with LLDB below
> -
> -    global guid_dict
> -
> -    # Source Guid.xref file if we can find it
> -    inputfile = os.getcwd()
> -    inputfile += os.sep + os.pardir + os.sep + 'FV' + os.sep + 'Guid.xref'
> -    with open(inputfile) as f:
> -        for line in f:
> -            data = line.split(' ')
> -            if len(data) >= 2:
> -                guid_dict[data[0].upper()] = data[1].strip('\n')
> -
> -    # init EFI specific type formaters
> -    TypePrintFormating (debugger)
> -
> -
> -    # add guid command
> -    parser = create_guid_options()
> -    efi_guid_command.__doc__ = parser.format_help()
> -    debugger.HandleCommand('command script add -f
> lldbefi.efi_guid_command guid')
> -
> -
> -    Target = debugger.GetTargetAtIndex(0)
> -    if Target:
> -        Breakpoint = Target.BreakpointCreateByName('SecGdbScriptBreak')
> -        if Breakpoint.GetNumLocations() == 1:
> -            # Set the emulator breakpoints, if we are in the emulator
> -            debugger.HandleCommand("breakpoint command add -s python -F
> lldbefi.LoadEmulatorEfiSymbols {id}".format(id=Breakpoint.GetID()))
> -            print 'Type r to run emulator. SecLldbScriptBreak armed. EFI modules
> should now get source level debugging in the emulator.'
> +#!/usr/bin/python
> +
> +#
> +#  Copyright 2014 Apple Inc. All righes 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.
> +#
> +
> +import lldb
> +import os
> +import uuid
> +import string
> +import commands
> +import optparse
> +import shlex
> +
> +guid_dict = {}
> +
> +
> +def EFI_GUID_TypeSummary (valobj,internal_dict):
> +    """ Type summary for EFI GUID, print C Name if known
> +    """
> +    # typedef struct {
> +    #   UINT32  Data1;
> +    #   UINT16  Data2;
> +    #   UINT16  Data3;
> +    #   UINT8   Data4[8];
> +    # } EFI_GUID;
> +    SBError = lldb.SBError()
> +
> +    data1_val = valobj.GetChildMemberWithName('Data1')
> +    data1 = data1_val.GetValueAsUnsigned(0)
> +    data2_val = valobj.GetChildMemberWithName('Data2')
> +    data2 = data2_val.GetValueAsUnsigned(0)
> +    data3_val = valobj.GetChildMemberWithName('Data3')
> +    data3 = data3_val.GetValueAsUnsigned(0)
> +    str = "%x-%x-%x-" % (data1, data2, data3)
> +
> +    data4_val = valobj.GetChildMemberWithName('Data4')
> +    for i in range (data4_val.num_children):
> +        if i == 2:
> +            str +='-'
> +        str += "%02x" %
> data4_val.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)
> +
> +    return guid_dict.get (str.upper(), '')
> +
> +
> +
> +EFI_STATUS_Dict = {
> +    (0x8000000000000000 |  1): "Load Error",
> +    (0x8000000000000000 |  2): "Invalid Parameter",
> +    (0x8000000000000000 |  3): "Unsupported",
> +    (0x8000000000000000 |  4): "Bad Buffer Size",
> +    (0x8000000000000000 |  5): "Buffer Too Small",
> +    (0x8000000000000000 |  6): "Not Ready",
> +    (0x8000000000000000 |  7): "Device Error",
> +    (0x8000000000000000 |  8): "Write Protected",
> +    (0x8000000000000000 |  9): "Out of Resources",
> +    (0x8000000000000000 | 10): "Volume Corrupt",
> +    (0x8000000000000000 | 11): "Volume Full",
> +    (0x8000000000000000 | 12): "No Media",
> +    (0x8000000000000000 | 13): "Media changed",
> +    (0x8000000000000000 | 14): "Not Found",
> +    (0x8000000000000000 | 15): "Access Denied",
> +    (0x8000000000000000 | 16): "No Response",
> +    (0x8000000000000000 | 17): "No mapping",
> +    (0x8000000000000000 | 18): "Time out",
> +    (0x8000000000000000 | 19): "Not started",
> +    (0x8000000000000000 | 20): "Already started",
> +    (0x8000000000000000 | 21): "Aborted",
> +    (0x8000000000000000 | 22): "ICMP Error",
> +    (0x8000000000000000 | 23): "TFTP Error",
> +    (0x8000000000000000 | 24): "Protocol Error",
> +
> +                          0 : "Success",
> +                          1 : "Warning Unknown Glyph",
> +                          2 : "Warning Delete Failure",
> +                          3 : "Warning Write Failure",
> +                          4 : "Warning Buffer Too Small",
> +
> +    (0x80000000         |  1): "Load Error",
> +    (0x80000000         |  2): "Invalid Parameter",
> +    (0x80000000         |  3): "Unsupported",
> +    (0x80000000         |  4): "Bad Buffer Size",
> +    (0x80000000         |  5): "Buffer Too Small",
> +    (0x80000000         |  6): "Not Ready",
> +    (0x80000000         |  7): "Device Error",
> +    (0x80000000         |  8): "Write Protected",
> +    (0x80000000         |  9): "Out of Resources",
> +    (0x80000000         | 10): "Volume Corrupt",
> +    (0x80000000         | 11): "Volume Full",
> +    (0x80000000         | 12): "No Media",
> +    (0x80000000         | 13): "Media changed",
> +    (0x80000000         | 14): "Not Found",
> +    (0x80000000         | 15): "Access Denied",
> +    (0x80000000         | 16): "No Response",
> +    (0x80000000         | 17): "No mapping",
> +    (0x80000000         | 18): "Time out",
> +    (0x80000000         | 19): "Not started",
> +    (0x80000000         | 20): "Already started",
> +    (0x80000000         | 21): "Aborted",
> +    (0x80000000         | 22): "ICMP Error",
> +    (0x80000000         | 23): "TFTP Error",
> +    (0x80000000         | 24): "Protocol Error",
> +}
> +
> +def EFI_STATUS_TypeSummary (valobj,internal_dict):
> +  #
> +  # Return summary string for EFI_STATUS from dictionary
> +  #
> +  Status = valobj.GetValueAsUnsigned(0)
> +  return EFI_STATUS_Dict.get (Status, '')
> +
> +
> +def EFI_TPL_TypeSummary (valobj,internal_dict):
> +  #
> +  # Return TPL values
> +  #
> +
> +  if valobj.TypeIsPointerType():
> +    return ""
> +
> +  Tpl = valobj.GetValueAsUnsigned(0)
> +  if   Tpl < 4:
> +    Str = "%d" % Tpl
> +  elif Tpl == 6:
> +    Str = "TPL_DRIVER (Obsolete Concept in edk2)"
> +  elif Tpl < 8:
> +    Str = "TPL_APPLICATION"
> +    if Tpl - 4 > 0:
> +      Str += " + " + "%d" % (Tpl - 4)
> +  elif Tpl < 16:
> +    Str = "TPL_CALLBACK"
> +    if Tpl - 8 > 0:
> +      Str += " + " + "%d" % (Tpl - 4)
> +  elif Tpl < 31:
> +    Str = "TPL_NOTIFY"
> +    if Tpl - 16 > 0:
> +      Str += " + " + "%d" % (Tpl - 4)
> +  elif Tpl == 31:
> +    Str = "TPL_HIGH_LEVEL"
> +  else:
> +    Str = "Invalid TPL"
> +
> +  return Str
> +
> +
> +def CHAR16_TypeSummary (valobj,internal_dict):
> +  #
> +  # Display EFI CHAR16 'unsigned short' as string
> +  #
> +  SBError = lldb.SBError()
> +  Str = ''
> +  if valobj.TypeIsPointerType():
> +    if valobj.GetValueAsUnsigned () == 0:
> +      return "NULL"
> +
> +    # CHAR16 *   max string size 1024
> +    for i in range (1024):
> +      Char = valobj.GetPointeeData(i,1).GetUnsignedInt16(SBError, 0)
> +      if SBError.fail or Char == 0:
> +        break
> +      Str += unichr (Char)
> +    Str = 'L"' + Str + '"'
> +    return Str.encode ('utf-8', 'replace')
> +
> +  if valobj.num_children == 0:
> +    # CHAR16
> +    if chr (valobj.unsigned) in string.printable:
> +      Str = "L'" + unichr (valobj.unsigned) + "'"
> +      return Str.encode ('utf-8', 'replace')
> +  else:
> +    # CHAR16 []
> +    for i in range (valobj.num_children):
> +      Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt16(SBError, 0)
> +      if Char == 0:
> +        break
> +      Str += unichr (Char)
> +    Str = 'L"' + Str + '"'
> +    return Str.encode ('utf-8', 'replace')
> +
> +  return Str
> +
> +def CHAR8_TypeSummary (valobj,internal_dict):
> +  #
> +  # Display EFI CHAR8 'signed char' as string
> +  # unichr() is used as a junk string can produce an error message like this:
> +  # UnicodeEncodeError: 'ascii' codec can't encode character u'\x90' in
> position 1: ordinal not in range(128)
> +  #
> +  SBError = lldb.SBError()
> +  Str = ''
> +  if valobj.TypeIsPointerType():
> +    if valobj.GetValueAsUnsigned () == 0:
> +      return "NULL"
> +
> +    # CHAR8 *   max string size 1024
> +    for i in range (1024):
> +      Char = valobj.GetPointeeData(i,1).GetUnsignedInt8(SBError, 0)
> +      if SBError.fail or Char == 0:
> +        break
> +      Str += unichr (Char)
> +    Str = '"' + Str + '"'
> +    return Str.encode ('utf-8', 'replace')
> +
> +  if valobj.num_children == 0:
> +    # CHAR8
> +    if chr (valobj.unsigned) in string.printable:
> +      Str = '"' + unichr (valobj.unsigned)  + '"'
> +      return Str.encode ('utf-8', 'replace')
> +  else:
> +    # CHAR8 []
> +    for i in range (valobj.num_children):
> +      Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)
> +      if Char == 0:
> +        break
> +      Str += unichr (Char)
> +    Str = '"' + Str + '"'
> +    return Str.encode ('utf-8', 'replace')
> +
> +  return Str
> +
> +device_path_dict = {
> +  (0x01, 0x01): "PCI_DEVICE_PATH",
> +  (0x01, 0x02): "PCCARD_DEVICE_PATH",
> +  (0x01, 0x03): "MEMMAP_DEVICE_PATH",
> +  (0x01, 0x04): "VENDOR_DEVICE_PATH",
> +  (0x01, 0x05): "CONTROLLER_DEVICE_PATH",
> +  (0x02, 0x01): "ACPI_HID_DEVICE_PATH",
> +  (0x02, 0x02): "ACPI_EXTENDED_HID_DEVICE_PATH",
> +  (0x02, 0x03): "ACPI_ADR_DEVICE_PATH",
> +  (0x03, 0x01): "ATAPI_DEVICE_PATH",
> +  (0x03, 0x12): "SATA_DEVICE_PATH",
> +  (0x03, 0x02): "SCSI_DEVICE_PATH",
> +  (0x03, 0x03): "FIBRECHANNEL_DEVICE_PATH",
> +  (0x03, 0x04): "F1394_DEVICE_PATH",
> +  (0x03, 0x05): "USB_DEVICE_PATH",
> +  (0x03, 0x0f): "USB_CLASS_DEVICE_PATH",
> +  (0x03, 0x10): "FW_SBP2_UNIT_LUN_DEVICE_PATH",
> +  (0x03, 0x11): "DEVICE_LOGICAL_UNIT_DEVICE_PATH",
> +  (0x03, 0x06): "I2O_DEVICE_PATH",
> +  (0x03, 0x0b): "MAC_ADDR_DEVICE_PATH",
> +  (0x03, 0x0c): "IPv4_DEVICE_PATH",
> +  (0x03, 0x09): "INFINIBAND_DEVICE_PATH",
> +  (0x03, 0x0e): "UART_DEVICE_PATH",
> +  (0x03, 0x0a): "VENDOR_DEVICE_PATH",
> +  (0x03, 0x13): "ISCSI_DEVICE_PATH",
> +  (0x04, 0x01): "HARDDRIVE_DEVICE_PATH",
> +  (0x04, 0x02): "CDROM_DEVICE_PATH",
> +  (0x04, 0x03): "VENDOR_DEVICE_PATH",
> +  (0x04, 0x04): "FILEPATH_DEVICE_PATH",
> +  (0x04, 0x05): "MEDIA_PROTOCOL_DEVICE_PATH",
> +  (0x05, 0x01): "BBS_BBS_DEVICE_PATH",
> +  (0x7F, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",
> +  (0xFF, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",
> +}
> +
> +def EFI_DEVICE_PATH_PROTOCOL_TypeSummary (valobj,internal_dict):
> +  #
> +  #
> +  #
> +  if valobj.TypeIsPointerType():
> +    # EFI_DEVICE_PATH_PROTOCOL *
> +    return ""
> +
> +  Str = ""
> +  if valobj.num_children == 3:
> +    # EFI_DEVICE_PATH_PROTOCOL
> +    Type    = valobj.GetChildMemberWithName('Type').unsigned
> +    SubType = valobj.GetChildMemberWithName('SubType').unsigned
> +    if (Type, SubType) in device_path_dict:
> +      TypeStr = device_path_dict[Type, SubType]
> +    else:
> +      TypeStr = ""
> +
> +    LenLow  =
> valobj.GetChildMemberWithName('Length').GetChildAtIndex(0).unsigned
> +    LenHigh =
> valobj.GetChildMemberWithName('Length').GetChildAtIndex(1).unsigned
> +    Len = LenLow + (LenHigh >> 8)
> +
> +    Address = long ("%d" % valobj.addr)
> +    if (Address == lldb.LLDB_INVALID_ADDRESS):
> +      # Need to reserach this, it seems to be the nested struct case
> +      ExprStr = ""
> +    elif (Type & 0x7f == 0x7f):
> +      ExprStr = "End Device Path" if SubType == 0xff else "End This Instance"
> +    else:
> +      ExprStr = "expr *(%s *)0x%08x" % (TypeStr, Address)
> +
> +    Str =  " {\n"
> +    Str += "   (UINT8) Type    = 0x%02x // %s\n" % (Type, "END" if (Type & 0x7f
> == 0x7f) else "")
> +    Str += "   (UINT8) SubType = 0x%02x // %s\n" % (SubType, ExprStr)
> +    Str += "   (UINT8 [2]) Length = { // 0x%04x (%d) bytes\n" % (Len, Len)
> +    Str += "     (UINT8) [0] = 0x%02x\n" % LenLow
> +    Str += "     (UINT8) [1] = 0x%02x\n" % LenHigh
> +    Str +=  "   }\n"
> +    if (Type & 0x7f == 0x7f) and (SubType == 0xff):
> +      pass
> +    elif ExprStr != "":
> +      NextNode = Address + Len
> +      Str += "// Next node 'expr *(EFI_DEVICE_PATH_PROTOCOL *)0x%08x'\n" %
> NextNode
> +
> +  return Str
> +
> +
> +
> +def TypePrintFormating(debugger):
> +    #
> +    # Set the default print formating for EFI types in lldb.
> +    # seems lldb defaults to decimal.
> +    #
> +    category = debugger.GetDefaultCategory()
> +    FormatBool = lldb.SBTypeFormat(lldb.eFormatBoolean)
> +    category.AddTypeFormat(lldb.SBTypeNameSpecifier("BOOLEAN"),
> FormatBool)
> +
> +    FormatHex  = lldb.SBTypeFormat(lldb.eFormatHex)
> +    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT64"), FormatHex)
> +    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT64"), FormatHex)
> +    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT32"), FormatHex)
> +    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT32"), FormatHex)
> +    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT16"), FormatHex)
> +    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT16"), FormatHex)
> +    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT8"), FormatHex)
> +    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT8"), FormatHex)
> +    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINTN"), FormatHex)
> +    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INTN"), FormatHex)
> +    category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR8"), FormatHex)
> +    category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR16"), FormatHex)
> +
> +
> category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_PHYSICAL_ADDRESS"),
> FormatHex)
> +    category.AddTypeFormat(lldb.SBTypeNameSpecifier("PHYSICAL_ADDRESS"),
> FormatHex)
> +    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_STATUS"),
> FormatHex)
> +    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_TPL"), FormatHex)
> +    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_LBA"), FormatHex)
> +    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_BOOT_MODE"),
> FormatHex)
> +    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_FV_FILETYPE"),
> FormatHex)
> +
> +    #
> +    # Smart type printing for EFI
> +    #
> +    debugger.HandleCommand("type summary add EFI_GUID --python-function
> lldbefi.EFI_GUID_TypeSummary")
> +    debugger.HandleCommand("type summary add EFI_STATUS --python-
> function lldbefi.EFI_STATUS_TypeSummary")
> +    debugger.HandleCommand("type summary add EFI_TPL --python-function
> lldbefi.EFI_TPL_TypeSummary")
> +    debugger.HandleCommand("type summary add
> EFI_DEVICE_PATH_PROTOCOL --python-function
> lldbefi.EFI_DEVICE_PATH_PROTOCOL_TypeSummary")
> +
> +    debugger.HandleCommand("type summary add CHAR16 --python-function
> lldbefi.CHAR16_TypeSummary")
> +    debugger.HandleCommand('type summary add --regex "CHAR16 \[[0-9]+\]"
> --python-function lldbefi.CHAR16_TypeSummary')
> +    debugger.HandleCommand("type summary add CHAR8 --python-function
> lldbefi.CHAR8_TypeSummary")
> +    debugger.HandleCommand('type summary add --regex "CHAR8 \[[0-9]+\]" -
> -python-function lldbefi.CHAR8_TypeSummary')
> +
> +
> +gEmulatorBreakWorkaroundNeeded = True
> +
> +def LoadEmulatorEfiSymbols(frame, bp_loc , internal_dict):
> +    #
> +    # This is an lldb breakpoint script, and assumes the breakpoint is on a
> +    # function with the same prototype as SecGdbScriptBreak(). The
> +    # argument names are important as lldb looks them up.
> +    #
> +    # VOID
> +    # SecGdbScriptBreak (
> +    #   char                *FileName,
> +    #   int                 FileNameLength,
> +    #   long unsigned int   LoadAddress,
> +    #   int                 AddSymbolFlag
> +    #   )
> +    # {
> +    #   return;
> +    # }
> +    #
> +    # When the emulator loads a PE/COFF image, it calls the stub function with
> +    # the filename of the symbol file, the length of the FileName, the
> +    # load address and a flag to indicate if this is a load or unload operation
> +    #
> +    global gEmulatorBreakWorkaroundNeeded
> +
> +    if gEmulatorBreakWorkaroundNeeded:
> +        # turn off lldb debug prints on SIGALRM (EFI timer tick)
> +        frame.thread.process.target.debugger.HandleCommand("process handle
> SIGALRM -n false")
> +        gEmulatorBreakWorkaroundNeeded = False
> +
> +    # Convert C string to Python string
> +    Error = lldb.SBError()
> +    FileNamePtr = frame.FindVariable ("FileName").GetValueAsUnsigned()
> +    FileNameLen = frame.FindVariable
> ("FileNameLength").GetValueAsUnsigned()
> +    FileName = frame.thread.process.ReadCStringFromMemory (FileNamePtr,
> FileNameLen, Error)
> +    if not Error.Success():
> +        print "!ReadCStringFromMemory() did not find a %d byte C string at %x" %
> (FileNameLen, FileNamePtr)
> +        # make breakpoint command contiue
> +        frame.GetThread().GetProcess().Continue()
> +
> +    debugger = frame.thread.process.target.debugger
> +    if frame.FindVariable ("AddSymbolFlag").GetValueAsUnsigned() == 1:
> +        LoadAddress = frame.FindVariable ("LoadAddress").GetValueAsUnsigned()
> +
> +        debugger.HandleCommand ("target modules add  %s" % FileName)
> +        print "target modules load --slid 0x%x %s" % (LoadAddress, FileName)
> +        debugger.HandleCommand ("target modules load --slide 0x%x --file %s" %
> (LoadAddress, FileName))
> +    else:
> +        target = debugger.GetSelectedTarget()
> +        for SBModule in target.module_iter():
> +            ModuleName  = SBModule.GetFileSpec().GetDirectory() + '/'
> +            ModuleName += SBModule.GetFileSpec().GetFilename()
> +            if FileName == ModuleName or FileName ==
> SBModule.GetFileSpec().GetFilename():
> +                target.ClearModuleLoadAddress (SBModule)
> +                if not target.RemoveModule (SBModule):
> +                    print "!lldb.target.RemoveModule (%s) FAILED" % SBModule
> +
> +    # make breakpoint command contiue
> +    frame.thread.process.Continue()
> +
> +def GuidToCStructStr (guid, Name=False):
> +  #
> +  # Convert a 16-byte bytesarry (or bytearray compat object) to C guid string
> +  # { 0xB402621F, 0xA940, 0x1E4A, { 0x86, 0x6B, 0x4D, 0xC9, 0x16, 0x2B, 0x34,
> 0x7C } }
> +  #
> +  # Name=True means lookup name in GuidNameDict and us it if you find it
> +  #
> +
> +  if not isinstance (guid, bytearray):
> +    # convert guid object to UUID, and UUID to bytearray
> +    Uuid = uuid.UUID(guid)
> +    guid = bytearray (Uuid.bytes_le)
> +
> +  return "{ 0x%02.2X%02.2X%02.2X%02.2X, 0x%02.2X%02.2X, 0x%02.2X%02.2X,
> { 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X,
> 0x%02.2X } }" % \
> +         (guid[3], guid[2], guid[1], guid[0], guid[5], guid[4], guid[7], guid[6],
> guid[8], guid[9], guid[10], guid[11], guid[12], guid[13], guid[14], guid[15])
> +
> +def ParseGuidString(GuidStr):
> +  #
> +  # Error check and convert C Guid init to string
> +  # ParseGuidString("49152E77-1ADA-4764-B7A2-7AFEFED95E8B")
> +  # ParseGuidString("{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7,
> 0x8A, 0x35, 0x46, 0xD1 } }")
> +  #
> +
> +  if "{" in GuidStr                                                                                         :
> +    # convert C form "{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7,
> 0x8A, 0x35, 0x46, 0xD1 } }"
> +    # to string form BA24B391-73FD-C54C-9EAF-0CA78A3546D1
> +    # make a list of Hex numbers like: ['0xBA24B391', '0x73FD', '0xC54C',
> '0x9E', '0xAF', '0x0C', '0xA7', '0x8A', '0x35', '0x46', '0xD1']
> +    Hex = ''.join(x for x in GuidStr if x not in '{,}').split()
> +    Str = "%08X-%04X-%04X-%02.2X%02.2X-
> %02.2X%02.2X%02.2X%02.2X%02.2X%02.2X" % \
> +          (int(Hex[0], 0), int(Hex[1], 0), int(Hex[2], 0), int(Hex[3], 0), int(Hex[4], 0),
> \
> +           int(Hex[5], 0), int(Hex[6], 0), int(Hex[7], 0), int(Hex[8], 0), int(Hex[9], 0),
> int(Hex[10], 0))
> +  elif GuidStr.count('-') == 4:
> +    # validate "49152E77-1ADA-4764-B7A2-7AFEFED95E8B" form
> +    Check = "%s" % str(uuid.UUID(GuidStr)).upper()
> +    if GuidStr.upper() == Check:
> +      Str = GuidStr.upper()
> +    else:
> +      Ste = ""
> +  else:
> +    Str = ""
> +
> +  return Str
> +
> +
> +def create_guid_options():
> +    usage = "usage: %prog [data]"
> +    description='''lookup EFI_GUID by CName, C struct, or GUID string and print
> out all three.
> +    '''
> +    parser = optparse.OptionParser(description=description,
> prog='guid',usage=usage)
> +    return parser
> +
> +def efi_guid_command(debugger, command, result, dict):
> +    # Use the Shell Lexer to properly parse up command options just like a
> +    # shell would
> +    command_args = shlex.split(command)
> +    parser = create_guid_options()
> +    try:
> +        (options, args) = parser.parse_args(command_args)
> +        if len(args) >= 1:
> +          if args[0] == "{":
> +              # caller forgot to quote the string"
> +              # mark arg[0] a string containing all args[n]
> +              args[0] = ' '.join(args)
> +          GuidStr = ParseGuidString (args[0])
> +          if GuidStr == "":
> +              # return Key of GuidNameDict for value args[0]
> +              GuidStr = [Key for Key, Value in guid_dict.iteritems() if Value ==
> args[0]][0]
> +          GuidStr = GuidStr.upper()
> +    except:
> +        # if you don't handle exceptions, passing an incorrect argument to the
> OptionParser will cause LLDB to exit
> +        # (courtesy of OptParse dealing with argument errors by throwing
> SystemExit)
> +        result.SetError ("option parsing failed")
> +        return
> +
> +
> +    if len(args) >= 1:
> +        if GuidStr in guid_dict:
> +            print "%s = %s" % (guid_dict[GuidStr], GuidStr)
> +            print "%s = %s" % (guid_dict[GuidStr], GuidToCStructStr (GuidStr))
> +        else:
> +            print GuidStr
> +    else:
> +        # dump entire dictionary
> +        width = max(len(v) for k,v in guid_dict.iteritems())
> +        for value in sorted(guid_dict, key=guid_dict.get):
> +            print '%-*s %s %s' % (width, guid_dict[value], value,
> GuidToCStructStr(value))
> +
> +    return
> +
> +
> +#
> +########## Code that runs when this script is imported into LLDB
> ###########
> +#
> +def __lldb_init_module (debugger, internal_dict):
> +    # This initializer is being run from LLDB in the embedded command
> interpreter
> +    # Make the options so we can generate the help text for the new LLDB
> +    # command line command prior to registering it with LLDB below
> +
> +    global guid_dict
> +
> +    # Source Guid.xref file if we can find it
> +    inputfile = os.getcwd()
> +    inputfile += os.sep + os.pardir + os.sep + 'FV' + os.sep + 'Guid.xref'
> +    with open(inputfile) as f:
> +        for line in f:
> +            data = line.split(' ')
> +            if len(data) >= 2:
> +                guid_dict[data[0].upper()] = data[1].strip('\n')
> +
> +    # init EFI specific type formaters
> +    TypePrintFormating (debugger)
> +
> +
> +    # add guid command
> +    parser = create_guid_options()
> +    efi_guid_command.__doc__ = parser.format_help()
> +    debugger.HandleCommand('command script add -f
> lldbefi.efi_guid_command guid')
> +
> +
> +    Target = debugger.GetTargetAtIndex(0)
> +    if Target:
> +        Breakpoint = Target.BreakpointCreateByName('SecGdbScriptBreak')
> +        if Breakpoint.GetNumLocations() == 1:
> +            # Set the emulator breakpoints, if we are in the emulator
> +            debugger.HandleCommand("breakpoint command add -s python -F
> lldbefi.LoadEmulatorEfiSymbols {id}".format(id=Breakpoint.GetID()))
> +            print 'Type r to run emulator. SecLldbScriptBreak armed. EFI modules
> should now get source level debugging in the emulator.'
> diff --git a/EmulatorPkg/Win/Host/WinBlockIo.c
> b/EmulatorPkg/Win/Host/WinBlockIo.c
> index 14491a6e90..d5944c4227 100644
> --- a/EmulatorPkg/Win/Host/WinBlockIo.c
> +++ b/EmulatorPkg/Win/Host/WinBlockIo.c
> @@ -270,7 +270,7 @@ WinNtSignalToken (
>    @param[in]       MediaId    Id of the media, changes every time the media is
>                                replaced.
>    @param[in]       Lba        The starting Logical Block Address to read from.
> -  @param[in, out]  Token	    A pointer to the token associated with the
> transaction.
> +  @param[in, out]  Token      A pointer to the token associated with the
> transaction.
>    @param[in]       BufferSize Size of Buffer, must be a multiple of device block
> size.
>    @param[out]      Buffer     A pointer to the destination buffer for the data.
> The
>                                caller is responsible for either having implicit or
> diff --git a/EmulatorPkg/Win/Host/WinHost.h
> b/EmulatorPkg/Win/Host/WinHost.h
> index 6f1f1a2dd3..991da1c15b 100644
> --- a/EmulatorPkg/Win/Host/WinHost.h
> +++ b/EmulatorPkg/Win/Host/WinHost.h
> @@ -206,4 +206,4 @@ extern EMU_THUNK_PROTOCOL    gEmuThunkProtocol;
>  extern EMU_IO_THUNK_PROTOCOL mWinNtWndThunkIo;
>  extern EMU_IO_THUNK_PROTOCOL mWinNtFileSystemThunkIo;
>  extern EMU_IO_THUNK_PROTOCOL mWinNtBlockIoThunkIo;
> -#endif
> \ No newline at end of file
> +#endif
> --
> 2.16.1.windows.1



      reply	other threads:[~2018-08-29  5:06 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-08-29  3:39 [PATCH] EmulatorPkg: formalize line endings Ruiyu Ni
2018-08-29  5:06 ` Wu, Hao A [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=B80AF82E9BFB8E4FBD8C89DA810C6A0931E3CEAB@SHSMSX104.ccr.corp.intel.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox