]> git.proxmox.com Git - mirror_edk2.git/commitdiff
EmulatorPkg: formalize line endings
authorRuiyu Ni <ruiyu.ni@intel.com>
Wed, 29 Aug 2018 03:39:06 +0000 (11:39 +0800)
committerRuiyu Ni <ruiyu.ni@intel.com>
Thu, 30 Aug 2018 01:26:54 +0000 (09:26 +0800)
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>
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
51 files changed:
EmulatorPkg/CpuRuntimeDxe/Cpu.c
EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c
EmulatorPkg/EmuGopDxe/Gop.h
EmulatorPkg/EmuGopDxe/GopInput.c
EmulatorPkg/EmuGopDxe/GopScreen.c
EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c
EmulatorPkg/Include/Library/EmuMagicPageLib.h
EmulatorPkg/Include/Library/EmuThunkLib.h
EmulatorPkg/Include/Library/PpiListLib.h
EmulatorPkg/Include/Library/SmbiosLib.h
EmulatorPkg/Include/Protocol/EmuBlockIo.h
EmulatorPkg/Include/Protocol/EmuFileSystem.h
EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h
EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c
EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf
EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c
EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActionLib.inf
EmulatorPkg/Library/DxeEmuStdErrSerialPortLib/DxeEmuStdErrSerialPortLib.c
EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c
EmulatorPkg/Library/PeiCoreServicesTablePointerLib/PeiServicesTablePointer.c
EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraActionLib.inf
EmulatorPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c
EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTablePointer.c
EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf
EmulatorPkg/Library/SecPeiServicesLib/FwVol.c
EmulatorPkg/Library/SecPpiListLib/PpiListLib.c
EmulatorPkg/Library/SmbiosLib/SmbiosLib.c
EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf
EmulatorPkg/MiscSubClassPlatformDxe/MiscSubClassDriver.h
EmulatorPkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c
EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c
EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.inf
EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c
EmulatorPkg/Sec/Ia32/SwitchRam.asm
EmulatorPkg/Sec/Sec.c
EmulatorPkg/Sec/Sec.h
EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c
EmulatorPkg/Unix/Host/BlockIo.c
EmulatorPkg/Unix/Host/EmuThunk.c
EmulatorPkg/Unix/Host/Host.c
EmulatorPkg/Unix/Host/Host.h
EmulatorPkg/Unix/Host/Ia32/Gasket.S
EmulatorPkg/Unix/Host/Ia32/SwitchStack.c
EmulatorPkg/Unix/Host/MemoryAllocationLib.c
EmulatorPkg/Unix/Host/PosixFileSystem.c
EmulatorPkg/Unix/Host/Pthreads.c
EmulatorPkg/Unix/Host/X11GraphicsWindow.c
EmulatorPkg/Unix/Host/X64/Gasket.S
EmulatorPkg/Unix/lldbefi.py
EmulatorPkg/Win/Host/WinBlockIo.c
EmulatorPkg/Win/Host/WinHost.h

index 47fb7f07e891a74554b30411f646d615909a6e21..83e876509ac19fc9806ac5867da69d018d7be31c 100644 (file)
@@ -63,7 +63,7 @@ SMBIOS_TABLE_TYPE4 mCpuSmbiosType4 = {
       0, //  ProcessorXModel:    4;\r
       0, //  ProcessorXFamily:   8;\r
       0, //  ProcessorReserved2: 4;\r
-    }, \r
+    },\r
     {  // PROCESSOR_FEATURE_FLAGS\r
       0, //  ProcessorFpu       :1;\r
       0, //  ProcessorVme       :1;\r
@@ -100,13 +100,13 @@ SMBIOS_TABLE_TYPE4 mCpuSmbiosType4 = {
   },\r
   3,                    // ProcessorVersion String;\r
   {                     // Voltage;\r
-    1,  // ProcessorVoltageCapability5V        :1; \r
-    1,  // ProcessorVoltageCapability3_3V      :1;  \r
-    1,  // ProcessorVoltageCapability2_9V      :1;  \r
+    1,  // ProcessorVoltageCapability5V        :1;\r
+    1,  // ProcessorVoltageCapability3_3V      :1;\r
+    1,  // ProcessorVoltageCapability2_9V      :1;\r
     0,  // ProcessorVoltageCapabilityReserved  :1; ///< Bit 3, must be zero.\r
     0,  // ProcessorVoltageReserved            :3; ///< Bits 4-6, must be zero.\r
     0   // ProcessorVoltageIndicateLegacy      :1;\r
-  },              \r
+  },\r
   0,                      // ExternalClock;\r
   0,                      // MaxSpeed;\r
   0,                      // CurrentSpeed;\r
@@ -151,26 +151,26 @@ CHAR8 *mCpuSmbiosType4Strings[] = {
     "Not Found",\r
     NULL\r
   };\r
-  \r
+\r
   ...\r
   LogSmbiosData (\r
-    (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12, \r
+    (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,\r
     gSmbiosType12Strings\r
     );\r
 \r
   @param  Template    Fixed SMBIOS structure, required.\r
-  @param  StringArray Array of strings to convert to an SMBIOS string pack. \r
+  @param  StringArray Array of strings to convert to an SMBIOS string pack.\r
                       NULL is OK.\r
 \r
 **/\r
 EFI_STATUS\r
 LogSmbiosData (\r
   IN  EFI_SMBIOS_TABLE_HEADER *Template,\r
-  IN  CHAR8                   **StringPack \r
+  IN  CHAR8                   **StringPack\r
   )\r
 {\r
   EFI_STATUS                Status;\r
-  EFI_SMBIOS_PROTOCOL       *Smbios;  \r
+  EFI_SMBIOS_PROTOCOL       *Smbios;\r
   EFI_SMBIOS_HANDLE         SmbiosHandle;\r
   EFI_SMBIOS_TABLE_HEADER   *Record;\r
   UINTN                     Index;\r
@@ -219,7 +219,7 @@ LogSmbiosData (
     Str += StringSize;\r
   }\r
   *Str = 0;\r
-  \r
+\r
   SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
   Status = Smbios->Add (\r
                      Smbios,\r
@@ -228,7 +228,7 @@ LogSmbiosData (
                      Record\r
                      );\r
   ASSERT_EFI_ERROR (Status);\r
-  \r
+\r
   FreePool (Record);\r
   return Status;\r
 }\r
index e77de2c7bcdbf89799a2932b45b4aa3599f97e8a..b9ac6ce080eda78d22829e205240349e28d44590 100644 (file)
@@ -61,7 +61,7 @@ EmuBlockIo2Reset (
   @param[in]       MediaId    Id of the media, changes every time the media is\r
                               replaced.\r
   @param[in]       Lba        The starting Logical Block Address to read from.\r
-  @param[in, out]  Token           A pointer to the token associated with the transaction.\r
+  @param[in, out]  Token      A pointer to the token associated with the transaction.\r
   @param[in]       BufferSize Size of Buffer, must be a multiple of device block size.\r
   @param[out]      Buffer     A pointer to the destination buffer for the data. The\r
                               caller is responsible for either having implicit or\r
index 6f7b082618b49e1e9d664fe9241e39e40bafcd8c..3b533013cecae4d18f913a12c3cd94754cf3ddac 100644 (file)
-/*++ @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\r
+\r
+Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>\r
+Portions copyright (c) 2010,Apple Inc. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __UGA_H_\r
+#define __UGA_H_\r
+\r
+#include <PiDxe.h>\r
+\r
+#include <Protocol/GraphicsOutput.h>\r
+#include <Protocol/SimpleTextIn.h>\r
+#include <Protocol/SimpleTextInEx.h>\r
+#include <Protocol/SimplePointer.h>\r
+#include <Protocol/EmuIoThunk.h>\r
+#include <Protocol/EmuGraphicsWindow.h>\r
+\r
+#include <Guid/EventGroup.h>\r
+\r
+#include <Library/DebugLib.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/UefiDriverEntryPoint.h>\r
+#include <Library/UefiLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/KeyMapLib.h>\r
+\r
+\r
+#define MAX_Q 256\r
+\r
+typedef struct {\r
+  UINTN         Front;\r
+  UINTN         Rear;\r
+  UINTN         Count;\r
+  EFI_INPUT_KEY Q[MAX_Q];\r
+} GOP_QUEUE_FIXED;\r
+\r
+#define EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE SIGNATURE_32 ('U', 'g', 'S', 'n')\r
+typedef struct _EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY {\r
+  UINTN                                 Signature;\r
+  EFI_HANDLE                            NotifyHandle;\r
+  EFI_KEY_DATA                          KeyData;\r
+  EFI_KEY_NOTIFY_FUNCTION               KeyNotificationFn;\r
+  EFI_EVENT                             Event;\r
+  LIST_ENTRY                            NotifyEntry;\r
+} EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY;\r
+\r
+#define GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER 0xffff\r
+\r
+typedef struct {\r
+  UINT32                     HorizontalResolution;\r
+  UINT32                     VerticalResolution;\r
+  UINT32                     ColorDepth;\r
+  UINT32                     RefreshRate;\r
+} GOP_MODE_DATA;\r
+\r
+\r
+\r
+extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;\r
+extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;\r
+\r
+#define EMU_UGA_CLASS_NAME       L"EmuGopWindow"\r
+\r
+#define GOP_PRIVATE_DATA_SIGNATURE  SIGNATURE_32 ('G', 'o', 'p', 'N')\r
+typedef struct {\r
+  UINT64                            Signature;\r
+\r
+  EFI_HANDLE                        Handle;\r
+  EFI_GRAPHICS_OUTPUT_PROTOCOL      GraphicsOutput;\r
+  EFI_SIMPLE_TEXT_INPUT_PROTOCOL    SimpleTextIn;\r
+  EFI_SIMPLE_POINTER_PROTOCOL       SimplePointer;\r
+\r
+  EMU_IO_THUNK_PROTOCOL             *EmuIoThunk;\r
+  EMU_GRAPHICS_WINDOW_PROTOCOL      *EmuGraphicsWindow;\r
+\r
+  EFI_UNICODE_STRING_TABLE          *ControllerNameTable;\r
+\r
+  EFI_SIMPLE_POINTER_MODE           PointerMode;\r
+  //\r
+  // GOP Private Data for QueryMode ()\r
+  //\r
+  GOP_MODE_DATA                     *ModeData;\r
+\r
+\r
+  //\r
+  // UGA Private Data knowing when to start hardware\r
+  //\r
+  BOOLEAN                           HardwareNeedsStarting;\r
+\r
+  CHAR16                            *WindowName;\r
+\r
+  GOP_QUEUE_FIXED                   Queue;\r
+\r
+  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleTextInEx;\r
+  EFI_KEY_STATE                     KeyState;\r
+  LIST_ENTRY                        NotifyList;\r
+} GOP_PRIVATE_DATA;\r
+\r
+\r
+#define GOP_PRIVATE_DATA_FROM_THIS(a)  \\r
+         CR(a, GOP_PRIVATE_DATA, GraphicsOutput, GOP_PRIVATE_DATA_SIGNATURE)\r
+\r
+#define GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS(a)  \\r
+         CR(a, GOP_PRIVATE_DATA, SimpleTextIn, GOP_PRIVATE_DATA_SIGNATURE)\r
+\r
+#define GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS(a)  \\r
+         CR(a, GOP_PRIVATE_DATA, SimpleTextInEx, GOP_PRIVATE_DATA_SIGNATURE)\r
+\r
+#define GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS(a)  \\r
+         CR(a, GOP_PRIVATE_DATA, SimplePointer, GOP_PRIVATE_DATA_SIGNATURE)\r
+\r
+\r
+//\r
+// Global Protocol Variables\r
+//\r
+extern EFI_DRIVER_BINDING_PROTOCOL  gEmuGopDriverBinding;\r
+extern EFI_COMPONENT_NAME_PROTOCOL  gEmuGopComponentName;\r
+extern EFI_COMPONENT_NAME2_PROTOCOL gEmuGopComponentName2;\r
+\r
+//\r
+// Gop Hardware abstraction internal worker functions\r
+//\r
+EFI_STATUS\r
+EmuGopSupported (\r
+  IN  EMU_IO_THUNK_PROTOCOL  *EmuIoThunk\r
+  );\r
+\r
+EFI_STATUS\r
+EmuGopConstructor (\r
+  IN  GOP_PRIVATE_DATA    *Private\r
+  );\r
+\r
+EFI_STATUS\r
+EmuGopDestructor (\r
+  IN  GOP_PRIVATE_DATA    *Private\r
+  );\r
+\r
+\r
+EFI_STATUS\r
+GopPrivateAddQ (\r
+  IN  GOP_PRIVATE_DATA    *Private,\r
+  IN  EFI_INPUT_KEY       Key\r
+  );\r
+\r
+EFI_STATUS\r
+EmuGopInitializeSimpleTextInForWindow (\r
+  IN  GOP_PRIVATE_DATA    *Private\r
+  );\r
+\r
+EFI_STATUS\r
+EmuGopInitializeSimplePointerForWindow (\r
+  IN  GOP_PRIVATE_DATA    *Private\r
+  );\r
+\r
+EFI_STATUS\r
+EmuGopStartWindow (\r
+  IN  GOP_PRIVATE_DATA    *Private,\r
+  IN  UINT32              HorizontalResolution,\r
+  IN  UINT32              VerticalResolution,\r
+  IN  UINT32              ColorDepth,\r
+  IN  UINT32              RefreshRate\r
+  );\r
+\r
+VOID\r
+EFIAPI\r
+ShutdownGopEvent (\r
+  IN EFI_EVENT  Event,\r
+  IN VOID       *Context\r
+  );\r
+\r
+VOID\r
+EFIAPI\r
+GopPrivateMakeCallbackFunction (\r
+  IN VOID           *Context,\r
+  IN EFI_KEY_DATA   *KeyData\r
+  );\r
+\r
+VOID\r
+EFIAPI\r
+GopPrivateBreakCallbackFunction (\r
+  IN VOID           *Context,\r
+  IN EFI_KEY_DATA   *KeyData\r
+  );\r
+\r
+#endif\r
index cf37a7bd70a2bb2fef88d08c4200ad9e07401a41..1d40b1d7d682e308168b92481c1ef35c3a3529e5 100644 (file)
-/*++ @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\r
+\r
+Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>\r
+Portions copyright (c) 2010 0 2011,Apple Inc. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+\r
+**/\r
+\r
+#include "Gop.h"\r
+\r
+\r
+BOOLEAN\r
+GopPrivateIsKeyRegistered (\r
+  IN EFI_KEY_DATA  *RegsiteredData,\r
+  IN EFI_KEY_DATA  *InputData\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+Arguments:\r
+\r
+  RegsiteredData    - A pointer to a buffer that is filled in with the keystroke\r
+                      state data for the key that was registered.\r
+  InputData         - A pointer to a buffer that is filled in with the keystroke\r
+                      state data for the key that was pressed.\r
+\r
+Returns:\r
+  TRUE              - Key be pressed matches a registered key.\r
+  FLASE             - Match failed.\r
+\r
+**/\r
+{\r
+  ASSERT (RegsiteredData != NULL && InputData != NULL);\r
+\r
+  if ((RegsiteredData->Key.ScanCode    != InputData->Key.ScanCode) ||\r
+      (RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) {\r
+    return FALSE;\r
+  }\r
+\r
+  //\r
+  // Assume KeyShiftState/KeyToggleState = 0 in Registered key data means these state could be ignored.\r
+  //\r
+  if (RegsiteredData->KeyState.KeyShiftState != 0 &&\r
+      RegsiteredData->KeyState.KeyShiftState != InputData->KeyState.KeyShiftState) {\r
+    return FALSE;\r
+  }\r
+  if (RegsiteredData->KeyState.KeyToggleState != 0 &&\r
+      RegsiteredData->KeyState.KeyToggleState != InputData->KeyState.KeyToggleState) {\r
+    return FALSE;\r
+  }\r
+\r
+  return TRUE;\r
+\r
+}\r
+\r
+\r
+VOID\r
+EFIAPI\r
+GopPrivateMakeCallbackFunction (\r
+  IN VOID           *Context,\r
+  IN EFI_KEY_DATA   *KeyData\r
+  )\r
+{\r
+  LIST_ENTRY                        *Link;\r
+  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY  *CurrentNotify;\r
+  GOP_PRIVATE_DATA                  *Private = (GOP_PRIVATE_DATA *)Context;\r
+\r
+  KeyMapMake (KeyData);\r
+\r
+  for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {\r
+    CurrentNotify = CR (\r
+                      Link,\r
+                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,\r
+                      NotifyEntry,\r
+                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE\r
+                      );\r
+    if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {\r
+      // We could be called at a high TPL so signal an event to call the registered function\r
+      // at a lower TPL.\r
+      gBS->SignalEvent (CurrentNotify->Event);\r
+    }\r
+  }\r
+}\r
+\r
+\r
+VOID\r
+EFIAPI\r
+GopPrivateBreakCallbackFunction (\r
+  IN VOID           *Context,\r
+  IN EFI_KEY_DATA   *KeyData\r
+  )\r
+{\r
+  KeyMapBreak (KeyData);\r
+}\r
+\r
+\r
+\r
+//\r
+// Simple Text In implementation.\r
+//\r
+\r
+/**\r
+  Reset the input device and optionally run diagnostics\r
+\r
+  @param  This                 Protocol instance pointer.\r
+  @param  ExtendedVerification Driver may perform diagnostics on reset.\r
+\r
+  @retval EFI_SUCCESS          The device was reset.\r
+  @retval EFI_DEVICE_ERROR     The device is not functioning properly and could not be reset.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopSimpleTextInReset (\r
+  IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL       *This,\r
+  IN BOOLEAN                              ExtendedVerification\r
+  )\r
+{\r
+  GOP_PRIVATE_DATA  *Private;\r
+  EFI_KEY_DATA      KeyData;\r
+  EFI_TPL           OldTpl;\r
+\r
+  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);\r
+  if (Private->EmuGraphicsWindow == NULL) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  //\r
+  // Enter critical section\r
+  //\r
+  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
+\r
+  //\r
+  // A reset is draining the Queue\r
+  //\r
+  while (Private->EmuGraphicsWindow->GetKey (Private->EmuGraphicsWindow, &KeyData) == EFI_SUCCESS)\r
+    ;\r
+\r
+  //\r
+  // Leave critical section and return\r
+  //\r
+  gBS->RestoreTPL (OldTpl);\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+  Reads the next keystroke from the input device. The WaitForKey Event can\r
+  be used to test for existence of a keystroke via WaitForEvent () call.\r
+\r
+  @param  This  Protocol instance pointer.\r
+  @param  Key   A pointer to a buffer that is filled in with the keystroke\r
+                information for the key that was pressed.\r
+\r
+  @retval EFI_SUCCESS      The keystroke information was returned.\r
+  @retval EFI_NOT_READY    There was no keystroke data available.\r
+  @retval EFI_DEVICE_ERROR The keystroke information was not returned due to\r
+                           hardware errors.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopSimpleTextInReadKeyStroke (\r
+  IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL       *This,\r
+  OUT EFI_INPUT_KEY                       *Key\r
+  )\r
+{\r
+  GOP_PRIVATE_DATA  *Private;\r
+  EFI_STATUS        Status;\r
+  EFI_TPL           OldTpl;\r
+  EFI_KEY_DATA      KeyData;\r
+\r
+  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);\r
+  if (Private->EmuGraphicsWindow == NULL) {\r
+    return EFI_NOT_READY;\r
+  }\r
+\r
+  //\r
+  // Enter critical section\r
+  //\r
+  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);\r
+\r
+  Status  = Private->EmuGraphicsWindow->GetKey (Private->EmuGraphicsWindow, &KeyData);\r
+  if (!EFI_ERROR (Status)) {\r
+    if ((KeyData.Key.ScanCode == 0) && (KeyData.Key.UnicodeChar == 0)) {\r
+      // Modifier key was pressed\r
+      Status = EFI_NOT_READY;\r
+    } else {\r
+      CopyMem (Key, &KeyData.Key, sizeof (EFI_INPUT_KEY));\r
+    }\r
+  }\r
+\r
+  //\r
+  // Leave critical section and return\r
+  //\r
+  gBS->RestoreTPL (OldTpl);\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+\r
+/**\r
+  SimpleTextIn and SimpleTextInEx Notify Wait Event\r
+\r
+  @param  Event                 Event whose notification function is being invoked.\r
+  @param  Context               Pointer to GOP_PRIVATE_DATA.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+EmuGopSimpleTextInWaitForKey (\r
+  IN EFI_EVENT          Event,\r
+  IN VOID               *Context\r
+  )\r
+{\r
+  GOP_PRIVATE_DATA  *Private;\r
+  EFI_STATUS        Status;\r
+  EFI_TPL           OldTpl;\r
+\r
+  Private = (GOP_PRIVATE_DATA *) Context;\r
+  if (Private->EmuGraphicsWindow == NULL) {\r
+    return;\r
+  }\r
+\r
+  //\r
+  // Enter critical section\r
+  //\r
+  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);\r
+\r
+  Status  = Private->EmuGraphicsWindow->CheckKey (Private->EmuGraphicsWindow);\r
+  if (!EFI_ERROR (Status)) {\r
+    //\r
+    // If a there is a key in the queue signal our event.\r
+    //\r
+    gBS->SignalEvent (Event);\r
+  }\r
+  //\r
+  // Leave critical section and return\r
+  //\r
+  gBS->RestoreTPL (OldTpl);\r
+}\r
+\r
+\r
+//\r
+// Simple Text Input Ex protocol functions\r
+//\r
+\r
+\r
+/**\r
+  The Reset() function resets the input device hardware. As part\r
+  of initialization process, the firmware/device will make a quick\r
+  but reasonable attempt to verify that the device is functioning.\r
+  If the ExtendedVerification flag is TRUE the firmware may take\r
+  an extended amount of time to verify the device is operating on\r
+  reset. Otherwise the reset operation is to occur as quickly as\r
+  possible. The hardware verification process is not defined by\r
+  this specification and is left up to the platform firmware or\r
+  driver to implement.\r
+\r
+  @param This                 A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.\r
+\r
+  @param ExtendedVerification Indicates that the driver may\r
+                              perform a more exhaustive\r
+                              verification operation of the\r
+                              device during reset.\r
+\r
+\r
+  @retval EFI_SUCCESS       The device was reset.\r
+\r
+  @retval EFI_DEVICE_ERROR  The device is not functioning\r
+                            correctly and could not be reset.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopSimpleTextInExResetEx (\r
+  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,\r
+  IN BOOLEAN                            ExtendedVerification\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Reset the input device and optionaly run diagnostics\r
+\r
+  Arguments:\r
+    This                 - Protocol instance pointer.\r
+    ExtendedVerification - Driver may perform diagnostics on reset.\r
+\r
+  Returns:\r
+    EFI_SUCCESS           - The device was reset.\r
+\r
+**/\r
+{\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+\r
+/**\r
+  The function reads the next keystroke from the input device. If\r
+  there is no pending keystroke the function returns\r
+  EFI_NOT_READY. If there is a pending keystroke, then\r
+  KeyData.Key.ScanCode is the EFI scan code defined in Error!\r
+  Reference source not found. The KeyData.Key.UnicodeChar is the\r
+  actual printable character or is zero if the key does not\r
+  represent a printable character (control key, function key,\r
+  etc.). The KeyData.KeyState is shift state for the character\r
+  reflected in KeyData.Key.UnicodeChar or KeyData.Key.ScanCode .\r
+  When interpreting the data from this function, it should be\r
+  noted that if a class of printable characters that are\r
+  normally adjusted by shift modifiers (e.g. Shift Key + "f"\r
+  key) would be presented solely as a KeyData.Key.UnicodeChar\r
+  without the associated shift state. So in the previous example\r
+  of a Shift Key + "f" key being pressed, the only pertinent\r
+  data returned would be KeyData.Key.UnicodeChar with the value\r
+  of "F". This of course would not typically be the case for\r
+  non-printable characters such as the pressing of the Right\r
+  Shift Key + F10 key since the corresponding returned data\r
+  would be reflected both in the KeyData.KeyState.KeyShiftState\r
+  and KeyData.Key.ScanCode values. UEFI drivers which implement\r
+  the EFI_SIMPLE_TEXT_INPUT_EX protocol are required to return\r
+  KeyData.Key and KeyData.KeyState values. These drivers must\r
+  always return the most current state of\r
+  KeyData.KeyState.KeyShiftState and\r
+  KeyData.KeyState.KeyToggleState. It should also be noted that\r
+  certain input devices may not be able to produce shift or toggle\r
+  state information, and in those cases the high order bit in the\r
+  respective Toggle and Shift state fields should not be active.\r
+\r
+\r
+  @param This     A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.\r
+\r
+  @param KeyData  A pointer to a buffer that is filled in with\r
+                  the keystroke state data for the key that was\r
+                  pressed.\r
+\r
+\r
+  @retval EFI_SUCCESS     The keystroke information was\r
+                          returned.\r
+\r
+  @retval EFI_NOT_READY   There was no keystroke data available.\r
+                          EFI_DEVICE_ERROR The keystroke\r
+                          information was not returned due to\r
+                          hardware errors.\r
+\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopSimpleTextInExReadKeyStrokeEx (\r
+  IN  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,\r
+  OUT EFI_KEY_DATA                      *KeyData\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Reads the next keystroke from the input device. The WaitForKey Event can\r
+    be used to test for existance of a keystroke via WaitForEvent () call.\r
+\r
+  Arguments:\r
+    This       - Protocol instance pointer.\r
+    KeyData    - A pointer to a buffer that is filled in with the keystroke\r
+                 state data for the key that was pressed.\r
+\r
+  Returns:\r
+    EFI_SUCCESS           - The keystroke information was returned.\r
+    EFI_NOT_READY         - There was no keystroke data availiable.\r
+    EFI_DEVICE_ERROR      - The keystroke information was not returned due to\r
+                            hardware errors.\r
+    EFI_INVALID_PARAMETER - KeyData is NULL.\r
+\r
+**/\r
+{\r
+  EFI_STATUS        Status;\r
+  GOP_PRIVATE_DATA  *Private;\r
+  EFI_TPL           OldTpl;\r
+\r
+\r
+  if (KeyData == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);\r
+  if (Private->EmuGraphicsWindow == NULL) {\r
+    return EFI_NOT_READY;\r
+  }\r
+\r
+  //\r
+  // Enter critical section\r
+  //\r
+  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);\r
+\r
+  Status  = Private->EmuGraphicsWindow->GetKey(Private->EmuGraphicsWindow, KeyData);\r
+\r
+  //\r
+  // Leave critical section and return\r
+  //\r
+  gBS->RestoreTPL (OldTpl);\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+\r
+/**\r
+  The SetState() function allows the input device hardware to\r
+  have state settings adjusted.\r
+\r
+  @param This           A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.\r
+\r
+  @param KeyToggleState Pointer to the EFI_KEY_TOGGLE_STATE to\r
+                        set the state for the input device.\r
+\r
+\r
+  @retval EFI_SUCCESS       The device state was set appropriately.\r
+\r
+  @retval EFI_DEVICE_ERROR  The device is not functioning\r
+                            correctly and could not have the\r
+                            setting adjusted.\r
+\r
+  @retval EFI_UNSUPPORTED   The device does not support the\r
+                            ability to have its state set.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopSimpleTextInExSetState (\r
+  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,\r
+  IN EFI_KEY_TOGGLE_STATE               *KeyToggleState\r
+  )\r
+{\r
+  GOP_PRIVATE_DATA  *Private;\r
+  EFI_STATUS        Status;\r
+  EFI_TPL           OldTpl;\r
+\r
+  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);\r
+  if (Private->EmuGraphicsWindow == NULL) {\r
+    return EFI_NOT_READY;\r
+  }\r
+\r
+  //\r
+  // Enter critical section\r
+  //\r
+  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);\r
+\r
+  Status  = Private->EmuGraphicsWindow->KeySetState (Private->EmuGraphicsWindow, KeyToggleState);\r
+  //\r
+  // Leave critical section and return\r
+  //\r
+  gBS->RestoreTPL (OldTpl);\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+/**\r
+  SimpleTextIn and SimpleTextInEx Notify Wait Event\r
+\r
+  @param  Event                 Event whose notification function is being invoked.\r
+  @param  Context               Pointer to GOP_PRIVATE_DATA.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+EmuGopRegisterKeyCallback (\r
+  IN EFI_EVENT          Event,\r
+  IN VOID               *Context\r
+  )\r
+{\r
+  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *ExNotify = (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *)Context;\r
+\r
+  ExNotify->KeyNotificationFn (&ExNotify->KeyData);\r
+}\r
+\r
+\r
+\r
+/**\r
+  The RegisterKeystrokeNotify() function registers a function\r
+  which will be called when a specified keystroke will occur.\r
+\r
+  @param This                     A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.\r
+\r
+  @param KeyData                  A pointer to a buffer that is filled in with\r
+                                  the keystroke information for the key that was\r
+                                  pressed.\r
+\r
+  @param KeyNotificationFunction  Points to the function to be\r
+                                  called when the key sequence\r
+                                  is typed specified by KeyData.\r
+\r
+\r
+  @param NotifyHandle             Points to the unique handle assigned to\r
+                                  the registered notification.\r
+\r
+  @retval EFI_SUCCESS           The device state was set\r
+                                appropriately.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES  Unable to allocate necessary\r
+                                data structures.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopSimpleTextInExRegisterKeyNotify (\r
+  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,\r
+  IN EFI_KEY_DATA                       *KeyData,\r
+  IN EFI_KEY_NOTIFY_FUNCTION            KeyNotificationFunction,\r
+  OUT EFI_HANDLE                        *NotifyHandle\r
+  )\r
+{\r
+  EFI_STATUS                          Status;\r
+  GOP_PRIVATE_DATA                    *Private;\r
+  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY     *CurrentNotify;\r
+  LIST_ENTRY                          *Link;\r
+  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY     *NewNotify;\r
+\r
+  if (KeyData == NULL || KeyNotificationFunction == NULL || NotifyHandle == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);\r
+\r
+  //\r
+  // Return EFI_SUCCESS if the (KeyData, NotificationFunction) is already registered.\r
+  //\r
+  for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {\r
+    CurrentNotify = CR (\r
+                      Link,\r
+                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,\r
+                      NotifyEntry,\r
+                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE\r
+                      );\r
+    if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {\r
+      if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) {\r
+        *NotifyHandle = CurrentNotify->NotifyHandle;\r
+        return EFI_SUCCESS;\r
+      }\r
+    }\r
+  }\r
+\r
+  //\r
+  // Allocate resource to save the notification function\r
+  //\r
+  NewNotify = (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) AllocateZeroPool (sizeof (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY));\r
+  if (NewNotify == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  NewNotify->Signature         = EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE;\r
+  NewNotify->KeyNotificationFn = KeyNotificationFunction;\r
+  NewNotify->NotifyHandle      = (EFI_HANDLE) NewNotify;\r
+  CopyMem (&NewNotify->KeyData, KeyData, sizeof (KeyData));\r
+  InsertTailList (&Private->NotifyList, &NewNotify->NotifyEntry);\r
+\r
+  Status = gBS->CreateEvent (\r
+                  EVT_NOTIFY_SIGNAL,\r
+                  TPL_NOTIFY,\r
+                  EmuGopRegisterKeyCallback,\r
+                  NewNotify,\r
+                  &NewNotify->Event\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+\r
+  *NotifyHandle = NewNotify->NotifyHandle;\r
+\r
+  return EFI_SUCCESS;\r
+\r
+}\r
+\r
+\r
+/**\r
+  The UnregisterKeystrokeNotify() function removes the\r
+  notification which was previously registered.\r
+\r
+  @param This               A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.\r
+\r
+  @param NotificationHandle The handle of the notification\r
+                            function being unregistered.\r
+\r
+  @retval EFI_SUCCESS The device state was set appropriately.\r
+\r
+  @retval EFI_INVALID_PARAMETER The NotificationHandle is\r
+                                invalid.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopSimpleTextInExUnregisterKeyNotify (\r
+  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,\r
+  IN EFI_HANDLE                         NotificationHandle\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Remove a registered notification function from a particular keystroke.\r
+\r
+  Arguments:\r
+    This                    - Protocol instance pointer.\r
+    NotificationHandle      - The handle of the notification function being unregistered.\r
+\r
+  Returns:\r
+    EFI_SUCCESS             - The notification function was unregistered successfully.\r
+    EFI_INVALID_PARAMETER   - The NotificationHandle is invalid.\r
+\r
+**/\r
+{\r
+  GOP_PRIVATE_DATA                   *Private;\r
+  LIST_ENTRY                         *Link;\r
+  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;\r
+\r
+  if (NotificationHandle == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if (((EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) NotificationHandle)->Signature != EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);\r
+\r
+  for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {\r
+    CurrentNotify = CR (\r
+                      Link,\r
+                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,\r
+                      NotifyEntry,\r
+                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE\r
+                      );\r
+    if (CurrentNotify->NotifyHandle == NotificationHandle) {\r
+      //\r
+      // Remove the notification function from NotifyList and free resources\r
+      //\r
+      RemoveEntryList (&CurrentNotify->NotifyEntry);\r
+\r
+      gBS->CloseEvent (CurrentNotify->Event);\r
+\r
+      gBS->FreePool (CurrentNotify);\r
+      return EFI_SUCCESS;\r
+    }\r
+  }\r
+\r
+  //\r
+  // Can not find the specified Notification Handle\r
+  //\r
+  return EFI_INVALID_PARAMETER;\r
+}\r
+\r
+\r
+\r
+/**\r
+  Initialize SimplelTextIn and SimpleTextInEx protocols in the Private\r
+  context structure.\r
+\r
+  @param  Private               Context structure to fill in.\r
+\r
+  @return EFI_SUCCESS           Initialization was a success\r
+\r
+**/\r
+EFI_STATUS\r
+EmuGopInitializeSimpleTextInForWindow (\r
+  IN  GOP_PRIVATE_DATA    *Private\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+\r
+  //\r
+  // Initialize Simple Text In protoocol\r
+  //\r
+  Private->SimpleTextIn.Reset         = EmuGopSimpleTextInReset;\r
+  Private->SimpleTextIn.ReadKeyStroke = EmuGopSimpleTextInReadKeyStroke;\r
+\r
+  Status = gBS->CreateEvent (\r
+                  EVT_NOTIFY_WAIT,\r
+                  TPL_NOTIFY,\r
+                  EmuGopSimpleTextInWaitForKey,\r
+                  Private,\r
+                  &Private->SimpleTextIn.WaitForKey\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+\r
+  //\r
+  // Initialize Simple Text In Ex\r
+  //\r
+\r
+  Private->SimpleTextInEx.Reset               = EmuGopSimpleTextInExResetEx;\r
+  Private->SimpleTextInEx.ReadKeyStrokeEx     = EmuGopSimpleTextInExReadKeyStrokeEx;\r
+  Private->SimpleTextInEx.SetState            = EmuGopSimpleTextInExSetState;\r
+  Private->SimpleTextInEx.RegisterKeyNotify   = EmuGopSimpleTextInExRegisterKeyNotify;\r
+  Private->SimpleTextInEx.UnregisterKeyNotify = EmuGopSimpleTextInExUnregisterKeyNotify;\r
+\r
+  Private->SimpleTextInEx.Reset (&Private->SimpleTextInEx, FALSE);\r
+\r
+  InitializeListHead (&Private->NotifyList);\r
+\r
+  Status = gBS->CreateEvent (\r
+                  EVT_NOTIFY_WAIT,\r
+                  TPL_NOTIFY,\r
+                  EmuGopSimpleTextInWaitForKey,\r
+                  Private,\r
+                  &Private->SimpleTextInEx.WaitForKeyEx\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+//\r
+// Simple Pointer implementation.\r
+//\r
+\r
+\r
+/**\r
+  Resets the pointer device hardware.\r
+\r
+  @param  This                  A pointer to the EFI_SIMPLE_POINTER_PROTOCOL\r
+                                instance.\r
+  @param  ExtendedVerification  Indicates that the driver may perform a more exhaustive\r
+                                verification operation of the device during reset.\r
+\r
+  @retval EFI_SUCCESS           The device was reset.\r
+  @retval EFI_DEVICE_ERROR      The device is not functioning correctly and could not be reset.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopSimplePointerReset (\r
+  IN EFI_SIMPLE_POINTER_PROTOCOL          *This,\r
+  IN BOOLEAN                              ExtendedVerification\r
+  )\r
+{\r
+  GOP_PRIVATE_DATA             *Private;\r
+  EFI_SIMPLE_POINTER_STATE     State;\r
+  EFI_TPL                      OldTpl;\r
+\r
+  Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);\r
+  if (Private->EmuGraphicsWindow == NULL) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  //\r
+  // Enter critical section\r
+  //\r
+  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
+\r
+  //\r
+  // A reset is draining the Queue\r
+  //\r
+  while (Private->EmuGraphicsWindow->GetPointerState (Private->EmuGraphicsWindow, &State) == EFI_SUCCESS)\r
+    ;\r
+\r
+  //\r
+  // Leave critical section and return\r
+  //\r
+  gBS->RestoreTPL (OldTpl);\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+  Retrieves the current state of a pointer device.\r
+\r
+  @param  This                  A pointer to the EFI_SIMPLE_POINTER_PROTOCOL\r
+                                instance.\r
+  @param  State                 A pointer to the state information on the pointer device.\r
+\r
+  @retval EFI_SUCCESS           The state of the pointer device was returned in State.\r
+  @retval EFI_NOT_READY         The state of the pointer device has not changed since the last call to\r
+                                GetState().\r
+  @retval EFI_DEVICE_ERROR      A device error occurred while attempting to retrieve the pointer device's\r
+                                current state.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopSimplePointerGetState (\r
+  IN EFI_SIMPLE_POINTER_PROTOCOL          *This,\r
+  IN OUT EFI_SIMPLE_POINTER_STATE         *State\r
+  )\r
+{\r
+  GOP_PRIVATE_DATA  *Private;\r
+  EFI_STATUS        Status;\r
+  EFI_TPL           OldTpl;\r
+\r
+  Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);\r
+  if (Private->EmuGraphicsWindow == NULL) {\r
+    return EFI_NOT_READY;\r
+  }\r
+\r
+  //\r
+  // Enter critical section\r
+  //\r
+  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);\r
+\r
+  Status  = Private->EmuGraphicsWindow->GetPointerState (Private->EmuGraphicsWindow, State);\r
+  //\r
+  // Leave critical section and return\r
+  //\r
+  gBS->RestoreTPL (OldTpl);\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+/**\r
+  SimplePointer Notify Wait Event\r
+\r
+  @param  Event                 Event whose notification function is being invoked.\r
+  @param  Context               Pointer to GOP_PRIVATE_DATA.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+EmuGopSimplePointerWaitForInput (\r
+  IN EFI_EVENT          Event,\r
+  IN VOID               *Context\r
+  )\r
+{\r
+  GOP_PRIVATE_DATA  *Private;\r
+  EFI_STATUS        Status;\r
+  EFI_TPL           OldTpl;\r
+\r
+  Private = (GOP_PRIVATE_DATA *) Context;\r
+  if (Private->EmuGraphicsWindow == NULL) {\r
+    return;\r
+  }\r
+\r
+  //\r
+  // Enter critical section\r
+  //\r
+  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);\r
+\r
+  Status  = Private->EmuGraphicsWindow->CheckPointer (Private->EmuGraphicsWindow);\r
+  if (!EFI_ERROR (Status)) {\r
+    //\r
+    // If the pointer state has changed, signal our event.\r
+    //\r
+    gBS->SignalEvent (Event);\r
+  }\r
+  //\r
+  // Leave critical section and return\r
+  //\r
+  gBS->RestoreTPL (OldTpl);\r
+}\r
+\r
+\r
+/**\r
+  SimplePointer constructor\r
+\r
+  @param  Private Context structure to fill in.\r
+\r
+  @retval EFI_SUCCESS Constructor had success\r
+\r
+**/\r
+EFI_STATUS\r
+EmuGopInitializeSimplePointerForWindow (\r
+  IN  GOP_PRIVATE_DATA    *Private\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+\r
+  //\r
+  // Initialize Simple Pointer protoocol\r
+  //\r
+  Private->PointerMode.ResolutionX = 1;\r
+  Private->PointerMode.ResolutionY = 1;\r
+  Private->PointerMode.ResolutionZ = 1;\r
+  Private->PointerMode.LeftButton  = TRUE;\r
+  Private->PointerMode.RightButton = TRUE;\r
+\r
+  Private->SimplePointer.Reset     = EmuGopSimplePointerReset;\r
+  Private->SimplePointer.GetState  = EmuGopSimplePointerGetState;\r
+  Private->SimplePointer.Mode      = &Private->PointerMode;\r
+\r
+  Status = gBS->CreateEvent (\r
+                  EVT_NOTIFY_WAIT,\r
+                  TPL_NOTIFY,\r
+                  EmuGopSimplePointerWaitForInput,\r
+                  Private,\r
+                  &Private->SimplePointer.WaitForInput\r
+                  );\r
+\r
+  return Status;\r
+}\r
index aa21fa68def6c043d6316970ba965b22834330be..761d945c15520bbd22ec3f5f8429847c4681d04e 100644 (file)
-/*++ @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\r
+\r
+Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>\r
+Portions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+Module Name:\r
+\r
+    EmuGopScreen.c\r
+\r
+Abstract:\r
+\r
+  This file produces the graphics abstration of UGA. It is called by\r
+  EmuGopDriver.c file which deals with the EFI 1.1 driver model.\r
+  This file just does graphics.\r
+\r
+**/\r
+\r
+#include "Gop.h"\r
+\r
+\r
+EFI_EVENT               mGopScreenExitBootServicesEvent;\r
+\r
+GOP_MODE_DATA mGopModeData[] = {\r
+    { 800,  600, 0, 0 },\r
+    { 640,  480, 0, 0 },\r
+    { 720,  400, 0, 0 },\r
+    {1024,  768, 0, 0 },\r
+    {1280, 1024, 0, 0 }\r
+    };\r
+\r
+\r
+/**\r
+  Returns information for an available graphics mode that the graphics device\r
+  and the set of active video output devices supports.\r
+\r
+  @param  This                  The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.\r
+  @param  ModeNumber            The mode number to return information on.\r
+  @param  SizeOfInfo            A pointer to the size, in bytes, of the Info buffer.\r
+  @param  Info                  A pointer to callee allocated buffer that returns information about ModeNumber.\r
+\r
+  @retval EFI_SUCCESS           Mode information returned.\r
+  @retval EFI_BUFFER_TOO_SMALL  The Info buffer was too small.\r
+  @retval EFI_DEVICE_ERROR      A hardware error occurred trying to retrieve the video mode.\r
+  @retval EFI_NOT_STARTED       Video display is not initialized. Call SetMode ()\r
+  @retval EFI_INVALID_PARAMETER One of the input args was NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopQuerytMode (\r
+  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL          *This,\r
+  IN  UINT32                                ModeNumber,\r
+  OUT UINTN                                 *SizeOfInfo,\r
+  OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  **Info\r
+  )\r
+{\r
+  GOP_PRIVATE_DATA  *Private;\r
+\r
+  Private = GOP_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+  if (Info == NULL || SizeOfInfo == NULL || (UINTN) ModeNumber >= This->Mode->MaxMode) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  *Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));\r
+  if (*Info == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
+\r
+  (*Info)->Version = 0;\r
+  (*Info)->HorizontalResolution = Private->ModeData[ModeNumber].HorizontalResolution;\r
+  (*Info)->VerticalResolution   = Private->ModeData[ModeNumber].VerticalResolution;\r
+  (*Info)->PixelFormat = PixelBltOnly;\r
+  (*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution;\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+\r
+/**\r
+  Set the video device into the specified mode and clears the visible portions of\r
+  the output display to black.\r
+\r
+  @param  This              The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.\r
+  @param  ModeNumber        Abstraction that defines the current video mode.\r
+\r
+  @retval EFI_SUCCESS       The graphics mode specified by ModeNumber was selected.\r
+  @retval EFI_DEVICE_ERROR  The device had an error and could not complete the request.\r
+  @retval EFI_UNSUPPORTED   ModeNumber is not supported by this device.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopSetMode (\r
+  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL  *This,\r
+  IN  UINT32                        ModeNumber\r
+  )\r
+{\r
+  EFI_STATUS                      Status;\r
+  GOP_PRIVATE_DATA                *Private;\r
+  GOP_MODE_DATA                   *ModeData;\r
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL   Fill;\r
+\r
+  Private = GOP_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+  if (ModeNumber >= This->Mode->MaxMode) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  ModeData = &Private->ModeData[ModeNumber];\r
+  This->Mode->Mode = ModeNumber;\r
+  Private->GraphicsOutput.Mode->Info->HorizontalResolution = ModeData->HorizontalResolution;\r
+  Private->GraphicsOutput.Mode->Info->VerticalResolution = ModeData->VerticalResolution;\r
+  Private->GraphicsOutput.Mode->Info->PixelsPerScanLine = ModeData->HorizontalResolution;\r
+\r
+  if (Private->HardwareNeedsStarting) {\r
+    Status = EmuGopStartWindow (\r
+              Private,\r
+              ModeData->HorizontalResolution,\r
+              ModeData->VerticalResolution,\r
+              ModeData->ColorDepth,\r
+              ModeData->RefreshRate\r
+              );\r
+    if (EFI_ERROR (Status)) {\r
+      return EFI_DEVICE_ERROR;\r
+    }\r
+\r
+    Private->HardwareNeedsStarting = FALSE;\r
+  }\r
+\r
+\r
+  Status = Private->EmuGraphicsWindow->Size(\r
+                            Private->EmuGraphicsWindow,\r
+                            ModeData->HorizontalResolution,\r
+                            ModeData->VerticalResolution\r
+                            );\r
+\r
+\r
+  Fill.Red                      = 0x7f;\r
+  Fill.Green                    = 0x7F;\r
+  Fill.Blue                     = 0x7f;\r
+  This->Blt (\r
+          This,\r
+          &Fill,\r
+          EfiBltVideoFill,\r
+          0,\r
+          0,\r
+          0,\r
+          0,\r
+          ModeData->HorizontalResolution,\r
+          ModeData->VerticalResolution,\r
+          ModeData->HorizontalResolution * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+          );\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+\r
+/**\r
+  Blt a rectangle of pixels on the graphics screen. Blt stands for BLock Transfer.\r
+\r
+  @param  This         Protocol instance pointer.\r
+  @param  BltBuffer    Buffer containing data to blit into video buffer. This\r
+                       buffer has a size of Width*Height*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL)\r
+  @param  BltOperation Operation to perform on BlitBuffer and video memory\r
+  @param  SourceX      X coordinate of source for the BltBuffer.\r
+  @param  SourceY      Y coordinate of source for the BltBuffer.\r
+  @param  DestinationX X coordinate of destination for the BltBuffer.\r
+  @param  DestinationY Y coordinate of destination for the BltBuffer.\r
+  @param  Width        Width of rectangle in BltBuffer in pixels.\r
+  @param  Height       Hight of rectangle in BltBuffer in pixels.\r
+  @param  Delta        OPTIONAL\r
+\r
+  @retval EFI_SUCCESS           The Blt operation completed.\r
+  @retval EFI_INVALID_PARAMETER BltOperation is not valid.\r
+  @retval EFI_DEVICE_ERROR      A hardware error occured writting to the video buffer.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EmuGopBlt (\r
+  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL            *This,\r
+  IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL           *BltBuffer,   OPTIONAL\r
+  IN  EFI_GRAPHICS_OUTPUT_BLT_OPERATION       BltOperation,\r
+  IN  UINTN                                   SourceX,\r
+  IN  UINTN                                   SourceY,\r
+  IN  UINTN                                   DestinationX,\r
+  IN  UINTN                                   DestinationY,\r
+  IN  UINTN                                   Width,\r
+  IN  UINTN                                   Height,\r
+  IN  UINTN                                   Delta         OPTIONAL\r
+  )\r
+{\r
+  GOP_PRIVATE_DATA  *Private;\r
+  EFI_TPL           OriginalTPL;\r
+  EFI_STATUS        Status;\r
+  EMU_GRAPHICS_WINDOWS__BLT_ARGS      GopBltArgs;\r
+\r
+  Private = GOP_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+  if ((UINT32)BltOperation >= EfiGraphicsOutputBltOperationMax) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if (Width == 0 || Height == 0) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  //\r
+  // If Delta is zero, then the entire BltBuffer is being used, so Delta\r
+  // is the number of bytes in each row of BltBuffer.  Since BltBuffer is Width pixels size,\r
+  // the number of bytes in each row can be computed.\r
+  //\r
+  if (Delta == 0) {\r
+    Delta = Width * sizeof (EFI_UGA_PIXEL);\r
+  }\r
+\r
+  //\r
+  // We have to raise to TPL Notify, so we make an atomic write the frame buffer.\r
+  // We would not want a timer based event (Cursor, ...) to come in while we are\r
+  // doing this operation.\r
+  //\r
+  OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY);\r
+\r
+  //\r
+  // Pack UGA Draw protocol parameters to EMU_GRAPHICS_WINDOWS__BLT_ARGS structure to adapt to\r
+  // GopBlt() API of Unix UGA IO protocol.\r
+  //\r
+  GopBltArgs.DestinationX = DestinationX;\r
+  GopBltArgs.DestinationY = DestinationY;\r
+  GopBltArgs.Height       = Height;\r
+  GopBltArgs.Width        = Width;\r
+  GopBltArgs.SourceX      = SourceX;\r
+  GopBltArgs.SourceY      = SourceY;\r
+  GopBltArgs.Delta        = Delta;\r
+  Status = Private->EmuGraphicsWindow->Blt (\r
+                            Private->EmuGraphicsWindow,\r
+                            (EFI_UGA_PIXEL *)BltBuffer,\r
+                            (EFI_UGA_BLT_OPERATION)BltOperation,\r
+                            &GopBltArgs\r
+                            );\r
+\r
+  gBS->RestoreTPL (OriginalTPL);\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+//\r
+// Construction and Destruction functions\r
+//\r
+\r
+EFI_STATUS\r
+EmuGopSupported (\r
+  IN  EMU_IO_THUNK_PROTOCOL  *EmuIoThunk\r
+  )\r
+{\r
+  //\r
+  // Check to see if the IO abstraction represents a device type we support.\r
+  //\r
+  // This would be replaced a check of PCI subsystem ID, etc.\r
+  //\r
+  if (!CompareGuid (EmuIoThunk->Protocol, &gEmuGraphicsWindowProtocolGuid)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+EmuGopStartWindow (\r
+  IN  GOP_PRIVATE_DATA    *Private,\r
+  IN  UINT32              HorizontalResolution,\r
+  IN  UINT32              VerticalResolution,\r
+  IN  UINT32              ColorDepth,\r
+  IN  UINT32              RefreshRate\r
+  )\r
+{\r
+  EFI_STATUS          Status;\r
+\r
+  //\r
+  // Register to be notified on exit boot services so we can destroy the window.\r
+  //\r
+  Status = gBS->CreateEvent (\r
+                  EVT_SIGNAL_EXIT_BOOT_SERVICES,\r
+                  TPL_CALLBACK,\r
+                  ShutdownGopEvent,\r
+                  Private,\r
+                  &mGopScreenExitBootServicesEvent\r
+                  );\r
+\r
+  Status = Private->EmuIoThunk->Open (Private->EmuIoThunk);\r
+  if (!EFI_ERROR (Status)) {\r
+    Private->EmuGraphicsWindow = Private->EmuIoThunk->Interface;\r
+\r
+    // Register callback to support RegisterKeyNotify()\r
+    Status  = Private->EmuGraphicsWindow->RegisterKeyNotify (\r
+                                            Private->EmuGraphicsWindow,\r
+                                            GopPrivateMakeCallbackFunction,\r
+                                            GopPrivateBreakCallbackFunction,\r
+                                            Private\r
+                                            );\r
+    ASSERT_EFI_ERROR (Status);\r
+  }\r
+  return Status;\r
+}\r
+\r
+EFI_STATUS\r
+EmuGopConstructor (\r
+  GOP_PRIVATE_DATA    *Private\r
+  )\r
+{\r
+  Private->ModeData = mGopModeData;\r
+\r
+  Private->GraphicsOutput.QueryMode      = EmuGopQuerytMode;\r
+  Private->GraphicsOutput.SetMode        = EmuGopSetMode;\r
+  Private->GraphicsOutput.Blt            = EmuGopBlt;\r
+\r
+  //\r
+  // Allocate buffer for Graphics Output Protocol mode information\r
+  //\r
+  Private->GraphicsOutput.Mode = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE));\r
+  if (Private->GraphicsOutput.Mode == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  Private->GraphicsOutput.Mode->Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));\r
+  if (Private->GraphicsOutput.Mode->Info == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  Private->GraphicsOutput.Mode->MaxMode = sizeof(mGopModeData) / sizeof(GOP_MODE_DATA);\r
+  //\r
+  // Till now, we have no idea about the window size.\r
+  //\r
+  Private->GraphicsOutput.Mode->Mode = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;\r
+  Private->GraphicsOutput.Mode->Info->Version = 0;\r
+  Private->GraphicsOutput.Mode->Info->HorizontalResolution = 0;\r
+  Private->GraphicsOutput.Mode->Info->VerticalResolution = 0;\r
+  Private->GraphicsOutput.Mode->Info->PixelFormat = PixelBltOnly;\r
+  Private->GraphicsOutput.Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
+  Private->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) (UINTN) NULL;\r
+  Private->GraphicsOutput.Mode->FrameBufferSize = 0;\r
+\r
+  Private->HardwareNeedsStarting  = TRUE;\r
+  Private->EmuGraphicsWindow                  = NULL;\r
+\r
+  EmuGopInitializeSimpleTextInForWindow (Private);\r
+\r
+  EmuGopInitializeSimplePointerForWindow (Private);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+\r
+EFI_STATUS\r
+EmuGopDestructor (\r
+  GOP_PRIVATE_DATA     *Private\r
+  )\r
+{\r
+  if (!Private->HardwareNeedsStarting) {\r
+    Private->EmuIoThunk->Close (Private->EmuIoThunk);\r
+    Private->EmuGraphicsWindow = NULL;\r
+  }\r
+\r
+  //\r
+  // Free graphics output protocol occupied resource\r
+  //\r
+  if (Private->GraphicsOutput.Mode != NULL) {\r
+    if (Private->GraphicsOutput.Mode->Info != NULL) {\r
+      FreePool (Private->GraphicsOutput.Mode->Info);\r
+    }\r
+    FreePool (Private->GraphicsOutput.Mode);\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+VOID\r
+EFIAPI\r
+ShutdownGopEvent (\r
+  IN EFI_EVENT  Event,\r
+  IN VOID       *Context\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This is the UGA screen's callback notification function for exit-boot-services.\r
+  All we do here is call EmuGopDestructor().\r
+\r
+Arguments:\r
+\r
+  Event   - not used\r
+  Context - pointer to the Private structure.\r
+\r
+Returns:\r
+\r
+  None.\r
+\r
+**/\r
+{\r
+  EmuGopDestructor (Context);\r
+}\r
+\r
index 09d16fd8b664ded35274db4c41798cbf8590c1e0..0031baea52ecb9eabfee2ee23e039f308e6cedfa 100644 (file)
@@ -42,7 +42,7 @@ EFI_SIMPLE_NETWORK_PROTOCOL gEmuSnpTemplate = {
   NULL                      // Mode\r
  };\r
 \r
-EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {                 \r
+EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {\r
   EfiSimpleNetworkStopped,      //  State\r
   NET_ETHER_ADDR_LEN,           //  HwAddressSize\r
   NET_ETHER_HEADER_SIZE,        //  MediaHeaderSize\r
index e0c339a3b8abf38dd8943b3fa2dda26e15b20c5c..edae364b06af52ea5e42bc5d6f928db2b7972d4a 100644 (file)
@@ -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\r
+The PCD, gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage, points to a magic page\r
+of memory that is like SRAM on an embedded system. This file defines what goes\r
+where in the magic page.\r
+\r
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __EMU_MAGIC_PAGE_LIB_H__\r
+#define __EMU_MAGIC_PAGE_LIB_H__\r
+\r
+#include <PiPei.h>\r
+#include <Library/PcdLib.h>\r
+#include <Protocol/EmuThunk.h>\r
+\r
+typedef struct {\r
+  // Used by PEI Core and PEIMs to store the PEI Services pointer.\r
+  // Privilege issues prevent using the PI mechanism in the emulator.\r
+  CONST EFI_PEI_SERVICES **PeiServicesTablePointer;\r
+\r
+  // Used by SecPeiServicesLib\r
+  EFI_PEI_PPI_DESCRIPTOR  *PpiList;\r
+\r
+  // Needed by PEI PEI PeCoffLoaderExtraActionLib\r
+  EMU_THUNK_PROTOCOL   *Thunk;\r
+} EMU_MAGIC_PAGE_LAYOUT;\r
+\r
+#define EMU_MAGIC_PAGE() ((EMU_MAGIC_PAGE_LAYOUT *)((UINTN)PcdGet64 (PcdPeiServicesTablePage)))\r
+\r
+#endif\r
index 98b22e16eea65b3d279551b28948867839f4bac9..e18a613d9492dc946cfd5bd4bd27782b004e75e4 100644 (file)
@@ -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\r
+\r
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __EMU_THUNK_LIB_H__\r
+#define __EMU_THUNK_LIB_H__\r
+\r
+#include <Protocol/EmuThunk.h>\r
+\r
+\r
+extern EMU_THUNK_PROTOCOL   *gEmuThunk;\r
+\r
+\r
+/**\r
+  Serach the EMU IO Thunk database for a matching EMU IO Thunk\r
+  Protocol instance.\r
+\r
+  @param  Protocol   Protocol to search for.\r
+  @param  Instance   Instance of protocol to search for.\r
+\r
+  @retval NULL       Protocol and Instance not found.\r
+  @retval other      EMU IO Thunk protocol that matched.\r
+\r
+**/\r
+EMU_IO_THUNK_PROTOCOL *\r
+EFIAPI\r
+GetIoThunkInstance (\r
+  IN  EFI_GUID  *Protocol,\r
+  IN  UINTN     Instance\r
+  );\r
+\r
+\r
+#endif\r
index c1271b23c8520d7a8aa697694d67c98639459bf8..fad1473a41a3fe72b60900bbb4a61e7f8900d2cb 100644 (file)
@@ -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\r
+\r
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __PPI_LIST_LIB_H__\r
+#define __PPI_LIST_LIB_H__\r
+\r
+\r
+extern CONST EFI_PEI_PPI_DESCRIPTOR  *gPpiList;\r
+\r
+\r
+#endif\r
index 8ee14e07dd2e947c58a847f2c5d7507fd08dcbe3..6dcb7336d5743759bf5d50cb0c8d95ccf2ef113b 100644 (file)
-/** @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\r
+  Provides library functions for common SMBIOS operations. Only available to DXE\r
+  and UEFI module types.\r
+\r
+\r
+Copyright (c) 2012, Apple Inc. All rights reserved.\r
+Portitions Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials are licensed and made available under\r
+the terms and conditions of the BSD License that accompanies this distribution.\r
+The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php.\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _SMBIOS_LIB_H__\r
+#define _SMBIOS_LIB_H__\r
+\r
+#include <IndustryStandard/SmBios.h>\r
+#include <Protocol/Smbios.h>\r
+\r
+\r
+///\r
+/// Cache copy of the SMBIOS Protocol pointer\r
+///\r
+extern EFI_SMBIOS_PROTOCOL *gSmbios;\r
+\r
+\r
+///\r
+/// Template for SMBIOS table initialization.\r
+/// The SMBIOS_TABLE_STRING types in the formated area must match the\r
+/// StringArray sequene.\r
+///\r
+typedef struct {\r
+  //\r
+  // formatted area of a given SMBIOS record\r
+  //\r
+  SMBIOS_STRUCTURE    *Entry;\r
+  //\r
+  // NULL terminated array of ASCII strings to be added to the SMBIOS record.\r
+  //\r
+  CHAR8               **StringArray;\r
+} SMBIOS_TEMPLATE_ENTRY;\r
+\r
+\r
+/**\r
+  Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY\r
+  entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.\r
+\r
+  @param  Template   Array of SMBIOS_TEMPLATE_ENTRY entries.\r
+\r
+  @retval EFI_SUCCESS          New SMBIOS tables were created.\r
+  @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosLibInitializeFromTemplate (\r
+  IN  SMBIOS_TEMPLATE_ENTRY   *Template\r
+  );\r
+\r
+\r
+\r
+/**\r
+  Create SMBIOS record.\r
+\r
+  Converts a fixed SMBIOS structure and an array of pointers to strings into\r
+  an SMBIOS record where the strings are cat'ed on the end of the fixed record\r
+  and terminated via a double NULL and add to SMBIOS table.\r
+\r
+  SMBIOS_TABLE_TYPE32 gSmbiosType12 = {\r
+    { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof (SMBIOS_TABLE_TYPE12), 0 },\r
+    1 // StringCount\r
+  };\r
+  CHAR8 *gSmbiosType12Strings[] = {\r
+    "Not Found",\r
+    NULL\r
+  };\r
+\r
+  ...\r
+  AddSmbiosEntryFromTemplate (\r
+    (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,\r
+    gSmbiosType12Strings\r
+    );\r
+\r
+  @param  SmbiosEntry   Fixed SMBIOS structure\r
+  @param  StringArray   Array of strings to convert to an SMBIOS string pack.\r
+                        NULL is OK.\r
+\r
+  @retval EFI_SUCCESS          New SmbiosEntry was added to SMBIOS table.\r
+  @retval EFI_OUT_OF_RESOURCES SmbiosEntry was not added.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosLibCreateEntry (\r
+  IN  SMBIOS_STRUCTURE *SmbiosEntry,\r
+  IN  CHAR8            **StringArray\r
+  );\r
+\r
+\r
+/**\r
+  Update the string associated with an existing SMBIOS record.\r
+\r
+  This function allows the update of specific SMBIOS strings. The number of valid strings for any\r
+  SMBIOS record is defined by how many strings were present when Add() was called.\r
+\r
+  @param[in]    SmbiosHandle    SMBIOS Handle of structure that will have its string updated.\r
+  @param[in]    StringNumber    The non-zero string number of the string to update.\r
+  @param[in]    String          Update the StringNumber string with String.\r
+\r
+  @retval EFI_SUCCESS           SmbiosHandle had its StringNumber String updated.\r
+  @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.\r
+  @retval EFI_UNSUPPORTED       String was not added because it is longer than the SMBIOS Table supports.\r
+  @retval EFI_NOT_FOUND         The StringNumber.is not valid for this SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosLibUpdateString (\r
+  IN  EFI_SMBIOS_HANDLE     SmbiosHandle,\r
+  IN  SMBIOS_TABLE_STRING   StringNumber,\r
+  IN  CHAR8                 *String\r
+  );\r
+\r
+/**\r
+  Update the string associated with an existing SMBIOS record.\r
+\r
+  This function allows the update of specific SMBIOS strings. The number of valid strings for any\r
+  SMBIOS record is defined by how many strings were present when Add() was called.\r
+\r
+  @param[in]    SmbiosHandle    SMBIOS Handle of structure that will have its string updated.\r
+  @param[in]    StringNumber    The non-zero string number of the string to update.\r
+  @param[in]    String          Update the StringNumber string with String.\r
+\r
+  @retval EFI_SUCCESS           SmbiosHandle had its StringNumber String updated.\r
+  @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.\r
+  @retval EFI_UNSUPPORTED       String was not added because it is longer than the SMBIOS Table supports.\r
+  @retval EFI_NOT_FOUND         The StringNumber.is not valid for this SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosLibUpdateUnicodeString (\r
+  IN  EFI_SMBIOS_HANDLE     SmbiosHandle,\r
+  IN  SMBIOS_TABLE_STRING   StringNumber,\r
+  IN  CHAR16                *String\r
+  );\r
+\r
+/**\r
+  Allow caller to read a specific SMBIOS string\r
+\r
+  @param[in]    Header          SMBIOS record that contains the string.\r
+  @param[in[    StringNumber    Instance of SMBIOS string 1 - N.\r
+\r
+  @retval NULL                  Instance of Type SMBIOS string was not found.\r
+  @retval Other                 Pointer to matching SMBIOS string.\r
+**/\r
+CHAR8 *\r
+EFIAPI\r
+SmbiosLibReadString (\r
+  IN SMBIOS_STRUCTURE   *Header,\r
+  IN EFI_SMBIOS_STRING  StringNumber\r
+  );\r
+\r
+\r
+/**\r
+  Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.\r
+\r
+  @param[in]    Type            Type of the next SMBIOS record to return.\r
+  @param[in[    Instance        Instance of SMBIOS record 0 - N-1.\r
+  @param[out]   SmbiosHandle    Returns SMBIOS handle for the matching record.\r
+\r
+  @retval NULL                  Instance of Type SMBIOS record was not found.\r
+  @retval Other                 Pointer to matching SMBIOS record.\r
+**/\r
+SMBIOS_STRUCTURE *\r
+EFIAPI\r
+SmbiosLibGetRecord (\r
+  IN  EFI_SMBIOS_TYPE   Type,\r
+  IN  UINTN             Instance,\r
+  OUT EFI_SMBIOS_HANDLE *SmbiosHandle\r
+  );\r
+\r
+/**\r
+  Remove an SMBIOS record.\r
+\r
+  This function removes an SMBIOS record using the handle specified by SmbiosHandle.\r
+\r
+  @param[in]    SmbiosHandle        The handle of the SMBIOS record to remove.\r
+\r
+  @retval EFI_SUCCESS               SMBIOS record was removed.\r
+  @retval EFI_INVALID_PARAMETER     SmbiosHandle does not specify a valid SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosLibRemove (\r
+  OUT EFI_SMBIOS_HANDLE SmbiosHandle\r
+  );\r
+\r
+\r
+\r
+\r
+#endif\r
index 8e5463c74ef729378ad1057f8e1112da4fbac355..45ca5b9a7ae95264e9328c54c828674088dae3f2 100644 (file)
@@ -62,7 +62,7 @@ EFI_STATUS
   @param[in]       MediaId    Id of the media, changes every time the media is\r
                               replaced.\r
   @param[in]       Lba        The starting Logical Block Address to read from.\r
-  @param[in, out]  Token           A pointer to the token associated with the transaction.\r
+  @param[in, out]  Token      A pointer to the token associated with the transaction.\r
   @param[in]       BufferSize Size of Buffer, must be a multiple of device block size.\r
   @param[out]      Buffer     A pointer to the destination buffer for the data. The\r
                               caller is responsible for either having implicit or\r
index 6d8717479b3dd3577c3abb0ecd3dc55139ee9feb..d13853877e665528c257903a1bf4eaa0997ef266 100644 (file)
-/** @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\r
+  SimpleFileSystem protocol as defined in the UEFI 2.0 specification.\r
+\r
+  The SimpleFileSystem protocol is the programmatic access to the FAT (12,16,32)\r
+  file system specified in UEFI 2.0. It can also be used to abstract a file\r
+  system other than FAT.\r
+\r
+  UEFI 2.0 can boot from any valid EFI image contained in a SimpleFileSystem.\r
+\r
+Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+Portions copyright (c) 2011, Apple Inc. All rights reserved.\r
+This program and the accompanying materials are licensed and made available under\r
+the terms and conditions of the BSD License that accompanies this distribution.\r
+The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php.\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _EMU_UGA_IO_H_\r
+#define _EMU_UGA_IO_H_\r
+\r
+#include <Protocol/SimplePointer.h>\r
+#include <Protocol/SimpleTextIn.h>\r
+#include <Protocol/SimpleTextInEx.h>\r
+#include <Protocol/UgaDraw.h>\r
+\r
+#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \\r
+ { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA, 0xC1 } }\r
+\r
+typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL EMU_GRAPHICS_WINDOW_PROTOCOL;\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(\r
+  EMU_GRAPHICS_WINDOW_PROTOCOL *Uga\r
+  );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(\r
+  EMU_GRAPHICS_WINDOW_PROTOCOL  *Uga,\r
+  UINT32                        Width,\r
+  UINT32                        Height\r
+  );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(\r
+  EMU_GRAPHICS_WINDOW_PROTOCOL *Uga\r
+  );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(\r
+  EMU_GRAPHICS_WINDOW_PROTOCOL  *Uga,\r
+  EFI_KEY_DATA                  *key\r
+  );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (\r
+  IN EMU_GRAPHICS_WINDOW_PROTOCOL   *GraphicsWindows,\r
+  IN EFI_KEY_TOGGLE_STATE           *KeyToggleState\r
+  );\r
+\r
+\r
+typedef\r
+VOID\r
+(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (\r
+  IN VOID           *Context,\r
+  IN EFI_KEY_DATA   *KeyData\r
+  );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (\r
+  IN EMU_GRAPHICS_WINDOW_PROTOCOL                       *GraphicsWindows,\r
+  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK   CallBack,\r
+  IN VOID                                               *Context\r
+  );\r
+\r
+\r
+typedef struct {\r
+    UINTN                                   SourceX;\r
+    UINTN                                   SourceY;\r
+    UINTN                                   DestinationX;\r
+    UINTN                                   DestinationY;\r
+    UINTN                                   Width;\r
+    UINTN                                   Height;\r
+    UINTN                                   Delta;\r
+} EMU_GRAPHICS_WINDOWS__BLT_ARGS;\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(\r
+  IN  EMU_GRAPHICS_WINDOW_PROTOCOL            *GraphicsWindows,\r
+  IN  EFI_UGA_PIXEL                           *BltBuffer OPTIONAL,\r
+  IN  EFI_UGA_BLT_OPERATION                   BltOperation,\r
+  IN  EMU_GRAPHICS_WINDOWS__BLT_ARGS          *Args\r
+  );\r
+\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (\r
+  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,\r
+  IN  EFI_KEY_DATA                  *KeyData\r
+  );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(\r
+  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows\r
+  );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(\r
+  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,\r
+  EFI_SIMPLE_POINTER_STATE      *state\r
+  );\r
+\r
+struct _EMU_GRAPHICS_WINDOW_PROTOCOL {\r
+  EMU_GRAPHICS_WINDOWS_SIZE                    Size;\r
+  EMU_GRAPHICS_WINDOWS_CHECK_KEY               CheckKey;\r
+  EMU_GRAPHICS_WINDOWS_KEY_SET_STATE           KeySetState;\r
+  EMU_GRAPHICS_WINDOWS_GET_KEY                 GetKey;\r
+  EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY     RegisterKeyNotify;\r
+  EMU_GRAPHICS_WINDOWS_BLT                     Blt;\r
+  EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED          IsKeyPressed;\r
+  EMU_GRAPHICS_WINDOWS_CHECK_POINTER           CheckPointer;\r
+  EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE       GetPointerState;\r
+};\r
+\r
+\r
+extern EFI_GUID gEmuGraphicsWindowProtocolGuid;\r
+\r
+#endif\r
index 844159a7665dcac870a40837f96d26de6e784bf6..e502fc68da8c85cc563f3b75b877012b36fd36a7 100644 (file)
-/*++ @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\r
+\r
+Copyright (c) 2006, Tristan Gingold. All rights reserved.<BR>\r
+Portitions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the\r
+BSD License which accompanies this distribution.  The full text of the\r
+license may be found at http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _EMU_UGA_IO_H_\r
+#define _EMU_UGA_IO_H_\r
+\r
+#include <Protocol/SimplePointer.h>\r
+#include <Protocol/SimpleTextIn.h>\r
+#include <Protocol/SimpleTextInEx.h>\r
+#include <Protocol/UgaDraw.h>\r
+\r
+#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \\r
+ { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA, 0xC1 } }\r
+\r
+typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL EMU_GRAPHICS_WINDOW_PROTOCOL;\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(\r
+  EMU_GRAPHICS_WINDOW_PROTOCOL *Uga\r
+  );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(\r
+  EMU_GRAPHICS_WINDOW_PROTOCOL  *Uga,\r
+  UINT32                        Width,\r
+  UINT32                        Height\r
+  );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(\r
+  EMU_GRAPHICS_WINDOW_PROTOCOL *Uga\r
+  );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(\r
+  EMU_GRAPHICS_WINDOW_PROTOCOL  *Uga,\r
+  EFI_KEY_DATA                  *key\r
+  );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (\r
+  IN EMU_GRAPHICS_WINDOW_PROTOCOL   *GraphicsWindows,\r
+  IN EFI_KEY_TOGGLE_STATE           *KeyToggleState\r
+  );\r
+\r
+\r
+typedef\r
+VOID\r
+(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (\r
+  IN VOID           *Context,\r
+  IN EFI_KEY_DATA   *KeyData\r
+  );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (\r
+  IN EMU_GRAPHICS_WINDOW_PROTOCOL                       *GraphicsWindows,\r
+  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK   MakeCallBack,\r
+  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK   BreakCallBack,\r
+  IN VOID                                               *Context\r
+  );\r
+\r
+\r
+typedef struct {\r
+    UINTN                                   SourceX;\r
+    UINTN                                   SourceY;\r
+    UINTN                                   DestinationX;\r
+    UINTN                                   DestinationY;\r
+    UINTN                                   Width;\r
+    UINTN                                   Height;\r
+    UINTN                                   Delta;\r
+} EMU_GRAPHICS_WINDOWS__BLT_ARGS;\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(\r
+  IN  EMU_GRAPHICS_WINDOW_PROTOCOL            *GraphicsWindows,\r
+  IN  EFI_UGA_PIXEL                           *BltBuffer OPTIONAL,\r
+  IN  EFI_UGA_BLT_OPERATION                   BltOperation,\r
+  IN  EMU_GRAPHICS_WINDOWS__BLT_ARGS          *Args\r
+  );\r
+\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (\r
+  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,\r
+  IN  EFI_KEY_DATA                  *KeyData\r
+  );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(\r
+  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows\r
+  );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(\r
+  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,\r
+  EFI_SIMPLE_POINTER_STATE      *state\r
+  );\r
+\r
+struct _EMU_GRAPHICS_WINDOW_PROTOCOL {\r
+  EMU_GRAPHICS_WINDOWS_SIZE                    Size;\r
+  EMU_GRAPHICS_WINDOWS_CHECK_KEY               CheckKey;\r
+  EMU_GRAPHICS_WINDOWS_KEY_SET_STATE           KeySetState;\r
+  EMU_GRAPHICS_WINDOWS_GET_KEY                 GetKey;\r
+  EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY     RegisterKeyNotify;\r
+  EMU_GRAPHICS_WINDOWS_BLT                     Blt;\r
+  EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED          IsKeyPressed;\r
+  EMU_GRAPHICS_WINDOWS_CHECK_POINTER           CheckPointer;\r
+  EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE       GetPointerState;\r
+};\r
+\r
+\r
+extern EFI_GUID gEmuGraphicsWindowProtocolGuid;\r
+\r
+#endif\r
index 7478a5ef2ac81b2c13cd0ae88bb31a166b17be02..aa2066e132d73fc706ca3759a8db254dbf4193c8 100644 (file)
@@ -180,4 +180,4 @@ DevicePathToTextLibConstructor (
   DevicePathFromTextAddFilter (L"EmuThread", DevPathFromTextEmuThread);\r
   DevicePathFromTextAddFilter (L"EmuFs", DevPathFromTextEmuFs);\r
   return EFI_SUCCESS;\r
-}
\ No newline at end of file
+}\r
index f5726785e1c6e5dd6c4ba18332a6e3cc06c743c2..c484f8ec16a0e45c975730a0f056d4b5b21b7428 100644 (file)
@@ -45,4 +45,4 @@
   gEmuGraphicsWindowProtocolGuid\r
   gEfiSimpleFileSystemProtocolGuid\r
   gEmuBlockIoProtocolGuid\r
-  gEmuThreadThunkProtocolGuid
\ No newline at end of file
+  gEmuThreadThunkProtocolGuid\r
index 22f8da7b641e27f942547b67175e8bf2fd7f5cd7..7dd2d494513a46caab5e649c076e8ac744794f48 100644 (file)
@@ -85,4 +85,4 @@ GetIoThunkInstance (
   }\r
 \r
   return NULL;\r
-}
\ No newline at end of file
+}\r
index f79ebc78e2b49a0b04106e5bca1bebc8f4506e41..682231b83ea31bec39a2162d2c953381e3225dfe 100644 (file)
@@ -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\r
+# PeCoff extra action libary for DXE phase that run Emu emulator.\r
+#\r
+# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
+# Portions copyright (c) 2011, Apple Inc. All rights reserved.\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+#\r
+#\r
+##\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = DxeEmuPeCoffExtraActionLib\r
+  FILE_GUID                      = 68FCD487-D230-6846-95B1-5E1F2EF942C4\r
+  MODULE_TYPE                    = DXE_DRIVER\r
+  VERSION_STRING                 = 1.0\r
+  LIBRARY_CLASS                  = PeCoffExtraActionLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_DRIVER\r
+\r
+  CONSTRUCTOR                    = DxeEmuPeCoffLibExtraActionConstructor\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+#  VALID_ARCHITECTURES           = IA32\r
+#\r
+\r
+[Sources]\r
+  DxeEmuPeCoffExtraActionLib.c\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  EmulatorPkg/EmulatorPkg.dec\r
+\r
+[LibraryClasses]\r
+  DebugLib\r
+  HobLib\r
+  BaseMemoryLib\r
+\r
+[Protocols]\r
+  gEmuThunkProtocolGuid                     # PROTOCOL ALWAYS_CONSUMED\r
+\r
index 00d9f1936958bf2bba8814c8b9f822052f286cf5..6bd44bfd0d411c369003413f79b6484f79bcfb49 100644 (file)
@@ -69,7 +69,7 @@ SerialPortWrite (
   if (gEmuThunk == NULL) {\r
     return NumberOfBytes;\r
   }\r
-  \r
+\r
   return gEmuThunk->WriteStdErr (Buffer, NumberOfBytes);\r
 }\r
 \r
index e555026601b09c1f75df3dc1f00ee899c6d4030f..b995266cc800bec85fc7e8f72817e984429af833 100644 (file)
@@ -47,4 +47,4 @@ KeyMapBreak (
   )\r
 {\r
   return EFI_SUCCESS;\r
-}
\ No newline at end of file
+}\r
index 06f995b0d37819eab6650d235fdd09a020b4913a..72b68c283c2f674ea196d9e2643b67ca27650a5a 100644 (file)
@@ -89,16 +89,16 @@ PeiServicesTablePointerLibConstructor (
 }\r
 \r
 /**\r
-  Perform CPU specific actions required to migrate the PEI Services Table \r
+  Perform CPU specific actions required to migrate the PEI Services Table\r
   pointer from temporary RAM to permanent RAM.\r
 \r
-  For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes \r
+  For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes\r
   immediately preceding the Interrupt Descriptor Table (IDT) in memory.\r
-  For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes \r
+  For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes\r
   immediately preceding the Interrupt Descriptor Table (IDT) in memory.\r
   For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in\r
-  a dedicated CPU register.  This means that there is no memory storage \r
-  associated with storing the PEI Services Table pointer, so no additional \r
+  a dedicated CPU register.  This means that there is no memory storage\r
+  associated with storing the PEI Services Table pointer, so no additional\r
   migration actions are required for Itanium or ARM CPUs.\r
 \r
 **/\r
@@ -109,7 +109,7 @@ MigratePeiServicesTablePointer (
   )\r
 {\r
   //\r
-  //  PEI Services Table pointer is cached in the global variable. No additional \r
+  //  PEI Services Table pointer is cached in the global variable. No additional\r
   //  migration actions are required.\r
   //\r
   return;\r
index 9a757f72943e079ae00aa05e027fdd1538192303..fdaf19ab6c39312ff6486a80f6e3c40fc96ba92c 100644 (file)
@@ -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\r
+# PeCoff extra action libary for Pei phase that run Emu emulator.\r
+#\r
+# Lib to provide memory journal status code reporting Routines\r
+# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
+# Portions copyright (c) 2011, Apple Inc. All rights reserved.\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+#\r
+#\r
+##\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = PeiEmuPeCoffExtraActionLib\r
+  FILE_GUID                      = 79C4E72A-730B-F040-8129-95877B3A97A8\r
+  MODULE_TYPE                    = PEIM\r
+  VERSION_STRING                 = 1.0\r
+  LIBRARY_CLASS                  = PeCoffExtraActionLib|PEI_CORE PEIM\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+#  VALID_ARCHITECTURES           = IA32\r
+#\r
+\r
+[Sources]\r
+  PeiEmuPeCoffExtraActionLib.c\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  EmulatorPkg/EmulatorPkg.dec\r
+\r
+[LibraryClasses]\r
+  BaseLib\r
+  PeiServicesLib\r
+  DebugLib\r
+\r
+[Ppis]\r
+  gEmuThunkPpiGuid                          # PPI ALWAYS_CONSUMED\r
+\r
+[Pcd]\r
+  gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage\r
index 5aaf29638952e634f7874a396676373bfaae28f5..d79688820b04f30d014226c5c30f93ed45700e05 100644 (file)
@@ -134,16 +134,16 @@ PeiServicesTablePointerLibConstructor (
 }\r
 \r
 /**\r
-  Perform CPU specific actions required to migrate the PEI Services Table \r
+  Perform CPU specific actions required to migrate the PEI Services Table\r
   pointer from temporary RAM to permanent RAM.\r
 \r
-  For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes \r
+  For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes\r
   immediately preceding the Interrupt Descriptor Table (IDT) in memory.\r
-  For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes \r
+  For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes\r
   immediately preceding the Interrupt Descriptor Table (IDT) in memory.\r
   For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in\r
-  a dedicated CPU register.  This means that there is no memory storage \r
-  associated with storing the PEI Services Table pointer, so no additional \r
+  a dedicated CPU register.  This means that there is no memory storage\r
+  associated with storing the PEI Services Table pointer, so no additional\r
   migration actions are required for Itanium or ARM CPUs.\r
 \r
 **/\r
@@ -154,7 +154,7 @@ MigratePeiServicesTablePointer (
   )\r
 {\r
   //\r
-  //  PEI Services Table pointer is cached in the global variable. No additional \r
+  //  PEI Services Table pointer is cached in the global variable. No additional\r
   //  migration actions are required.\r
   //\r
   return;\r
index fa04ed3e045d9c47489e2489357c504cc367193a..383460b3424a4b57ab687192500781e2b9fb3e05 100644 (file)
@@ -72,16 +72,16 @@ GetPeiServicesTablePointer (
 }\r
 \r
 /**\r
-  Perform CPU specific actions required to migrate the PEI Services Table \r
+  Perform CPU specific actions required to migrate the PEI Services Table\r
   pointer from temporary RAM to permanent RAM.\r
 \r
-  For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes \r
+  For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes\r
   immediately preceding the Interrupt Descriptor Table (IDT) in memory.\r
-  For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes \r
+  For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes\r
   immediately preceding the Interrupt Descriptor Table (IDT) in memory.\r
   For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in\r
-  a dedicated CPU register.  This means that there is no memory storage \r
-  associated with storing the PEI Services Table pointer, so no additional \r
+  a dedicated CPU register.  This means that there is no memory storage\r
+  associated with storing the PEI Services Table pointer, so no additional\r
   migration actions are required for Itanium or ARM CPUs.\r
 \r
 **/\r
@@ -92,7 +92,7 @@ MigratePeiServicesTablePointer (
   )\r
 {\r
   //\r
-  //  PEI Services Table pointer is cached in SRAM. No additional \r
+  //  PEI Services Table pointer is cached in SRAM. No additional\r
   //  migration actions are required.\r
   //\r
   return;\r
index e473b5237685ea1cda99cab51f438301a237088e..0f231785332b29e7bd5e5d1192f66529288af1fd 100644 (file)
@@ -44,4 +44,4 @@
   PeiServicesLib\r
 \r
 [Ppis]\r
-  gEmuThunkPpiGuid
\ No newline at end of file
+  gEmuThunkPpiGuid\r
index 7fa4ddb594db1a64e40a165e4254eb4c599b9e5d..a48f2b5f5385c4896d9a47b779c966d4daeeee6f 100644 (file)
-/*++ @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\r
+  A simple FV stack so the SEC can extract the SEC Core from an\r
+  FV.\r
+\r
+Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <PiPei.h>\r
+\r
+\r
+#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \\r
+  (ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1))\r
+\r
+EFI_FFS_FILE_STATE\r
+GetFileState (\r
+  IN UINT8                ErasePolarity,\r
+  IN EFI_FFS_FILE_HEADER  *FfsHeader\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  Returns the highest bit set of the State field\r
+\r
+Arguments:\r
+  ErasePolarity   - Erase Polarity  as defined by EFI_FVB2_ERASE_POLARITY\r
+                    in the Attributes field.\r
+  FfsHeader       - Pointer to FFS File Header.\r
+\r
+Returns:\r
+  Returns the highest bit in the State field\r
+\r
+**/\r
+{\r
+  EFI_FFS_FILE_STATE  FileState;\r
+  EFI_FFS_FILE_STATE  HighestBit;\r
+\r
+  FileState = FfsHeader->State;\r
+\r
+  if (ErasePolarity != 0) {\r
+    FileState = (EFI_FFS_FILE_STATE)~FileState;\r
+  }\r
+\r
+  HighestBit = 0x80;\r
+  while (HighestBit != 0 && (HighestBit & FileState) == 0) {\r
+    HighestBit >>= 1;\r
+  }\r
+\r
+  return HighestBit;\r
+}\r
+\r
+UINT8\r
+CalculateHeaderChecksum (\r
+  IN EFI_FFS_FILE_HEADER  *FileHeader\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  Calculates the checksum of the header of a file.\r
+\r
+Arguments:\r
+  FileHeader       - Pointer to FFS File Header.\r
+\r
+Returns:\r
+  Checksum of the header.\r
+\r
+**/\r
+{\r
+  UINT8 *ptr;\r
+  UINTN Index;\r
+  UINT8 Sum;\r
+\r
+  Sum = 0;\r
+  ptr = (UINT8 *) FileHeader;\r
+\r
+  for (Index = 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index += 4) {\r
+    Sum = (UINT8) (Sum + ptr[Index]);\r
+    Sum = (UINT8) (Sum + ptr[Index + 1]);\r
+    Sum = (UINT8) (Sum + ptr[Index + 2]);\r
+    Sum = (UINT8) (Sum + ptr[Index + 3]);\r
+  }\r
+\r
+  for (; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) {\r
+    Sum = (UINT8) (Sum + ptr[Index]);\r
+  }\r
+  //\r
+  // State field (since this indicates the different state of file).\r
+  //\r
+  Sum = (UINT8) (Sum - FileHeader->State);\r
+  //\r
+  // Checksum field of the file is not part of the header checksum.\r
+  //\r
+  Sum = (UINT8) (Sum - FileHeader->IntegrityCheck.Checksum.File);\r
+\r
+  return Sum;\r
+}\r
+\r
+EFI_STATUS\r
+SecFfsFindNextFile (\r
+  IN EFI_FV_FILETYPE             SearchType,\r
+  IN EFI_PEI_FV_HANDLE           FvHandle,\r
+  IN OUT EFI_PEI_FILE_HANDLE     *FileHandle\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+    Given the input file pointer, search for the next matching file in the\r
+    FFS volume as defined by SearchType. The search starts from FileHeader inside\r
+    the Firmware Volume defined by FwVolHeader.\r
+\r
+Arguments:\r
+    SearchType - Filter to find only files of this type.\r
+                 Type EFI_FV_FILETYPE_ALL causes no filtering to be done.\r
+    FwVolHeader - Pointer to the FV header of the volume to search.\r
+                  This parameter must point to a valid FFS volume.\r
+    FileHeader  - Pointer to the current file from which to begin searching.\r
+                  This pointer will be updated upon return to reflect the file\r
+                  found.\r
+\r
+Returns:\r
+    EFI_NOT_FOUND - No files matching the search criteria were found\r
+    EFI_SUCCESS\r
+\r
+**/\r
+{\r
+  EFI_FFS_FILE_HEADER *FfsFileHeader;\r
+  UINT32              FileLength;\r
+  UINT32              FileOccupiedSize;\r
+  UINT32              FileOffset;\r
+  UINT64              FvLength;\r
+  UINT8               ErasePolarity;\r
+  UINT8               FileState;\r
+  EFI_FIRMWARE_VOLUME_HEADER  *FwVolHeader;\r
+  EFI_FFS_FILE_HEADER         **FileHeader;\r
+\r
+  //\r
+  // Convert the handle of FV to FV header for memory-mapped firmware volume\r
+  //\r
+  FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) FvHandle;\r
+  FileHeader  = (EFI_FFS_FILE_HEADER **)FileHandle;\r
+\r
+  FvLength = FwVolHeader->FvLength;\r
+  if (FwVolHeader->Attributes & EFI_FVB2_ERASE_POLARITY) {\r
+    ErasePolarity = 1;\r
+  } else {\r
+    ErasePolarity = 0;\r
+  }\r
+  //\r
+  // If FileHeader is not specified (NULL) start with the first file in the\r
+  // firmware volume.  Otherwise, start from the FileHeader.\r
+  //\r
+  if (*FileHeader == NULL) {\r
+    FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FwVolHeader + FwVolHeader->HeaderLength);\r
+  } else {\r
+    //\r
+    // Length is 24 bits wide so mask upper 8 bits\r
+    // FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.\r
+    //\r
+    FileLength        = *(UINT32 *) (*FileHeader)->Size & 0x00FFFFFF;\r
+    FileOccupiedSize  = GET_OCCUPIED_SIZE (FileLength, 8);\r
+    FfsFileHeader     = (EFI_FFS_FILE_HEADER *) ((UINT8 *) *FileHeader + FileOccupiedSize);\r
+  }\r
+\r
+  FileOffset = (UINT32) ((UINT8 *) FfsFileHeader - (UINT8 *) FwVolHeader);\r
+\r
+  while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) {\r
+    //\r
+    // Get FileState which is the highest bit of the State\r
+    //\r
+    FileState = GetFileState (ErasePolarity, FfsFileHeader);\r
+\r
+    switch (FileState) {\r
+\r
+    case EFI_FILE_HEADER_INVALID:\r
+      FileOffset += sizeof (EFI_FFS_FILE_HEADER);\r
+      FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER));\r
+      break;\r
+\r
+    case EFI_FILE_DATA_VALID:\r
+    case EFI_FILE_MARKED_FOR_UPDATE:\r
+      if (CalculateHeaderChecksum (FfsFileHeader) == 0) {\r
+        FileLength        = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;\r
+        FileOccupiedSize  = GET_OCCUPIED_SIZE (FileLength, 8);\r
+\r
+        if ((SearchType == FfsFileHeader->Type) || (SearchType == EFI_FV_FILETYPE_ALL)) {\r
+\r
+          *FileHeader = FfsFileHeader;\r
+\r
+          return EFI_SUCCESS;\r
+        }\r
+\r
+        FileOffset += FileOccupiedSize;\r
+        FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + FileOccupiedSize);\r
+      } else {\r
+        return EFI_NOT_FOUND;\r
+      }\r
+      break;\r
+\r
+    case EFI_FILE_DELETED:\r
+      FileLength        = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;\r
+      FileOccupiedSize  = GET_OCCUPIED_SIZE (FileLength, 8);\r
+      FileOffset += FileOccupiedSize;\r
+      FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + FileOccupiedSize);\r
+      break;\r
+\r
+    default:\r
+      return EFI_NOT_FOUND;\r
+\r
+    }\r
+  }\r
+\r
+  return EFI_NOT_FOUND;\r
+}\r
+\r
+EFI_STATUS\r
+SecFfsFindSectionData (\r
+  IN EFI_SECTION_TYPE      SectionType,\r
+  IN EFI_FFS_FILE_HEADER   *FfsFileHeader,\r
+  IN OUT VOID              **SectionData\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+    Given the input file pointer, search for the next matching section in the\r
+    FFS volume.\r
+\r
+Arguments:\r
+    SearchType    - Filter to find only sections of this type.\r
+    FfsFileHeader - Pointer to the current file to search.\r
+    SectionData   - Pointer to the Section matching SectionType in FfsFileHeader.\r
+                     NULL if section not found\r
+\r
+Returns:\r
+    EFI_NOT_FOUND - No files matching the search criteria were found\r
+    EFI_SUCCESS\r
+\r
+**/\r
+{\r
+  UINT32                    FileSize;\r
+  EFI_COMMON_SECTION_HEADER *Section;\r
+  UINT32                    SectionLength;\r
+  UINT32                    ParsedLength;\r
+\r
+  //\r
+  // Size is 24 bits wide so mask upper 8 bits.\r
+  //    Does not include FfsFileHeader header size\r
+  // FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.\r
+  //\r
+  Section   = (EFI_COMMON_SECTION_HEADER *) (FfsFileHeader + 1);\r
+  FileSize  = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;\r
+  FileSize -= sizeof (EFI_FFS_FILE_HEADER);\r
+\r
+  *SectionData  = NULL;\r
+  ParsedLength  = 0;\r
+  while (ParsedLength < FileSize) {\r
+    if (Section->Type == SectionType) {\r
+      *SectionData = (VOID *) (Section + 1);\r
+      return EFI_SUCCESS;\r
+    }\r
+    //\r
+    // Size is 24 bits wide so mask upper 8 bits.\r
+    // SectionLength is adjusted it is 4 byte aligned.\r
+    // Go to the next section\r
+    //\r
+    SectionLength = *(UINT32 *) Section->Size & 0x00FFFFFF;\r
+    SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);\r
+\r
+    ParsedLength += SectionLength;\r
+    Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + SectionLength);\r
+  }\r
+\r
+  return EFI_NOT_FOUND;\r
+}\r
+\r
index f9c0c3d677df788baea8e1793b6ee0123c74b3fb..b8c5504b70553343c05f9b425c7e76b9386c97bc 100644 (file)
@@ -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\r
+\r
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <PiPei.h>\r
+\r
+CONST EFI_PEI_PPI_DESCRIPTOR  *gPpiList = NULL;\r
+\r
index 3382d7d2a6632e4b522f44677b9f16905fce645d..7bdadb32a3faa611bc3eccd835f6400b85e759d0 100644 (file)
-/** @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\r
+  Provides library functions for common SMBIOS operations. Only available to DXE\r
+  and UEFI module types.\r
+\r
+\r
+Copyright (c) 2012, Apple Inc. All rights reserved.\r
+Portitions Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials are licensed and made available under\r
+the terms and conditions of the BSD License that accompanies this distribution.\r
+The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php.\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include <PiDxe.h>\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/UefiLib.h>\r
+#include <Library/SmbiosLib.h>\r
+\r
+\r
+EFI_SMBIOS_PROTOCOL *gSmbios = NULL;\r
+\r
+\r
+/**\r
+  Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY\r
+  entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.\r
+\r
+  @param  Template   Array of SMBIOS_TEMPLATE_ENTRY entries.\r
+\r
+  @retval EFI_SUCCESS          New SMBIOS tables were created.\r
+  @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosLibInitializeFromTemplate (\r
+  IN  SMBIOS_TEMPLATE_ENTRY   *Template\r
+  )\r
+{\r
+  EFI_STATUS    Status;\r
+  UINTN         Index;\r
+\r
+  if (Template == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Status = EFI_SUCCESS;\r
+\r
+  for (Index = 0; Template[Index].Entry != NULL; Index++) {\r
+    Status = SmbiosLibCreateEntry (Template[Index].Entry, Template[Index].StringArray);\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+\r
+/**\r
+  Create SMBIOS record.\r
+\r
+  Converts a fixed SMBIOS structure and an array of pointers to strings into\r
+  an SMBIOS record where the strings are cat'ed on the end of the fixed record\r
+  and terminated via a double NULL and add to SMBIOS table.\r
+\r
+  SMBIOS_TABLE_TYPE32 gSmbiosType12 = {\r
+    { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof (SMBIOS_TABLE_TYPE12), 0 },\r
+    1 // StringCount\r
+  };\r
+  CHAR8 *gSmbiosType12Strings[] = {\r
+    "Not Found",\r
+    NULL\r
+  };\r
+\r
+  ...\r
+  CreateSmbiosEntry (\r
+    (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,\r
+    gSmbiosType12Strings\r
+    );\r
+\r
+  @param  SmbiosEntry   Fixed SMBIOS structure\r
+  @param  StringArray   Array of strings to convert to an SMBIOS string pack.\r
+                        NULL is OK.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosLibCreateEntry (\r
+  IN  SMBIOS_STRUCTURE *SmbiosEntry,\r
+  IN  CHAR8            **StringArray\r
+  )\r
+{\r
+  EFI_STATUS                Status;\r
+  EFI_SMBIOS_HANDLE         SmbiosHandle;\r
+  EFI_SMBIOS_TABLE_HEADER   *Record;\r
+  UINTN                     Index;\r
+  UINTN                     StringSize;\r
+  UINTN                     Size;\r
+  CHAR8                     *Str;\r
+\r
+  // Calculate the size of the fixed record and optional string pack\r
+  Size = SmbiosEntry->Length;\r
+  if (StringArray == NULL) {\r
+    Size += 2; // Min string section is double null\r
+  } else if (StringArray[0] == NULL) {\r
+    Size += 2; // Min string section is double null\r
+  } else {\r
+    for (Index = 0; StringArray[Index] != NULL; Index++) {\r
+      StringSize = AsciiStrSize (StringArray[Index]);\r
+      Size += StringSize;\r
+    }\r
+    // Don't forget the terminating double null\r
+    Size += 1;\r
+  }\r
+\r
+  // Copy over Template\r
+  Record = (EFI_SMBIOS_TABLE_HEADER *)AllocateZeroPool (Size);\r
+  if (Record == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  CopyMem (Record, SmbiosEntry, SmbiosEntry->Length);\r
+\r
+  if (StringArray != NULL) {\r
+    // Append string pack\r
+    Str = ((CHAR8 *)Record) + Record->Length;\r
+    for (Index = 0; StringArray[Index] != NULL; Index++) {\r
+      StringSize = AsciiStrSize (StringArray[Index]);\r
+      CopyMem (Str, StringArray[Index], StringSize);\r
+      Str += StringSize;\r
+    }\r
+    *Str = 0;\r
+  }\r
+\r
+  SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
+  Status = gSmbios->Add (\r
+                     gSmbios,\r
+                     gImageHandle,\r
+                     &SmbiosHandle,\r
+                     Record\r
+                     );\r
+\r
+  FreePool (Record);\r
+  return Status;\r
+}\r
+\r
+\r
+\r
+/**\r
+  Update the string associated with an existing SMBIOS record.\r
+\r
+  This function allows the update of specific SMBIOS strings. The number of valid strings for any\r
+  SMBIOS record is defined by how many strings were present when Add() was called.\r
+\r
+  @param[in]    SmbiosHandle    SMBIOS Handle of structure that will have its string updated.\r
+  @param[in]    StringNumber    The non-zero string number of the string to update.\r
+  @param[in]    String          Update the StringNumber string with String.\r
+\r
+  @retval EFI_SUCCESS           SmbiosHandle had its StringNumber String updated.\r
+  @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.\r
+  @retval EFI_UNSUPPORTED       String was not added because it is longer than the SMBIOS Table supports.\r
+  @retval EFI_NOT_FOUND         The StringNumber.is not valid for this SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosLibUpdateString (\r
+  IN  EFI_SMBIOS_HANDLE     SmbiosHandle,\r
+  IN  SMBIOS_TABLE_STRING   StringNumber,\r
+  IN  CHAR8                 *String\r
+  )\r
+{\r
+  UINTN StringIndex;\r
+\r
+  if (String == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if (*String == '\0') {\r
+    // A string with no data is not legal in SMBIOS\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  StringIndex = StringNumber;\r
+  return gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex, String);\r
+}\r
+\r
+\r
+/**\r
+  Update the string associated with an existing SMBIOS record.\r
+\r
+  This function allows the update of specific SMBIOS strings. The number of valid strings for any\r
+  SMBIOS record is defined by how many strings were present when Add() was called.\r
+\r
+  @param[in]    SmbiosHandle    SMBIOS Handle of structure that will have its string updated.\r
+  @param[in]    StringNumber    The non-zero string number of the string to update.\r
+  @param[in]    String          Update the StringNumber string with String.\r
+\r
+  @retval EFI_SUCCESS           SmbiosHandle had its StringNumber String updated.\r
+  @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.\r
+  @retval EFI_UNSUPPORTED       String was not added because it is longer than the SMBIOS Table supports.\r
+  @retval EFI_NOT_FOUND         The StringNumber.is not valid for this SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosLibUpdateUnicodeString (\r
+  IN  EFI_SMBIOS_HANDLE     SmbiosHandle,\r
+  IN  SMBIOS_TABLE_STRING   StringNumber,\r
+  IN  CHAR16                *String\r
+  )\r
+{\r
+  EFI_STATUS  Status;\r
+  UINTN       StringIndex;\r
+  CHAR8       *Ascii;\r
+\r
+  if (String == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if (*String == '\0') {\r
+    // A string with no data is not legal in SMBIOS\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Ascii = AllocateZeroPool (StrSize (String));\r
+  if (Ascii == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  UnicodeStrToAsciiStr (String, Ascii);\r
+\r
+  StringIndex = StringNumber;\r
+  Status = gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex, Ascii);\r
+\r
+  FreePool (Ascii);\r
+  return Status;\r
+}\r
+\r
+\r
+/**\r
+  Allow caller to read a specific SMBIOS string\r
+\r
+  @param[in]    Header          SMBIOS record that contains the string.\r
+  @param[in[    StringNumber    Instance of SMBIOS string 1 - N.\r
+\r
+  @retval NULL                  Instance of Type SMBIOS string was not found.\r
+  @retval Other                 Pointer to matching SMBIOS string.\r
+**/\r
+CHAR8 *\r
+EFIAPI\r
+SmbiosLibReadString (\r
+  IN SMBIOS_STRUCTURE   *Header,\r
+  IN EFI_SMBIOS_STRING  StringNumber\r
+  )\r
+{\r
+  CHAR8       *Data;\r
+  UINTN       Match;\r
+\r
+  Data = (CHAR8 *)Header + Header->Length;\r
+  for (Match = 1;!(*Data == 0 && *(Data+1) == 0); ) {\r
+    if (StringNumber == Match) {\r
+      return Data;\r
+    }\r
+    Data++;\r
+    if (*(Data - 1) == '\0') {\r
+      Match++;\r
+    }\r
+  }\r
+\r
+  return NULL;\r
+}\r
+\r
+\r
+/**\r
+  Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.\r
+\r
+  @param[in]    Type            Type of the next SMBIOS record to return.\r
+  @param[in[    Instance        Instance of SMBIOS record 0 - N-1.\r
+  @param[out]   SmbiosHandle    Returns SMBIOS handle for the matching record.\r
+\r
+  @retval NULL                  Instance of Type SMBIOS record was not found.\r
+  @retval Other                 Pointer to matching SMBIOS record.\r
+**/\r
+SMBIOS_STRUCTURE *\r
+EFIAPI\r
+SmbiosLibGetRecord (\r
+  IN  EFI_SMBIOS_TYPE   Type,\r
+  IN  UINTN             Instance,\r
+  OUT EFI_SMBIOS_HANDLE *SmbiosHandle\r
+  )\r
+{\r
+  EFI_STATUS              Status;\r
+  EFI_SMBIOS_TABLE_HEADER *Record;\r
+  UINTN                   Match;\r
+\r
+  Match         = 0;\r
+  *SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;\r
+  do {\r
+    Status = gSmbios->GetNext (gSmbios, SmbiosHandle, &Type, &Record, NULL);\r
+    if (!EFI_ERROR (Status)) {\r
+      if (Match == Instance) {\r
+        return (SMBIOS_STRUCTURE *)Record;\r
+      }\r
+      Match++;\r
+    }\r
+  } while (!EFI_ERROR (Status));\r
+\r
+  return NULL;\r
+}\r
+\r
+\r
+/**\r
+  Remove an SMBIOS record.\r
+\r
+  This function removes an SMBIOS record using the handle specified by SmbiosHandle.\r
+\r
+  @param[in]    SmbiosHandle        The handle of the SMBIOS record to remove.\r
+\r
+  @retval EFI_SUCCESS               SMBIOS record was removed.\r
+  @retval EFI_INVALID_PARAMETER     SmbiosHandle does not specify a valid SMBIOS record.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosLibRemove (\r
+  OUT EFI_SMBIOS_HANDLE SmbiosHandle\r
+  )\r
+{\r
+  return gSmbios->Remove (gSmbios, SmbiosHandle);\r
+}\r
+\r
+\r
+\r
+/**\r
+\r
+  @param  ImageHandle  ImageHandle of the loaded driver.\r
+  @param  SystemTable  Pointer to the EFI System Table.\r
+\r
+  @retval  EFI_SUCCESS            Register successfully.\r
+  @retval  EFI_OUT_OF_RESOURCES   No enough memory to register this handler.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+SmbiosLibConstructor (\r
+  IN EFI_HANDLE        ImageHandle,\r
+  IN EFI_SYSTEM_TABLE  *SystemTable\r
+  )\r
+{\r
+  return gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **)&gSmbios);\r
+}\r
+\r
index 0593c47d48c22227dab16a8c5c4a3de826cf476f..8f4d4c6307900df7447f4bd5194e76420f57dfa4 100644 (file)
@@ -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\r
+# SMBIOS Library\r
+#\r
+# Copyright (c) 2012, Apple Inc. All rights reserved.\r
+# Portions copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+#\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution. The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php\r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+#\r
+##\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = SmbiosLib\r
+  FILE_GUID                      = 881863A2-09FD-3E44-8D62-7AE038D03747\r
+  MODULE_TYPE                    = DXE_DRIVER\r
+  VERSION_STRING                 = 1.0\r
+  LIBRARY_CLASS                  = SmbiosLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER SMM_CORE UEFI_APPLICATION UEFI_DRIVER\r
+\r
+  CONSTRUCTOR                    = SmbiosLibConstructor\r
+\r
+\r
+[Sources]\r
+  SmbiosLib.c\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  EmulatorPkg/EmulatorPkg.dec\r
+\r
+[LibraryClasses]\r
+  BaseLib\r
+  BaseMemoryLib\r
+  DebugLib\r
+  MemoryAllocationLib\r
+  UefiBootServicesTableLib\r
+  UefiLib\r
+\r
+[Protocols]\r
+  gEfiSmbiosProtocolGuid\r
+\r
+[Depex]\r
+  gEfiSmbiosProtocolGuid\r
index c7749f3f178a18231111d2ddfae5e140a9388ed7..e4d7cb67c818e56b8a62e55966ae0126118306ee 100644 (file)
@@ -112,8 +112,8 @@ extern EFI_HII_HANDLE               mHiiHandle;
   @param  Smbios                The EFI_SMBIOS_PROTOCOL instance.\r
   @param  SmbiosHandle          A unique handle will be assigned to the SMBIOS record.\r
   @param  Record                The data for the fixed portion of the SMBIOS record. The format of the record is\r
-                                determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted area is defined \r
-                                by EFI_SMBIOS_TABLE_HEADER.Length and either followed by a double-null (0x0000) or \r
+                                determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted area is defined\r
+                                by EFI_SMBIOS_TABLE_HEADER.Length and either followed by a double-null (0x0000) or\r
                                 a set of null terminated strings and a null.\r
 \r
   @retval EFI_SUCCESS           Record was added.\r
index 65fec01158866570105eac31fe11fe40adc3a22e..ab8ee258c8f4143a49f231139f5f887e5ba171a5 100644 (file)
@@ -174,8 +174,8 @@ Returns:
   @param  Smbios                The EFI_SMBIOS_PROTOCOL instance.\r
   @param  SmbiosHandle          A unique handle will be assigned to the SMBIOS record.\r
   @param  Record                The data for the fixed portion of the SMBIOS record. The format of the record is\r
-                                determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted area is defined \r
-                                by EFI_SMBIOS_TABLE_HEADER.Length and either followed by a double-null (0x0000) or \r
+                                determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted area is defined\r
+                                by EFI_SMBIOS_TABLE_HEADER.Length and either followed by a double-null (0x0000) or\r
                                 a set of null terminated strings and a null.\r
 \r
   @retval EFI_SUCCESS           Record was added.\r
index 123e090ed0c956cbc4ff397da7227543a71940f5..676d324e6b94192914a769c56b4b83d54e00de1d 100644 (file)
@@ -66,10 +66,10 @@ CreatePlatformSmbiosMemoryRecords (
   while ((HobPtr.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, HobPtr.Raw)) != NULL) {\r
     if (HobPtr.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) {\r
       gSmbiosType19Template.ExtendedStartingAddress = HobPtr.ResourceDescriptor->PhysicalStart;\r
-      gSmbiosType19Template.ExtendedEndingAddress = \r
-        HobPtr.ResourceDescriptor->PhysicalStart + \r
+      gSmbiosType19Template.ExtendedEndingAddress =\r
+        HobPtr.ResourceDescriptor->PhysicalStart +\r
         HobPtr.ResourceDescriptor->ResourceLength - 1;\r
-      \r
+\r
       SmbiosLibCreateEntry ((SMBIOS_STRUCTURE *)&gSmbiosType19Template, NULL);\r
     }\r
     HobPtr.Raw = GET_NEXT_HOB (HobPtr);\r
@@ -97,7 +97,7 @@ PlatfomrSmbiosDriverEntryPoint (
   EFI_SMBIOS_HANDLE           SmbiosHandle;\r
   SMBIOS_STRUCTURE_POINTER    Smbios;\r
 \r
-  // Phase 0 - Patch table to make SMBIOS 2.7 structures smaller to conform \r
+  // Phase 0 - Patch table to make SMBIOS 2.7 structures smaller to conform\r
   //           to an early version of the specification.\r
 \r
   // Phase 1 - Initialize SMBIOS tables from template\r
@@ -112,18 +112,18 @@ PlatfomrSmbiosDriverEntryPoint (
     Smbios.Type0->BiosSize = (UINT8)DivU64x32 (FixedPcdGet64 (PcdEmuFirmwareFdSize), 64*1024) - 1;\r
 \r
     SmbiosLibUpdateUnicodeString (\r
-      SmbiosHandle, \r
-      Smbios.Type0->BiosVersion, \r
+      SmbiosHandle,\r
+      Smbios.Type0->BiosVersion,\r
       (CHAR16 *) PcdGetPtr (PcdFirmwareVersionString)\r
       );\r
     SmbiosLibUpdateUnicodeString (\r
-      SmbiosHandle, \r
-      Smbios.Type0->BiosReleaseDate, \r
+      SmbiosHandle,\r
+      Smbios.Type0->BiosReleaseDate,\r
       (CHAR16 *) PcdGetPtr (PcdFirmwareReleaseDateString)\r
       );\r
   }\r
 \r
-  // Phase 3 - Create tables from scratch \r
+  // Phase 3 - Create tables from scratch\r
 \r
   // Create Type 13 record from EFI Variables\r
   // Do we need this record for EFI as the info is available from EFI varaibles\r
index 737310f47082e169953ffc4bc585a5ff297aab5a..bee1abb3eb7bf6f3a7834c09b0a91d3b5e41c903 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # Platform SMBIOS driver that fills in SMBIOS table entries.\r
 #\r
-# Copyright (c) 2012, Apple Inc. All rights reserved. \r
+# Copyright (c) 2012, Apple Inc. All rights reserved.\r
 # Portions copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
 #\r
 #  This program and the accompanying materials\r
@@ -52,4 +52,4 @@
   gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareFdSize\r
 \r
 [Depex]\r
-  TRUE
\ No newline at end of file
+  TRUE\r
index c79e57b30412e4a9a3413e5fe456ca2281fa1d5c..27679518efa97a431928df22e436a145daf8c998 100644 (file)
@@ -8,7 +8,7 @@
     Processor Information (Type 4) - CPU Driver\r
     Cache Information (Type 7) - For cache that is external to processor\r
     System Slots (Type 9) - If system has slots\r
-    Physical Memory Array (Type 16) \r
+    Physical Memory Array (Type 16)\r
     Memory Device (Type 17) - For each socketed system-memory Device\r
     Memory Array Mapped Address (Type 19) - One per contiguous block per Physical Memroy Array\r
     System Boot Information (Type 32)\r
@@ -69,9 +69,9 @@ SMBIOS_TABLE_TYPE0 gSmbiosType0Template = {
     0,    //  PrinterIsSupported                :1;\r
     0,    //  CgaMonoIsSupported                :1;\r
     0,    //  NecPc98                           :1;\r
-    0     //  ReservedForVendor                 :32; ///< Bits 32-63. Bits 32-47 reserved for BIOS vendor \r
-                                                 ///< and bits 48-63 reserved for System Vendor. \r
-  },           \r
+    0     //  ReservedForVendor                 :32; ///< Bits 32-63. Bits 32-47 reserved for BIOS vendor\r
+                                                 ///< and bits 48-63 reserved for System Vendor.\r
+  },\r
   {       // BIOSCharacteristicsExtensionBytes[]\r
     0x81, //  AcpiIsSupported                   :1;\r
           //  UsbLegacyIsSupported              :1;\r
@@ -108,7 +108,7 @@ SMBIOS_TABLE_TYPE1 gSmbiosType1Template = {
   3,    // Version String\r
   4,    // SerialNumber String\r
   { 0x25EF0280, 0xEC82, 0x42B0, { 0x8F, 0xB6, 0x10, 0xAD, 0xCC, 0xC6, 0x7C, 0x02 } },\r
-  SystemWakeupTypePowerSwitch,  \r
+  SystemWakeupTypePowerSwitch,\r
   5,    // SKUNumber String\r
   6,    // Family String\r
 };\r
@@ -119,7 +119,7 @@ CHAR8  *gSmbiosType1Strings[] = {
   "System Serial#",\r
   "System SKU#",\r
   "edk2",\r
-  NULL \r
+  NULL\r
 };\r
 \r
 SMBIOS_TABLE_TYPE2  gSmbiosType2Template = {\r
@@ -139,7 +139,7 @@ SMBIOS_TABLE_TYPE2  gSmbiosType2Template = {
   },\r
   6,    // LocationInChassis String\r
   0,                        // ChassisHandle;\r
-  BaseBoardTypeMotherBoard, // BoardType;            \r
+  BaseBoardTypeMotherBoard, // BoardType;\r
   0,                        // NumberOfContainedObjectHandles;\r
   { 0 }                     // ContainedObjectHandles[1];\r
 };\r
@@ -150,7 +150,7 @@ CHAR8  *gSmbiosType2Strings[] = {
   "Base Board Serial#",\r
   "Base Board Asset Tag#",\r
   "Part Component",\r
-  NULL  \r
+  NULL\r
 };\r
 \r
 SMBIOS_TABLE_TYPE3  gSmbiosType3Template = {\r
@@ -160,10 +160,10 @@ SMBIOS_TABLE_TYPE3  gSmbiosType3Template = {
   2,                        // Version String\r
   3,                        // SerialNumber String\r
   4,                        // AssetTag String\r
-  ChassisStateSafe,         // BootupState;           \r
-  ChassisStateSafe,         // PowerSupplyState;       \r
-  ChassisStateSafe,         // ThermalState;           \r
-  ChassisSecurityStatusNone,// SecurityStatus;         \r
+  ChassisStateSafe,         // BootupState;\r
+  ChassisStateSafe,         // PowerSupplyState;\r
+  ChassisStateSafe,         // ThermalState;\r
+  ChassisSecurityStatusNone,// SecurityStatus;\r
   { 0, 0, 0, 0 },           // OemDefined[4];\r
   0,    // Height;\r
   0,    // NumberofPowerCords;\r
@@ -176,7 +176,7 @@ CHAR8  *gSmbiosType3Strings[] = {
   "EmulatorPkg",\r
   "Chassis Board Serial#",\r
   "Chassis Board Asset Tag#",\r
-  NULL  \r
+  NULL\r
 };\r
 \r
 SMBIOS_TABLE_TYPE8  gSmbiosType8Template1 = {\r
index a2e1f3e91078fea62bbbac9a94bccfb56736b6b6..731ee0ffdba5cb625e05da61a0f221b1a8c30df1 100644 (file)
@@ -22,7 +22,7 @@
     .586p\r
     .model  flat,C\r
     .code\r
-    \r
+\r
 ;------------------------------------------------------------------------------\r
 ; VOID\r
 ; EFIAPI\r
@@ -30,7 +30,7 @@
 ;   UINT32   TemporaryMemoryBase,\r
 ;   UINT32   PermenentMemoryBase\r
 ;   );\r
-;------------------------------------------------------------------------------    \r
+;------------------------------------------------------------------------------\r
 SecSwitchStack   PROC\r
     ;\r
     ; Save three register: eax, ebx, ecx\r
@@ -39,16 +39,16 @@ SecSwitchStack   PROC
     push  ebx\r
     push  ecx\r
     push  edx\r
-    \r
+\r
     ;\r
     ; !!CAUTION!! this function address's is pushed into stack after\r
     ; migration of whole temporary memory, so need save it to permenent\r
     ; memory at first!\r
     ;\r
-    \r
+\r
     mov   ebx, [esp + 20]          ; Save the first parameter\r
     mov   ecx, [esp + 24]          ; Save the second parameter\r
-    \r
+\r
     ;\r
     ; Save this function's return address into permenent memory at first.\r
     ; Then, Fixup the esp point to permenent memory\r
@@ -57,17 +57,17 @@ SecSwitchStack   PROC
     sub   eax, ebx\r
     add   eax, ecx\r
     mov   edx, dword ptr [esp]         ; copy pushed register's value to permenent memory\r
-    mov   dword ptr [eax], edx    \r
+    mov   dword ptr [eax], edx\r
     mov   edx, dword ptr [esp + 4]\r
-    mov   dword ptr [eax + 4], edx    \r
+    mov   dword ptr [eax + 4], edx\r
     mov   edx, dword ptr [esp + 8]\r
-    mov   dword ptr [eax + 8], edx    \r
+    mov   dword ptr [eax + 8], edx\r
     mov   edx, dword ptr [esp + 12]\r
-    mov   dword ptr [eax + 12], edx    \r
+    mov   dword ptr [eax + 12], edx\r
     mov   edx, dword ptr [esp + 16]    ; Update this function's return address into permenent memory\r
-    mov   dword ptr [eax + 16], edx    \r
+    mov   dword ptr [eax + 16], edx\r
     mov   esp, eax                     ; From now, esp is pointed to permenent memory\r
-        \r
+\r
     ;\r
     ; Fixup the ebp point to permenent memory\r
     ;\r
@@ -75,7 +75,7 @@ SecSwitchStack   PROC
     sub   eax, ebx\r
     add   eax, ecx\r
     mov   ebp, eax                ; From now, ebp is pointed to permenent memory\r
-    \r
+\r
     ;\r
     ; Fixup callee's ebp point for PeiDispatch\r
     ;\r
@@ -83,7 +83,7 @@ SecSwitchStack   PROC
     sub   eax, ebx\r
     add   eax, ecx\r
     mov   dword ptr [ebp], eax    ; From now, Temporary's PPI caller's stack is in permenent memory\r
-    \r
+\r
     pop   edx\r
     pop   ecx\r
     pop   ebx\r
index 8a015682ddd07a9e395f38f0ad6fb1b58ef1416c..4132e9d9b7b1f2658b08a614b76e11b2299c3c1f 100644 (file)
-/*++ @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\r
+  Stub SEC that is called from the OS appliation that is the root of the emulator.\r
+\r
+  The OS application will call the SEC with the PEI Entry Point API.\r
+\r
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "Sec.h"\r
+\r
+\r
+\r
+EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {\r
+  SecTemporaryRamSupport\r
+};\r
+\r
+\r
+EFI_PEI_PPI_DESCRIPTOR  gPrivateDispatchTable[] = {\r
+  {\r
+    EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,\r
+    &gEfiTemporaryRamSupportPpiGuid,\r
+    &mSecTemporaryRamSupportPpi\r
+  }\r
+};\r
+\r
+\r
+\r
+/**\r
+  The entry point of PE/COFF Image for the PEI Core, that has been hijacked by this\r
+  SEC that sits on top of an OS application. So the entry and exit of this module\r
+  has the same API.\r
+\r
+  This function is the entry point for the PEI Foundation, which allows the SEC phase\r
+  to pass information about the stack, temporary RAM and the Boot Firmware Volume.\r
+  In addition, it also allows the SEC phase to pass services and data forward for use\r
+  during the PEI phase in the form of one or more PPIs.\r
+  There is no limit to the number of additional PPIs that can be passed from SEC into\r
+  the PEI Foundation. As part of its initialization phase, the PEI Foundation will add\r
+  these SEC-hosted PPIs to its PPI database such that both the PEI Foundation and any\r
+  modules can leverage the associated service calls and/or code in these early PPIs.\r
+  This function is required to call ProcessModuleEntryPointList() with the Context\r
+  parameter set to NULL.  ProcessModuleEntryPoint() is never expected to return.\r
+  The PEI Core is responsible for calling ProcessLibraryConstructorList() as soon as\r
+  the PEI Services Table and the file handle for the PEI Core itself have been established.\r
+  If ProcessModuleEntryPointList() returns, then ASSERT() and halt the system.\r
+\r
+  @param SecCoreData  Points to a data structure containing information about the PEI\r
+                      core's operating environment, such as the size and location of\r
+                      temporary RAM, the stack location and the BFV location.\r
+\r
+  @param PpiList      Points to a list of one or more PPI descriptors to be installed\r
+                      initially by the PEI core. An empty PPI list consists of a single\r
+                      descriptor with the end-tag EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST.\r
+                      As part of its initialization phase, the PEI Foundation will add\r
+                      these SEC-hosted PPIs to its PPI database such that both the PEI\r
+                      Foundation and any modules can leverage the associated service calls\r
+                      and/or code in these early PPIs.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+_ModuleEntryPoint (\r
+  IN EFI_SEC_PEI_HAND_OFF   *SecCoreData,\r
+  IN EFI_PEI_PPI_DESCRIPTOR *PpiList\r
+  )\r
+{\r
+  EFI_STATUS                Status;\r
+  EFI_PEI_FV_HANDLE         VolumeHandle;\r
+  EFI_PEI_FILE_HANDLE       FileHandle;\r
+  VOID                      *PeCoffImage;\r
+  EFI_PEI_CORE_ENTRY_POINT  EntryPoint;\r
+  EFI_PEI_PPI_DESCRIPTOR    *Ppi;\r
+  EFI_PEI_PPI_DESCRIPTOR    *SecPpiList;\r
+  UINTN                     SecReseveredMemorySize;\r
+  UINTN                     Index;\r
+\r
+  EMU_MAGIC_PAGE()->PpiList = PpiList;\r
+  ProcessLibraryConstructorList ();\r
+\r
+  DEBUG ((EFI_D_ERROR, "SEC Has Started\n"));\r
+\r
+  //\r
+  // Add Our PPIs to the list\r
+  //\r
+  SecReseveredMemorySize = sizeof (gPrivateDispatchTable);\r
+  for (Ppi = PpiList, Index = 1; ; Ppi++, Index++) {\r
+    SecReseveredMemorySize += sizeof (EFI_PEI_PPI_DESCRIPTOR);\r
+\r
+    if ((Ppi->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) == EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) {\r
+      // Since we are appending, need to clear out privious list terminator.\r
+      Ppi->Flags &= ~EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;\r
+      break;\r
+    }\r
+  }\r
+\r
+  // Keep everything on a good alignment\r
+  SecReseveredMemorySize = ALIGN_VALUE (SecReseveredMemorySize, CPU_STACK_ALIGNMENT);\r
+\r
+#if 0\r
+  // Tell the PEI Core to not use our buffer in temp RAM\r
+  SecPpiList = (EFI_PEI_PPI_DESCRIPTOR *)SecCoreData->PeiTemporaryRamBase;\r
+  SecCoreData->PeiTemporaryRamBase = (VOID *)((UINTN)SecCoreData->PeiTemporaryRamBase + SecReseveredMemorySize);\r
+  SecCoreData->PeiTemporaryRamSize -= SecReseveredMemorySize;\r
+#else\r
+  {\r
+    //\r
+    // When I subtrack from SecCoreData->PeiTemporaryRamBase PEI Core crashes? Either there is a bug\r
+    // or I don't understand temp RAM correctly?\r
+    //\r
+    EFI_PEI_PPI_DESCRIPTOR    PpiArray[10];\r
+\r
+    SecPpiList = &PpiArray[0];\r
+    ASSERT (sizeof (PpiArray) >= SecReseveredMemorySize);\r
+  }\r
+#endif\r
+  // Copy existing list, and append our entries.\r
+  CopyMem (SecPpiList, PpiList, sizeof (EFI_PEI_PPI_DESCRIPTOR) * Index);\r
+  CopyMem (&SecPpiList[Index], gPrivateDispatchTable, sizeof (gPrivateDispatchTable));\r
+\r
+  // Find PEI Core and transfer control\r
+  VolumeHandle = (EFI_PEI_FV_HANDLE)(UINTN)SecCoreData->BootFirmwareVolumeBase;\r
+  FileHandle   = NULL;\r
+  Status = PeiServicesFfsFindNextFile (EFI_FV_FILETYPE_PEI_CORE, VolumeHandle, &FileHandle);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  Status = PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle, &PeCoffImage);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  Status = PeCoffLoaderGetEntryPoint (PeCoffImage, (VOID **)&EntryPoint);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  // Transfer control to PEI Core\r
+  EntryPoint (SecCoreData, SecPpiList);\r
+\r
+  // PEI Core never returns\r
+  ASSERT (FALSE);\r
+  return;\r
+}\r
+\r
+\r
+\r
index 4782578efa0084e57e7837da854f32c4f082052d..c5781201eb1994ad4782534c7a00a94e2f3715b3 100644 (file)
@@ -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\r
+  Stub SEC that is called from the OS appliation that is the root of the emulator.\r
+\r
+  The OS application will call the SEC with the PEI Entry Point API.\r
+\r
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef __SEC_H___\r
+#define __SEC_H___\r
+\r
+\r
+#include <PiPei.h>\r
+#include <Library/EmuMagicPageLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/PeiServicesLib.h>\r
+#include <Library/PeCoffGetEntryPointLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+\r
+#include <Ppi/TemporaryRamSupport.h>\r
+\r
+\r
+//\r
+// I think this shold be defined in a MdePkg include file?\r
+//\r
+VOID\r
+EFIAPI\r
+ProcessLibraryConstructorList (\r
+  VOID\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+SecTemporaryRamSupport (\r
+  IN CONST EFI_PEI_SERVICES   **PeiServices,\r
+  IN EFI_PHYSICAL_ADDRESS     TemporaryMemoryBase,\r
+  IN EFI_PHYSICAL_ADDRESS     PermanentMemoryBase,\r
+  IN UINTN                    CopySize\r
+  );\r
+\r
+\r
+#endif\r
+\r
index 4ba27c2a6a57f740474756742f65a96f58968e1a..42103e100a43c28a165e89e54df1df38af8526bb 100644 (file)
@@ -47,8 +47,8 @@ typedef struct {
   VOID                        *CurrentReadPointer;\r
   VOID                        *EndReadPointer;\r
 \r
-       UINT32                                                                      ReceivedPackets;\r
-       UINT32                                                                      DroppedPackets;\r
+  UINT32                      ReceivedPackets;\r
+  UINT32                      DroppedPackets;\r
 \r
 } EMU_SNP_PRIVATE;\r
 \r
@@ -200,8 +200,8 @@ EmuSnpStart (
   struct ifreq       BoundIf;\r
   struct bpf_program BpfProgram;\r
   struct bpf_insn    *FilterProgram;\r
-       u_int                                                    Value;\r
-       u_int                                            ReadBufferSize;\r
+  u_int               Value;\r
+  u_int               ReadBufferSize;\r
   UINT16             Temp16;\r
   UINT32             Temp32;\r
 \r
@@ -229,23 +229,23 @@ EmuSnpStart (
     }\r
 \r
     //\r
-               // Get the read buffer size.\r
-               //\r
-               if (ioctl (Private->BpfFd, BIOCGBLEN, &ReadBufferSize) < 0) {\r
-                       goto DeviceErrorExit;\r
-               }\r
-\r
-               //\r
-               // Default value from BIOCGBLEN is usually too small, so use a much larger size, if necessary.\r
-               //\r
-               if (ReadBufferSize < FixedPcdGet32 (PcdNetworkPacketFilterSize)) {\r
-                       ReadBufferSize = FixedPcdGet32 (PcdNetworkPacketFilterSize);\r
-                       if (ioctl (Private->BpfFd, BIOCSBLEN, &ReadBufferSize) < 0) {\r
-                               goto DeviceErrorExit;\r
-                       }\r
-               }\r
-\r
-               //\r
+    // Get the read buffer size.\r
+    //\r
+    if (ioctl (Private->BpfFd, BIOCGBLEN, &ReadBufferSize) < 0) {\r
+      goto DeviceErrorExit;\r
+    }\r
+\r
+    //\r
+    // Default value from BIOCGBLEN is usually too small, so use a much larger size, if necessary.\r
+    //\r
+    if (ReadBufferSize < FixedPcdGet32 (PcdNetworkPacketFilterSize)) {\r
+      ReadBufferSize = FixedPcdGet32 (PcdNetworkPacketFilterSize);\r
+      if (ioctl (Private->BpfFd, BIOCSBLEN, &ReadBufferSize) < 0) {\r
+        goto DeviceErrorExit;\r
+      }\r
+    }\r
+\r
+    //\r
     // Associate our interface with this BPF file descriptor.\r
     //\r
     AsciiStrCpy (BoundIf.ifr_name, Private->InterfaceName);\r
@@ -254,7 +254,7 @@ EmuSnpStart (
     }\r
 \r
     //\r
-               // Enable immediate mode.\r
+    // Enable immediate mode.\r
     //\r
     Value = 1;\r
     if (ioctl (Private->BpfFd, BIOCIMMEDIATE, &Value) < 0) {\r
@@ -286,8 +286,8 @@ EmuSnpStart (
     //\r
     // Allocate read buffer.\r
     //\r
-               Private->ReadBufferSize = ReadBufferSize;\r
-               Private->ReadBuffer = malloc (Private->ReadBufferSize);\r
+    Private->ReadBufferSize = ReadBufferSize;\r
+    Private->ReadBuffer = malloc (Private->ReadBufferSize);\r
     if (Private->ReadBuffer == NULL) {\r
       goto ErrorExit;\r
     }\r
@@ -295,7 +295,7 @@ EmuSnpStart (
     Private->CurrentReadPointer = Private->EndReadPointer = Private->ReadBuffer;\r
 \r
     //\r
-               // Install our packet filter: successful reads should only produce broadcast or unicast\r
+    // Install our packet filter: successful reads should only produce broadcast or unicast\r
     // packets directed to our fake MAC address.\r
     //\r
     FilterProgram = malloc (sizeof (mFilterInstructionTemplate)) ;\r
@@ -906,7 +906,7 @@ EmuSnpReceive (
 {\r
   EMU_SNP_PRIVATE    *Private;\r
   struct bpf_hdr     *BpfHeader;\r
-       struct bpf_stat    BpfStats;\r
+  struct bpf_stat     BpfStats;\r
   ETHERNET_HEADER    *EnetHeader;\r
   ssize_t            Result;\r
 \r
@@ -916,19 +916,19 @@ EmuSnpReceive (
     return EFI_NOT_STARTED;\r
   }\r
 \r
-       ZeroMem (&BpfStats, sizeof( BpfStats));\r
+  ZeroMem (&BpfStats, sizeof( BpfStats));\r
 \r
-       if (ioctl (Private->BpfFd, BIOCGSTATS, &BpfStats) == 0) {\r
-               Private->ReceivedPackets += BpfStats.bs_recv;\r
-               if (BpfStats.bs_drop > Private->DroppedPackets) {\r
-                       printf (\r
-                         "SNP: STATS: RCVD = %d DROPPED = %d.  Probably need to increase BPF PcdNetworkPacketFilterSize?\n",\r
-                               BpfStats.bs_recv,\r
-                               BpfStats.bs_drop - Private->DroppedPackets\r
-                               );\r
-                       Private->DroppedPackets = BpfStats.bs_drop;\r
-               }\r
-       }\r
+  if (ioctl (Private->BpfFd, BIOCGSTATS, &BpfStats) == 0) {\r
+    Private->ReceivedPackets += BpfStats.bs_recv;\r
+    if (BpfStats.bs_drop > Private->DroppedPackets) {\r
+      printf (\r
+        "SNP: STATS: RCVD = %d DROPPED = %d.  Probably need to increase BPF PcdNetworkPacketFilterSize?\n",\r
+        BpfStats.bs_recv,\r
+        BpfStats.bs_drop - Private->DroppedPackets\r
+        );\r
+      Private->DroppedPackets = BpfStats.bs_drop;\r
+    }\r
+  }\r
 \r
   //\r
   // Do we have any remaining packets from the previous read?\r
@@ -1004,7 +1004,7 @@ GetInterfaceMacAddr (
   EMU_SNP_PRIVATE    *Private\r
   )\r
 {\r
-       EFI_STATUS                                Status;\r
+  EFI_STATUS          Status;\r
   struct ifaddrs      *IfAddrs;\r
   struct ifaddrs      *If;\r
   struct sockaddr_dl  *IfSdl;\r
index fa05fbc107d1c5e699cd34ab464a940b7afd229a..3b87a9e5b11dbb6d74d8040d89e72e3926287e9b 100644 (file)
@@ -347,7 +347,7 @@ EmuBlockIoReadWriteCommon (
   @param[in]       MediaId    Id of the media, changes every time the media is\r
                               replaced.\r
   @param[in]       Lba        The starting Logical Block Address to read from.\r
-  @param[in, out]  Token           A pointer to the token associated with the transaction.\r
+  @param[in, out]  Token      A pointer to the token associated with the transaction.\r
   @param[in]       BufferSize Size of Buffer, must be a multiple of device block size.\r
   @param[out]      Buffer     A pointer to the destination buffer for the data. The\r
                               caller is responsible for either having implicit or\r
index a7b12b14e5da290755665f17d64dde1a60a558e1..1a2037f931de8ecb91e105e77b1bf2408e8ea2cc 100644 (file)
-/*++ @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\r
+  Since the SEC is the only program in our emulation we\r
+  must use a UEFI/PI mechanism to export APIs to other modules.\r
+  This is the role of the EFI_EMU_THUNK_PROTOCOL.\r
+\r
+  The mUnixThunkTable exists so that a change to EFI_EMU_THUNK_PROTOCOL\r
+  will cause an error in initializing the array if all the member functions\r
+  are not added. It looks like adding a element to end and not initializing\r
+  it may cause the table to be initaliized with the members at the end being\r
+  set to zero. This is bad as jumping to zero will crash.\r
+\r
+Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR>\r
+Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "Host.h"\r
+\r
+#ifdef __APPLE__\r
+#define DebugAssert _Mangle__DebugAssert\r
+\r
+#include <assert.h>\r
+#include <CoreServices/CoreServices.h>\r
+#include <mach/mach.h>\r
+#include <mach/mach_time.h>\r
+\r
+#undef DebugAssert\r
+#endif\r
+\r
+int settimer_initialized;\r
+struct timeval settimer_timeval;\r
+void (*settimer_callback)(UINT64 delta);\r
+\r
+BOOLEAN gEmulatorInterruptEnabled = FALSE;\r
+\r
+\r
+UINTN\r
+SecWriteStdErr (\r
+  IN UINT8     *Buffer,\r
+  IN UINTN     NumberOfBytes\r
+  )\r
+{\r
+  ssize_t Return;\r
+\r
+  Return = write (STDERR_FILENO, (const void *)Buffer, (size_t)NumberOfBytes);\r
+\r
+  return (Return == -1) ? 0 : Return;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+SecConfigStdIn (\r
+  VOID\r
+  )\r
+{\r
+  struct termios tty;\r
+\r
+  //\r
+  // Need to turn off line buffering, ECHO, and make it unbuffered.\r
+  //\r
+  tcgetattr (STDIN_FILENO, &tty);\r
+  tty.c_lflag &= ~(ICANON | ECHO);\r
+  tcsetattr (STDIN_FILENO, TCSANOW, &tty);\r
+\r
+//  setvbuf (STDIN_FILENO, NULL, _IONBF, 0);\r
+\r
+  // now ioctl FIONREAD will do what we need\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+UINTN\r
+SecWriteStdOut (\r
+  IN UINT8     *Buffer,\r
+  IN UINTN     NumberOfBytes\r
+  )\r
+{\r
+  ssize_t Return;\r
+\r
+  Return = write (STDOUT_FILENO, (const void *)Buffer, (size_t)NumberOfBytes);\r
+\r
+  return (Return == -1) ? 0 : Return;\r
+}\r
+\r
+UINTN\r
+SecReadStdIn (\r
+  IN UINT8     *Buffer,\r
+  IN UINTN     NumberOfBytes\r
+  )\r
+{\r
+  ssize_t Return;\r
+\r
+  Return = read (STDIN_FILENO, Buffer, (size_t)NumberOfBytes);\r
+\r
+  return (Return == -1) ? 0 : Return;\r
+}\r
+\r
+BOOLEAN\r
+SecPollStdIn (\r
+  VOID\r
+  )\r
+{\r
+  int Result;\r
+  int Bytes;\r
+\r
+  Result = ioctl (STDIN_FILENO, FIONREAD, &Bytes);\r
+  if (Result == -1) {\r
+    return FALSE;\r
+  }\r
+\r
+  return (BOOLEAN)(Bytes > 0);\r
+}\r
+\r
+\r
+VOID *\r
+SecMalloc (\r
+  IN  UINTN Size\r
+  )\r
+{\r
+  return malloc ((size_t)Size);\r
+}\r
+\r
+VOID *\r
+SecValloc (\r
+  IN  UINTN Size\r
+  )\r
+{\r
+  return valloc ((size_t)Size);\r
+}\r
+\r
+BOOLEAN\r
+SecFree (\r
+  IN  VOID *Ptr\r
+  )\r
+{\r
+  if (EfiSystemMemoryRange (Ptr)) {\r
+    // If an address range is in the EFI memory map it was alloced via EFI.\r
+    // So don't free those ranges and let the caller know.\r
+    return FALSE;\r
+  }\r
+\r
+  free (Ptr);\r
+  return TRUE;\r
+}\r
+\r
+\r
+void\r
+settimer_handler (int sig)\r
+{\r
+  struct timeval timeval;\r
+  UINT64 delta;\r
+\r
+  gettimeofday (&timeval, NULL);\r
+  delta = ((UINT64)timeval.tv_sec * 1000) + (timeval.tv_usec / 1000)\r
+    - ((UINT64)settimer_timeval.tv_sec * 1000)\r
+    - (settimer_timeval.tv_usec / 1000);\r
+  settimer_timeval = timeval;\r
+\r
+  if (settimer_callback) {\r
+    ReverseGasketUint64 (settimer_callback, delta);\r
+  }\r
+}\r
+\r
+VOID\r
+SecSetTimer (\r
+  IN  UINT64                  PeriodMs,\r
+  IN  EMU_SET_TIMER_CALLBACK  CallBack\r
+  )\r
+{\r
+  struct itimerval timerval;\r
+  UINT32 remainder;\r
+\r
+  if (!settimer_initialized) {\r
+    struct sigaction act;\r
+\r
+    settimer_initialized = 1;\r
+    act.sa_handler = settimer_handler;\r
+    act.sa_flags = 0;\r
+    sigemptyset (&act.sa_mask);\r
+    gEmulatorInterruptEnabled = TRUE;\r
+    if (sigaction (SIGALRM, &act, NULL) != 0) {\r
+      printf ("SetTimer: sigaction error %s\n", strerror (errno));\r
+    }\r
+    if (gettimeofday (&settimer_timeval, NULL) != 0) {\r
+      printf ("SetTimer: gettimeofday error %s\n", strerror (errno));\r
+    }\r
+  }\r
+  timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);\r
+  DivU64x32Remainder(PeriodMs, 1000, &remainder);\r
+  timerval.it_value.tv_usec = remainder * 1000;\r
+  timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);\r
+  timerval.it_interval = timerval.it_value;\r
+\r
+  if (setitimer (ITIMER_REAL, &timerval, NULL) != 0) {\r
+    printf ("SetTimer: setitimer error %s\n", strerror (errno));\r
+  }\r
+  settimer_callback = CallBack;\r
+}\r
+\r
+\r
+VOID\r
+SecEnableInterrupt (\r
+  VOID\r
+  )\r
+{\r
+  sigset_t  sigset;\r
+\r
+  gEmulatorInterruptEnabled = TRUE;\r
+  // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts\r
+  // by enabling/disabling SIGALRM.\r
+  sigemptyset (&sigset);\r
+  sigaddset (&sigset, SIGALRM);\r
+  pthread_sigmask (SIG_UNBLOCK, &sigset, NULL);\r
+}\r
+\r
+\r
+VOID\r
+SecDisableInterrupt (\r
+  VOID\r
+  )\r
+{\r
+  sigset_t  sigset;\r
+\r
+  // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts\r
+  // by enabling/disabling SIGALRM.\r
+  sigemptyset (&sigset);\r
+  sigaddset (&sigset, SIGALRM);\r
+  pthread_sigmask (SIG_BLOCK, &sigset, NULL);\r
+  gEmulatorInterruptEnabled = FALSE;\r
+}\r
+\r
+\r
+BOOLEAN\r
+SecInterruptEanbled (void)\r
+{\r
+  return gEmulatorInterruptEnabled;\r
+}\r
+\r
+\r
+UINT64\r
+QueryPerformanceFrequency (\r
+  VOID\r
+  )\r
+{\r
+  // Hard code to nanoseconds\r
+  return 1000000000ULL;\r
+}\r
+\r
+UINT64\r
+QueryPerformanceCounter (\r
+  VOID\r
+  )\r
+{\r
+#if __APPLE__\r
+  UINT64          Start;\r
+  static mach_timebase_info_data_t    sTimebaseInfo;\r
+\r
+\r
+  Start = mach_absolute_time ();\r
+\r
+  // Convert to nanoseconds.\r
+\r
+  // If this is the first time we've run, get the timebase.\r
+  // We can use denom == 0 to indicate that sTimebaseInfo is\r
+  // uninitialised because it makes no sense to have a zero\r
+  // denominator is a fraction.\r
+\r
+  if ( sTimebaseInfo.denom == 0 ) {\r
+      (void) mach_timebase_info(&sTimebaseInfo);\r
+  }\r
+\r
+  // Do the maths. We hope that the multiplication doesn't\r
+  // overflow; the price you pay for working in fixed point.\r
+\r
+  return (Start * sTimebaseInfo.numer) / sTimebaseInfo.denom;\r
+#else\r
+  // Need to figure out what to do for Linux?\r
+  return 0;\r
+#endif\r
+}\r
+\r
+\r
+\r
+VOID\r
+SecSleep (\r
+  IN  UINT64 Nanoseconds\r
+  )\r
+{\r
+  struct timespec rq, rm;\r
+  struct timeval  start, end;\r
+  unsigned long  MicroSec;\r
+\r
+  rq.tv_sec  = DivU64x32 (Nanoseconds, 1000000000);\r
+  rq.tv_nsec = ModU64x32 (Nanoseconds, 1000000000);\r
+\r
+  //\r
+  // nanosleep gets interrupted by our timer tic.\r
+  // we need to track wall clock time or we will stall for way too long\r
+  //\r
+  gettimeofday (&start, NULL);\r
+  end.tv_sec  = start.tv_sec + rq.tv_sec;\r
+  MicroSec = (start.tv_usec + rq.tv_nsec/1000);\r
+  end.tv_usec = MicroSec % 1000000;\r
+  if (MicroSec > 1000000) {\r
+    end.tv_sec++;\r
+  }\r
+\r
+  while (nanosleep (&rq, &rm) == -1) {\r
+    if (errno != EINTR) {\r
+      break;\r
+    }\r
+    gettimeofday (&start, NULL);\r
+    if (start.tv_sec > end.tv_sec) {\r
+      break;\r
+    } if ((start.tv_sec == end.tv_sec) && (start.tv_usec > end.tv_usec)) {\r
+      break;\r
+    }\r
+    rq = rm;\r
+  }\r
+}\r
+\r
+\r
+VOID\r
+SecCpuSleep (\r
+  VOID\r
+  )\r
+{\r
+  struct timespec rq, rm;\r
+\r
+  // nanosleep gets interrupted by the timer tic\r
+  rq.tv_sec  = 1;\r
+  rq.tv_nsec = 0;\r
+\r
+  nanosleep (&rq, &rm);\r
+}\r
+\r
+\r
+VOID\r
+SecExit (\r
+  UINTN   Status\r
+  )\r
+{\r
+  exit (Status);\r
+}\r
+\r
+\r
+VOID\r
+SecGetTime (\r
+  OUT  EFI_TIME               *Time,\r
+  OUT EFI_TIME_CAPABILITIES   *Capabilities OPTIONAL\r
+  )\r
+{\r
+  struct tm *tm;\r
+  time_t t;\r
+\r
+  t = time (NULL);\r
+  tm = localtime (&t);\r
+\r
+  Time->Year = 1900 + tm->tm_year;\r
+  Time->Month = tm->tm_mon + 1;\r
+  Time->Day = tm->tm_mday;\r
+  Time->Hour = tm->tm_hour;\r
+  Time->Minute = tm->tm_min;\r
+  Time->Second = tm->tm_sec;\r
+  Time->Nanosecond = 0;\r
+  Time->TimeZone = timezone;\r
+  Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0)\r
+    | (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);\r
+\r
+  if (Capabilities != NULL) {\r
+    Capabilities->Resolution  = 1;\r
+    Capabilities->Accuracy    = 50000000;\r
+    Capabilities->SetsToZero  = FALSE;\r
+  }\r
+}\r
+\r
+\r
+\r
+VOID\r
+SecSetTime (\r
+  IN  EFI_TIME               *Time\r
+  )\r
+{\r
+  // Don't change the time on the system\r
+  // We could save delta to localtime() and have SecGetTime adjust return values?\r
+  return;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+SecGetNextProtocol (\r
+  IN  BOOLEAN                 EmuBusDriver,\r
+  OUT EMU_IO_THUNK_PROTOCOL   **Instance   OPTIONAL\r
+  )\r
+{\r
+  return GetNextThunkProtocol (EmuBusDriver, Instance);\r
+}\r
+\r
+\r
+EMU_THUNK_PROTOCOL gEmuThunkProtocol = {\r
+  GasketSecWriteStdErr,\r
+  GasketSecConfigStdIn,\r
+  GasketSecWriteStdOut,\r
+  GasketSecReadStdIn,\r
+  GasketSecPollStdIn,\r
+  GasketSecMalloc,\r
+  GasketSecValloc,\r
+  GasketSecFree,\r
+  GasketSecPeCoffGetEntryPoint,\r
+  GasketSecPeCoffRelocateImageExtraAction,\r
+  GasketSecPeCoffUnloadImageExtraAction,\r
+  GasketSecEnableInterrupt,\r
+  GasketSecDisableInterrupt,\r
+  GasketQueryPerformanceFrequency,\r
+  GasketQueryPerformanceCounter,\r
+  GasketSecSleep,\r
+  GasketSecCpuSleep,\r
+  GasketSecExit,\r
+  GasketSecGetTime,\r
+  GasketSecSetTime,\r
+  GasketSecSetTimer,\r
+  GasketSecGetNextProtocol\r
+};\r
+\r
+\r
+VOID\r
+SecInitThunkProtocol (\r
+  VOID\r
+  )\r
+{\r
+  // timezone and daylight lib globals depend on tzset be called 1st.\r
+  tzset ();\r
+}\r
+\r
index f84b22f576a2d35d7b685c792ad85d77a018b5fa..9aba7c854df978ec488fb83453980cc862e4574b 100644 (file)
@@ -1148,7 +1148,7 @@ GdbScriptAddImage (
 \r
   if (ImageContext->PdbPointer != NULL && !IsPdbFile (ImageContext->PdbPointer)) {\r
     FILE  *GdbTempFile;\r
-    if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {    \r
+    if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {\r
       GdbTempFile = fopen (gGdbWorkingFileName, "a");\r
       if (GdbTempFile != NULL) {\r
         long unsigned int SymbolsAddr = (long unsigned int)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders);\r
@@ -1170,13 +1170,13 @@ GdbScriptAddImage (
       GdbTempFile = fopen (gGdbWorkingFileName, "w");\r
       if (GdbTempFile != NULL) {\r
         fprintf (\r
-          GdbTempFile, \r
-          "add-symbol-file %s 0x%08lx\n", \r
-          ImageContext->PdbPointer, \r
+          GdbTempFile,\r
+          "add-symbol-file %s 0x%08lx\n",\r
+          ImageContext->PdbPointer,\r
           (long unsigned int)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders)\r
           );\r
         fclose (GdbTempFile);\r
-  \r
+\r
         //\r
         // Target for gdb breakpoint in a script that uses gGdbWorkingFileName to set a breakpoint.\r
         // Hey what can you say scripting in gdb is not that great....\r
@@ -1225,7 +1225,7 @@ GdbScriptRemoveImage (
     return;\r
   }\r
 \r
-  if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {    \r
+  if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {\r
     //\r
     // Write the file we need for the gdb script\r
     //\r
@@ -1256,7 +1256,7 @@ GdbScriptRemoveImage (
       SecGdbScriptBreak (ImageContext->PdbPointer, strlen (ImageContext->PdbPointer) + 1, 0, 0);\r
     } else {\r
       ASSERT (FALSE);\r
-    }  \r
+    }\r
   }\r
 }\r
 \r
index 66c7c8df125b27ae92e29b65c936831a0bef1bdd..f7db46cdcd8dd0587d4783d3e27083fdac70c3fb 100644 (file)
@@ -82,7 +82,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #undef NTOHS\r
 #undef HTONS\r
 #undef B0\r
-#undef CR3
+#undef CR3\r
 \r
 #include <PiPei.h>\r
 #include <Uefi.h>\r
index aa90ea80958dad650512d69fa588a414959c606f..5664cc54b40bb26662b5ddc6f6d2e766b0e4738a 100644 (file)
-#------------------------------------------------------------------------------
-#
-# 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
-
-
+#------------------------------------------------------------------------------\r
+#\r
+# Manage differenced between UNIX ABI and EFI/Windows ABI\r
+#\r
+# For IA-32 the only difference is Mac OS X requires a 16-byte aligned stack.\r
+# For Linux this stack adjustment is a no-op, but we may as well make the\r
+# the code common.\r
+#\r
+# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+#------------------------------------------------------------------------------\r
+\r
+\r
+\r
+  .text\r
+\r
+//\r
+// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)\r
+//\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)\r
+ASM_PFX(GasketSecWriteStdErr):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call  ASM_PFX(SecWriteStdErr)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)\r
+ASM_PFX(GasketSecConfigStdIn):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call  ASM_PFX(SecConfigStdIn)\r
+\r
+  leave\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)\r
+ASM_PFX(GasketSecWriteStdOut):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call  ASM_PFX(SecWriteStdOut)\r
+\r
+  leave\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)\r
+ASM_PFX(GasketSecReadStdIn):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call  ASM_PFX(SecReadStdIn)\r
+\r
+  leave\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)\r
+ASM_PFX(GasketSecPollStdIn):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call  ASM_PFX(SecPollStdIn)\r
+\r
+  leave\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecMalloc)\r
+ASM_PFX(GasketSecMalloc):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(SecMalloc)\r
+\r
+  leave\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecValloc)\r
+ASM_PFX(GasketSecValloc):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(SecValloc)\r
+\r
+  leave\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecFree)\r
+ASM_PFX(GasketSecFree):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(SecFree)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecSetTimer)\r
+ASM_PFX(GasketSecSetTimer):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $40, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  12(%ebp), %edx\r
+  movl  %edx, 4(%esp)\r
+  movl  %eax, (%esp)\r
+\r
+  call  ASM_PFX(SecSetTimer)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)\r
+ASM_PFX(GasketSecEnableInterrupt):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+\r
+  call    ASM_PFX(SecEnableInterrupt)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)\r
+ASM_PFX(GasketSecDisableInterrupt):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+\r
+  call    ASM_PFX(SecDisableInterrupt)\r
+\r
+  leave\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)\r
+ASM_PFX(GasketQueryPerformanceFrequency):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+\r
+  call    ASM_PFX(QueryPerformanceFrequency)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)\r
+ASM_PFX(GasketQueryPerformanceCounter):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+\r
+  call    ASM_PFX(QueryPerformanceCounter)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecSleep)\r
+ASM_PFX(GasketSecSleep):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  12(%ebp), %ecx\r
+  movl  %ecx, 4(%esp)\r
+  movl  %eax, (%esp)\r
+\r
+  call  ASM_PFX(SecSleep)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)\r
+ASM_PFX(GasketSecCpuSleep):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+\r
+  call  ASM_PFX(SecCpuSleep)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecExit)\r
+ASM_PFX(GasketSecExit):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(SecExit)     // Less to do as we will never return to EFI ABI world\r
+LDEAD_LOOP:\r
+  jmp  LDEAD_LOOP              // _exit should never return\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecGetTime)\r
+ASM_PFX(GasketSecGetTime):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call  ASM_PFX(SecGetTime)\r
+\r
+  leave\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecSetTime)\r
+ASM_PFX(GasketSecSetTime):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call  ASM_PFX(SecSetTime)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)\r
+ASM_PFX(GasketSecGetNextProtocol):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $40, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  20(%ebp), %eax\r
+  movl  %eax, 12(%esp)\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(SecGetNextProtocol)\r
+\r
+  leave\r
+  ret\r
+\r
+// PPIs produced by SEC\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)\r
+ASM_PFX(GasketSecPeCoffGetEntryPoint):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(SecPeCoffGetEntryPoint)\r
+\r
+  leave\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)\r
+ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(SecPeCoffRelocateImageExtraAction)\r
+\r
+  leave\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)\r
+ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(SecPeCoffUnloadImageExtraAction)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)\r
+ASM_PFX(GasketSecEmuThunkAddress):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+\r
+  call    ASM_PFX(SecEmuThunkAddress)\r
+\r
+  leave\r
+  ret\r
+\r
+//\r
+// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL\r
+//\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11Size)\r
+ASM_PFX(GasketX11Size):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $40, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  20(%ebp), %eax\r
+  movl  %eax, 12(%esp)\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(X11Size)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11CheckKey)\r
+ASM_PFX(GasketX11CheckKey):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(X11CheckKey)\r
+\r
+  leave\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11GetKey)\r
+ASM_PFX(GasketX11GetKey):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(X11GetKey)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11KeySetState)\r
+ASM_PFX(GasketX11KeySetState):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(X11KeySetState)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)\r
+ASM_PFX(GasketX11RegisterKeyNotify):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $40, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  20(%ebp), %eax\r
+  movl  %eax, 12(%esp)\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(X11RegisterKeyNotify)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11Blt)\r
+ASM_PFX(GasketX11Blt):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $40, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  20(%ebp), %eax\r
+  movl  %eax, 12(%esp)\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(X11Blt)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)\r
+ASM_PFX(GasketX11CheckPointer):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(X11CheckPointer)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)\r
+ASM_PFX(GasketX11GetPointerState):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(X11GetPointerState)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)\r
+ASM_PFX(GasketX11GraphicsWindowOpen):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(X11GraphicsWindowOpen)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)\r
+ASM_PFX(GasketX11GraphicsWindowClose):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(X11GraphicsWindowClose)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+// Pthreads\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)\r
+ASM_PFX(GasketPthreadMutexLock):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(PthreadMutexLock)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)\r
+ASM_PFX(GasketPthreadMutexUnLock):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(PthreadMutexUnLock)\r
+\r
+  leave\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)\r
+ASM_PFX(GasketPthreadMutexTryLock):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(PthreadMutexTryLock)\r
+\r
+  leave\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)\r
+ASM_PFX(GasketPthreadMutexInit):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+\r
+  call    ASM_PFX(PthreadMutexInit)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)\r
+ASM_PFX(GasketPthreadMutexDestroy):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(PthreadMutexDestroy)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadCreate)\r
+ASM_PFX(GasketPthreadCreate):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $40, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  20(%ebp), %eax\r
+  movl  %eax, 12(%esp)\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(PthreadCreate)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadExit)\r
+ASM_PFX(GasketPthreadExit):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(PthreadExit)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadSelf)\r
+ASM_PFX(GasketPthreadSelf):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+\r
+  call    ASM_PFX(PthreadSelf)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadOpen)\r
+ASM_PFX(GasketPthreadOpen):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(PthreadOpen)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadClose)\r
+ASM_PFX(GasketPthreadClose):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(PthreadClose)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+\r
+\r
+//\r
+// UNIX ABI to EFI ABI call\r
+//\r
+// UINTN\r
+// ReverseGasketUint64 (\r
+//   void *Api,\r
+//   UINTN Arg1\r
+//   );\r
+ASM_GLOBAL ASM_PFX(ReverseGasketUint64)\r
+ASM_PFX(ReverseGasketUint64):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $8, %esp\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+  calll  *8(%ebp)\r
+  addl  $8, %esp\r
+  popl  %ebp\r
+  ret\r
+\r
+\r
+\r
+//\r
+// UNIX ABI to EFI ABI call\r
+//\r
+// UINTN\r
+// ReverseGasketUint64Uint64 (\r
+//   void *Api,\r
+//   UINTN Arg1\r
+//   UINTN Arg2\r
+//   );\r
+ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)\r
+ASM_PFX(ReverseGasketUint64Uint64):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp\r
+  movl  24(%ebp), %eax\r
+  movl  %eax, 12(%esp)\r
+  movl  20(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+  calll  *8(%ebp)\r
+  addl  $24, %esp\r
+  popl  %ebp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)\r
+ASM_PFX(GasketSecUnixPeiAutoScan):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $40, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(SecUnixPeiAutoScan)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)\r
+ASM_PFX(GasketSecUnixFdAddress):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $40, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  20(%ebp), %eax\r
+  movl  %eax, 12(%esp)\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(SecUnixFdAddress)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+// EmuIoThunk SimpleFileSystem\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)\r
+ASM_PFX(GasketPosixOpenVolume):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $40, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  20(%ebp), %eax\r
+  movl  %eax, 12(%esp)\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(PosixOpenVolume)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)\r
+ASM_PFX(GasketPosixFileOpen):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $56, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  28(%ebp), %eax\r
+  movl  32(%ebp), %ecx\r
+  movl  %ecx, 24(%esp)\r
+  movl  %eax, 20(%esp)\r
+  movl  20(%ebp), %eax\r
+  movl  24(%ebp), %ecx\r
+  movl  %ecx, 16(%esp)\r
+  movl  %eax, 12(%esp)\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(PosixFileOpen)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)\r
+ASM_PFX(GasketPosixFileCLose):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(PosixFileCLose)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)\r
+ASM_PFX(GasketPosixFileDelete):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(PosixFileDelete)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileRead)\r
+ASM_PFX(GasketPosixFileRead):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $40, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(PosixFileRead)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)\r
+ASM_PFX(GasketPosixFileWrite):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $40, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(PosixFileWrite)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)\r
+ASM_PFX(GasketPosixFileSetPossition):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $40, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  12(%ebp), %eax\r
+  movl  16(%ebp), %ecx\r
+  movl  %ecx, 8(%esp)\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(PosixFileSetPossition)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)\r
+ASM_PFX(GasketPosixFileGetPossition):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(PosixFileGetPossition)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)\r
+ASM_PFX(GasketPosixFileGetInfo):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $40, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  20(%ebp), %eax\r
+  movl  %eax, 12(%esp)\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(PosixFileGetInfo)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)\r
+ASM_PFX(GasketPosixFileSetInfo):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $40, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  20(%ebp), %eax\r
+  movl  %eax, 12(%esp)\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(PosixFileSetInfo)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)\r
+ASM_PFX(GasketPosixFileFlush):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(PosixFileFlush)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)\r
+ASM_PFX(GasketPosixFileSystmeThunkOpen):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(PosixFileSystmeThunkOpen)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)\r
+ASM_PFX(GasketPosixFileSystmeThunkClose):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(PosixFileSystmeThunkClose)\r
+\r
+  leave\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)\r
+ASM_PFX(GasketEmuBlockIoReset):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(EmuBlockIoReset)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)\r
+ASM_PFX(GasketEmuBlockIoReadBlocks):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $56, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  32(%ebp), %eax\r
+  movl  %eax, 24(%esp)\r
+  movl  28(%ebp), %eax\r
+  movl  %eax, 20(%esp)\r
+  movl  24(%ebp), %eax\r
+  movl  %eax, 16(%esp)\r
+  movl  16(%ebp), %eax\r
+  movl  20(%ebp), %edx\r
+  movl  %edx, 12(%esp)\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(EmuBlockIoReadBlocks)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)\r
+ASM_PFX(GasketEmuBlockIoWriteBlocks):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $56, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  32(%ebp), %eax\r
+  movl  %eax, 24(%esp)\r
+  movl  28(%ebp), %eax\r
+  movl  %eax, 20(%esp)\r
+  movl  24(%ebp), %eax\r
+  movl  %eax, 16(%esp)\r
+  movl  16(%ebp), %eax\r
+  movl  20(%ebp), %edx\r
+  movl  %edx, 12(%esp)\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(EmuBlockIoWriteBlocks)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)\r
+ASM_PFX(GasketEmuBlockIoFlushBlocks):  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+\r
+  call    ASM_PFX(EmuBlockIoFlushBlocks)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)\r
+ASM_PFX(GasketEmuBlockIoCreateMapping):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(EmuBlockIoCreateMapping)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)\r
+ASM_PFX(GasketBlockIoThunkOpen):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(EmuBlockIoThunkOpen)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)\r
+ASM_PFX(GasketBlockIoThunkClose):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(EmuBlockIoThunkClose)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)\r
+ASM_PFX(GasketSnpCreateMapping):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(EmuSnpCreateMapping)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpStart)\r
+ASM_PFX(GasketSnpStart):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(EmuSnpStart)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpStop)\r
+ASM_PFX(GasketSnpStop):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(EmuSnpStop)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpInitialize)\r
+ASM_PFX(GasketSnpInitialize):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $40, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(EmuSnpInitialize)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpReset)\r
+ASM_PFX(GasketSnpReset):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(EmuSnpReset)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpShutdown)\r
+ASM_PFX(GasketSnpShutdown):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(EmuSnpShutdown)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)\r
+ASM_PFX(GasketSnpReceiveFilters):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $40, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  28(%ebp), %eax\r
+  movl  %eax, 20(%esp)\r
+  movl  24(%ebp), %eax\r
+  movl  %eax, 16(%esp)\r
+  movl  20(%ebp), %eax\r
+  movl  %eax, 12(%esp)\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(EmuSnpReceiveFilters)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)\r
+ASM_PFX(GasketSnpStationAddress):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $40, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpStatistics)\r
+ASM_PFX(GasketSnpStatistics):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $40, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  20(%ebp), %eax\r
+  movl  %eax, 12(%esp)\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(EmuSnpStatistics)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)\r
+ASM_PFX(GasketSnpMCastIpToMac):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $40, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  20(%ebp), %eax\r
+  movl  %eax, 12(%esp)\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(EmuSnpMCastIpToMac)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpNvData)\r
+ASM_PFX(GasketSnpNvData):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $40, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  24(%ebp), %eax\r
+  movl  %eax, 16(%esp)\r
+  movl  20(%ebp), %eax\r
+  movl  %eax, 12(%esp)\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(EmuSnpNvData)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)\r
+ASM_PFX(GasketSnpGetStatus):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $40, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(EmuSnpGetStatus)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpTransmit)\r
+ASM_PFX(GasketSnpTransmit):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $56, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  32(%ebp), %eax\r
+  movl  %eax, 24(%esp)\r
+  movl  28(%ebp), %eax\r
+  movl  %eax, 20(%esp)\r
+  movl  24(%ebp), %eax\r
+  movl  %eax, 16(%esp)\r
+  movl  20(%ebp), %eax\r
+  movl  %eax, 12(%esp)\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(EmuSnpTransmit)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpReceive)\r
+ASM_PFX(GasketSnpReceive):\r
+  pushl  %ebp\r
+  movl  %esp, %ebp\r
+  subl  $56, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  32(%ebp), %eax\r
+  movl  %eax, 24(%esp)\r
+  movl  28(%ebp), %eax\r
+  movl  %eax, 20(%esp)\r
+  movl  24(%ebp), %eax\r
+  movl  %eax, 16(%esp)\r
+  movl  20(%ebp), %eax\r
+  movl  %eax, 12(%esp)\r
+  movl  16(%ebp), %eax\r
+  movl  %eax, 8(%esp)\r
+  movl  12(%ebp), %eax\r
+  movl  %eax, 4(%esp)\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(EmuSnpReceive)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)\r
+ASM_PFX(GasketSnpThunkOpen):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(EmuSnpThunkOpen)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)\r
+ASM_PFX(GasketSnpThunkClose):\r
+  pushl %ebp\r
+  movl  %esp, %ebp\r
+  subl  $24, %esp      // sub extra 16 from the stack for alignment\r
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call\r
+  movl  8(%ebp), %eax\r
+  movl  %eax, (%esp)\r
+\r
+  call    ASM_PFX(EmuSnpThunkClose)\r
+\r
+  leave\r
+  ret\r
+\r
+\r
index 118083f4b52349d2938f03a9eb65e082af224f67..79baeaf1f2b5204cfd34d329867360b11883a000 100644 (file)
@@ -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);
-}
-
-
-
+/*++\r
+\r
+Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>\r
+Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+\r
+--*/\r
+\r
+#include "Host.h"\r
+\r
+\r
+/**\r
+  Transfers control to a function starting with a new stack.\r
+\r
+  Transfers control to the function specified by EntryPoint using the new stack\r
+  specified by NewStack and passing in the parameters specified by Context1 and\r
+  Context2. Context1 and Context2 are optional and may be NULL. The function\r
+  EntryPoint must never return.\r
+\r
+  If EntryPoint is NULL, then ASSERT().\r
+  If NewStack is NULL, then ASSERT().\r
+\r
+  @param  EntryPoint  A pointer to function to call with the new stack.\r
+  @param  Context1    A pointer to the context to pass into the EntryPoint\r
+                      function.\r
+  @param  Context2    A pointer to the context to pass into the EntryPoint\r
+                      function.\r
+  @param  NewStack    A pointer to the new stack to use for the EntryPoint\r
+                      function.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+PeiSwitchStacks (\r
+  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,\r
+  IN      VOID                      *Context1,  OPTIONAL\r
+  IN      VOID                      *Context2,  OPTIONAL\r
+  IN      VOID                      *NewStack\r
+  )\r
+{\r
+  BASE_LIBRARY_JUMP_BUFFER  JumpBuffer;\r
+\r
+  ASSERT (EntryPoint != NULL);\r
+  ASSERT (NewStack != NULL);\r
+\r
+  //\r
+  // Stack should be aligned with CPU_STACK_ALIGNMENT\r
+  //\r
+  ASSERT (((UINTN)NewStack & (CPU_STACK_ALIGNMENT - 1)) == 0);\r
+\r
+  JumpBuffer.Eip = (UINTN)EntryPoint;\r
+  JumpBuffer.Esp = (UINTN)NewStack - sizeof (VOID*);\r
+  JumpBuffer.Esp -= sizeof (Context1) + sizeof (Context2);\r
+  ((VOID**)JumpBuffer.Esp)[1] = Context1;\r
+  ((VOID**)JumpBuffer.Esp)[2] = Context2;\r
+\r
+  LongJump (&JumpBuffer, (UINTN)-1);\r
+\r
+\r
+  //\r
+  // PeiSwitchStacks () will never return\r
+  //\r
+  ASSERT (FALSE);\r
+}\r
+\r
+\r
+\r
index 9db91b83d9a49ba2928b719780909ec7942ed161..df39358e2aabf3ae532c1ec2b374bdabb75cef89 100644 (file)
-/*++ @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\r
+\r
+  Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+\r
+  This program and the accompanying materials\r
+  are licensed and made available under the terms and conditions of the BSD License\r
+  which accompanies this distribution.  The full text of the license may be found at\r
+  http://opensource.org/licenses/bsd-license.php\r
+\r
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "Base.h"\r
+#include "Library/BaseMemoryLib.h"\r
+#include "Library/MemoryAllocationLib.h"\r
+\r
+#include <stdlib.h>\r
+\r
+/**\r
+  Allocates a buffer of type EfiBootServicesData.\r
+\r
+  Allocates the number bytes specified by AllocationSize of type EfiBootServicesData and returns a\r
+  pointer to the allocated buffer.  If AllocationSize is 0, then a valid buffer of 0 size is\r
+  returned.  If there is not enough memory remaining to satisfy the request, then NULL is returned.\r
+\r
+  @param  AllocationSize        The number of bytes to allocate.\r
+\r
+  @return A pointer to the allocated buffer or NULL if allocation fails.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+AllocatePool (\r
+  IN UINTN  AllocationSize\r
+  )\r
+{\r
+  return (VOID*) malloc (AllocationSize);\r
+}\r
+\r
+\r
+/**\r
+  Allocates and zeros a buffer of type EfiBootServicesData.\r
+\r
+  Allocates the number bytes specified by AllocationSize of type EfiBootServicesData, clears the\r
+  buffer with zeros, and returns a pointer to the allocated buffer.  If AllocationSize is 0, then a\r
+  valid buffer of 0 size is returned.  If there is not enough memory remaining to satisfy the\r
+  request, then NULL is returned.\r
+\r
+  @param  AllocationSize        The number of bytes to allocate and zero.\r
+\r
+  @return A pointer to the allocated buffer or NULL if allocation fails.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+AllocateZeroPool (\r
+  IN UINTN  AllocationSize\r
+  )\r
+{\r
+  VOID *Buffer;\r
+\r
+  Buffer = AllocatePool (AllocationSize);\r
+  if (Buffer == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  ZeroMem (Buffer, AllocationSize);\r
+\r
+  return Buffer;\r
+}\r
+\r
+\r
+/**\r
+  Reallocates a buffer of type EfiBootServicesData.\r
+\r
+  Allocates and zeros the number bytes specified by NewSize from memory of type\r
+  EfiBootServicesData.  If OldBuffer is not NULL, then the smaller of OldSize and\r
+  NewSize bytes are copied from OldBuffer to the newly allocated buffer, and\r
+  OldBuffer is freed.  A pointer to the newly allocated buffer is returned.\r
+  If NewSize is 0, then a valid buffer of 0 size is  returned.  If there is not\r
+  enough memory remaining to satisfy the request, then NULL is returned.\r
+\r
+  If the allocation of the new buffer is successful and the smaller of NewSize and OldSize\r
+  is greater than (MAX_ADDRESS - OldBuffer + 1), then ASSERT().\r
+\r
+  @param  OldSize        The size, in bytes, of OldBuffer.\r
+  @param  NewSize        The size, in bytes, of the buffer to reallocate.\r
+  @param  OldBuffer      The buffer to copy to the allocated buffer.  This is an optional\r
+                         parameter that may be NULL.\r
+\r
+  @return A pointer to the allocated buffer or NULL if allocation fails.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+ReallocatePool (\r
+  IN UINTN  OldSize,\r
+  IN UINTN  NewSize,\r
+  IN VOID   *OldBuffer  OPTIONAL\r
+  )\r
+{\r
+  VOID *NewBuffer;\r
+\r
+  NewBuffer = AllocatePool (NewSize);\r
+  if (NewBuffer == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  if (OldBuffer != NULL) {\r
+    if (OldSize > 0) {\r
+      CopyMem (NewBuffer, OldBuffer, OldSize);\r
+    }\r
+\r
+    FreePool (OldBuffer);\r
+  }\r
+\r
+  return NewBuffer;\r
+}\r
+\r
+\r
+/**\r
+  Frees a buffer that was previously allocated with one of the pool allocation functions in the\r
+  Memory Allocation Library.\r
+\r
+  Frees the buffer specified by Buffer.  Buffer must have been allocated on a previous call to the\r
+  pool allocation services of the Memory Allocation Library.  If it is not possible to free pool\r
+  resources, then this function will perform no actions.\r
+\r
+  If Buffer was not allocated with a pool allocation function in the Memory Allocation Library,\r
+  then ASSERT().\r
+\r
+  @param  Buffer                Pointer to the buffer to free.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+FreePool (\r
+  IN VOID   *Buffer\r
+  )\r
+{\r
+  free ((void *) Buffer);\r
+}\r
+\r
index 98e8c894eb168bfb9a61fd10b75fa87a32bd4ccc..529543d6eb6b703aac812c472f9c98b26daadc8b 100644 (file)
-/*++ @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\r
+ POSIX Pthreads to emulate APs and implement threads\r
+\r
+Copyright (c) 2011, Apple Inc. All rights reserved.\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+\r
+**/\r
+\r
+#include "Host.h"\r
+\r
+\r
+#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'P', 'f', 's')\r
+\r
+typedef struct {\r
+  UINTN                           Signature;\r
+  EMU_IO_THUNK_PROTOCOL           *Thunk;\r
+  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL SimpleFileSystem;\r
+  CHAR8                           *FilePath;\r
+  CHAR16                          *VolumeLabel;\r
+  BOOLEAN                         FileHandlesOpen;\r
+} EMU_SIMPLE_FILE_SYSTEM_PRIVATE;\r
+\r
+#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS(a) \\r
+  CR (a, \\r
+      EMU_SIMPLE_FILE_SYSTEM_PRIVATE, \\r
+      SimpleFileSystem, \\r
+      EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE \\r
+      )\r
+\r
+\r
+#define EMU_EFI_FILE_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'P', 'f', 'i')\r
+\r
+typedef struct {\r
+  UINTN                           Signature;\r
+  EMU_IO_THUNK_PROTOCOL           *Thunk;\r
+  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;\r
+  EFI_FILE_PROTOCOL               EfiFile;\r
+  int                             fd;\r
+  DIR                             *Dir;\r
+  BOOLEAN                         IsRootDirectory;\r
+  BOOLEAN                         IsDirectoryPath;\r
+  BOOLEAN                         IsOpenedByRead;\r
+  char                            *FileName;\r
+  struct dirent                   *Dirent;\r
+} EMU_EFI_FILE_PRIVATE;\r
+\r
+#define EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS(a) \\r
+  CR (a, \\r
+      EMU_EFI_FILE_PRIVATE, \\r
+      EfiFile, \\r
+      EMU_EFI_FILE_PRIVATE_SIGNATURE \\r
+      )\r
+\r
+EFI_STATUS\r
+PosixFileGetInfo (\r
+  IN EFI_FILE_PROTOCOL        *This,\r
+  IN EFI_GUID                 *InformationType,\r
+  IN OUT UINTN                *BufferSize,\r
+  OUT VOID                    *Buffer\r
+  );\r
+\r
+EFI_STATUS\r
+PosixFileSetInfo (\r
+  IN EFI_FILE_PROTOCOL        *This,\r
+  IN EFI_GUID                 *InformationType,\r
+  IN UINTN                    BufferSize,\r
+  IN VOID                     *Buffer\r
+  );\r
+\r
+\r
+EFI_FILE_PROTOCOL gPosixFileProtocol = {\r
+  EFI_FILE_REVISION,\r
+  GasketPosixFileOpen,\r
+  GasketPosixFileCLose,\r
+  GasketPosixFileDelete,\r
+  GasketPosixFileRead,\r
+  GasketPosixFileWrite,\r
+  GasketPosixFileGetPossition,\r
+  GasketPosixFileSetPossition,\r
+  GasketPosixFileGetInfo,\r
+  GasketPosixFileSetInfo,\r
+  GasketPosixFileFlush\r
+};\r
+\r
+EFI_SIMPLE_FILE_SYSTEM_PROTOCOL gPosixFileSystemProtocol = {\r
+  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION,\r
+  GasketPosixOpenVolume,\r
+};\r
+\r
+\r
+/**\r
+  Open the root directory on a volume.\r
+\r
+  @param  This Protocol instance pointer.\r
+  @param  Root Returns an Open file handle for the root directory\r
+\r
+  @retval EFI_SUCCESS          The device was opened.\r
+  @retval EFI_UNSUPPORTED      This volume does not support the file system.\r
+  @retval EFI_NO_MEDIA         The device has no media.\r
+  @retval EFI_DEVICE_ERROR     The device reported an error.\r
+  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.\r
+  @retval EFI_ACCESS_DENIED    The service denied access to the file.\r
+  @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of resources.\r
+\r
+**/\r
+EFI_STATUS\r
+PosixOpenVolume (\r
+  IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL    *This,\r
+  OUT EFI_FILE_PROTOCOL                 **Root\r
+  )\r
+{\r
+  EFI_STATUS                        Status;\r
+  EMU_SIMPLE_FILE_SYSTEM_PRIVATE    *Private;\r
+  EMU_EFI_FILE_PRIVATE              *PrivateFile;\r
+\r
+  Private     = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+  Status = EFI_OUT_OF_RESOURCES;\r
+  PrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));\r
+  if (PrivateFile == NULL) {\r
+    goto Done;\r
+  }\r
+\r
+  PrivateFile->FileName = malloc (AsciiStrSize (Private->FilePath));\r
+  if (PrivateFile->FileName == NULL) {\r
+    goto Done;\r
+  }\r
+  AsciiStrCpy (PrivateFile->FileName, Private->FilePath);\r
+\r
+  PrivateFile->Signature            = EMU_EFI_FILE_PRIVATE_SIGNATURE;\r
+  PrivateFile->Thunk                = Private->Thunk;\r
+  PrivateFile->SimpleFileSystem     = This;\r
+  PrivateFile->IsRootDirectory      = TRUE;\r
+  PrivateFile->IsDirectoryPath      = TRUE;\r
+  PrivateFile->IsOpenedByRead       = TRUE;\r
+\r
+  CopyMem (&PrivateFile->EfiFile, &gPosixFileProtocol, sizeof (EFI_FILE_PROTOCOL));\r
+\r
+  PrivateFile->fd                   = -1;\r
+  PrivateFile->Dir                  = NULL;\r
+  PrivateFile->Dirent               = NULL;\r
+\r
+  *Root = &PrivateFile->EfiFile;\r
+\r
+  PrivateFile->Dir = opendir (PrivateFile->FileName);\r
+  if (PrivateFile->Dir == NULL) {\r
+    Status = EFI_ACCESS_DENIED;\r
+  } else {\r
+    Status = EFI_SUCCESS;\r
+  }\r
+\r
+Done:\r
+  if (EFI_ERROR (Status)) {\r
+    if (PrivateFile != NULL) {\r
+      if (PrivateFile->FileName != NULL) {\r
+        free (PrivateFile->FileName);\r
+      }\r
+\r
+      free (PrivateFile);\r
+    }\r
+\r
+    *Root = NULL;\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+ErrnoToEfiStatus ()\r
+{\r
+  switch (errno) {\r
+  case EACCES:\r
+    return EFI_ACCESS_DENIED;\r
+\r
+  case EDQUOT:\r
+  case ENOSPC:\r
+    return EFI_VOLUME_FULL;\r
+\r
+  default:\r
+    return EFI_DEVICE_ERROR;\r
+  }\r
+}\r
+\r
+VOID\r
+CutPrefix (\r
+  IN  CHAR8  *Str,\r
+  IN  UINTN   Count\r
+  )\r
+{\r
+  CHAR8  *Pointer;\r
+\r
+  if (AsciiStrLen (Str) < Count) {\r
+    ASSERT (0);\r
+  }\r
+\r
+  for (Pointer = Str; *(Pointer + Count); Pointer++) {\r
+    *Pointer = *(Pointer + Count);\r
+  }\r
+\r
+  *Pointer = *(Pointer + Count);\r
+}\r
+\r
+\r
+VOID\r
+PosixSystemTimeToEfiTime (\r
+  IN  time_t                SystemTime,\r
+  OUT EFI_TIME              *Time\r
+  )\r
+{\r
+  struct tm *tm;\r
+\r
+  tm           = gmtime (&SystemTime);\r
+  Time->Year   = tm->tm_year;\r
+  Time->Month  = tm->tm_mon + 1;\r
+  Time->Day    = tm->tm_mday;\r
+  Time->Hour   = tm->tm_hour;\r
+  Time->Minute = tm->tm_min;\r
+  Time->Second = tm->tm_sec;\r
+  Time->Nanosecond = 0;\r
+\r
+  Time->TimeZone = timezone;\r
+  Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0) | (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);\r
+}\r
+\r
+\r
+EFI_STATUS\r
+UnixSimpleFileSystemFileInfo (\r
+  EMU_EFI_FILE_PRIVATE            *PrivateFile,\r
+  IN     CHAR8                    *FileName,\r
+  IN OUT UINTN                    *BufferSize,\r
+  OUT    VOID                     *Buffer\r
+  )\r
+{\r
+  EFI_STATUS                  Status;\r
+  UINTN                       Size;\r
+  UINTN                       NameSize;\r
+  UINTN                       ResultSize;\r
+  EFI_FILE_INFO               *Info;\r
+  CHAR8                       *RealFileName;\r
+  CHAR8                       *TempPointer;\r
+  CHAR16                      *BufferFileName;\r
+  struct stat                 buf;\r
+\r
+  if (FileName != NULL) {\r
+    RealFileName = FileName;\r
+  } else if (PrivateFile->IsRootDirectory) {\r
+    RealFileName = "";\r
+  } else {\r
+    RealFileName  = PrivateFile->FileName;\r
+  }\r
+\r
+  TempPointer = RealFileName;\r
+  while (*TempPointer) {\r
+    if (*TempPointer == '/') {\r
+      RealFileName = TempPointer + 1;\r
+    }\r
+\r
+    TempPointer++;\r
+  }\r
+\r
+  Size        = SIZE_OF_EFI_FILE_INFO;\r
+  NameSize    = AsciiStrSize (RealFileName) * 2;\r
+  ResultSize  = Size + NameSize;\r
+\r
+  if (*BufferSize < ResultSize) {\r
+    *BufferSize = ResultSize;\r
+    return EFI_BUFFER_TOO_SMALL;\r
+  }\r
+  if (stat (FileName == NULL ? PrivateFile->FileName : FileName, &buf) < 0) {\r
+    return EFI_DEVICE_ERROR;\r
+  }\r
+\r
+  Status  = EFI_SUCCESS;\r
+\r
+  Info    = Buffer;\r
+  ZeroMem (Info, ResultSize);\r
+\r
+  Info->Size          = ResultSize;\r
+  Info->FileSize      = buf.st_size;\r
+  Info->PhysicalSize  = MultU64x32 (buf.st_blocks, buf.st_blksize);\r
+\r
+  PosixSystemTimeToEfiTime (buf.st_ctime, &Info->CreateTime);\r
+  PosixSystemTimeToEfiTime (buf.st_atime, &Info->LastAccessTime);\r
+  PosixSystemTimeToEfiTime (buf.st_mtime, &Info->ModificationTime);\r
+\r
+  if (!(buf.st_mode & S_IWUSR)) {\r
+    Info->Attribute |= EFI_FILE_READ_ONLY;\r
+  }\r
+\r
+  if (S_ISDIR(buf.st_mode)) {\r
+    Info->Attribute |= EFI_FILE_DIRECTORY;\r
+  }\r
+\r
+\r
+  BufferFileName = (CHAR16 *)((CHAR8 *) Buffer + Size);\r
+  while (*RealFileName) {\r
+    *BufferFileName++ = *RealFileName++;\r
+  }\r
+  *BufferFileName = 0;\r
+\r
+  *BufferSize = ResultSize;\r
+  return Status;\r
+}\r
+\r
+BOOLEAN\r
+IsZero (\r
+  IN VOID   *Buffer,\r
+  IN UINTN  Length\r
+  )\r
+{\r
+  if (Buffer == NULL || Length == 0) {\r
+    return FALSE;\r
+  }\r
+\r
+  if (*(UINT8 *) Buffer != 0) {\r
+    return FALSE;\r
+  }\r
+\r
+  if (Length > 1) {\r
+    if (!CompareMem (Buffer, (UINT8 *) Buffer + 1, Length - 1)) {\r
+      return FALSE;\r
+    }\r
+  }\r
+\r
+  return TRUE;\r
+}\r
+\r
+\r
+\r
+/**\r
+  Opens a new file relative to the source file's location.\r
+\r
+  @param  This       The protocol instance pointer.\r
+  @param  NewHandle  Returns File Handle for FileName.\r
+  @param  FileName   Null terminated string. "\", ".", and ".." are supported.\r
+  @param  OpenMode   Open mode for file.\r
+  @param  Attributes Only used for EFI_FILE_MODE_CREATE.\r
+\r
+  @retval EFI_SUCCESS          The device was opened.\r
+  @retval EFI_NOT_FOUND        The specified file could not be found on the device.\r
+  @retval EFI_NO_MEDIA         The device has no media.\r
+  @retval EFI_MEDIA_CHANGED    The media has changed.\r
+  @retval EFI_DEVICE_ERROR     The device reported an error.\r
+  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.\r
+  @retval EFI_ACCESS_DENIED    The service denied access to the file.\r
+  @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of resources.\r
+  @retval EFI_VOLUME_FULL      The volume is full.\r
+\r
+**/\r
+EFI_STATUS\r
+PosixFileOpen (\r
+  IN EFI_FILE_PROTOCOL        *This,\r
+  OUT EFI_FILE_PROTOCOL       **NewHandle,\r
+  IN CHAR16                   *FileName,\r
+  IN UINT64                   OpenMode,\r
+  IN UINT64                   Attributes\r
+  )\r
+{\r
+  EFI_FILE_PROTOCOL                 *Root;\r
+  EMU_EFI_FILE_PRIVATE              *PrivateFile;\r
+  EMU_EFI_FILE_PRIVATE              *NewPrivateFile;\r
+  EMU_SIMPLE_FILE_SYSTEM_PRIVATE    *PrivateRoot;\r
+  EFI_STATUS                        Status;\r
+  CHAR16                            *Src;\r
+  char                              *Dst;\r
+  CHAR8                             *RealFileName;\r
+  char                              *ParseFileName;\r
+  char                              *GuardPointer;\r
+  CHAR8                             TempChar;\r
+  UINTN                             Count;\r
+  BOOLEAN                           TrailingDash;\r
+  BOOLEAN                           LoopFinish;\r
+  UINTN                             InfoSize;\r
+  EFI_FILE_INFO                     *Info;\r
+  struct stat                       finfo;\r
+  int                               res;\r
+\r
+\r
+  PrivateFile     = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+  PrivateRoot     = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (PrivateFile->SimpleFileSystem);\r
+  NewPrivateFile  = NULL;\r
+  Status          = EFI_OUT_OF_RESOURCES;\r
+\r
+  //\r
+  // BUGBUG: assume an open of root\r
+  // if current location, return current data\r
+  //\r
+  TrailingDash = FALSE;\r
+  if ((StrCmp (FileName, L"\\") == 0) ||\r
+      (StrCmp (FileName, L".") == 0 && PrivateFile->IsRootDirectory)) {\r
+OpenRoot:\r
+    Status          = PosixOpenVolume (PrivateFile->SimpleFileSystem, &Root);\r
+    NewPrivateFile  = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (Root);\r
+    goto Done;\r
+  }\r
+\r
+  if (FileName[StrLen (FileName) - 1] == L'\\') {\r
+    TrailingDash = TRUE;\r
+    FileName[StrLen (FileName) - 1]  = 0;\r
+  }\r
+\r
+  //\r
+  // Attempt to open the file\r
+  //\r
+  NewPrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));\r
+  if (NewPrivateFile == NULL) {\r
+    goto Done;\r
+  }\r
+\r
+  CopyMem (NewPrivateFile, PrivateFile, sizeof (EMU_EFI_FILE_PRIVATE));\r
+\r
+  NewPrivateFile->FileName = malloc (AsciiStrSize (PrivateFile->FileName) + 1 + StrLen (FileName) + 1);\r
+  if (NewPrivateFile->FileName == NULL) {\r
+    goto Done;\r
+  }\r
+\r
+  if (*FileName == L'\\') {\r
+    AsciiStrCpy (NewPrivateFile->FileName, PrivateRoot->FilePath);\r
+    // Skip first '\'.\r
+    Src = FileName + 1;\r
+  } else {\r
+    AsciiStrCpy (NewPrivateFile->FileName, PrivateFile->FileName);\r
+    Src = FileName;\r
+  }\r
+  Dst = NewPrivateFile->FileName + AsciiStrLen (NewPrivateFile->FileName);\r
+  GuardPointer = NewPrivateFile->FileName + AsciiStrLen (PrivateRoot->FilePath);\r
+  *Dst++ = '/';\r
+  // Convert unicode to ascii and '\' to '/'\r
+  while (*Src) {\r
+    if (*Src == '\\') {\r
+      *Dst++ = '/';\r
+    } else {\r
+      *Dst++ = *Src;\r
+    }\r
+    Src++;\r
+  }\r
+  *Dst = 0;\r
+\r
+\r
+  //\r
+  // Get rid of . and .., except leading . or ..\r
+  //\r
+\r
+  //\r
+  // GuardPointer protect simplefilesystem root path not be destroyed\r
+  //\r
+\r
+  LoopFinish    = FALSE;\r
+  while (!LoopFinish) {\r
+    LoopFinish = TRUE;\r
+\r
+    for (ParseFileName = GuardPointer; *ParseFileName; ParseFileName++) {\r
+      if (*ParseFileName == '.' &&\r
+          (*(ParseFileName + 1) == 0 || *(ParseFileName + 1) == '/') &&\r
+          *(ParseFileName - 1) == '/'\r
+          ) {\r
+\r
+        //\r
+        // cut /.\r
+        //\r
+        CutPrefix (ParseFileName - 1, 2);\r
+        LoopFinish = FALSE;\r
+        break;\r
+      }\r
+\r
+      if (*ParseFileName == '.' &&\r
+          *(ParseFileName + 1) == '.' &&\r
+          (*(ParseFileName + 2) == 0 || *(ParseFileName + 2) == '/') &&\r
+          *(ParseFileName - 1) == '/'\r
+          ) {\r
+\r
+        ParseFileName--;\r
+        Count = 3;\r
+\r
+        while (ParseFileName != GuardPointer) {\r
+          ParseFileName--;\r
+          Count++;\r
+          if (*ParseFileName == '/') {\r
+            break;\r
+          }\r
+        }\r
+\r
+        //\r
+        // cut /.. and its left directory\r
+        //\r
+        CutPrefix (ParseFileName, Count);\r
+        LoopFinish = FALSE;\r
+        break;\r
+      }\r
+    }\r
+  }\r
+\r
+  if (AsciiStrCmp (NewPrivateFile->FileName, PrivateRoot->FilePath) == 0) {\r
+    NewPrivateFile->IsRootDirectory = TRUE;\r
+    free (NewPrivateFile->FileName);\r
+    free (NewPrivateFile);\r
+    goto OpenRoot;\r
+  }\r
+\r
+  RealFileName = NewPrivateFile->FileName + AsciiStrLen(NewPrivateFile->FileName) - 1;\r
+  while (RealFileName > NewPrivateFile->FileName && *RealFileName != '/') {\r
+    RealFileName--;\r
+  }\r
+\r
+  TempChar            = *(RealFileName - 1);\r
+  *(RealFileName - 1) = 0;\r
+  *(RealFileName - 1) = TempChar;\r
+\r
+\r
+  //\r
+  // Test whether file or directory\r
+  //\r
+  NewPrivateFile->IsRootDirectory = FALSE;\r
+  NewPrivateFile->fd = -1;\r
+  NewPrivateFile->Dir = NULL;\r
+  if (OpenMode & EFI_FILE_MODE_CREATE) {\r
+    if (Attributes & EFI_FILE_DIRECTORY) {\r
+      NewPrivateFile->IsDirectoryPath = TRUE;\r
+    } else {\r
+      NewPrivateFile->IsDirectoryPath = FALSE;\r
+    }\r
+  } else {\r
+    res = stat (NewPrivateFile->FileName, &finfo);\r
+    if (res == 0 && S_ISDIR(finfo.st_mode)) {\r
+      NewPrivateFile->IsDirectoryPath = TRUE;\r
+    } else {\r
+      NewPrivateFile->IsDirectoryPath = FALSE;\r
+    }\r
+  }\r
+\r
+  if (OpenMode & EFI_FILE_MODE_WRITE) {\r
+    NewPrivateFile->IsOpenedByRead = FALSE;\r
+  } else {\r
+    NewPrivateFile->IsOpenedByRead = TRUE;\r
+  }\r
+\r
+  Status = EFI_SUCCESS;\r
+\r
+  //\r
+  // deal with directory\r
+  //\r
+  if (NewPrivateFile->IsDirectoryPath) {\r
+    if ((OpenMode & EFI_FILE_MODE_CREATE)) {\r
+      //\r
+      // Create a directory\r
+      //\r
+      if (mkdir (NewPrivateFile->FileName, 0777) != 0) {\r
+        if (errno != EEXIST) {\r
+          //free (TempFileName);\r
+          Status = EFI_ACCESS_DENIED;\r
+          goto Done;\r
+        }\r
+      }\r
+    }\r
+\r
+    NewPrivateFile->Dir = opendir (NewPrivateFile->FileName);\r
+    if (NewPrivateFile->Dir == NULL) {\r
+      if (errno == EACCES) {\r
+        Status = EFI_ACCESS_DENIED;\r
+      } else {\r
+        Status = EFI_NOT_FOUND;\r
+      }\r
+\r
+      goto Done;\r
+    }\r
+\r
+  } else {\r
+    //\r
+    // deal with file\r
+    //\r
+    NewPrivateFile->fd = open (\r
+                          NewPrivateFile->FileName,\r
+                          ((OpenMode & EFI_FILE_MODE_CREATE) ? O_CREAT : 0) | (NewPrivateFile->IsOpenedByRead ? O_RDONLY : O_RDWR),\r
+                          0666\r
+                          );\r
+    if (NewPrivateFile->fd < 0) {\r
+      if (errno == ENOENT) {\r
+        Status = EFI_NOT_FOUND;\r
+      } else {\r
+        Status = EFI_ACCESS_DENIED;\r
+      }\r
+    }\r
+  }\r
+\r
+  if ((OpenMode & EFI_FILE_MODE_CREATE) && Status == EFI_SUCCESS) {\r
+    //\r
+    // Set the attribute\r
+    //\r
+    InfoSize  = 0;\r
+    Info      = NULL;\r
+    Status    = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, &InfoSize, Info);\r
+    if (Status != EFI_BUFFER_TOO_SMALL) {\r
+      Status = EFI_DEVICE_ERROR;\r
+      goto Done;\r
+    }\r
+\r
+    Info = malloc (InfoSize);\r
+    if (Info == NULL) {\r
+      goto Done;\r
+    }\r
+\r
+    Status = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, &InfoSize, Info);\r
+    if (EFI_ERROR (Status)) {\r
+      goto Done;\r
+    }\r
+\r
+    Info->Attribute = Attributes;\r
+    PosixFileSetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, InfoSize, Info);\r
+\r
+    free (Info);\r
+  }\r
+\r
+Done: ;\r
+  if (TrailingDash) {\r
+    FileName[StrLen (FileName) + 1]  = 0;\r
+    FileName[StrLen (FileName)]      = L'\\';\r
+  }\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    if (NewPrivateFile) {\r
+      if (NewPrivateFile->FileName) {\r
+        free (NewPrivateFile->FileName);\r
+      }\r
+\r
+      free (NewPrivateFile);\r
+    }\r
+  } else {\r
+    *NewHandle = &NewPrivateFile->EfiFile;\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+\r
+/**\r
+  Close the file handle\r
+\r
+  @param  This          Protocol instance pointer.\r
+\r
+  @retval EFI_SUCCESS   The device was opened.\r
+\r
+**/\r
+EFI_STATUS\r
+PosixFileCLose (\r
+  IN EFI_FILE_PROTOCOL  *This\r
+  )\r
+{\r
+  EMU_EFI_FILE_PRIVATE *PrivateFile;\r
+\r
+  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+  if (PrivateFile->fd >= 0) {\r
+    close (PrivateFile->fd);\r
+  }\r
+  if (PrivateFile->Dir != NULL) {\r
+    closedir (PrivateFile->Dir);\r
+  }\r
+\r
+  PrivateFile->fd = -1;\r
+  PrivateFile->Dir = NULL;\r
+\r
+  if (PrivateFile->FileName) {\r
+    free (PrivateFile->FileName);\r
+  }\r
+\r
+  free (PrivateFile);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+  Close and delete the file handle.\r
+\r
+  @param  This                     Protocol instance pointer.\r
+\r
+  @retval EFI_SUCCESS              The device was opened.\r
+  @retval EFI_WARN_DELETE_FAILURE  The handle was closed but the file was not deleted.\r
+\r
+**/\r
+EFI_STATUS\r
+PosixFileDelete (\r
+  IN EFI_FILE_PROTOCOL  *This\r
+  )\r
+{\r
+  EFI_STATUS              Status;\r
+  EMU_EFI_FILE_PRIVATE   *PrivateFile;\r
+\r
+  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+  Status      = EFI_WARN_DELETE_FAILURE;\r
+\r
+  if (PrivateFile->IsDirectoryPath) {\r
+    if (PrivateFile->Dir != NULL) {\r
+      closedir (PrivateFile->Dir);\r
+      PrivateFile->Dir = NULL;\r
+    }\r
+\r
+    if (rmdir (PrivateFile->FileName) == 0) {\r
+      Status = EFI_SUCCESS;\r
+    }\r
+  } else {\r
+    close (PrivateFile->fd);\r
+    PrivateFile->fd = -1;\r
+\r
+    if (!PrivateFile->IsOpenedByRead) {\r
+      if (!unlink (PrivateFile->FileName)) {\r
+        Status = EFI_SUCCESS;\r
+      }\r
+    }\r
+  }\r
+\r
+  free (PrivateFile->FileName);\r
+  free (PrivateFile);\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+/**\r
+  Read data from the file.\r
+\r
+  @param  This       Protocol instance pointer.\r
+  @param  BufferSize On input size of buffer, on output amount of data in buffer.\r
+  @param  Buffer     The buffer in which data is read.\r
+\r
+  @retval EFI_SUCCESS          Data was read.\r
+  @retval EFI_NO_MEDIA         The device has no media.\r
+  @retval EFI_DEVICE_ERROR     The device reported an error.\r
+  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.\r
+  @retval EFI_BUFFER_TO_SMALL  BufferSize is too small. BufferSize contains required size.\r
+\r
+**/\r
+EFI_STATUS\r
+PosixFileRead (\r
+  IN EFI_FILE_PROTOCOL        *This,\r
+  IN OUT UINTN                *BufferSize,\r
+  OUT VOID                    *Buffer\r
+  )\r
+{\r
+  EMU_EFI_FILE_PRIVATE    *PrivateFile;\r
+  EFI_STATUS              Status;\r
+  int                     Res;\r
+  UINTN                   Size;\r
+  UINTN                   NameSize;\r
+  UINTN                   ResultSize;\r
+  CHAR8                   *FullFileName;\r
+\r
+\r
+  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+  if (!PrivateFile->IsDirectoryPath) {\r
+    if (PrivateFile->fd < 0) {\r
+      Status = EFI_DEVICE_ERROR;\r
+      goto Done;\r
+    }\r
+\r
+    Res = read (PrivateFile->fd, Buffer, *BufferSize);\r
+    if (Res < 0) {\r
+      Status = EFI_DEVICE_ERROR;\r
+      goto Done;\r
+    }\r
+    *BufferSize = Res;\r
+    Status = EFI_SUCCESS;\r
+    goto Done;\r
+  }\r
+\r
+  //\r
+  // Read on a directory.\r
+  //\r
+  if (PrivateFile->Dir == NULL) {\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
+  }\r
+\r
+  if (PrivateFile->Dirent == NULL) {\r
+    PrivateFile->Dirent = readdir (PrivateFile->Dir);\r
+    if (PrivateFile->Dirent == NULL) {\r
+      *BufferSize = 0;\r
+      Status = EFI_SUCCESS;\r
+      goto Done;\r
+    }\r
+  }\r
+\r
+  Size        = SIZE_OF_EFI_FILE_INFO;\r
+  NameSize    = AsciiStrLen (PrivateFile->Dirent->d_name) + 1;\r
+  ResultSize  = Size + 2 * NameSize;\r
+\r
+  if (*BufferSize < ResultSize) {\r
+    *BufferSize = ResultSize;\r
+    Status = EFI_BUFFER_TOO_SMALL;\r
+    goto Done;\r
+  }\r
+  Status  = EFI_SUCCESS;\r
+\r
+  *BufferSize = ResultSize;\r
+\r
+  FullFileName = malloc (AsciiStrLen(PrivateFile->FileName) + 1 + NameSize);\r
+  if (FullFileName == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto Done;\r
+  }\r
+\r
+  AsciiStrCpy (FullFileName, PrivateFile->FileName);\r
+  AsciiStrCat (FullFileName, "/");\r
+  AsciiStrCat (FullFileName, PrivateFile->Dirent->d_name);\r
+  Status = UnixSimpleFileSystemFileInfo (\r
+            PrivateFile,\r
+            FullFileName,\r
+            BufferSize,\r
+            Buffer\r
+            );\r
+  free (FullFileName);\r
+\r
+  PrivateFile->Dirent = NULL;\r
+\r
+Done:\r
+  return Status;\r
+}\r
+\r
+\r
+\r
+/**\r
+  Write data to a file.\r
+\r
+  @param  This       Protocol instance pointer.\r
+  @param  BufferSize On input size of buffer, on output amount of data in buffer.\r
+  @param  Buffer     The buffer in which data to write.\r
+\r
+  @retval EFI_SUCCESS          Data was written.\r
+  @retval EFI_UNSUPPORTED      Writes to Open directory are not supported.\r
+  @retval EFI_NO_MEDIA         The device has no media.\r
+  @retval EFI_DEVICE_ERROR     The device reported an error.\r
+  @retval EFI_DEVICE_ERROR     An attempt was made to write to a deleted file.\r
+  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.\r
+  @retval EFI_WRITE_PROTECTED  The device is write protected.\r
+  @retval EFI_ACCESS_DENIED    The file was open for read only.\r
+  @retval EFI_VOLUME_FULL      The volume is full.\r
+\r
+**/\r
+EFI_STATUS\r
+PosixFileWrite (\r
+  IN EFI_FILE_PROTOCOL        *This,\r
+  IN OUT UINTN                *BufferSize,\r
+  IN VOID                     *Buffer\r
+  )\r
+{\r
+  EMU_EFI_FILE_PRIVATE  *PrivateFile;\r
+  int                   Res;\r
+\r
+\r
+  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+  if (PrivateFile->fd < 0) {\r
+    return EFI_DEVICE_ERROR;\r
+  }\r
+\r
+  if (PrivateFile->IsDirectoryPath) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  if (PrivateFile->IsOpenedByRead) {\r
+    return EFI_ACCESS_DENIED;\r
+  }\r
+\r
+  Res = write (PrivateFile->fd, Buffer, *BufferSize);\r
+  if (Res == (UINTN)-1) {\r
+    return ErrnoToEfiStatus ();\r
+  }\r
+\r
+  *BufferSize = Res;\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+\r
+/**\r
+  Set a files current position\r
+\r
+  @param  This            Protocol instance pointer.\r
+  @param  Position        Byte position from the start of the file.\r
+\r
+  @retval EFI_SUCCESS     Data was written.\r
+  @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open.\r
+\r
+**/\r
+EFI_STATUS\r
+PosixFileSetPossition (\r
+  IN EFI_FILE_PROTOCOL        *This,\r
+  IN UINT64                   Position\r
+  )\r
+{\r
+  EMU_EFI_FILE_PRIVATE    *PrivateFile;\r
+  off_t                   Pos;\r
+\r
+  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+  if (PrivateFile->IsDirectoryPath) {\r
+    if (Position != 0) {\r
+      return EFI_UNSUPPORTED;\r
+    }\r
+\r
+    if (PrivateFile->Dir == NULL) {\r
+      return EFI_DEVICE_ERROR;\r
+    }\r
+    rewinddir (PrivateFile->Dir);\r
+    return EFI_SUCCESS;\r
+  } else {\r
+    if (Position == (UINT64) -1) {\r
+      Pos = lseek (PrivateFile->fd, 0, SEEK_END);\r
+    } else {\r
+      Pos = lseek (PrivateFile->fd, Position, SEEK_SET);\r
+    }\r
+    if (Pos == (off_t)-1) {\r
+      return ErrnoToEfiStatus ();\r
+    }\r
+    return EFI_SUCCESS;\r
+  }\r
+}\r
+\r
+\r
+\r
+/**\r
+  Get a file's current position\r
+\r
+  @param  This            Protocol instance pointer.\r
+  @param  Position        Byte position from the start of the file.\r
+\r
+  @retval EFI_SUCCESS     Data was written.\r
+  @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open..\r
+\r
+**/\r
+EFI_STATUS\r
+PosixFileGetPossition (\r
+  IN EFI_FILE_PROTOCOL        *This,\r
+  OUT UINT64                  *Position\r
+  )\r
+{\r
+  EFI_STATUS            Status;\r
+  EMU_EFI_FILE_PRIVATE  *PrivateFile;\r
+\r
+  PrivateFile   = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+  if (PrivateFile->IsDirectoryPath) {\r
+    Status = EFI_UNSUPPORTED;\r
+  } else {\r
+    *Position = (UINT64)lseek (PrivateFile->fd, 0, SEEK_CUR);\r
+    Status = (*Position == (UINT64) -1) ? ErrnoToEfiStatus () : EFI_SUCCESS;\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+/**\r
+  Get information about a file.\r
+\r
+  @param  This            Protocol instance pointer.\r
+  @param  InformationType Type of information to return in Buffer.\r
+  @param  BufferSize      On input size of buffer, on output amount of data in buffer.\r
+  @param  Buffer          The buffer to return data.\r
+\r
+  @retval EFI_SUCCESS          Data was returned.\r
+  @retval EFI_UNSUPPORTED      InformationType is not supported.\r
+  @retval EFI_NO_MEDIA         The device has no media.\r
+  @retval EFI_DEVICE_ERROR     The device reported an error.\r
+  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.\r
+  @retval EFI_WRITE_PROTECTED  The device is write protected.\r
+  @retval EFI_ACCESS_DENIED    The file was open for read only.\r
+  @retval EFI_BUFFER_TOO_SMALL Buffer was too small; required size returned in BufferSize.\r
+\r
+**/\r
+EFI_STATUS\r
+PosixFileGetInfo (\r
+  IN EFI_FILE_PROTOCOL        *This,\r
+  IN EFI_GUID                 *InformationType,\r
+  IN OUT UINTN                *BufferSize,\r
+  OUT VOID                    *Buffer\r
+  )\r
+{\r
+  EFI_STATUS                        Status;\r
+  EMU_EFI_FILE_PRIVATE              *PrivateFile;\r
+  EFI_FILE_SYSTEM_INFO              *FileSystemInfoBuffer;\r
+  int                               UnixStatus;\r
+  EMU_SIMPLE_FILE_SYSTEM_PRIVATE    *PrivateRoot;\r
+  struct statfs                     buf;\r
+\r
+  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+  PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (PrivateFile->SimpleFileSystem);\r
+\r
+  Status = EFI_SUCCESS;\r
+  if (CompareGuid (InformationType, &gEfiFileInfoGuid)) {\r
+    Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, BufferSize, Buffer);\r
+  } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {\r
+    if (*BufferSize < SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel)) {\r
+      *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);\r
+      return EFI_BUFFER_TOO_SMALL;\r
+    }\r
+\r
+    UnixStatus = statfs (PrivateFile->FileName, &buf);\r
+    if (UnixStatus < 0) {\r
+      return EFI_DEVICE_ERROR;\r
+    }\r
+\r
+    FileSystemInfoBuffer            = (EFI_FILE_SYSTEM_INFO *) Buffer;\r
+    FileSystemInfoBuffer->Size      = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);\r
+    FileSystemInfoBuffer->ReadOnly  = FALSE;\r
+\r
+    //\r
+    // Succeeded\r
+    //\r
+    FileSystemInfoBuffer->VolumeSize  = MultU64x32 (buf.f_blocks, buf.f_bsize);\r
+    FileSystemInfoBuffer->FreeSpace   = MultU64x32 (buf.f_bavail, buf.f_bsize);\r
+    FileSystemInfoBuffer->BlockSize   = buf.f_bsize;\r
+\r
+\r
+    StrCpy ((CHAR16 *) FileSystemInfoBuffer->VolumeLabel, PrivateRoot->VolumeLabel);\r
+    *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);\r
+\r
+  } else if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) {\r
+    if (*BufferSize < StrSize (PrivateRoot->VolumeLabel)) {\r
+      *BufferSize = StrSize (PrivateRoot->VolumeLabel);\r
+      return EFI_BUFFER_TOO_SMALL;\r
+    }\r
+\r
+    StrCpy ((CHAR16 *) Buffer, PrivateRoot->VolumeLabel);\r
+    *BufferSize = StrSize (PrivateRoot->VolumeLabel);\r
+\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+/**\r
+  Set information about a file\r
+\r
+  @param  File            Protocol instance pointer.\r
+  @param  InformationType Type of information in Buffer.\r
+  @param  BufferSize      Size of buffer.\r
+  @param  Buffer          The data to write.\r
+\r
+  @retval EFI_SUCCESS          Data was returned.\r
+  @retval EFI_UNSUPPORTED      InformationType is not supported.\r
+  @retval EFI_NO_MEDIA         The device has no media.\r
+  @retval EFI_DEVICE_ERROR     The device reported an error.\r
+  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.\r
+  @retval EFI_WRITE_PROTECTED  The device is write protected.\r
+  @retval EFI_ACCESS_DENIED    The file was open for read only.\r
+\r
+**/\r
+EFI_STATUS\r
+PosixFileSetInfo (\r
+  IN EFI_FILE_PROTOCOL        *This,\r
+  IN EFI_GUID                 *InformationType,\r
+  IN UINTN                    BufferSize,\r
+  IN VOID                     *Buffer\r
+  )\r
+{\r
+  EMU_SIMPLE_FILE_SYSTEM_PRIVATE    *PrivateRoot;\r
+  EMU_EFI_FILE_PRIVATE              *PrivateFile;\r
+  EFI_FILE_INFO                     *OldFileInfo;\r
+  EFI_FILE_INFO                     *NewFileInfo;\r
+  EFI_STATUS                        Status;\r
+  UINTN                             OldInfoSize;\r
+  mode_t                            NewAttr;\r
+  struct stat                       OldAttr;\r
+  CHAR8                             *OldFileName;\r
+  CHAR8                             *NewFileName;\r
+  CHAR8                             *CharPointer;\r
+  BOOLEAN                           AttrChangeFlag;\r
+  BOOLEAN                           NameChangeFlag;\r
+  BOOLEAN                           SizeChangeFlag;\r
+  BOOLEAN                           TimeChangeFlag;\r
+  struct tm                         NewLastAccessSystemTime;\r
+  struct tm                         NewLastWriteSystemTime;\r
+  EFI_FILE_SYSTEM_INFO              *NewFileSystemInfo;\r
+  CHAR8                             *AsciiFilePtr;\r
+  CHAR16                            *UnicodeFilePtr;\r
+  int                               UnixStatus;\r
+  struct utimbuf                    Utime;\r
+\r
+\r
+  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+  PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (PrivateFile->SimpleFileSystem);\r
+  errno       = 0;\r
+  Status      = EFI_UNSUPPORTED;\r
+  OldFileInfo = NewFileInfo = NULL;\r
+  OldFileName = NewFileName = NULL;\r
+  AttrChangeFlag = NameChangeFlag = SizeChangeFlag = TimeChangeFlag = FALSE;\r
+\r
+  //\r
+  // Set file system information.\r
+  //\r
+  if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {\r
+    if (BufferSize < (SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel))) {\r
+      Status = EFI_BAD_BUFFER_SIZE;\r
+      goto Done;\r
+    }\r
+\r
+    NewFileSystemInfo = (EFI_FILE_SYSTEM_INFO *) Buffer;\r
+\r
+    free (PrivateRoot->VolumeLabel);\r
+\r
+    PrivateRoot->VolumeLabel = malloc (StrSize (NewFileSystemInfo->VolumeLabel));\r
+    if (PrivateRoot->VolumeLabel == NULL) {\r
+      goto Done;\r
+    }\r
+\r
+    StrCpy (PrivateRoot->VolumeLabel, NewFileSystemInfo->VolumeLabel);\r
+\r
+    Status = EFI_SUCCESS;\r
+    goto Done;\r
+  }\r
+\r
+  //\r
+  // Set volume label information.\r
+  //\r
+  if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) {\r
+    if (BufferSize < StrSize (PrivateRoot->VolumeLabel)) {\r
+      Status = EFI_BAD_BUFFER_SIZE;\r
+      goto Done;\r
+    }\r
+\r
+    StrCpy (PrivateRoot->VolumeLabel, (CHAR16 *) Buffer);\r
+\r
+    Status = EFI_SUCCESS;\r
+    goto Done;\r
+  }\r
+\r
+  if (!CompareGuid (InformationType, &gEfiFileInfoGuid)) {\r
+    Status = EFI_UNSUPPORTED;\r
+    goto Done;\r
+  }\r
+\r
+  if (BufferSize < SIZE_OF_EFI_FILE_INFO) {\r
+    Status = EFI_BAD_BUFFER_SIZE;\r
+    goto Done;\r
+  }\r
+\r
+  //\r
+  // Set file/directory information.\r
+  //\r
+\r
+  //\r
+  // Check for invalid set file information parameters.\r
+  //\r
+  NewFileInfo = (EFI_FILE_INFO *) Buffer;\r
+  if (NewFileInfo->Size <= sizeof (EFI_FILE_INFO) ||\r
+      (NewFileInfo->Attribute &~(EFI_FILE_VALID_ATTR)) ||\r
+      (sizeof (UINTN) == 4 && NewFileInfo->Size > 0xFFFFFFFF)\r
+      ) {\r
+    Status = EFI_INVALID_PARAMETER;\r
+    goto Done;\r
+  }\r
+\r
+  //\r
+  // Get current file information so we can determine what kind\r
+  // of change request this is.\r
+  //\r
+  OldInfoSize = 0;\r
+  Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize, NULL);\r
+  if (Status != EFI_BUFFER_TOO_SMALL) {\r
+    Status = EFI_DEVICE_ERROR;\r
+    goto Done;\r
+  }\r
+\r
+  OldFileInfo = malloc (OldInfoSize);\r
+  if (OldFileInfo == NULL) {\r
+    goto Done;\r
+  }\r
+\r
+  Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize, OldFileInfo);\r
+  if (EFI_ERROR (Status)) {\r
+    goto Done;\r
+  }\r
+\r
+  OldFileName = malloc (AsciiStrSize (PrivateFile->FileName));\r
+  if (OldFileInfo == NULL) {\r
+    goto Done;\r
+  }\r
+\r
+  AsciiStrCpy (OldFileName, PrivateFile->FileName);\r
+\r
+  //\r
+  // Make full pathname from new filename and rootpath.\r
+  //\r
+  if (NewFileInfo->FileName[0] == '\\') {\r
+    NewFileName = malloc (AsciiStrLen (PrivateRoot->FilePath) + 1 + StrLen (NewFileInfo->FileName) + 1);\r
+    if (NewFileName == NULL) {\r
+      goto Done;\r
+    }\r
+\r
+    AsciiStrCpy (NewFileName, PrivateRoot->FilePath);\r
+    AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);\r
+    UnicodeFilePtr = NewFileInfo->FileName + 1;\r
+    *AsciiFilePtr++ ='/';\r
+  } else {\r
+    NewFileName = malloc (AsciiStrLen (PrivateFile->FileName) + 2 + StrLen (NewFileInfo->FileName) + 1);\r
+    if (NewFileName == NULL) {\r
+      goto Done;\r
+    }\r
+\r
+    AsciiStrCpy (NewFileName, PrivateRoot->FilePath);\r
+    AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);\r
+    if ((AsciiFilePtr[-1] != '/') && (NewFileInfo->FileName[0] != '/')) {\r
+      // make sure there is a / between Root FilePath and NewFileInfo Filename\r
+      AsciiFilePtr[0] = '/';\r
+      AsciiFilePtr[1] = '\0';\r
+      AsciiFilePtr++;\r
+    }\r
+    UnicodeFilePtr = NewFileInfo->FileName;\r
+  }\r
+  // Convert to ascii.\r
+  while (*UnicodeFilePtr) {\r
+    *AsciiFilePtr++ = *UnicodeFilePtr++;\r
+  }\r
+  *AsciiFilePtr = 0;\r
+\r
+  //\r
+  // Is there an attribute change request?\r
+  //\r
+  if (NewFileInfo->Attribute != OldFileInfo->Attribute) {\r
+    if ((NewFileInfo->Attribute & EFI_FILE_DIRECTORY) != (OldFileInfo->Attribute & EFI_FILE_DIRECTORY)) {\r
+      Status = EFI_INVALID_PARAMETER;\r
+      goto Done;\r
+    }\r
+\r
+    AttrChangeFlag = TRUE;\r
+  }\r
+\r
+  //\r
+  // Is there a name change request?\r
+  // bugbug: - Should really use EFI_UNICODE_COLLATION_PROTOCOL\r
+  //\r
+  if (StrCmp (NewFileInfo->FileName, OldFileInfo->FileName)) {\r
+    NameChangeFlag = TRUE;\r
+  }\r
+\r
+  //\r
+  // Is there a size change request?\r
+  //\r
+  if (NewFileInfo->FileSize != OldFileInfo->FileSize) {\r
+    SizeChangeFlag = TRUE;\r
+  }\r
+\r
+  //\r
+  // Is there a time stamp change request?\r
+  //\r
+  if (!IsZero (&NewFileInfo->CreateTime, sizeof (EFI_TIME)) &&\r
+      CompareMem (&NewFileInfo->CreateTime, &OldFileInfo->CreateTime, sizeof (EFI_TIME))\r
+      ) {\r
+    TimeChangeFlag = TRUE;\r
+  } else if (!IsZero (&NewFileInfo->LastAccessTime, sizeof (EFI_TIME)) &&\r
+             CompareMem (&NewFileInfo->LastAccessTime, &OldFileInfo->LastAccessTime, sizeof (EFI_TIME))\r
+             ) {\r
+    TimeChangeFlag = TRUE;\r
+  } else if (!IsZero (&NewFileInfo->ModificationTime, sizeof (EFI_TIME)) &&\r
+             CompareMem (&NewFileInfo->ModificationTime, &OldFileInfo->ModificationTime, sizeof (EFI_TIME))\r
+             ) {\r
+    TimeChangeFlag = TRUE;\r
+  }\r
+\r
+  //\r
+  // All done if there are no change requests being made.\r
+  //\r
+  if (!(AttrChangeFlag || NameChangeFlag || SizeChangeFlag || TimeChangeFlag)) {\r
+    Status = EFI_SUCCESS;\r
+    goto Done;\r
+  }\r
+\r
+  //\r
+  // Set file or directory information.\r
+  //\r
+  if (stat (OldFileName, &OldAttr) != 0) {\r
+    Status = ErrnoToEfiStatus ();\r
+    goto Done;\r
+  }\r
+\r
+  //\r
+  // Name change.\r
+  //\r
+  if (NameChangeFlag) {\r
+    //\r
+    // Close the handles first\r
+    //\r
+    if (PrivateFile->IsOpenedByRead) {\r
+      Status = EFI_ACCESS_DENIED;\r
+      goto Done;\r
+    }\r
+\r
+    for (CharPointer = NewFileName; *CharPointer != 0 && *CharPointer != L'/'; CharPointer++) {\r
+    }\r
+\r
+    if (*CharPointer != 0) {\r
+      Status = EFI_ACCESS_DENIED;\r
+      goto Done;\r
+    }\r
+\r
+    UnixStatus = rename (OldFileName, NewFileName);\r
+    if (UnixStatus == 0) {\r
+      //\r
+      // modify file name\r
+      //\r
+      free (PrivateFile->FileName);\r
+\r
+      PrivateFile->FileName = malloc (AsciiStrSize (NewFileName));\r
+      if (PrivateFile->FileName == NULL) {\r
+        goto Done;\r
+      }\r
+\r
+      AsciiStrCpy (PrivateFile->FileName, NewFileName);\r
+    } else {\r
+      Status    = EFI_DEVICE_ERROR;\r
+      goto Done;\r
+    }\r
+  }\r
+\r
+  //\r
+  //  Size change\r
+  //\r
+  if (SizeChangeFlag) {\r
+    if (PrivateFile->IsDirectoryPath) {\r
+      Status = EFI_UNSUPPORTED;\r
+      goto Done;\r
+    }\r
+\r
+    if (PrivateFile->IsOpenedByRead || OldFileInfo->Attribute & EFI_FILE_READ_ONLY) {\r
+      Status = EFI_ACCESS_DENIED;\r
+      goto Done;\r
+    }\r
+\r
+    if (ftruncate (PrivateFile->fd, NewFileInfo->FileSize) != 0) {\r
+      Status = ErrnoToEfiStatus ();\r
+      goto Done;\r
+    }\r
+\r
+  }\r
+\r
+  //\r
+  // Time change\r
+  //\r
+  if (TimeChangeFlag) {\r
+    NewLastAccessSystemTime.tm_year    = NewFileInfo->LastAccessTime.Year;\r
+    NewLastAccessSystemTime.tm_mon     = NewFileInfo->LastAccessTime.Month;\r
+    NewLastAccessSystemTime.tm_mday    = NewFileInfo->LastAccessTime.Day;\r
+    NewLastAccessSystemTime.tm_hour    = NewFileInfo->LastAccessTime.Hour;\r
+    NewLastAccessSystemTime.tm_min     = NewFileInfo->LastAccessTime.Minute;\r
+    NewLastAccessSystemTime.tm_sec     = NewFileInfo->LastAccessTime.Second;\r
+    NewLastAccessSystemTime.tm_isdst   = 0;\r
+\r
+    Utime.actime = mktime (&NewLastAccessSystemTime);\r
+\r
+    NewLastWriteSystemTime.tm_year    = NewFileInfo->ModificationTime.Year;\r
+    NewLastWriteSystemTime.tm_mon     = NewFileInfo->ModificationTime.Month;\r
+    NewLastWriteSystemTime.tm_mday    = NewFileInfo->ModificationTime.Day;\r
+    NewLastWriteSystemTime.tm_hour    = NewFileInfo->ModificationTime.Hour;\r
+    NewLastWriteSystemTime.tm_min     = NewFileInfo->ModificationTime.Minute;\r
+    NewLastWriteSystemTime.tm_sec     = NewFileInfo->ModificationTime.Second;\r
+    NewLastWriteSystemTime.tm_isdst   = 0;\r
+\r
+    Utime.modtime = mktime (&NewLastWriteSystemTime);\r
+\r
+    if (Utime.actime == (time_t)-1 || Utime.modtime == (time_t)-1) {\r
+      goto Done;\r
+    }\r
+\r
+    if (utime (PrivateFile->FileName, &Utime) == -1) {\r
+      Status = ErrnoToEfiStatus ();\r
+      goto Done;\r
+    }\r
+  }\r
+\r
+  //\r
+  // No matter about AttrChangeFlag, Attribute must be set.\r
+  // Because operation before may cause attribute change.\r
+  //\r
+  NewAttr = OldAttr.st_mode;\r
+\r
+  if (NewFileInfo->Attribute & EFI_FILE_READ_ONLY) {\r
+    NewAttr &= ~(S_IRUSR | S_IRGRP | S_IROTH);\r
+  } else {\r
+    NewAttr |= S_IRUSR;\r
+  }\r
+\r
+  if (chmod (NewFileName, NewAttr) != 0) {\r
+    Status = ErrnoToEfiStatus ();\r
+  }\r
+\r
+Done:\r
+  if (OldFileInfo != NULL) {\r
+    free (OldFileInfo);\r
+  }\r
+\r
+  if (OldFileName != NULL) {\r
+    free (OldFileName);\r
+  }\r
+\r
+  if (NewFileName != NULL) {\r
+    free (NewFileName);\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+/**\r
+  Flush data back for the file handle.\r
+\r
+  @param  This Protocol instance pointer.\r
+\r
+  @retval EFI_SUCCESS          Data was written.\r
+  @retval EFI_UNSUPPORTED      Writes to Open directory are not supported.\r
+  @retval EFI_NO_MEDIA         The device has no media.\r
+  @retval EFI_DEVICE_ERROR     The device reported an error.\r
+  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.\r
+  @retval EFI_WRITE_PROTECTED  The device is write protected.\r
+  @retval EFI_ACCESS_DENIED    The file was open for read only.\r
+  @retval EFI_VOLUME_FULL      The volume is full.\r
+\r
+**/\r
+EFI_STATUS\r
+PosixFileFlush (\r
+  IN EFI_FILE_PROTOCOL  *This\r
+  )\r
+{\r
+  EMU_EFI_FILE_PRIVATE     *PrivateFile;\r
+\r
+\r
+  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+  if (PrivateFile->IsDirectoryPath) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  if (PrivateFile->IsOpenedByRead) {\r
+    return EFI_ACCESS_DENIED;\r
+  }\r
+\r
+  if (PrivateFile->fd < 0) {\r
+    return EFI_DEVICE_ERROR;\r
+  }\r
+\r
+  if (fsync (PrivateFile->fd) != 0) {\r
+    return ErrnoToEfiStatus ();\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+\r
+EFI_STATUS\r
+PosixFileSystmeThunkOpen (\r
+  IN  EMU_IO_THUNK_PROTOCOL   *This\r
+  )\r
+{\r
+  EMU_SIMPLE_FILE_SYSTEM_PRIVATE  *Private;\r
+  UINTN                           i;\r
+\r
+  if (This->Private != NULL) {\r
+    return EFI_ALREADY_STARTED;\r
+  }\r
+\r
+  if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  Private = malloc (sizeof (EMU_SIMPLE_FILE_SYSTEM_PRIVATE));\r
+  if (Private == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  Private->FilePath = malloc (StrLen (This->ConfigString) + 1);\r
+  if (Private->FilePath == NULL) {\r
+    free (Private);\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  // Convert Unicode to Ascii\r
+  for (i = 0; This->ConfigString[i] != 0; i++) {\r
+    Private->FilePath[i] = This->ConfigString[i];\r
+  }\r
+  Private->FilePath[i] = 0;\r
+\r
+\r
+  Private->VolumeLabel = malloc (StrSize (L"EFI_EMULATED"));\r
+  if (Private->VolumeLabel == NULL) {\r
+    free (Private->FilePath);\r
+    free (Private);\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+  StrCpy (Private->VolumeLabel, L"EFI_EMULATED");\r
+\r
+  Private->Signature = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE;\r
+  Private->Thunk     = This;\r
+  CopyMem (&Private->SimpleFileSystem, &gPosixFileSystemProtocol, sizeof (Private->SimpleFileSystem));\r
+  Private->FileHandlesOpen = FALSE;\r
+\r
+  This->Interface = &Private->SimpleFileSystem;\r
+  This->Private   = Private;\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+PosixFileSystmeThunkClose (\r
+  IN  EMU_IO_THUNK_PROTOCOL   *This\r
+  )\r
+{\r
+  EMU_SIMPLE_FILE_SYSTEM_PRIVATE  *Private;\r
+\r
+  if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  Private = This->Private;\r
+\r
+  if (Private->FileHandlesOpen) {\r
+    //\r
+    // Close only supported if all the EFI_FILE_HANDLEs have been closed.\r
+    //\r
+    return EFI_NOT_READY;\r
+  }\r
+\r
+  if (This->Private != NULL) {\r
+    if (Private->VolumeLabel != NULL) {\r
+      free (Private->VolumeLabel);\r
+    }\r
+    free (This->Private);\r
+    This->Private = NULL;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo = {\r
+  &gEfiSimpleFileSystemProtocolGuid,\r
+  NULL,\r
+  NULL,\r
+  0,\r
+  GasketPosixFileSystmeThunkOpen,\r
+  GasketPosixFileSystmeThunkClose,\r
+  NULL\r
+};\r
+\r
+\r
index c60c298099e5f4e49e9b421d18f70be0600bfd00..cb9ffeea84a3e9ae4dab8c0747694bfe75c41e5a 100644 (file)
-/*++ @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\r
+ POSIX Pthreads to emulate APs and implement threads\r
+\r
+Copyright (c) 2011, Apple Inc. All rights reserved.\r
+Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+\r
+**/\r
+\r
+#include "Host.h"\r
+#include <pthread.h>\r
+\r
+\r
+UINTN\r
+EFIAPI\r
+PthreadMutexLock (\r
+  IN VOID *Mutex\r
+  )\r
+{\r
+  return (UINTN)pthread_mutex_lock ((pthread_mutex_t *)Mutex);\r
+}\r
+\r
+\r
+\r
+UINTN\r
+EFIAPI\r
+PthreadMutexUnLock (\r
+  IN VOID *Mutex\r
+  )\r
+{\r
+  return (UINTN)pthread_mutex_unlock ((pthread_mutex_t *)Mutex);\r
+}\r
+\r
+\r
+UINTN\r
+EFIAPI\r
+PthreadMutexTryLock (\r
+  IN VOID *Mutex\r
+  )\r
+{\r
+  return (UINTN)pthread_mutex_trylock ((pthread_mutex_t *)Mutex);\r
+}\r
+\r
+\r
+VOID *\r
+PthreadMutexInit (\r
+  IN VOID\r
+  )\r
+{\r
+  pthread_mutex_t *Mutex;\r
+  int             err;\r
+\r
+  Mutex = malloc (sizeof (pthread_mutex_t));\r
+  err = pthread_mutex_init (Mutex, NULL);\r
+  if (err == 0) {\r
+    return Mutex;\r
+  }\r
+\r
+  return NULL;\r
+}\r
+\r
+\r
+UINTN\r
+PthreadMutexDestroy (\r
+  IN VOID *Mutex\r
+  )\r
+{\r
+  if (Mutex != NULL) {\r
+    return pthread_mutex_destroy ((pthread_mutex_t *)Mutex);\r
+  }\r
+\r
+  return -1;\r
+}\r
+\r
+// Can't store this data on PthreadCreate stack so we need a global\r
+typedef struct {\r
+  pthread_mutex_t             Mutex;\r
+  THREAD_THUNK_THREAD_ENTRY   Start;\r
+} THREAD_MANGLE;\r
+\r
+THREAD_MANGLE mThreadMangle = {\r
+  PTHREAD_MUTEX_INITIALIZER,\r
+  NULL\r
+};\r
+\r
+VOID *\r
+SecFakePthreadStart (\r
+  VOID  *Context\r
+  )\r
+{\r
+  THREAD_THUNK_THREAD_ENTRY Start;\r
+  sigset_t                  SigMask;\r
+\r
+  // Save global on the stack before we unlock\r
+  Start   = mThreadMangle.Start;\r
+  pthread_mutex_unlock (&mThreadMangle.Mutex);\r
+\r
+  // Mask all signals to the APs\r
+  sigfillset (&SigMask);\r
+  pthread_sigmask (SIG_BLOCK, &SigMask, NULL);\r
+\r
+  //\r
+  // We have to start the thread in SEC as we need to follow\r
+  // OS X calling conventions. We can then call back into\r
+  // to the callers Start.\r
+  //\r
+  // This is a great example of how all problems in computer\r
+  // science can be solved by adding another level of indirection\r
+  //\r
+ return  (VOID *)ReverseGasketUint64 ((CALL_BACK)Start, (UINTN)Context);\r
+}\r
+\r
+UINTN\r
+PthreadCreate (\r
+  IN  VOID                      *Thread,\r
+  IN  VOID                      *Attribute,\r
+  IN  THREAD_THUNK_THREAD_ENTRY Start,\r
+  IN  VOID                      *Context\r
+  )\r
+{\r
+  int         err;\r
+  BOOLEAN     EnabledOnEntry;\r
+\r
+  //\r
+  // Threads inherit interrupt state so disable interrupts before we start thread\r
+  //\r
+  if (SecInterruptEanbled ()) {\r
+    SecDisableInterrupt ();\r
+    EnabledOnEntry = TRUE;\r
+  } else {\r
+    EnabledOnEntry = FALSE;\r
+  }\r
+\r
+  // Aquire lock for global, SecFakePthreadStart runs in a different thread.\r
+  pthread_mutex_lock (&mThreadMangle.Mutex);\r
+  mThreadMangle.Start   = Start;\r
+\r
+  err = pthread_create (Thread, Attribute, SecFakePthreadStart, Context);\r
+  if (err != 0) {\r
+    // Thread failed to launch so release the lock;\r
+    pthread_mutex_unlock (&mThreadMangle.Mutex);\r
+  }\r
+\r
+  if (EnabledOnEntry) {\r
+    // Restore interrupt state\r
+    SecEnableInterrupt ();\r
+  }\r
+\r
+  return err;\r
+}\r
+\r
+\r
+VOID\r
+PthreadExit (\r
+  IN VOID *ValuePtr\r
+  )\r
+{\r
+  pthread_exit (ValuePtr);\r
+  return;\r
+}\r
+\r
+\r
+UINTN\r
+PthreadSelf (\r
+  VOID\r
+  )\r
+{\r
+  // POSIX currently allows pthread_t to be a structure or arithmetic type.\r
+  // Check out sys/types.h to make sure this will work if you are porting.\r
+  // On OS X (Darwin) pthread_t is a pointer to a structure so this code works.\r
+  return (UINTN)pthread_self ();\r
+}\r
+\r
+\r
+EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {\r
+  GasketPthreadMutexLock,\r
+  GasketPthreadMutexUnLock,\r
+  GasketPthreadMutexTryLock,\r
+  GasketPthreadMutexInit,\r
+  GasketPthreadMutexDestroy,\r
+  GasketPthreadCreate,\r
+  GasketPthreadExit,\r
+  GasketPthreadSelf\r
+};\r
+\r
+\r
+EFI_STATUS\r
+PthreadOpen (\r
+  IN  EMU_IO_THUNK_PROTOCOL   *This\r
+  )\r
+{\r
+  if (This->Instance != 0) {\r
+    // Only single instance is supported\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  if (This->ConfigString[0] == L'0') {\r
+    // If AP count is zero no need for threads\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  This->Interface = &gPthreadThunk;\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+PthreadClose (\r
+  IN  EMU_IO_THUNK_PROTOCOL   *This\r
+  )\r
+{\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {\r
+  &gEmuThreadThunkProtocolGuid,\r
+  NULL,\r
+  NULL,\r
+  0,\r
+  GasketPthreadOpen,\r
+  GasketPthreadClose,\r
+  NULL\r
+};\r
+\r
+\r
index adb9b2b83037574b9f84b7c88f223267976f44c7..a3cc28c2235d7cee34297e9e3d1d5b3aeeb24b8c 100644 (file)
-/*++ @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\r
+\r
+Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>\r
+\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "Host.h"\r
+\r
+#include <sys/ipc.h>\r
+#include <sys/shm.h>\r
+\r
+#include <X11/Xlib.h>\r
+#include <X11/Xutil.h>\r
+#include <X11/Xos.h>\r
+#include <X11/extensions/XShm.h>\r
+#include <X11/keysym.h>\r
+#include <X11/cursorfont.h>\r
+\r
+#define KEYSYM_LOWER  0\r
+#define KEYSYM_UPPER  1\r
+\r
+\r
+struct uga_drv_shift_mask {\r
+  unsigned char shift;\r
+  unsigned char size;\r
+  unsigned char csize;\r
+};\r
+\r
+#define NBR_KEYS 32\r
+typedef struct {\r
+  EMU_GRAPHICS_WINDOW_PROTOCOL GraphicsIo;\r
+\r
+  Display     *display;\r
+  int         screen;      // values for window_size in main\r
+  Window      win;\r
+  GC          gc;\r
+  Visual      *visual;\r
+\r
+  int           depth;\r
+  unsigned int  width;\r
+  unsigned int  height;\r
+  unsigned int  line_bytes;\r
+  unsigned int  pixel_shift;\r
+  unsigned char *image_data;\r
+\r
+  struct uga_drv_shift_mask r, g, b;\r
+\r
+  int             use_shm;\r
+  XShmSegmentInfo xshm_info;\r
+  XImage          *image;\r
+  char            *Title;\r
+\r
+  unsigned int key_rd;\r
+  unsigned int key_wr;\r
+  unsigned int key_count;\r
+  EFI_KEY_DATA keys[NBR_KEYS];\r
+\r
+  EFI_KEY_STATE KeyState;\r
+\r
+  EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK    MakeRegisterdKeyCallback;\r
+  EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK    BreakRegisterdKeyCallback;\r
+  VOID                                                *RegisterdKeyCallbackContext;\r
+\r
+  int                        previous_x;\r
+  int                        previous_y;\r
+  EFI_SIMPLE_POINTER_STATE   pointer_state;\r
+  int                        pointer_state_changed;\r
+} GRAPHICS_IO_PRIVATE;\r
+\r
+void\r
+HandleEvents(\r
+  IN GRAPHICS_IO_PRIVATE *Drv\r
+  );\r
+\r
+void\r
+fill_shift_mask (\r
+  IN  struct uga_drv_shift_mask *sm,\r
+  IN  unsigned long             mask\r
+  )\r
+{\r
+  sm->shift = 0;\r
+  sm->size = 0;\r
+  while ((mask & 1) == 0) {\r
+    mask >>= 1;\r
+    sm->shift++;\r
+  }\r
+  while (mask & 1) {\r
+    sm->size++;\r
+    mask >>= 1;\r
+  }\r
+  sm->csize = 8 - sm->size;\r
+}\r
+\r
+int\r
+TryCreateShmImage (\r
+  IN  GRAPHICS_IO_PRIVATE *Drv\r
+  )\r
+{\r
+  Drv->image = XShmCreateImage (\r
+                 Drv->display, Drv->visual,\r
+                 Drv->depth, ZPixmap, NULL, &Drv->xshm_info,\r
+                 Drv->width, Drv->height\r
+                 );\r
+  if (Drv->image == NULL) {\r
+    return 0;\r
+  }\r
+\r
+  switch (Drv->image->bitmap_unit) {\r
+  case 32:\r
+    Drv->pixel_shift = 2;\r
+    break;\r
+  case 16:\r
+    Drv->pixel_shift = 1;\r
+    break;\r
+  case 8:\r
+    Drv->pixel_shift = 0;\r
+    break;\r
+  }\r
+\r
+  Drv->xshm_info.shmid = shmget (\r
+                          IPC_PRIVATE, Drv->image->bytes_per_line * Drv->image->height,\r
+                          IPC_CREAT | 0777\r
+                          );\r
+  if (Drv->xshm_info.shmid < 0) {\r
+    XDestroyImage(Drv->image);\r
+    return 0;\r
+  }\r
+\r
+  Drv->image_data = shmat (Drv->xshm_info.shmid, NULL, 0);\r
+  if(!Drv->image_data) {\r
+    shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);\r
+    XDestroyImage(Drv->image);\r
+    return 0;\r
+  }\r
+\r
+#ifndef __APPLE__\r
+  //\r
+  // This closes shared memory in real time on OS X. Only closes after folks quit using\r
+  // it on Linux.\r
+  //\r
+  shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);\r
+#endif\r
+\r
+  Drv->xshm_info.shmaddr = (char*)Drv->image_data;\r
+  Drv->image->data = (char*)Drv->image_data;\r
+\r
+  if (!XShmAttach (Drv->display, &Drv->xshm_info)) {\r
+    shmdt (Drv->image_data);\r
+    XDestroyImage(Drv->image);\r
+    return 0;\r
+  }\r
+  return 1;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+X11Size (\r
+  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsIo,\r
+  IN  UINT32                        Width,\r
+  IN  UINT32                        Height\r
+  )\r
+{\r
+  GRAPHICS_IO_PRIVATE *Drv;\r
+  XSizeHints          size_hints;\r
+\r
+  // Destroy current buffer if created.\r
+  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;\r
+  if (Drv->image != NULL) {\r
+    // Before destroy buffer, need to make sure the buffer available for access.\r
+    XDestroyImage (Drv->image);\r
+\r
+    if (Drv->use_shm) {\r
+      shmdt (Drv->image_data);\r
+    }\r
+\r
+    Drv->image_data = NULL;\r
+    Drv->image = NULL;\r
+  }\r
+\r
+  Drv->width = Width;\r
+  Drv->height = Height;\r
+  XResizeWindow (Drv->display, Drv->win, Width, Height);\r
+\r
+  // Allocate image.\r
+  if (XShmQueryExtension(Drv->display) && TryCreateShmImage(Drv)) {\r
+    Drv->use_shm = 1;\r
+  } else {\r
+    Drv->use_shm = 0;\r
+    if (Drv->depth > 16) {\r
+      Drv->pixel_shift = 2;\r
+    } else if (Drv->depth > 8) {\r
+      Drv->pixel_shift = 1;\r
+    } else {\r
+      Drv->pixel_shift = 0;\r
+    }\r
+\r
+    Drv->image_data = malloc ((Drv->width * Drv->height) << Drv->pixel_shift);\r
+    Drv->image = XCreateImage (\r
+                    Drv->display, Drv->visual, Drv->depth,\r
+                    ZPixmap, 0, (char *)Drv->image_data,\r
+                    Drv->width, Drv->height,\r
+                    8 << Drv->pixel_shift, 0\r
+                    );\r
+  }\r
+\r
+  Drv->line_bytes = Drv->image->bytes_per_line;\r
+\r
+  fill_shift_mask (&Drv->r, Drv->image->red_mask);\r
+  fill_shift_mask (&Drv->g, Drv->image->green_mask);\r
+  fill_shift_mask (&Drv->b, Drv->image->blue_mask);\r
+\r
+  // Set WM hints.\r
+  size_hints.flags = PSize | PMinSize | PMaxSize;\r
+  size_hints.min_width = size_hints.max_width = size_hints.base_width = Width;\r
+  size_hints.min_height = size_hints.max_height = size_hints.base_height = Height;\r
+  XSetWMNormalHints (Drv->display, Drv->win, &size_hints);\r
+\r
+  XMapWindow (Drv->display, Drv->win);\r
+  HandleEvents (Drv);\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+void\r
+handleKeyEvent (\r
+  IN  GRAPHICS_IO_PRIVATE *Drv,\r
+  IN  XEvent              *ev,\r
+  IN  BOOLEAN             Make\r
+  )\r
+{\r
+  KeySym        *KeySym;\r
+  EFI_KEY_DATA  KeyData;\r
+  int           KeySymArraySize;\r
+\r
+  if (Make) {\r
+    if (Drv->key_count == NBR_KEYS) {\r
+      return;\r
+    }\r
+  }\r
+\r
+  // keycode is a physical key on the keyboard\r
+  // KeySym is a mapping of a physical key\r
+  // KeyboardMapping is the array of KeySym for a given keycode. key, shifted key, option key, command key, ...\r
+  //\r
+  // Returns an array of KeySymArraySize of KeySym for the keycode. [0] is lower case, [1] is upper case,\r
+  // [2] and [3] are based on option and command modifiers. The problem we have is command V\r
+  // could be mapped to a crazy Unicode character so the old scheme of returning a string.\r
+  //\r
+  KeySym = XGetKeyboardMapping (Drv->display, ev->xkey.keycode, 1, &KeySymArraySize);\r
+\r
+  KeyData.Key.ScanCode = 0;\r
+  KeyData.Key.UnicodeChar = 0;\r
+  KeyData.KeyState.KeyShiftState = 0;\r
+\r
+  //\r
+  // Skipping EFI_SCROLL_LOCK_ACTIVE & EFI_NUM_LOCK_ACTIVE since they are not on Macs\r
+  //\r
+  if ((ev->xkey.state & LockMask) == 0) {\r
+    Drv->KeyState.KeyToggleState &= ~EFI_CAPS_LOCK_ACTIVE;\r
+  } else {\r
+    if (Make) {\r
+      Drv->KeyState.KeyToggleState |= EFI_CAPS_LOCK_ACTIVE;\r
+    }\r
+  }\r
+\r
+  // Skipping EFI_MENU_KEY_PRESSED and EFI_SYS_REQ_PRESSED\r
+\r
+  switch (*KeySym) {\r
+  case XK_Control_R:\r
+    if (Make) {\r
+      Drv->KeyState.KeyShiftState |=  EFI_RIGHT_CONTROL_PRESSED;\r
+    } else {\r
+      Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_CONTROL_PRESSED;\r
+    }\r
+   break;\r
+  case XK_Control_L:\r
+    if (Make) {\r
+      Drv->KeyState.KeyShiftState |=  EFI_LEFT_CONTROL_PRESSED;\r
+    } else {\r
+      Drv->KeyState.KeyShiftState &= ~EFI_LEFT_CONTROL_PRESSED;\r
+    }\r
+    break;\r
+\r
+  case XK_Shift_R:\r
+    if (Make) {\r
+      Drv->KeyState.KeyShiftState |=  EFI_RIGHT_SHIFT_PRESSED;\r
+    } else {\r
+      Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_SHIFT_PRESSED;\r
+    }\r
+    break;\r
+  case XK_Shift_L:\r
+    if (Make) {\r
+      Drv->KeyState.KeyShiftState |=  EFI_LEFT_SHIFT_PRESSED;\r
+    } else {\r
+      Drv->KeyState.KeyShiftState &= ~EFI_LEFT_SHIFT_PRESSED;\r
+    }\r
+    break;\r
+\r
+  case XK_Mode_switch:\r
+    if (Make) {\r
+      Drv->KeyState.KeyShiftState |=  EFI_LEFT_ALT_PRESSED;\r
+    } else {\r
+      Drv->KeyState.KeyShiftState &= ~EFI_LEFT_ALT_PRESSED;\r
+    }\r
+    break;\r
+\r
+  case XK_Meta_R:\r
+    if (Make) {\r
+      Drv->KeyState.KeyShiftState |=  EFI_RIGHT_LOGO_PRESSED;\r
+    } else {\r
+      Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_LOGO_PRESSED;\r
+    }\r
+    break;\r
+  case XK_Meta_L:\r
+    if (Make) {\r
+      Drv->KeyState.KeyShiftState |=  EFI_LEFT_LOGO_PRESSED;\r
+    } else {\r
+      Drv->KeyState.KeyShiftState &= ~EFI_LEFT_LOGO_PRESSED;\r
+    }\r
+    break;\r
+\r
+  case XK_KP_Home:\r
+  case XK_Home:       KeyData.Key.ScanCode = SCAN_HOME;       break;\r
+\r
+  case XK_KP_End:\r
+  case XK_End:        KeyData.Key.ScanCode = SCAN_END;        break;\r
+\r
+  case XK_KP_Left:\r
+  case XK_Left:       KeyData.Key.ScanCode = SCAN_LEFT;       break;\r
+\r
+  case XK_KP_Right:\r
+  case XK_Right:      KeyData.Key.ScanCode = SCAN_RIGHT;      break;\r
+\r
+  case XK_KP_Up:\r
+  case XK_Up:         KeyData.Key.ScanCode = SCAN_UP;         break;\r
+\r
+  case XK_KP_Down:\r
+  case XK_Down:       KeyData.Key.ScanCode = SCAN_DOWN;       break;\r
+\r
+  case XK_KP_Delete:\r
+  case XK_Delete:       KeyData.Key.ScanCode = SCAN_DELETE;     break;\r
+\r
+  case XK_KP_Insert:\r
+  case XK_Insert:     KeyData.Key.ScanCode = SCAN_INSERT;     break;\r
+\r
+  case XK_KP_Page_Up:\r
+  case XK_Page_Up:    KeyData.Key.ScanCode = SCAN_PAGE_UP;    break;\r
+\r
+  case XK_KP_Page_Down:\r
+  case XK_Page_Down:  KeyData.Key.ScanCode = SCAN_PAGE_DOWN;  break;\r
+\r
+  case XK_Escape:     KeyData.Key.ScanCode = SCAN_ESC;        break;\r
+\r
+  case XK_Pause:      KeyData.Key.ScanCode = SCAN_PAUSE;      break;\r
+\r
+  case XK_KP_F1:\r
+  case XK_F1:   KeyData.Key.ScanCode = SCAN_F1;   break;\r
+\r
+  case XK_KP_F2:\r
+  case XK_F2:   KeyData.Key.ScanCode = SCAN_F2;   break;\r
+\r
+  case XK_KP_F3:\r
+  case XK_F3:   KeyData.Key.ScanCode = SCAN_F3;   break;\r
+\r
+  case XK_KP_F4:\r
+  case XK_F4:   KeyData.Key.ScanCode = SCAN_F4;   break;\r
+\r
+  case XK_F5:   KeyData.Key.ScanCode = SCAN_F5;   break;\r
+  case XK_F6:   KeyData.Key.ScanCode = SCAN_F6;   break;\r
+  case XK_F7:   KeyData.Key.ScanCode = SCAN_F7;   break;\r
+\r
+  // Don't map into X11 by default on a Mac\r
+  // System Preferences->Keyboard->Keyboard Shortcuts can be configured\r
+  // to not use higher function keys as shortcuts and the will show up\r
+  // in X11.\r
+  case XK_F8:   KeyData.Key.ScanCode = SCAN_F8;   break;\r
+  case XK_F9:   KeyData.Key.ScanCode = SCAN_F9;   break;\r
+  case XK_F10:  KeyData.Key.ScanCode = SCAN_F10;  break;\r
+\r
+  case XK_F11:  KeyData.Key.ScanCode = SCAN_F11;  break;\r
+  case XK_F12:  KeyData.Key.ScanCode = SCAN_F12;  break;\r
+\r
+  case XK_F13:  KeyData.Key.ScanCode = SCAN_F13;  break;\r
+  case XK_F14:  KeyData.Key.ScanCode = SCAN_F14;  break;\r
+  case XK_F15:  KeyData.Key.ScanCode = SCAN_F15;  break;\r
+  case XK_F16:  KeyData.Key.ScanCode = SCAN_F16;  break;\r
+  case XK_F17:  KeyData.Key.ScanCode = SCAN_F17;  break;\r
+  case XK_F18:  KeyData.Key.ScanCode = SCAN_F18;  break;\r
+  case XK_F19:  KeyData.Key.ScanCode = SCAN_F19;  break;\r
+  case XK_F20:  KeyData.Key.ScanCode = SCAN_F20;  break;\r
+  case XK_F21:  KeyData.Key.ScanCode = SCAN_F21;  break;\r
+  case XK_F22:  KeyData.Key.ScanCode = SCAN_F22;  break;\r
+  case XK_F23:  KeyData.Key.ScanCode = SCAN_F23;  break;\r
+  case XK_F24:  KeyData.Key.ScanCode = SCAN_F24;  break;\r
+\r
+  // No mapping in X11\r
+  //case XK_:   KeyData.Key.ScanCode = SCAN_MUTE;            break;\r
+  //case XK_:   KeyData.Key.ScanCode = SCAN_VOLUME_UP;       break;\r
+  //case XK_:   KeyData.Key.ScanCode = SCAN_VOLUME_DOWN;     break;\r
+  //case XK_:   KeyData.Key.ScanCode = SCAN_BRIGHTNESS_UP;   break;\r
+  //case XK_:   KeyData.Key.ScanCode = SCAN_BRIGHTNESS_DOWN; break;\r
+  //case XK_:   KeyData.Key.ScanCode = SCAN_SUSPEND;         break;\r
+  //case XK_:   KeyData.Key.ScanCode = SCAN_HIBERNATE;       break;\r
+  //case XK_:   KeyData.Key.ScanCode = SCAN_TOGGLE_DISPLAY;  break;\r
+  //case XK_:   KeyData.Key.ScanCode = SCAN_RECOVERY;        break;\r
+  //case XK_:   KeyData.Key.ScanCode = SCAN_EJECT;           break;\r
+\r
+  case XK_BackSpace:  KeyData.Key.UnicodeChar = 0x0008; break;\r
+\r
+  case XK_KP_Tab:\r
+  case XK_Tab:        KeyData.Key.UnicodeChar = 0x0009; break;\r
+\r
+  case XK_Linefeed:   KeyData.Key.UnicodeChar = 0x000a; break;\r
+\r
+  case XK_KP_Enter:\r
+  case XK_Return:     KeyData.Key.UnicodeChar = 0x000d; break;\r
+\r
+  case XK_KP_Equal      : KeyData.Key.UnicodeChar = L'='; break;\r
+  case XK_KP_Multiply   : KeyData.Key.UnicodeChar = L'*'; break;\r
+  case XK_KP_Add        : KeyData.Key.UnicodeChar = L'+'; break;\r
+  case XK_KP_Separator  : KeyData.Key.UnicodeChar = L'~'; break;\r
+  case XK_KP_Subtract   : KeyData.Key.UnicodeChar = L'-'; break;\r
+  case XK_KP_Decimal    : KeyData.Key.UnicodeChar = L'.'; break;\r
+  case XK_KP_Divide     : KeyData.Key.UnicodeChar = L'/'; break;\r
+\r
+  case XK_KP_0    : KeyData.Key.UnicodeChar = L'0'; break;\r
+  case XK_KP_1    : KeyData.Key.UnicodeChar = L'1'; break;\r
+  case XK_KP_2    : KeyData.Key.UnicodeChar = L'2'; break;\r
+  case XK_KP_3    : KeyData.Key.UnicodeChar = L'3'; break;\r
+  case XK_KP_4    : KeyData.Key.UnicodeChar = L'4'; break;\r
+  case XK_KP_5    : KeyData.Key.UnicodeChar = L'5'; break;\r
+  case XK_KP_6    : KeyData.Key.UnicodeChar = L'6'; break;\r
+  case XK_KP_7    : KeyData.Key.UnicodeChar = L'7'; break;\r
+  case XK_KP_8    : KeyData.Key.UnicodeChar = L'8'; break;\r
+  case XK_KP_9    : KeyData.Key.UnicodeChar = L'9'; break;\r
+\r
+  default:\r
+    ;\r
+  }\r
+\r
+  // The global state is our state\r
+  KeyData.KeyState.KeyShiftState = Drv->KeyState.KeyShiftState;\r
+  KeyData.KeyState.KeyToggleState = Drv->KeyState.KeyToggleState;\r
+\r
+  if (*KeySym < XK_BackSpace) {\r
+    if (((Drv->KeyState.KeyShiftState & (EFI_LEFT_SHIFT_PRESSED | EFI_RIGHT_SHIFT_PRESSED)) != 0) ||\r
+        ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) != 0) ) {\r
+\r
+      KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_UPPER];\r
+\r
+      // Per UEFI spec since we converted the Unicode clear the shift bits we pass up\r
+      KeyData.KeyState.KeyShiftState &= ~(EFI_LEFT_SHIFT_PRESSED | EFI_RIGHT_SHIFT_PRESSED);\r
+    } else {\r
+      KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_LOWER];\r
+    }\r
+  } else {\r
+    // XK_BackSpace is the start of XK_MISCELLANY. These are the XK_? keys we process in this file\r
+    ;\r
+  }\r
+\r
+  if (Make) {\r
+    memcpy (&Drv->keys[Drv->key_wr], &KeyData, sizeof (EFI_KEY_DATA));\r
+    Drv->key_wr = (Drv->key_wr + 1) % NBR_KEYS;\r
+    Drv->key_count++;\r
+    if (Drv->MakeRegisterdKeyCallback != NULL) {\r
+      ReverseGasketUint64Uint64 (Drv->MakeRegisterdKeyCallback ,Drv->RegisterdKeyCallbackContext, &KeyData);\r
+    }\r
+  } else {\r
+    if (Drv->BreakRegisterdKeyCallback != NULL) {\r
+      ReverseGasketUint64Uint64 (Drv->BreakRegisterdKeyCallback ,Drv->RegisterdKeyCallbackContext, &KeyData);\r
+    }\r
+  }\r
+}\r
+\r
+\r
+void\r
+handleMouseMoved(\r
+  IN  GRAPHICS_IO_PRIVATE   *Drv,\r
+  IN  XEvent                *ev\r
+  )\r
+{\r
+  if (ev->xmotion.x != Drv->previous_x) {\r
+    Drv->pointer_state.RelativeMovementX += ( ev->xmotion.x - Drv->previous_x );\r
+    Drv->previous_x = ev->xmotion.x;\r
+    Drv->pointer_state_changed = 1;\r
+  }\r
+\r
+  if (ev->xmotion.y != Drv->previous_y) {\r
+    Drv->pointer_state.RelativeMovementY += ( ev->xmotion.y - Drv->previous_y );\r
+    Drv->previous_y = ev->xmotion.y;\r
+    Drv->pointer_state_changed = 1;\r
+  }\r
+\r
+  Drv->pointer_state.RelativeMovementZ = 0;\r
+}\r
+\r
+void\r
+handleMouseDown (\r
+  IN  GRAPHICS_IO_PRIVATE *Drv,\r
+  IN  XEvent              *ev,\r
+  IN  BOOLEAN             Pressed\r
+  )\r
+{\r
+  if (ev->xbutton.button == Button1) {\r
+    Drv->pointer_state_changed = (Drv->pointer_state.LeftButton != Pressed);\r
+    Drv->pointer_state.LeftButton = Pressed;\r
+  }\r
+  if ( ev->xbutton.button == Button2 ) {\r
+    Drv->pointer_state_changed = (Drv->pointer_state.RightButton != Pressed);\r
+    Drv->pointer_state.RightButton = Pressed;\r
+  }\r
+}\r
+\r
+void\r
+Redraw (\r
+  IN  GRAPHICS_IO_PRIVATE *Drv,\r
+  IN  UINTN               X,\r
+  IN  UINTN               Y,\r
+  IN  UINTN               Width,\r
+  IN  UINTN               Height\r
+  )\r
+{\r
+  if (Drv->use_shm) {\r
+    XShmPutImage (\r
+      Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height, False\r
+      );\r
+  } else {\r
+    XPutImage (\r
+      Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height\r
+      );\r
+  }\r
+  XFlush(Drv->display);\r
+}\r
+\r
+void\r
+HandleEvent(GRAPHICS_IO_PRIVATE *Drv, XEvent *ev)\r
+{\r
+  switch (ev->type) {\r
+  case Expose:\r
+    Redraw (Drv, ev->xexpose.x, ev->xexpose.y,\r
+      ev->xexpose.width, ev->xexpose.height);\r
+    break;\r
+  case GraphicsExpose:\r
+    Redraw (Drv, ev->xgraphicsexpose.x, ev->xgraphicsexpose.y,\r
+      ev->xgraphicsexpose.width, ev->xgraphicsexpose.height);\r
+    break;\r
+  case KeyPress:\r
+    handleKeyEvent (Drv, ev, TRUE);\r
+    break;\r
+  case KeyRelease:\r
+    handleKeyEvent (Drv, ev, FALSE);\r
+    break;\r
+  case MappingNotify:\r
+    XRefreshKeyboardMapping (&ev->xmapping);\r
+    break;\r
+  case MotionNotify:\r
+    handleMouseMoved (Drv, ev);\r
+    break;\r
+  case ButtonPress:\r
+    handleMouseDown (Drv, ev, TRUE);\r
+  break;\r
+  case ButtonRelease:\r
+    handleMouseDown (Drv, ev, FALSE);\r
+  break;\r
+#if 0\r
+  case DestroyNotify:\r
+    XCloseDisplay (Drv->display);\r
+    exit (1);\r
+    break;\r
+#endif\r
+  case NoExpose:\r
+  default:\r
+    break;\r
+  }\r
+}\r
+\r
+void\r
+HandleEvents (\r
+  IN  GRAPHICS_IO_PRIVATE *Drv\r
+  )\r
+{\r
+  XEvent ev;\r
+\r
+  while (XPending (Drv->display) != 0) {\r
+    XNextEvent (Drv->display, &ev);\r
+    HandleEvent (Drv, &ev);\r
+  }\r
+}\r
+\r
+unsigned long\r
+X11PixelToColor (\r
+  IN  GRAPHICS_IO_PRIVATE *Drv,\r
+  IN  EFI_UGA_PIXEL       pixel\r
+  )\r
+{\r
+  return ((pixel.Red   >> Drv->r.csize) << Drv->r.shift)\r
+       | ((pixel.Green >> Drv->g.csize) << Drv->g.shift)\r
+       | ((pixel.Blue  >> Drv->b.csize) << Drv->b.shift);\r
+}\r
+\r
+EFI_UGA_PIXEL\r
+X11ColorToPixel (\r
+  IN  GRAPHICS_IO_PRIVATE *Drv,\r
+  IN  unsigned long       val\r
+  )\r
+{\r
+  EFI_UGA_PIXEL Pixel;\r
+\r
+  memset (&Pixel, 0, sizeof (EFI_UGA_PIXEL));\r
+\r
+  // Truncation not an issue since X11 and EFI are both using 8 bits per color\r
+  Pixel.Red =   (val >> Drv->r.shift) << Drv->r.csize;\r
+  Pixel.Green = (val >> Drv->g.shift) << Drv->g.csize;\r
+  Pixel.Blue =  (val >> Drv->b.shift) << Drv->b.csize;\r
+\r
+  return Pixel;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+X11CheckKey (\r
+  IN  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo\r
+  )\r
+{\r
+  GRAPHICS_IO_PRIVATE  *Drv;\r
+\r
+  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;\r
+\r
+  HandleEvents (Drv);\r
+\r
+  if (Drv->key_count != 0) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  return EFI_NOT_READY;\r
+}\r
+\r
+EFI_STATUS\r
+X11GetKey (\r
+  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsIo,\r
+  IN  EFI_KEY_DATA                  *KeyData\r
+  )\r
+{\r
+  EFI_STATUS          EfiStatus;\r
+  GRAPHICS_IO_PRIVATE *Drv;\r
+\r
+  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;\r
+\r
+  EfiStatus = X11CheckKey (GraphicsIo);\r
+  if (EFI_ERROR (EfiStatus)) {\r
+    return EfiStatus;\r
+  }\r
+\r
+  CopyMem (KeyData, &Drv->keys[Drv->key_rd], sizeof (EFI_KEY_DATA));\r
+  Drv->key_rd = (Drv->key_rd + 1) % NBR_KEYS;\r
+  Drv->key_count--;\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+X11KeySetState (\r
+  IN EMU_GRAPHICS_WINDOW_PROTOCOL   *GraphicsIo,\r
+  IN EFI_KEY_TOGGLE_STATE           *KeyToggleState\r
+  )\r
+{\r
+  GRAPHICS_IO_PRIVATE  *Drv;\r
+\r
+  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;\r
+\r
+  if (*KeyToggleState & EFI_CAPS_LOCK_ACTIVE) {\r
+    if ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) == 0) {\r
+      //\r
+      // We could create an XKeyEvent and send a XK_Caps_Lock to\r
+      // the UGA/GOP Window\r
+      //\r
+    }\r
+  }\r
+\r
+  Drv->KeyState.KeyToggleState = *KeyToggleState;\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+X11RegisterKeyNotify (\r
+  IN EMU_GRAPHICS_WINDOW_PROTOCOL                        *GraphicsIo,\r
+  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK    MakeCallBack,\r
+  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK    BreakCallBack,\r
+  IN VOID                                                *Context\r
+  )\r
+{\r
+  GRAPHICS_IO_PRIVATE  *Drv;\r
+\r
+  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;\r
+\r
+  Drv->MakeRegisterdKeyCallback    = MakeCallBack;\r
+  Drv->BreakRegisterdKeyCallback   = BreakCallBack;\r
+  Drv->RegisterdKeyCallbackContext = Context;\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+X11Blt (\r
+  IN EMU_GRAPHICS_WINDOW_PROTOCOL             *GraphicsIo,\r
+  IN  EFI_UGA_PIXEL                           *BltBuffer OPTIONAL,\r
+  IN  EFI_UGA_BLT_OPERATION                   BltOperation,\r
+  IN  EMU_GRAPHICS_WINDOWS__BLT_ARGS          *Args\r
+  )\r
+{\r
+  GRAPHICS_IO_PRIVATE *Private;\r
+  UINTN             DstY;\r
+  UINTN             SrcY;\r
+  UINTN             DstX;\r
+  UINTN             SrcX;\r
+  UINTN             Index;\r
+  EFI_UGA_PIXEL     *Blt;\r
+  UINT8             *Dst;\r
+  UINT8             *Src;\r
+  UINTN             Nbr;\r
+  unsigned long     Color;\r
+  XEvent            ev;\r
+\r
+  Private = (GRAPHICS_IO_PRIVATE *)GraphicsIo;\r
+\r
+\r
+  //\r
+  //  Check bounds\r
+  //\r
+  if (BltOperation == EfiUgaVideoToBltBuffer\r
+      || BltOperation == EfiUgaVideoToVideo) {\r
+    //\r
+    // Source is Video.\r
+    //\r
+    if (Args->SourceY + Args->Height > Private->height) {\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+\r
+    if (Args->SourceX + Args->Width > Private->width) {\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+  }\r
+\r
+  if (BltOperation == EfiUgaBltBufferToVideo\r
+      || BltOperation == EfiUgaVideoToVideo\r
+      || BltOperation == EfiUgaVideoFill) {\r
+    //\r
+    // Destination is Video\r
+    //\r
+    if (Args->DestinationY + Args->Height > Private->height) {\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+\r
+    if (Args->DestinationX + Args->Width > Private->width) {\r
+      return EFI_INVALID_PARAMETER;\r
+    }\r
+  }\r
+\r
+  switch (BltOperation) {\r
+  case EfiUgaVideoToBltBuffer:\r
+    Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->DestinationY * Args->Delta) + Args->DestinationX * sizeof (EFI_UGA_PIXEL));\r
+    Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);\r
+    for (SrcY = Args->SourceY; SrcY < (Args->Height + Args->SourceY); SrcY++) {\r
+      for (SrcX = Args->SourceX; SrcX < (Args->Width + Args->SourceX); SrcX++) {\r
+        *Blt++ = X11ColorToPixel (Private, XGetPixel (Private->image, SrcX, SrcY));\r
+      }\r
+      Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);\r
+    }\r
+    break;\r
+  case EfiUgaBltBufferToVideo:\r
+    Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->SourceY * Args->Delta) + Args->SourceX * sizeof (EFI_UGA_PIXEL));\r
+    Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);\r
+    for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY); DstY++) {\r
+      for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX); DstX++) {\r
+        XPutPixel(Private->image, DstX, DstY, X11PixelToColor(Private, *Blt));\r
+        Blt++;\r
+      }\r
+      Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);\r
+    }\r
+    break;\r
+  case EfiUgaVideoToVideo:\r
+    Dst = Private->image_data + (Args->DestinationX << Private->pixel_shift)\r
+          + Args->DestinationY * Private->line_bytes;\r
+    Src = Private->image_data + (Args->SourceX << Private->pixel_shift)\r
+          + Args->SourceY * Private->line_bytes;\r
+    Nbr = Args->Width << Private->pixel_shift;\r
+    if (Args->DestinationY < Args->SourceY) {\r
+      for (Index = 0; Index < Args->Height; Index++) {\r
+        memcpy (Dst, Src, Nbr);\r
+        Dst += Private->line_bytes;\r
+        Src += Private->line_bytes;\r
+      }\r
+    } else {\r
+      Dst += (Args->Height - 1) * Private->line_bytes;\r
+      Src += (Args->Height - 1) * Private->line_bytes;\r
+      for (Index = 0; Index < Args->Height; Index++) {\r
+      //\r
+      // Source and Destination Y may be equal, therefore Dst and Src may\r
+      // overlap.\r
+      //\r
+      memmove (Dst, Src, Nbr);\r
+      Dst -= Private->line_bytes;\r
+      Src -= Private->line_bytes;\r
+      }\r
+    }\r
+    break;\r
+  case EfiUgaVideoFill:\r
+    Color = X11PixelToColor(Private, *BltBuffer);\r
+    for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY); DstY++) {\r
+      for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX); DstX++) {\r
+        XPutPixel(Private->image, DstX, DstY, Color);\r
+      }\r
+    }\r
+    break;\r
+  default:\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  //\r
+  //  Refresh screen.\r
+  //\r
+  switch (BltOperation) {\r
+  case EfiUgaVideoToVideo:\r
+    XCopyArea(\r
+      Private->display, Private->win, Private->win, Private->gc,\r
+      Args->SourceX, Args->SourceY, Args->Width, Args->Height,\r
+      Args->DestinationX, Args->DestinationY\r
+      );\r
+\r
+    while (1) {\r
+      XNextEvent (Private->display, &ev);\r
+      HandleEvent (Private, &ev);\r
+      if (ev.type == NoExpose || ev.type == GraphicsExpose) {\r
+        break;\r
+      }\r
+    }\r
+    break;\r
+  case EfiUgaVideoFill:\r
+    Color = X11PixelToColor (Private, *BltBuffer);\r
+    XSetForeground (Private->display, Private->gc, Color);\r
+    XFillRectangle (\r
+      Private->display, Private->win, Private->gc,\r
+      Args->DestinationX, Args->DestinationY, Args->Width, Args->Height\r
+      );\r
+    XFlush (Private->display);\r
+    break;\r
+  case EfiUgaBltBufferToVideo:\r
+    Redraw (Private, Args->DestinationX, Args->DestinationY, Args->Width, Args->Height);\r
+    break;\r
+  default:\r
+    break;\r
+  }\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+X11CheckPointer (\r
+  IN  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo\r
+  )\r
+{\r
+  GRAPHICS_IO_PRIVATE  *Drv;\r
+\r
+  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;\r
+\r
+  HandleEvents (Drv);\r
+  if (Drv->pointer_state_changed != 0) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  return EFI_NOT_READY;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+X11GetPointerState (\r
+  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsIo,\r
+  IN  EFI_SIMPLE_POINTER_STATE      *State\r
+  )\r
+{\r
+  EFI_STATUS          EfiStatus;\r
+  GRAPHICS_IO_PRIVATE *Drv;\r
+\r
+  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;\r
+\r
+  EfiStatus = X11CheckPointer (GraphicsIo);\r
+  if (EfiStatus != EFI_SUCCESS) {\r
+    return EfiStatus;\r
+  }\r
+\r
+  memcpy (State, &Drv->pointer_state, sizeof (EFI_SIMPLE_POINTER_STATE));\r
+\r
+  Drv->pointer_state.RelativeMovementX = 0;\r
+  Drv->pointer_state.RelativeMovementY = 0;\r
+  Drv->pointer_state.RelativeMovementZ = 0;\r
+  Drv->pointer_state_changed = 0;\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+\r
+EFI_STATUS\r
+X11GraphicsWindowOpen (\r
+  IN  EMU_IO_THUNK_PROTOCOL   *This\r
+  )\r
+{\r
+  GRAPHICS_IO_PRIVATE *Drv;\r
+  unsigned int        border_width = 0;\r
+  char                *display_name = NULL;\r
+\r
+  Drv = (GRAPHICS_IO_PRIVATE *)calloc (1, sizeof (GRAPHICS_IO_PRIVATE));\r
+  if (Drv == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  Drv->GraphicsIo.Size                = GasketX11Size;\r
+  Drv->GraphicsIo.CheckKey            = GasketX11CheckKey;\r
+  Drv->GraphicsIo.GetKey              = GasketX11GetKey;\r
+  Drv->GraphicsIo.KeySetState         = GasketX11KeySetState;\r
+  Drv->GraphicsIo.RegisterKeyNotify   = GasketX11RegisterKeyNotify;\r
+  Drv->GraphicsIo.Blt                 = GasketX11Blt;\r
+  Drv->GraphicsIo.CheckPointer        = GasketX11CheckPointer;\r
+  Drv->GraphicsIo.GetPointerState     = GasketX11GetPointerState;\r
+\r
+\r
+  Drv->key_count = 0;\r
+  Drv->key_rd = 0;\r
+  Drv->key_wr = 0;\r
+  Drv->KeyState.KeyShiftState      = EFI_SHIFT_STATE_VALID;\r
+  Drv->KeyState.KeyToggleState     = EFI_TOGGLE_STATE_VALID;\r
+  Drv->MakeRegisterdKeyCallback    = NULL;\r
+  Drv->BreakRegisterdKeyCallback   = NULL;\r
+  Drv->RegisterdKeyCallbackContext = NULL;\r
+\r
+\r
+  Drv->display = XOpenDisplay (display_name);\r
+  if (Drv->display == NULL) {\r
+    fprintf (stderr, "uga: cannot connect to X server %s\n", XDisplayName (display_name));\r
+    free (Drv);\r
+    return EFI_DEVICE_ERROR;\r
+  }\r
+  Drv->screen = DefaultScreen (Drv->display);\r
+  Drv->visual = DefaultVisual (Drv->display, Drv->screen);\r
+  Drv->win = XCreateSimpleWindow (\r
+                Drv->display, RootWindow (Drv->display, Drv->screen),\r
+                0, 0, 4, 4, border_width,\r
+                WhitePixel (Drv->display, Drv->screen),\r
+                BlackPixel (Drv->display, Drv->screen)\r
+                );\r
+\r
+  Drv->depth = DefaultDepth (Drv->display, Drv->screen);\r
+  XDefineCursor (Drv->display, Drv->win, XCreateFontCursor (Drv->display, XC_pirate));\r
+\r
+  Drv->Title = malloc (StrSize (This->ConfigString));\r
+  UnicodeStrToAsciiStr (This->ConfigString, Drv->Title);\r
+  XStoreName (Drv->display, Drv->win, Drv->Title);\r
+\r
+//  XAutoRepeatOff (Drv->display);\r
+  XSelectInput (\r
+    Drv->display, Drv->win,\r
+    ExposureMask | KeyPressMask | KeyReleaseMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask\r
+    );\r
+  Drv->gc = DefaultGC (Drv->display, Drv->screen);\r
+\r
+  This->Private   = (VOID *)Drv;\r
+  This->Interface = (VOID *)Drv;\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+X11GraphicsWindowClose (\r
+  IN  EMU_IO_THUNK_PROTOCOL   *This\r
+  )\r
+{\r
+  GRAPHICS_IO_PRIVATE *Drv;\r
+\r
+  Drv = (GRAPHICS_IO_PRIVATE *)This->Private;\r
+\r
+  if (Drv == NULL) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  if (Drv->image != NULL) {\r
+    XDestroyImage(Drv->image);\r
+\r
+    if (Drv->use_shm) {\r
+      shmdt (Drv->image_data);\r
+    }\r
+\r
+    Drv->image_data = NULL;\r
+    Drv->image = NULL;\r
+  }\r
+  XDestroyWindow (Drv->display, Drv->win);\r
+  XCloseDisplay (Drv->display);\r
+\r
+#ifdef __APPLE__\r
+  // Free up the shared memory\r
+  shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);\r
+#endif\r
+\r
+  free (Drv);\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EMU_IO_THUNK_PROTOCOL gX11ThunkIo = {\r
+  &gEmuGraphicsWindowProtocolGuid,\r
+  NULL,\r
+  NULL,\r
+  0,\r
+  GasketX11GraphicsWindowOpen,\r
+  GasketX11GraphicsWindowClose,\r
+  NULL\r
+};\r
+\r
+\r
index c339461cd8c13a01eedf7ab4ee4a7903e11bac45..118a21881806816d0f81ef082ba2baa466ec079b 100644 (file)
-#------------------------------------------------------------------------------
-#
-# 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
-
-
+#------------------------------------------------------------------------------\r
+#\r
+# Manage differenced between UNIX ABI and EFI/Windows ABI\r
+#\r
+# EFI  Arg passing: RCX, RDX, R8,  R9\r
+#                   Callee allocates 32 bytes on stack to spill registers\r
+# UNIX Arg passing: RDI, RSI, RDX, RCX, R8, R9\r
+# RSI, RDI calle-save on EFI, scatch on UNIX callign\r
+#\r
+# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>\r
+# This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+#------------------------------------------------------------------------------\r
+\r
+//\r
+// Gaskets are EFI ABI to UNIX ABI calls\r
+// EFI ABI code will sub 40 (0x28) from %rsp before calling a function\r
+//  This is the 32 (0x20) byte to spill registers and 8 bytes to align stack on 16 byte boundry.\r
+//\r
+  .text\r
+\r
+// 32 byte shadow to spill rcx-r9, 8 bytes to align stack on 16 byte boundry\r
+// Any call with 0 - 4 arguments allocates 40 bytes on the stack.\r
+// For more than 4 args you always have to increase in quanta of 16 so 5 or 6 args is 56,\r
+// 7 or 8 args is 72, and 9 or 10 args is 88\r
+\r
+\r
+\r
+  .text\r
+\r
+//\r
+// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)\r
+//\r
+\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)\r
+ASM_PFX(GasketSecWriteStdErr):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq    %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+\r
+  call  ASM_PFX(SecWriteStdErr)\r
+\r
+  popq  %rdi            // restore state\r
+  popq  %rsi\r
+  popq  %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)\r
+ASM_PFX(GasketSecConfigStdIn):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq    %rdi\r
+\r
+  call  ASM_PFX(SecConfigStdIn)\r
+\r
+  popq  %rdi            // restore state\r
+  popq  %rsi\r
+  popq  %rbp\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)\r
+ASM_PFX(GasketSecWriteStdOut):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq    %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+\r
+  call  ASM_PFX(SecWriteStdOut)\r
+\r
+  popq  %rdi            // restore state\r
+  popq  %rsi\r
+  popq  %rbp\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)\r
+ASM_PFX(GasketSecReadStdIn):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq    %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+\r
+  call  ASM_PFX(SecReadStdIn)\r
+\r
+  popq  %rdi            // restore state\r
+  popq  %rsi\r
+  popq  %rbp\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)\r
+ASM_PFX(GasketSecPollStdIn):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq    %rdi\r
+\r
+  call  ASM_PFX(SecPollStdIn)\r
+\r
+  popq  %rdi            // restore state\r
+  popq  %rsi\r
+  popq  %rbp\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecMalloc)\r
+ASM_PFX(GasketSecMalloc):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq    %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call  ASM_PFX(SecMalloc)\r
+\r
+  popq  %rdi            // restore state\r
+  popq  %rsi\r
+  popq  %rbp\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecValloc)\r
+ASM_PFX(GasketSecValloc):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq    %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call  ASM_PFX(SecValloc)\r
+\r
+  popq  %rdi            // restore state\r
+  popq  %rsi\r
+  popq  %rbp\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecFree)\r
+ASM_PFX(GasketSecFree):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq    %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call  ASM_PFX(SecFree)\r
+\r
+  popq  %rdi            // restore state\r
+  popq  %rsi\r
+  popq  %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecSetTimer)\r
+ASM_PFX(GasketSecSetTimer):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq    %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+\r
+  call  ASM_PFX(SecSetTimer)\r
+\r
+  popq  %rdi            // restore state\r
+  popq  %rsi\r
+  popq  %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)\r
+ASM_PFX(GasketSecEnableInterrupt):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  call    ASM_PFX(SecEnableInterrupt)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)\r
+ASM_PFX(GasketSecDisableInterrupt):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  call    ASM_PFX(SecDisableInterrupt)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)\r
+ASM_PFX(GasketQueryPerformanceFrequency):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  call    ASM_PFX(QueryPerformanceFrequency)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)\r
+ASM_PFX(GasketQueryPerformanceCounter):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  call    ASM_PFX(QueryPerformanceCounter)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecSleep)\r
+ASM_PFX(GasketSecSleep):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq    %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call  ASM_PFX(SecSleep)\r
+\r
+  popq  %rdi            // restore state\r
+  popq  %rsi\r
+  popq  %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)\r
+ASM_PFX(GasketSecCpuSleep):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq    %rdi\r
+\r
+  call  ASM_PFX(SecCpuSleep)\r
+\r
+  popq  %rdi            // restore state\r
+  popq  %rsi\r
+  popq  %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecExit)\r
+ASM_PFX(GasketSecExit):\r
+  pushq   %rbp                 // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  movq    %rcx, %rdi           // Swizzle args\r
+  call    ASM_PFX(SecExit)     // Less to do as we will never return to EFI ABI world\r
+LDEAD_LOOP:\r
+  jmp  LDEAD_LOOP              // _exit should never return\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecGetTime)\r
+ASM_PFX(GasketSecGetTime):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+\r
+  call  ASM_PFX(SecGetTime)\r
+\r
+  popq  %rdi            // restore state\r
+  popq  %rsi\r
+  popq  %rbp\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecSetTime)\r
+ASM_PFX(GasketSecSetTime):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+\r
+  call  ASM_PFX(SecSetTime)\r
+\r
+  popq  %rdi            // restore state\r
+  popq  %rsi\r
+  popq  %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)\r
+ASM_PFX(GasketSecGetNextProtocol):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+  movq    %r9,  %rcx\r
+\r
+  call    ASM_PFX(SecGetNextProtocol)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+// PPIs produced by SEC\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)\r
+ASM_PFX(GasketSecPeCoffGetEntryPoint):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+\r
+  call    ASM_PFX(SecPeCoffGetEntryPoint)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)\r
+ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(SecPeCoffRelocateImageExtraAction)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)\r
+ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(SecPeCoffUnloadImageExtraAction)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)\r
+ASM_PFX(GasketSecEmuThunkAddress):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  call    ASM_PFX(SecEmuThunkAddress)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+//\r
+// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL\r
+//\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11Size)\r
+ASM_PFX(GasketX11Size):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+  movq    %r9,  %rcx\r
+\r
+  call    ASM_PFX(X11Size)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11CheckKey)\r
+ASM_PFX(GasketX11CheckKey):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(X11CheckKey)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11GetKey)\r
+ASM_PFX(GasketX11GetKey):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+\r
+  call    ASM_PFX(X11GetKey)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11KeySetState)\r
+ASM_PFX(GasketX11KeySetState):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+\r
+  call    ASM_PFX(X11KeySetState)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)\r
+ASM_PFX(GasketX11RegisterKeyNotify):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+  movq    %r9,  %rcx\r
+\r
+  call    ASM_PFX(X11RegisterKeyNotify)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11Blt)\r
+ASM_PFX(GasketX11Blt):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+  movq    %r9,  %rcx\r
+\r
+  call    ASM_PFX(X11Blt)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)\r
+ASM_PFX(GasketX11CheckPointer):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(X11CheckPointer)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)\r
+ASM_PFX(GasketX11GetPointerState):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+\r
+  call    ASM_PFX(X11GetPointerState)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)\r
+ASM_PFX(GasketX11GraphicsWindowOpen):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(X11GraphicsWindowOpen)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)\r
+ASM_PFX(GasketX11GraphicsWindowClose):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %r9,  %rcx\r
+\r
+  call    ASM_PFX(X11GraphicsWindowClose)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+// Pthreads\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)\r
+ASM_PFX(GasketPthreadMutexLock):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(PthreadMutexLock)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)\r
+ASM_PFX(GasketPthreadMutexUnLock):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(PthreadMutexUnLock)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)\r
+ASM_PFX(GasketPthreadMutexTryLock):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(PthreadMutexTryLock)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)\r
+ASM_PFX(GasketPthreadMutexInit):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+\r
+  call    ASM_PFX(PthreadMutexInit)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)\r
+ASM_PFX(GasketPthreadMutexDestroy):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(PthreadMutexDestroy)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadCreate)\r
+ASM_PFX(GasketPthreadCreate):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+  movq    %r9,  %rcx\r
+\r
+  call    ASM_PFX(PthreadCreate)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadExit)\r
+ASM_PFX(GasketPthreadExit):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(PthreadExit)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadSelf)\r
+ASM_PFX(GasketPthreadSelf):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+\r
+  call    ASM_PFX(PthreadSelf)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadOpen)\r
+ASM_PFX(GasketPthreadOpen):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(PthreadOpen)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPthreadClose)\r
+ASM_PFX(GasketPthreadClose):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(PthreadClose)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+\r
+\r
+//\r
+// UNIX ABI to EFI ABI call\r
+//\r
+// UINTN\r
+// ReverseGasketUint64 (\r
+//   void *Api,\r
+//   UINTN Arg1\r
+//   );\r
+ASM_GLOBAL ASM_PFX(ReverseGasketUint64)\r
+ASM_PFX(ReverseGasketUint64):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  movq    %rdi, %rax    // Swizzle args\r
+  movq    %rsi, %rcx\r
+\r
+  subq  $32, %rsp        // 32-byte shadow space\r
+  call  *%rax\r
+  addq  $32, %rsp\r
+\r
+  popq   %rbp\r
+  ret\r
+\r
+//\r
+// UNIX ABI to EFI ABI call\r
+//\r
+// UINTN\r
+// ReverseGasketUint64Uint64 (\r
+//   void *Api,\r
+//   UINTN Arg1\r
+//   UINTN Arg2\r
+//   );\r
+ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)\r
+ASM_PFX(ReverseGasketUint64Uint64):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  movq    %rdi, %rax    // Swizzle args\r
+  movq    %rsi, %rcx\r
+\r
+  subq  $32, %rsp        // 32-byte shadow space\r
+  call  *%rax\r
+  addq  $32, %rsp\r
+\r
+  popq   %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)\r
+ASM_PFX(GasketSecUnixPeiAutoScan):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+\r
+  call    ASM_PFX(SecUnixPeiAutoScan)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)\r
+ASM_PFX(GasketSecUnixFdAddress):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+  movq    %r9,  %rcx\r
+\r
+  call    ASM_PFX(SecUnixFdAddress)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+// EmuIoThunk SimpleFileSystem\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)\r
+ASM_PFX(GasketPosixOpenVolume):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+  movq    %r9,  %rcx\r
+\r
+  call    ASM_PFX(PosixOpenVolume)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)\r
+ASM_PFX(GasketPosixFileOpen):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+  movq    %r9,  %rcx\r
+  movq    48(%rbp), %r8\r
+\r
+  call    ASM_PFX(PosixFileOpen)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)\r
+ASM_PFX(GasketPosixFileCLose):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(PosixFileCLose)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)\r
+ASM_PFX(GasketPosixFileDelete):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(PosixFileDelete)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileRead)\r
+ASM_PFX(GasketPosixFileRead):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+\r
+  call    ASM_PFX(PosixFileRead)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)\r
+ASM_PFX(GasketPosixFileWrite):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+\r
+  call    ASM_PFX(PosixFileWrite)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)\r
+ASM_PFX(GasketPosixFileSetPossition):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+\r
+  call    ASM_PFX(PosixFileSetPossition)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)\r
+ASM_PFX(GasketPosixFileGetPossition):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+\r
+  call    ASM_PFX(PosixFileGetPossition)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)\r
+ASM_PFX(GasketPosixFileGetInfo):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+  movq    %r9,  %rcx\r
+\r
+  call    ASM_PFX(PosixFileGetInfo)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)\r
+ASM_PFX(GasketPosixFileSetInfo):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+  movq    %r9,  %rcx\r
+\r
+  call    ASM_PFX(PosixFileSetInfo)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)\r
+ASM_PFX(GasketPosixFileFlush):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(PosixFileFlush)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)\r
+ASM_PFX(GasketPosixFileSystmeThunkOpen):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(PosixFileSystmeThunkOpen)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)\r
+ASM_PFX(GasketPosixFileSystmeThunkClose):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(PosixFileSystmeThunkClose)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)\r
+ASM_PFX(GasketEmuBlockIoReset):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+\r
+  call    ASM_PFX(EmuBlockIoReset)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)\r
+ASM_PFX(GasketEmuBlockIoReadBlocks):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+  movq    %r9,  %rcx\r
+  movq    48(%rbp), %r8\r
+  movq    56(%rbp), %r9\r
+\r
+  call    ASM_PFX(EmuBlockIoReadBlocks)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)\r
+ASM_PFX(GasketEmuBlockIoWriteBlocks):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+  movq    %r9,  %rcx\r
+  movq    48(%rbp), %r8\r
+  movq    56(%rbp), %r9\r
+\r
+  call    ASM_PFX(EmuBlockIoWriteBlocks)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)\r
+ASM_PFX(GasketEmuBlockIoFlushBlocks):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+\r
+  call    ASM_PFX(EmuBlockIoFlushBlocks)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)\r
+ASM_PFX(GasketEmuBlockIoCreateMapping):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+\r
+  call    ASM_PFX(EmuBlockIoCreateMapping)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)\r
+ASM_PFX(GasketBlockIoThunkOpen):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(EmuBlockIoThunkOpen)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)\r
+ASM_PFX(GasketBlockIoThunkClose):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(EmuBlockIoThunkClose)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)\r
+ASM_PFX(GasketSnpCreateMapping):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+\r
+  call    ASM_PFX(EmuSnpCreateMapping)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpStart)\r
+ASM_PFX(GasketSnpStart):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(EmuSnpStart)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpStop)\r
+ASM_PFX(GasketSnpStop):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(EmuSnpStop)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpInitialize)\r
+ASM_PFX(GasketSnpInitialize):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+\r
+  call    ASM_PFX(EmuSnpInitialize)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpReset)\r
+ASM_PFX(GasketSnpReset):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+\r
+  call    ASM_PFX(EmuSnpReset)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpShutdown)\r
+ASM_PFX(GasketSnpShutdown):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(EmuSnpShutdown)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)\r
+ASM_PFX(GasketSnpReceiveFilters):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+  movq    %r9,  %rcx\r
+  movq    48(%rbp), %r8\r
+  movq    56(%rbp), %r9\r
+\r
+  call    ASM_PFX(EmuSnpReceiveFilters)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)\r
+ASM_PFX(GasketSnpStationAddress):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+\r
+  call    ASM_PFX(EmuSnpStationAddress)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpStatistics)\r
+ASM_PFX(GasketSnpStatistics):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+  movq    %r9,  %rcx\r
+\r
+  call    ASM_PFX(EmuSnpStatistics)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)\r
+ASM_PFX(GasketSnpMCastIpToMac):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+  movq    %r9,  %rcx\r
+\r
+  call    ASM_PFX(EmuSnpMCastIpToMac)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpNvData)\r
+ASM_PFX(GasketSnpNvData):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+  movq    %r9,  %rcx\r
+  movq    48(%rbp), %r8\r
+\r
+  call    ASM_PFX(EmuSnpNvData)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)\r
+ASM_PFX(GasketSnpGetStatus):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+\r
+  call    ASM_PFX(EmuSnpGetStatus)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpTransmit)\r
+ASM_PFX(GasketSnpTransmit):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+  subq    $16, %rsp       // Allocate space for args on the stack\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+  movq    %r9,  %rcx\r
+  movq    48(%rbp), %r8\r
+  movq    56(%rbp), %r9\r
+  movq    64(%rbp), %rax\r
+  movq    %rax,     (%rsp)\r
+\r
+  call    ASM_PFX(EmuSnpTransmit)\r
+  addq    $16, %rsp\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpReceive)\r
+ASM_PFX(GasketSnpReceive):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+  subq    $16, %rsp       // Allocate space for args on the stack\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+  movq    %rdx, %rsi\r
+  movq    %r8,  %rdx\r
+  movq    %r9,  %rcx\r
+  movq    48(%rbp), %r8\r
+  movq    56(%rbp), %r9\r
+  movq    64(%rbp), %rax\r
+  movq    %rax,     (%rsp)\r
+\r
+  call    ASM_PFX(EmuSnpReceive)\r
+  addq    $16, %rsp\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)\r
+ASM_PFX(GasketSnpThunkOpen):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(EmuSnpThunkOpen)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
+ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)\r
+ASM_PFX(GasketSnpThunkClose):\r
+  pushq   %rbp            // stack frame is for the debugger\r
+  movq    %rsp, %rbp\r
+\r
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI\r
+  pushq   %rdi\r
+\r
+  movq    %rcx, %rdi    // Swizzle args\r
+\r
+  call    ASM_PFX(EmuSnpThunkClose)\r
+\r
+  popq    %rdi          // restore state\r
+  popq    %rsi\r
+  popq    %rbp\r
+  ret\r
+\r
+\r
index 64549ce3eca85703562d0998af8024a97cf655d4..a130cbee5c67ef951b6faab37c5c1e2e5158910c 100755 (executable)
-#!/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\r
+\r
+#\r
+#  Copyright 2014 Apple Inc. All righes reserved.\r
+#\r
+#  This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution. The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php.\r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+\r
+import lldb\r
+import os\r
+import uuid\r
+import string\r
+import commands\r
+import optparse\r
+import shlex\r
+\r
+guid_dict = {}\r
+\r
+\r
+def EFI_GUID_TypeSummary (valobj,internal_dict):\r
+    """ Type summary for EFI GUID, print C Name if known\r
+    """\r
+    # typedef struct {\r
+    #   UINT32  Data1;\r
+    #   UINT16  Data2;\r
+    #   UINT16  Data3;\r
+    #   UINT8   Data4[8];\r
+    # } EFI_GUID;\r
+    SBError = lldb.SBError()\r
+\r
+    data1_val = valobj.GetChildMemberWithName('Data1')\r
+    data1 = data1_val.GetValueAsUnsigned(0)\r
+    data2_val = valobj.GetChildMemberWithName('Data2')\r
+    data2 = data2_val.GetValueAsUnsigned(0)\r
+    data3_val = valobj.GetChildMemberWithName('Data3')\r
+    data3 = data3_val.GetValueAsUnsigned(0)\r
+    str = "%x-%x-%x-" % (data1, data2, data3)\r
+\r
+    data4_val = valobj.GetChildMemberWithName('Data4')\r
+    for i in range (data4_val.num_children):\r
+        if i == 2:\r
+            str +='-'\r
+        str += "%02x" % data4_val.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)\r
+\r
+    return guid_dict.get (str.upper(), '')\r
+\r
+\r
+\r
+EFI_STATUS_Dict = {\r
+    (0x8000000000000000 |  1): "Load Error",\r
+    (0x8000000000000000 |  2): "Invalid Parameter",\r
+    (0x8000000000000000 |  3): "Unsupported",\r
+    (0x8000000000000000 |  4): "Bad Buffer Size",\r
+    (0x8000000000000000 |  5): "Buffer Too Small",\r
+    (0x8000000000000000 |  6): "Not Ready",\r
+    (0x8000000000000000 |  7): "Device Error",\r
+    (0x8000000000000000 |  8): "Write Protected",\r
+    (0x8000000000000000 |  9): "Out of Resources",\r
+    (0x8000000000000000 | 10): "Volume Corrupt",\r
+    (0x8000000000000000 | 11): "Volume Full",\r
+    (0x8000000000000000 | 12): "No Media",\r
+    (0x8000000000000000 | 13): "Media changed",\r
+    (0x8000000000000000 | 14): "Not Found",\r
+    (0x8000000000000000 | 15): "Access Denied",\r
+    (0x8000000000000000 | 16): "No Response",\r
+    (0x8000000000000000 | 17): "No mapping",\r
+    (0x8000000000000000 | 18): "Time out",\r
+    (0x8000000000000000 | 19): "Not started",\r
+    (0x8000000000000000 | 20): "Already started",\r
+    (0x8000000000000000 | 21): "Aborted",\r
+    (0x8000000000000000 | 22): "ICMP Error",\r
+    (0x8000000000000000 | 23): "TFTP Error",\r
+    (0x8000000000000000 | 24): "Protocol Error",\r
+\r
+                          0 : "Success",\r
+                          1 : "Warning Unknown Glyph",\r
+                          2 : "Warning Delete Failure",\r
+                          3 : "Warning Write Failure",\r
+                          4 : "Warning Buffer Too Small",\r
+\r
+    (0x80000000         |  1): "Load Error",\r
+    (0x80000000         |  2): "Invalid Parameter",\r
+    (0x80000000         |  3): "Unsupported",\r
+    (0x80000000         |  4): "Bad Buffer Size",\r
+    (0x80000000         |  5): "Buffer Too Small",\r
+    (0x80000000         |  6): "Not Ready",\r
+    (0x80000000         |  7): "Device Error",\r
+    (0x80000000         |  8): "Write Protected",\r
+    (0x80000000         |  9): "Out of Resources",\r
+    (0x80000000         | 10): "Volume Corrupt",\r
+    (0x80000000         | 11): "Volume Full",\r
+    (0x80000000         | 12): "No Media",\r
+    (0x80000000         | 13): "Media changed",\r
+    (0x80000000         | 14): "Not Found",\r
+    (0x80000000         | 15): "Access Denied",\r
+    (0x80000000         | 16): "No Response",\r
+    (0x80000000         | 17): "No mapping",\r
+    (0x80000000         | 18): "Time out",\r
+    (0x80000000         | 19): "Not started",\r
+    (0x80000000         | 20): "Already started",\r
+    (0x80000000         | 21): "Aborted",\r
+    (0x80000000         | 22): "ICMP Error",\r
+    (0x80000000         | 23): "TFTP Error",\r
+    (0x80000000         | 24): "Protocol Error",\r
+}\r
+\r
+def EFI_STATUS_TypeSummary (valobj,internal_dict):\r
+  #\r
+  # Return summary string for EFI_STATUS from dictionary\r
+  #\r
+  Status = valobj.GetValueAsUnsigned(0)\r
+  return EFI_STATUS_Dict.get (Status, '')\r
+\r
+\r
+def EFI_TPL_TypeSummary (valobj,internal_dict):\r
+  #\r
+  # Return TPL values\r
+  #\r
+\r
+  if valobj.TypeIsPointerType():\r
+    return ""\r
+\r
+  Tpl = valobj.GetValueAsUnsigned(0)\r
+  if   Tpl < 4:\r
+    Str = "%d" % Tpl\r
+  elif Tpl == 6:\r
+    Str = "TPL_DRIVER (Obsolete Concept in edk2)"\r
+  elif Tpl < 8:\r
+    Str = "TPL_APPLICATION"\r
+    if Tpl - 4 > 0:\r
+      Str += " + " + "%d" % (Tpl - 4)\r
+  elif Tpl < 16:\r
+    Str = "TPL_CALLBACK"\r
+    if Tpl - 8 > 0:\r
+      Str += " + " + "%d" % (Tpl - 4)\r
+  elif Tpl < 31:\r
+    Str = "TPL_NOTIFY"\r
+    if Tpl - 16 > 0:\r
+      Str += " + " + "%d" % (Tpl - 4)\r
+  elif Tpl == 31:\r
+    Str = "TPL_HIGH_LEVEL"\r
+  else:\r
+    Str = "Invalid TPL"\r
+\r
+  return Str\r
+\r
+\r
+def CHAR16_TypeSummary (valobj,internal_dict):\r
+  #\r
+  # Display EFI CHAR16 'unsigned short' as string\r
+  #\r
+  SBError = lldb.SBError()\r
+  Str = ''\r
+  if valobj.TypeIsPointerType():\r
+    if valobj.GetValueAsUnsigned () == 0:\r
+      return "NULL"\r
+\r
+    # CHAR16 *   max string size 1024\r
+    for i in range (1024):\r
+      Char = valobj.GetPointeeData(i,1).GetUnsignedInt16(SBError, 0)\r
+      if SBError.fail or Char == 0:\r
+        break\r
+      Str += unichr (Char)\r
+    Str = 'L"' + Str + '"'\r
+    return Str.encode ('utf-8', 'replace')\r
+\r
+  if valobj.num_children == 0:\r
+    # CHAR16\r
+    if chr (valobj.unsigned) in string.printable:\r
+      Str = "L'" + unichr (valobj.unsigned) + "'"\r
+      return Str.encode ('utf-8', 'replace')\r
+  else:\r
+    # CHAR16 []\r
+    for i in range (valobj.num_children):\r
+      Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt16(SBError, 0)\r
+      if Char == 0:\r
+        break\r
+      Str += unichr (Char)\r
+    Str = 'L"' + Str + '"'\r
+    return Str.encode ('utf-8', 'replace')\r
+\r
+  return Str\r
+\r
+def CHAR8_TypeSummary (valobj,internal_dict):\r
+  #\r
+  # Display EFI CHAR8 'signed char' as string\r
+  # unichr() is used as a junk string can produce an error message like this:\r
+  # UnicodeEncodeError: 'ascii' codec can't encode character u'\x90' in position 1: ordinal not in range(128)\r
+  #\r
+  SBError = lldb.SBError()\r
+  Str = ''\r
+  if valobj.TypeIsPointerType():\r
+    if valobj.GetValueAsUnsigned () == 0:\r
+      return "NULL"\r
+\r
+    # CHAR8 *   max string size 1024\r
+    for i in range (1024):\r
+      Char = valobj.GetPointeeData(i,1).GetUnsignedInt8(SBError, 0)\r
+      if SBError.fail or Char == 0:\r
+        break\r
+      Str += unichr (Char)\r
+    Str = '"' + Str + '"'\r
+    return Str.encode ('utf-8', 'replace')\r
+\r
+  if valobj.num_children == 0:\r
+    # CHAR8\r
+    if chr (valobj.unsigned) in string.printable:\r
+      Str = '"' + unichr (valobj.unsigned)  + '"'\r
+      return Str.encode ('utf-8', 'replace')\r
+  else:\r
+    # CHAR8 []\r
+    for i in range (valobj.num_children):\r
+      Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)\r
+      if Char == 0:\r
+        break\r
+      Str += unichr (Char)\r
+    Str = '"' + Str + '"'\r
+    return Str.encode ('utf-8', 'replace')\r
+\r
+  return Str\r
+\r
+device_path_dict = {\r
+  (0x01, 0x01): "PCI_DEVICE_PATH",\r
+  (0x01, 0x02): "PCCARD_DEVICE_PATH",\r
+  (0x01, 0x03): "MEMMAP_DEVICE_PATH",\r
+  (0x01, 0x04): "VENDOR_DEVICE_PATH",\r
+  (0x01, 0x05): "CONTROLLER_DEVICE_PATH",\r
+  (0x02, 0x01): "ACPI_HID_DEVICE_PATH",\r
+  (0x02, 0x02): "ACPI_EXTENDED_HID_DEVICE_PATH",\r
+  (0x02, 0x03): "ACPI_ADR_DEVICE_PATH",\r
+  (0x03, 0x01): "ATAPI_DEVICE_PATH",\r
+  (0x03, 0x12): "SATA_DEVICE_PATH",\r
+  (0x03, 0x02): "SCSI_DEVICE_PATH",\r
+  (0x03, 0x03): "FIBRECHANNEL_DEVICE_PATH",\r
+  (0x03, 0x04): "F1394_DEVICE_PATH",\r
+  (0x03, 0x05): "USB_DEVICE_PATH",\r
+  (0x03, 0x0f): "USB_CLASS_DEVICE_PATH",\r
+  (0x03, 0x10): "FW_SBP2_UNIT_LUN_DEVICE_PATH",\r
+  (0x03, 0x11): "DEVICE_LOGICAL_UNIT_DEVICE_PATH",\r
+  (0x03, 0x06): "I2O_DEVICE_PATH",\r
+  (0x03, 0x0b): "MAC_ADDR_DEVICE_PATH",\r
+  (0x03, 0x0c): "IPv4_DEVICE_PATH",\r
+  (0x03, 0x09): "INFINIBAND_DEVICE_PATH",\r
+  (0x03, 0x0e): "UART_DEVICE_PATH",\r
+  (0x03, 0x0a): "VENDOR_DEVICE_PATH",\r
+  (0x03, 0x13): "ISCSI_DEVICE_PATH",\r
+  (0x04, 0x01): "HARDDRIVE_DEVICE_PATH",\r
+  (0x04, 0x02): "CDROM_DEVICE_PATH",\r
+  (0x04, 0x03): "VENDOR_DEVICE_PATH",\r
+  (0x04, 0x04): "FILEPATH_DEVICE_PATH",\r
+  (0x04, 0x05): "MEDIA_PROTOCOL_DEVICE_PATH",\r
+  (0x05, 0x01): "BBS_BBS_DEVICE_PATH",\r
+  (0x7F, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",\r
+  (0xFF, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",\r
+}\r
+\r
+def EFI_DEVICE_PATH_PROTOCOL_TypeSummary (valobj,internal_dict):\r
+  #\r
+  #\r
+  #\r
+  if valobj.TypeIsPointerType():\r
+    # EFI_DEVICE_PATH_PROTOCOL *\r
+    return ""\r
+\r
+  Str = ""\r
+  if valobj.num_children == 3:\r
+    # EFI_DEVICE_PATH_PROTOCOL\r
+    Type    = valobj.GetChildMemberWithName('Type').unsigned\r
+    SubType = valobj.GetChildMemberWithName('SubType').unsigned\r
+    if (Type, SubType) in device_path_dict:\r
+      TypeStr = device_path_dict[Type, SubType]\r
+    else:\r
+      TypeStr = ""\r
+\r
+    LenLow  = valobj.GetChildMemberWithName('Length').GetChildAtIndex(0).unsigned\r
+    LenHigh = valobj.GetChildMemberWithName('Length').GetChildAtIndex(1).unsigned\r
+    Len = LenLow + (LenHigh >> 8)\r
+\r
+    Address = long ("%d" % valobj.addr)\r
+    if (Address == lldb.LLDB_INVALID_ADDRESS):\r
+      # Need to reserach this, it seems to be the nested struct case\r
+      ExprStr = ""\r
+    elif (Type & 0x7f == 0x7f):\r
+      ExprStr = "End Device Path" if SubType == 0xff else "End This Instance"\r
+    else:\r
+      ExprStr = "expr *(%s *)0x%08x" % (TypeStr, Address)\r
+\r
+    Str =  " {\n"\r
+    Str += "   (UINT8) Type    = 0x%02x // %s\n" % (Type, "END" if (Type & 0x7f == 0x7f) else "")\r
+    Str += "   (UINT8) SubType = 0x%02x // %s\n" % (SubType, ExprStr)\r
+    Str += "   (UINT8 [2]) Length = { // 0x%04x (%d) bytes\n" % (Len, Len)\r
+    Str += "     (UINT8) [0] = 0x%02x\n" % LenLow\r
+    Str += "     (UINT8) [1] = 0x%02x\n" % LenHigh\r
+    Str +=  "   }\n"\r
+    if (Type & 0x7f == 0x7f) and (SubType == 0xff):\r
+      pass\r
+    elif ExprStr != "":\r
+      NextNode = Address + Len\r
+      Str += "// Next node 'expr *(EFI_DEVICE_PATH_PROTOCOL *)0x%08x'\n" % NextNode\r
+\r
+  return Str\r
+\r
+\r
+\r
+def TypePrintFormating(debugger):\r
+    #\r
+    # Set the default print formating for EFI types in lldb.\r
+    # seems lldb defaults to decimal.\r
+    #\r
+    category = debugger.GetDefaultCategory()\r
+    FormatBool = lldb.SBTypeFormat(lldb.eFormatBoolean)\r
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("BOOLEAN"), FormatBool)\r
+\r
+    FormatHex  = lldb.SBTypeFormat(lldb.eFormatHex)\r
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT64"), FormatHex)\r
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT64"), FormatHex)\r
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT32"), FormatHex)\r
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT32"), FormatHex)\r
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT16"), FormatHex)\r
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT16"), FormatHex)\r
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT8"), FormatHex)\r
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT8"), FormatHex)\r
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINTN"), FormatHex)\r
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INTN"), FormatHex)\r
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR8"), FormatHex)\r
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR16"), FormatHex)\r
+\r
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_PHYSICAL_ADDRESS"), FormatHex)\r
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("PHYSICAL_ADDRESS"), FormatHex)\r
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_STATUS"), FormatHex)\r
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_TPL"), FormatHex)\r
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_LBA"), FormatHex)\r
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_BOOT_MODE"), FormatHex)\r
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_FV_FILETYPE"), FormatHex)\r
+\r
+    #\r
+    # Smart type printing for EFI\r
+    #\r
+    debugger.HandleCommand("type summary add EFI_GUID --python-function lldbefi.EFI_GUID_TypeSummary")\r
+    debugger.HandleCommand("type summary add EFI_STATUS --python-function lldbefi.EFI_STATUS_TypeSummary")\r
+    debugger.HandleCommand("type summary add EFI_TPL --python-function lldbefi.EFI_TPL_TypeSummary")\r
+    debugger.HandleCommand("type summary add EFI_DEVICE_PATH_PROTOCOL --python-function lldbefi.EFI_DEVICE_PATH_PROTOCOL_TypeSummary")\r
+\r
+    debugger.HandleCommand("type summary add CHAR16 --python-function lldbefi.CHAR16_TypeSummary")\r
+    debugger.HandleCommand('type summary add --regex "CHAR16 \[[0-9]+\]" --python-function lldbefi.CHAR16_TypeSummary')\r
+    debugger.HandleCommand("type summary add CHAR8 --python-function lldbefi.CHAR8_TypeSummary")\r
+    debugger.HandleCommand('type summary add --regex "CHAR8 \[[0-9]+\]" --python-function lldbefi.CHAR8_TypeSummary')\r
+\r
+\r
+gEmulatorBreakWorkaroundNeeded = True\r
+\r
+def LoadEmulatorEfiSymbols(frame, bp_loc , internal_dict):\r
+    #\r
+    # This is an lldb breakpoint script, and assumes the breakpoint is on a\r
+    # function with the same prototype as SecGdbScriptBreak(). The\r
+    # argument names are important as lldb looks them up.\r
+    #\r
+    # VOID\r
+    # SecGdbScriptBreak (\r
+    #   char                *FileName,\r
+    #   int                 FileNameLength,\r
+    #   long unsigned int   LoadAddress,\r
+    #   int                 AddSymbolFlag\r
+    #   )\r
+    # {\r
+    #   return;\r
+    # }\r
+    #\r
+    # When the emulator loads a PE/COFF image, it calls the stub function with\r
+    # the filename of the symbol file, the length of the FileName, the\r
+    # load address and a flag to indicate if this is a load or unload operation\r
+    #\r
+    global gEmulatorBreakWorkaroundNeeded\r
+\r
+    if gEmulatorBreakWorkaroundNeeded:\r
+        # turn off lldb debug prints on SIGALRM (EFI timer tick)\r
+        frame.thread.process.target.debugger.HandleCommand("process handle SIGALRM -n false")\r
+        gEmulatorBreakWorkaroundNeeded = False\r
+\r
+    # Convert C string to Python string\r
+    Error = lldb.SBError()\r
+    FileNamePtr = frame.FindVariable ("FileName").GetValueAsUnsigned()\r
+    FileNameLen = frame.FindVariable ("FileNameLength").GetValueAsUnsigned()\r
+    FileName = frame.thread.process.ReadCStringFromMemory (FileNamePtr, FileNameLen, Error)\r
+    if not Error.Success():\r
+        print "!ReadCStringFromMemory() did not find a %d byte C string at %x" % (FileNameLen, FileNamePtr)\r
+        # make breakpoint command contiue\r
+        frame.GetThread().GetProcess().Continue()\r
+\r
+    debugger = frame.thread.process.target.debugger\r
+    if frame.FindVariable ("AddSymbolFlag").GetValueAsUnsigned() == 1:\r
+        LoadAddress = frame.FindVariable ("LoadAddress").GetValueAsUnsigned()\r
+\r
+        debugger.HandleCommand ("target modules add  %s" % FileName)\r
+        print "target modules load --slid 0x%x %s" % (LoadAddress, FileName)\r
+        debugger.HandleCommand ("target modules load --slide 0x%x --file %s" % (LoadAddress, FileName))\r
+    else:\r
+        target = debugger.GetSelectedTarget()\r
+        for SBModule in target.module_iter():\r
+            ModuleName  = SBModule.GetFileSpec().GetDirectory() + '/'\r
+            ModuleName += SBModule.GetFileSpec().GetFilename()\r
+            if FileName == ModuleName or FileName == SBModule.GetFileSpec().GetFilename():\r
+                target.ClearModuleLoadAddress (SBModule)\r
+                if not target.RemoveModule (SBModule):\r
+                    print "!lldb.target.RemoveModule (%s) FAILED" % SBModule\r
+\r
+    # make breakpoint command contiue\r
+    frame.thread.process.Continue()\r
+\r
+def GuidToCStructStr (guid, Name=False):\r
+  #\r
+  # Convert a 16-byte bytesarry (or bytearray compat object) to C guid string\r
+  # { 0xB402621F, 0xA940, 0x1E4A, { 0x86, 0x6B, 0x4D, 0xC9, 0x16, 0x2B, 0x34, 0x7C } }\r
+  #\r
+  # Name=True means lookup name in GuidNameDict and us it if you find it\r
+  #\r
+\r
+  if not isinstance (guid, bytearray):\r
+    # convert guid object to UUID, and UUID to bytearray\r
+    Uuid = uuid.UUID(guid)\r
+    guid = bytearray (Uuid.bytes_le)\r
+\r
+  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 } }" % \\r
+         (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])\r
+\r
+def ParseGuidString(GuidStr):\r
+  #\r
+  # Error check and convert C Guid init to string\r
+  # ParseGuidString("49152E77-1ADA-4764-B7A2-7AFEFED95E8B")\r
+  # ParseGuidString("{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7, 0x8A, 0x35, 0x46, 0xD1 } }")\r
+  #\r
+\r
+  if "{" in GuidStr                                                                                         :\r
+    # convert C form "{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7, 0x8A, 0x35, 0x46, 0xD1 } }"\r
+    # to string form BA24B391-73FD-C54C-9EAF-0CA78A3546D1\r
+    # make a list of Hex numbers like: ['0xBA24B391', '0x73FD', '0xC54C', '0x9E', '0xAF', '0x0C', '0xA7', '0x8A', '0x35', '0x46', '0xD1']\r
+    Hex = ''.join(x for x in GuidStr if x not in '{,}').split()\r
+    Str = "%08X-%04X-%04X-%02.2X%02.2X-%02.2X%02.2X%02.2X%02.2X%02.2X%02.2X" % \\r
+          (int(Hex[0], 0), int(Hex[1], 0), int(Hex[2], 0), int(Hex[3], 0), int(Hex[4], 0), \\r
+           int(Hex[5], 0), int(Hex[6], 0), int(Hex[7], 0), int(Hex[8], 0), int(Hex[9], 0), int(Hex[10], 0))\r
+  elif GuidStr.count('-') == 4:\r
+    # validate "49152E77-1ADA-4764-B7A2-7AFEFED95E8B" form\r
+    Check = "%s" % str(uuid.UUID(GuidStr)).upper()\r
+    if GuidStr.upper() == Check:\r
+      Str = GuidStr.upper()\r
+    else:\r
+      Ste = ""\r
+  else:\r
+    Str = ""\r
+\r
+  return Str\r
+\r
+\r
+def create_guid_options():\r
+    usage = "usage: %prog [data]"\r
+    description='''lookup EFI_GUID by CName, C struct, or GUID string and print out all three.\r
+    '''\r
+    parser = optparse.OptionParser(description=description, prog='guid',usage=usage)\r
+    return parser\r
+\r
+def efi_guid_command(debugger, command, result, dict):\r
+    # Use the Shell Lexer to properly parse up command options just like a\r
+    # shell would\r
+    command_args = shlex.split(command)\r
+    parser = create_guid_options()\r
+    try:\r
+        (options, args) = parser.parse_args(command_args)\r
+        if len(args) >= 1:\r
+          if args[0] == "{":\r
+              # caller forgot to quote the string"\r
+              # mark arg[0] a string containing all args[n]\r
+              args[0] = ' '.join(args)\r
+          GuidStr = ParseGuidString (args[0])\r
+          if GuidStr == "":\r
+              # return Key of GuidNameDict for value args[0]\r
+              GuidStr = [Key for Key, Value in guid_dict.iteritems() if Value == args[0]][0]\r
+          GuidStr = GuidStr.upper()\r
+    except:\r
+        # if you don't handle exceptions, passing an incorrect argument to the OptionParser will cause LLDB to exit\r
+        # (courtesy of OptParse dealing with argument errors by throwing SystemExit)\r
+        result.SetError ("option parsing failed")\r
+        return\r
+\r
+\r
+    if len(args) >= 1:\r
+        if GuidStr in guid_dict:\r
+            print "%s = %s" % (guid_dict[GuidStr], GuidStr)\r
+            print "%s = %s" % (guid_dict[GuidStr], GuidToCStructStr (GuidStr))\r
+        else:\r
+            print GuidStr\r
+    else:\r
+        # dump entire dictionary\r
+        width = max(len(v) for k,v in guid_dict.iteritems())\r
+        for value in sorted(guid_dict, key=guid_dict.get):\r
+            print '%-*s %s %s' % (width, guid_dict[value], value, GuidToCStructStr(value))\r
+\r
+    return\r
+\r
+\r
+#\r
+########## Code that runs when this script is imported into LLDB ###########\r
+#\r
+def __lldb_init_module (debugger, internal_dict):\r
+    # This initializer is being run from LLDB in the embedded command interpreter\r
+    # Make the options so we can generate the help text for the new LLDB\r
+    # command line command prior to registering it with LLDB below\r
+\r
+    global guid_dict\r
+\r
+    # Source Guid.xref file if we can find it\r
+    inputfile = os.getcwd()\r
+    inputfile += os.sep + os.pardir + os.sep + 'FV' + os.sep + 'Guid.xref'\r
+    with open(inputfile) as f:\r
+        for line in f:\r
+            data = line.split(' ')\r
+            if len(data) >= 2:\r
+                guid_dict[data[0].upper()] = data[1].strip('\n')\r
+\r
+    # init EFI specific type formaters\r
+    TypePrintFormating (debugger)\r
+\r
+\r
+    # add guid command\r
+    parser = create_guid_options()\r
+    efi_guid_command.__doc__ = parser.format_help()\r
+    debugger.HandleCommand('command script add -f lldbefi.efi_guid_command guid')\r
+\r
+\r
+    Target = debugger.GetTargetAtIndex(0)\r
+    if Target:\r
+        Breakpoint = Target.BreakpointCreateByName('SecGdbScriptBreak')\r
+        if Breakpoint.GetNumLocations() == 1:\r
+            # Set the emulator breakpoints, if we are in the emulator\r
+            debugger.HandleCommand("breakpoint command add -s python -F lldbefi.LoadEmulatorEfiSymbols {id}".format(id=Breakpoint.GetID()))\r
+            print 'Type r to run emulator. SecLldbScriptBreak armed. EFI modules should now get source level debugging in the emulator.'\r
index 14491a6e90e27da2ddd9a1724d8c1db09b8b480e..d5944c42275c1268b50bdbe794c32d759a2d39d9 100644 (file)
@@ -270,7 +270,7 @@ WinNtSignalToken (
   @param[in]       MediaId    Id of the media, changes every time the media is\r
                               replaced.\r
   @param[in]       Lba        The starting Logical Block Address to read from.\r
-  @param[in, out]  Token           A pointer to the token associated with the transaction.\r
+  @param[in, out]  Token      A pointer to the token associated with the transaction.\r
   @param[in]       BufferSize Size of Buffer, must be a multiple of device block size.\r
   @param[out]      Buffer     A pointer to the destination buffer for the data. The\r
                               caller is responsible for either having implicit or\r
index 6f1f1a2dd321aadbaa8cbef6bcffa04699d1ab12..991da1c15bd4d4eb5a14b2883504833fd5595fd8 100644 (file)
@@ -206,4 +206,4 @@ extern EMU_THUNK_PROTOCOL    gEmuThunkProtocol;
 extern EMU_IO_THUNK_PROTOCOL mWinNtWndThunkIo;\r
 extern EMU_IO_THUNK_PROTOCOL mWinNtFileSystemThunkIo;\r
 extern EMU_IO_THUNK_PROTOCOL mWinNtBlockIoThunkIo;\r
-#endif
\ No newline at end of file
+#endif\r