Browse Source

EmulatorPkg: formalize line endings

The patch is the result of running
"BaseTools/Scripts/FormatDosFiles.py EmulatorPkg/"

No functionality impact.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
Reviewed-by: Hao A Wu <hao.a.wu@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Ruiyu Ni 5 years ago
parent
commit
79e4f2a56a
51 changed files with 10353 additions and 10353 deletions
  1. 12 12
      EmulatorPkg/CpuRuntimeDxe/Cpu.c
  2. 1 1
      EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c
  3. 195 195
      EmulatorPkg/EmuGopDxe/Gop.h
  4. 900 900
      EmulatorPkg/EmuGopDxe/GopInput.c
  5. 416 416
      EmulatorPkg/EmuGopDxe/GopScreen.c
  6. 1 1
      EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c
  7. 38 38
      EmulatorPkg/Include/Library/EmuMagicPageLib.h
  8. 42 42
      EmulatorPkg/Include/Library/EmuThunkLib.h
  9. 21 21
      EmulatorPkg/Include/Library/PpiListLib.h
  10. 202 202
      EmulatorPkg/Include/Library/SmbiosLib.h
  11. 1 1
      EmulatorPkg/Include/Protocol/EmuBlockIo.h
  12. 140 140
      EmulatorPkg/Include/Protocol/EmuFileSystem.h
  13. 134 134
      EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h
  14. 1 1
      EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c
  15. 1 1
      EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf
  16. 1 1
      EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c
  17. 48 48
      EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActionLib.inf
  18. 1 1
      EmulatorPkg/Library/DxeEmuStdErrSerialPortLib/DxeEmuStdErrSerialPortLib.c
  19. 1 1
      EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c
  20. 6 6
      EmulatorPkg/Library/PeiCoreServicesTablePointerLib/PeiServicesTablePointer.c
  21. 49 49
      EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraActionLib.inf
  22. 6 6
      EmulatorPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c
  23. 6 6
      EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTablePointer.c
  24. 1 1
      EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf
  25. 281 281
      EmulatorPkg/Library/SecPeiServicesLib/FwVol.c
  26. 17 17
      EmulatorPkg/Library/SecPpiListLib/PpiListLib.c
  27. 352 352
      EmulatorPkg/Library/SmbiosLib/SmbiosLib.c
  28. 47 47
      EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf
  29. 2 2
      EmulatorPkg/MiscSubClassPlatformDxe/MiscSubClassDriver.h
  30. 2 2
      EmulatorPkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c
  31. 9 9
      EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c
  32. 2 2
      EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.inf
  33. 13 13
      EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c
  34. 13 13
      EmulatorPkg/Sec/Ia32/SwitchRam.asm
  35. 149 149
      EmulatorPkg/Sec/Sec.c
  36. 51 51
      EmulatorPkg/Sec/Sec.h
  37. 39 39
      EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c
  38. 1 1
      EmulatorPkg/Unix/Host/BlockIo.c
  39. 440 440
      EmulatorPkg/Unix/Host/EmuThunk.c
  40. 7 7
      EmulatorPkg/Unix/Host/Host.c
  41. 1 1
      EmulatorPkg/Unix/Host/Host.h
  42. 1492 1492
      EmulatorPkg/Unix/Host/Ia32/Gasket.S
  43. 74 74
      EmulatorPkg/Unix/Host/Ia32/SwitchStack.c
  44. 145 145
      EmulatorPkg/Unix/Host/MemoryAllocationLib.c
  45. 1556 1556
      EmulatorPkg/Unix/Host/PosixFileSystem.c
  46. 235 235
      EmulatorPkg/Unix/Host/Pthreads.c
  47. 1028 1028
      EmulatorPkg/Unix/Host/X11GraphicsWindow.c
  48. 1631 1631
      EmulatorPkg/Unix/Host/X64/Gasket.S
  49. 540 540
      EmulatorPkg/Unix/lldbefi.py
  50. 1 1
      EmulatorPkg/Win/Host/WinBlockIo.c
  51. 1 1
      EmulatorPkg/Win/Host/WinHost.h

+ 12 - 12
EmulatorPkg/CpuRuntimeDxe/Cpu.c

@@ -63,7 +63,7 @@ SMBIOS_TABLE_TYPE4 mCpuSmbiosType4 = {
       0, //  ProcessorXModel:    4;
       0, //  ProcessorXFamily:   8;
       0, //  ProcessorReserved2: 4;
-    }, 
+    },
     {  // PROCESSOR_FEATURE_FLAGS
       0, //  ProcessorFpu       :1;
       0, //  ProcessorVme       :1;
@@ -100,13 +100,13 @@ SMBIOS_TABLE_TYPE4 mCpuSmbiosType4 = {
   },
   3,                    // ProcessorVersion String;
   {                     // Voltage;
-    1,  // ProcessorVoltageCapability5V        :1; 
-    1,  // ProcessorVoltageCapability3_3V      :1;  
-    1,  // ProcessorVoltageCapability2_9V      :1;  
+    1,  // ProcessorVoltageCapability5V        :1;
+    1,  // ProcessorVoltageCapability3_3V      :1;
+    1,  // ProcessorVoltageCapability2_9V      :1;
     0,  // ProcessorVoltageCapabilityReserved  :1; ///< Bit 3, must be zero.
     0,  // ProcessorVoltageReserved            :3; ///< Bits 4-6, must be zero.
     0   // ProcessorVoltageIndicateLegacy      :1;
-  },              
+  },
   0,                      // ExternalClock;
   0,                      // MaxSpeed;
   0,                      // CurrentSpeed;
@@ -151,26 +151,26 @@ CHAR8 *mCpuSmbiosType4Strings[] = {
     "Not Found",
     NULL
   };
-  
+
   ...
   LogSmbiosData (
-    (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12, 
+    (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
     gSmbiosType12Strings
     );
 
   @param  Template    Fixed SMBIOS structure, required.
-  @param  StringArray Array of strings to convert to an SMBIOS string pack. 
+  @param  StringArray Array of strings to convert to an SMBIOS string pack.
                       NULL is OK.
 
 **/
 EFI_STATUS
 LogSmbiosData (
   IN  EFI_SMBIOS_TABLE_HEADER *Template,
-  IN  CHAR8                   **StringPack 
+  IN  CHAR8                   **StringPack
   )
 {
   EFI_STATUS                Status;
-  EFI_SMBIOS_PROTOCOL       *Smbios;  
+  EFI_SMBIOS_PROTOCOL       *Smbios;
   EFI_SMBIOS_HANDLE         SmbiosHandle;
   EFI_SMBIOS_TABLE_HEADER   *Record;
   UINTN                     Index;
@@ -219,7 +219,7 @@ LogSmbiosData (
     Str += StringSize;
   }
   *Str = 0;
-  
+
   SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
   Status = Smbios->Add (
                      Smbios,
@@ -228,7 +228,7 @@ LogSmbiosData (
                      Record
                      );
   ASSERT_EFI_ERROR (Status);
-  
+
   FreePool (Record);
   return Status;
 }

+ 1 - 1
EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c

@@ -61,7 +61,7 @@ EmuBlockIo2Reset (
   @param[in]       MediaId    Id of the media, changes every time the media is
                               replaced.
   @param[in]       Lba        The starting Logical Block Address to read from.
-  @param[in, out]  Token	    A pointer to the token associated with the transaction.
+  @param[in, out]  Token      A pointer to the token associated with the transaction.
   @param[in]       BufferSize Size of Buffer, must be a multiple of device block size.
   @param[out]      Buffer     A pointer to the destination buffer for the data. The
                               caller is responsible for either having implicit or

+ 195 - 195
EmulatorPkg/EmuGopDxe/Gop.h

@@ -1,195 +1,195 @@
-/*++ @file
-
-Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
-Portions copyright (c) 2010,Apple Inc. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution.  The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef __UGA_H_
-#define __UGA_H_
-
-#include <PiDxe.h>
-
-#include <Protocol/GraphicsOutput.h>
-#include <Protocol/SimpleTextIn.h>
-#include <Protocol/SimpleTextInEx.h>
-#include <Protocol/SimplePointer.h>
-#include <Protocol/EmuIoThunk.h>
-#include <Protocol/EmuGraphicsWindow.h>
-
-#include <Guid/EventGroup.h>
-
-#include <Library/DebugLib.h>
-#include <Library/BaseLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/UefiLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/KeyMapLib.h>
-
-
-#define MAX_Q 256
-
-typedef struct {
-  UINTN         Front;
-  UINTN         Rear;
-  UINTN         Count;
-  EFI_INPUT_KEY Q[MAX_Q];
-} GOP_QUEUE_FIXED;
-
-#define EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE SIGNATURE_32 ('U', 'g', 'S', 'n')
-typedef struct _EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY {
-  UINTN                                 Signature;
-  EFI_HANDLE                            NotifyHandle;
-  EFI_KEY_DATA                          KeyData;
-  EFI_KEY_NOTIFY_FUNCTION               KeyNotificationFn;
-  EFI_EVENT                             Event;
-  LIST_ENTRY                            NotifyEntry;
-} EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY;
-
-#define GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER 0xffff
-
-typedef struct {
-  UINT32                     HorizontalResolution;
-  UINT32                     VerticalResolution;
-  UINT32                     ColorDepth;
-  UINT32                     RefreshRate;
-} GOP_MODE_DATA;
-
-
-
-extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
-extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
-
-#define EMU_UGA_CLASS_NAME       L"EmuGopWindow"
-
-#define GOP_PRIVATE_DATA_SIGNATURE  SIGNATURE_32 ('G', 'o', 'p', 'N')
-typedef struct {
-  UINT64                            Signature;
-
-  EFI_HANDLE                        Handle;
-  EFI_GRAPHICS_OUTPUT_PROTOCOL      GraphicsOutput;
-  EFI_SIMPLE_TEXT_INPUT_PROTOCOL    SimpleTextIn;
-  EFI_SIMPLE_POINTER_PROTOCOL       SimplePointer;
-
-  EMU_IO_THUNK_PROTOCOL             *EmuIoThunk;
-  EMU_GRAPHICS_WINDOW_PROTOCOL      *EmuGraphicsWindow;
-
-  EFI_UNICODE_STRING_TABLE          *ControllerNameTable;
-
-  EFI_SIMPLE_POINTER_MODE           PointerMode;
-  //
-  // GOP Private Data for QueryMode ()
-  //
-  GOP_MODE_DATA                     *ModeData;
-
-
-  //
-  // UGA Private Data knowing when to start hardware
-  //
-  BOOLEAN                           HardwareNeedsStarting;
-
-  CHAR16                            *WindowName;
-
-  GOP_QUEUE_FIXED                   Queue;
-
-  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleTextInEx;
-  EFI_KEY_STATE                     KeyState;
-  LIST_ENTRY                        NotifyList;
-} GOP_PRIVATE_DATA;
-
-
-#define GOP_PRIVATE_DATA_FROM_THIS(a)  \
-         CR(a, GOP_PRIVATE_DATA, GraphicsOutput, GOP_PRIVATE_DATA_SIGNATURE)
-
-#define GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS(a)  \
-         CR(a, GOP_PRIVATE_DATA, SimpleTextIn, GOP_PRIVATE_DATA_SIGNATURE)
-
-#define GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS(a)  \
-         CR(a, GOP_PRIVATE_DATA, SimpleTextInEx, GOP_PRIVATE_DATA_SIGNATURE)
-
-#define GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS(a)  \
-         CR(a, GOP_PRIVATE_DATA, SimplePointer, GOP_PRIVATE_DATA_SIGNATURE)
-
-
-//
-// Global Protocol Variables
-//
-extern EFI_DRIVER_BINDING_PROTOCOL  gEmuGopDriverBinding;
-extern EFI_COMPONENT_NAME_PROTOCOL  gEmuGopComponentName;
-extern EFI_COMPONENT_NAME2_PROTOCOL gEmuGopComponentName2;
-
-//
-// Gop Hardware abstraction internal worker functions
-//
-EFI_STATUS
-EmuGopSupported (
-  IN  EMU_IO_THUNK_PROTOCOL  *EmuIoThunk
-  );
-
-EFI_STATUS
-EmuGopConstructor (
-  IN  GOP_PRIVATE_DATA    *Private
-  );
-
-EFI_STATUS
-EmuGopDestructor (
-  IN  GOP_PRIVATE_DATA    *Private
-  );
-
-
-EFI_STATUS
-GopPrivateAddQ (
-  IN  GOP_PRIVATE_DATA    *Private,
-  IN  EFI_INPUT_KEY       Key
-  );
-
-EFI_STATUS
-EmuGopInitializeSimpleTextInForWindow (
-  IN  GOP_PRIVATE_DATA    *Private
-  );
-
-EFI_STATUS
-EmuGopInitializeSimplePointerForWindow (
-  IN  GOP_PRIVATE_DATA    *Private
-  );
-
-EFI_STATUS
-EmuGopStartWindow (
-  IN  GOP_PRIVATE_DATA    *Private,
-  IN  UINT32              HorizontalResolution,
-  IN  UINT32              VerticalResolution,
-  IN  UINT32              ColorDepth,
-  IN  UINT32              RefreshRate
-  );
-
-VOID
-EFIAPI
-ShutdownGopEvent (
-  IN EFI_EVENT  Event,
-  IN VOID       *Context
-  );
-
-VOID
-EFIAPI
-GopPrivateMakeCallbackFunction (
-  IN VOID           *Context,
-  IN EFI_KEY_DATA   *KeyData
-  );
-
-VOID
-EFIAPI
-GopPrivateBreakCallbackFunction (
-  IN VOID           *Context,
-  IN EFI_KEY_DATA   *KeyData
-  );
-
-#endif
+/*++ @file
+
+Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
+Portions copyright (c) 2010,Apple Inc. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __UGA_H_
+#define __UGA_H_
+
+#include <PiDxe.h>
+
+#include <Protocol/GraphicsOutput.h>
+#include <Protocol/SimpleTextIn.h>
+#include <Protocol/SimpleTextInEx.h>
+#include <Protocol/SimplePointer.h>
+#include <Protocol/EmuIoThunk.h>
+#include <Protocol/EmuGraphicsWindow.h>
+
+#include <Guid/EventGroup.h>
+
+#include <Library/DebugLib.h>
+#include <Library/BaseLib.h>
+#include <Library/UefiDriverEntryPoint.h>
+#include <Library/UefiLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/KeyMapLib.h>
+
+
+#define MAX_Q 256
+
+typedef struct {
+  UINTN         Front;
+  UINTN         Rear;
+  UINTN         Count;
+  EFI_INPUT_KEY Q[MAX_Q];
+} GOP_QUEUE_FIXED;
+
+#define EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE SIGNATURE_32 ('U', 'g', 'S', 'n')
+typedef struct _EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY {
+  UINTN                                 Signature;
+  EFI_HANDLE                            NotifyHandle;
+  EFI_KEY_DATA                          KeyData;
+  EFI_KEY_NOTIFY_FUNCTION               KeyNotificationFn;
+  EFI_EVENT                             Event;
+  LIST_ENTRY                            NotifyEntry;
+} EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY;
+
+#define GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER 0xffff
+
+typedef struct {
+  UINT32                     HorizontalResolution;
+  UINT32                     VerticalResolution;
+  UINT32                     ColorDepth;
+  UINT32                     RefreshRate;
+} GOP_MODE_DATA;
+
+
+
+extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
+extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
+
+#define EMU_UGA_CLASS_NAME       L"EmuGopWindow"
+
+#define GOP_PRIVATE_DATA_SIGNATURE  SIGNATURE_32 ('G', 'o', 'p', 'N')
+typedef struct {
+  UINT64                            Signature;
+
+  EFI_HANDLE                        Handle;
+  EFI_GRAPHICS_OUTPUT_PROTOCOL      GraphicsOutput;
+  EFI_SIMPLE_TEXT_INPUT_PROTOCOL    SimpleTextIn;
+  EFI_SIMPLE_POINTER_PROTOCOL       SimplePointer;
+
+  EMU_IO_THUNK_PROTOCOL             *EmuIoThunk;
+  EMU_GRAPHICS_WINDOW_PROTOCOL      *EmuGraphicsWindow;
+
+  EFI_UNICODE_STRING_TABLE          *ControllerNameTable;
+
+  EFI_SIMPLE_POINTER_MODE           PointerMode;
+  //
+  // GOP Private Data for QueryMode ()
+  //
+  GOP_MODE_DATA                     *ModeData;
+
+
+  //
+  // UGA Private Data knowing when to start hardware
+  //
+  BOOLEAN                           HardwareNeedsStarting;
+
+  CHAR16                            *WindowName;
+
+  GOP_QUEUE_FIXED                   Queue;
+
+  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleTextInEx;
+  EFI_KEY_STATE                     KeyState;
+  LIST_ENTRY                        NotifyList;
+} GOP_PRIVATE_DATA;
+
+
+#define GOP_PRIVATE_DATA_FROM_THIS(a)  \
+         CR(a, GOP_PRIVATE_DATA, GraphicsOutput, GOP_PRIVATE_DATA_SIGNATURE)
+
+#define GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS(a)  \
+         CR(a, GOP_PRIVATE_DATA, SimpleTextIn, GOP_PRIVATE_DATA_SIGNATURE)
+
+#define GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS(a)  \
+         CR(a, GOP_PRIVATE_DATA, SimpleTextInEx, GOP_PRIVATE_DATA_SIGNATURE)
+
+#define GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS(a)  \
+         CR(a, GOP_PRIVATE_DATA, SimplePointer, GOP_PRIVATE_DATA_SIGNATURE)
+
+
+//
+// Global Protocol Variables
+//
+extern EFI_DRIVER_BINDING_PROTOCOL  gEmuGopDriverBinding;
+extern EFI_COMPONENT_NAME_PROTOCOL  gEmuGopComponentName;
+extern EFI_COMPONENT_NAME2_PROTOCOL gEmuGopComponentName2;
+
+//
+// Gop Hardware abstraction internal worker functions
+//
+EFI_STATUS
+EmuGopSupported (
+  IN  EMU_IO_THUNK_PROTOCOL  *EmuIoThunk
+  );
+
+EFI_STATUS
+EmuGopConstructor (
+  IN  GOP_PRIVATE_DATA    *Private
+  );
+
+EFI_STATUS
+EmuGopDestructor (
+  IN  GOP_PRIVATE_DATA    *Private
+  );
+
+
+EFI_STATUS
+GopPrivateAddQ (
+  IN  GOP_PRIVATE_DATA    *Private,
+  IN  EFI_INPUT_KEY       Key
+  );
+
+EFI_STATUS
+EmuGopInitializeSimpleTextInForWindow (
+  IN  GOP_PRIVATE_DATA    *Private
+  );
+
+EFI_STATUS
+EmuGopInitializeSimplePointerForWindow (
+  IN  GOP_PRIVATE_DATA    *Private
+  );
+
+EFI_STATUS
+EmuGopStartWindow (
+  IN  GOP_PRIVATE_DATA    *Private,
+  IN  UINT32              HorizontalResolution,
+  IN  UINT32              VerticalResolution,
+  IN  UINT32              ColorDepth,
+  IN  UINT32              RefreshRate
+  );
+
+VOID
+EFIAPI
+ShutdownGopEvent (
+  IN EFI_EVENT  Event,
+  IN VOID       *Context
+  );
+
+VOID
+EFIAPI
+GopPrivateMakeCallbackFunction (
+  IN VOID           *Context,
+  IN EFI_KEY_DATA   *KeyData
+  );
+
+VOID
+EFIAPI
+GopPrivateBreakCallbackFunction (
+  IN VOID           *Context,
+  IN EFI_KEY_DATA   *KeyData
+  );
+
+#endif

+ 900 - 900
EmulatorPkg/EmuGopDxe/GopInput.c

@@ -1,900 +1,900 @@
-/*++ @file
-
-Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
-Portions copyright (c) 2010 0 2011,Apple Inc. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution.  The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-
-**/
-
-#include "Gop.h"
-
-
-BOOLEAN
-GopPrivateIsKeyRegistered (
-  IN EFI_KEY_DATA  *RegsiteredData,
-  IN EFI_KEY_DATA  *InputData
-  )
-/*++
-
-Routine Description:
-
-Arguments:
-
-  RegsiteredData    - A pointer to a buffer that is filled in with the keystroke
-                      state data for the key that was registered.
-  InputData         - A pointer to a buffer that is filled in with the keystroke
-                      state data for the key that was pressed.
-
-Returns:
-  TRUE              - Key be pressed matches a registered key.
-  FLASE             - Match failed.
-
-**/
-{
-  ASSERT (RegsiteredData != NULL && InputData != NULL);
-
-  if ((RegsiteredData->Key.ScanCode    != InputData->Key.ScanCode) ||
-      (RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) {
-    return FALSE;
-  }
-
-  //
-  // Assume KeyShiftState/KeyToggleState = 0 in Registered key data means these state could be ignored.
-  //
-  if (RegsiteredData->KeyState.KeyShiftState != 0 &&
-      RegsiteredData->KeyState.KeyShiftState != InputData->KeyState.KeyShiftState) {
-    return FALSE;
-  }
-  if (RegsiteredData->KeyState.KeyToggleState != 0 &&
-      RegsiteredData->KeyState.KeyToggleState != InputData->KeyState.KeyToggleState) {
-    return FALSE;
-  }
-
-  return TRUE;
-
-}
-
-
-VOID
-EFIAPI
-GopPrivateMakeCallbackFunction (
-  IN VOID           *Context,
-  IN EFI_KEY_DATA   *KeyData
-  )
-{
-  LIST_ENTRY                        *Link;
-  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY  *CurrentNotify;
-  GOP_PRIVATE_DATA                  *Private = (GOP_PRIVATE_DATA *)Context;
-
-  KeyMapMake (KeyData);
-
-  for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {
-    CurrentNotify = CR (
-                      Link,
-                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
-                      NotifyEntry,
-                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
-                      );
-    if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
-      // We could be called at a high TPL so signal an event to call the registered function
-      // at a lower TPL.
-      gBS->SignalEvent (CurrentNotify->Event);
-    }
-  }
-}
-
-
-VOID
-EFIAPI
-GopPrivateBreakCallbackFunction (
-  IN VOID           *Context,
-  IN EFI_KEY_DATA   *KeyData
-  )
-{
-  KeyMapBreak (KeyData);
-}
-
-
-
-//
-// Simple Text In implementation.
-//
-
-/**
-  Reset the input device and optionally run diagnostics
-
-  @param  This                 Protocol instance pointer.
-  @param  ExtendedVerification Driver may perform diagnostics on reset.
-
-  @retval EFI_SUCCESS          The device was reset.
-  @retval EFI_DEVICE_ERROR     The device is not functioning properly and could not be reset.
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopSimpleTextInReset (
-  IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL       *This,
-  IN BOOLEAN                              ExtendedVerification
-  )
-{
-  GOP_PRIVATE_DATA  *Private;
-  EFI_KEY_DATA      KeyData;
-  EFI_TPL           OldTpl;
-
-  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
-  if (Private->EmuGraphicsWindow == NULL) {
-    return EFI_SUCCESS;
-  }
-
-  //
-  // Enter critical section
-  //
-  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
-
-  //
-  // A reset is draining the Queue
-  //
-  while (Private->EmuGraphicsWindow->GetKey (Private->EmuGraphicsWindow, &KeyData) == EFI_SUCCESS)
-    ;
-
-  //
-  // Leave critical section and return
-  //
-  gBS->RestoreTPL (OldTpl);
-  return EFI_SUCCESS;
-}
-
-
-/**
-  Reads the next keystroke from the input device. The WaitForKey Event can
-  be used to test for existence of a keystroke via WaitForEvent () call.
-
-  @param  This  Protocol instance pointer.
-  @param  Key   A pointer to a buffer that is filled in with the keystroke
-                information for the key that was pressed.
-
-  @retval EFI_SUCCESS      The keystroke information was returned.
-  @retval EFI_NOT_READY    There was no keystroke data available.
-  @retval EFI_DEVICE_ERROR The keystroke information was not returned due to
-                           hardware errors.
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopSimpleTextInReadKeyStroke (
-  IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL       *This,
-  OUT EFI_INPUT_KEY                       *Key
-  )
-{
-  GOP_PRIVATE_DATA  *Private;
-  EFI_STATUS        Status;
-  EFI_TPL           OldTpl;
-  EFI_KEY_DATA      KeyData;
-
-  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
-  if (Private->EmuGraphicsWindow == NULL) {
-    return EFI_NOT_READY;
-  }
-
-  //
-  // Enter critical section
-  //
-  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
-
-  Status  = Private->EmuGraphicsWindow->GetKey (Private->EmuGraphicsWindow, &KeyData);
-  if (!EFI_ERROR (Status)) {
-    if ((KeyData.Key.ScanCode == 0) && (KeyData.Key.UnicodeChar == 0)) {
-      // Modifier key was pressed
-      Status = EFI_NOT_READY;
-    } else {
-      CopyMem (Key, &KeyData.Key, sizeof (EFI_INPUT_KEY));
-    }
-  }
-
-  //
-  // Leave critical section and return
-  //
-  gBS->RestoreTPL (OldTpl);
-
-  return Status;
-}
-
-
-
-/**
-  SimpleTextIn and SimpleTextInEx Notify Wait Event
-
-  @param  Event                 Event whose notification function is being invoked.
-  @param  Context               Pointer to GOP_PRIVATE_DATA.
-
-**/
-VOID
-EFIAPI
-EmuGopSimpleTextInWaitForKey (
-  IN EFI_EVENT          Event,
-  IN VOID               *Context
-  )
-{
-  GOP_PRIVATE_DATA  *Private;
-  EFI_STATUS        Status;
-  EFI_TPL           OldTpl;
-
-  Private = (GOP_PRIVATE_DATA *) Context;
-  if (Private->EmuGraphicsWindow == NULL) {
-    return;
-  }
-
-  //
-  // Enter critical section
-  //
-  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
-
-  Status  = Private->EmuGraphicsWindow->CheckKey (Private->EmuGraphicsWindow);
-  if (!EFI_ERROR (Status)) {
-    //
-    // If a there is a key in the queue signal our event.
-    //
-    gBS->SignalEvent (Event);
-  }
-  //
-  // Leave critical section and return
-  //
-  gBS->RestoreTPL (OldTpl);
-}
-
-
-//
-// Simple Text Input Ex protocol functions
-//
-
-
-/**
-  The Reset() function resets the input device hardware. As part
-  of initialization process, the firmware/device will make a quick
-  but reasonable attempt to verify that the device is functioning.
-  If the ExtendedVerification flag is TRUE the firmware may take
-  an extended amount of time to verify the device is operating on
-  reset. Otherwise the reset operation is to occur as quickly as
-  possible. The hardware verification process is not defined by
-  this specification and is left up to the platform firmware or
-  driver to implement.
-
-  @param This                 A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
-
-  @param ExtendedVerification Indicates that the driver may
-                              perform a more exhaustive
-                              verification operation of the
-                              device during reset.
-
-
-  @retval EFI_SUCCESS       The device was reset.
-
-  @retval EFI_DEVICE_ERROR  The device is not functioning
-                            correctly and could not be reset.
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopSimpleTextInExResetEx (
-  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
-  IN BOOLEAN                            ExtendedVerification
-  )
-/*++
-
-  Routine Description:
-    Reset the input device and optionaly run diagnostics
-
-  Arguments:
-    This                 - Protocol instance pointer.
-    ExtendedVerification - Driver may perform diagnostics on reset.
-
-  Returns:
-    EFI_SUCCESS           - The device was reset.
-
-**/
-{
-  return EFI_SUCCESS;
-}
-
-
-
-/**
-  The function reads the next keystroke from the input device. If
-  there is no pending keystroke the function returns
-  EFI_NOT_READY. If there is a pending keystroke, then
-  KeyData.Key.ScanCode is the EFI scan code defined in Error!
-  Reference source not found. The KeyData.Key.UnicodeChar is the
-  actual printable character or is zero if the key does not
-  represent a printable character (control key, function key,
-  etc.). The KeyData.KeyState is shift state for the character
-  reflected in KeyData.Key.UnicodeChar or KeyData.Key.ScanCode .
-  When interpreting the data from this function, it should be
-  noted that if a class of printable characters that are
-  normally adjusted by shift modifiers (e.g. Shift Key + "f"
-  key) would be presented solely as a KeyData.Key.UnicodeChar
-  without the associated shift state. So in the previous example
-  of a Shift Key + "f" key being pressed, the only pertinent
-  data returned would be KeyData.Key.UnicodeChar with the value
-  of "F". This of course would not typically be the case for
-  non-printable characters such as the pressing of the Right
-  Shift Key + F10 key since the corresponding returned data
-  would be reflected both in the KeyData.KeyState.KeyShiftState
-  and KeyData.Key.ScanCode values. UEFI drivers which implement
-  the EFI_SIMPLE_TEXT_INPUT_EX protocol are required to return
-  KeyData.Key and KeyData.KeyState values. These drivers must
-  always return the most current state of
-  KeyData.KeyState.KeyShiftState and
-  KeyData.KeyState.KeyToggleState. It should also be noted that
-  certain input devices may not be able to produce shift or toggle
-  state information, and in those cases the high order bit in the
-  respective Toggle and Shift state fields should not be active.
-
-
-  @param This     A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
-
-  @param KeyData  A pointer to a buffer that is filled in with
-                  the keystroke state data for the key that was
-                  pressed.
-
-
-  @retval EFI_SUCCESS     The keystroke information was
-                          returned.
-
-  @retval EFI_NOT_READY   There was no keystroke data available.
-                          EFI_DEVICE_ERROR The keystroke
-                          information was not returned due to
-                          hardware errors.
-
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopSimpleTextInExReadKeyStrokeEx (
-  IN  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
-  OUT EFI_KEY_DATA                      *KeyData
-  )
-/*++
-
-  Routine Description:
-    Reads the next keystroke from the input device. The WaitForKey Event can
-    be used to test for existance of a keystroke via WaitForEvent () call.
-
-  Arguments:
-    This       - Protocol instance pointer.
-    KeyData    - A pointer to a buffer that is filled in with the keystroke
-                 state data for the key that was pressed.
-
-  Returns:
-    EFI_SUCCESS           - The keystroke information was returned.
-    EFI_NOT_READY         - There was no keystroke data availiable.
-    EFI_DEVICE_ERROR      - The keystroke information was not returned due to
-                            hardware errors.
-    EFI_INVALID_PARAMETER - KeyData is NULL.
-
-**/
-{
-  EFI_STATUS        Status;
-  GOP_PRIVATE_DATA  *Private;
-  EFI_TPL           OldTpl;
-
-
-  if (KeyData == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
-  if (Private->EmuGraphicsWindow == NULL) {
-    return EFI_NOT_READY;
-  }
-
-  //
-  // Enter critical section
-  //
-  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
-
-  Status  = Private->EmuGraphicsWindow->GetKey(Private->EmuGraphicsWindow, KeyData);
-
-  //
-  // Leave critical section and return
-  //
-  gBS->RestoreTPL (OldTpl);
-
-  return Status;
-}
-
-
-
-/**
-  The SetState() function allows the input device hardware to
-  have state settings adjusted.
-
-  @param This           A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
-
-  @param KeyToggleState Pointer to the EFI_KEY_TOGGLE_STATE to
-                        set the state for the input device.
-
-
-  @retval EFI_SUCCESS       The device state was set appropriately.
-
-  @retval EFI_DEVICE_ERROR  The device is not functioning
-                            correctly and could not have the
-                            setting adjusted.
-
-  @retval EFI_UNSUPPORTED   The device does not support the
-                            ability to have its state set.
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopSimpleTextInExSetState (
-  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
-  IN EFI_KEY_TOGGLE_STATE               *KeyToggleState
-  )
-{
-  GOP_PRIVATE_DATA  *Private;
-  EFI_STATUS        Status;
-  EFI_TPL           OldTpl;
-
-  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
-  if (Private->EmuGraphicsWindow == NULL) {
-    return EFI_NOT_READY;
-  }
-
-  //
-  // Enter critical section
-  //
-  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
-
-  Status  = Private->EmuGraphicsWindow->KeySetState (Private->EmuGraphicsWindow, KeyToggleState);
-  //
-  // Leave critical section and return
-  //
-  gBS->RestoreTPL (OldTpl);
-
-  return Status;
-}
-
-
-/**
-  SimpleTextIn and SimpleTextInEx Notify Wait Event
-
-  @param  Event                 Event whose notification function is being invoked.
-  @param  Context               Pointer to GOP_PRIVATE_DATA.
-
-**/
-VOID
-EFIAPI
-EmuGopRegisterKeyCallback (
-  IN EFI_EVENT          Event,
-  IN VOID               *Context
-  )
-{
-  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *ExNotify = (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *)Context;
-
-  ExNotify->KeyNotificationFn (&ExNotify->KeyData);
-}
-
-
-
-/**
-  The RegisterKeystrokeNotify() function registers a function
-  which will be called when a specified keystroke will occur.
-
-  @param This                     A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
-
-  @param KeyData                  A pointer to a buffer that is filled in with
-                                  the keystroke information for the key that was
-                                  pressed.
-
-  @param KeyNotificationFunction  Points to the function to be
-                                  called when the key sequence
-                                  is typed specified by KeyData.
-
-
-  @param NotifyHandle             Points to the unique handle assigned to
-                                  the registered notification.
-
-  @retval EFI_SUCCESS           The device state was set
-                                appropriately.
-
-  @retval EFI_OUT_OF_RESOURCES  Unable to allocate necessary
-                                data structures.
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopSimpleTextInExRegisterKeyNotify (
-  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
-  IN EFI_KEY_DATA                       *KeyData,
-  IN EFI_KEY_NOTIFY_FUNCTION            KeyNotificationFunction,
-  OUT EFI_HANDLE                        *NotifyHandle
-  )
-{
-  EFI_STATUS                          Status;
-  GOP_PRIVATE_DATA                    *Private;
-  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY     *CurrentNotify;
-  LIST_ENTRY                          *Link;
-  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY     *NewNotify;
-
-  if (KeyData == NULL || KeyNotificationFunction == NULL || NotifyHandle == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
-
-  //
-  // Return EFI_SUCCESS if the (KeyData, NotificationFunction) is already registered.
-  //
-  for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {
-    CurrentNotify = CR (
-                      Link,
-                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
-                      NotifyEntry,
-                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
-                      );
-    if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
-      if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) {
-        *NotifyHandle = CurrentNotify->NotifyHandle;
-        return EFI_SUCCESS;
-      }
-    }
-  }
-
-  //
-  // Allocate resource to save the notification function
-  //
-  NewNotify = (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) AllocateZeroPool (sizeof (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY));
-  if (NewNotify == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  NewNotify->Signature         = EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE;
-  NewNotify->KeyNotificationFn = KeyNotificationFunction;
-  NewNotify->NotifyHandle      = (EFI_HANDLE) NewNotify;
-  CopyMem (&NewNotify->KeyData, KeyData, sizeof (KeyData));
-  InsertTailList (&Private->NotifyList, &NewNotify->NotifyEntry);
-
-  Status = gBS->CreateEvent (
-                  EVT_NOTIFY_SIGNAL,
-                  TPL_NOTIFY,
-                  EmuGopRegisterKeyCallback,
-                  NewNotify,
-                  &NewNotify->Event
-                  );
-  ASSERT_EFI_ERROR (Status);
-
-
-  *NotifyHandle = NewNotify->NotifyHandle;
-
-  return EFI_SUCCESS;
-
-}
-
-
-/**
-  The UnregisterKeystrokeNotify() function removes the
-  notification which was previously registered.
-
-  @param This               A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
-
-  @param NotificationHandle The handle of the notification
-                            function being unregistered.
-
-  @retval EFI_SUCCESS The device state was set appropriately.
-
-  @retval EFI_INVALID_PARAMETER The NotificationHandle is
-                                invalid.
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopSimpleTextInExUnregisterKeyNotify (
-  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
-  IN EFI_HANDLE                         NotificationHandle
-  )
-/*++
-
-  Routine Description:
-    Remove a registered notification function from a particular keystroke.
-
-  Arguments:
-    This                    - Protocol instance pointer.
-    NotificationHandle      - The handle of the notification function being unregistered.
-
-  Returns:
-    EFI_SUCCESS             - The notification function was unregistered successfully.
-    EFI_INVALID_PARAMETER   - The NotificationHandle is invalid.
-
-**/
-{
-  GOP_PRIVATE_DATA                   *Private;
-  LIST_ENTRY                         *Link;
-  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
-
-  if (NotificationHandle == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if (((EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) NotificationHandle)->Signature != EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
-
-  for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {
-    CurrentNotify = CR (
-                      Link,
-                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
-                      NotifyEntry,
-                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
-                      );
-    if (CurrentNotify->NotifyHandle == NotificationHandle) {
-      //
-      // Remove the notification function from NotifyList and free resources
-      //
-      RemoveEntryList (&CurrentNotify->NotifyEntry);
-
-      gBS->CloseEvent (CurrentNotify->Event);
-
-      gBS->FreePool (CurrentNotify);
-      return EFI_SUCCESS;
-    }
-  }
-
-  //
-  // Can not find the specified Notification Handle
-  //
-  return EFI_INVALID_PARAMETER;
-}
-
-
-
-/**
-  Initialize SimplelTextIn and SimpleTextInEx protocols in the Private
-  context structure.
-
-  @param  Private               Context structure to fill in.
-
-  @return EFI_SUCCESS           Initialization was a success
-
-**/
-EFI_STATUS
-EmuGopInitializeSimpleTextInForWindow (
-  IN  GOP_PRIVATE_DATA    *Private
-  )
-{
-  EFI_STATUS  Status;
-
-  //
-  // Initialize Simple Text In protoocol
-  //
-  Private->SimpleTextIn.Reset         = EmuGopSimpleTextInReset;
-  Private->SimpleTextIn.ReadKeyStroke = EmuGopSimpleTextInReadKeyStroke;
-
-  Status = gBS->CreateEvent (
-                  EVT_NOTIFY_WAIT,
-                  TPL_NOTIFY,
-                  EmuGopSimpleTextInWaitForKey,
-                  Private,
-                  &Private->SimpleTextIn.WaitForKey
-                  );
-  ASSERT_EFI_ERROR (Status);
-
-
-  //
-  // Initialize Simple Text In Ex
-  //
-
-  Private->SimpleTextInEx.Reset               = EmuGopSimpleTextInExResetEx;
-  Private->SimpleTextInEx.ReadKeyStrokeEx     = EmuGopSimpleTextInExReadKeyStrokeEx;
-  Private->SimpleTextInEx.SetState            = EmuGopSimpleTextInExSetState;
-  Private->SimpleTextInEx.RegisterKeyNotify   = EmuGopSimpleTextInExRegisterKeyNotify;
-  Private->SimpleTextInEx.UnregisterKeyNotify = EmuGopSimpleTextInExUnregisterKeyNotify;
-
-  Private->SimpleTextInEx.Reset (&Private->SimpleTextInEx, FALSE);
-
-  InitializeListHead (&Private->NotifyList);
-
-  Status = gBS->CreateEvent (
-                  EVT_NOTIFY_WAIT,
-                  TPL_NOTIFY,
-                  EmuGopSimpleTextInWaitForKey,
-                  Private,
-                  &Private->SimpleTextInEx.WaitForKeyEx
-                  );
-  ASSERT_EFI_ERROR (Status);
-
-
-  return Status;
-}
-
-
-
-
-
-
-
-//
-// Simple Pointer implementation.
-//
-
-
-/**
-  Resets the pointer device hardware.
-
-  @param  This                  A pointer to the EFI_SIMPLE_POINTER_PROTOCOL
-                                instance.
-  @param  ExtendedVerification  Indicates that the driver may perform a more exhaustive
-                                verification operation of the device during reset.
-
-  @retval EFI_SUCCESS           The device was reset.
-  @retval EFI_DEVICE_ERROR      The device is not functioning correctly and could not be reset.
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopSimplePointerReset (
-  IN EFI_SIMPLE_POINTER_PROTOCOL          *This,
-  IN BOOLEAN                              ExtendedVerification
-  )
-{
-  GOP_PRIVATE_DATA             *Private;
-  EFI_SIMPLE_POINTER_STATE     State;
-  EFI_TPL                      OldTpl;
-
-  Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);
-  if (Private->EmuGraphicsWindow == NULL) {
-    return EFI_SUCCESS;
-  }
-
-  //
-  // Enter critical section
-  //
-  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
-
-  //
-  // A reset is draining the Queue
-  //
-  while (Private->EmuGraphicsWindow->GetPointerState (Private->EmuGraphicsWindow, &State) == EFI_SUCCESS)
-    ;
-
-  //
-  // Leave critical section and return
-  //
-  gBS->RestoreTPL (OldTpl);
-  return EFI_SUCCESS;
-}
-
-
-/**
-  Retrieves the current state of a pointer device.
-
-  @param  This                  A pointer to the EFI_SIMPLE_POINTER_PROTOCOL
-                                instance.
-  @param  State                 A pointer to the state information on the pointer device.
-
-  @retval EFI_SUCCESS           The state of the pointer device was returned in State.
-  @retval EFI_NOT_READY         The state of the pointer device has not changed since the last call to
-                                GetState().
-  @retval EFI_DEVICE_ERROR      A device error occurred while attempting to retrieve the pointer device's
-                                current state.
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopSimplePointerGetState (
-  IN EFI_SIMPLE_POINTER_PROTOCOL          *This,
-  IN OUT EFI_SIMPLE_POINTER_STATE         *State
-  )
-{
-  GOP_PRIVATE_DATA  *Private;
-  EFI_STATUS        Status;
-  EFI_TPL           OldTpl;
-
-  Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);
-  if (Private->EmuGraphicsWindow == NULL) {
-    return EFI_NOT_READY;
-  }
-
-  //
-  // Enter critical section
-  //
-  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
-
-  Status  = Private->EmuGraphicsWindow->GetPointerState (Private->EmuGraphicsWindow, State);
-  //
-  // Leave critical section and return
-  //
-  gBS->RestoreTPL (OldTpl);
-
-  return Status;
-}
-
-
-/**
-  SimplePointer Notify Wait Event
-
-  @param  Event                 Event whose notification function is being invoked.
-  @param  Context               Pointer to GOP_PRIVATE_DATA.
-
-**/
-VOID
-EFIAPI
-EmuGopSimplePointerWaitForInput (
-  IN EFI_EVENT          Event,
-  IN VOID               *Context
-  )
-{
-  GOP_PRIVATE_DATA  *Private;
-  EFI_STATUS        Status;
-  EFI_TPL           OldTpl;
-
-  Private = (GOP_PRIVATE_DATA *) Context;
-  if (Private->EmuGraphicsWindow == NULL) {
-    return;
-  }
-
-  //
-  // Enter critical section
-  //
-  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
-
-  Status  = Private->EmuGraphicsWindow->CheckPointer (Private->EmuGraphicsWindow);
-  if (!EFI_ERROR (Status)) {
-    //
-    // If the pointer state has changed, signal our event.
-    //
-    gBS->SignalEvent (Event);
-  }
-  //
-  // Leave critical section and return
-  //
-  gBS->RestoreTPL (OldTpl);
-}
-
-
-/**
-  SimplePointer constructor
-
-  @param  Private Context structure to fill in.
-
-  @retval EFI_SUCCESS Constructor had success
-
-**/
-EFI_STATUS
-EmuGopInitializeSimplePointerForWindow (
-  IN  GOP_PRIVATE_DATA    *Private
-  )
-{
-  EFI_STATUS  Status;
-
-  //
-  // Initialize Simple Pointer protoocol
-  //
-  Private->PointerMode.ResolutionX = 1;
-  Private->PointerMode.ResolutionY = 1;
-  Private->PointerMode.ResolutionZ = 1;
-  Private->PointerMode.LeftButton  = TRUE;
-  Private->PointerMode.RightButton = TRUE;
-
-  Private->SimplePointer.Reset     = EmuGopSimplePointerReset;
-  Private->SimplePointer.GetState  = EmuGopSimplePointerGetState;
-  Private->SimplePointer.Mode      = &Private->PointerMode;
-
-  Status = gBS->CreateEvent (
-                  EVT_NOTIFY_WAIT,
-                  TPL_NOTIFY,
-                  EmuGopSimplePointerWaitForInput,
-                  Private,
-                  &Private->SimplePointer.WaitForInput
-                  );
-
-  return Status;
-}
+/*++ @file
+
+Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
+Portions copyright (c) 2010 0 2011,Apple Inc. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+
+**/
+
+#include "Gop.h"
+
+
+BOOLEAN
+GopPrivateIsKeyRegistered (
+  IN EFI_KEY_DATA  *RegsiteredData,
+  IN EFI_KEY_DATA  *InputData
+  )
+/*++
+
+Routine Description:
+
+Arguments:
+
+  RegsiteredData    - A pointer to a buffer that is filled in with the keystroke
+                      state data for the key that was registered.
+  InputData         - A pointer to a buffer that is filled in with the keystroke
+                      state data for the key that was pressed.
+
+Returns:
+  TRUE              - Key be pressed matches a registered key.
+  FLASE             - Match failed.
+
+**/
+{
+  ASSERT (RegsiteredData != NULL && InputData != NULL);
+
+  if ((RegsiteredData->Key.ScanCode    != InputData->Key.ScanCode) ||
+      (RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) {
+    return FALSE;
+  }
+
+  //
+  // Assume KeyShiftState/KeyToggleState = 0 in Registered key data means these state could be ignored.
+  //
+  if (RegsiteredData->KeyState.KeyShiftState != 0 &&
+      RegsiteredData->KeyState.KeyShiftState != InputData->KeyState.KeyShiftState) {
+    return FALSE;
+  }
+  if (RegsiteredData->KeyState.KeyToggleState != 0 &&
+      RegsiteredData->KeyState.KeyToggleState != InputData->KeyState.KeyToggleState) {
+    return FALSE;
+  }
+
+  return TRUE;
+
+}
+
+
+VOID
+EFIAPI
+GopPrivateMakeCallbackFunction (
+  IN VOID           *Context,
+  IN EFI_KEY_DATA   *KeyData
+  )
+{
+  LIST_ENTRY                        *Link;
+  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY  *CurrentNotify;
+  GOP_PRIVATE_DATA                  *Private = (GOP_PRIVATE_DATA *)Context;
+
+  KeyMapMake (KeyData);
+
+  for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {
+    CurrentNotify = CR (
+                      Link,
+                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
+                      NotifyEntry,
+                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
+                      );
+    if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
+      // We could be called at a high TPL so signal an event to call the registered function
+      // at a lower TPL.
+      gBS->SignalEvent (CurrentNotify->Event);
+    }
+  }
+}
+
+
+VOID
+EFIAPI
+GopPrivateBreakCallbackFunction (
+  IN VOID           *Context,
+  IN EFI_KEY_DATA   *KeyData
+  )
+{
+  KeyMapBreak (KeyData);
+}
+
+
+
+//
+// Simple Text In implementation.
+//
+
+/**
+  Reset the input device and optionally run diagnostics
+
+  @param  This                 Protocol instance pointer.
+  @param  ExtendedVerification Driver may perform diagnostics on reset.
+
+  @retval EFI_SUCCESS          The device was reset.
+  @retval EFI_DEVICE_ERROR     The device is not functioning properly and could not be reset.
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopSimpleTextInReset (
+  IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL       *This,
+  IN BOOLEAN                              ExtendedVerification
+  )
+{
+  GOP_PRIVATE_DATA  *Private;
+  EFI_KEY_DATA      KeyData;
+  EFI_TPL           OldTpl;
+
+  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
+  if (Private->EmuGraphicsWindow == NULL) {
+    return EFI_SUCCESS;
+  }
+
+  //
+  // Enter critical section
+  //
+  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
+
+  //
+  // A reset is draining the Queue
+  //
+  while (Private->EmuGraphicsWindow->GetKey (Private->EmuGraphicsWindow, &KeyData) == EFI_SUCCESS)
+    ;
+
+  //
+  // Leave critical section and return
+  //
+  gBS->RestoreTPL (OldTpl);
+  return EFI_SUCCESS;
+}
+
+
+/**
+  Reads the next keystroke from the input device. The WaitForKey Event can
+  be used to test for existence of a keystroke via WaitForEvent () call.
+
+  @param  This  Protocol instance pointer.
+  @param  Key   A pointer to a buffer that is filled in with the keystroke
+                information for the key that was pressed.
+
+  @retval EFI_SUCCESS      The keystroke information was returned.
+  @retval EFI_NOT_READY    There was no keystroke data available.
+  @retval EFI_DEVICE_ERROR The keystroke information was not returned due to
+                           hardware errors.
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopSimpleTextInReadKeyStroke (
+  IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL       *This,
+  OUT EFI_INPUT_KEY                       *Key
+  )
+{
+  GOP_PRIVATE_DATA  *Private;
+  EFI_STATUS        Status;
+  EFI_TPL           OldTpl;
+  EFI_KEY_DATA      KeyData;
+
+  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
+  if (Private->EmuGraphicsWindow == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  //
+  // Enter critical section
+  //
+  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
+
+  Status  = Private->EmuGraphicsWindow->GetKey (Private->EmuGraphicsWindow, &KeyData);
+  if (!EFI_ERROR (Status)) {
+    if ((KeyData.Key.ScanCode == 0) && (KeyData.Key.UnicodeChar == 0)) {
+      // Modifier key was pressed
+      Status = EFI_NOT_READY;
+    } else {
+      CopyMem (Key, &KeyData.Key, sizeof (EFI_INPUT_KEY));
+    }
+  }
+
+  //
+  // Leave critical section and return
+  //
+  gBS->RestoreTPL (OldTpl);
+
+  return Status;
+}
+
+
+
+/**
+  SimpleTextIn and SimpleTextInEx Notify Wait Event
+
+  @param  Event                 Event whose notification function is being invoked.
+  @param  Context               Pointer to GOP_PRIVATE_DATA.
+
+**/
+VOID
+EFIAPI
+EmuGopSimpleTextInWaitForKey (
+  IN EFI_EVENT          Event,
+  IN VOID               *Context
+  )
+{
+  GOP_PRIVATE_DATA  *Private;
+  EFI_STATUS        Status;
+  EFI_TPL           OldTpl;
+
+  Private = (GOP_PRIVATE_DATA *) Context;
+  if (Private->EmuGraphicsWindow == NULL) {
+    return;
+  }
+
+  //
+  // Enter critical section
+  //
+  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
+
+  Status  = Private->EmuGraphicsWindow->CheckKey (Private->EmuGraphicsWindow);
+  if (!EFI_ERROR (Status)) {
+    //
+    // If a there is a key in the queue signal our event.
+    //
+    gBS->SignalEvent (Event);
+  }
+  //
+  // Leave critical section and return
+  //
+  gBS->RestoreTPL (OldTpl);
+}
+
+
+//
+// Simple Text Input Ex protocol functions
+//
+
+
+/**
+  The Reset() function resets the input device hardware. As part
+  of initialization process, the firmware/device will make a quick
+  but reasonable attempt to verify that the device is functioning.
+  If the ExtendedVerification flag is TRUE the firmware may take
+  an extended amount of time to verify the device is operating on
+  reset. Otherwise the reset operation is to occur as quickly as
+  possible. The hardware verification process is not defined by
+  this specification and is left up to the platform firmware or
+  driver to implement.
+
+  @param This                 A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
+
+  @param ExtendedVerification Indicates that the driver may
+                              perform a more exhaustive
+                              verification operation of the
+                              device during reset.
+
+
+  @retval EFI_SUCCESS       The device was reset.
+
+  @retval EFI_DEVICE_ERROR  The device is not functioning
+                            correctly and could not be reset.
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopSimpleTextInExResetEx (
+  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
+  IN BOOLEAN                            ExtendedVerification
+  )
+/*++
+
+  Routine Description:
+    Reset the input device and optionaly run diagnostics
+
+  Arguments:
+    This                 - Protocol instance pointer.
+    ExtendedVerification - Driver may perform diagnostics on reset.
+
+  Returns:
+    EFI_SUCCESS           - The device was reset.
+
+**/
+{
+  return EFI_SUCCESS;
+}
+
+
+
+/**
+  The function reads the next keystroke from the input device. If
+  there is no pending keystroke the function returns
+  EFI_NOT_READY. If there is a pending keystroke, then
+  KeyData.Key.ScanCode is the EFI scan code defined in Error!
+  Reference source not found. The KeyData.Key.UnicodeChar is the
+  actual printable character or is zero if the key does not
+  represent a printable character (control key, function key,
+  etc.). The KeyData.KeyState is shift state for the character
+  reflected in KeyData.Key.UnicodeChar or KeyData.Key.ScanCode .
+  When interpreting the data from this function, it should be
+  noted that if a class of printable characters that are
+  normally adjusted by shift modifiers (e.g. Shift Key + "f"
+  key) would be presented solely as a KeyData.Key.UnicodeChar
+  without the associated shift state. So in the previous example
+  of a Shift Key + "f" key being pressed, the only pertinent
+  data returned would be KeyData.Key.UnicodeChar with the value
+  of "F". This of course would not typically be the case for
+  non-printable characters such as the pressing of the Right
+  Shift Key + F10 key since the corresponding returned data
+  would be reflected both in the KeyData.KeyState.KeyShiftState
+  and KeyData.Key.ScanCode values. UEFI drivers which implement
+  the EFI_SIMPLE_TEXT_INPUT_EX protocol are required to return
+  KeyData.Key and KeyData.KeyState values. These drivers must
+  always return the most current state of
+  KeyData.KeyState.KeyShiftState and
+  KeyData.KeyState.KeyToggleState. It should also be noted that
+  certain input devices may not be able to produce shift or toggle
+  state information, and in those cases the high order bit in the
+  respective Toggle and Shift state fields should not be active.
+
+
+  @param This     A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
+
+  @param KeyData  A pointer to a buffer that is filled in with
+                  the keystroke state data for the key that was
+                  pressed.
+
+
+  @retval EFI_SUCCESS     The keystroke information was
+                          returned.
+
+  @retval EFI_NOT_READY   There was no keystroke data available.
+                          EFI_DEVICE_ERROR The keystroke
+                          information was not returned due to
+                          hardware errors.
+
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopSimpleTextInExReadKeyStrokeEx (
+  IN  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
+  OUT EFI_KEY_DATA                      *KeyData
+  )
+/*++
+
+  Routine Description:
+    Reads the next keystroke from the input device. The WaitForKey Event can
+    be used to test for existance of a keystroke via WaitForEvent () call.
+
+  Arguments:
+    This       - Protocol instance pointer.
+    KeyData    - A pointer to a buffer that is filled in with the keystroke
+                 state data for the key that was pressed.
+
+  Returns:
+    EFI_SUCCESS           - The keystroke information was returned.
+    EFI_NOT_READY         - There was no keystroke data availiable.
+    EFI_DEVICE_ERROR      - The keystroke information was not returned due to
+                            hardware errors.
+    EFI_INVALID_PARAMETER - KeyData is NULL.
+
+**/
+{
+  EFI_STATUS        Status;
+  GOP_PRIVATE_DATA  *Private;
+  EFI_TPL           OldTpl;
+
+
+  if (KeyData == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
+  if (Private->EmuGraphicsWindow == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  //
+  // Enter critical section
+  //
+  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
+
+  Status  = Private->EmuGraphicsWindow->GetKey(Private->EmuGraphicsWindow, KeyData);
+
+  //
+  // Leave critical section and return
+  //
+  gBS->RestoreTPL (OldTpl);
+
+  return Status;
+}
+
+
+
+/**
+  The SetState() function allows the input device hardware to
+  have state settings adjusted.
+
+  @param This           A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
+
+  @param KeyToggleState Pointer to the EFI_KEY_TOGGLE_STATE to
+                        set the state for the input device.
+
+
+  @retval EFI_SUCCESS       The device state was set appropriately.
+
+  @retval EFI_DEVICE_ERROR  The device is not functioning
+                            correctly and could not have the
+                            setting adjusted.
+
+  @retval EFI_UNSUPPORTED   The device does not support the
+                            ability to have its state set.
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopSimpleTextInExSetState (
+  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
+  IN EFI_KEY_TOGGLE_STATE               *KeyToggleState
+  )
+{
+  GOP_PRIVATE_DATA  *Private;
+  EFI_STATUS        Status;
+  EFI_TPL           OldTpl;
+
+  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
+  if (Private->EmuGraphicsWindow == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  //
+  // Enter critical section
+  //
+  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
+
+  Status  = Private->EmuGraphicsWindow->KeySetState (Private->EmuGraphicsWindow, KeyToggleState);
+  //
+  // Leave critical section and return
+  //
+  gBS->RestoreTPL (OldTpl);
+
+  return Status;
+}
+
+
+/**
+  SimpleTextIn and SimpleTextInEx Notify Wait Event
+
+  @param  Event                 Event whose notification function is being invoked.
+  @param  Context               Pointer to GOP_PRIVATE_DATA.
+
+**/
+VOID
+EFIAPI
+EmuGopRegisterKeyCallback (
+  IN EFI_EVENT          Event,
+  IN VOID               *Context
+  )
+{
+  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *ExNotify = (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *)Context;
+
+  ExNotify->KeyNotificationFn (&ExNotify->KeyData);
+}
+
+
+
+/**
+  The RegisterKeystrokeNotify() function registers a function
+  which will be called when a specified keystroke will occur.
+
+  @param This                     A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
+
+  @param KeyData                  A pointer to a buffer that is filled in with
+                                  the keystroke information for the key that was
+                                  pressed.
+
+  @param KeyNotificationFunction  Points to the function to be
+                                  called when the key sequence
+                                  is typed specified by KeyData.
+
+
+  @param NotifyHandle             Points to the unique handle assigned to
+                                  the registered notification.
+
+  @retval EFI_SUCCESS           The device state was set
+                                appropriately.
+
+  @retval EFI_OUT_OF_RESOURCES  Unable to allocate necessary
+                                data structures.
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopSimpleTextInExRegisterKeyNotify (
+  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
+  IN EFI_KEY_DATA                       *KeyData,
+  IN EFI_KEY_NOTIFY_FUNCTION            KeyNotificationFunction,
+  OUT EFI_HANDLE                        *NotifyHandle
+  )
+{
+  EFI_STATUS                          Status;
+  GOP_PRIVATE_DATA                    *Private;
+  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY     *CurrentNotify;
+  LIST_ENTRY                          *Link;
+  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY     *NewNotify;
+
+  if (KeyData == NULL || KeyNotificationFunction == NULL || NotifyHandle == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
+
+  //
+  // Return EFI_SUCCESS if the (KeyData, NotificationFunction) is already registered.
+  //
+  for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {
+    CurrentNotify = CR (
+                      Link,
+                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
+                      NotifyEntry,
+                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
+                      );
+    if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
+      if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) {
+        *NotifyHandle = CurrentNotify->NotifyHandle;
+        return EFI_SUCCESS;
+      }
+    }
+  }
+
+  //
+  // Allocate resource to save the notification function
+  //
+  NewNotify = (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) AllocateZeroPool (sizeof (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY));
+  if (NewNotify == NULL) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  NewNotify->Signature         = EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE;
+  NewNotify->KeyNotificationFn = KeyNotificationFunction;
+  NewNotify->NotifyHandle      = (EFI_HANDLE) NewNotify;
+  CopyMem (&NewNotify->KeyData, KeyData, sizeof (KeyData));
+  InsertTailList (&Private->NotifyList, &NewNotify->NotifyEntry);
+
+  Status = gBS->CreateEvent (
+                  EVT_NOTIFY_SIGNAL,
+                  TPL_NOTIFY,
+                  EmuGopRegisterKeyCallback,
+                  NewNotify,
+                  &NewNotify->Event
+                  );
+  ASSERT_EFI_ERROR (Status);
+
+
+  *NotifyHandle = NewNotify->NotifyHandle;
+
+  return EFI_SUCCESS;
+
+}
+
+
+/**
+  The UnregisterKeystrokeNotify() function removes the
+  notification which was previously registered.
+
+  @param This               A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
+
+  @param NotificationHandle The handle of the notification
+                            function being unregistered.
+
+  @retval EFI_SUCCESS The device state was set appropriately.
+
+  @retval EFI_INVALID_PARAMETER The NotificationHandle is
+                                invalid.
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopSimpleTextInExUnregisterKeyNotify (
+  IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL  *This,
+  IN EFI_HANDLE                         NotificationHandle
+  )
+/*++
+
+  Routine Description:
+    Remove a registered notification function from a particular keystroke.
+
+  Arguments:
+    This                    - Protocol instance pointer.
+    NotificationHandle      - The handle of the notification function being unregistered.
+
+  Returns:
+    EFI_SUCCESS             - The notification function was unregistered successfully.
+    EFI_INVALID_PARAMETER   - The NotificationHandle is invalid.
+
+**/
+{
+  GOP_PRIVATE_DATA                   *Private;
+  LIST_ENTRY                         *Link;
+  EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
+
+  if (NotificationHandle == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (((EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) NotificationHandle)->Signature != EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
+
+  for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {
+    CurrentNotify = CR (
+                      Link,
+                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
+                      NotifyEntry,
+                      EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
+                      );
+    if (CurrentNotify->NotifyHandle == NotificationHandle) {
+      //
+      // Remove the notification function from NotifyList and free resources
+      //
+      RemoveEntryList (&CurrentNotify->NotifyEntry);
+
+      gBS->CloseEvent (CurrentNotify->Event);
+
+      gBS->FreePool (CurrentNotify);
+      return EFI_SUCCESS;
+    }
+  }
+
+  //
+  // Can not find the specified Notification Handle
+  //
+  return EFI_INVALID_PARAMETER;
+}
+
+
+
+/**
+  Initialize SimplelTextIn and SimpleTextInEx protocols in the Private
+  context structure.
+
+  @param  Private               Context structure to fill in.
+
+  @return EFI_SUCCESS           Initialization was a success
+
+**/
+EFI_STATUS
+EmuGopInitializeSimpleTextInForWindow (
+  IN  GOP_PRIVATE_DATA    *Private
+  )
+{
+  EFI_STATUS  Status;
+
+  //
+  // Initialize Simple Text In protoocol
+  //
+  Private->SimpleTextIn.Reset         = EmuGopSimpleTextInReset;
+  Private->SimpleTextIn.ReadKeyStroke = EmuGopSimpleTextInReadKeyStroke;
+
+  Status = gBS->CreateEvent (
+                  EVT_NOTIFY_WAIT,
+                  TPL_NOTIFY,
+                  EmuGopSimpleTextInWaitForKey,
+                  Private,
+                  &Private->SimpleTextIn.WaitForKey
+                  );
+  ASSERT_EFI_ERROR (Status);
+
+
+  //
+  // Initialize Simple Text In Ex
+  //
+
+  Private->SimpleTextInEx.Reset               = EmuGopSimpleTextInExResetEx;
+  Private->SimpleTextInEx.ReadKeyStrokeEx     = EmuGopSimpleTextInExReadKeyStrokeEx;
+  Private->SimpleTextInEx.SetState            = EmuGopSimpleTextInExSetState;
+  Private->SimpleTextInEx.RegisterKeyNotify   = EmuGopSimpleTextInExRegisterKeyNotify;
+  Private->SimpleTextInEx.UnregisterKeyNotify = EmuGopSimpleTextInExUnregisterKeyNotify;
+
+  Private->SimpleTextInEx.Reset (&Private->SimpleTextInEx, FALSE);
+
+  InitializeListHead (&Private->NotifyList);
+
+  Status = gBS->CreateEvent (
+                  EVT_NOTIFY_WAIT,
+                  TPL_NOTIFY,
+                  EmuGopSimpleTextInWaitForKey,
+                  Private,
+                  &Private->SimpleTextInEx.WaitForKeyEx
+                  );
+  ASSERT_EFI_ERROR (Status);
+
+
+  return Status;
+}
+
+
+
+
+
+
+
+//
+// Simple Pointer implementation.
+//
+
+
+/**
+  Resets the pointer device hardware.
+
+  @param  This                  A pointer to the EFI_SIMPLE_POINTER_PROTOCOL
+                                instance.
+  @param  ExtendedVerification  Indicates that the driver may perform a more exhaustive
+                                verification operation of the device during reset.
+
+  @retval EFI_SUCCESS           The device was reset.
+  @retval EFI_DEVICE_ERROR      The device is not functioning correctly and could not be reset.
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopSimplePointerReset (
+  IN EFI_SIMPLE_POINTER_PROTOCOL          *This,
+  IN BOOLEAN                              ExtendedVerification
+  )
+{
+  GOP_PRIVATE_DATA             *Private;
+  EFI_SIMPLE_POINTER_STATE     State;
+  EFI_TPL                      OldTpl;
+
+  Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);
+  if (Private->EmuGraphicsWindow == NULL) {
+    return EFI_SUCCESS;
+  }
+
+  //
+  // Enter critical section
+  //
+  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
+
+  //
+  // A reset is draining the Queue
+  //
+  while (Private->EmuGraphicsWindow->GetPointerState (Private->EmuGraphicsWindow, &State) == EFI_SUCCESS)
+    ;
+
+  //
+  // Leave critical section and return
+  //
+  gBS->RestoreTPL (OldTpl);
+  return EFI_SUCCESS;
+}
+
+
+/**
+  Retrieves the current state of a pointer device.
+
+  @param  This                  A pointer to the EFI_SIMPLE_POINTER_PROTOCOL
+                                instance.
+  @param  State                 A pointer to the state information on the pointer device.
+
+  @retval EFI_SUCCESS           The state of the pointer device was returned in State.
+  @retval EFI_NOT_READY         The state of the pointer device has not changed since the last call to
+                                GetState().
+  @retval EFI_DEVICE_ERROR      A device error occurred while attempting to retrieve the pointer device's
+                                current state.
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopSimplePointerGetState (
+  IN EFI_SIMPLE_POINTER_PROTOCOL          *This,
+  IN OUT EFI_SIMPLE_POINTER_STATE         *State
+  )
+{
+  GOP_PRIVATE_DATA  *Private;
+  EFI_STATUS        Status;
+  EFI_TPL           OldTpl;
+
+  Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);
+  if (Private->EmuGraphicsWindow == NULL) {
+    return EFI_NOT_READY;
+  }
+
+  //
+  // Enter critical section
+  //
+  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
+
+  Status  = Private->EmuGraphicsWindow->GetPointerState (Private->EmuGraphicsWindow, State);
+  //
+  // Leave critical section and return
+  //
+  gBS->RestoreTPL (OldTpl);
+
+  return Status;
+}
+
+
+/**
+  SimplePointer Notify Wait Event
+
+  @param  Event                 Event whose notification function is being invoked.
+  @param  Context               Pointer to GOP_PRIVATE_DATA.
+
+**/
+VOID
+EFIAPI
+EmuGopSimplePointerWaitForInput (
+  IN EFI_EVENT          Event,
+  IN VOID               *Context
+  )
+{
+  GOP_PRIVATE_DATA  *Private;
+  EFI_STATUS        Status;
+  EFI_TPL           OldTpl;
+
+  Private = (GOP_PRIVATE_DATA *) Context;
+  if (Private->EmuGraphicsWindow == NULL) {
+    return;
+  }
+
+  //
+  // Enter critical section
+  //
+  OldTpl  = gBS->RaiseTPL (TPL_NOTIFY);
+
+  Status  = Private->EmuGraphicsWindow->CheckPointer (Private->EmuGraphicsWindow);
+  if (!EFI_ERROR (Status)) {
+    //
+    // If the pointer state has changed, signal our event.
+    //
+    gBS->SignalEvent (Event);
+  }
+  //
+  // Leave critical section and return
+  //
+  gBS->RestoreTPL (OldTpl);
+}
+
+
+/**
+  SimplePointer constructor
+
+  @param  Private Context structure to fill in.
+
+  @retval EFI_SUCCESS Constructor had success
+
+**/
+EFI_STATUS
+EmuGopInitializeSimplePointerForWindow (
+  IN  GOP_PRIVATE_DATA    *Private
+  )
+{
+  EFI_STATUS  Status;
+
+  //
+  // Initialize Simple Pointer protoocol
+  //
+  Private->PointerMode.ResolutionX = 1;
+  Private->PointerMode.ResolutionY = 1;
+  Private->PointerMode.ResolutionZ = 1;
+  Private->PointerMode.LeftButton  = TRUE;
+  Private->PointerMode.RightButton = TRUE;
+
+  Private->SimplePointer.Reset     = EmuGopSimplePointerReset;
+  Private->SimplePointer.GetState  = EmuGopSimplePointerGetState;
+  Private->SimplePointer.Mode      = &Private->PointerMode;
+
+  Status = gBS->CreateEvent (
+                  EVT_NOTIFY_WAIT,
+                  TPL_NOTIFY,
+                  EmuGopSimplePointerWaitForInput,
+                  Private,
+                  &Private->SimplePointer.WaitForInput
+                  );
+
+  return Status;
+}

+ 416 - 416
EmulatorPkg/EmuGopDxe/GopScreen.c

@@ -1,416 +1,416 @@
-/*++ @file
-
-Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
-Portions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution.  The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-Module Name:
-
-    EmuGopScreen.c
-
-Abstract:
-
-  This file produces the graphics abstration of UGA. It is called by
-  EmuGopDriver.c file which deals with the EFI 1.1 driver model.
-  This file just does graphics.
-
-**/
-
-#include "Gop.h"
-
-
-EFI_EVENT               mGopScreenExitBootServicesEvent;
-
-GOP_MODE_DATA mGopModeData[] = {
-    { 800,  600, 0, 0 },
-    { 640,  480, 0, 0 },
-    { 720,  400, 0, 0 },
-    {1024,  768, 0, 0 },
-    {1280, 1024, 0, 0 }
-    };
-
-
-/**
-  Returns information for an available graphics mode that the graphics device
-  and the set of active video output devices supports.
-
-  @param  This                  The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
-  @param  ModeNumber            The mode number to return information on.
-  @param  SizeOfInfo            A pointer to the size, in bytes, of the Info buffer.
-  @param  Info                  A pointer to callee allocated buffer that returns information about ModeNumber.
-
-  @retval EFI_SUCCESS           Mode information returned.
-  @retval EFI_BUFFER_TOO_SMALL  The Info buffer was too small.
-  @retval EFI_DEVICE_ERROR      A hardware error occurred trying to retrieve the video mode.
-  @retval EFI_NOT_STARTED       Video display is not initialized. Call SetMode ()
-  @retval EFI_INVALID_PARAMETER One of the input args was NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopQuerytMode (
-  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL          *This,
-  IN  UINT32                                ModeNumber,
-  OUT UINTN                                 *SizeOfInfo,
-  OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  **Info
-  )
-{
-  GOP_PRIVATE_DATA  *Private;
-
-  Private = GOP_PRIVATE_DATA_FROM_THIS (This);
-
-  if (Info == NULL || SizeOfInfo == NULL || (UINTN) ModeNumber >= This->Mode->MaxMode) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  *Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
-  if (*Info == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
-
-  (*Info)->Version = 0;
-  (*Info)->HorizontalResolution = Private->ModeData[ModeNumber].HorizontalResolution;
-  (*Info)->VerticalResolution   = Private->ModeData[ModeNumber].VerticalResolution;
-  (*Info)->PixelFormat = PixelBltOnly;
-  (*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution;
-
-  return EFI_SUCCESS;
-}
-
-
-
-/**
-  Set the video device into the specified mode and clears the visible portions of
-  the output display to black.
-
-  @param  This              The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
-  @param  ModeNumber        Abstraction that defines the current video mode.
-
-  @retval EFI_SUCCESS       The graphics mode specified by ModeNumber was selected.
-  @retval EFI_DEVICE_ERROR  The device had an error and could not complete the request.
-  @retval EFI_UNSUPPORTED   ModeNumber is not supported by this device.
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopSetMode (
-  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL  *This,
-  IN  UINT32                        ModeNumber
-  )
-{
-  EFI_STATUS                      Status;
-  GOP_PRIVATE_DATA                *Private;
-  GOP_MODE_DATA                   *ModeData;
-  EFI_GRAPHICS_OUTPUT_BLT_PIXEL   Fill;
-
-  Private = GOP_PRIVATE_DATA_FROM_THIS (This);
-
-  if (ModeNumber >= This->Mode->MaxMode) {
-    return EFI_UNSUPPORTED;
-  }
-
-  ModeData = &Private->ModeData[ModeNumber];
-  This->Mode->Mode = ModeNumber;
-  Private->GraphicsOutput.Mode->Info->HorizontalResolution = ModeData->HorizontalResolution;
-  Private->GraphicsOutput.Mode->Info->VerticalResolution = ModeData->VerticalResolution;
-  Private->GraphicsOutput.Mode->Info->PixelsPerScanLine = ModeData->HorizontalResolution;
-
-  if (Private->HardwareNeedsStarting) {
-    Status = EmuGopStartWindow (
-              Private,
-              ModeData->HorizontalResolution,
-              ModeData->VerticalResolution,
-              ModeData->ColorDepth,
-              ModeData->RefreshRate
-              );
-    if (EFI_ERROR (Status)) {
-      return EFI_DEVICE_ERROR;
-    }
-
-    Private->HardwareNeedsStarting = FALSE;
-  }
-
-
-  Status = Private->EmuGraphicsWindow->Size(
-                            Private->EmuGraphicsWindow,
-                            ModeData->HorizontalResolution,
-                            ModeData->VerticalResolution
-                            );
-
-
-  Fill.Red                      = 0x7f;
-  Fill.Green                    = 0x7F;
-  Fill.Blue                     = 0x7f;
-  This->Blt (
-          This,
-          &Fill,
-          EfiBltVideoFill,
-          0,
-          0,
-          0,
-          0,
-          ModeData->HorizontalResolution,
-          ModeData->VerticalResolution,
-          ModeData->HorizontalResolution * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
-          );
-  return EFI_SUCCESS;
-}
-
-
-
-/**
-  Blt a rectangle of pixels on the graphics screen. Blt stands for BLock Transfer.
-
-  @param  This         Protocol instance pointer.
-  @param  BltBuffer    Buffer containing data to blit into video buffer. This
-                       buffer has a size of Width*Height*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
-  @param  BltOperation Operation to perform on BlitBuffer and video memory
-  @param  SourceX      X coordinate of source for the BltBuffer.
-  @param  SourceY      Y coordinate of source for the BltBuffer.
-  @param  DestinationX X coordinate of destination for the BltBuffer.
-  @param  DestinationY Y coordinate of destination for the BltBuffer.
-  @param  Width        Width of rectangle in BltBuffer in pixels.
-  @param  Height       Hight of rectangle in BltBuffer in pixels.
-  @param  Delta        OPTIONAL
-
-  @retval EFI_SUCCESS           The Blt operation completed.
-  @retval EFI_INVALID_PARAMETER BltOperation is not valid.
-  @retval EFI_DEVICE_ERROR      A hardware error occured writting to the video buffer.
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopBlt (
-  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL            *This,
-  IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL           *BltBuffer,   OPTIONAL
-  IN  EFI_GRAPHICS_OUTPUT_BLT_OPERATION       BltOperation,
-  IN  UINTN                                   SourceX,
-  IN  UINTN                                   SourceY,
-  IN  UINTN                                   DestinationX,
-  IN  UINTN                                   DestinationY,
-  IN  UINTN                                   Width,
-  IN  UINTN                                   Height,
-  IN  UINTN                                   Delta         OPTIONAL
-  )
-{
-  GOP_PRIVATE_DATA  *Private;
-  EFI_TPL           OriginalTPL;
-  EFI_STATUS        Status;
-  EMU_GRAPHICS_WINDOWS__BLT_ARGS      GopBltArgs;
-
-  Private = GOP_PRIVATE_DATA_FROM_THIS (This);
-
-  if ((UINT32)BltOperation >= EfiGraphicsOutputBltOperationMax) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if (Width == 0 || Height == 0) {
-    return EFI_INVALID_PARAMETER;
-  }
-  //
-  // If Delta is zero, then the entire BltBuffer is being used, so Delta
-  // is the number of bytes in each row of BltBuffer.  Since BltBuffer is Width pixels size,
-  // the number of bytes in each row can be computed.
-  //
-  if (Delta == 0) {
-    Delta = Width * sizeof (EFI_UGA_PIXEL);
-  }
-
-  //
-  // We have to raise to TPL Notify, so we make an atomic write the frame buffer.
-  // We would not want a timer based event (Cursor, ...) to come in while we are
-  // doing this operation.
-  //
-  OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY);
-
-  //
-  // Pack UGA Draw protocol parameters to EMU_GRAPHICS_WINDOWS__BLT_ARGS structure to adapt to
-  // GopBlt() API of Unix UGA IO protocol.
-  //
-  GopBltArgs.DestinationX = DestinationX;
-  GopBltArgs.DestinationY = DestinationY;
-  GopBltArgs.Height       = Height;
-  GopBltArgs.Width        = Width;
-  GopBltArgs.SourceX      = SourceX;
-  GopBltArgs.SourceY      = SourceY;
-  GopBltArgs.Delta        = Delta;
-  Status = Private->EmuGraphicsWindow->Blt (
-                            Private->EmuGraphicsWindow,
-                            (EFI_UGA_PIXEL *)BltBuffer,
-                            (EFI_UGA_BLT_OPERATION)BltOperation,
-                            &GopBltArgs
-                            );
-
-  gBS->RestoreTPL (OriginalTPL);
-
-  return Status;
-}
-
-
-//
-// Construction and Destruction functions
-//
-
-EFI_STATUS
-EmuGopSupported (
-  IN  EMU_IO_THUNK_PROTOCOL  *EmuIoThunk
-  )
-{
-  //
-  // Check to see if the IO abstraction represents a device type we support.
-  //
-  // This would be replaced a check of PCI subsystem ID, etc.
-  //
-  if (!CompareGuid (EmuIoThunk->Protocol, &gEmuGraphicsWindowProtocolGuid)) {
-    return EFI_UNSUPPORTED;
-  }
-
-  return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-EmuGopStartWindow (
-  IN  GOP_PRIVATE_DATA    *Private,
-  IN  UINT32              HorizontalResolution,
-  IN  UINT32              VerticalResolution,
-  IN  UINT32              ColorDepth,
-  IN  UINT32              RefreshRate
-  )
-{
-  EFI_STATUS          Status;
-
-  //
-  // Register to be notified on exit boot services so we can destroy the window.
-  //
-  Status = gBS->CreateEvent (
-                  EVT_SIGNAL_EXIT_BOOT_SERVICES,
-                  TPL_CALLBACK,
-                  ShutdownGopEvent,
-                  Private,
-                  &mGopScreenExitBootServicesEvent
-                  );
-
-  Status = Private->EmuIoThunk->Open (Private->EmuIoThunk);
-  if (!EFI_ERROR (Status)) {
-    Private->EmuGraphicsWindow = Private->EmuIoThunk->Interface;
-
-    // Register callback to support RegisterKeyNotify()
-    Status  = Private->EmuGraphicsWindow->RegisterKeyNotify (
-                                            Private->EmuGraphicsWindow,
-                                            GopPrivateMakeCallbackFunction,
-                                            GopPrivateBreakCallbackFunction,
-                                            Private
-                                            );
-    ASSERT_EFI_ERROR (Status);
-  }
-  return Status;
-}
-
-EFI_STATUS
-EmuGopConstructor (
-  GOP_PRIVATE_DATA    *Private
-  )
-{
-  Private->ModeData = mGopModeData;
-
-  Private->GraphicsOutput.QueryMode      = EmuGopQuerytMode;
-  Private->GraphicsOutput.SetMode        = EmuGopSetMode;
-  Private->GraphicsOutput.Blt            = EmuGopBlt;
-
-  //
-  // Allocate buffer for Graphics Output Protocol mode information
-  //
-  Private->GraphicsOutput.Mode = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE));
-  if (Private->GraphicsOutput.Mode == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-  Private->GraphicsOutput.Mode->Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
-  if (Private->GraphicsOutput.Mode->Info == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  Private->GraphicsOutput.Mode->MaxMode = sizeof(mGopModeData) / sizeof(GOP_MODE_DATA);
-  //
-  // Till now, we have no idea about the window size.
-  //
-  Private->GraphicsOutput.Mode->Mode = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;
-  Private->GraphicsOutput.Mode->Info->Version = 0;
-  Private->GraphicsOutput.Mode->Info->HorizontalResolution = 0;
-  Private->GraphicsOutput.Mode->Info->VerticalResolution = 0;
-  Private->GraphicsOutput.Mode->Info->PixelFormat = PixelBltOnly;
-  Private->GraphicsOutput.Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
-  Private->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) (UINTN) NULL;
-  Private->GraphicsOutput.Mode->FrameBufferSize = 0;
-
-  Private->HardwareNeedsStarting  = TRUE;
-  Private->EmuGraphicsWindow                  = NULL;
-
-  EmuGopInitializeSimpleTextInForWindow (Private);
-
-  EmuGopInitializeSimplePointerForWindow (Private);
-
-  return EFI_SUCCESS;
-}
-
-
-
-EFI_STATUS
-EmuGopDestructor (
-  GOP_PRIVATE_DATA     *Private
-  )
-{
-  if (!Private->HardwareNeedsStarting) {
-    Private->EmuIoThunk->Close (Private->EmuIoThunk);
-    Private->EmuGraphicsWindow = NULL;
-  }
-
-  //
-  // Free graphics output protocol occupied resource
-  //
-  if (Private->GraphicsOutput.Mode != NULL) {
-    if (Private->GraphicsOutput.Mode->Info != NULL) {
-      FreePool (Private->GraphicsOutput.Mode->Info);
-    }
-    FreePool (Private->GraphicsOutput.Mode);
-  }
-
-  return EFI_SUCCESS;
-}
-
-
-VOID
-EFIAPI
-ShutdownGopEvent (
-  IN EFI_EVENT  Event,
-  IN VOID       *Context
-  )
-/*++
-
-Routine Description:
-
-  This is the UGA screen's callback notification function for exit-boot-services.
-  All we do here is call EmuGopDestructor().
-
-Arguments:
-
-  Event   - not used
-  Context - pointer to the Private structure.
-
-Returns:
-
-  None.
-
-**/
-{
-  EmuGopDestructor (Context);
-}
-
+/*++ @file
+
+Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
+Portions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+Module Name:
+
+    EmuGopScreen.c
+
+Abstract:
+
+  This file produces the graphics abstration of UGA. It is called by
+  EmuGopDriver.c file which deals with the EFI 1.1 driver model.
+  This file just does graphics.
+
+**/
+
+#include "Gop.h"
+
+
+EFI_EVENT               mGopScreenExitBootServicesEvent;
+
+GOP_MODE_DATA mGopModeData[] = {
+    { 800,  600, 0, 0 },
+    { 640,  480, 0, 0 },
+    { 720,  400, 0, 0 },
+    {1024,  768, 0, 0 },
+    {1280, 1024, 0, 0 }
+    };
+
+
+/**
+  Returns information for an available graphics mode that the graphics device
+  and the set of active video output devices supports.
+
+  @param  This                  The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
+  @param  ModeNumber            The mode number to return information on.
+  @param  SizeOfInfo            A pointer to the size, in bytes, of the Info buffer.
+  @param  Info                  A pointer to callee allocated buffer that returns information about ModeNumber.
+
+  @retval EFI_SUCCESS           Mode information returned.
+  @retval EFI_BUFFER_TOO_SMALL  The Info buffer was too small.
+  @retval EFI_DEVICE_ERROR      A hardware error occurred trying to retrieve the video mode.
+  @retval EFI_NOT_STARTED       Video display is not initialized. Call SetMode ()
+  @retval EFI_INVALID_PARAMETER One of the input args was NULL.
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopQuerytMode (
+  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL          *This,
+  IN  UINT32                                ModeNumber,
+  OUT UINTN                                 *SizeOfInfo,
+  OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION  **Info
+  )
+{
+  GOP_PRIVATE_DATA  *Private;
+
+  Private = GOP_PRIVATE_DATA_FROM_THIS (This);
+
+  if (Info == NULL || SizeOfInfo == NULL || (UINTN) ModeNumber >= This->Mode->MaxMode) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  *Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
+  if (*Info == NULL) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
+
+  (*Info)->Version = 0;
+  (*Info)->HorizontalResolution = Private->ModeData[ModeNumber].HorizontalResolution;
+  (*Info)->VerticalResolution   = Private->ModeData[ModeNumber].VerticalResolution;
+  (*Info)->PixelFormat = PixelBltOnly;
+  (*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution;
+
+  return EFI_SUCCESS;
+}
+
+
+
+/**
+  Set the video device into the specified mode and clears the visible portions of
+  the output display to black.
+
+  @param  This              The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
+  @param  ModeNumber        Abstraction that defines the current video mode.
+
+  @retval EFI_SUCCESS       The graphics mode specified by ModeNumber was selected.
+  @retval EFI_DEVICE_ERROR  The device had an error and could not complete the request.
+  @retval EFI_UNSUPPORTED   ModeNumber is not supported by this device.
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopSetMode (
+  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL  *This,
+  IN  UINT32                        ModeNumber
+  )
+{
+  EFI_STATUS                      Status;
+  GOP_PRIVATE_DATA                *Private;
+  GOP_MODE_DATA                   *ModeData;
+  EFI_GRAPHICS_OUTPUT_BLT_PIXEL   Fill;
+
+  Private = GOP_PRIVATE_DATA_FROM_THIS (This);
+
+  if (ModeNumber >= This->Mode->MaxMode) {
+    return EFI_UNSUPPORTED;
+  }
+
+  ModeData = &Private->ModeData[ModeNumber];
+  This->Mode->Mode = ModeNumber;
+  Private->GraphicsOutput.Mode->Info->HorizontalResolution = ModeData->HorizontalResolution;
+  Private->GraphicsOutput.Mode->Info->VerticalResolution = ModeData->VerticalResolution;
+  Private->GraphicsOutput.Mode->Info->PixelsPerScanLine = ModeData->HorizontalResolution;
+
+  if (Private->HardwareNeedsStarting) {
+    Status = EmuGopStartWindow (
+              Private,
+              ModeData->HorizontalResolution,
+              ModeData->VerticalResolution,
+              ModeData->ColorDepth,
+              ModeData->RefreshRate
+              );
+    if (EFI_ERROR (Status)) {
+      return EFI_DEVICE_ERROR;
+    }
+
+    Private->HardwareNeedsStarting = FALSE;
+  }
+
+
+  Status = Private->EmuGraphicsWindow->Size(
+                            Private->EmuGraphicsWindow,
+                            ModeData->HorizontalResolution,
+                            ModeData->VerticalResolution
+                            );
+
+
+  Fill.Red                      = 0x7f;
+  Fill.Green                    = 0x7F;
+  Fill.Blue                     = 0x7f;
+  This->Blt (
+          This,
+          &Fill,
+          EfiBltVideoFill,
+          0,
+          0,
+          0,
+          0,
+          ModeData->HorizontalResolution,
+          ModeData->VerticalResolution,
+          ModeData->HorizontalResolution * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
+          );
+  return EFI_SUCCESS;
+}
+
+
+
+/**
+  Blt a rectangle of pixels on the graphics screen. Blt stands for BLock Transfer.
+
+  @param  This         Protocol instance pointer.
+  @param  BltBuffer    Buffer containing data to blit into video buffer. This
+                       buffer has a size of Width*Height*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
+  @param  BltOperation Operation to perform on BlitBuffer and video memory
+  @param  SourceX      X coordinate of source for the BltBuffer.
+  @param  SourceY      Y coordinate of source for the BltBuffer.
+  @param  DestinationX X coordinate of destination for the BltBuffer.
+  @param  DestinationY Y coordinate of destination for the BltBuffer.
+  @param  Width        Width of rectangle in BltBuffer in pixels.
+  @param  Height       Hight of rectangle in BltBuffer in pixels.
+  @param  Delta        OPTIONAL
+
+  @retval EFI_SUCCESS           The Blt operation completed.
+  @retval EFI_INVALID_PARAMETER BltOperation is not valid.
+  @retval EFI_DEVICE_ERROR      A hardware error occured writting to the video buffer.
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopBlt (
+  IN  EFI_GRAPHICS_OUTPUT_PROTOCOL            *This,
+  IN  EFI_GRAPHICS_OUTPUT_BLT_PIXEL           *BltBuffer,   OPTIONAL
+  IN  EFI_GRAPHICS_OUTPUT_BLT_OPERATION       BltOperation,
+  IN  UINTN                                   SourceX,
+  IN  UINTN                                   SourceY,
+  IN  UINTN                                   DestinationX,
+  IN  UINTN                                   DestinationY,
+  IN  UINTN                                   Width,
+  IN  UINTN                                   Height,
+  IN  UINTN                                   Delta         OPTIONAL
+  )
+{
+  GOP_PRIVATE_DATA  *Private;
+  EFI_TPL           OriginalTPL;
+  EFI_STATUS        Status;
+  EMU_GRAPHICS_WINDOWS__BLT_ARGS      GopBltArgs;
+
+  Private = GOP_PRIVATE_DATA_FROM_THIS (This);
+
+  if ((UINT32)BltOperation >= EfiGraphicsOutputBltOperationMax) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (Width == 0 || Height == 0) {
+    return EFI_INVALID_PARAMETER;
+  }
+  //
+  // If Delta is zero, then the entire BltBuffer is being used, so Delta
+  // is the number of bytes in each row of BltBuffer.  Since BltBuffer is Width pixels size,
+  // the number of bytes in each row can be computed.
+  //
+  if (Delta == 0) {
+    Delta = Width * sizeof (EFI_UGA_PIXEL);
+  }
+
+  //
+  // We have to raise to TPL Notify, so we make an atomic write the frame buffer.
+  // We would not want a timer based event (Cursor, ...) to come in while we are
+  // doing this operation.
+  //
+  OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY);
+
+  //
+  // Pack UGA Draw protocol parameters to EMU_GRAPHICS_WINDOWS__BLT_ARGS structure to adapt to
+  // GopBlt() API of Unix UGA IO protocol.
+  //
+  GopBltArgs.DestinationX = DestinationX;
+  GopBltArgs.DestinationY = DestinationY;
+  GopBltArgs.Height       = Height;
+  GopBltArgs.Width        = Width;
+  GopBltArgs.SourceX      = SourceX;
+  GopBltArgs.SourceY      = SourceY;
+  GopBltArgs.Delta        = Delta;
+  Status = Private->EmuGraphicsWindow->Blt (
+                            Private->EmuGraphicsWindow,
+                            (EFI_UGA_PIXEL *)BltBuffer,
+                            (EFI_UGA_BLT_OPERATION)BltOperation,
+                            &GopBltArgs
+                            );
+
+  gBS->RestoreTPL (OriginalTPL);
+
+  return Status;
+}
+
+
+//
+// Construction and Destruction functions
+//
+
+EFI_STATUS
+EmuGopSupported (
+  IN  EMU_IO_THUNK_PROTOCOL  *EmuIoThunk
+  )
+{
+  //
+  // Check to see if the IO abstraction represents a device type we support.
+  //
+  // This would be replaced a check of PCI subsystem ID, etc.
+  //
+  if (!CompareGuid (EmuIoThunk->Protocol, &gEmuGraphicsWindowProtocolGuid)) {
+    return EFI_UNSUPPORTED;
+  }
+
+  return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+EmuGopStartWindow (
+  IN  GOP_PRIVATE_DATA    *Private,
+  IN  UINT32              HorizontalResolution,
+  IN  UINT32              VerticalResolution,
+  IN  UINT32              ColorDepth,
+  IN  UINT32              RefreshRate
+  )
+{
+  EFI_STATUS          Status;
+
+  //
+  // Register to be notified on exit boot services so we can destroy the window.
+  //
+  Status = gBS->CreateEvent (
+                  EVT_SIGNAL_EXIT_BOOT_SERVICES,
+                  TPL_CALLBACK,
+                  ShutdownGopEvent,
+                  Private,
+                  &mGopScreenExitBootServicesEvent
+                  );
+
+  Status = Private->EmuIoThunk->Open (Private->EmuIoThunk);
+  if (!EFI_ERROR (Status)) {
+    Private->EmuGraphicsWindow = Private->EmuIoThunk->Interface;
+
+    // Register callback to support RegisterKeyNotify()
+    Status  = Private->EmuGraphicsWindow->RegisterKeyNotify (
+                                            Private->EmuGraphicsWindow,
+                                            GopPrivateMakeCallbackFunction,
+                                            GopPrivateBreakCallbackFunction,
+                                            Private
+                                            );
+    ASSERT_EFI_ERROR (Status);
+  }
+  return Status;
+}
+
+EFI_STATUS
+EmuGopConstructor (
+  GOP_PRIVATE_DATA    *Private
+  )
+{
+  Private->ModeData = mGopModeData;
+
+  Private->GraphicsOutput.QueryMode      = EmuGopQuerytMode;
+  Private->GraphicsOutput.SetMode        = EmuGopSetMode;
+  Private->GraphicsOutput.Blt            = EmuGopBlt;
+
+  //
+  // Allocate buffer for Graphics Output Protocol mode information
+  //
+  Private->GraphicsOutput.Mode = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE));
+  if (Private->GraphicsOutput.Mode == NULL) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+  Private->GraphicsOutput.Mode->Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
+  if (Private->GraphicsOutput.Mode->Info == NULL) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  Private->GraphicsOutput.Mode->MaxMode = sizeof(mGopModeData) / sizeof(GOP_MODE_DATA);
+  //
+  // Till now, we have no idea about the window size.
+  //
+  Private->GraphicsOutput.Mode->Mode = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;
+  Private->GraphicsOutput.Mode->Info->Version = 0;
+  Private->GraphicsOutput.Mode->Info->HorizontalResolution = 0;
+  Private->GraphicsOutput.Mode->Info->VerticalResolution = 0;
+  Private->GraphicsOutput.Mode->Info->PixelFormat = PixelBltOnly;
+  Private->GraphicsOutput.Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
+  Private->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) (UINTN) NULL;
+  Private->GraphicsOutput.Mode->FrameBufferSize = 0;
+
+  Private->HardwareNeedsStarting  = TRUE;
+  Private->EmuGraphicsWindow                  = NULL;
+
+  EmuGopInitializeSimpleTextInForWindow (Private);
+
+  EmuGopInitializeSimplePointerForWindow (Private);
+
+  return EFI_SUCCESS;
+}
+
+
+
+EFI_STATUS
+EmuGopDestructor (
+  GOP_PRIVATE_DATA     *Private
+  )
+{
+  if (!Private->HardwareNeedsStarting) {
+    Private->EmuIoThunk->Close (Private->EmuIoThunk);
+    Private->EmuGraphicsWindow = NULL;
+  }
+
+  //
+  // Free graphics output protocol occupied resource
+  //
+  if (Private->GraphicsOutput.Mode != NULL) {
+    if (Private->GraphicsOutput.Mode->Info != NULL) {
+      FreePool (Private->GraphicsOutput.Mode->Info);
+    }
+    FreePool (Private->GraphicsOutput.Mode);
+  }
+
+  return EFI_SUCCESS;
+}
+
+
+VOID
+EFIAPI
+ShutdownGopEvent (
+  IN EFI_EVENT  Event,
+  IN VOID       *Context
+  )
+/*++
+
+Routine Description:
+
+  This is the UGA screen's callback notification function for exit-boot-services.
+  All we do here is call EmuGopDestructor().
+
+Arguments:
+
+  Event   - not used
+  Context - pointer to the Private structure.
+
+Returns:
+
+  None.
+
+**/
+{
+  EmuGopDestructor (Context);
+}
+

+ 1 - 1
EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c

@@ -42,7 +42,7 @@ EFI_SIMPLE_NETWORK_PROTOCOL gEmuSnpTemplate = {
   NULL                      // Mode
  };
 
-EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {                 
+EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {
   EfiSimpleNetworkStopped,      //  State
   NET_ETHER_ADDR_LEN,           //  HwAddressSize
   NET_ETHER_HEADER_SIZE,        //  MediaHeaderSize

+ 38 - 38
EmulatorPkg/Include/Library/EmuMagicPageLib.h

@@ -1,38 +1,38 @@
-/*++ @file
-The PCD, gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage, points to a magic page
-of memory that is like SRAM on an embedded system. This file defines what goes
-where in the magic page.
-
-Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution.  The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef __EMU_MAGIC_PAGE_LIB_H__
-#define __EMU_MAGIC_PAGE_LIB_H__
-
-#include <PiPei.h>
-#include <Library/PcdLib.h>
-#include <Protocol/EmuThunk.h>
-
-typedef struct {
-  // Used by PEI Core and PEIMs to store the PEI Services pointer.
-  // Privilege issues prevent using the PI mechanism in the emulator.
-  CONST EFI_PEI_SERVICES **PeiServicesTablePointer;
-
-  // Used by SecPeiServicesLib
-  EFI_PEI_PPI_DESCRIPTOR  *PpiList;
-
-  // Needed by PEI PEI PeCoffLoaderExtraActionLib
-  EMU_THUNK_PROTOCOL   *Thunk;
-} EMU_MAGIC_PAGE_LAYOUT;
-
-#define EMU_MAGIC_PAGE() ((EMU_MAGIC_PAGE_LAYOUT *)((UINTN)PcdGet64 (PcdPeiServicesTablePage)))
-
-#endif
+/*++ @file
+The PCD, gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage, points to a magic page
+of memory that is like SRAM on an embedded system. This file defines what goes
+where in the magic page.
+
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __EMU_MAGIC_PAGE_LIB_H__
+#define __EMU_MAGIC_PAGE_LIB_H__
+
+#include <PiPei.h>
+#include <Library/PcdLib.h>
+#include <Protocol/EmuThunk.h>
+
+typedef struct {
+  // Used by PEI Core and PEIMs to store the PEI Services pointer.
+  // Privilege issues prevent using the PI mechanism in the emulator.
+  CONST EFI_PEI_SERVICES **PeiServicesTablePointer;
+
+  // Used by SecPeiServicesLib
+  EFI_PEI_PPI_DESCRIPTOR  *PpiList;
+
+  // Needed by PEI PEI PeCoffLoaderExtraActionLib
+  EMU_THUNK_PROTOCOL   *Thunk;
+} EMU_MAGIC_PAGE_LAYOUT;
+
+#define EMU_MAGIC_PAGE() ((EMU_MAGIC_PAGE_LAYOUT *)((UINTN)PcdGet64 (PcdPeiServicesTablePage)))
+
+#endif

+ 42 - 42
EmulatorPkg/Include/Library/EmuThunkLib.h

@@ -1,42 +1,42 @@
-/*++ @file
-
-Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution.  The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef __EMU_THUNK_LIB_H__
-#define __EMU_THUNK_LIB_H__
-
-#include <Protocol/EmuThunk.h>
-
-
-extern EMU_THUNK_PROTOCOL   *gEmuThunk;
-
-
-/**
-  Serach the EMU IO Thunk database for a matching EMU IO Thunk
-  Protocol instance.
-
-  @param  Protocol   Protocol to search for.
-  @param  Instance   Instance of protocol to search for.
-
-  @retval NULL       Protocol and Instance not found.
-  @retval other      EMU IO Thunk protocol that matched.
-
-**/
-EMU_IO_THUNK_PROTOCOL *
-EFIAPI
-GetIoThunkInstance (
-  IN  EFI_GUID  *Protocol,
-  IN  UINTN     Instance
-  );
-
-
-#endif
+/*++ @file
+
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __EMU_THUNK_LIB_H__
+#define __EMU_THUNK_LIB_H__
+
+#include <Protocol/EmuThunk.h>
+
+
+extern EMU_THUNK_PROTOCOL   *gEmuThunk;
+
+
+/**
+  Serach the EMU IO Thunk database for a matching EMU IO Thunk
+  Protocol instance.
+
+  @param  Protocol   Protocol to search for.
+  @param  Instance   Instance of protocol to search for.
+
+  @retval NULL       Protocol and Instance not found.
+  @retval other      EMU IO Thunk protocol that matched.
+
+**/
+EMU_IO_THUNK_PROTOCOL *
+EFIAPI
+GetIoThunkInstance (
+  IN  EFI_GUID  *Protocol,
+  IN  UINTN     Instance
+  );
+
+
+#endif

+ 21 - 21
EmulatorPkg/Include/Library/PpiListLib.h

@@ -1,21 +1,21 @@
-/*++ @file
-
-Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution.  The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef __PPI_LIST_LIB_H__
-#define __PPI_LIST_LIB_H__
-
-
-extern CONST EFI_PEI_PPI_DESCRIPTOR  *gPpiList;
-
-
-#endif
+/*++ @file
+
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __PPI_LIST_LIB_H__
+#define __PPI_LIST_LIB_H__
+
+
+extern CONST EFI_PEI_PPI_DESCRIPTOR  *gPpiList;
+
+
+#endif

+ 202 - 202
EmulatorPkg/Include/Library/SmbiosLib.h

@@ -1,202 +1,202 @@
-/** @file
-  Provides library functions for common SMBIOS operations. Only available to DXE
-  and UEFI module types.
-
-
-Copyright (c) 2012, Apple Inc. All rights reserved.
-Portitions Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials are licensed and made available under 
-the terms and conditions of the BSD License that accompanies this distribution.  
-The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php.
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _SMBIOS_LIB_H__
-#define _SMBIOS_LIB_H__
-
-#include <IndustryStandard/SmBios.h>
-#include <Protocol/Smbios.h>
-
-
-///
-/// Cache copy of the SMBIOS Protocol pointer
-///
-extern EFI_SMBIOS_PROTOCOL *gSmbios;
-
-
-///
-/// Template for SMBIOS table initialization.
-/// The SMBIOS_TABLE_STRING types in the formated area must match the 
-/// StringArray sequene. 
-///
-typedef struct {
-  //
-  // formatted area of a given SMBIOS record
-  //
-  SMBIOS_STRUCTURE    *Entry;
-  //
-  // NULL terminated array of ASCII strings to be added to the SMBIOS record. 
-  //
-  CHAR8               **StringArray;
-} SMBIOS_TEMPLATE_ENTRY;
-
-
-/**
-  Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY 
-  entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
-
-  @param  Template   Array of SMBIOS_TEMPLATE_ENTRY entries.
- 
-  @retval EFI_SUCCESS          New SMBIOS tables were created.
-  @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created. 
-**/
-EFI_STATUS
-EFIAPI
-SmbiosLibInitializeFromTemplate (
-  IN  SMBIOS_TEMPLATE_ENTRY   *Template
-  );
-
-
-
-/**
-  Create SMBIOS record.
-
-  Converts a fixed SMBIOS structure and an array of pointers to strings into
-  an SMBIOS record where the strings are cat'ed on the end of the fixed record
-  and terminated via a double NULL and add to SMBIOS table.
-
-  SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
-    { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof (SMBIOS_TABLE_TYPE12), 0 },
-    1 // StringCount
-  };
-  CHAR8 *gSmbiosType12Strings[] = {
-    "Not Found",
-    NULL
-  };
-  
-  ...
-  AddSmbiosEntryFromTemplate (
-    (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12, 
-    gSmbiosType12Strings
-    );
-
-  @param  SmbiosEntry   Fixed SMBIOS structure
-  @param  StringArray   Array of strings to convert to an SMBIOS string pack. 
-                        NULL is OK.
-
-  @retval EFI_SUCCESS          New SmbiosEntry was added to SMBIOS table.
-  @retval EFI_OUT_OF_RESOURCES SmbiosEntry was not added.
-**/
-EFI_STATUS
-EFIAPI
-SmbiosLibCreateEntry (
-  IN  SMBIOS_STRUCTURE *SmbiosEntry,
-  IN  CHAR8            **StringArray 
-  );
-
-
-/**
-  Update the string associated with an existing SMBIOS record.
-  
-  This function allows the update of specific SMBIOS strings. The number of valid strings for any
-  SMBIOS record is defined by how many strings were present when Add() was called.
-  
-  @param[in]    SmbiosHandle    SMBIOS Handle of structure that will have its string updated.
-  @param[in]    StringNumber    The non-zero string number of the string to update.
-  @param[in]    String          Update the StringNumber string with String.
-  
-  @retval EFI_SUCCESS           SmbiosHandle had its StringNumber String updated.
-  @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
-  @retval EFI_UNSUPPORTED       String was not added because it is longer than the SMBIOS Table supports.
-  @retval EFI_NOT_FOUND         The StringNumber.is not valid for this SMBIOS record.    
-**/
-EFI_STATUS
-EFIAPI
-SmbiosLibUpdateString (
-  IN  EFI_SMBIOS_HANDLE     SmbiosHandle,
-  IN  SMBIOS_TABLE_STRING   StringNumber,
-  IN  CHAR8                 *String
-  );
-
-/**
-  Update the string associated with an existing SMBIOS record.
-  
-  This function allows the update of specific SMBIOS strings. The number of valid strings for any
-  SMBIOS record is defined by how many strings were present when Add() was called.
-  
-  @param[in]    SmbiosHandle    SMBIOS Handle of structure that will have its string updated.
-  @param[in]    StringNumber    The non-zero string number of the string to update.
-  @param[in]    String          Update the StringNumber string with String.
-  
-  @retval EFI_SUCCESS           SmbiosHandle had its StringNumber String updated.
-  @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
-  @retval EFI_UNSUPPORTED       String was not added because it is longer than the SMBIOS Table supports.
-  @retval EFI_NOT_FOUND         The StringNumber.is not valid for this SMBIOS record.    
-**/
-EFI_STATUS
-EFIAPI
-SmbiosLibUpdateUnicodeString (
-  IN  EFI_SMBIOS_HANDLE     SmbiosHandle,
-  IN  SMBIOS_TABLE_STRING   StringNumber,
-  IN  CHAR16                *String
-  );
-
-/**
-  Allow caller to read a specific SMBIOS string
-  
-  @param[in]    Header          SMBIOS record that contains the string. 
-  @param[in[    StringNumber    Instance of SMBIOS string 1 - N. 
-
-  @retval NULL                  Instance of Type SMBIOS string was not found. 
-  @retval Other                 Pointer to matching SMBIOS string. 
-**/
-CHAR8 *
-EFIAPI
-SmbiosLibReadString (
-  IN SMBIOS_STRUCTURE   *Header,
-  IN EFI_SMBIOS_STRING  StringNumber
-  );
-
-
-/**
-  Allow the caller to discover a specific SMBIOS entry, and patch it if necissary. 
-  
-  @param[in]    Type            Type of the next SMBIOS record to return. 
-  @param[in[    Instance        Instance of SMBIOS record 0 - N-1. 
-  @param[out]   SmbiosHandle    Returns SMBIOS handle for the matching record. 
-
-  @retval NULL                  Instance of Type SMBIOS record was not found. 
-  @retval Other                 Pointer to matching SMBIOS record. 
-**/
-SMBIOS_STRUCTURE *
-EFIAPI
-SmbiosLibGetRecord (
-  IN  EFI_SMBIOS_TYPE   Type,
-  IN  UINTN             Instance,
-  OUT EFI_SMBIOS_HANDLE *SmbiosHandle
-  );
-
-/**
-  Remove an SMBIOS record.
-  
-  This function removes an SMBIOS record using the handle specified by SmbiosHandle.
-  
-  @param[in]    SmbiosHandle        The handle of the SMBIOS record to remove.
-  
-  @retval EFI_SUCCESS               SMBIOS record was removed.
-  @retval EFI_INVALID_PARAMETER     SmbiosHandle does not specify a valid SMBIOS record.
-**/
-EFI_STATUS
-EFIAPI
-SmbiosLibRemove (
-  OUT EFI_SMBIOS_HANDLE SmbiosHandle
-  );
-
-
-
-
-#endif
+/** @file
+  Provides library functions for common SMBIOS operations. Only available to DXE
+  and UEFI module types.
+
+
+Copyright (c) 2012, Apple Inc. All rights reserved.
+Portitions Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials are licensed and made available under
+the terms and conditions of the BSD License that accompanies this distribution.
+The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php.
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef _SMBIOS_LIB_H__
+#define _SMBIOS_LIB_H__
+
+#include <IndustryStandard/SmBios.h>
+#include <Protocol/Smbios.h>
+
+
+///
+/// Cache copy of the SMBIOS Protocol pointer
+///
+extern EFI_SMBIOS_PROTOCOL *gSmbios;
+
+
+///
+/// Template for SMBIOS table initialization.
+/// The SMBIOS_TABLE_STRING types in the formated area must match the
+/// StringArray sequene.
+///
+typedef struct {
+  //
+  // formatted area of a given SMBIOS record
+  //
+  SMBIOS_STRUCTURE    *Entry;
+  //
+  // NULL terminated array of ASCII strings to be added to the SMBIOS record.
+  //
+  CHAR8               **StringArray;
+} SMBIOS_TEMPLATE_ENTRY;
+
+
+/**
+  Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
+  entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
+
+  @param  Template   Array of SMBIOS_TEMPLATE_ENTRY entries.
+
+  @retval EFI_SUCCESS          New SMBIOS tables were created.
+  @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.
+**/
+EFI_STATUS
+EFIAPI
+SmbiosLibInitializeFromTemplate (
+  IN  SMBIOS_TEMPLATE_ENTRY   *Template
+  );
+
+
+
+/**
+  Create SMBIOS record.
+
+  Converts a fixed SMBIOS structure and an array of pointers to strings into
+  an SMBIOS record where the strings are cat'ed on the end of the fixed record
+  and terminated via a double NULL and add to SMBIOS table.
+
+  SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
+    { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof (SMBIOS_TABLE_TYPE12), 0 },
+    1 // StringCount
+  };
+  CHAR8 *gSmbiosType12Strings[] = {
+    "Not Found",
+    NULL
+  };
+
+  ...
+  AddSmbiosEntryFromTemplate (
+    (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
+    gSmbiosType12Strings
+    );
+
+  @param  SmbiosEntry   Fixed SMBIOS structure
+  @param  StringArray   Array of strings to convert to an SMBIOS string pack.
+                        NULL is OK.
+
+  @retval EFI_SUCCESS          New SmbiosEntry was added to SMBIOS table.
+  @retval EFI_OUT_OF_RESOURCES SmbiosEntry was not added.
+**/
+EFI_STATUS
+EFIAPI
+SmbiosLibCreateEntry (
+  IN  SMBIOS_STRUCTURE *SmbiosEntry,
+  IN  CHAR8            **StringArray
+  );
+
+
+/**
+  Update the string associated with an existing SMBIOS record.
+
+  This function allows the update of specific SMBIOS strings. The number of valid strings for any
+  SMBIOS record is defined by how many strings were present when Add() was called.
+
+  @param[in]    SmbiosHandle    SMBIOS Handle of structure that will have its string updated.
+  @param[in]    StringNumber    The non-zero string number of the string to update.
+  @param[in]    String          Update the StringNumber string with String.
+
+  @retval EFI_SUCCESS           SmbiosHandle had its StringNumber String updated.
+  @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
+  @retval EFI_UNSUPPORTED       String was not added because it is longer than the SMBIOS Table supports.
+  @retval EFI_NOT_FOUND         The StringNumber.is not valid for this SMBIOS record.
+**/
+EFI_STATUS
+EFIAPI
+SmbiosLibUpdateString (
+  IN  EFI_SMBIOS_HANDLE     SmbiosHandle,
+  IN  SMBIOS_TABLE_STRING   StringNumber,
+  IN  CHAR8                 *String
+  );
+
+/**
+  Update the string associated with an existing SMBIOS record.
+
+  This function allows the update of specific SMBIOS strings. The number of valid strings for any
+  SMBIOS record is defined by how many strings were present when Add() was called.
+
+  @param[in]    SmbiosHandle    SMBIOS Handle of structure that will have its string updated.
+  @param[in]    StringNumber    The non-zero string number of the string to update.
+  @param[in]    String          Update the StringNumber string with String.
+
+  @retval EFI_SUCCESS           SmbiosHandle had its StringNumber String updated.
+  @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
+  @retval EFI_UNSUPPORTED       String was not added because it is longer than the SMBIOS Table supports.
+  @retval EFI_NOT_FOUND         The StringNumber.is not valid for this SMBIOS record.
+**/
+EFI_STATUS
+EFIAPI
+SmbiosLibUpdateUnicodeString (
+  IN  EFI_SMBIOS_HANDLE     SmbiosHandle,
+  IN  SMBIOS_TABLE_STRING   StringNumber,
+  IN  CHAR16                *String
+  );
+
+/**
+  Allow caller to read a specific SMBIOS string
+
+  @param[in]    Header          SMBIOS record that contains the string.
+  @param[in[    StringNumber    Instance of SMBIOS string 1 - N.
+
+  @retval NULL                  Instance of Type SMBIOS string was not found.
+  @retval Other                 Pointer to matching SMBIOS string.
+**/
+CHAR8 *
+EFIAPI
+SmbiosLibReadString (
+  IN SMBIOS_STRUCTURE   *Header,
+  IN EFI_SMBIOS_STRING  StringNumber
+  );
+
+
+/**
+  Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
+
+  @param[in]    Type            Type of the next SMBIOS record to return.
+  @param[in[    Instance        Instance of SMBIOS record 0 - N-1.
+  @param[out]   SmbiosHandle    Returns SMBIOS handle for the matching record.
+
+  @retval NULL                  Instance of Type SMBIOS record was not found.
+  @retval Other                 Pointer to matching SMBIOS record.
+**/
+SMBIOS_STRUCTURE *
+EFIAPI
+SmbiosLibGetRecord (
+  IN  EFI_SMBIOS_TYPE   Type,
+  IN  UINTN             Instance,
+  OUT EFI_SMBIOS_HANDLE *SmbiosHandle
+  );
+
+/**
+  Remove an SMBIOS record.
+
+  This function removes an SMBIOS record using the handle specified by SmbiosHandle.
+
+  @param[in]    SmbiosHandle        The handle of the SMBIOS record to remove.
+
+  @retval EFI_SUCCESS               SMBIOS record was removed.
+  @retval EFI_INVALID_PARAMETER     SmbiosHandle does not specify a valid SMBIOS record.
+**/
+EFI_STATUS
+EFIAPI
+SmbiosLibRemove (
+  OUT EFI_SMBIOS_HANDLE SmbiosHandle
+  );
+
+
+
+
+#endif

+ 1 - 1
EmulatorPkg/Include/Protocol/EmuBlockIo.h

@@ -62,7 +62,7 @@ EFI_STATUS
   @param[in]       MediaId    Id of the media, changes every time the media is
                               replaced.
   @param[in]       Lba        The starting Logical Block Address to read from.
-  @param[in, out]  Token	    A pointer to the token associated with the transaction.
+  @param[in, out]  Token      A pointer to the token associated with the transaction.
   @param[in]       BufferSize Size of Buffer, must be a multiple of device block size.
   @param[out]      Buffer     A pointer to the destination buffer for the data. The
                               caller is responsible for either having implicit or

+ 140 - 140
EmulatorPkg/Include/Protocol/EmuFileSystem.h

@@ -1,140 +1,140 @@
-/** @file
-  SimpleFileSystem protocol as defined in the UEFI 2.0 specification.
-
-  The SimpleFileSystem protocol is the programmatic access to the FAT (12,16,32)
-  file system specified in UEFI 2.0. It can also be used to abstract a file
-  system other than FAT.
-
-  UEFI 2.0 can boot from any valid EFI image contained in a SimpleFileSystem.
-
-Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
-Portions copyright (c) 2011, Apple Inc. All rights reserved.
-This program and the accompanying materials are licensed and made available under
-the terms and conditions of the BSD License that accompanies this distribution.
-The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php.
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _EMU_UGA_IO_H_
-#define _EMU_UGA_IO_H_
-
-#include <Protocol/SimplePointer.h>
-#include <Protocol/SimpleTextIn.h>
-#include <Protocol/SimpleTextInEx.h>
-#include <Protocol/UgaDraw.h>
-
-#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
- { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA, 0xC1 } }
-
-typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL EMU_GRAPHICS_WINDOW_PROTOCOL;
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
-  EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
-  );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
-  EMU_GRAPHICS_WINDOW_PROTOCOL  *Uga,
-  UINT32                        Width,
-  UINT32                        Height
-  );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
-  EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
-  );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
-  EMU_GRAPHICS_WINDOW_PROTOCOL  *Uga,
-  EFI_KEY_DATA                  *key
-  );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
-  IN EMU_GRAPHICS_WINDOW_PROTOCOL   *GraphicsWindows,
-  IN EFI_KEY_TOGGLE_STATE           *KeyToggleState
-  );
-
-
-typedef
-VOID
-(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
-  IN VOID           *Context,
-  IN EFI_KEY_DATA   *KeyData
-  );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
-  IN EMU_GRAPHICS_WINDOW_PROTOCOL                       *GraphicsWindows,
-  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK   CallBack,
-  IN VOID                                               *Context
-  );
-
-
-typedef struct {
-    UINTN                                   SourceX;
-    UINTN                                   SourceY;
-    UINTN                                   DestinationX;
-    UINTN                                   DestinationY;
-    UINTN                                   Width;
-    UINTN                                   Height;
-    UINTN                                   Delta;
-} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
-  IN  EMU_GRAPHICS_WINDOW_PROTOCOL            *GraphicsWindows,
-  IN  EFI_UGA_PIXEL                           *BltBuffer OPTIONAL,
-  IN  EFI_UGA_BLT_OPERATION                   BltOperation,
-  IN  EMU_GRAPHICS_WINDOWS__BLT_ARGS          *Args
-  );
-
-typedef
-BOOLEAN
-(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
-  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,
-  IN  EFI_KEY_DATA                  *KeyData
-  );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
-  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
-  );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
-  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,
-  EFI_SIMPLE_POINTER_STATE      *state
-  );
-
-struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
-  EMU_GRAPHICS_WINDOWS_SIZE                    Size;
-  EMU_GRAPHICS_WINDOWS_CHECK_KEY               CheckKey;
-  EMU_GRAPHICS_WINDOWS_KEY_SET_STATE           KeySetState;
-  EMU_GRAPHICS_WINDOWS_GET_KEY                 GetKey;
-  EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY     RegisterKeyNotify;
-  EMU_GRAPHICS_WINDOWS_BLT                     Blt;
-  EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED          IsKeyPressed;
-  EMU_GRAPHICS_WINDOWS_CHECK_POINTER           CheckPointer;
-  EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE       GetPointerState;
-};
-
-
-extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
-
-#endif
+/** @file
+  SimpleFileSystem protocol as defined in the UEFI 2.0 specification.
+
+  The SimpleFileSystem protocol is the programmatic access to the FAT (12,16,32)
+  file system specified in UEFI 2.0. It can also be used to abstract a file
+  system other than FAT.
+
+  UEFI 2.0 can boot from any valid EFI image contained in a SimpleFileSystem.
+
+Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
+Portions copyright (c) 2011, Apple Inc. All rights reserved.
+This program and the accompanying materials are licensed and made available under
+the terms and conditions of the BSD License that accompanies this distribution.
+The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php.
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef _EMU_UGA_IO_H_
+#define _EMU_UGA_IO_H_
+
+#include <Protocol/SimplePointer.h>
+#include <Protocol/SimpleTextIn.h>
+#include <Protocol/SimpleTextInEx.h>
+#include <Protocol/UgaDraw.h>
+
+#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
+ { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA, 0xC1 } }
+
+typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL EMU_GRAPHICS_WINDOW_PROTOCOL;
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
+  EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
+  );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
+  EMU_GRAPHICS_WINDOW_PROTOCOL  *Uga,
+  UINT32                        Width,
+  UINT32                        Height
+  );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
+  EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
+  );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
+  EMU_GRAPHICS_WINDOW_PROTOCOL  *Uga,
+  EFI_KEY_DATA                  *key
+  );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
+  IN EMU_GRAPHICS_WINDOW_PROTOCOL   *GraphicsWindows,
+  IN EFI_KEY_TOGGLE_STATE           *KeyToggleState
+  );
+
+
+typedef
+VOID
+(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
+  IN VOID           *Context,
+  IN EFI_KEY_DATA   *KeyData
+  );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
+  IN EMU_GRAPHICS_WINDOW_PROTOCOL                       *GraphicsWindows,
+  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK   CallBack,
+  IN VOID                                               *Context
+  );
+
+
+typedef struct {
+    UINTN                                   SourceX;
+    UINTN                                   SourceY;
+    UINTN                                   DestinationX;
+    UINTN                                   DestinationY;
+    UINTN                                   Width;
+    UINTN                                   Height;
+    UINTN                                   Delta;
+} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
+  IN  EMU_GRAPHICS_WINDOW_PROTOCOL            *GraphicsWindows,
+  IN  EFI_UGA_PIXEL                           *BltBuffer OPTIONAL,
+  IN  EFI_UGA_BLT_OPERATION                   BltOperation,
+  IN  EMU_GRAPHICS_WINDOWS__BLT_ARGS          *Args
+  );
+
+typedef
+BOOLEAN
+(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
+  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,
+  IN  EFI_KEY_DATA                  *KeyData
+  );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
+  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
+  );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
+  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,
+  EFI_SIMPLE_POINTER_STATE      *state
+  );
+
+struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
+  EMU_GRAPHICS_WINDOWS_SIZE                    Size;
+  EMU_GRAPHICS_WINDOWS_CHECK_KEY               CheckKey;
+  EMU_GRAPHICS_WINDOWS_KEY_SET_STATE           KeySetState;
+  EMU_GRAPHICS_WINDOWS_GET_KEY                 GetKey;
+  EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY     RegisterKeyNotify;
+  EMU_GRAPHICS_WINDOWS_BLT                     Blt;
+  EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED          IsKeyPressed;
+  EMU_GRAPHICS_WINDOWS_CHECK_POINTER           CheckPointer;
+  EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE       GetPointerState;
+};
+
+
+extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
+
+#endif

+ 134 - 134
EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h

@@ -1,134 +1,134 @@
-/*++ @file
-
-Copyright (c) 2006, Tristan Gingold. All rights reserved.<BR>
-Portitions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the
-BSD License which accompanies this distribution.  The full text of the
-license may be found at http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _EMU_UGA_IO_H_
-#define _EMU_UGA_IO_H_
-
-#include <Protocol/SimplePointer.h>
-#include <Protocol/SimpleTextIn.h>
-#include <Protocol/SimpleTextInEx.h>
-#include <Protocol/UgaDraw.h>
-
-#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
- { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA, 0xC1 } }
-
-typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL EMU_GRAPHICS_WINDOW_PROTOCOL;
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
-  EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
-  );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
-  EMU_GRAPHICS_WINDOW_PROTOCOL  *Uga,
-  UINT32                        Width,
-  UINT32                        Height
-  );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
-  EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
-  );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
-  EMU_GRAPHICS_WINDOW_PROTOCOL  *Uga,
-  EFI_KEY_DATA                  *key
-  );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
-  IN EMU_GRAPHICS_WINDOW_PROTOCOL   *GraphicsWindows,
-  IN EFI_KEY_TOGGLE_STATE           *KeyToggleState
-  );
-
-
-typedef
-VOID
-(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
-  IN VOID           *Context,
-  IN EFI_KEY_DATA   *KeyData
-  );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
-  IN EMU_GRAPHICS_WINDOW_PROTOCOL                       *GraphicsWindows,
-  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK   MakeCallBack,
-  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK   BreakCallBack,
-  IN VOID                                               *Context
-  );
-
-
-typedef struct {
-    UINTN                                   SourceX;
-    UINTN                                   SourceY;
-    UINTN                                   DestinationX;
-    UINTN                                   DestinationY;
-    UINTN                                   Width;
-    UINTN                                   Height;
-    UINTN                                   Delta;
-} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
-  IN  EMU_GRAPHICS_WINDOW_PROTOCOL            *GraphicsWindows,
-  IN  EFI_UGA_PIXEL                           *BltBuffer OPTIONAL,
-  IN  EFI_UGA_BLT_OPERATION                   BltOperation,
-  IN  EMU_GRAPHICS_WINDOWS__BLT_ARGS          *Args
-  );
-
-typedef
-BOOLEAN
-(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
-  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,
-  IN  EFI_KEY_DATA                  *KeyData
-  );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
-  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
-  );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
-  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,
-  EFI_SIMPLE_POINTER_STATE      *state
-  );
-
-struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
-  EMU_GRAPHICS_WINDOWS_SIZE                    Size;
-  EMU_GRAPHICS_WINDOWS_CHECK_KEY               CheckKey;
-  EMU_GRAPHICS_WINDOWS_KEY_SET_STATE           KeySetState;
-  EMU_GRAPHICS_WINDOWS_GET_KEY                 GetKey;
-  EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY     RegisterKeyNotify;
-  EMU_GRAPHICS_WINDOWS_BLT                     Blt;
-  EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED          IsKeyPressed;
-  EMU_GRAPHICS_WINDOWS_CHECK_POINTER           CheckPointer;
-  EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE       GetPointerState;
-};
-
-
-extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
-
-#endif
+/*++ @file
+
+Copyright (c) 2006, Tristan Gingold. All rights reserved.<BR>
+Portitions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the
+BSD License which accompanies this distribution.  The full text of the
+license may be found at http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef _EMU_UGA_IO_H_
+#define _EMU_UGA_IO_H_
+
+#include <Protocol/SimplePointer.h>
+#include <Protocol/SimpleTextIn.h>
+#include <Protocol/SimpleTextInEx.h>
+#include <Protocol/UgaDraw.h>
+
+#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
+ { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA, 0xC1 } }
+
+typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL EMU_GRAPHICS_WINDOW_PROTOCOL;
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
+  EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
+  );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
+  EMU_GRAPHICS_WINDOW_PROTOCOL  *Uga,
+  UINT32                        Width,
+  UINT32                        Height
+  );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
+  EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
+  );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
+  EMU_GRAPHICS_WINDOW_PROTOCOL  *Uga,
+  EFI_KEY_DATA                  *key
+  );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
+  IN EMU_GRAPHICS_WINDOW_PROTOCOL   *GraphicsWindows,
+  IN EFI_KEY_TOGGLE_STATE           *KeyToggleState
+  );
+
+
+typedef
+VOID
+(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
+  IN VOID           *Context,
+  IN EFI_KEY_DATA   *KeyData
+  );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
+  IN EMU_GRAPHICS_WINDOW_PROTOCOL                       *GraphicsWindows,
+  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK   MakeCallBack,
+  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK   BreakCallBack,
+  IN VOID                                               *Context
+  );
+
+
+typedef struct {
+    UINTN                                   SourceX;
+    UINTN                                   SourceY;
+    UINTN                                   DestinationX;
+    UINTN                                   DestinationY;
+    UINTN                                   Width;
+    UINTN                                   Height;
+    UINTN                                   Delta;
+} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
+  IN  EMU_GRAPHICS_WINDOW_PROTOCOL            *GraphicsWindows,
+  IN  EFI_UGA_PIXEL                           *BltBuffer OPTIONAL,
+  IN  EFI_UGA_BLT_OPERATION                   BltOperation,
+  IN  EMU_GRAPHICS_WINDOWS__BLT_ARGS          *Args
+  );
+
+typedef
+BOOLEAN
+(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
+  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,
+  IN  EFI_KEY_DATA                  *KeyData
+  );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
+  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
+  );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
+  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsWindows,
+  EFI_SIMPLE_POINTER_STATE      *state
+  );
+
+struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
+  EMU_GRAPHICS_WINDOWS_SIZE                    Size;
+  EMU_GRAPHICS_WINDOWS_CHECK_KEY               CheckKey;
+  EMU_GRAPHICS_WINDOWS_KEY_SET_STATE           KeySetState;
+  EMU_GRAPHICS_WINDOWS_GET_KEY                 GetKey;
+  EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY     RegisterKeyNotify;
+  EMU_GRAPHICS_WINDOWS_BLT                     Blt;
+  EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED          IsKeyPressed;
+  EMU_GRAPHICS_WINDOWS_CHECK_POINTER           CheckPointer;
+  EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE       GetPointerState;
+};
+
+
+extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
+
+#endif

+ 1 - 1
EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c

@@ -180,4 +180,4 @@ DevicePathToTextLibConstructor (
   DevicePathFromTextAddFilter (L"EmuThread", DevPathFromTextEmuThread);
   DevicePathFromTextAddFilter (L"EmuFs", DevPathFromTextEmuFs);
   return EFI_SUCCESS;
-}
+}

+ 1 - 1
EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf

@@ -45,4 +45,4 @@
   gEmuGraphicsWindowProtocolGuid
   gEfiSimpleFileSystemProtocolGuid
   gEmuBlockIoProtocolGuid
-  gEmuThreadThunkProtocolGuid
+  gEmuThreadThunkProtocolGuid

+ 1 - 1
EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c

@@ -85,4 +85,4 @@ GetIoThunkInstance (
   }
 
   return NULL;
-}
+}

+ 48 - 48
EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActionLib.inf

@@ -1,48 +1,48 @@
-## @file
-# PeCoff extra action libary for DXE phase that run Emu emulator.
-#
-# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
-# Portions copyright (c) 2011, Apple Inc. All rights reserved.
-# This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-#
-#
-##
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = DxeEmuPeCoffExtraActionLib
-  FILE_GUID                      = 68FCD487-D230-6846-95B1-5E1F2EF942C4
-  MODULE_TYPE                    = DXE_DRIVER
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = PeCoffExtraActionLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_DRIVER
-
-  CONSTRUCTOR                    = DxeEmuPeCoffLibExtraActionConstructor
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32
-#
-
-[Sources]
-  DxeEmuPeCoffExtraActionLib.c
-
-[Packages]
-  MdePkg/MdePkg.dec
-  EmulatorPkg/EmulatorPkg.dec
-
-[LibraryClasses]
-  DebugLib
-  HobLib
-  BaseMemoryLib
-
-[Protocols]
-  gEmuThunkProtocolGuid                     # PROTOCOL ALWAYS_CONSUMED
-
+## @file
+# PeCoff extra action libary for DXE phase that run Emu emulator.
+#
+# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
+# Portions copyright (c) 2011, Apple Inc. All rights reserved.
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+#
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = DxeEmuPeCoffExtraActionLib
+  FILE_GUID                      = 68FCD487-D230-6846-95B1-5E1F2EF942C4
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = PeCoffExtraActionLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_DRIVER
+
+  CONSTRUCTOR                    = DxeEmuPeCoffLibExtraActionConstructor
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+#  VALID_ARCHITECTURES           = IA32
+#
+
+[Sources]
+  DxeEmuPeCoffExtraActionLib.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+  EmulatorPkg/EmulatorPkg.dec
+
+[LibraryClasses]
+  DebugLib
+  HobLib
+  BaseMemoryLib
+
+[Protocols]
+  gEmuThunkProtocolGuid                     # PROTOCOL ALWAYS_CONSUMED
+

+ 1 - 1
EmulatorPkg/Library/DxeEmuStdErrSerialPortLib/DxeEmuStdErrSerialPortLib.c

@@ -69,7 +69,7 @@ SerialPortWrite (
   if (gEmuThunk == NULL) {
     return NumberOfBytes;
   }
-  
+
   return gEmuThunk->WriteStdErr (Buffer, NumberOfBytes);
 }
 

+ 1 - 1
EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c

@@ -47,4 +47,4 @@ KeyMapBreak (
   )
 {
   return EFI_SUCCESS;
-}
+}

+ 6 - 6
EmulatorPkg/Library/PeiCoreServicesTablePointerLib/PeiServicesTablePointer.c

@@ -89,16 +89,16 @@ PeiServicesTablePointerLibConstructor (
 }
 
 /**
-  Perform CPU specific actions required to migrate the PEI Services Table 
+  Perform CPU specific actions required to migrate the PEI Services Table
   pointer from temporary RAM to permanent RAM.
 
-  For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes 
+  For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
   immediately preceding the Interrupt Descriptor Table (IDT) in memory.
-  For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes 
+  For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
   immediately preceding the Interrupt Descriptor Table (IDT) in memory.
   For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in
-  a dedicated CPU register.  This means that there is no memory storage 
-  associated with storing the PEI Services Table pointer, so no additional 
+  a dedicated CPU register.  This means that there is no memory storage
+  associated with storing the PEI Services Table pointer, so no additional
   migration actions are required for Itanium or ARM CPUs.
 
 **/
@@ -109,7 +109,7 @@ MigratePeiServicesTablePointer (
   )
 {
   //
-  //  PEI Services Table pointer is cached in the global variable. No additional 
+  //  PEI Services Table pointer is cached in the global variable. No additional
   //  migration actions are required.
   //
   return;

+ 49 - 49
EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraActionLib.inf

@@ -1,49 +1,49 @@
-## @file
-# PeCoff extra action libary for Pei phase that run Emu emulator.
-#
-# Lib to provide memory journal status code reporting Routines
-# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
-# Portions copyright (c) 2011, Apple Inc. All rights reserved.
-# This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-#
-#
-##
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = PeiEmuPeCoffExtraActionLib
-  FILE_GUID                      = 79C4E72A-730B-F040-8129-95877B3A97A8
-  MODULE_TYPE                    = PEIM
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = PeCoffExtraActionLib|PEI_CORE PEIM
-
-#
-# The following information is for reference only and not required by the build tools.
-#
-#  VALID_ARCHITECTURES           = IA32
-#
-
-[Sources]
-  PeiEmuPeCoffExtraActionLib.c
-
-[Packages]
-  MdePkg/MdePkg.dec
-  EmulatorPkg/EmulatorPkg.dec
-
-[LibraryClasses]
-  BaseLib
-  PeiServicesLib
-  DebugLib
-
-[Ppis]
-  gEmuThunkPpiGuid                          # PPI ALWAYS_CONSUMED
-
-[Pcd]
-  gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage
+## @file
+# PeCoff extra action libary for Pei phase that run Emu emulator.
+#
+# Lib to provide memory journal status code reporting Routines
+# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
+# Portions copyright (c) 2011, Apple Inc. All rights reserved.
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+#
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = PeiEmuPeCoffExtraActionLib
+  FILE_GUID                      = 79C4E72A-730B-F040-8129-95877B3A97A8
+  MODULE_TYPE                    = PEIM
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = PeCoffExtraActionLib|PEI_CORE PEIM
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+#  VALID_ARCHITECTURES           = IA32
+#
+
+[Sources]
+  PeiEmuPeCoffExtraActionLib.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+  EmulatorPkg/EmulatorPkg.dec
+
+[LibraryClasses]
+  BaseLib
+  PeiServicesLib
+  DebugLib
+
+[Ppis]
+  gEmuThunkPpiGuid                          # PPI ALWAYS_CONSUMED
+
+[Pcd]
+  gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage

+ 6 - 6
EmulatorPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c

@@ -134,16 +134,16 @@ PeiServicesTablePointerLibConstructor (
 }
 
 /**
-  Perform CPU specific actions required to migrate the PEI Services Table 
+  Perform CPU specific actions required to migrate the PEI Services Table
   pointer from temporary RAM to permanent RAM.
 
-  For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes 
+  For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
   immediately preceding the Interrupt Descriptor Table (IDT) in memory.
-  For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes 
+  For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
   immediately preceding the Interrupt Descriptor Table (IDT) in memory.
   For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in
-  a dedicated CPU register.  This means that there is no memory storage 
-  associated with storing the PEI Services Table pointer, so no additional 
+  a dedicated CPU register.  This means that there is no memory storage
+  associated with storing the PEI Services Table pointer, so no additional
   migration actions are required for Itanium or ARM CPUs.
 
 **/
@@ -154,7 +154,7 @@ MigratePeiServicesTablePointer (
   )
 {
   //
-  //  PEI Services Table pointer is cached in the global variable. No additional 
+  //  PEI Services Table pointer is cached in the global variable. No additional
   //  migration actions are required.
   //
   return;

+ 6 - 6
EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTablePointer.c

@@ -72,16 +72,16 @@ GetPeiServicesTablePointer (
 }
 
 /**
-  Perform CPU specific actions required to migrate the PEI Services Table 
+  Perform CPU specific actions required to migrate the PEI Services Table
   pointer from temporary RAM to permanent RAM.
 
-  For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes 
+  For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
   immediately preceding the Interrupt Descriptor Table (IDT) in memory.
-  For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes 
+  For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
   immediately preceding the Interrupt Descriptor Table (IDT) in memory.
   For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in
-  a dedicated CPU register.  This means that there is no memory storage 
-  associated with storing the PEI Services Table pointer, so no additional 
+  a dedicated CPU register.  This means that there is no memory storage
+  associated with storing the PEI Services Table pointer, so no additional
   migration actions are required for Itanium or ARM CPUs.
 
 **/
@@ -92,7 +92,7 @@ MigratePeiServicesTablePointer (
   )
 {
   //
-  //  PEI Services Table pointer is cached in SRAM. No additional 
+  //  PEI Services Table pointer is cached in SRAM. No additional
   //  migration actions are required.
   //
   return;

+ 1 - 1
EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf

@@ -44,4 +44,4 @@
   PeiServicesLib
 
 [Ppis]
-  gEmuThunkPpiGuid
+  gEmuThunkPpiGuid

+ 281 - 281
EmulatorPkg/Library/SecPeiServicesLib/FwVol.c

@@ -1,281 +1,281 @@
-/*++ @file
-  A simple FV stack so the SEC can extract the SEC Core from an
-  FV.
-
-Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution.  The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include <PiPei.h>
-
-
-#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
-  (ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1))
-
-EFI_FFS_FILE_STATE
-GetFileState (
-  IN UINT8                ErasePolarity,
-  IN EFI_FFS_FILE_HEADER  *FfsHeader
-  )
-/*++
-
-Routine Description:
-  Returns the highest bit set of the State field
-
-Arguments:
-  ErasePolarity   - Erase Polarity  as defined by EFI_FVB2_ERASE_POLARITY
-                    in the Attributes field.
-  FfsHeader       - Pointer to FFS File Header.
-
-Returns:
-  Returns the highest bit in the State field
-
-**/
-{
-  EFI_FFS_FILE_STATE  FileState;
-  EFI_FFS_FILE_STATE  HighestBit;
-
-  FileState = FfsHeader->State;
-
-  if (ErasePolarity != 0) {
-    FileState = (EFI_FFS_FILE_STATE)~FileState;
-  }
-
-  HighestBit = 0x80;
-  while (HighestBit != 0 && (HighestBit & FileState) == 0) {
-    HighestBit >>= 1;
-  }
-
-  return HighestBit;
-}
-
-UINT8
-CalculateHeaderChecksum (
-  IN EFI_FFS_FILE_HEADER  *FileHeader
-  )
-/*++
-
-Routine Description:
-  Calculates the checksum of the header of a file.
-
-Arguments:
-  FileHeader       - Pointer to FFS File Header.
-
-Returns:
-  Checksum of the header.
-
-**/
-{
-  UINT8 *ptr;
-  UINTN Index;
-  UINT8 Sum;
-
-  Sum = 0;
-  ptr = (UINT8 *) FileHeader;
-
-  for (Index = 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index += 4) {
-    Sum = (UINT8) (Sum + ptr[Index]);
-    Sum = (UINT8) (Sum + ptr[Index + 1]);
-    Sum = (UINT8) (Sum + ptr[Index + 2]);
-    Sum = (UINT8) (Sum + ptr[Index + 3]);
-  }
-
-  for (; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) {
-    Sum = (UINT8) (Sum + ptr[Index]);
-  }
-  //
-  // State field (since this indicates the different state of file).
-  //
-  Sum = (UINT8) (Sum - FileHeader->State);
-  //
-  // Checksum field of the file is not part of the header checksum.
-  //
-  Sum = (UINT8) (Sum - FileHeader->IntegrityCheck.Checksum.File);
-
-  return Sum;
-}
-
-EFI_STATUS
-SecFfsFindNextFile (
-  IN EFI_FV_FILETYPE             SearchType,
-  IN EFI_PEI_FV_HANDLE           FvHandle,
-  IN OUT EFI_PEI_FILE_HANDLE     *FileHandle
-  )
-/*++
-
-Routine Description:
-    Given the input file pointer, search for the next matching file in the
-    FFS volume as defined by SearchType. The search starts from FileHeader inside
-    the Firmware Volume defined by FwVolHeader.
-
-Arguments:
-    SearchType - Filter to find only files of this type.
-                 Type EFI_FV_FILETYPE_ALL causes no filtering to be done.
-    FwVolHeader - Pointer to the FV header of the volume to search.
-                  This parameter must point to a valid FFS volume.
-    FileHeader  - Pointer to the current file from which to begin searching.
-                  This pointer will be updated upon return to reflect the file
-                  found.
-
-Returns:
-    EFI_NOT_FOUND - No files matching the search criteria were found
-    EFI_SUCCESS
-
-**/
-{
-  EFI_FFS_FILE_HEADER *FfsFileHeader;
-  UINT32              FileLength;
-  UINT32              FileOccupiedSize;
-  UINT32              FileOffset;
-  UINT64              FvLength;
-  UINT8               ErasePolarity;
-  UINT8               FileState;
-  EFI_FIRMWARE_VOLUME_HEADER  *FwVolHeader;
-  EFI_FFS_FILE_HEADER         **FileHeader;
-
-  //
-  // Convert the handle of FV to FV header for memory-mapped firmware volume
-  //
-  FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) FvHandle;
-  FileHeader  = (EFI_FFS_FILE_HEADER **)FileHandle;
-
-  FvLength = FwVolHeader->FvLength;
-  if (FwVolHeader->Attributes & EFI_FVB2_ERASE_POLARITY) {
-    ErasePolarity = 1;
-  } else {
-    ErasePolarity = 0;
-  }
-  //
-  // If FileHeader is not specified (NULL) start with the first file in the
-  // firmware volume.  Otherwise, start from the FileHeader.
-  //
-  if (*FileHeader == NULL) {
-    FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FwVolHeader + FwVolHeader->HeaderLength);
-  } else {
-    //
-    // Length is 24 bits wide so mask upper 8 bits
-    // FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.
-    //
-    FileLength        = *(UINT32 *) (*FileHeader)->Size & 0x00FFFFFF;
-    FileOccupiedSize  = GET_OCCUPIED_SIZE (FileLength, 8);
-    FfsFileHeader     = (EFI_FFS_FILE_HEADER *) ((UINT8 *) *FileHeader + FileOccupiedSize);
-  }
-
-  FileOffset = (UINT32) ((UINT8 *) FfsFileHeader - (UINT8 *) FwVolHeader);
-
-  while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) {
-    //
-    // Get FileState which is the highest bit of the State
-    //
-    FileState = GetFileState (ErasePolarity, FfsFileHeader);
-
-    switch (FileState) {
-
-    case EFI_FILE_HEADER_INVALID:
-      FileOffset += sizeof (EFI_FFS_FILE_HEADER);
-      FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER));
-      break;
-
-    case EFI_FILE_DATA_VALID:
-    case EFI_FILE_MARKED_FOR_UPDATE:
-      if (CalculateHeaderChecksum (FfsFileHeader) == 0) {
-        FileLength        = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
-        FileOccupiedSize  = GET_OCCUPIED_SIZE (FileLength, 8);
-
-        if ((SearchType == FfsFileHeader->Type) || (SearchType == EFI_FV_FILETYPE_ALL)) {
-
-          *FileHeader = FfsFileHeader;
-
-          return EFI_SUCCESS;
-        }
-
-        FileOffset += FileOccupiedSize;
-        FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + FileOccupiedSize);
-      } else {
-        return EFI_NOT_FOUND;
-      }
-      break;
-
-    case EFI_FILE_DELETED:
-      FileLength        = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
-      FileOccupiedSize  = GET_OCCUPIED_SIZE (FileLength, 8);
-      FileOffset += FileOccupiedSize;
-      FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + FileOccupiedSize);
-      break;
-
-    default:
-      return EFI_NOT_FOUND;
-
-    }
-  }
-
-  return EFI_NOT_FOUND;
-}
-
-EFI_STATUS
-SecFfsFindSectionData (
-  IN EFI_SECTION_TYPE      SectionType,
-  IN EFI_FFS_FILE_HEADER   *FfsFileHeader,
-  IN OUT VOID              **SectionData
-  )
-/*++
-
-Routine Description:
-    Given the input file pointer, search for the next matching section in the
-    FFS volume.
-
-Arguments:
-    SearchType    - Filter to find only sections of this type.
-    FfsFileHeader - Pointer to the current file to search.
-    SectionData   - Pointer to the Section matching SectionType in FfsFileHeader.
-                     NULL if section not found
-
-Returns:
-    EFI_NOT_FOUND - No files matching the search criteria were found
-    EFI_SUCCESS
-
-**/
-{
-  UINT32                    FileSize;
-  EFI_COMMON_SECTION_HEADER *Section;
-  UINT32                    SectionLength;
-  UINT32                    ParsedLength;
-
-  //
-  // Size is 24 bits wide so mask upper 8 bits.
-  //    Does not include FfsFileHeader header size
-  // FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
-  //
-  Section   = (EFI_COMMON_SECTION_HEADER *) (FfsFileHeader + 1);
-  FileSize  = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
-  FileSize -= sizeof (EFI_FFS_FILE_HEADER);
-
-  *SectionData  = NULL;
-  ParsedLength  = 0;
-  while (ParsedLength < FileSize) {
-    if (Section->Type == SectionType) {
-      *SectionData = (VOID *) (Section + 1);
-      return EFI_SUCCESS;
-    }
-    //
-    // Size is 24 bits wide so mask upper 8 bits.
-    // SectionLength is adjusted it is 4 byte aligned.
-    // Go to the next section
-    //
-    SectionLength = *(UINT32 *) Section->Size & 0x00FFFFFF;
-    SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
-
-    ParsedLength += SectionLength;
-    Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + SectionLength);
-  }
-
-  return EFI_NOT_FOUND;
-}
-
+/*++ @file
+  A simple FV stack so the SEC can extract the SEC Core from an
+  FV.
+
+Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <PiPei.h>
+
+
+#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
+  (ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1))
+
+EFI_FFS_FILE_STATE
+GetFileState (
+  IN UINT8                ErasePolarity,
+  IN EFI_FFS_FILE_HEADER  *FfsHeader
+  )
+/*++
+
+Routine Description:
+  Returns the highest bit set of the State field
+
+Arguments:
+  ErasePolarity   - Erase Polarity  as defined by EFI_FVB2_ERASE_POLARITY
+                    in the Attributes field.
+  FfsHeader       - Pointer to FFS File Header.
+
+Returns:
+  Returns the highest bit in the State field
+
+**/
+{
+  EFI_FFS_FILE_STATE  FileState;
+  EFI_FFS_FILE_STATE  HighestBit;
+
+  FileState = FfsHeader->State;
+
+  if (ErasePolarity != 0) {
+    FileState = (EFI_FFS_FILE_STATE)~FileState;
+  }
+
+  HighestBit = 0x80;
+  while (HighestBit != 0 && (HighestBit & FileState) == 0) {
+    HighestBit >>= 1;
+  }
+
+  return HighestBit;
+}
+
+UINT8
+CalculateHeaderChecksum (
+  IN EFI_FFS_FILE_HEADER  *FileHeader
+  )
+/*++
+
+Routine Description:
+  Calculates the checksum of the header of a file.
+
+Arguments:
+  FileHeader       - Pointer to FFS File Header.
+
+Returns:
+  Checksum of the header.
+
+**/
+{
+  UINT8 *ptr;
+  UINTN Index;
+  UINT8 Sum;
+
+  Sum = 0;
+  ptr = (UINT8 *) FileHeader;
+
+  for (Index = 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index += 4) {
+    Sum = (UINT8) (Sum + ptr[Index]);
+    Sum = (UINT8) (Sum + ptr[Index + 1]);
+    Sum = (UINT8) (Sum + ptr[Index + 2]);
+    Sum = (UINT8) (Sum + ptr[Index + 3]);
+  }
+
+  for (; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) {
+    Sum = (UINT8) (Sum + ptr[Index]);
+  }
+  //
+  // State field (since this indicates the different state of file).
+  //
+  Sum = (UINT8) (Sum - FileHeader->State);
+  //
+  // Checksum field of the file is not part of the header checksum.
+  //
+  Sum = (UINT8) (Sum - FileHeader->IntegrityCheck.Checksum.File);
+
+  return Sum;
+}
+
+EFI_STATUS
+SecFfsFindNextFile (
+  IN EFI_FV_FILETYPE             SearchType,
+  IN EFI_PEI_FV_HANDLE           FvHandle,
+  IN OUT EFI_PEI_FILE_HANDLE     *FileHandle
+  )
+/*++
+
+Routine Description:
+    Given the input file pointer, search for the next matching file in the
+    FFS volume as defined by SearchType. The search starts from FileHeader inside
+    the Firmware Volume defined by FwVolHeader.
+
+Arguments:
+    SearchType - Filter to find only files of this type.
+                 Type EFI_FV_FILETYPE_ALL causes no filtering to be done.
+    FwVolHeader - Pointer to the FV header of the volume to search.
+                  This parameter must point to a valid FFS volume.
+    FileHeader  - Pointer to the current file from which to begin searching.
+                  This pointer will be updated upon return to reflect the file
+                  found.
+
+Returns:
+    EFI_NOT_FOUND - No files matching the search criteria were found
+    EFI_SUCCESS
+
+**/
+{
+  EFI_FFS_FILE_HEADER *FfsFileHeader;
+  UINT32              FileLength;
+  UINT32              FileOccupiedSize;
+  UINT32              FileOffset;
+  UINT64              FvLength;
+  UINT8               ErasePolarity;
+  UINT8               FileState;
+  EFI_FIRMWARE_VOLUME_HEADER  *FwVolHeader;
+  EFI_FFS_FILE_HEADER         **FileHeader;
+
+  //
+  // Convert the handle of FV to FV header for memory-mapped firmware volume
+  //
+  FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) FvHandle;
+  FileHeader  = (EFI_FFS_FILE_HEADER **)FileHandle;
+
+  FvLength = FwVolHeader->FvLength;
+  if (FwVolHeader->Attributes & EFI_FVB2_ERASE_POLARITY) {
+    ErasePolarity = 1;
+  } else {
+    ErasePolarity = 0;
+  }
+  //
+  // If FileHeader is not specified (NULL) start with the first file in the
+  // firmware volume.  Otherwise, start from the FileHeader.
+  //
+  if (*FileHeader == NULL) {
+    FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FwVolHeader + FwVolHeader->HeaderLength);
+  } else {
+    //
+    // Length is 24 bits wide so mask upper 8 bits
+    // FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.
+    //
+    FileLength        = *(UINT32 *) (*FileHeader)->Size & 0x00FFFFFF;
+    FileOccupiedSize  = GET_OCCUPIED_SIZE (FileLength, 8);
+    FfsFileHeader     = (EFI_FFS_FILE_HEADER *) ((UINT8 *) *FileHeader + FileOccupiedSize);
+  }
+
+  FileOffset = (UINT32) ((UINT8 *) FfsFileHeader - (UINT8 *) FwVolHeader);
+
+  while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) {
+    //
+    // Get FileState which is the highest bit of the State
+    //
+    FileState = GetFileState (ErasePolarity, FfsFileHeader);
+
+    switch (FileState) {
+
+    case EFI_FILE_HEADER_INVALID:
+      FileOffset += sizeof (EFI_FFS_FILE_HEADER);
+      FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER));
+      break;
+
+    case EFI_FILE_DATA_VALID:
+    case EFI_FILE_MARKED_FOR_UPDATE:
+      if (CalculateHeaderChecksum (FfsFileHeader) == 0) {
+        FileLength        = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
+        FileOccupiedSize  = GET_OCCUPIED_SIZE (FileLength, 8);
+
+        if ((SearchType == FfsFileHeader->Type) || (SearchType == EFI_FV_FILETYPE_ALL)) {
+
+          *FileHeader = FfsFileHeader;
+
+          return EFI_SUCCESS;
+        }
+
+        FileOffset += FileOccupiedSize;
+        FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + FileOccupiedSize);
+      } else {
+        return EFI_NOT_FOUND;
+      }
+      break;
+
+    case EFI_FILE_DELETED:
+      FileLength        = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
+      FileOccupiedSize  = GET_OCCUPIED_SIZE (FileLength, 8);
+      FileOffset += FileOccupiedSize;
+      FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + FileOccupiedSize);
+      break;
+
+    default:
+      return EFI_NOT_FOUND;
+
+    }
+  }
+
+  return EFI_NOT_FOUND;
+}
+
+EFI_STATUS
+SecFfsFindSectionData (
+  IN EFI_SECTION_TYPE      SectionType,
+  IN EFI_FFS_FILE_HEADER   *FfsFileHeader,
+  IN OUT VOID              **SectionData
+  )
+/*++
+
+Routine Description:
+    Given the input file pointer, search for the next matching section in the
+    FFS volume.
+
+Arguments:
+    SearchType    - Filter to find only sections of this type.
+    FfsFileHeader - Pointer to the current file to search.
+    SectionData   - Pointer to the Section matching SectionType in FfsFileHeader.
+                     NULL if section not found
+
+Returns:
+    EFI_NOT_FOUND - No files matching the search criteria were found
+    EFI_SUCCESS
+
+**/
+{
+  UINT32                    FileSize;
+  EFI_COMMON_SECTION_HEADER *Section;
+  UINT32                    SectionLength;
+  UINT32                    ParsedLength;
+
+  //
+  // Size is 24 bits wide so mask upper 8 bits.
+  //    Does not include FfsFileHeader header size
+  // FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
+  //
+  Section   = (EFI_COMMON_SECTION_HEADER *) (FfsFileHeader + 1);
+  FileSize  = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
+  FileSize -= sizeof (EFI_FFS_FILE_HEADER);
+
+  *SectionData  = NULL;
+  ParsedLength  = 0;
+  while (ParsedLength < FileSize) {
+    if (Section->Type == SectionType) {
+      *SectionData = (VOID *) (Section + 1);
+      return EFI_SUCCESS;
+    }
+    //
+    // Size is 24 bits wide so mask upper 8 bits.
+    // SectionLength is adjusted it is 4 byte aligned.
+    // Go to the next section
+    //
+    SectionLength = *(UINT32 *) Section->Size & 0x00FFFFFF;
+    SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
+
+    ParsedLength += SectionLength;
+    Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + SectionLength);
+  }
+
+  return EFI_NOT_FOUND;
+}
+

+ 17 - 17
EmulatorPkg/Library/SecPpiListLib/PpiListLib.c

@@ -1,17 +1,17 @@
-/*++ @file
-
-Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution.  The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include <PiPei.h>
-
-CONST EFI_PEI_PPI_DESCRIPTOR  *gPpiList = NULL;
-
+/*++ @file
+
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <PiPei.h>
+
+CONST EFI_PEI_PPI_DESCRIPTOR  *gPpiList = NULL;
+

+ 352 - 352
EmulatorPkg/Library/SmbiosLib/SmbiosLib.c

@@ -1,352 +1,352 @@
-/** @file
-  Provides library functions for common SMBIOS operations. Only available to DXE
-  and UEFI module types.
-
-
-Copyright (c) 2012, Apple Inc. All rights reserved.
-Portitions Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials are licensed and made available under 
-the terms and conditions of the BSD License that accompanies this distribution.  
-The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php.
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-  
-#include <PiDxe.h>
-#include <Library/BaseLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/DebugLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiLib.h>
-#include <Library/SmbiosLib.h>
-
-
-EFI_SMBIOS_PROTOCOL *gSmbios = NULL;
-
-
-/**
-  Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY 
-  entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
-
-  @param  Template   Array of SMBIOS_TEMPLATE_ENTRY entries.
- 
-  @retval EFI_SUCCESS          New SMBIOS tables were created.
-  @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created. 
-**/
-EFI_STATUS
-EFIAPI
-SmbiosLibInitializeFromTemplate (
-  IN  SMBIOS_TEMPLATE_ENTRY   *Template
-  )
-{
-  EFI_STATUS    Status;
-  UINTN         Index;
-
-  if (Template == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Status = EFI_SUCCESS;
-
-  for (Index = 0; Template[Index].Entry != NULL; Index++) {
-    Status = SmbiosLibCreateEntry (Template[Index].Entry, Template[Index].StringArray);
-  }
-
-  return Status;
-}
-
-
-
-/**
-  Create SMBIOS record.
-
-  Converts a fixed SMBIOS structure and an array of pointers to strings into
-  an SMBIOS record where the strings are cat'ed on the end of the fixed record
-  and terminated via a double NULL and add to SMBIOS table.
-
-  SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
-    { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof (SMBIOS_TABLE_TYPE12), 0 },
-    1 // StringCount
-  };
-  CHAR8 *gSmbiosType12Strings[] = {
-    "Not Found",
-    NULL
-  };
-  
-  ...
-  CreateSmbiosEntry (
-    (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12, 
-    gSmbiosType12Strings
-    );
-
-  @param  SmbiosEntry   Fixed SMBIOS structure
-  @param  StringArray   Array of strings to convert to an SMBIOS string pack. 
-                        NULL is OK.
-
-**/
-EFI_STATUS
-EFIAPI
-SmbiosLibCreateEntry (
-  IN  SMBIOS_STRUCTURE *SmbiosEntry,
-  IN  CHAR8            **StringArray 
-  )
-{
-  EFI_STATUS                Status;
-  EFI_SMBIOS_HANDLE         SmbiosHandle;
-  EFI_SMBIOS_TABLE_HEADER   *Record;
-  UINTN                     Index;
-  UINTN                     StringSize;
-  UINTN                     Size;
-  CHAR8                     *Str;
-
-  // Calculate the size of the fixed record and optional string pack
-  Size = SmbiosEntry->Length;
-  if (StringArray == NULL) { 
-    Size += 2; // Min string section is double null
-  } else if (StringArray[0] == NULL) {
-    Size += 2; // Min string section is double null
-  } else {
-    for (Index = 0; StringArray[Index] != NULL; Index++) {
-      StringSize = AsciiStrSize (StringArray[Index]);
-      Size += StringSize;
-    }
-    // Don't forget the terminating double null
-    Size += 1;
-  }
-
-  // Copy over Template
-  Record = (EFI_SMBIOS_TABLE_HEADER *)AllocateZeroPool (Size);
-  if (Record == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-  CopyMem (Record, SmbiosEntry, SmbiosEntry->Length);
-
-  if (StringArray != NULL) {
-    // Append string pack
-    Str = ((CHAR8 *)Record) + Record->Length;
-    for (Index = 0; StringArray[Index] != NULL; Index++) {
-      StringSize = AsciiStrSize (StringArray[Index]);
-      CopyMem (Str, StringArray[Index], StringSize);
-      Str += StringSize;
-    }
-    *Str = 0;
-  }  
-
-  SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
-  Status = gSmbios->Add (
-                     gSmbios,
-                     gImageHandle,
-                     &SmbiosHandle,
-                     Record
-                     );
-  
-  FreePool (Record);
-  return Status;
-}
-
-
-
-/**
-  Update the string associated with an existing SMBIOS record.
-  
-  This function allows the update of specific SMBIOS strings. The number of valid strings for any
-  SMBIOS record is defined by how many strings were present when Add() was called.
-  
-  @param[in]    SmbiosHandle    SMBIOS Handle of structure that will have its string updated.
-  @param[in]    StringNumber    The non-zero string number of the string to update.
-  @param[in]    String          Update the StringNumber string with String.
-  
-  @retval EFI_SUCCESS           SmbiosHandle had its StringNumber String updated.
-  @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
-  @retval EFI_UNSUPPORTED       String was not added because it is longer than the SMBIOS Table supports.
-  @retval EFI_NOT_FOUND         The StringNumber.is not valid for this SMBIOS record.    
-**/
-EFI_STATUS
-EFIAPI
-SmbiosLibUpdateString (
-  IN  EFI_SMBIOS_HANDLE     SmbiosHandle,
-  IN  SMBIOS_TABLE_STRING   StringNumber,
-  IN  CHAR8                 *String
-  )
-{
-  UINTN StringIndex;
-
-  if (String == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if (*String == '\0') {
-    // A string with no data is not legal in SMBIOS
-    return EFI_INVALID_PARAMETER;
-  }
-
-  StringIndex = StringNumber;
-  return gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex, String);
-}
-
-
-/**
-  Update the string associated with an existing SMBIOS record.
-  
-  This function allows the update of specific SMBIOS strings. The number of valid strings for any
-  SMBIOS record is defined by how many strings were present when Add() was called.
-  
-  @param[in]    SmbiosHandle    SMBIOS Handle of structure that will have its string updated.
-  @param[in]    StringNumber    The non-zero string number of the string to update.
-  @param[in]    String          Update the StringNumber string with String.
-  
-  @retval EFI_SUCCESS           SmbiosHandle had its StringNumber String updated.
-  @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
-  @retval EFI_UNSUPPORTED       String was not added because it is longer than the SMBIOS Table supports.
-  @retval EFI_NOT_FOUND         The StringNumber.is not valid for this SMBIOS record.    
-**/
-EFI_STATUS
-EFIAPI
-SmbiosLibUpdateUnicodeString (
-  IN  EFI_SMBIOS_HANDLE     SmbiosHandle,
-  IN  SMBIOS_TABLE_STRING   StringNumber,
-  IN  CHAR16                *String
-  )
-{
-  EFI_STATUS  Status;
-  UINTN       StringIndex;
-  CHAR8       *Ascii;
-
-  if (String == NULL) {
-    return EFI_INVALID_PARAMETER;
-  }
-
-  if (*String == '\0') {
-    // A string with no data is not legal in SMBIOS
-    return EFI_INVALID_PARAMETER;
-  }
-
-  Ascii = AllocateZeroPool (StrSize (String));
-  if (Ascii == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-  UnicodeStrToAsciiStr (String, Ascii);
-
-  StringIndex = StringNumber;
-  Status = gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex, Ascii);
-  
-  FreePool (Ascii);
-  return Status;
-}
-
-
-/**
-  Allow caller to read a specific SMBIOS string
-  
-  @param[in]    Header          SMBIOS record that contains the string. 
-  @param[in[    StringNumber    Instance of SMBIOS string 1 - N. 
-
-  @retval NULL                  Instance of Type SMBIOS string was not found. 
-  @retval Other                 Pointer to matching SMBIOS string. 
-**/
-CHAR8 *
-EFIAPI
-SmbiosLibReadString (
-  IN SMBIOS_STRUCTURE   *Header,
-  IN EFI_SMBIOS_STRING  StringNumber
-  )
-{
-  CHAR8       *Data;
-  UINTN       Match;
-  
-  Data = (CHAR8 *)Header + Header->Length;
-  for (Match = 1;!(*Data == 0 && *(Data+1) == 0); ) {
-    if (StringNumber == Match) {
-      return Data;
-    }
-    Data++;
-    if (*(Data - 1) == '\0') {
-      Match++;
-    }
-  } 
-
-  return NULL;
-}
-
-
-/**
-  Allow the caller to discover a specific SMBIOS entry, and patch it if necissary. 
-  
-  @param[in]    Type            Type of the next SMBIOS record to return. 
-  @param[in[    Instance        Instance of SMBIOS record 0 - N-1. 
-  @param[out]   SmbiosHandle    Returns SMBIOS handle for the matching record. 
-
-  @retval NULL                  Instance of Type SMBIOS record was not found. 
-  @retval Other                 Pointer to matching SMBIOS record. 
-**/
-SMBIOS_STRUCTURE *
-EFIAPI
-SmbiosLibGetRecord (
-  IN  EFI_SMBIOS_TYPE   Type,
-  IN  UINTN             Instance,
-  OUT EFI_SMBIOS_HANDLE *SmbiosHandle
-  )
-{
-  EFI_STATUS              Status;
-  EFI_SMBIOS_TABLE_HEADER *Record;
-  UINTN                   Match;
-
-  Match         = 0;
-  *SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
-  do {
-    Status = gSmbios->GetNext (gSmbios, SmbiosHandle, &Type, &Record, NULL);
-    if (!EFI_ERROR (Status)) {
-      if (Match == Instance) {
-        return (SMBIOS_STRUCTURE *)Record;
-      }
-      Match++;
-    }
-  } while (!EFI_ERROR (Status));
-
-  return NULL;
-}
-
-
-/**
-  Remove an SMBIOS record.
-  
-  This function removes an SMBIOS record using the handle specified by SmbiosHandle.
-  
-  @param[in]    SmbiosHandle        The handle of the SMBIOS record to remove.
-  
-  @retval EFI_SUCCESS               SMBIOS record was removed.
-  @retval EFI_INVALID_PARAMETER     SmbiosHandle does not specify a valid SMBIOS record.
-**/
-EFI_STATUS
-EFIAPI
-SmbiosLibRemove (
-  OUT EFI_SMBIOS_HANDLE SmbiosHandle
-  )
-{
-  return gSmbios->Remove (gSmbios, SmbiosHandle);
-}
-
-
-
-/**
-  
-  @param  ImageHandle  ImageHandle of the loaded driver.
-  @param  SystemTable  Pointer to the EFI System Table.
-
-  @retval  EFI_SUCCESS            Register successfully.
-  @retval  EFI_OUT_OF_RESOURCES   No enough memory to register this handler.
-**/
-EFI_STATUS
-EFIAPI
-SmbiosLibConstructor (
-  IN EFI_HANDLE        ImageHandle,
-  IN EFI_SYSTEM_TABLE  *SystemTable
-  )
-{
-  return gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **)&gSmbios);
-}
-
+/** @file
+  Provides library functions for common SMBIOS operations. Only available to DXE
+  and UEFI module types.
+
+
+Copyright (c) 2012, Apple Inc. All rights reserved.
+Portitions Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials are licensed and made available under
+the terms and conditions of the BSD License that accompanies this distribution.
+The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php.
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <PiDxe.h>
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiLib.h>
+#include <Library/SmbiosLib.h>
+
+
+EFI_SMBIOS_PROTOCOL *gSmbios = NULL;
+
+
+/**
+  Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
+  entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
+
+  @param  Template   Array of SMBIOS_TEMPLATE_ENTRY entries.
+
+  @retval EFI_SUCCESS          New SMBIOS tables were created.
+  @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.
+**/
+EFI_STATUS
+EFIAPI
+SmbiosLibInitializeFromTemplate (
+  IN  SMBIOS_TEMPLATE_ENTRY   *Template
+  )
+{
+  EFI_STATUS    Status;
+  UINTN         Index;
+
+  if (Template == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Status = EFI_SUCCESS;
+
+  for (Index = 0; Template[Index].Entry != NULL; Index++) {
+    Status = SmbiosLibCreateEntry (Template[Index].Entry, Template[Index].StringArray);
+  }
+
+  return Status;
+}
+
+
+
+/**
+  Create SMBIOS record.
+
+  Converts a fixed SMBIOS structure and an array of pointers to strings into
+  an SMBIOS record where the strings are cat'ed on the end of the fixed record
+  and terminated via a double NULL and add to SMBIOS table.
+
+  SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
+    { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof (SMBIOS_TABLE_TYPE12), 0 },
+    1 // StringCount
+  };
+  CHAR8 *gSmbiosType12Strings[] = {
+    "Not Found",
+    NULL
+  };
+
+  ...
+  CreateSmbiosEntry (
+    (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
+    gSmbiosType12Strings
+    );
+
+  @param  SmbiosEntry   Fixed SMBIOS structure
+  @param  StringArray   Array of strings to convert to an SMBIOS string pack.
+                        NULL is OK.
+
+**/
+EFI_STATUS
+EFIAPI
+SmbiosLibCreateEntry (
+  IN  SMBIOS_STRUCTURE *SmbiosEntry,
+  IN  CHAR8            **StringArray
+  )
+{
+  EFI_STATUS                Status;
+  EFI_SMBIOS_HANDLE         SmbiosHandle;
+  EFI_SMBIOS_TABLE_HEADER   *Record;
+  UINTN                     Index;
+  UINTN                     StringSize;
+  UINTN                     Size;
+  CHAR8                     *Str;
+
+  // Calculate the size of the fixed record and optional string pack
+  Size = SmbiosEntry->Length;
+  if (StringArray == NULL) {
+    Size += 2; // Min string section is double null
+  } else if (StringArray[0] == NULL) {
+    Size += 2; // Min string section is double null
+  } else {
+    for (Index = 0; StringArray[Index] != NULL; Index++) {
+      StringSize = AsciiStrSize (StringArray[Index]);
+      Size += StringSize;
+    }
+    // Don't forget the terminating double null
+    Size += 1;
+  }
+
+  // Copy over Template
+  Record = (EFI_SMBIOS_TABLE_HEADER *)AllocateZeroPool (Size);
+  if (Record == NULL) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+  CopyMem (Record, SmbiosEntry, SmbiosEntry->Length);
+
+  if (StringArray != NULL) {
+    // Append string pack
+    Str = ((CHAR8 *)Record) + Record->Length;
+    for (Index = 0; StringArray[Index] != NULL; Index++) {
+      StringSize = AsciiStrSize (StringArray[Index]);
+      CopyMem (Str, StringArray[Index], StringSize);
+      Str += StringSize;
+    }
+    *Str = 0;
+  }
+
+  SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
+  Status = gSmbios->Add (
+                     gSmbios,
+                     gImageHandle,
+                     &SmbiosHandle,
+                     Record
+                     );
+
+  FreePool (Record);
+  return Status;
+}
+
+
+
+/**
+  Update the string associated with an existing SMBIOS record.
+
+  This function allows the update of specific SMBIOS strings. The number of valid strings for any
+  SMBIOS record is defined by how many strings were present when Add() was called.
+
+  @param[in]    SmbiosHandle    SMBIOS Handle of structure that will have its string updated.
+  @param[in]    StringNumber    The non-zero string number of the string to update.
+  @param[in]    String          Update the StringNumber string with String.
+
+  @retval EFI_SUCCESS           SmbiosHandle had its StringNumber String updated.
+  @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
+  @retval EFI_UNSUPPORTED       String was not added because it is longer than the SMBIOS Table supports.
+  @retval EFI_NOT_FOUND         The StringNumber.is not valid for this SMBIOS record.
+**/
+EFI_STATUS
+EFIAPI
+SmbiosLibUpdateString (
+  IN  EFI_SMBIOS_HANDLE     SmbiosHandle,
+  IN  SMBIOS_TABLE_STRING   StringNumber,
+  IN  CHAR8                 *String
+  )
+{
+  UINTN StringIndex;
+
+  if (String == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (*String == '\0') {
+    // A string with no data is not legal in SMBIOS
+    return EFI_INVALID_PARAMETER;
+  }
+
+  StringIndex = StringNumber;
+  return gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex, String);
+}
+
+
+/**
+  Update the string associated with an existing SMBIOS record.
+
+  This function allows the update of specific SMBIOS strings. The number of valid strings for any
+  SMBIOS record is defined by how many strings were present when Add() was called.
+
+  @param[in]    SmbiosHandle    SMBIOS Handle of structure that will have its string updated.
+  @param[in]    StringNumber    The non-zero string number of the string to update.
+  @param[in]    String          Update the StringNumber string with String.
+
+  @retval EFI_SUCCESS           SmbiosHandle had its StringNumber String updated.
+  @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
+  @retval EFI_UNSUPPORTED       String was not added because it is longer than the SMBIOS Table supports.
+  @retval EFI_NOT_FOUND         The StringNumber.is not valid for this SMBIOS record.
+**/
+EFI_STATUS
+EFIAPI
+SmbiosLibUpdateUnicodeString (
+  IN  EFI_SMBIOS_HANDLE     SmbiosHandle,
+  IN  SMBIOS_TABLE_STRING   StringNumber,
+  IN  CHAR16                *String
+  )
+{
+  EFI_STATUS  Status;
+  UINTN       StringIndex;
+  CHAR8       *Ascii;
+
+  if (String == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (*String == '\0') {
+    // A string with no data is not legal in SMBIOS
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Ascii = AllocateZeroPool (StrSize (String));
+  if (Ascii == NULL) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+  UnicodeStrToAsciiStr (String, Ascii);
+
+  StringIndex = StringNumber;
+  Status = gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex, Ascii);
+
+  FreePool (Ascii);
+  return Status;
+}
+
+
+/**
+  Allow caller to read a specific SMBIOS string
+
+  @param[in]    Header          SMBIOS record that contains the string.
+  @param[in[    StringNumber    Instance of SMBIOS string 1 - N.
+
+  @retval NULL                  Instance of Type SMBIOS string was not found.
+  @retval Other                 Pointer to matching SMBIOS string.
+**/
+CHAR8 *
+EFIAPI
+SmbiosLibReadString (
+  IN SMBIOS_STRUCTURE   *Header,
+  IN EFI_SMBIOS_STRING  StringNumber
+  )
+{
+  CHAR8       *Data;
+  UINTN       Match;
+
+  Data = (CHAR8 *)Header + Header->Length;
+  for (Match = 1;!(*Data == 0 && *(Data+1) == 0); ) {
+    if (StringNumber == Match) {
+      return Data;
+    }
+    Data++;
+    if (*(Data - 1) == '\0') {
+      Match++;
+    }
+  }
+
+  return NULL;
+}
+
+
+/**
+  Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
+
+  @param[in]    Type            Type of the next SMBIOS record to return.
+  @param[in[    Instance        Instance of SMBIOS record 0 - N-1.
+  @param[out]   SmbiosHandle    Returns SMBIOS handle for the matching record.
+
+  @retval NULL                  Instance of Type SMBIOS record was not found.
+  @retval Other                 Pointer to matching SMBIOS record.
+**/
+SMBIOS_STRUCTURE *
+EFIAPI
+SmbiosLibGetRecord (
+  IN  EFI_SMBIOS_TYPE   Type,
+  IN  UINTN             Instance,
+  OUT EFI_SMBIOS_HANDLE *SmbiosHandle
+  )
+{
+  EFI_STATUS              Status;
+  EFI_SMBIOS_TABLE_HEADER *Record;
+  UINTN                   Match;
+
+  Match         = 0;
+  *SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
+  do {
+    Status = gSmbios->GetNext (gSmbios, SmbiosHandle, &Type, &Record, NULL);
+    if (!EFI_ERROR (Status)) {
+      if (Match == Instance) {
+        return (SMBIOS_STRUCTURE *)Record;
+      }
+      Match++;
+    }
+  } while (!EFI_ERROR (Status));
+
+  return NULL;
+}
+
+
+/**
+  Remove an SMBIOS record.
+
+  This function removes an SMBIOS record using the handle specified by SmbiosHandle.
+
+  @param[in]    SmbiosHandle        The handle of the SMBIOS record to remove.
+
+  @retval EFI_SUCCESS               SMBIOS record was removed.
+  @retval EFI_INVALID_PARAMETER     SmbiosHandle does not specify a valid SMBIOS record.
+**/
+EFI_STATUS
+EFIAPI
+SmbiosLibRemove (
+  OUT EFI_SMBIOS_HANDLE SmbiosHandle
+  )
+{
+  return gSmbios->Remove (gSmbios, SmbiosHandle);
+}
+
+
+
+/**
+
+  @param  ImageHandle  ImageHandle of the loaded driver.
+  @param  SystemTable  Pointer to the EFI System Table.
+
+  @retval  EFI_SUCCESS            Register successfully.
+  @retval  EFI_OUT_OF_RESOURCES   No enough memory to register this handler.
+**/
+EFI_STATUS
+EFIAPI
+SmbiosLibConstructor (
+  IN EFI_HANDLE        ImageHandle,
+  IN EFI_SYSTEM_TABLE  *SystemTable
+  )
+{
+  return gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **)&gSmbios);
+}
+

+ 47 - 47
EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf

@@ -1,47 +1,47 @@
-## @file
-# SMBIOS Library 
-#
-# Copyright (c) 2012, Apple Inc. All rights reserved. 
-# Portions copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
-#
-#  This program and the accompanying materials
-#  are licensed and made available under the terms and conditions of the BSD License
-#  which accompanies this distribution. The full text of the license may be found at
-#  http://opensource.org/licenses/bsd-license.php
-#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-#
-##
-
-[Defines]
-  INF_VERSION                    = 0x00010005
-  BASE_NAME                      = SmbiosLib
-  FILE_GUID                      = 881863A2-09FD-3E44-8D62-7AE038D03747
-  MODULE_TYPE                    = DXE_DRIVER
-  VERSION_STRING                 = 1.0
-  LIBRARY_CLASS                  = SmbiosLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER SMM_CORE UEFI_APPLICATION UEFI_DRIVER
-
-  CONSTRUCTOR                    = SmbiosLibConstructor
-
-
-[Sources]
-  SmbiosLib.c
-
-[Packages]
-  MdePkg/MdePkg.dec
-  EmulatorPkg/EmulatorPkg.dec
-
-[LibraryClasses]
-  BaseLib
-  BaseMemoryLib
-  DebugLib
-  MemoryAllocationLib
-  UefiBootServicesTableLib
-  UefiLib
-
-[Protocols]
-  gEfiSmbiosProtocolGuid
-
-[Depex]
-  gEfiSmbiosProtocolGuid
+## @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

+ 2 - 2
EmulatorPkg/MiscSubClassPlatformDxe/MiscSubClassDriver.h

@@ -112,8 +112,8 @@ extern EFI_HII_HANDLE               mHiiHandle;
   @param  Smbios                The EFI_SMBIOS_PROTOCOL instance.
   @param  SmbiosHandle          A unique handle will be assigned to the SMBIOS record.
   @param  Record                The data for the fixed portion of the SMBIOS record. The format of the record is
-                                determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted area is defined 
-                                by EFI_SMBIOS_TABLE_HEADER.Length and either followed by a double-null (0x0000) or 
+                                determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted area is defined
+                                by EFI_SMBIOS_TABLE_HEADER.Length and either followed by a double-null (0x0000) or
                                 a set of null terminated strings and a null.
 
   @retval EFI_SUCCESS           Record was added.

+ 2 - 2
EmulatorPkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c

@@ -174,8 +174,8 @@ Returns:
   @param  Smbios                The EFI_SMBIOS_PROTOCOL instance.
   @param  SmbiosHandle          A unique handle will be assigned to the SMBIOS record.
   @param  Record                The data for the fixed portion of the SMBIOS record. The format of the record is
-                                determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted area is defined 
-                                by EFI_SMBIOS_TABLE_HEADER.Length and either followed by a double-null (0x0000) or 
+                                determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted area is defined
+                                by EFI_SMBIOS_TABLE_HEADER.Length and either followed by a double-null (0x0000) or
                                 a set of null terminated strings and a null.
 
   @retval EFI_SUCCESS           Record was added.

+ 9 - 9
EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c

@@ -66,10 +66,10 @@ CreatePlatformSmbiosMemoryRecords (
   while ((HobPtr.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, HobPtr.Raw)) != NULL) {
     if (HobPtr.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) {
       gSmbiosType19Template.ExtendedStartingAddress = HobPtr.ResourceDescriptor->PhysicalStart;
-      gSmbiosType19Template.ExtendedEndingAddress = 
-        HobPtr.ResourceDescriptor->PhysicalStart + 
+      gSmbiosType19Template.ExtendedEndingAddress =
+        HobPtr.ResourceDescriptor->PhysicalStart +
         HobPtr.ResourceDescriptor->ResourceLength - 1;
-      
+
       SmbiosLibCreateEntry ((SMBIOS_STRUCTURE *)&gSmbiosType19Template, NULL);
     }
     HobPtr.Raw = GET_NEXT_HOB (HobPtr);
@@ -97,7 +97,7 @@ PlatfomrSmbiosDriverEntryPoint (
   EFI_SMBIOS_HANDLE           SmbiosHandle;
   SMBIOS_STRUCTURE_POINTER    Smbios;
 
-  // Phase 0 - Patch table to make SMBIOS 2.7 structures smaller to conform 
+  // Phase 0 - Patch table to make SMBIOS 2.7 structures smaller to conform
   //           to an early version of the specification.
 
   // Phase 1 - Initialize SMBIOS tables from template
@@ -112,18 +112,18 @@ PlatfomrSmbiosDriverEntryPoint (
     Smbios.Type0->BiosSize = (UINT8)DivU64x32 (FixedPcdGet64 (PcdEmuFirmwareFdSize), 64*1024) - 1;
 
     SmbiosLibUpdateUnicodeString (
-      SmbiosHandle, 
-      Smbios.Type0->BiosVersion, 
+      SmbiosHandle,
+      Smbios.Type0->BiosVersion,
       (CHAR16 *) PcdGetPtr (PcdFirmwareVersionString)
       );
     SmbiosLibUpdateUnicodeString (
-      SmbiosHandle, 
-      Smbios.Type0->BiosReleaseDate, 
+      SmbiosHandle,
+      Smbios.Type0->BiosReleaseDate,
       (CHAR16 *) PcdGetPtr (PcdFirmwareReleaseDateString)
       );
   }
 
-  // Phase 3 - Create tables from scratch 
+  // Phase 3 - Create tables from scratch
 
   // Create Type 13 record from EFI Variables
   // Do we need this record for EFI as the info is available from EFI varaibles

+ 2 - 2
EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.inf

@@ -1,7 +1,7 @@
 ## @file
 # Platform SMBIOS driver that fills in SMBIOS table entries.
 #
-# Copyright (c) 2012, Apple Inc. All rights reserved. 
+# Copyright (c) 2012, Apple Inc. All rights reserved.
 # Portions copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
 #
 #  This program and the accompanying materials
@@ -52,4 +52,4 @@
   gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareFdSize
 
 [Depex]
-  TRUE
+  TRUE

+ 13 - 13
EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c

@@ -8,7 +8,7 @@
     Processor Information (Type 4) - CPU Driver
     Cache Information (Type 7) - For cache that is external to processor
     System Slots (Type 9) - If system has slots
-    Physical Memory Array (Type 16) 
+    Physical Memory Array (Type 16)
     Memory Device (Type 17) - For each socketed system-memory Device
     Memory Array Mapped Address (Type 19) - One per contiguous block per Physical Memroy Array
     System Boot Information (Type 32)
@@ -69,9 +69,9 @@ SMBIOS_TABLE_TYPE0 gSmbiosType0Template = {
     0,    //  PrinterIsSupported                :1;
     0,    //  CgaMonoIsSupported                :1;
     0,    //  NecPc98                           :1;
-    0     //  ReservedForVendor                 :32; ///< Bits 32-63. Bits 32-47 reserved for BIOS vendor 
-                                                 ///< and bits 48-63 reserved for System Vendor. 
-  },           
+    0     //  ReservedForVendor                 :32; ///< Bits 32-63. Bits 32-47 reserved for BIOS vendor
+                                                 ///< and bits 48-63 reserved for System Vendor.
+  },
   {       // BIOSCharacteristicsExtensionBytes[]
     0x81, //  AcpiIsSupported                   :1;
           //  UsbLegacyIsSupported              :1;
@@ -108,7 +108,7 @@ SMBIOS_TABLE_TYPE1 gSmbiosType1Template = {
   3,    // Version String
   4,    // SerialNumber String
   { 0x25EF0280, 0xEC82, 0x42B0, { 0x8F, 0xB6, 0x10, 0xAD, 0xCC, 0xC6, 0x7C, 0x02 } },
-  SystemWakeupTypePowerSwitch,  
+  SystemWakeupTypePowerSwitch,
   5,    // SKUNumber String
   6,    // Family String
 };
@@ -119,7 +119,7 @@ CHAR8  *gSmbiosType1Strings[] = {
   "System Serial#",
   "System SKU#",
   "edk2",
-  NULL 
+  NULL
 };
 
 SMBIOS_TABLE_TYPE2  gSmbiosType2Template = {
@@ -139,7 +139,7 @@ SMBIOS_TABLE_TYPE2  gSmbiosType2Template = {
   },
   6,    // LocationInChassis String
   0,                        // ChassisHandle;
-  BaseBoardTypeMotherBoard, // BoardType;            
+  BaseBoardTypeMotherBoard, // BoardType;
   0,                        // NumberOfContainedObjectHandles;
   { 0 }                     // ContainedObjectHandles[1];
 };
@@ -150,7 +150,7 @@ CHAR8  *gSmbiosType2Strings[] = {
   "Base Board Serial#",
   "Base Board Asset Tag#",
   "Part Component",
-  NULL  
+  NULL
 };
 
 SMBIOS_TABLE_TYPE3  gSmbiosType3Template = {
@@ -160,10 +160,10 @@ SMBIOS_TABLE_TYPE3  gSmbiosType3Template = {
   2,                        // Version String
   3,                        // SerialNumber String
   4,                        // AssetTag String
-  ChassisStateSafe,         // BootupState;           
-  ChassisStateSafe,         // PowerSupplyState;       
-  ChassisStateSafe,         // ThermalState;           
-  ChassisSecurityStatusNone,// SecurityStatus;         
+  ChassisStateSafe,         // BootupState;
+  ChassisStateSafe,         // PowerSupplyState;
+  ChassisStateSafe,         // ThermalState;
+  ChassisSecurityStatusNone,// SecurityStatus;
   { 0, 0, 0, 0 },           // OemDefined[4];
   0,    // Height;
   0,    // NumberofPowerCords;
@@ -176,7 +176,7 @@ CHAR8  *gSmbiosType3Strings[] = {
   "EmulatorPkg",
   "Chassis Board Serial#",
   "Chassis Board Asset Tag#",
-  NULL  
+  NULL
 };
 
 SMBIOS_TABLE_TYPE8  gSmbiosType8Template1 = {

+ 13 - 13
EmulatorPkg/Sec/Ia32/SwitchRam.asm

@@ -22,7 +22,7 @@
     .586p
     .model  flat,C
     .code
-    
+
 ;------------------------------------------------------------------------------
 ; VOID
 ; EFIAPI
@@ -30,7 +30,7 @@
 ;   UINT32   TemporaryMemoryBase,
 ;   UINT32   PermenentMemoryBase
 ;   );
-;------------------------------------------------------------------------------    
+;------------------------------------------------------------------------------
 SecSwitchStack   PROC
     ;
     ; Save three register: eax, ebx, ecx
@@ -39,16 +39,16 @@ SecSwitchStack   PROC
     push  ebx
     push  ecx
     push  edx
-    
+
     ;
     ; !!CAUTION!! this function address's is pushed into stack after
     ; migration of whole temporary memory, so need save it to permenent
     ; memory at first!
     ;
-    
+
     mov   ebx, [esp + 20]          ; Save the first parameter
     mov   ecx, [esp + 24]          ; Save the second parameter
-    
+
     ;
     ; Save this function's return address into permenent memory at first.
     ; Then, Fixup the esp point to permenent memory
@@ -57,17 +57,17 @@ SecSwitchStack   PROC
     sub   eax, ebx
     add   eax, ecx
     mov   edx, dword ptr [esp]         ; copy pushed register's value to permenent memory
-    mov   dword ptr [eax], edx    
+    mov   dword ptr [eax], edx
     mov   edx, dword ptr [esp + 4]
-    mov   dword ptr [eax + 4], edx    
+    mov   dword ptr [eax + 4], edx
     mov   edx, dword ptr [esp + 8]
-    mov   dword ptr [eax + 8], edx    
+    mov   dword ptr [eax + 8], edx
     mov   edx, dword ptr [esp + 12]
-    mov   dword ptr [eax + 12], edx    
+    mov   dword ptr [eax + 12], edx
     mov   edx, dword ptr [esp + 16]    ; Update this function's return address into permenent memory
-    mov   dword ptr [eax + 16], edx    
+    mov   dword ptr [eax + 16], edx
     mov   esp, eax                     ; From now, esp is pointed to permenent memory
-        
+
     ;
     ; Fixup the ebp point to permenent memory
     ;
@@ -75,7 +75,7 @@ SecSwitchStack   PROC
     sub   eax, ebx
     add   eax, ecx
     mov   ebp, eax                ; From now, ebp is pointed to permenent memory
-    
+
     ;
     ; Fixup callee's ebp point for PeiDispatch
     ;
@@ -83,7 +83,7 @@ SecSwitchStack   PROC
     sub   eax, ebx
     add   eax, ecx
     mov   dword ptr [ebp], eax    ; From now, Temporary's PPI caller's stack is in permenent memory
-    
+
     pop   edx
     pop   ecx
     pop   ebx

+ 149 - 149
EmulatorPkg/Sec/Sec.c

@@ -1,149 +1,149 @@
-/*++ @file
-  Stub SEC that is called from the OS appliation that is the root of the emulator.
-
-  The OS application will call the SEC with the PEI Entry Point API.
-
-Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution.  The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include "Sec.h"
-
-
-
-EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {
-  SecTemporaryRamSupport
-};
-
-
-EFI_PEI_PPI_DESCRIPTOR  gPrivateDispatchTable[] = {
-  {
-    EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
-    &gEfiTemporaryRamSupportPpiGuid,
-    &mSecTemporaryRamSupportPpi
-  }
-};
-
-
-
-/**
-  The entry point of PE/COFF Image for the PEI Core, that has been hijacked by this
-  SEC that sits on top of an OS application. So the entry and exit of this module
-  has the same API.
-
-  This function is the entry point for the PEI Foundation, which allows the SEC phase
-  to pass information about the stack, temporary RAM and the Boot Firmware Volume.
-  In addition, it also allows the SEC phase to pass services and data forward for use
-  during the PEI phase in the form of one or more PPIs.
-  There is no limit to the number of additional PPIs that can be passed from SEC into
-  the PEI Foundation. As part of its initialization phase, the PEI Foundation will add
-  these SEC-hosted PPIs to its PPI database such that both the PEI Foundation and any
-  modules can leverage the associated service calls and/or code in these early PPIs.
-  This function is required to call ProcessModuleEntryPointList() with the Context
-  parameter set to NULL.  ProcessModuleEntryPoint() is never expected to return.
-  The PEI Core is responsible for calling ProcessLibraryConstructorList() as soon as
-  the PEI Services Table and the file handle for the PEI Core itself have been established.
-  If ProcessModuleEntryPointList() returns, then ASSERT() and halt the system.
-
-  @param SecCoreData  Points to a data structure containing information about the PEI
-                      core's operating environment, such as the size and location of
-                      temporary RAM, the stack location and the BFV location.
-
-  @param PpiList      Points to a list of one or more PPI descriptors to be installed
-                      initially by the PEI core. An empty PPI list consists of a single
-                      descriptor with the end-tag EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST.
-                      As part of its initialization phase, the PEI Foundation will add
-                      these SEC-hosted PPIs to its PPI database such that both the PEI
-                      Foundation and any modules can leverage the associated service calls
-                      and/or code in these early PPIs.
-
-**/
-VOID
-EFIAPI
-_ModuleEntryPoint (
-  IN EFI_SEC_PEI_HAND_OFF   *SecCoreData,
-  IN EFI_PEI_PPI_DESCRIPTOR *PpiList
-  )
-{
-  EFI_STATUS                Status;
-  EFI_PEI_FV_HANDLE         VolumeHandle;
-  EFI_PEI_FILE_HANDLE       FileHandle;
-  VOID                      *PeCoffImage;
-  EFI_PEI_CORE_ENTRY_POINT  EntryPoint;
-  EFI_PEI_PPI_DESCRIPTOR    *Ppi;
-  EFI_PEI_PPI_DESCRIPTOR    *SecPpiList;
-  UINTN                     SecReseveredMemorySize;
-  UINTN                     Index;
-
-  EMU_MAGIC_PAGE()->PpiList = PpiList;
-  ProcessLibraryConstructorList ();
-
-  DEBUG ((EFI_D_ERROR, "SEC Has Started\n"));
-
-  //
-  // Add Our PPIs to the list
-  //
-  SecReseveredMemorySize = sizeof (gPrivateDispatchTable);
-  for (Ppi = PpiList, Index = 1; ; Ppi++, Index++) {
-    SecReseveredMemorySize += sizeof (EFI_PEI_PPI_DESCRIPTOR);
-
-    if ((Ppi->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) == EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) {
-      // Since we are appending, need to clear out privious list terminator.
-      Ppi->Flags &= ~EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
-      break;
-    }
-  }
-
-  // Keep everything on a good alignment
-  SecReseveredMemorySize = ALIGN_VALUE (SecReseveredMemorySize, CPU_STACK_ALIGNMENT);
-
-#if 0
-  // Tell the PEI Core to not use our buffer in temp RAM
-  SecPpiList = (EFI_PEI_PPI_DESCRIPTOR *)SecCoreData->PeiTemporaryRamBase;
-  SecCoreData->PeiTemporaryRamBase = (VOID *)((UINTN)SecCoreData->PeiTemporaryRamBase + SecReseveredMemorySize);
-  SecCoreData->PeiTemporaryRamSize -= SecReseveredMemorySize;
-#else
-  {
-    //
-    // When I subtrack from SecCoreData->PeiTemporaryRamBase PEI Core crashes? Either there is a bug
-    // or I don't understand temp RAM correctly?
-    //
-    EFI_PEI_PPI_DESCRIPTOR    PpiArray[10];
-
-    SecPpiList = &PpiArray[0];
-    ASSERT (sizeof (PpiArray) >= SecReseveredMemorySize);
-  }
-#endif
-  // Copy existing list, and append our entries.
-  CopyMem (SecPpiList, PpiList, sizeof (EFI_PEI_PPI_DESCRIPTOR) * Index);
-  CopyMem (&SecPpiList[Index], gPrivateDispatchTable, sizeof (gPrivateDispatchTable));
-
-  // Find PEI Core and transfer control
-  VolumeHandle = (EFI_PEI_FV_HANDLE)(UINTN)SecCoreData->BootFirmwareVolumeBase;
-  FileHandle   = NULL;
-  Status = PeiServicesFfsFindNextFile (EFI_FV_FILETYPE_PEI_CORE, VolumeHandle, &FileHandle);
-  ASSERT_EFI_ERROR (Status);
-
-  Status = PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle, &PeCoffImage);
-  ASSERT_EFI_ERROR (Status);
-
-  Status = PeCoffLoaderGetEntryPoint (PeCoffImage, (VOID **)&EntryPoint);
-  ASSERT_EFI_ERROR (Status);
-
-  // Transfer control to PEI Core
-  EntryPoint (SecCoreData, SecPpiList);
-
-  // PEI Core never returns
-  ASSERT (FALSE);
-  return;
-}
-
-
-
+/*++ @file
+  Stub SEC that is called from the OS appliation that is the root of the emulator.
+
+  The OS application will call the SEC with the PEI Entry Point API.
+
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include "Sec.h"
+
+
+
+EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {
+  SecTemporaryRamSupport
+};
+
+
+EFI_PEI_PPI_DESCRIPTOR  gPrivateDispatchTable[] = {
+  {
+    EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
+    &gEfiTemporaryRamSupportPpiGuid,
+    &mSecTemporaryRamSupportPpi
+  }
+};
+
+
+
+/**
+  The entry point of PE/COFF Image for the PEI Core, that has been hijacked by this
+  SEC that sits on top of an OS application. So the entry and exit of this module
+  has the same API.
+
+  This function is the entry point for the PEI Foundation, which allows the SEC phase
+  to pass information about the stack, temporary RAM and the Boot Firmware Volume.
+  In addition, it also allows the SEC phase to pass services and data forward for use
+  during the PEI phase in the form of one or more PPIs.
+  There is no limit to the number of additional PPIs that can be passed from SEC into
+  the PEI Foundation. As part of its initialization phase, the PEI Foundation will add
+  these SEC-hosted PPIs to its PPI database such that both the PEI Foundation and any
+  modules can leverage the associated service calls and/or code in these early PPIs.
+  This function is required to call ProcessModuleEntryPointList() with the Context
+  parameter set to NULL.  ProcessModuleEntryPoint() is never expected to return.
+  The PEI Core is responsible for calling ProcessLibraryConstructorList() as soon as
+  the PEI Services Table and the file handle for the PEI Core itself have been established.
+  If ProcessModuleEntryPointList() returns, then ASSERT() and halt the system.
+
+  @param SecCoreData  Points to a data structure containing information about the PEI
+                      core's operating environment, such as the size and location of
+                      temporary RAM, the stack location and the BFV location.
+
+  @param PpiList      Points to a list of one or more PPI descriptors to be installed
+                      initially by the PEI core. An empty PPI list consists of a single
+                      descriptor with the end-tag EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST.
+                      As part of its initialization phase, the PEI Foundation will add
+                      these SEC-hosted PPIs to its PPI database such that both the PEI
+                      Foundation and any modules can leverage the associated service calls
+                      and/or code in these early PPIs.
+
+**/
+VOID
+EFIAPI
+_ModuleEntryPoint (
+  IN EFI_SEC_PEI_HAND_OFF   *SecCoreData,
+  IN EFI_PEI_PPI_DESCRIPTOR *PpiList
+  )
+{
+  EFI_STATUS                Status;
+  EFI_PEI_FV_HANDLE         VolumeHandle;
+  EFI_PEI_FILE_HANDLE       FileHandle;
+  VOID                      *PeCoffImage;
+  EFI_PEI_CORE_ENTRY_POINT  EntryPoint;
+  EFI_PEI_PPI_DESCRIPTOR    *Ppi;
+  EFI_PEI_PPI_DESCRIPTOR    *SecPpiList;
+  UINTN                     SecReseveredMemorySize;
+  UINTN                     Index;
+
+  EMU_MAGIC_PAGE()->PpiList = PpiList;
+  ProcessLibraryConstructorList ();
+
+  DEBUG ((EFI_D_ERROR, "SEC Has Started\n"));
+
+  //
+  // Add Our PPIs to the list
+  //
+  SecReseveredMemorySize = sizeof (gPrivateDispatchTable);
+  for (Ppi = PpiList, Index = 1; ; Ppi++, Index++) {
+    SecReseveredMemorySize += sizeof (EFI_PEI_PPI_DESCRIPTOR);
+
+    if ((Ppi->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) == EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) {
+      // Since we are appending, need to clear out privious list terminator.
+      Ppi->Flags &= ~EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
+      break;
+    }
+  }
+
+  // Keep everything on a good alignment
+  SecReseveredMemorySize = ALIGN_VALUE (SecReseveredMemorySize, CPU_STACK_ALIGNMENT);
+
+#if 0
+  // Tell the PEI Core to not use our buffer in temp RAM
+  SecPpiList = (EFI_PEI_PPI_DESCRIPTOR *)SecCoreData->PeiTemporaryRamBase;
+  SecCoreData->PeiTemporaryRamBase = (VOID *)((UINTN)SecCoreData->PeiTemporaryRamBase + SecReseveredMemorySize);
+  SecCoreData->PeiTemporaryRamSize -= SecReseveredMemorySize;
+#else
+  {
+    //
+    // When I subtrack from SecCoreData->PeiTemporaryRamBase PEI Core crashes? Either there is a bug
+    // or I don't understand temp RAM correctly?
+    //
+    EFI_PEI_PPI_DESCRIPTOR    PpiArray[10];
+
+    SecPpiList = &PpiArray[0];
+    ASSERT (sizeof (PpiArray) >= SecReseveredMemorySize);
+  }
+#endif
+  // Copy existing list, and append our entries.
+  CopyMem (SecPpiList, PpiList, sizeof (EFI_PEI_PPI_DESCRIPTOR) * Index);
+  CopyMem (&SecPpiList[Index], gPrivateDispatchTable, sizeof (gPrivateDispatchTable));
+
+  // Find PEI Core and transfer control
+  VolumeHandle = (EFI_PEI_FV_HANDLE)(UINTN)SecCoreData->BootFirmwareVolumeBase;
+  FileHandle   = NULL;
+  Status = PeiServicesFfsFindNextFile (EFI_FV_FILETYPE_PEI_CORE, VolumeHandle, &FileHandle);
+  ASSERT_EFI_ERROR (Status);
+
+  Status = PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle, &PeCoffImage);
+  ASSERT_EFI_ERROR (Status);
+
+  Status = PeCoffLoaderGetEntryPoint (PeCoffImage, (VOID **)&EntryPoint);
+  ASSERT_EFI_ERROR (Status);
+
+  // Transfer control to PEI Core
+  EntryPoint (SecCoreData, SecPpiList);
+
+  // PEI Core never returns
+  ASSERT (FALSE);
+  return;
+}
+
+
+

+ 51 - 51
EmulatorPkg/Sec/Sec.h

@@ -1,51 +1,51 @@
-/*++ @file
-  Stub SEC that is called from the OS appliation that is the root of the emulator.
-
-  The OS application will call the SEC with the PEI Entry Point API.
-
-Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution.  The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef __SEC_H___
-#define __SEC_H___
-
-
-#include <PiPei.h>
-#include <Library/EmuMagicPageLib.h>
-#include <Library/DebugLib.h>
-#include <Library/PeiServicesLib.h>
-#include <Library/PeCoffGetEntryPointLib.h>
-#include <Library/BaseMemoryLib.h>
-
-#include <Ppi/TemporaryRamSupport.h>
-
-
-//
-// I think this shold be defined in a MdePkg include file?
-//
-VOID
-EFIAPI
-ProcessLibraryConstructorList (
-  VOID
-  );
-
-EFI_STATUS
-EFIAPI
-SecTemporaryRamSupport (
-  IN CONST EFI_PEI_SERVICES   **PeiServices,
-  IN EFI_PHYSICAL_ADDRESS     TemporaryMemoryBase,
-  IN EFI_PHYSICAL_ADDRESS     PermanentMemoryBase,
-  IN UINTN                    CopySize
-  );
-
-
-#endif
-
+/*++ @file
+  Stub SEC that is called from the OS appliation that is the root of the emulator.
+
+  The OS application will call the SEC with the PEI Entry Point API.
+
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __SEC_H___
+#define __SEC_H___
+
+
+#include <PiPei.h>
+#include <Library/EmuMagicPageLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PeiServicesLib.h>
+#include <Library/PeCoffGetEntryPointLib.h>
+#include <Library/BaseMemoryLib.h>
+
+#include <Ppi/TemporaryRamSupport.h>
+
+
+//
+// I think this shold be defined in a MdePkg include file?
+//
+VOID
+EFIAPI
+ProcessLibraryConstructorList (
+  VOID
+  );
+
+EFI_STATUS
+EFIAPI
+SecTemporaryRamSupport (
+  IN CONST EFI_PEI_SERVICES   **PeiServices,
+  IN EFI_PHYSICAL_ADDRESS     TemporaryMemoryBase,
+  IN EFI_PHYSICAL_ADDRESS     PermanentMemoryBase,
+  IN UINTN                    CopySize
+  );
+
+
+#endif
+

+ 39 - 39
EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c

@@ -47,8 +47,8 @@ typedef struct {
   VOID                        *CurrentReadPointer;
   VOID                        *EndReadPointer;
 
-	UINT32									    ReceivedPackets;
-	UINT32									    DroppedPackets;
+  UINT32                      ReceivedPackets;
+  UINT32                      DroppedPackets;
 
 } EMU_SNP_PRIVATE;
 
@@ -200,8 +200,8 @@ EmuSnpStart (
   struct ifreq       BoundIf;
   struct bpf_program BpfProgram;
   struct bpf_insn    *FilterProgram;
-	u_int							 Value;
-	u_int  						 ReadBufferSize;
+  u_int               Value;
+  u_int               ReadBufferSize;
   UINT16             Temp16;
   UINT32             Temp32;
 
@@ -229,23 +229,23 @@ EmuSnpStart (
     }
 
     //
-		// Get the read buffer size.
-		//
-		if (ioctl (Private->BpfFd, BIOCGBLEN, &ReadBufferSize) < 0) {
-			goto DeviceErrorExit;
-		}
-
-		//
-		// Default value from BIOCGBLEN is usually too small, so use a much larger size, if necessary.
-		//
-		if (ReadBufferSize < FixedPcdGet32 (PcdNetworkPacketFilterSize)) {
-			ReadBufferSize = FixedPcdGet32 (PcdNetworkPacketFilterSize);
-			if (ioctl (Private->BpfFd, BIOCSBLEN, &ReadBufferSize) < 0) {
-				goto DeviceErrorExit;
-			}
-		}
-
-		//
+    // Get the read buffer size.
+    //
+    if (ioctl (Private->BpfFd, BIOCGBLEN, &ReadBufferSize) < 0) {
+      goto DeviceErrorExit;
+    }
+
+    //
+    // Default value from BIOCGBLEN is usually too small, so use a much larger size, if necessary.
+    //
+    if (ReadBufferSize < FixedPcdGet32 (PcdNetworkPacketFilterSize)) {
+      ReadBufferSize = FixedPcdGet32 (PcdNetworkPacketFilterSize);
+      if (ioctl (Private->BpfFd, BIOCSBLEN, &ReadBufferSize) < 0) {
+        goto DeviceErrorExit;
+      }
+    }
+
+    //
     // Associate our interface with this BPF file descriptor.
     //
     AsciiStrCpy (BoundIf.ifr_name, Private->InterfaceName);
@@ -254,7 +254,7 @@ EmuSnpStart (
     }
 
     //
-		// Enable immediate mode.
+    // Enable immediate mode.
     //
     Value = 1;
     if (ioctl (Private->BpfFd, BIOCIMMEDIATE, &Value) < 0) {
@@ -286,8 +286,8 @@ EmuSnpStart (
     //
     // Allocate read buffer.
     //
-		Private->ReadBufferSize = ReadBufferSize;
-		Private->ReadBuffer = malloc (Private->ReadBufferSize);
+    Private->ReadBufferSize = ReadBufferSize;
+    Private->ReadBuffer = malloc (Private->ReadBufferSize);
     if (Private->ReadBuffer == NULL) {
       goto ErrorExit;
     }
@@ -295,7 +295,7 @@ EmuSnpStart (
     Private->CurrentReadPointer = Private->EndReadPointer = Private->ReadBuffer;
 
     //
-		// Install our packet filter: successful reads should only produce broadcast or unicast
+    // Install our packet filter: successful reads should only produce broadcast or unicast
     // packets directed to our fake MAC address.
     //
     FilterProgram = malloc (sizeof (mFilterInstructionTemplate)) ;
@@ -906,7 +906,7 @@ EmuSnpReceive (
 {
   EMU_SNP_PRIVATE    *Private;
   struct bpf_hdr     *BpfHeader;
-	struct bpf_stat	   BpfStats;
+  struct bpf_stat     BpfStats;
   ETHERNET_HEADER    *EnetHeader;
   ssize_t            Result;
 
@@ -916,19 +916,19 @@ EmuSnpReceive (
     return EFI_NOT_STARTED;
   }
 
-	ZeroMem (&BpfStats, sizeof( BpfStats));
+  ZeroMem (&BpfStats, sizeof( BpfStats));
 
-	if (ioctl (Private->BpfFd, BIOCGSTATS, &BpfStats) == 0) {
-		Private->ReceivedPackets += BpfStats.bs_recv;
-		if (BpfStats.bs_drop > Private->DroppedPackets) {
-			printf (
-			  "SNP: STATS: RCVD = %d DROPPED = %d.  Probably need to increase BPF PcdNetworkPacketFilterSize?\n",
-				BpfStats.bs_recv,
-				BpfStats.bs_drop - Private->DroppedPackets
-				);
-			Private->DroppedPackets = BpfStats.bs_drop;
-		}
-	}
+  if (ioctl (Private->BpfFd, BIOCGSTATS, &BpfStats) == 0) {
+    Private->ReceivedPackets += BpfStats.bs_recv;
+    if (BpfStats.bs_drop > Private->DroppedPackets) {
+      printf (
+        "SNP: STATS: RCVD = %d DROPPED = %d.  Probably need to increase BPF PcdNetworkPacketFilterSize?\n",
+        BpfStats.bs_recv,
+        BpfStats.bs_drop - Private->DroppedPackets
+        );
+      Private->DroppedPackets = BpfStats.bs_drop;
+    }
+  }
 
   //
   // Do we have any remaining packets from the previous read?
@@ -1004,7 +1004,7 @@ GetInterfaceMacAddr (
   EMU_SNP_PRIVATE    *Private
   )
 {
-	EFI_STATUS				  Status;
+  EFI_STATUS          Status;
   struct ifaddrs      *IfAddrs;
   struct ifaddrs      *If;
   struct sockaddr_dl  *IfSdl;

+ 1 - 1
EmulatorPkg/Unix/Host/BlockIo.c

@@ -347,7 +347,7 @@ EmuBlockIoReadWriteCommon (
   @param[in]       MediaId    Id of the media, changes every time the media is
                               replaced.
   @param[in]       Lba        The starting Logical Block Address to read from.
-  @param[in, out]  Token	    A pointer to the token associated with the transaction.
+  @param[in, out]  Token      A pointer to the token associated with the transaction.
   @param[in]       BufferSize Size of Buffer, must be a multiple of device block size.
   @param[out]      Buffer     A pointer to the destination buffer for the data. The
                               caller is responsible for either having implicit or

+ 440 - 440
EmulatorPkg/Unix/Host/EmuThunk.c

@@ -1,440 +1,440 @@
-/*++ @file
-  Since the SEC is the only program in our emulation we
-  must use a UEFI/PI mechanism to export APIs to other modules.
-  This is the role of the EFI_EMU_THUNK_PROTOCOL.
-
-  The mUnixThunkTable exists so that a change to EFI_EMU_THUNK_PROTOCOL
-  will cause an error in initializing the array if all the member functions
-  are not added. It looks like adding a element to end and not initializing
-  it may cause the table to be initaliized with the members at the end being
-  set to zero. This is bad as jumping to zero will crash.
-
-Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR>
-Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution.  The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include "Host.h"
-
-#ifdef __APPLE__
-#define DebugAssert _Mangle__DebugAssert
-
-#include <assert.h>
-#include <CoreServices/CoreServices.h>
-#include <mach/mach.h>
-#include <mach/mach_time.h>
-
-#undef DebugAssert
-#endif
-
-int settimer_initialized;
-struct timeval settimer_timeval;
-void (*settimer_callback)(UINT64 delta);
-
-BOOLEAN gEmulatorInterruptEnabled = FALSE;
-
-
-UINTN
-SecWriteStdErr (
-  IN UINT8     *Buffer,
-  IN UINTN     NumberOfBytes
-  )
-{
-  ssize_t Return;
-
-  Return = write (STDERR_FILENO, (const void *)Buffer, (size_t)NumberOfBytes);
-
-  return (Return == -1) ? 0 : Return;
-}
-
-
-EFI_STATUS
-SecConfigStdIn (
-  VOID
-  )
-{
-  struct termios tty;
-
-  //
-  // Need to turn off line buffering, ECHO, and make it unbuffered.
-  //
-  tcgetattr (STDIN_FILENO, &tty);
-  tty.c_lflag &= ~(ICANON | ECHO);
-  tcsetattr (STDIN_FILENO, TCSANOW, &tty);
-
-//  setvbuf (STDIN_FILENO, NULL, _IONBF, 0);
-
-  // now ioctl FIONREAD will do what we need
-  return EFI_SUCCESS;
-}
-
-UINTN
-SecWriteStdOut (
-  IN UINT8     *Buffer,
-  IN UINTN     NumberOfBytes
-  )
-{
-  ssize_t Return;
-
-  Return = write (STDOUT_FILENO, (const void *)Buffer, (size_t)NumberOfBytes);
-
-  return (Return == -1) ? 0 : Return;
-}
-
-UINTN
-SecReadStdIn (
-  IN UINT8     *Buffer,
-  IN UINTN     NumberOfBytes
-  )
-{
-  ssize_t Return;
-
-  Return = read (STDIN_FILENO, Buffer, (size_t)NumberOfBytes);
-
-  return (Return == -1) ? 0 : Return;
-}
-
-BOOLEAN
-SecPollStdIn (
-  VOID
-  )
-{
-  int Result;
-  int Bytes;
-
-  Result = ioctl (STDIN_FILENO, FIONREAD, &Bytes);
-  if (Result == -1) {
-    return FALSE;
-  }
-
-  return (BOOLEAN)(Bytes > 0);
-}
-
-
-VOID *
-SecMalloc (
-  IN  UINTN Size
-  )
-{
-  return malloc ((size_t)Size);
-}
-
-VOID *
-SecValloc (
-  IN  UINTN Size
-  )
-{
-  return valloc ((size_t)Size);
-}
-
-BOOLEAN
-SecFree (
-  IN  VOID *Ptr
-  )
-{
-  if (EfiSystemMemoryRange (Ptr)) {
-    // If an address range is in the EFI memory map it was alloced via EFI.
-    // So don't free those ranges and let the caller know.
-    return FALSE;
-  }
-
-  free (Ptr);
-  return TRUE;
-}
-
-
-void
-settimer_handler (int sig)
-{
-  struct timeval timeval;
-  UINT64 delta;
-
-  gettimeofday (&timeval, NULL);
-  delta = ((UINT64)timeval.tv_sec * 1000) + (timeval.tv_usec / 1000)
-    - ((UINT64)settimer_timeval.tv_sec * 1000)
-    - (settimer_timeval.tv_usec / 1000);
-  settimer_timeval = timeval;
-
-  if (settimer_callback) {
-    ReverseGasketUint64 (settimer_callback, delta);
-  }
-}
-
-VOID
-SecSetTimer (
-  IN  UINT64                  PeriodMs,
-  IN  EMU_SET_TIMER_CALLBACK  CallBack
-  )
-{
-  struct itimerval timerval;
-  UINT32 remainder;
-
-  if (!settimer_initialized) {
-    struct sigaction act;
-
-    settimer_initialized = 1;
-    act.sa_handler = settimer_handler;
-    act.sa_flags = 0;
-    sigemptyset (&act.sa_mask);
-    gEmulatorInterruptEnabled = TRUE;
-    if (sigaction (SIGALRM, &act, NULL) != 0) {
-      printf ("SetTimer: sigaction error %s\n", strerror (errno));
-    }
-    if (gettimeofday (&settimer_timeval, NULL) != 0) {
-      printf ("SetTimer: gettimeofday error %s\n", strerror (errno));
-    }
-  }
-  timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);
-  DivU64x32Remainder(PeriodMs, 1000, &remainder);
-  timerval.it_value.tv_usec = remainder * 1000;
-  timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);
-  timerval.it_interval = timerval.it_value;
-
-  if (setitimer (ITIMER_REAL, &timerval, NULL) != 0) {
-    printf ("SetTimer: setitimer error %s\n", strerror (errno));
-  }
-  settimer_callback = CallBack;
-}
-
-
-VOID
-SecEnableInterrupt (
-  VOID
-  )
-{
-  sigset_t  sigset;
-
-  gEmulatorInterruptEnabled = TRUE;
-  // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
-  // by enabling/disabling SIGALRM.
-  sigemptyset (&sigset);
-  sigaddset (&sigset, SIGALRM);
-  pthread_sigmask (SIG_UNBLOCK, &sigset, NULL);
-}
-
-
-VOID
-SecDisableInterrupt (
-  VOID
-  )
-{
-  sigset_t  sigset;
-
-  // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
-  // by enabling/disabling SIGALRM.
-  sigemptyset (&sigset);
-  sigaddset (&sigset, SIGALRM);
-  pthread_sigmask (SIG_BLOCK, &sigset, NULL);
-  gEmulatorInterruptEnabled = FALSE;
-}
-
-
-BOOLEAN
-SecInterruptEanbled (void)
-{
-  return gEmulatorInterruptEnabled;
-}
-
-
-UINT64
-QueryPerformanceFrequency (
-  VOID
-  )
-{
-  // Hard code to nanoseconds
-  return 1000000000ULL;
-}
-
-UINT64
-QueryPerformanceCounter (
-  VOID
-  )
-{
-#if __APPLE__
-  UINT64          Start;
-  static mach_timebase_info_data_t    sTimebaseInfo;
-
-
-  Start = mach_absolute_time ();
-
-  // Convert to nanoseconds.
-
-  // If this is the first time we've run, get the timebase.
-  // We can use denom == 0 to indicate that sTimebaseInfo is 
-  // uninitialised because it makes no sense to have a zero 
-  // denominator is a fraction.
-
-  if ( sTimebaseInfo.denom == 0 ) {
-      (void) mach_timebase_info(&sTimebaseInfo);
-  }
-
-  // Do the maths. We hope that the multiplication doesn't 
-  // overflow; the price you pay for working in fixed point.
-
-  return (Start * sTimebaseInfo.numer) / sTimebaseInfo.denom;
-#else
-  // Need to figure out what to do for Linux?
-  return 0;
-#endif
-}
-
-
-
-VOID
-SecSleep (
-  IN  UINT64 Nanoseconds
-  )
-{
-  struct timespec rq, rm;
-  struct timeval  start, end;
-  unsigned long  MicroSec;
-
-  rq.tv_sec  = DivU64x32 (Nanoseconds, 1000000000);
-  rq.tv_nsec = ModU64x32 (Nanoseconds, 1000000000);
-
-  //
-  // nanosleep gets interrupted by our timer tic.
-  // we need to track wall clock time or we will stall for way too long
-  //
-  gettimeofday (&start, NULL);
-  end.tv_sec  = start.tv_sec + rq.tv_sec;
-  MicroSec = (start.tv_usec + rq.tv_nsec/1000);
-  end.tv_usec = MicroSec % 1000000;
-  if (MicroSec > 1000000) {
-    end.tv_sec++;
-  }
-
-  while (nanosleep (&rq, &rm) == -1) {
-    if (errno != EINTR) {
-      break;
-    }
-    gettimeofday (&start, NULL);
-    if (start.tv_sec > end.tv_sec) {
-      break;
-    } if ((start.tv_sec == end.tv_sec) && (start.tv_usec > end.tv_usec)) {
-      break;
-    }
-    rq = rm;
-  }
-}
-
-
-VOID
-SecCpuSleep (
-  VOID
-  )
-{
-  struct timespec rq, rm;
-
-  // nanosleep gets interrupted by the timer tic
-  rq.tv_sec  = 1;
-  rq.tv_nsec = 0;
-
-  nanosleep (&rq, &rm);
-}
-
-
-VOID
-SecExit (
-  UINTN   Status
-  )
-{
-  exit (Status);
-}
-
-
-VOID
-SecGetTime (
-  OUT  EFI_TIME               *Time,
-  OUT EFI_TIME_CAPABILITIES   *Capabilities OPTIONAL
-  )
-{
-  struct tm *tm;
-  time_t t;
-
-  t = time (NULL);
-  tm = localtime (&t);
-
-  Time->Year = 1900 + tm->tm_year;
-  Time->Month = tm->tm_mon + 1;
-  Time->Day = tm->tm_mday;
-  Time->Hour = tm->tm_hour;
-  Time->Minute = tm->tm_min;
-  Time->Second = tm->tm_sec;
-  Time->Nanosecond = 0;
-  Time->TimeZone = timezone;
-  Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0)
-    | (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
-
-  if (Capabilities != NULL) {
-    Capabilities->Resolution  = 1;
-    Capabilities->Accuracy    = 50000000;
-    Capabilities->SetsToZero  = FALSE;
-  }
-}
-
-
-
-VOID
-SecSetTime (
-  IN  EFI_TIME               *Time
-  )
-{
-  // Don't change the time on the system
-  // We could save delta to localtime() and have SecGetTime adjust return values?
-  return;
-}
-
-
-EFI_STATUS
-SecGetNextProtocol (
-  IN  BOOLEAN                 EmuBusDriver,
-  OUT EMU_IO_THUNK_PROTOCOL   **Instance   OPTIONAL
-  )
-{
-  return GetNextThunkProtocol (EmuBusDriver, Instance);
-}
-
-
-EMU_THUNK_PROTOCOL gEmuThunkProtocol = {
-  GasketSecWriteStdErr,
-  GasketSecConfigStdIn,
-  GasketSecWriteStdOut,
-  GasketSecReadStdIn,
-  GasketSecPollStdIn,
-  GasketSecMalloc,
-  GasketSecValloc,
-  GasketSecFree,
-  GasketSecPeCoffGetEntryPoint,
-  GasketSecPeCoffRelocateImageExtraAction,
-  GasketSecPeCoffUnloadImageExtraAction,
-  GasketSecEnableInterrupt,
-  GasketSecDisableInterrupt,
-  GasketQueryPerformanceFrequency,
-  GasketQueryPerformanceCounter,
-  GasketSecSleep,
-  GasketSecCpuSleep,
-  GasketSecExit,
-  GasketSecGetTime,
-  GasketSecSetTime,
-  GasketSecSetTimer,
-  GasketSecGetNextProtocol
-};
-
-
-VOID
-SecInitThunkProtocol (
-  VOID
-  )
-{
-  // timezone and daylight lib globals depend on tzset be called 1st.
-  tzset ();
-}
-
+/*++ @file
+  Since the SEC is the only program in our emulation we
+  must use a UEFI/PI mechanism to export APIs to other modules.
+  This is the role of the EFI_EMU_THUNK_PROTOCOL.
+
+  The mUnixThunkTable exists so that a change to EFI_EMU_THUNK_PROTOCOL
+  will cause an error in initializing the array if all the member functions
+  are not added. It looks like adding a element to end and not initializing
+  it may cause the table to be initaliized with the members at the end being
+  set to zero. This is bad as jumping to zero will crash.
+
+Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR>
+Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include "Host.h"
+
+#ifdef __APPLE__
+#define DebugAssert _Mangle__DebugAssert
+
+#include <assert.h>
+#include <CoreServices/CoreServices.h>
+#include <mach/mach.h>
+#include <mach/mach_time.h>
+
+#undef DebugAssert
+#endif
+
+int settimer_initialized;
+struct timeval settimer_timeval;
+void (*settimer_callback)(UINT64 delta);
+
+BOOLEAN gEmulatorInterruptEnabled = FALSE;
+
+
+UINTN
+SecWriteStdErr (
+  IN UINT8     *Buffer,
+  IN UINTN     NumberOfBytes
+  )
+{
+  ssize_t Return;
+
+  Return = write (STDERR_FILENO, (const void *)Buffer, (size_t)NumberOfBytes);
+
+  return (Return == -1) ? 0 : Return;
+}
+
+
+EFI_STATUS
+SecConfigStdIn (
+  VOID
+  )
+{
+  struct termios tty;
+
+  //
+  // Need to turn off line buffering, ECHO, and make it unbuffered.
+  //
+  tcgetattr (STDIN_FILENO, &tty);
+  tty.c_lflag &= ~(ICANON | ECHO);
+  tcsetattr (STDIN_FILENO, TCSANOW, &tty);
+
+//  setvbuf (STDIN_FILENO, NULL, _IONBF, 0);
+
+  // now ioctl FIONREAD will do what we need
+  return EFI_SUCCESS;
+}
+
+UINTN
+SecWriteStdOut (
+  IN UINT8     *Buffer,
+  IN UINTN     NumberOfBytes
+  )
+{
+  ssize_t Return;
+
+  Return = write (STDOUT_FILENO, (const void *)Buffer, (size_t)NumberOfBytes);
+
+  return (Return == -1) ? 0 : Return;
+}
+
+UINTN
+SecReadStdIn (
+  IN UINT8     *Buffer,
+  IN UINTN     NumberOfBytes
+  )
+{
+  ssize_t Return;
+
+  Return = read (STDIN_FILENO, Buffer, (size_t)NumberOfBytes);
+
+  return (Return == -1) ? 0 : Return;
+}
+
+BOOLEAN
+SecPollStdIn (
+  VOID
+  )
+{
+  int Result;
+  int Bytes;
+
+  Result = ioctl (STDIN_FILENO, FIONREAD, &Bytes);
+  if (Result == -1) {
+    return FALSE;
+  }
+
+  return (BOOLEAN)(Bytes > 0);
+}
+
+
+VOID *
+SecMalloc (
+  IN  UINTN Size
+  )
+{
+  return malloc ((size_t)Size);
+}
+
+VOID *
+SecValloc (
+  IN  UINTN Size
+  )
+{
+  return valloc ((size_t)Size);
+}
+
+BOOLEAN
+SecFree (
+  IN  VOID *Ptr
+  )
+{
+  if (EfiSystemMemoryRange (Ptr)) {
+    // If an address range is in the EFI memory map it was alloced via EFI.
+    // So don't free those ranges and let the caller know.
+    return FALSE;
+  }
+
+  free (Ptr);
+  return TRUE;
+}
+
+
+void
+settimer_handler (int sig)
+{
+  struct timeval timeval;
+  UINT64 delta;
+
+  gettimeofday (&timeval, NULL);
+  delta = ((UINT64)timeval.tv_sec * 1000) + (timeval.tv_usec / 1000)
+    - ((UINT64)settimer_timeval.tv_sec * 1000)
+    - (settimer_timeval.tv_usec / 1000);
+  settimer_timeval = timeval;
+
+  if (settimer_callback) {
+    ReverseGasketUint64 (settimer_callback, delta);
+  }
+}
+
+VOID
+SecSetTimer (
+  IN  UINT64                  PeriodMs,
+  IN  EMU_SET_TIMER_CALLBACK  CallBack
+  )
+{
+  struct itimerval timerval;
+  UINT32 remainder;
+
+  if (!settimer_initialized) {
+    struct sigaction act;
+
+    settimer_initialized = 1;
+    act.sa_handler = settimer_handler;
+    act.sa_flags = 0;
+    sigemptyset (&act.sa_mask);
+    gEmulatorInterruptEnabled = TRUE;
+    if (sigaction (SIGALRM, &act, NULL) != 0) {
+      printf ("SetTimer: sigaction error %s\n", strerror (errno));
+    }
+    if (gettimeofday (&settimer_timeval, NULL) != 0) {
+      printf ("SetTimer: gettimeofday error %s\n", strerror (errno));
+    }
+  }
+  timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);
+  DivU64x32Remainder(PeriodMs, 1000, &remainder);
+  timerval.it_value.tv_usec = remainder * 1000;
+  timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);
+  timerval.it_interval = timerval.it_value;
+
+  if (setitimer (ITIMER_REAL, &timerval, NULL) != 0) {
+    printf ("SetTimer: setitimer error %s\n", strerror (errno));
+  }
+  settimer_callback = CallBack;
+}
+
+
+VOID
+SecEnableInterrupt (
+  VOID
+  )
+{
+  sigset_t  sigset;
+
+  gEmulatorInterruptEnabled = TRUE;
+  // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
+  // by enabling/disabling SIGALRM.
+  sigemptyset (&sigset);
+  sigaddset (&sigset, SIGALRM);
+  pthread_sigmask (SIG_UNBLOCK, &sigset, NULL);
+}
+
+
+VOID
+SecDisableInterrupt (
+  VOID
+  )
+{
+  sigset_t  sigset;
+
+  // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
+  // by enabling/disabling SIGALRM.
+  sigemptyset (&sigset);
+  sigaddset (&sigset, SIGALRM);
+  pthread_sigmask (SIG_BLOCK, &sigset, NULL);
+  gEmulatorInterruptEnabled = FALSE;
+}
+
+
+BOOLEAN
+SecInterruptEanbled (void)
+{
+  return gEmulatorInterruptEnabled;
+}
+
+
+UINT64
+QueryPerformanceFrequency (
+  VOID
+  )
+{
+  // Hard code to nanoseconds
+  return 1000000000ULL;
+}
+
+UINT64
+QueryPerformanceCounter (
+  VOID
+  )
+{
+#if __APPLE__
+  UINT64          Start;
+  static mach_timebase_info_data_t    sTimebaseInfo;
+
+
+  Start = mach_absolute_time ();
+
+  // Convert to nanoseconds.
+
+  // If this is the first time we've run, get the timebase.
+  // We can use denom == 0 to indicate that sTimebaseInfo is
+  // uninitialised because it makes no sense to have a zero
+  // denominator is a fraction.
+
+  if ( sTimebaseInfo.denom == 0 ) {
+      (void) mach_timebase_info(&sTimebaseInfo);
+  }
+
+  // Do the maths. We hope that the multiplication doesn't
+  // overflow; the price you pay for working in fixed point.
+
+  return (Start * sTimebaseInfo.numer) / sTimebaseInfo.denom;
+#else
+  // Need to figure out what to do for Linux?
+  return 0;
+#endif
+}
+
+
+
+VOID
+SecSleep (
+  IN  UINT64 Nanoseconds
+  )
+{
+  struct timespec rq, rm;
+  struct timeval  start, end;
+  unsigned long  MicroSec;
+
+  rq.tv_sec  = DivU64x32 (Nanoseconds, 1000000000);
+  rq.tv_nsec = ModU64x32 (Nanoseconds, 1000000000);
+
+  //
+  // nanosleep gets interrupted by our timer tic.
+  // we need to track wall clock time or we will stall for way too long
+  //
+  gettimeofday (&start, NULL);
+  end.tv_sec  = start.tv_sec + rq.tv_sec;
+  MicroSec = (start.tv_usec + rq.tv_nsec/1000);
+  end.tv_usec = MicroSec % 1000000;
+  if (MicroSec > 1000000) {
+    end.tv_sec++;
+  }
+
+  while (nanosleep (&rq, &rm) == -1) {
+    if (errno != EINTR) {
+      break;
+    }
+    gettimeofday (&start, NULL);
+    if (start.tv_sec > end.tv_sec) {
+      break;
+    } if ((start.tv_sec == end.tv_sec) && (start.tv_usec > end.tv_usec)) {
+      break;
+    }
+    rq = rm;
+  }
+}
+
+
+VOID
+SecCpuSleep (
+  VOID
+  )
+{
+  struct timespec rq, rm;
+
+  // nanosleep gets interrupted by the timer tic
+  rq.tv_sec  = 1;
+  rq.tv_nsec = 0;
+
+  nanosleep (&rq, &rm);
+}
+
+
+VOID
+SecExit (
+  UINTN   Status
+  )
+{
+  exit (Status);
+}
+
+
+VOID
+SecGetTime (
+  OUT  EFI_TIME               *Time,
+  OUT EFI_TIME_CAPABILITIES   *Capabilities OPTIONAL
+  )
+{
+  struct tm *tm;
+  time_t t;
+
+  t = time (NULL);
+  tm = localtime (&t);
+
+  Time->Year = 1900 + tm->tm_year;
+  Time->Month = tm->tm_mon + 1;
+  Time->Day = tm->tm_mday;
+  Time->Hour = tm->tm_hour;
+  Time->Minute = tm->tm_min;
+  Time->Second = tm->tm_sec;
+  Time->Nanosecond = 0;
+  Time->TimeZone = timezone;
+  Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0)
+    | (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
+
+  if (Capabilities != NULL) {
+    Capabilities->Resolution  = 1;
+    Capabilities->Accuracy    = 50000000;
+    Capabilities->SetsToZero  = FALSE;
+  }
+}
+
+
+
+VOID
+SecSetTime (
+  IN  EFI_TIME               *Time
+  )
+{
+  // Don't change the time on the system
+  // We could save delta to localtime() and have SecGetTime adjust return values?
+  return;
+}
+
+
+EFI_STATUS
+SecGetNextProtocol (
+  IN  BOOLEAN                 EmuBusDriver,
+  OUT EMU_IO_THUNK_PROTOCOL   **Instance   OPTIONAL
+  )
+{
+  return GetNextThunkProtocol (EmuBusDriver, Instance);
+}
+
+
+EMU_THUNK_PROTOCOL gEmuThunkProtocol = {
+  GasketSecWriteStdErr,
+  GasketSecConfigStdIn,
+  GasketSecWriteStdOut,
+  GasketSecReadStdIn,
+  GasketSecPollStdIn,
+  GasketSecMalloc,
+  GasketSecValloc,
+  GasketSecFree,
+  GasketSecPeCoffGetEntryPoint,
+  GasketSecPeCoffRelocateImageExtraAction,
+  GasketSecPeCoffUnloadImageExtraAction,
+  GasketSecEnableInterrupt,
+  GasketSecDisableInterrupt,
+  GasketQueryPerformanceFrequency,
+  GasketQueryPerformanceCounter,
+  GasketSecSleep,
+  GasketSecCpuSleep,
+  GasketSecExit,
+  GasketSecGetTime,
+  GasketSecSetTime,
+  GasketSecSetTimer,
+  GasketSecGetNextProtocol
+};
+
+
+VOID
+SecInitThunkProtocol (
+  VOID
+  )
+{
+  // timezone and daylight lib globals depend on tzset be called 1st.
+  tzset ();
+}
+

+ 7 - 7
EmulatorPkg/Unix/Host/Host.c

@@ -1148,7 +1148,7 @@ GdbScriptAddImage (
 
   if (ImageContext->PdbPointer != NULL && !IsPdbFile (ImageContext->PdbPointer)) {
     FILE  *GdbTempFile;
-    if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {    
+    if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
       GdbTempFile = fopen (gGdbWorkingFileName, "a");
       if (GdbTempFile != NULL) {
         long unsigned int SymbolsAddr = (long unsigned int)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders);
@@ -1170,13 +1170,13 @@ GdbScriptAddImage (
       GdbTempFile = fopen (gGdbWorkingFileName, "w");
       if (GdbTempFile != NULL) {
         fprintf (
-          GdbTempFile, 
-          "add-symbol-file %s 0x%08lx\n", 
-          ImageContext->PdbPointer, 
+          GdbTempFile,
+          "add-symbol-file %s 0x%08lx\n",
+          ImageContext->PdbPointer,
           (long unsigned int)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders)
           );
         fclose (GdbTempFile);
-  
+
         //
         // Target for gdb breakpoint in a script that uses gGdbWorkingFileName to set a breakpoint.
         // Hey what can you say scripting in gdb is not that great....
@@ -1225,7 +1225,7 @@ GdbScriptRemoveImage (
     return;
   }
 
-  if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {    
+  if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
     //
     // Write the file we need for the gdb script
     //
@@ -1256,7 +1256,7 @@ GdbScriptRemoveImage (
       SecGdbScriptBreak (ImageContext->PdbPointer, strlen (ImageContext->PdbPointer) + 1, 0, 0);
     } else {
       ASSERT (FALSE);
-    }  
+    }
   }
 }
 

+ 1 - 1
EmulatorPkg/Unix/Host/Host.h

@@ -82,7 +82,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #undef NTOHS
 #undef HTONS
 #undef B0
-#undef CR3
+#undef CR3
 
 #include <PiPei.h>
 #include <Uefi.h>

+ 1492 - 1492
EmulatorPkg/Unix/Host/Ia32/Gasket.S

@@ -1,1492 +1,1492 @@
-#------------------------------------------------------------------------------
-#
-# Manage differenced between UNIX ABI and EFI/Windows ABI
-#
-# For IA-32 the only difference is Mac OS X requires a 16-byte aligned stack.
-# For Linux this stack adjustment is a no-op, but we may as well make the
-# the code common.
-#
-# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
-# This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-#------------------------------------------------------------------------------
-
-
-
-  .text
-
-//
-// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)
-//
-
-
-ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)
-ASM_PFX(GasketSecWriteStdErr):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  12(%ebp), %eax
-  movl  %eax, 4(%esp)
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call  ASM_PFX(SecWriteStdErr)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)
-ASM_PFX(GasketSecConfigStdIn):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  12(%ebp), %eax
-  movl  %eax, 4(%esp)
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call  ASM_PFX(SecConfigStdIn)
-
-  leave
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)
-ASM_PFX(GasketSecWriteStdOut):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  12(%ebp), %eax
-  movl  %eax, 4(%esp)
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call  ASM_PFX(SecWriteStdOut)
-
-  leave
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)
-ASM_PFX(GasketSecReadStdIn):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  12(%ebp), %eax
-  movl  %eax, 4(%esp)
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call  ASM_PFX(SecReadStdIn)
-
-  leave
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)
-ASM_PFX(GasketSecPollStdIn):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  12(%ebp), %eax
-  movl  %eax, 4(%esp)
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call  ASM_PFX(SecPollStdIn)
-
-  leave
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketSecMalloc)
-ASM_PFX(GasketSecMalloc):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(SecMalloc)
-
-  leave
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketSecValloc)
-ASM_PFX(GasketSecValloc):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(SecValloc)
-
-  leave
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketSecFree)
-ASM_PFX(GasketSecFree):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(SecFree)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecSetTimer)
-ASM_PFX(GasketSecSetTimer):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $40, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	8(%ebp), %eax
-	movl	12(%ebp), %edx
-	movl	%edx, 4(%esp)
-	movl	%eax, (%esp)
-
-  call  ASM_PFX(SecSetTimer)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)
-ASM_PFX(GasketSecEnableInterrupt):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-
-  call    ASM_PFX(SecEnableInterrupt)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)
-ASM_PFX(GasketSecDisableInterrupt):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-
-  call    ASM_PFX(SecDisableInterrupt)
-
-  leave
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)
-ASM_PFX(GasketQueryPerformanceFrequency):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-
-  call    ASM_PFX(QueryPerformanceFrequency)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)
-ASM_PFX(GasketQueryPerformanceCounter):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-
-  call    ASM_PFX(QueryPerformanceCounter)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecSleep)
-ASM_PFX(GasketSecSleep):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	8(%ebp), %eax
-	movl	12(%ebp), %ecx
-	movl	%ecx, 4(%esp)
-	movl	%eax, (%esp)
-
-  call  ASM_PFX(SecSleep)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)
-ASM_PFX(GasketSecCpuSleep):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-
-  call  ASM_PFX(SecCpuSleep)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecExit)
-ASM_PFX(GasketSecExit):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(SecExit)     // Less to do as we will never return to EFI ABI world
-LDEAD_LOOP:
-  jmp  LDEAD_LOOP              // _exit should never return
-
-
-ASM_GLOBAL ASM_PFX(GasketSecGetTime)
-ASM_PFX(GasketSecGetTime):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  12(%ebp), %eax
-  movl  %eax, 4(%esp)
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call  ASM_PFX(SecGetTime)
-
-  leave
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketSecSetTime)
-ASM_PFX(GasketSecSetTime):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  12(%ebp), %eax
-  movl  %eax, 4(%esp)
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call  ASM_PFX(SecSetTime)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)
-ASM_PFX(GasketSecGetNextProtocol):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $40, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	20(%ebp), %eax
-	movl	%eax, 12(%esp)
-	movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(SecGetNextProtocol)
-
-  leave
-  ret
-
-// PPIs produced by SEC
-
-ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)
-ASM_PFX(GasketSecPeCoffGetEntryPoint):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  12(%ebp), %eax
-  movl  %eax, 4(%esp)
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(SecPeCoffGetEntryPoint)
-
-  leave
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)
-ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(SecPeCoffRelocateImageExtraAction)
-
-  leave
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)
-ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(SecPeCoffUnloadImageExtraAction)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)
-ASM_PFX(GasketSecEmuThunkAddress):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-
-  call    ASM_PFX(SecEmuThunkAddress)
-
-  leave
-  ret
-
-//
-// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
-//
-
-ASM_GLOBAL ASM_PFX(GasketX11Size)
-ASM_PFX(GasketX11Size):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $40, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	20(%ebp), %eax
-	movl	%eax, 12(%esp)
-	movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(X11Size)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11CheckKey)
-ASM_PFX(GasketX11CheckKey):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(X11CheckKey)
-
-  leave
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketX11GetKey)
-ASM_PFX(GasketX11GetKey):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  12(%ebp), %eax
-  movl  %eax, 4(%esp)
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(X11GetKey)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11KeySetState)
-ASM_PFX(GasketX11KeySetState):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  12(%ebp), %eax
-  movl  %eax, 4(%esp)
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(X11KeySetState)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)
-ASM_PFX(GasketX11RegisterKeyNotify):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $40, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	20(%ebp), %eax
-	movl	%eax, 12(%esp)
-	movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(X11RegisterKeyNotify)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11Blt)
-ASM_PFX(GasketX11Blt):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $40, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	20(%ebp), %eax
-	movl	%eax, 12(%esp)
-	movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(X11Blt)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)
-ASM_PFX(GasketX11CheckPointer):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(X11CheckPointer)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)
-ASM_PFX(GasketX11GetPointerState):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  12(%ebp), %eax
-  movl  %eax, 4(%esp)
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(X11GetPointerState)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)
-ASM_PFX(GasketX11GraphicsWindowOpen):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(X11GraphicsWindowOpen)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)
-ASM_PFX(GasketX11GraphicsWindowClose):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  12(%ebp), %eax
-  movl  %eax, 4(%esp)
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(X11GraphicsWindowClose)
-
-  leave
-  ret
-
-
-// Pthreads
-
-ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)
-ASM_PFX(GasketPthreadMutexLock):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(PthreadMutexLock)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)
-ASM_PFX(GasketPthreadMutexUnLock):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(PthreadMutexUnLock)
-
-  leave
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)
-ASM_PFX(GasketPthreadMutexTryLock):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(PthreadMutexTryLock)
-
-  leave
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)
-ASM_PFX(GasketPthreadMutexInit):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-
-  call    ASM_PFX(PthreadMutexInit)
-
-  leave
-  ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)
-ASM_PFX(GasketPthreadMutexDestroy):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(PthreadMutexDestroy)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadCreate)
-ASM_PFX(GasketPthreadCreate):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $40, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	20(%ebp), %eax
-	movl	%eax, 12(%esp)
-	movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(PthreadCreate)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadExit)
-ASM_PFX(GasketPthreadExit):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(PthreadExit)
-
-  leave
-  ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadSelf)
-ASM_PFX(GasketPthreadSelf):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-
-  call    ASM_PFX(PthreadSelf)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadOpen)
-ASM_PFX(GasketPthreadOpen):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(PthreadOpen)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadClose)
-ASM_PFX(GasketPthreadClose):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(PthreadClose)
-
-  leave
-  ret
-
-
-
-
-//
-// UNIX ABI to EFI ABI call
-//
-// UINTN
-// ReverseGasketUint64 (
-//   void *Api,
-//   UINTN Arg1
-//   );
-ASM_GLOBAL ASM_PFX(ReverseGasketUint64)
-ASM_PFX(ReverseGasketUint64):
-	pushl	%ebp
-	movl	%esp, %ebp
-	subl	$8, %esp
-	movl	16(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, (%esp)
-	calll	*8(%ebp)
-	addl	$8, %esp
-	popl	%ebp
-	ret
-
-
-
-//
-// UNIX ABI to EFI ABI call
-//
-// UINTN
-// ReverseGasketUint64Uint64 (
-//   void *Api,
-//   UINTN Arg1
-//   UINTN Arg2
-//   );
-ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)
-ASM_PFX(ReverseGasketUint64Uint64):
-	pushl	%ebp
-	movl	%esp, %ebp
-	subl	$24, %esp
-	movl	24(%ebp), %eax
-	movl	%eax, 12(%esp)
-	movl	20(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	16(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, (%esp)
-	calll	*8(%ebp)
-	addl	$24, %esp
-	popl	%ebp
-	ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)
-ASM_PFX(GasketSecUnixPeiAutoScan):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $40, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(SecUnixPeiAutoScan)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)
-ASM_PFX(GasketSecUnixFdAddress):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $40, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	20(%ebp), %eax
-	movl	%eax, 12(%esp)
-	movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(SecUnixFdAddress)
-
-  leave
-  ret
-
-
-// EmuIoThunk SimpleFileSystem
-
-ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)
-ASM_PFX(GasketPosixOpenVolume):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $40, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	20(%ebp), %eax
-	movl	%eax, 12(%esp)
-	movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(PosixOpenVolume)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)
-ASM_PFX(GasketPosixFileOpen):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $56, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	28(%ebp), %eax
-	movl	32(%ebp), %ecx
-	movl	%ecx, 24(%esp)
-	movl	%eax, 20(%esp)
-	movl	20(%ebp), %eax
-	movl	24(%ebp), %ecx
-	movl	%ecx, 16(%esp)
-	movl	%eax, 12(%esp)
-	movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(PosixFileOpen)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)
-ASM_PFX(GasketPosixFileCLose):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(PosixFileCLose)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)
-ASM_PFX(GasketPosixFileDelete):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(PosixFileDelete)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileRead)
-ASM_PFX(GasketPosixFileRead):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $40, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(PosixFileRead)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)
-ASM_PFX(GasketPosixFileWrite):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $40, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(PosixFileWrite)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)
-ASM_PFX(GasketPosixFileSetPossition):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $40, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	12(%ebp), %eax
-	movl	16(%ebp), %ecx
-	movl	%ecx, 8(%esp)
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(PosixFileSetPossition)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)
-ASM_PFX(GasketPosixFileGetPossition):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  12(%ebp), %eax
-  movl  %eax, 4(%esp)
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(PosixFileGetPossition)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)
-ASM_PFX(GasketPosixFileGetInfo):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $40, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	20(%ebp), %eax
-	movl	%eax, 12(%esp)
-	movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(PosixFileGetInfo)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)
-ASM_PFX(GasketPosixFileSetInfo):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $40, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	20(%ebp), %eax
-	movl	%eax, 12(%esp)
-	movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(PosixFileSetInfo)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)
-ASM_PFX(GasketPosixFileFlush):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(PosixFileFlush)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)
-ASM_PFX(GasketPosixFileSystmeThunkOpen):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(PosixFileSystmeThunkOpen)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)
-ASM_PFX(GasketPosixFileSystmeThunkClose):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(PosixFileSystmeThunkClose)
-
-  leave
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)
-ASM_PFX(GasketEmuBlockIoReset):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  12(%ebp), %eax
-  movl  %eax, 4(%esp)
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(EmuBlockIoReset)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)
-ASM_PFX(GasketEmuBlockIoReadBlocks):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $56, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	32(%ebp), %eax
-	movl	%eax, 24(%esp)
-	movl	28(%ebp), %eax
-	movl	%eax, 20(%esp)
-	movl	24(%ebp), %eax
-	movl	%eax, 16(%esp)
-	movl	16(%ebp), %eax
-	movl	20(%ebp), %edx
-	movl	%edx, 12(%esp)
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(EmuBlockIoReadBlocks)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)
-ASM_PFX(GasketEmuBlockIoWriteBlocks):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $56, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	32(%ebp), %eax
-	movl	%eax, 24(%esp)
-	movl	28(%ebp), %eax
-	movl	%eax, 20(%esp)
-	movl	24(%ebp), %eax
-	movl	%eax, 16(%esp)
-	movl	16(%ebp), %eax
-	movl	20(%ebp), %edx
-	movl	%edx, 12(%esp)
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(EmuBlockIoWriteBlocks)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)
-ASM_PFX(GasketEmuBlockIoFlushBlocks):  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  12(%ebp), %eax
-  movl  %eax, 4(%esp)
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-
-  call    ASM_PFX(EmuBlockIoFlushBlocks)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)
-ASM_PFX(GasketEmuBlockIoCreateMapping):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  12(%ebp), %eax
-  movl  %eax, 4(%esp)
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(EmuBlockIoCreateMapping)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)
-ASM_PFX(GasketBlockIoThunkOpen):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(EmuBlockIoThunkOpen)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)
-ASM_PFX(GasketBlockIoThunkClose):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(EmuBlockIoThunkClose)
-
-  leave
-  ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)
-ASM_PFX(GasketSnpCreateMapping):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  12(%ebp), %eax
-  movl  %eax, 4(%esp)
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(EmuSnpCreateMapping)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpStart)
-ASM_PFX(GasketSnpStart):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(EmuSnpStart)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpStop)
-ASM_PFX(GasketSnpStop):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(EmuSnpStop)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpInitialize)
-ASM_PFX(GasketSnpInitialize):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $40, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(EmuSnpInitialize)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpReset)
-ASM_PFX(GasketSnpReset):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  12(%ebp), %eax
-  movl  %eax, 4(%esp)
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(EmuSnpReset)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpShutdown)
-ASM_PFX(GasketSnpShutdown):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(EmuSnpShutdown)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)
-ASM_PFX(GasketSnpReceiveFilters):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $40, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	28(%ebp), %eax
-	movl	%eax, 20(%esp)
-	movl	24(%ebp), %eax
-	movl	%eax, 16(%esp)
-	movl	20(%ebp), %eax
-	movl	%eax, 12(%esp)
-	movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(EmuSnpReceiveFilters)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)
-ASM_PFX(GasketSnpStationAddress):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $40, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  leave
-  ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpStatistics)
-ASM_PFX(GasketSnpStatistics):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $40, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	20(%ebp), %eax
-	movl	%eax, 12(%esp)
-	movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(EmuSnpStatistics)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)
-ASM_PFX(GasketSnpMCastIpToMac):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $40, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	20(%ebp), %eax
-	movl	%eax, 12(%esp)
-	movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(EmuSnpMCastIpToMac)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpNvData)
-ASM_PFX(GasketSnpNvData):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $40, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	24(%ebp), %eax
-	movl	%eax, 16(%esp)
-	movl	20(%ebp), %eax
-	movl	%eax, 12(%esp)
-	movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(EmuSnpNvData)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)
-ASM_PFX(GasketSnpGetStatus):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $40, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(EmuSnpGetStatus)
-
-  leave
-  ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpTransmit)
-ASM_PFX(GasketSnpTransmit):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $56, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	32(%ebp), %eax
-	movl	%eax, 24(%esp)
-	movl	28(%ebp), %eax
-	movl	%eax, 20(%esp)
-	movl	24(%ebp), %eax
-	movl	%eax, 16(%esp)
-	movl	20(%ebp), %eax
-	movl	%eax, 12(%esp)
-	movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(EmuSnpTransmit)
-
-  leave
-  ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpReceive)
-ASM_PFX(GasketSnpReceive):
-	pushl	%ebp
-	movl	%esp, %ebp
-  subl  $56, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-	movl	32(%ebp), %eax
-	movl	%eax, 24(%esp)
-	movl	28(%ebp), %eax
-	movl	%eax, 20(%esp)
-	movl	24(%ebp), %eax
-	movl	%eax, 16(%esp)
-	movl	20(%ebp), %eax
-	movl	%eax, 12(%esp)
-	movl	16(%ebp), %eax
-	movl	%eax, 8(%esp)
-	movl	12(%ebp), %eax
-	movl	%eax, 4(%esp)
-	movl	8(%ebp), %eax
-	movl	%eax, (%esp)
-
-  call    ASM_PFX(EmuSnpReceive)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)
-ASM_PFX(GasketSnpThunkOpen):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(EmuSnpThunkOpen)
-
-  leave
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)
-ASM_PFX(GasketSnpThunkClose):
-  pushl %ebp
-  movl  %esp, %ebp
-  subl  $24, %esp      // sub extra 16 from the stack for alignment
-  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
-  movl  8(%ebp), %eax
-  movl  %eax, (%esp)
-
-  call    ASM_PFX(EmuSnpThunkClose)
-
-  leave
-  ret
-
-
+#------------------------------------------------------------------------------
+#
+# Manage differenced between UNIX ABI and EFI/Windows ABI
+#
+# For IA-32 the only difference is Mac OS X requires a 16-byte aligned stack.
+# For Linux this stack adjustment is a no-op, but we may as well make the
+# the code common.
+#
+# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#------------------------------------------------------------------------------
+
+
+
+  .text
+
+//
+// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)
+//
+
+
+ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)
+ASM_PFX(GasketSecWriteStdErr):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call  ASM_PFX(SecWriteStdErr)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)
+ASM_PFX(GasketSecConfigStdIn):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call  ASM_PFX(SecConfigStdIn)
+
+  leave
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)
+ASM_PFX(GasketSecWriteStdOut):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call  ASM_PFX(SecWriteStdOut)
+
+  leave
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)
+ASM_PFX(GasketSecReadStdIn):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call  ASM_PFX(SecReadStdIn)
+
+  leave
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)
+ASM_PFX(GasketSecPollStdIn):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call  ASM_PFX(SecPollStdIn)
+
+  leave
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketSecMalloc)
+ASM_PFX(GasketSecMalloc):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(SecMalloc)
+
+  leave
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketSecValloc)
+ASM_PFX(GasketSecValloc):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(SecValloc)
+
+  leave
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketSecFree)
+ASM_PFX(GasketSecFree):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(SecFree)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecSetTimer)
+ASM_PFX(GasketSecSetTimer):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $40, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  8(%ebp), %eax
+  movl  12(%ebp), %edx
+  movl  %edx, 4(%esp)
+  movl  %eax, (%esp)
+
+  call  ASM_PFX(SecSetTimer)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)
+ASM_PFX(GasketSecEnableInterrupt):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+
+  call    ASM_PFX(SecEnableInterrupt)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)
+ASM_PFX(GasketSecDisableInterrupt):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+
+  call    ASM_PFX(SecDisableInterrupt)
+
+  leave
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)
+ASM_PFX(GasketQueryPerformanceFrequency):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+
+  call    ASM_PFX(QueryPerformanceFrequency)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)
+ASM_PFX(GasketQueryPerformanceCounter):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+
+  call    ASM_PFX(QueryPerformanceCounter)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecSleep)
+ASM_PFX(GasketSecSleep):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  12(%ebp), %ecx
+  movl  %ecx, 4(%esp)
+  movl  %eax, (%esp)
+
+  call  ASM_PFX(SecSleep)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)
+ASM_PFX(GasketSecCpuSleep):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+
+  call  ASM_PFX(SecCpuSleep)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecExit)
+ASM_PFX(GasketSecExit):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(SecExit)     // Less to do as we will never return to EFI ABI world
+LDEAD_LOOP:
+  jmp  LDEAD_LOOP              // _exit should never return
+
+
+ASM_GLOBAL ASM_PFX(GasketSecGetTime)
+ASM_PFX(GasketSecGetTime):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call  ASM_PFX(SecGetTime)
+
+  leave
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketSecSetTime)
+ASM_PFX(GasketSecSetTime):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call  ASM_PFX(SecSetTime)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)
+ASM_PFX(GasketSecGetNextProtocol):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $40, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  20(%ebp), %eax
+  movl  %eax, 12(%esp)
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(SecGetNextProtocol)
+
+  leave
+  ret
+
+// PPIs produced by SEC
+
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)
+ASM_PFX(GasketSecPeCoffGetEntryPoint):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(SecPeCoffGetEntryPoint)
+
+  leave
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)
+ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(SecPeCoffRelocateImageExtraAction)
+
+  leave
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)
+ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(SecPeCoffUnloadImageExtraAction)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)
+ASM_PFX(GasketSecEmuThunkAddress):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+
+  call    ASM_PFX(SecEmuThunkAddress)
+
+  leave
+  ret
+
+//
+// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
+//
+
+ASM_GLOBAL ASM_PFX(GasketX11Size)
+ASM_PFX(GasketX11Size):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $40, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  20(%ebp), %eax
+  movl  %eax, 12(%esp)
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(X11Size)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11CheckKey)
+ASM_PFX(GasketX11CheckKey):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(X11CheckKey)
+
+  leave
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketX11GetKey)
+ASM_PFX(GasketX11GetKey):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(X11GetKey)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11KeySetState)
+ASM_PFX(GasketX11KeySetState):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(X11KeySetState)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)
+ASM_PFX(GasketX11RegisterKeyNotify):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $40, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  20(%ebp), %eax
+  movl  %eax, 12(%esp)
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(X11RegisterKeyNotify)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11Blt)
+ASM_PFX(GasketX11Blt):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $40, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  20(%ebp), %eax
+  movl  %eax, 12(%esp)
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(X11Blt)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)
+ASM_PFX(GasketX11CheckPointer):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(X11CheckPointer)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)
+ASM_PFX(GasketX11GetPointerState):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(X11GetPointerState)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)
+ASM_PFX(GasketX11GraphicsWindowOpen):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(X11GraphicsWindowOpen)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)
+ASM_PFX(GasketX11GraphicsWindowClose):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(X11GraphicsWindowClose)
+
+  leave
+  ret
+
+
+// Pthreads
+
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)
+ASM_PFX(GasketPthreadMutexLock):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(PthreadMutexLock)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)
+ASM_PFX(GasketPthreadMutexUnLock):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(PthreadMutexUnLock)
+
+  leave
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)
+ASM_PFX(GasketPthreadMutexTryLock):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(PthreadMutexTryLock)
+
+  leave
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)
+ASM_PFX(GasketPthreadMutexInit):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+
+  call    ASM_PFX(PthreadMutexInit)
+
+  leave
+  ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)
+ASM_PFX(GasketPthreadMutexDestroy):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(PthreadMutexDestroy)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadCreate)
+ASM_PFX(GasketPthreadCreate):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $40, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  20(%ebp), %eax
+  movl  %eax, 12(%esp)
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(PthreadCreate)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadExit)
+ASM_PFX(GasketPthreadExit):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(PthreadExit)
+
+  leave
+  ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadSelf)
+ASM_PFX(GasketPthreadSelf):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+
+  call    ASM_PFX(PthreadSelf)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadOpen)
+ASM_PFX(GasketPthreadOpen):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(PthreadOpen)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadClose)
+ASM_PFX(GasketPthreadClose):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(PthreadClose)
+
+  leave
+  ret
+
+
+
+
+//
+// UNIX ABI to EFI ABI call
+//
+// UINTN
+// ReverseGasketUint64 (
+//   void *Api,
+//   UINTN Arg1
+//   );
+ASM_GLOBAL ASM_PFX(ReverseGasketUint64)
+ASM_PFX(ReverseGasketUint64):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $8, %esp
+  movl  16(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, (%esp)
+  calll  *8(%ebp)
+  addl  $8, %esp
+  popl  %ebp
+  ret
+
+
+
+//
+// UNIX ABI to EFI ABI call
+//
+// UINTN
+// ReverseGasketUint64Uint64 (
+//   void *Api,
+//   UINTN Arg1
+//   UINTN Arg2
+//   );
+ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)
+ASM_PFX(ReverseGasketUint64Uint64):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp
+  movl  24(%ebp), %eax
+  movl  %eax, 12(%esp)
+  movl  20(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  16(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, (%esp)
+  calll  *8(%ebp)
+  addl  $24, %esp
+  popl  %ebp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)
+ASM_PFX(GasketSecUnixPeiAutoScan):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $40, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(SecUnixPeiAutoScan)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)
+ASM_PFX(GasketSecUnixFdAddress):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $40, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  20(%ebp), %eax
+  movl  %eax, 12(%esp)
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(SecUnixFdAddress)
+
+  leave
+  ret
+
+
+// EmuIoThunk SimpleFileSystem
+
+ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)
+ASM_PFX(GasketPosixOpenVolume):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $40, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  20(%ebp), %eax
+  movl  %eax, 12(%esp)
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(PosixOpenVolume)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)
+ASM_PFX(GasketPosixFileOpen):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $56, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  28(%ebp), %eax
+  movl  32(%ebp), %ecx
+  movl  %ecx, 24(%esp)
+  movl  %eax, 20(%esp)
+  movl  20(%ebp), %eax
+  movl  24(%ebp), %ecx
+  movl  %ecx, 16(%esp)
+  movl  %eax, 12(%esp)
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(PosixFileOpen)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)
+ASM_PFX(GasketPosixFileCLose):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(PosixFileCLose)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)
+ASM_PFX(GasketPosixFileDelete):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(PosixFileDelete)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileRead)
+ASM_PFX(GasketPosixFileRead):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $40, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(PosixFileRead)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)
+ASM_PFX(GasketPosixFileWrite):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $40, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(PosixFileWrite)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)
+ASM_PFX(GasketPosixFileSetPossition):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $40, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  12(%ebp), %eax
+  movl  16(%ebp), %ecx
+  movl  %ecx, 8(%esp)
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(PosixFileSetPossition)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)
+ASM_PFX(GasketPosixFileGetPossition):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(PosixFileGetPossition)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)
+ASM_PFX(GasketPosixFileGetInfo):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $40, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  20(%ebp), %eax
+  movl  %eax, 12(%esp)
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(PosixFileGetInfo)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)
+ASM_PFX(GasketPosixFileSetInfo):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $40, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  20(%ebp), %eax
+  movl  %eax, 12(%esp)
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(PosixFileSetInfo)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)
+ASM_PFX(GasketPosixFileFlush):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(PosixFileFlush)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)
+ASM_PFX(GasketPosixFileSystmeThunkOpen):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(PosixFileSystmeThunkOpen)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)
+ASM_PFX(GasketPosixFileSystmeThunkClose):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(PosixFileSystmeThunkClose)
+
+  leave
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)
+ASM_PFX(GasketEmuBlockIoReset):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(EmuBlockIoReset)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)
+ASM_PFX(GasketEmuBlockIoReadBlocks):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $56, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  32(%ebp), %eax
+  movl  %eax, 24(%esp)
+  movl  28(%ebp), %eax
+  movl  %eax, 20(%esp)
+  movl  24(%ebp), %eax
+  movl  %eax, 16(%esp)
+  movl  16(%ebp), %eax
+  movl  20(%ebp), %edx
+  movl  %edx, 12(%esp)
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(EmuBlockIoReadBlocks)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)
+ASM_PFX(GasketEmuBlockIoWriteBlocks):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $56, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  32(%ebp), %eax
+  movl  %eax, 24(%esp)
+  movl  28(%ebp), %eax
+  movl  %eax, 20(%esp)
+  movl  24(%ebp), %eax
+  movl  %eax, 16(%esp)
+  movl  16(%ebp), %eax
+  movl  20(%ebp), %edx
+  movl  %edx, 12(%esp)
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(EmuBlockIoWriteBlocks)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)
+ASM_PFX(GasketEmuBlockIoFlushBlocks):  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+
+  call    ASM_PFX(EmuBlockIoFlushBlocks)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)
+ASM_PFX(GasketEmuBlockIoCreateMapping):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(EmuBlockIoCreateMapping)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)
+ASM_PFX(GasketBlockIoThunkOpen):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(EmuBlockIoThunkOpen)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)
+ASM_PFX(GasketBlockIoThunkClose):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(EmuBlockIoThunkClose)
+
+  leave
+  ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)
+ASM_PFX(GasketSnpCreateMapping):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(EmuSnpCreateMapping)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpStart)
+ASM_PFX(GasketSnpStart):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(EmuSnpStart)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpStop)
+ASM_PFX(GasketSnpStop):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(EmuSnpStop)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpInitialize)
+ASM_PFX(GasketSnpInitialize):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $40, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(EmuSnpInitialize)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpReset)
+ASM_PFX(GasketSnpReset):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(EmuSnpReset)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpShutdown)
+ASM_PFX(GasketSnpShutdown):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(EmuSnpShutdown)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)
+ASM_PFX(GasketSnpReceiveFilters):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $40, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  28(%ebp), %eax
+  movl  %eax, 20(%esp)
+  movl  24(%ebp), %eax
+  movl  %eax, 16(%esp)
+  movl  20(%ebp), %eax
+  movl  %eax, 12(%esp)
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(EmuSnpReceiveFilters)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)
+ASM_PFX(GasketSnpStationAddress):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $40, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  leave
+  ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpStatistics)
+ASM_PFX(GasketSnpStatistics):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $40, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  20(%ebp), %eax
+  movl  %eax, 12(%esp)
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(EmuSnpStatistics)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)
+ASM_PFX(GasketSnpMCastIpToMac):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $40, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  20(%ebp), %eax
+  movl  %eax, 12(%esp)
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(EmuSnpMCastIpToMac)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpNvData)
+ASM_PFX(GasketSnpNvData):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $40, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  24(%ebp), %eax
+  movl  %eax, 16(%esp)
+  movl  20(%ebp), %eax
+  movl  %eax, 12(%esp)
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(EmuSnpNvData)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)
+ASM_PFX(GasketSnpGetStatus):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $40, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(EmuSnpGetStatus)
+
+  leave
+  ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpTransmit)
+ASM_PFX(GasketSnpTransmit):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $56, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  32(%ebp), %eax
+  movl  %eax, 24(%esp)
+  movl  28(%ebp), %eax
+  movl  %eax, 20(%esp)
+  movl  24(%ebp), %eax
+  movl  %eax, 16(%esp)
+  movl  20(%ebp), %eax
+  movl  %eax, 12(%esp)
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(EmuSnpTransmit)
+
+  leave
+  ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpReceive)
+ASM_PFX(GasketSnpReceive):
+  pushl  %ebp
+  movl  %esp, %ebp
+  subl  $56, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  32(%ebp), %eax
+  movl  %eax, 24(%esp)
+  movl  28(%ebp), %eax
+  movl  %eax, 20(%esp)
+  movl  24(%ebp), %eax
+  movl  %eax, 16(%esp)
+  movl  20(%ebp), %eax
+  movl  %eax, 12(%esp)
+  movl  16(%ebp), %eax
+  movl  %eax, 8(%esp)
+  movl  12(%ebp), %eax
+  movl  %eax, 4(%esp)
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(EmuSnpReceive)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)
+ASM_PFX(GasketSnpThunkOpen):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(EmuSnpThunkOpen)
+
+  leave
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)
+ASM_PFX(GasketSnpThunkClose):
+  pushl %ebp
+  movl  %esp, %ebp
+  subl  $24, %esp      // sub extra 16 from the stack for alignment
+  and   $-16, %esp    // stack needs to end in 0xFFFFFFF0 before call
+  movl  8(%ebp), %eax
+  movl  %eax, (%esp)
+
+  call    ASM_PFX(EmuSnpThunkClose)
+
+  leave
+  ret
+
+

+ 74 - 74
EmulatorPkg/Unix/Host/Ia32/SwitchStack.c

@@ -1,74 +1,74 @@
-/*++
-
-Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
-Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution.  The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-
---*/
-
-#include "Host.h"
-
-
-/**
-  Transfers control to a function starting with a new stack.
-
-  Transfers control to the function specified by EntryPoint using the new stack
-  specified by NewStack and passing in the parameters specified by Context1 and
-  Context2. Context1 and Context2 are optional and may be NULL. The function
-  EntryPoint must never return.
-
-  If EntryPoint is NULL, then ASSERT().
-  If NewStack is NULL, then ASSERT().
-
-  @param  EntryPoint  A pointer to function to call with the new stack.
-  @param  Context1    A pointer to the context to pass into the EntryPoint
-                      function.
-  @param  Context2    A pointer to the context to pass into the EntryPoint
-                      function.
-  @param  NewStack    A pointer to the new stack to use for the EntryPoint
-                      function.
-
-**/
-VOID
-EFIAPI
-PeiSwitchStacks (
-  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
-  IN      VOID                      *Context1,  OPTIONAL
-  IN      VOID                      *Context2,  OPTIONAL
-  IN      VOID                      *NewStack
-  )
-{
-  BASE_LIBRARY_JUMP_BUFFER  JumpBuffer;
-
-  ASSERT (EntryPoint != NULL);
-  ASSERT (NewStack != NULL);
-
-  //
-  // Stack should be aligned with CPU_STACK_ALIGNMENT
-  //
-  ASSERT (((UINTN)NewStack & (CPU_STACK_ALIGNMENT - 1)) == 0);
-
-  JumpBuffer.Eip = (UINTN)EntryPoint;
-  JumpBuffer.Esp = (UINTN)NewStack - sizeof (VOID*);
-  JumpBuffer.Esp -= sizeof (Context1) + sizeof (Context2);
-  ((VOID**)JumpBuffer.Esp)[1] = Context1;
-  ((VOID**)JumpBuffer.Esp)[2] = Context2;
-
-  LongJump (&JumpBuffer, (UINTN)-1);
-
-
-  //
-  // PeiSwitchStacks () will never return
-  //
-  ASSERT (FALSE);
-}
-
-
-
+/*++
+
+Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
+Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+
+--*/
+
+#include "Host.h"
+
+
+/**
+  Transfers control to a function starting with a new stack.
+
+  Transfers control to the function specified by EntryPoint using the new stack
+  specified by NewStack and passing in the parameters specified by Context1 and
+  Context2. Context1 and Context2 are optional and may be NULL. The function
+  EntryPoint must never return.
+
+  If EntryPoint is NULL, then ASSERT().
+  If NewStack is NULL, then ASSERT().
+
+  @param  EntryPoint  A pointer to function to call with the new stack.
+  @param  Context1    A pointer to the context to pass into the EntryPoint
+                      function.
+  @param  Context2    A pointer to the context to pass into the EntryPoint
+                      function.
+  @param  NewStack    A pointer to the new stack to use for the EntryPoint
+                      function.
+
+**/
+VOID
+EFIAPI
+PeiSwitchStacks (
+  IN      SWITCH_STACK_ENTRY_POINT  EntryPoint,
+  IN      VOID                      *Context1,  OPTIONAL
+  IN      VOID                      *Context2,  OPTIONAL
+  IN      VOID                      *NewStack
+  )
+{
+  BASE_LIBRARY_JUMP_BUFFER  JumpBuffer;
+
+  ASSERT (EntryPoint != NULL);
+  ASSERT (NewStack != NULL);
+
+  //
+  // Stack should be aligned with CPU_STACK_ALIGNMENT
+  //
+  ASSERT (((UINTN)NewStack & (CPU_STACK_ALIGNMENT - 1)) == 0);
+
+  JumpBuffer.Eip = (UINTN)EntryPoint;
+  JumpBuffer.Esp = (UINTN)NewStack - sizeof (VOID*);
+  JumpBuffer.Esp -= sizeof (Context1) + sizeof (Context2);
+  ((VOID**)JumpBuffer.Esp)[1] = Context1;
+  ((VOID**)JumpBuffer.Esp)[2] = Context2;
+
+  LongJump (&JumpBuffer, (UINTN)-1);
+
+
+  //
+  // PeiSwitchStacks () will never return
+  //
+  ASSERT (FALSE);
+}
+
+
+

+ 145 - 145
EmulatorPkg/Unix/Host/MemoryAllocationLib.c

@@ -1,145 +1,145 @@
-/*++ @file
-
-  Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
-
-  This program and the accompanying materials
-  are licensed and made available under the terms and conditions of the BSD License
-  which accompanies this distribution.  The full text of the license may be found at
-  http://opensource.org/licenses/bsd-license.php
-
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include "Base.h"
-#include "Library/BaseMemoryLib.h"
-#include "Library/MemoryAllocationLib.h"
-
-#include <stdlib.h>
-
-/**
-  Allocates a buffer of type EfiBootServicesData.
-
-  Allocates the number bytes specified by AllocationSize of type EfiBootServicesData and returns a
-  pointer to the allocated buffer.  If AllocationSize is 0, then a valid buffer of 0 size is
-  returned.  If there is not enough memory remaining to satisfy the request, then NULL is returned.
-
-  @param  AllocationSize        The number of bytes to allocate.
-
-  @return A pointer to the allocated buffer or NULL if allocation fails.
-
-**/
-VOID *
-EFIAPI
-AllocatePool (
-  IN UINTN  AllocationSize
-  )
-{
-  return (VOID*) malloc (AllocationSize);
-}
-
-
-/**
-  Allocates and zeros a buffer of type EfiBootServicesData.
-
-  Allocates the number bytes specified by AllocationSize of type EfiBootServicesData, clears the
-  buffer with zeros, and returns a pointer to the allocated buffer.  If AllocationSize is 0, then a
-  valid buffer of 0 size is returned.  If there is not enough memory remaining to satisfy the
-  request, then NULL is returned.
-
-  @param  AllocationSize        The number of bytes to allocate and zero.
-
-  @return A pointer to the allocated buffer or NULL if allocation fails.
-
-**/
-VOID *
-EFIAPI
-AllocateZeroPool (
-  IN UINTN  AllocationSize
-  )
-{
-  VOID *Buffer;
-
-  Buffer = AllocatePool (AllocationSize);
-  if (Buffer == NULL) {
-    return NULL;
-  }
-
-  ZeroMem (Buffer, AllocationSize);
-
-  return Buffer;
-}
-
-
-/**
-  Reallocates a buffer of type EfiBootServicesData.
-
-  Allocates and zeros the number bytes specified by NewSize from memory of type
-  EfiBootServicesData.  If OldBuffer is not NULL, then the smaller of OldSize and
-  NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
-  OldBuffer is freed.  A pointer to the newly allocated buffer is returned.
-  If NewSize is 0, then a valid buffer of 0 size is  returned.  If there is not
-  enough memory remaining to satisfy the request, then NULL is returned.
-
-  If the allocation of the new buffer is successful and the smaller of NewSize and OldSize
-  is greater than (MAX_ADDRESS - OldBuffer + 1), then ASSERT().
-
-  @param  OldSize        The size, in bytes, of OldBuffer.
-  @param  NewSize        The size, in bytes, of the buffer to reallocate.
-  @param  OldBuffer      The buffer to copy to the allocated buffer.  This is an optional
-                         parameter that may be NULL.
-
-  @return A pointer to the allocated buffer or NULL if allocation fails.
-
-**/
-VOID *
-EFIAPI
-ReallocatePool (
-  IN UINTN  OldSize,
-  IN UINTN  NewSize,
-  IN VOID   *OldBuffer  OPTIONAL
-  )
-{
-  VOID *NewBuffer;
-
-  NewBuffer = AllocatePool (NewSize);
-  if (NewBuffer == NULL) {
-    return NULL;
-  }
-
-  if (OldBuffer != NULL) {
-    if (OldSize > 0) {
-      CopyMem (NewBuffer, OldBuffer, OldSize);
-    }
-
-    FreePool (OldBuffer);
-  }
-
-  return NewBuffer;
-}
-
-
-/**
-  Frees a buffer that was previously allocated with one of the pool allocation functions in the
-  Memory Allocation Library.
-
-  Frees the buffer specified by Buffer.  Buffer must have been allocated on a previous call to the
-  pool allocation services of the Memory Allocation Library.  If it is not possible to free pool
-  resources, then this function will perform no actions.
-
-  If Buffer was not allocated with a pool allocation function in the Memory Allocation Library,
-  then ASSERT().
-
-  @param  Buffer                Pointer to the buffer to free.
-
-**/
-VOID
-EFIAPI
-FreePool (
-  IN VOID   *Buffer
-  )
-{
-  free ((void *) Buffer);
-}
-
+/*++ @file
+
+  Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
+
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include "Base.h"
+#include "Library/BaseMemoryLib.h"
+#include "Library/MemoryAllocationLib.h"
+
+#include <stdlib.h>
+
+/**
+  Allocates a buffer of type EfiBootServicesData.
+
+  Allocates the number bytes specified by AllocationSize of type EfiBootServicesData and returns a
+  pointer to the allocated buffer.  If AllocationSize is 0, then a valid buffer of 0 size is
+  returned.  If there is not enough memory remaining to satisfy the request, then NULL is returned.
+
+  @param  AllocationSize        The number of bytes to allocate.
+
+  @return A pointer to the allocated buffer or NULL if allocation fails.
+
+**/
+VOID *
+EFIAPI
+AllocatePool (
+  IN UINTN  AllocationSize
+  )
+{
+  return (VOID*) malloc (AllocationSize);
+}
+
+
+/**
+  Allocates and zeros a buffer of type EfiBootServicesData.
+
+  Allocates the number bytes specified by AllocationSize of type EfiBootServicesData, clears the
+  buffer with zeros, and returns a pointer to the allocated buffer.  If AllocationSize is 0, then a
+  valid buffer of 0 size is returned.  If there is not enough memory remaining to satisfy the
+  request, then NULL is returned.
+
+  @param  AllocationSize        The number of bytes to allocate and zero.
+
+  @return A pointer to the allocated buffer or NULL if allocation fails.
+
+**/
+VOID *
+EFIAPI
+AllocateZeroPool (
+  IN UINTN  AllocationSize
+  )
+{
+  VOID *Buffer;
+
+  Buffer = AllocatePool (AllocationSize);
+  if (Buffer == NULL) {
+    return NULL;
+  }
+
+  ZeroMem (Buffer, AllocationSize);
+
+  return Buffer;
+}
+
+
+/**
+  Reallocates a buffer of type EfiBootServicesData.
+
+  Allocates and zeros the number bytes specified by NewSize from memory of type
+  EfiBootServicesData.  If OldBuffer is not NULL, then the smaller of OldSize and
+  NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
+  OldBuffer is freed.  A pointer to the newly allocated buffer is returned.
+  If NewSize is 0, then a valid buffer of 0 size is  returned.  If there is not
+  enough memory remaining to satisfy the request, then NULL is returned.
+
+  If the allocation of the new buffer is successful and the smaller of NewSize and OldSize
+  is greater than (MAX_ADDRESS - OldBuffer + 1), then ASSERT().
+
+  @param  OldSize        The size, in bytes, of OldBuffer.
+  @param  NewSize        The size, in bytes, of the buffer to reallocate.
+  @param  OldBuffer      The buffer to copy to the allocated buffer.  This is an optional
+                         parameter that may be NULL.
+
+  @return A pointer to the allocated buffer or NULL if allocation fails.
+
+**/
+VOID *
+EFIAPI
+ReallocatePool (
+  IN UINTN  OldSize,
+  IN UINTN  NewSize,
+  IN VOID   *OldBuffer  OPTIONAL
+  )
+{
+  VOID *NewBuffer;
+
+  NewBuffer = AllocatePool (NewSize);
+  if (NewBuffer == NULL) {
+    return NULL;
+  }
+
+  if (OldBuffer != NULL) {
+    if (OldSize > 0) {
+      CopyMem (NewBuffer, OldBuffer, OldSize);
+    }
+
+    FreePool (OldBuffer);
+  }
+
+  return NewBuffer;
+}
+
+
+/**
+  Frees a buffer that was previously allocated with one of the pool allocation functions in the
+  Memory Allocation Library.
+
+  Frees the buffer specified by Buffer.  Buffer must have been allocated on a previous call to the
+  pool allocation services of the Memory Allocation Library.  If it is not possible to free pool
+  resources, then this function will perform no actions.
+
+  If Buffer was not allocated with a pool allocation function in the Memory Allocation Library,
+  then ASSERT().
+
+  @param  Buffer                Pointer to the buffer to free.
+
+**/
+VOID
+EFIAPI
+FreePool (
+  IN VOID   *Buffer
+  )
+{
+  free ((void *) Buffer);
+}
+

+ 1556 - 1556
EmulatorPkg/Unix/Host/PosixFileSystem.c

@@ -1,1556 +1,1556 @@
-/*++ @file
- POSIX Pthreads to emulate APs and implement threads
-
-Copyright (c) 2011, Apple Inc. All rights reserved.
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution.  The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-
-**/
-
-#include "Host.h"
-
-
-#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'P', 'f', 's')
-
-typedef struct {
-  UINTN                           Signature;
-  EMU_IO_THUNK_PROTOCOL           *Thunk;
-  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL SimpleFileSystem;
-  CHAR8                           *FilePath;
-  CHAR16                          *VolumeLabel;
-  BOOLEAN                         FileHandlesOpen;
-} EMU_SIMPLE_FILE_SYSTEM_PRIVATE;
-
-#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS(a) \
-  CR (a, \
-      EMU_SIMPLE_FILE_SYSTEM_PRIVATE, \
-      SimpleFileSystem, \
-      EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE \
-      )
-
-
-#define EMU_EFI_FILE_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'P', 'f', 'i')
-
-typedef struct {
-  UINTN                           Signature;
-  EMU_IO_THUNK_PROTOCOL           *Thunk;
-  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;
-  EFI_FILE_PROTOCOL               EfiFile;
-  int                             fd;
-  DIR                             *Dir;
-  BOOLEAN                         IsRootDirectory;
-  BOOLEAN                         IsDirectoryPath;
-  BOOLEAN                         IsOpenedByRead;
-  char                            *FileName;
-  struct dirent                   *Dirent;
-} EMU_EFI_FILE_PRIVATE;
-
-#define EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS(a) \
-  CR (a, \
-      EMU_EFI_FILE_PRIVATE, \
-      EfiFile, \
-      EMU_EFI_FILE_PRIVATE_SIGNATURE \
-      )
-
-EFI_STATUS
-PosixFileGetInfo (
-  IN EFI_FILE_PROTOCOL        *This,
-  IN EFI_GUID                 *InformationType,
-  IN OUT UINTN                *BufferSize,
-  OUT VOID                    *Buffer
-  );
-
-EFI_STATUS
-PosixFileSetInfo (
-  IN EFI_FILE_PROTOCOL        *This,
-  IN EFI_GUID                 *InformationType,
-  IN UINTN                    BufferSize,
-  IN VOID                     *Buffer
-  );
-
-
-EFI_FILE_PROTOCOL gPosixFileProtocol = {
-  EFI_FILE_REVISION,
-  GasketPosixFileOpen,
-  GasketPosixFileCLose,
-  GasketPosixFileDelete,
-  GasketPosixFileRead,
-  GasketPosixFileWrite,
-  GasketPosixFileGetPossition,
-  GasketPosixFileSetPossition,
-  GasketPosixFileGetInfo,
-  GasketPosixFileSetInfo,
-  GasketPosixFileFlush
-};
-
-EFI_SIMPLE_FILE_SYSTEM_PROTOCOL gPosixFileSystemProtocol = {
-  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION,
-  GasketPosixOpenVolume,
-};
-
-
-/**
-  Open the root directory on a volume.
-
-  @param  This Protocol instance pointer.
-  @param  Root Returns an Open file handle for the root directory
-
-  @retval EFI_SUCCESS          The device was opened.
-  @retval EFI_UNSUPPORTED      This volume does not support the file system.
-  @retval EFI_NO_MEDIA         The device has no media.
-  @retval EFI_DEVICE_ERROR     The device reported an error.
-  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
-  @retval EFI_ACCESS_DENIED    The service denied access to the file.
-  @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of resources.
-
-**/
-EFI_STATUS
-PosixOpenVolume (
-  IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL    *This,
-  OUT EFI_FILE_PROTOCOL                 **Root
-  )
-{
-  EFI_STATUS                        Status;
-  EMU_SIMPLE_FILE_SYSTEM_PRIVATE    *Private;
-  EMU_EFI_FILE_PRIVATE              *PrivateFile;
-
-  Private     = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (This);
-
-  Status = EFI_OUT_OF_RESOURCES;
-  PrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));
-  if (PrivateFile == NULL) {
-    goto Done;
-  }
-
-  PrivateFile->FileName = malloc (AsciiStrSize (Private->FilePath));
-  if (PrivateFile->FileName == NULL) {
-    goto Done;
-  }
-  AsciiStrCpy (PrivateFile->FileName, Private->FilePath);
-
-  PrivateFile->Signature            = EMU_EFI_FILE_PRIVATE_SIGNATURE;
-  PrivateFile->Thunk                = Private->Thunk;
-  PrivateFile->SimpleFileSystem     = This;
-  PrivateFile->IsRootDirectory      = TRUE;
-  PrivateFile->IsDirectoryPath      = TRUE;
-  PrivateFile->IsOpenedByRead       = TRUE;
-
-  CopyMem (&PrivateFile->EfiFile, &gPosixFileProtocol, sizeof (EFI_FILE_PROTOCOL));
-
-  PrivateFile->fd                   = -1;
-  PrivateFile->Dir                  = NULL;
-  PrivateFile->Dirent               = NULL;
-
-  *Root = &PrivateFile->EfiFile;
-
-  PrivateFile->Dir = opendir (PrivateFile->FileName);
-  if (PrivateFile->Dir == NULL) {
-    Status = EFI_ACCESS_DENIED;
-  } else {
-    Status = EFI_SUCCESS;
-  }
-
-Done:
-  if (EFI_ERROR (Status)) {
-    if (PrivateFile != NULL) {
-      if (PrivateFile->FileName != NULL) {
-        free (PrivateFile->FileName);
-      }
-
-      free (PrivateFile);
-    }
-
-    *Root = NULL;
-  }
-
-  return Status;
-}
-
-
-EFI_STATUS
-ErrnoToEfiStatus ()
-{
-  switch (errno) {
-  case EACCES:
-    return EFI_ACCESS_DENIED;
-
-  case EDQUOT:
-  case ENOSPC:
-    return EFI_VOLUME_FULL;
-
-  default:
-    return EFI_DEVICE_ERROR;
-  }
-}
-
-VOID
-CutPrefix (
-  IN  CHAR8  *Str,
-  IN  UINTN   Count
-  )
-{
-  CHAR8  *Pointer;
-
-  if (AsciiStrLen (Str) < Count) {
-    ASSERT (0);
-  }
-
-  for (Pointer = Str; *(Pointer + Count); Pointer++) {
-    *Pointer = *(Pointer + Count);
-  }
-
-  *Pointer = *(Pointer + Count);
-}
-
-
-VOID
-PosixSystemTimeToEfiTime (
-  IN  time_t                SystemTime,
-  OUT EFI_TIME              *Time
-  )
-{
-  struct tm *tm;
-
-  tm           = gmtime (&SystemTime);
-  Time->Year   = tm->tm_year;
-  Time->Month  = tm->tm_mon + 1;
-  Time->Day    = tm->tm_mday;
-  Time->Hour   = tm->tm_hour;
-  Time->Minute = tm->tm_min;
-  Time->Second = tm->tm_sec;
-  Time->Nanosecond = 0;
-
-  Time->TimeZone = timezone;
-  Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0) | (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
-}
-
-
-EFI_STATUS
-UnixSimpleFileSystemFileInfo (
-  EMU_EFI_FILE_PRIVATE            *PrivateFile,
-  IN     CHAR8                    *FileName,
-  IN OUT UINTN                    *BufferSize,
-  OUT    VOID                     *Buffer
-  )
-{
-  EFI_STATUS                  Status;
-  UINTN                       Size;
-  UINTN                       NameSize;
-  UINTN                       ResultSize;
-  EFI_FILE_INFO               *Info;
-  CHAR8                       *RealFileName;
-  CHAR8                       *TempPointer;
-  CHAR16                      *BufferFileName;
-  struct stat                 buf;
-
-  if (FileName != NULL) {
-    RealFileName = FileName;
-  } else if (PrivateFile->IsRootDirectory) {
-    RealFileName = "";
-  } else {
-    RealFileName  = PrivateFile->FileName;
-  }
-
-  TempPointer = RealFileName;
-  while (*TempPointer) {
-    if (*TempPointer == '/') {
-      RealFileName = TempPointer + 1;
-    }
-
-    TempPointer++;
-  }
-
-  Size        = SIZE_OF_EFI_FILE_INFO;
-  NameSize    = AsciiStrSize (RealFileName) * 2;
-  ResultSize  = Size + NameSize;
-
-  if (*BufferSize < ResultSize) {
-    *BufferSize = ResultSize;
-    return EFI_BUFFER_TOO_SMALL;
-  }
-  if (stat (FileName == NULL ? PrivateFile->FileName : FileName, &buf) < 0) {
-    return EFI_DEVICE_ERROR;
-  }
-
-  Status  = EFI_SUCCESS;
-
-  Info    = Buffer;
-  ZeroMem (Info, ResultSize);
-
-  Info->Size          = ResultSize;
-  Info->FileSize      = buf.st_size;
-  Info->PhysicalSize  = MultU64x32 (buf.st_blocks, buf.st_blksize);
-
-  PosixSystemTimeToEfiTime (buf.st_ctime, &Info->CreateTime);
-  PosixSystemTimeToEfiTime (buf.st_atime, &Info->LastAccessTime);
-  PosixSystemTimeToEfiTime (buf.st_mtime, &Info->ModificationTime);
-
-  if (!(buf.st_mode & S_IWUSR)) {
-    Info->Attribute |= EFI_FILE_READ_ONLY;
-  }
-
-  if (S_ISDIR(buf.st_mode)) {
-    Info->Attribute |= EFI_FILE_DIRECTORY;
-  }
-
-
-  BufferFileName = (CHAR16 *)((CHAR8 *) Buffer + Size);
-  while (*RealFileName) {
-    *BufferFileName++ = *RealFileName++;
-  }
-  *BufferFileName = 0;
-
-  *BufferSize = ResultSize;
-  return Status;
-}
-
-BOOLEAN
-IsZero (
-  IN VOID   *Buffer,
-  IN UINTN  Length
-  )
-{
-  if (Buffer == NULL || Length == 0) {
-    return FALSE;
-  }
-
-  if (*(UINT8 *) Buffer != 0) {
-    return FALSE;
-  }
-
-  if (Length > 1) {
-    if (!CompareMem (Buffer, (UINT8 *) Buffer + 1, Length - 1)) {
-      return FALSE;
-    }
-  }
-
-  return TRUE;
-}
-
-
-
-/**
-  Opens a new file relative to the source file's location.
-
-  @param  This       The protocol instance pointer.
-  @param  NewHandle  Returns File Handle for FileName.
-  @param  FileName   Null terminated string. "\", ".", and ".." are supported.
-  @param  OpenMode   Open mode for file.
-  @param  Attributes Only used for EFI_FILE_MODE_CREATE.
-
-  @retval EFI_SUCCESS          The device was opened.
-  @retval EFI_NOT_FOUND        The specified file could not be found on the device.
-  @retval EFI_NO_MEDIA         The device has no media.
-  @retval EFI_MEDIA_CHANGED    The media has changed.
-  @retval EFI_DEVICE_ERROR     The device reported an error.
-  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
-  @retval EFI_ACCESS_DENIED    The service denied access to the file.
-  @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of resources.
-  @retval EFI_VOLUME_FULL      The volume is full.
-
-**/
-EFI_STATUS
-PosixFileOpen (
-  IN EFI_FILE_PROTOCOL        *This,
-  OUT EFI_FILE_PROTOCOL       **NewHandle,
-  IN CHAR16                   *FileName,
-  IN UINT64                   OpenMode,
-  IN UINT64                   Attributes
-  )
-{
-  EFI_FILE_PROTOCOL                 *Root;
-  EMU_EFI_FILE_PRIVATE              *PrivateFile;
-  EMU_EFI_FILE_PRIVATE              *NewPrivateFile;
-  EMU_SIMPLE_FILE_SYSTEM_PRIVATE    *PrivateRoot;
-  EFI_STATUS                        Status;
-  CHAR16                            *Src;
-  char                              *Dst;
-  CHAR8                             *RealFileName;
-  char                              *ParseFileName;
-  char                              *GuardPointer;
-  CHAR8                             TempChar;
-  UINTN                             Count;
-  BOOLEAN                           TrailingDash;
-  BOOLEAN                           LoopFinish;
-  UINTN                             InfoSize;
-  EFI_FILE_INFO                     *Info;
-  struct stat                       finfo;
-  int                               res;
-
-
-  PrivateFile     = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
-  PrivateRoot     = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (PrivateFile->SimpleFileSystem);
-  NewPrivateFile  = NULL;
-  Status          = EFI_OUT_OF_RESOURCES;
-
-  //
-  // BUGBUG: assume an open of root
-  // if current location, return current data
-  //
-  TrailingDash = FALSE;
-  if ((StrCmp (FileName, L"\\") == 0) ||
-      (StrCmp (FileName, L".") == 0 && PrivateFile->IsRootDirectory)) {
-OpenRoot:
-    Status          = PosixOpenVolume (PrivateFile->SimpleFileSystem, &Root);
-    NewPrivateFile  = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (Root);
-    goto Done;
-  }
-
-  if (FileName[StrLen (FileName) - 1] == L'\\') {
-    TrailingDash = TRUE;
-    FileName[StrLen (FileName) - 1]  = 0;
-  }
-
-  //
-  // Attempt to open the file
-  //
-  NewPrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));
-  if (NewPrivateFile == NULL) {
-    goto Done;
-  }
-
-  CopyMem (NewPrivateFile, PrivateFile, sizeof (EMU_EFI_FILE_PRIVATE));
-
-  NewPrivateFile->FileName = malloc (AsciiStrSize (PrivateFile->FileName) + 1 + StrLen (FileName) + 1);
-  if (NewPrivateFile->FileName == NULL) {
-    goto Done;
-  }
-
-  if (*FileName == L'\\') {
-    AsciiStrCpy (NewPrivateFile->FileName, PrivateRoot->FilePath);
-    // Skip first '\'.
-    Src = FileName + 1;
-  } else {
-    AsciiStrCpy (NewPrivateFile->FileName, PrivateFile->FileName);
-    Src = FileName;
-  }
-  Dst = NewPrivateFile->FileName + AsciiStrLen (NewPrivateFile->FileName);
-  GuardPointer = NewPrivateFile->FileName + AsciiStrLen (PrivateRoot->FilePath);
-  *Dst++ = '/';
-  // Convert unicode to ascii and '\' to '/'
-  while (*Src) {
-    if (*Src == '\\') {
-      *Dst++ = '/';
-    } else {
-      *Dst++ = *Src;
-    }
-    Src++;
-  }
-  *Dst = 0;
-
-
-  //
-  // Get rid of . and .., except leading . or ..
-  //
-
-  //
-  // GuardPointer protect simplefilesystem root path not be destroyed
-  //
-
-  LoopFinish    = FALSE;
-  while (!LoopFinish) {
-    LoopFinish = TRUE;
-
-    for (ParseFileName = GuardPointer; *ParseFileName; ParseFileName++) {
-      if (*ParseFileName == '.' &&
-          (*(ParseFileName + 1) == 0 || *(ParseFileName + 1) == '/') &&
-          *(ParseFileName - 1) == '/'
-          ) {
-
-        //
-        // cut /.
-        //
-        CutPrefix (ParseFileName - 1, 2);
-        LoopFinish = FALSE;
-        break;
-      }
-
-      if (*ParseFileName == '.' &&
-          *(ParseFileName + 1) == '.' &&
-          (*(ParseFileName + 2) == 0 || *(ParseFileName + 2) == '/') &&
-          *(ParseFileName - 1) == '/'
-          ) {
-
-        ParseFileName--;
-        Count = 3;
-
-        while (ParseFileName != GuardPointer) {
-          ParseFileName--;
-          Count++;
-          if (*ParseFileName == '/') {
-            break;
-          }
-        }
-
-        //
-        // cut /.. and its left directory
-        //
-        CutPrefix (ParseFileName, Count);
-        LoopFinish = FALSE;
-        break;
-      }
-    }
-  }
-
-  if (AsciiStrCmp (NewPrivateFile->FileName, PrivateRoot->FilePath) == 0) {
-    NewPrivateFile->IsRootDirectory = TRUE;
-    free (NewPrivateFile->FileName);
-    free (NewPrivateFile);
-    goto OpenRoot;
-  }
-
-  RealFileName = NewPrivateFile->FileName + AsciiStrLen(NewPrivateFile->FileName) - 1;
-  while (RealFileName > NewPrivateFile->FileName && *RealFileName != '/') {
-    RealFileName--;
-  }
-
-  TempChar            = *(RealFileName - 1);
-  *(RealFileName - 1) = 0;
-  *(RealFileName - 1) = TempChar;
-
-
-  //
-  // Test whether file or directory
-  //
-  NewPrivateFile->IsRootDirectory = FALSE;
-  NewPrivateFile->fd = -1;
-  NewPrivateFile->Dir = NULL;
-  if (OpenMode & EFI_FILE_MODE_CREATE) {
-    if (Attributes & EFI_FILE_DIRECTORY) {
-      NewPrivateFile->IsDirectoryPath = TRUE;
-    } else {
-      NewPrivateFile->IsDirectoryPath = FALSE;
-    }
-  } else {
-    res = stat (NewPrivateFile->FileName, &finfo);
-    if (res == 0 && S_ISDIR(finfo.st_mode)) {
-      NewPrivateFile->IsDirectoryPath = TRUE;
-    } else {
-      NewPrivateFile->IsDirectoryPath = FALSE;
-    }
-  }
-
-  if (OpenMode & EFI_FILE_MODE_WRITE) {
-    NewPrivateFile->IsOpenedByRead = FALSE;
-  } else {
-    NewPrivateFile->IsOpenedByRead = TRUE;
-  }
-
-  Status = EFI_SUCCESS;
-
-  //
-  // deal with directory
-  //
-  if (NewPrivateFile->IsDirectoryPath) {
-    if ((OpenMode & EFI_FILE_MODE_CREATE)) {
-      //
-      // Create a directory
-      //
-      if (mkdir (NewPrivateFile->FileName, 0777) != 0) {
-        if (errno != EEXIST) {
-          //free (TempFileName);
-          Status = EFI_ACCESS_DENIED;
-          goto Done;
-        }
-      }
-    }
-
-    NewPrivateFile->Dir = opendir (NewPrivateFile->FileName);
-    if (NewPrivateFile->Dir == NULL) {
-      if (errno == EACCES) {
-        Status = EFI_ACCESS_DENIED;
-      } else {
-        Status = EFI_NOT_FOUND;
-      }
-
-      goto Done;
-    }
-
-  } else {
-    //
-    // deal with file
-    //
-    NewPrivateFile->fd = open (
-                          NewPrivateFile->FileName,
-                          ((OpenMode & EFI_FILE_MODE_CREATE) ? O_CREAT : 0) | (NewPrivateFile->IsOpenedByRead ? O_RDONLY : O_RDWR),
-                          0666
-                          );
-    if (NewPrivateFile->fd < 0) {
-      if (errno == ENOENT) {
-        Status = EFI_NOT_FOUND;
-      } else {
-        Status = EFI_ACCESS_DENIED;
-      }
-    }
-  }
-
-  if ((OpenMode & EFI_FILE_MODE_CREATE) && Status == EFI_SUCCESS) {
-    //
-    // Set the attribute
-    //
-    InfoSize  = 0;
-    Info      = NULL;
-    Status    = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, &InfoSize, Info);
-    if (Status != EFI_BUFFER_TOO_SMALL) {
-      Status = EFI_DEVICE_ERROR;
-      goto Done;
-    }
-
-    Info = malloc (InfoSize);
-    if (Info == NULL) {
-      goto Done;
-    }
-
-    Status = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, &InfoSize, Info);
-    if (EFI_ERROR (Status)) {
-      goto Done;
-    }
-
-    Info->Attribute = Attributes;
-    PosixFileSetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, InfoSize, Info);
-
-    free (Info);
-  }
-
-Done: ;
-  if (TrailingDash) {
-    FileName[StrLen (FileName) + 1]  = 0;
-    FileName[StrLen (FileName)]      = L'\\';
-  }
-
-  if (EFI_ERROR (Status)) {
-    if (NewPrivateFile) {
-      if (NewPrivateFile->FileName) {
-        free (NewPrivateFile->FileName);
-      }
-
-      free (NewPrivateFile);
-    }
-  } else {
-    *NewHandle = &NewPrivateFile->EfiFile;
-  }
-
-  return Status;
-}
-
-
-
-/**
-  Close the file handle
-
-  @param  This          Protocol instance pointer.
-
-  @retval EFI_SUCCESS   The device was opened.
-
-**/
-EFI_STATUS
-PosixFileCLose (
-  IN EFI_FILE_PROTOCOL  *This
-  )
-{
-  EMU_EFI_FILE_PRIVATE *PrivateFile;
-
-  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
-
-  if (PrivateFile->fd >= 0) {
-    close (PrivateFile->fd);
-  }
-  if (PrivateFile->Dir != NULL) {
-    closedir (PrivateFile->Dir);
-  }
-
-  PrivateFile->fd = -1;
-  PrivateFile->Dir = NULL;
-
-  if (PrivateFile->FileName) {
-    free (PrivateFile->FileName);
-  }
-
-  free (PrivateFile);
-
-  return EFI_SUCCESS;
-}
-
-
-/**
-  Close and delete the file handle.
-
-  @param  This                     Protocol instance pointer.
-
-  @retval EFI_SUCCESS              The device was opened.
-  @retval EFI_WARN_DELETE_FAILURE  The handle was closed but the file was not deleted.
-
-**/
-EFI_STATUS
-PosixFileDelete (
-  IN EFI_FILE_PROTOCOL  *This
-  )
-{
-  EFI_STATUS              Status;
-  EMU_EFI_FILE_PRIVATE   *PrivateFile;
-
-  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
-  Status      = EFI_WARN_DELETE_FAILURE;
-
-  if (PrivateFile->IsDirectoryPath) {
-    if (PrivateFile->Dir != NULL) {
-      closedir (PrivateFile->Dir);
-      PrivateFile->Dir = NULL;
-    }
-
-    if (rmdir (PrivateFile->FileName) == 0) {
-      Status = EFI_SUCCESS;
-    }
-  } else {
-    close (PrivateFile->fd);
-    PrivateFile->fd = -1;
-
-    if (!PrivateFile->IsOpenedByRead) {
-      if (!unlink (PrivateFile->FileName)) {
-        Status = EFI_SUCCESS;
-      }
-    }
-  }
-
-  free (PrivateFile->FileName);
-  free (PrivateFile);
-
-  return Status;
-}
-
-
-/**
-  Read data from the file.
-
-  @param  This       Protocol instance pointer.
-  @param  BufferSize On input size of buffer, on output amount of data in buffer.
-  @param  Buffer     The buffer in which data is read.
-
-  @retval EFI_SUCCESS          Data was read.
-  @retval EFI_NO_MEDIA         The device has no media.
-  @retval EFI_DEVICE_ERROR     The device reported an error.
-  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
-  @retval EFI_BUFFER_TO_SMALL  BufferSize is too small. BufferSize contains required size.
-
-**/
-EFI_STATUS
-PosixFileRead (
-  IN EFI_FILE_PROTOCOL        *This,
-  IN OUT UINTN                *BufferSize,
-  OUT VOID                    *Buffer
-  )
-{
-  EMU_EFI_FILE_PRIVATE    *PrivateFile;
-  EFI_STATUS              Status;
-  int                     Res;
-  UINTN                   Size;
-  UINTN                   NameSize;
-  UINTN                   ResultSize;
-  CHAR8                   *FullFileName;
-
-
-  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
-
-  if (!PrivateFile->IsDirectoryPath) {
-    if (PrivateFile->fd < 0) {
-      Status = EFI_DEVICE_ERROR;
-      goto Done;
-    }
-
-    Res = read (PrivateFile->fd, Buffer, *BufferSize);
-    if (Res < 0) {
-      Status = EFI_DEVICE_ERROR;
-      goto Done;
-    }
-    *BufferSize = Res;
-    Status = EFI_SUCCESS;
-    goto Done;
-  }
-
-  //
-  // Read on a directory.
-  //
-  if (PrivateFile->Dir == NULL) {
-    Status = EFI_DEVICE_ERROR;
-    goto Done;
-  }
-
-  if (PrivateFile->Dirent == NULL) {
-    PrivateFile->Dirent = readdir (PrivateFile->Dir);
-    if (PrivateFile->Dirent == NULL) {
-      *BufferSize = 0;
-      Status = EFI_SUCCESS;
-      goto Done;
-    }
-  }
-
-  Size        = SIZE_OF_EFI_FILE_INFO;
-  NameSize    = AsciiStrLen (PrivateFile->Dirent->d_name) + 1;
-  ResultSize  = Size + 2 * NameSize;
-
-  if (*BufferSize < ResultSize) {
-    *BufferSize = ResultSize;
-    Status = EFI_BUFFER_TOO_SMALL;
-    goto Done;
-  }
-  Status  = EFI_SUCCESS;
-
-  *BufferSize = ResultSize;
-
-  FullFileName = malloc (AsciiStrLen(PrivateFile->FileName) + 1 + NameSize);
-  if (FullFileName == NULL) {
-    Status = EFI_OUT_OF_RESOURCES;
-    goto Done;
-  }
-
-  AsciiStrCpy (FullFileName, PrivateFile->FileName);
-  AsciiStrCat (FullFileName, "/");
-  AsciiStrCat (FullFileName, PrivateFile->Dirent->d_name);
-  Status = UnixSimpleFileSystemFileInfo (
-            PrivateFile,
-            FullFileName,
-            BufferSize,
-            Buffer
-            );
-  free (FullFileName);
-
-  PrivateFile->Dirent = NULL;
-
-Done:
-  return Status;
-}
-
-
-
-/**
-  Write data to a file.
-
-  @param  This       Protocol instance pointer.
-  @param  BufferSize On input size of buffer, on output amount of data in buffer.
-  @param  Buffer     The buffer in which data to write.
-
-  @retval EFI_SUCCESS          Data was written.
-  @retval EFI_UNSUPPORTED      Writes to Open directory are not supported.
-  @retval EFI_NO_MEDIA         The device has no media.
-  @retval EFI_DEVICE_ERROR     The device reported an error.
-  @retval EFI_DEVICE_ERROR     An attempt was made to write to a deleted file.
-  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
-  @retval EFI_WRITE_PROTECTED  The device is write protected.
-  @retval EFI_ACCESS_DENIED    The file was open for read only.
-  @retval EFI_VOLUME_FULL      The volume is full.
-
-**/
-EFI_STATUS
-PosixFileWrite (
-  IN EFI_FILE_PROTOCOL        *This,
-  IN OUT UINTN                *BufferSize,
-  IN VOID                     *Buffer
-  )
-{
-  EMU_EFI_FILE_PRIVATE  *PrivateFile;
-  int                   Res;
-
-
-  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
-
-  if (PrivateFile->fd < 0) {
-    return EFI_DEVICE_ERROR;
-  }
-
-  if (PrivateFile->IsDirectoryPath) {
-    return EFI_UNSUPPORTED;
-  }
-
-  if (PrivateFile->IsOpenedByRead) {
-    return EFI_ACCESS_DENIED;
-  }
-
-  Res = write (PrivateFile->fd, Buffer, *BufferSize);
-  if (Res == (UINTN)-1) {
-    return ErrnoToEfiStatus ();
-  }
-
-  *BufferSize = Res;
-  return EFI_SUCCESS;
-}
-
-
-
-/**
-  Set a files current position
-
-  @param  This            Protocol instance pointer.
-  @param  Position        Byte position from the start of the file.
-
-  @retval EFI_SUCCESS     Data was written.
-  @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open.
-
-**/
-EFI_STATUS
-PosixFileSetPossition (
-  IN EFI_FILE_PROTOCOL        *This,
-  IN UINT64                   Position
-  )
-{
-  EMU_EFI_FILE_PRIVATE    *PrivateFile;
-  off_t                   Pos;
-
-  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
-
-  if (PrivateFile->IsDirectoryPath) {
-    if (Position != 0) {
-      return EFI_UNSUPPORTED;
-    }
-
-    if (PrivateFile->Dir == NULL) {
-      return EFI_DEVICE_ERROR;
-    }
-    rewinddir (PrivateFile->Dir);
-    return EFI_SUCCESS;
-  } else {
-    if (Position == (UINT64) -1) {
-      Pos = lseek (PrivateFile->fd, 0, SEEK_END);
-    } else {
-      Pos = lseek (PrivateFile->fd, Position, SEEK_SET);
-    }
-    if (Pos == (off_t)-1) {
-      return ErrnoToEfiStatus ();
-    }
-    return EFI_SUCCESS;
-  }
-}
-
-
-
-/**
-  Get a file's current position
-
-  @param  This            Protocol instance pointer.
-  @param  Position        Byte position from the start of the file.
-
-  @retval EFI_SUCCESS     Data was written.
-  @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open..
-
-**/
-EFI_STATUS
-PosixFileGetPossition (
-  IN EFI_FILE_PROTOCOL        *This,
-  OUT UINT64                  *Position
-  )
-{
-  EFI_STATUS            Status;
-  EMU_EFI_FILE_PRIVATE  *PrivateFile;
-
-  PrivateFile   = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
-
-  if (PrivateFile->IsDirectoryPath) {
-    Status = EFI_UNSUPPORTED;
-  } else {
-    *Position = (UINT64)lseek (PrivateFile->fd, 0, SEEK_CUR);
-    Status = (*Position == (UINT64) -1) ? ErrnoToEfiStatus () : EFI_SUCCESS;
-  }
-
-  return Status;
-}
-
-
-/**
-  Get information about a file.
-
-  @param  This            Protocol instance pointer.
-  @param  InformationType Type of information to return in Buffer.
-  @param  BufferSize      On input size of buffer, on output amount of data in buffer.
-  @param  Buffer          The buffer to return data.
-
-  @retval EFI_SUCCESS          Data was returned.
-  @retval EFI_UNSUPPORTED      InformationType is not supported.
-  @retval EFI_NO_MEDIA         The device has no media.
-  @retval EFI_DEVICE_ERROR     The device reported an error.
-  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
-  @retval EFI_WRITE_PROTECTED  The device is write protected.
-  @retval EFI_ACCESS_DENIED    The file was open for read only.
-  @retval EFI_BUFFER_TOO_SMALL Buffer was too small; required size returned in BufferSize.
-
-**/
-EFI_STATUS
-PosixFileGetInfo (
-  IN EFI_FILE_PROTOCOL        *This,
-  IN EFI_GUID                 *InformationType,
-  IN OUT UINTN                *BufferSize,
-  OUT VOID                    *Buffer
-  )
-{
-  EFI_STATUS                        Status;
-  EMU_EFI_FILE_PRIVATE              *PrivateFile;
-  EFI_FILE_SYSTEM_INFO              *FileSystemInfoBuffer;
-  int                               UnixStatus;
-  EMU_SIMPLE_FILE_SYSTEM_PRIVATE    *PrivateRoot;
-  struct statfs                     buf;
-
-  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
-  PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (PrivateFile->SimpleFileSystem);
-
-  Status = EFI_SUCCESS;
-  if (CompareGuid (InformationType, &gEfiFileInfoGuid)) {
-    Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, BufferSize, Buffer);
-  } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
-    if (*BufferSize < SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel)) {
-      *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);
-      return EFI_BUFFER_TOO_SMALL;
-    }
-
-    UnixStatus = statfs (PrivateFile->FileName, &buf);
-    if (UnixStatus < 0) {
-      return EFI_DEVICE_ERROR;
-    }
-
-    FileSystemInfoBuffer            = (EFI_FILE_SYSTEM_INFO *) Buffer;
-    FileSystemInfoBuffer->Size      = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);
-    FileSystemInfoBuffer->ReadOnly  = FALSE;
-
-    //
-    // Succeeded
-    //
-    FileSystemInfoBuffer->VolumeSize  = MultU64x32 (buf.f_blocks, buf.f_bsize);
-    FileSystemInfoBuffer->FreeSpace   = MultU64x32 (buf.f_bavail, buf.f_bsize);
-    FileSystemInfoBuffer->BlockSize   = buf.f_bsize;
-
-
-    StrCpy ((CHAR16 *) FileSystemInfoBuffer->VolumeLabel, PrivateRoot->VolumeLabel);
-    *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);
-
-  } else if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) {
-    if (*BufferSize < StrSize (PrivateRoot->VolumeLabel)) {
-      *BufferSize = StrSize (PrivateRoot->VolumeLabel);
-      return EFI_BUFFER_TOO_SMALL;
-    }
-
-    StrCpy ((CHAR16 *) Buffer, PrivateRoot->VolumeLabel);
-    *BufferSize = StrSize (PrivateRoot->VolumeLabel);
-
-  }
-
-  return Status;
-}
-
-
-/**
-  Set information about a file
-
-  @param  File            Protocol instance pointer.
-  @param  InformationType Type of information in Buffer.
-  @param  BufferSize      Size of buffer.
-  @param  Buffer          The data to write.
-
-  @retval EFI_SUCCESS          Data was returned.
-  @retval EFI_UNSUPPORTED      InformationType is not supported.
-  @retval EFI_NO_MEDIA         The device has no media.
-  @retval EFI_DEVICE_ERROR     The device reported an error.
-  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
-  @retval EFI_WRITE_PROTECTED  The device is write protected.
-  @retval EFI_ACCESS_DENIED    The file was open for read only.
-
-**/
-EFI_STATUS
-PosixFileSetInfo (
-  IN EFI_FILE_PROTOCOL        *This,
-  IN EFI_GUID                 *InformationType,
-  IN UINTN                    BufferSize,
-  IN VOID                     *Buffer
-  )
-{
-  EMU_SIMPLE_FILE_SYSTEM_PRIVATE    *PrivateRoot;
-  EMU_EFI_FILE_PRIVATE              *PrivateFile;
-  EFI_FILE_INFO                     *OldFileInfo;
-  EFI_FILE_INFO                     *NewFileInfo;
-  EFI_STATUS                        Status;
-  UINTN                             OldInfoSize;
-  mode_t                            NewAttr;
-  struct stat                       OldAttr;
-  CHAR8                             *OldFileName;
-  CHAR8                             *NewFileName;
-  CHAR8                             *CharPointer;
-  BOOLEAN                           AttrChangeFlag;
-  BOOLEAN                           NameChangeFlag;
-  BOOLEAN                           SizeChangeFlag;
-  BOOLEAN                           TimeChangeFlag;
-  struct tm                         NewLastAccessSystemTime;
-  struct tm                         NewLastWriteSystemTime;
-  EFI_FILE_SYSTEM_INFO              *NewFileSystemInfo;
-  CHAR8                             *AsciiFilePtr;
-  CHAR16                            *UnicodeFilePtr;
-  int                               UnixStatus;
-  struct utimbuf                    Utime;
-
-
-  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
-  PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (PrivateFile->SimpleFileSystem);
-  errno       = 0;
-  Status      = EFI_UNSUPPORTED;
-  OldFileInfo = NewFileInfo = NULL;
-  OldFileName = NewFileName = NULL;
-  AttrChangeFlag = NameChangeFlag = SizeChangeFlag = TimeChangeFlag = FALSE;
-
-  //
-  // Set file system information.
-  //
-  if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
-    if (BufferSize < (SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel))) {
-      Status = EFI_BAD_BUFFER_SIZE;
-      goto Done;
-    }
-
-    NewFileSystemInfo = (EFI_FILE_SYSTEM_INFO *) Buffer;
-
-    free (PrivateRoot->VolumeLabel);
-
-    PrivateRoot->VolumeLabel = malloc (StrSize (NewFileSystemInfo->VolumeLabel));
-    if (PrivateRoot->VolumeLabel == NULL) {
-      goto Done;
-    }
-
-    StrCpy (PrivateRoot->VolumeLabel, NewFileSystemInfo->VolumeLabel);
-
-    Status = EFI_SUCCESS;
-    goto Done;
-  }
-
-  //
-  // Set volume label information.
-  //
-  if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) {
-    if (BufferSize < StrSize (PrivateRoot->VolumeLabel)) {
-      Status = EFI_BAD_BUFFER_SIZE;
-      goto Done;
-    }
-
-    StrCpy (PrivateRoot->VolumeLabel, (CHAR16 *) Buffer);
-
-    Status = EFI_SUCCESS;
-    goto Done;
-  }
-
-  if (!CompareGuid (InformationType, &gEfiFileInfoGuid)) {
-    Status = EFI_UNSUPPORTED;
-    goto Done;
-  }
-
-  if (BufferSize < SIZE_OF_EFI_FILE_INFO) {
-    Status = EFI_BAD_BUFFER_SIZE;
-    goto Done;
-  }
-
-  //
-  // Set file/directory information.
-  //
-
-  //
-  // Check for invalid set file information parameters.
-  //
-  NewFileInfo = (EFI_FILE_INFO *) Buffer;
-  if (NewFileInfo->Size <= sizeof (EFI_FILE_INFO) ||
-      (NewFileInfo->Attribute &~(EFI_FILE_VALID_ATTR)) ||
-      (sizeof (UINTN) == 4 && NewFileInfo->Size > 0xFFFFFFFF)
-      ) {
-    Status = EFI_INVALID_PARAMETER;
-    goto Done;
-  }
-
-  //
-  // Get current file information so we can determine what kind
-  // of change request this is.
-  //
-  OldInfoSize = 0;
-  Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize, NULL);
-  if (Status != EFI_BUFFER_TOO_SMALL) {
-    Status = EFI_DEVICE_ERROR;
-    goto Done;
-  }
-
-  OldFileInfo = malloc (OldInfoSize);
-  if (OldFileInfo == NULL) {
-    goto Done;
-  }
-
-  Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize, OldFileInfo);
-  if (EFI_ERROR (Status)) {
-    goto Done;
-  }
-
-  OldFileName = malloc (AsciiStrSize (PrivateFile->FileName));
-  if (OldFileInfo == NULL) {
-    goto Done;
-  }
-
-  AsciiStrCpy (OldFileName, PrivateFile->FileName);
-
-  //
-  // Make full pathname from new filename and rootpath.
-  //
-  if (NewFileInfo->FileName[0] == '\\') {
-    NewFileName = malloc (AsciiStrLen (PrivateRoot->FilePath) + 1 + StrLen (NewFileInfo->FileName) + 1);
-    if (NewFileName == NULL) {
-      goto Done;
-    }
-
-    AsciiStrCpy (NewFileName, PrivateRoot->FilePath);
-    AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);
-    UnicodeFilePtr = NewFileInfo->FileName + 1;
-    *AsciiFilePtr++ ='/';
-  } else {
-    NewFileName = malloc (AsciiStrLen (PrivateFile->FileName) + 2 + StrLen (NewFileInfo->FileName) + 1);
-    if (NewFileName == NULL) {
-      goto Done;
-    }
-
-    AsciiStrCpy (NewFileName, PrivateRoot->FilePath);
-    AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);
-    if ((AsciiFilePtr[-1] != '/') && (NewFileInfo->FileName[0] != '/')) {
-      // make sure there is a / between Root FilePath and NewFileInfo Filename
-      AsciiFilePtr[0] = '/';
-      AsciiFilePtr[1] = '\0';
-      AsciiFilePtr++;
-    }
-    UnicodeFilePtr = NewFileInfo->FileName;
-  }
-  // Convert to ascii.
-  while (*UnicodeFilePtr) {
-    *AsciiFilePtr++ = *UnicodeFilePtr++;
-  }
-  *AsciiFilePtr = 0;
-
-  //
-  // Is there an attribute change request?
-  //
-  if (NewFileInfo->Attribute != OldFileInfo->Attribute) {
-    if ((NewFileInfo->Attribute & EFI_FILE_DIRECTORY) != (OldFileInfo->Attribute & EFI_FILE_DIRECTORY)) {
-      Status = EFI_INVALID_PARAMETER;
-      goto Done;
-    }
-
-    AttrChangeFlag = TRUE;
-  }
-
-  //
-  // Is there a name change request?
-  // bugbug: - Should really use EFI_UNICODE_COLLATION_PROTOCOL
-  //
-  if (StrCmp (NewFileInfo->FileName, OldFileInfo->FileName)) {
-    NameChangeFlag = TRUE;
-  }
-
-  //
-  // Is there a size change request?
-  //
-  if (NewFileInfo->FileSize != OldFileInfo->FileSize) {
-    SizeChangeFlag = TRUE;
-  }
-
-  //
-  // Is there a time stamp change request?
-  //
-  if (!IsZero (&NewFileInfo->CreateTime, sizeof (EFI_TIME)) &&
-      CompareMem (&NewFileInfo->CreateTime, &OldFileInfo->CreateTime, sizeof (EFI_TIME))
-      ) {
-    TimeChangeFlag = TRUE;
-  } else if (!IsZero (&NewFileInfo->LastAccessTime, sizeof (EFI_TIME)) &&
-             CompareMem (&NewFileInfo->LastAccessTime, &OldFileInfo->LastAccessTime, sizeof (EFI_TIME))
-             ) {
-    TimeChangeFlag = TRUE;
-  } else if (!IsZero (&NewFileInfo->ModificationTime, sizeof (EFI_TIME)) &&
-             CompareMem (&NewFileInfo->ModificationTime, &OldFileInfo->ModificationTime, sizeof (EFI_TIME))
-             ) {
-    TimeChangeFlag = TRUE;
-  }
-
-  //
-  // All done if there are no change requests being made.
-  //
-  if (!(AttrChangeFlag || NameChangeFlag || SizeChangeFlag || TimeChangeFlag)) {
-    Status = EFI_SUCCESS;
-    goto Done;
-  }
-
-  //
-  // Set file or directory information.
-  //
-  if (stat (OldFileName, &OldAttr) != 0) {
-    Status = ErrnoToEfiStatus ();
-    goto Done;
-  }
-
-  //
-  // Name change.
-  //
-  if (NameChangeFlag) {
-    //
-    // Close the handles first
-    //
-    if (PrivateFile->IsOpenedByRead) {
-      Status = EFI_ACCESS_DENIED;
-      goto Done;
-    }
-
-    for (CharPointer = NewFileName; *CharPointer != 0 && *CharPointer != L'/'; CharPointer++) {
-    }
-
-    if (*CharPointer != 0) {
-      Status = EFI_ACCESS_DENIED;
-      goto Done;
-    }
-
-    UnixStatus = rename (OldFileName, NewFileName);
-    if (UnixStatus == 0) {
-      //
-      // modify file name
-      //
-      free (PrivateFile->FileName);
-
-      PrivateFile->FileName = malloc (AsciiStrSize (NewFileName));
-      if (PrivateFile->FileName == NULL) {
-        goto Done;
-      }
-
-      AsciiStrCpy (PrivateFile->FileName, NewFileName);
-    } else {
-      Status    = EFI_DEVICE_ERROR;
-      goto Done;
-    }
-  }
-
-  //
-  //  Size change
-  //
-  if (SizeChangeFlag) {
-    if (PrivateFile->IsDirectoryPath) {
-      Status = EFI_UNSUPPORTED;
-      goto Done;
-    }
-
-    if (PrivateFile->IsOpenedByRead || OldFileInfo->Attribute & EFI_FILE_READ_ONLY) {
-      Status = EFI_ACCESS_DENIED;
-      goto Done;
-    }
-
-    if (ftruncate (PrivateFile->fd, NewFileInfo->FileSize) != 0) {
-      Status = ErrnoToEfiStatus ();
-      goto Done;
-    }
-
-  }
-
-  //
-  // Time change
-  //
-  if (TimeChangeFlag) {
-    NewLastAccessSystemTime.tm_year    = NewFileInfo->LastAccessTime.Year;
-    NewLastAccessSystemTime.tm_mon     = NewFileInfo->LastAccessTime.Month;
-    NewLastAccessSystemTime.tm_mday    = NewFileInfo->LastAccessTime.Day;
-    NewLastAccessSystemTime.tm_hour    = NewFileInfo->LastAccessTime.Hour;
-    NewLastAccessSystemTime.tm_min     = NewFileInfo->LastAccessTime.Minute;
-    NewLastAccessSystemTime.tm_sec     = NewFileInfo->LastAccessTime.Second;
-    NewLastAccessSystemTime.tm_isdst   = 0;
-
-    Utime.actime = mktime (&NewLastAccessSystemTime);
-
-    NewLastWriteSystemTime.tm_year    = NewFileInfo->ModificationTime.Year;
-    NewLastWriteSystemTime.tm_mon     = NewFileInfo->ModificationTime.Month;
-    NewLastWriteSystemTime.tm_mday    = NewFileInfo->ModificationTime.Day;
-    NewLastWriteSystemTime.tm_hour    = NewFileInfo->ModificationTime.Hour;
-    NewLastWriteSystemTime.tm_min     = NewFileInfo->ModificationTime.Minute;
-    NewLastWriteSystemTime.tm_sec     = NewFileInfo->ModificationTime.Second;
-    NewLastWriteSystemTime.tm_isdst   = 0;
-
-    Utime.modtime = mktime (&NewLastWriteSystemTime);
-
-    if (Utime.actime == (time_t)-1 || Utime.modtime == (time_t)-1) {
-      goto Done;
-    }
-
-    if (utime (PrivateFile->FileName, &Utime) == -1) {
-      Status = ErrnoToEfiStatus ();
-      goto Done;
-    }
-  }
-
-  //
-  // No matter about AttrChangeFlag, Attribute must be set.
-  // Because operation before may cause attribute change.
-  //
-  NewAttr = OldAttr.st_mode;
-
-  if (NewFileInfo->Attribute & EFI_FILE_READ_ONLY) {
-    NewAttr &= ~(S_IRUSR | S_IRGRP | S_IROTH);
-  } else {
-    NewAttr |= S_IRUSR;
-  }
-
-  if (chmod (NewFileName, NewAttr) != 0) {
-    Status = ErrnoToEfiStatus ();
-  }
-
-Done:
-  if (OldFileInfo != NULL) {
-    free (OldFileInfo);
-  }
-
-  if (OldFileName != NULL) {
-    free (OldFileName);
-  }
-
-  if (NewFileName != NULL) {
-    free (NewFileName);
-  }
-
-  return Status;
-}
-
-
-/**
-  Flush data back for the file handle.
-
-  @param  This Protocol instance pointer.
-
-  @retval EFI_SUCCESS          Data was written.
-  @retval EFI_UNSUPPORTED      Writes to Open directory are not supported.
-  @retval EFI_NO_MEDIA         The device has no media.
-  @retval EFI_DEVICE_ERROR     The device reported an error.
-  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
-  @retval EFI_WRITE_PROTECTED  The device is write protected.
-  @retval EFI_ACCESS_DENIED    The file was open for read only.
-  @retval EFI_VOLUME_FULL      The volume is full.
-
-**/
-EFI_STATUS
-PosixFileFlush (
-  IN EFI_FILE_PROTOCOL  *This
-  )
-{
-  EMU_EFI_FILE_PRIVATE     *PrivateFile;
-
-
-  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
-
-  if (PrivateFile->IsDirectoryPath) {
-    return EFI_UNSUPPORTED;
-  }
-
-  if (PrivateFile->IsOpenedByRead) {
-    return EFI_ACCESS_DENIED;
-  }
-
-  if (PrivateFile->fd < 0) {
-    return EFI_DEVICE_ERROR;
-  }
-
-  if (fsync (PrivateFile->fd) != 0) {
-    return ErrnoToEfiStatus ();
-  }
-
-  return EFI_SUCCESS;
-}
-
-
-
-EFI_STATUS
-PosixFileSystmeThunkOpen (
-  IN  EMU_IO_THUNK_PROTOCOL   *This
-  )
-{
-  EMU_SIMPLE_FILE_SYSTEM_PRIVATE  *Private;
-  UINTN                           i;
-
-  if (This->Private != NULL) {
-    return EFI_ALREADY_STARTED;
-  }
-
-  if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {
-    return EFI_UNSUPPORTED;
-  }
-
-  Private = malloc (sizeof (EMU_SIMPLE_FILE_SYSTEM_PRIVATE));
-  if (Private == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  Private->FilePath = malloc (StrLen (This->ConfigString) + 1);
-  if (Private->FilePath == NULL) {
-    free (Private);
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  // Convert Unicode to Ascii
-  for (i = 0; This->ConfigString[i] != 0; i++) {
-    Private->FilePath[i] = This->ConfigString[i];
-  }
-  Private->FilePath[i] = 0;
-
-
-  Private->VolumeLabel = malloc (StrSize (L"EFI_EMULATED"));
-  if (Private->VolumeLabel == NULL) {
-    free (Private->FilePath);
-    free (Private);
-    return EFI_OUT_OF_RESOURCES;
-  }
-  StrCpy (Private->VolumeLabel, L"EFI_EMULATED");
-
-  Private->Signature = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE;
-  Private->Thunk     = This;
-  CopyMem (&Private->SimpleFileSystem, &gPosixFileSystemProtocol, sizeof (Private->SimpleFileSystem));
-  Private->FileHandlesOpen = FALSE;
-
-  This->Interface = &Private->SimpleFileSystem;
-  This->Private   = Private;
-  return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-PosixFileSystmeThunkClose (
-  IN  EMU_IO_THUNK_PROTOCOL   *This
-  )
-{
-  EMU_SIMPLE_FILE_SYSTEM_PRIVATE  *Private;
-
-  if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {
-    return EFI_UNSUPPORTED;
-  }
-
-  Private = This->Private;
-
-  if (Private->FileHandlesOpen) {
-    //
-    // Close only supported if all the EFI_FILE_HANDLEs have been closed.
-    //
-    return EFI_NOT_READY;
-  }
-
-  if (This->Private != NULL) {
-    if (Private->VolumeLabel != NULL) {
-      free (Private->VolumeLabel);
-    }
-    free (This->Private);
-    This->Private = NULL;
-  }
-
-  return EFI_SUCCESS;
-}
-
-
-EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo = {
-  &gEfiSimpleFileSystemProtocolGuid,
-  NULL,
-  NULL,
-  0,
-  GasketPosixFileSystmeThunkOpen,
-  GasketPosixFileSystmeThunkClose,
-  NULL
-};
-
-
+/*++ @file
+ POSIX Pthreads to emulate APs and implement threads
+
+Copyright (c) 2011, Apple Inc. All rights reserved.
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+
+**/
+
+#include "Host.h"
+
+
+#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'P', 'f', 's')
+
+typedef struct {
+  UINTN                           Signature;
+  EMU_IO_THUNK_PROTOCOL           *Thunk;
+  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL SimpleFileSystem;
+  CHAR8                           *FilePath;
+  CHAR16                          *VolumeLabel;
+  BOOLEAN                         FileHandlesOpen;
+} EMU_SIMPLE_FILE_SYSTEM_PRIVATE;
+
+#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS(a) \
+  CR (a, \
+      EMU_SIMPLE_FILE_SYSTEM_PRIVATE, \
+      SimpleFileSystem, \
+      EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE \
+      )
+
+
+#define EMU_EFI_FILE_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'P', 'f', 'i')
+
+typedef struct {
+  UINTN                           Signature;
+  EMU_IO_THUNK_PROTOCOL           *Thunk;
+  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;
+  EFI_FILE_PROTOCOL               EfiFile;
+  int                             fd;
+  DIR                             *Dir;
+  BOOLEAN                         IsRootDirectory;
+  BOOLEAN                         IsDirectoryPath;
+  BOOLEAN                         IsOpenedByRead;
+  char                            *FileName;
+  struct dirent                   *Dirent;
+} EMU_EFI_FILE_PRIVATE;
+
+#define EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS(a) \
+  CR (a, \
+      EMU_EFI_FILE_PRIVATE, \
+      EfiFile, \
+      EMU_EFI_FILE_PRIVATE_SIGNATURE \
+      )
+
+EFI_STATUS
+PosixFileGetInfo (
+  IN EFI_FILE_PROTOCOL        *This,
+  IN EFI_GUID                 *InformationType,
+  IN OUT UINTN                *BufferSize,
+  OUT VOID                    *Buffer
+  );
+
+EFI_STATUS
+PosixFileSetInfo (
+  IN EFI_FILE_PROTOCOL        *This,
+  IN EFI_GUID                 *InformationType,
+  IN UINTN                    BufferSize,
+  IN VOID                     *Buffer
+  );
+
+
+EFI_FILE_PROTOCOL gPosixFileProtocol = {
+  EFI_FILE_REVISION,
+  GasketPosixFileOpen,
+  GasketPosixFileCLose,
+  GasketPosixFileDelete,
+  GasketPosixFileRead,
+  GasketPosixFileWrite,
+  GasketPosixFileGetPossition,
+  GasketPosixFileSetPossition,
+  GasketPosixFileGetInfo,
+  GasketPosixFileSetInfo,
+  GasketPosixFileFlush
+};
+
+EFI_SIMPLE_FILE_SYSTEM_PROTOCOL gPosixFileSystemProtocol = {
+  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION,
+  GasketPosixOpenVolume,
+};
+
+
+/**
+  Open the root directory on a volume.
+
+  @param  This Protocol instance pointer.
+  @param  Root Returns an Open file handle for the root directory
+
+  @retval EFI_SUCCESS          The device was opened.
+  @retval EFI_UNSUPPORTED      This volume does not support the file system.
+  @retval EFI_NO_MEDIA         The device has no media.
+  @retval EFI_DEVICE_ERROR     The device reported an error.
+  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
+  @retval EFI_ACCESS_DENIED    The service denied access to the file.
+  @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of resources.
+
+**/
+EFI_STATUS
+PosixOpenVolume (
+  IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL    *This,
+  OUT EFI_FILE_PROTOCOL                 **Root
+  )
+{
+  EFI_STATUS                        Status;
+  EMU_SIMPLE_FILE_SYSTEM_PRIVATE    *Private;
+  EMU_EFI_FILE_PRIVATE              *PrivateFile;
+
+  Private     = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (This);
+
+  Status = EFI_OUT_OF_RESOURCES;
+  PrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));
+  if (PrivateFile == NULL) {
+    goto Done;
+  }
+
+  PrivateFile->FileName = malloc (AsciiStrSize (Private->FilePath));
+  if (PrivateFile->FileName == NULL) {
+    goto Done;
+  }
+  AsciiStrCpy (PrivateFile->FileName, Private->FilePath);
+
+  PrivateFile->Signature            = EMU_EFI_FILE_PRIVATE_SIGNATURE;
+  PrivateFile->Thunk                = Private->Thunk;
+  PrivateFile->SimpleFileSystem     = This;
+  PrivateFile->IsRootDirectory      = TRUE;
+  PrivateFile->IsDirectoryPath      = TRUE;
+  PrivateFile->IsOpenedByRead       = TRUE;
+
+  CopyMem (&PrivateFile->EfiFile, &gPosixFileProtocol, sizeof (EFI_FILE_PROTOCOL));
+
+  PrivateFile->fd                   = -1;
+  PrivateFile->Dir                  = NULL;
+  PrivateFile->Dirent               = NULL;
+
+  *Root = &PrivateFile->EfiFile;
+
+  PrivateFile->Dir = opendir (PrivateFile->FileName);
+  if (PrivateFile->Dir == NULL) {
+    Status = EFI_ACCESS_DENIED;
+  } else {
+    Status = EFI_SUCCESS;
+  }
+
+Done:
+  if (EFI_ERROR (Status)) {
+    if (PrivateFile != NULL) {
+      if (PrivateFile->FileName != NULL) {
+        free (PrivateFile->FileName);
+      }
+
+      free (PrivateFile);
+    }
+
+    *Root = NULL;
+  }
+
+  return Status;
+}
+
+
+EFI_STATUS
+ErrnoToEfiStatus ()
+{
+  switch (errno) {
+  case EACCES:
+    return EFI_ACCESS_DENIED;
+
+  case EDQUOT:
+  case ENOSPC:
+    return EFI_VOLUME_FULL;
+
+  default:
+    return EFI_DEVICE_ERROR;
+  }
+}
+
+VOID
+CutPrefix (
+  IN  CHAR8  *Str,
+  IN  UINTN   Count
+  )
+{
+  CHAR8  *Pointer;
+
+  if (AsciiStrLen (Str) < Count) {
+    ASSERT (0);
+  }
+
+  for (Pointer = Str; *(Pointer + Count); Pointer++) {
+    *Pointer = *(Pointer + Count);
+  }
+
+  *Pointer = *(Pointer + Count);
+}
+
+
+VOID
+PosixSystemTimeToEfiTime (
+  IN  time_t                SystemTime,
+  OUT EFI_TIME              *Time
+  )
+{
+  struct tm *tm;
+
+  tm           = gmtime (&SystemTime);
+  Time->Year   = tm->tm_year;
+  Time->Month  = tm->tm_mon + 1;
+  Time->Day    = tm->tm_mday;
+  Time->Hour   = tm->tm_hour;
+  Time->Minute = tm->tm_min;
+  Time->Second = tm->tm_sec;
+  Time->Nanosecond = 0;
+
+  Time->TimeZone = timezone;
+  Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0) | (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
+}
+
+
+EFI_STATUS
+UnixSimpleFileSystemFileInfo (
+  EMU_EFI_FILE_PRIVATE            *PrivateFile,
+  IN     CHAR8                    *FileName,
+  IN OUT UINTN                    *BufferSize,
+  OUT    VOID                     *Buffer
+  )
+{
+  EFI_STATUS                  Status;
+  UINTN                       Size;
+  UINTN                       NameSize;
+  UINTN                       ResultSize;
+  EFI_FILE_INFO               *Info;
+  CHAR8                       *RealFileName;
+  CHAR8                       *TempPointer;
+  CHAR16                      *BufferFileName;
+  struct stat                 buf;
+
+  if (FileName != NULL) {
+    RealFileName = FileName;
+  } else if (PrivateFile->IsRootDirectory) {
+    RealFileName = "";
+  } else {
+    RealFileName  = PrivateFile->FileName;
+  }
+
+  TempPointer = RealFileName;
+  while (*TempPointer) {
+    if (*TempPointer == '/') {
+      RealFileName = TempPointer + 1;
+    }
+
+    TempPointer++;
+  }
+
+  Size        = SIZE_OF_EFI_FILE_INFO;
+  NameSize    = AsciiStrSize (RealFileName) * 2;
+  ResultSize  = Size + NameSize;
+
+  if (*BufferSize < ResultSize) {
+    *BufferSize = ResultSize;
+    return EFI_BUFFER_TOO_SMALL;
+  }
+  if (stat (FileName == NULL ? PrivateFile->FileName : FileName, &buf) < 0) {
+    return EFI_DEVICE_ERROR;
+  }
+
+  Status  = EFI_SUCCESS;
+
+  Info    = Buffer;
+  ZeroMem (Info, ResultSize);
+
+  Info->Size          = ResultSize;
+  Info->FileSize      = buf.st_size;
+  Info->PhysicalSize  = MultU64x32 (buf.st_blocks, buf.st_blksize);
+
+  PosixSystemTimeToEfiTime (buf.st_ctime, &Info->CreateTime);
+  PosixSystemTimeToEfiTime (buf.st_atime, &Info->LastAccessTime);
+  PosixSystemTimeToEfiTime (buf.st_mtime, &Info->ModificationTime);
+
+  if (!(buf.st_mode & S_IWUSR)) {
+    Info->Attribute |= EFI_FILE_READ_ONLY;
+  }
+
+  if (S_ISDIR(buf.st_mode)) {
+    Info->Attribute |= EFI_FILE_DIRECTORY;
+  }
+
+
+  BufferFileName = (CHAR16 *)((CHAR8 *) Buffer + Size);
+  while (*RealFileName) {
+    *BufferFileName++ = *RealFileName++;
+  }
+  *BufferFileName = 0;
+
+  *BufferSize = ResultSize;
+  return Status;
+}
+
+BOOLEAN
+IsZero (
+  IN VOID   *Buffer,
+  IN UINTN  Length
+  )
+{
+  if (Buffer == NULL || Length == 0) {
+    return FALSE;
+  }
+
+  if (*(UINT8 *) Buffer != 0) {
+    return FALSE;
+  }
+
+  if (Length > 1) {
+    if (!CompareMem (Buffer, (UINT8 *) Buffer + 1, Length - 1)) {
+      return FALSE;
+    }
+  }
+
+  return TRUE;
+}
+
+
+
+/**
+  Opens a new file relative to the source file's location.
+
+  @param  This       The protocol instance pointer.
+  @param  NewHandle  Returns File Handle for FileName.
+  @param  FileName   Null terminated string. "\", ".", and ".." are supported.
+  @param  OpenMode   Open mode for file.
+  @param  Attributes Only used for EFI_FILE_MODE_CREATE.
+
+  @retval EFI_SUCCESS          The device was opened.
+  @retval EFI_NOT_FOUND        The specified file could not be found on the device.
+  @retval EFI_NO_MEDIA         The device has no media.
+  @retval EFI_MEDIA_CHANGED    The media has changed.
+  @retval EFI_DEVICE_ERROR     The device reported an error.
+  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
+  @retval EFI_ACCESS_DENIED    The service denied access to the file.
+  @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of resources.
+  @retval EFI_VOLUME_FULL      The volume is full.
+
+**/
+EFI_STATUS
+PosixFileOpen (
+  IN EFI_FILE_PROTOCOL        *This,
+  OUT EFI_FILE_PROTOCOL       **NewHandle,
+  IN CHAR16                   *FileName,
+  IN UINT64                   OpenMode,
+  IN UINT64                   Attributes
+  )
+{
+  EFI_FILE_PROTOCOL                 *Root;
+  EMU_EFI_FILE_PRIVATE              *PrivateFile;
+  EMU_EFI_FILE_PRIVATE              *NewPrivateFile;
+  EMU_SIMPLE_FILE_SYSTEM_PRIVATE    *PrivateRoot;
+  EFI_STATUS                        Status;
+  CHAR16                            *Src;
+  char                              *Dst;
+  CHAR8                             *RealFileName;
+  char                              *ParseFileName;
+  char                              *GuardPointer;
+  CHAR8                             TempChar;
+  UINTN                             Count;
+  BOOLEAN                           TrailingDash;
+  BOOLEAN                           LoopFinish;
+  UINTN                             InfoSize;
+  EFI_FILE_INFO                     *Info;
+  struct stat                       finfo;
+  int                               res;
+
+
+  PrivateFile     = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
+  PrivateRoot     = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (PrivateFile->SimpleFileSystem);
+  NewPrivateFile  = NULL;
+  Status          = EFI_OUT_OF_RESOURCES;
+
+  //
+  // BUGBUG: assume an open of root
+  // if current location, return current data
+  //
+  TrailingDash = FALSE;
+  if ((StrCmp (FileName, L"\\") == 0) ||
+      (StrCmp (FileName, L".") == 0 && PrivateFile->IsRootDirectory)) {
+OpenRoot:
+    Status          = PosixOpenVolume (PrivateFile->SimpleFileSystem, &Root);
+    NewPrivateFile  = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (Root);
+    goto Done;
+  }
+
+  if (FileName[StrLen (FileName) - 1] == L'\\') {
+    TrailingDash = TRUE;
+    FileName[StrLen (FileName) - 1]  = 0;
+  }
+
+  //
+  // Attempt to open the file
+  //
+  NewPrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));
+  if (NewPrivateFile == NULL) {
+    goto Done;
+  }
+
+  CopyMem (NewPrivateFile, PrivateFile, sizeof (EMU_EFI_FILE_PRIVATE));
+
+  NewPrivateFile->FileName = malloc (AsciiStrSize (PrivateFile->FileName) + 1 + StrLen (FileName) + 1);
+  if (NewPrivateFile->FileName == NULL) {
+    goto Done;
+  }
+
+  if (*FileName == L'\\') {
+    AsciiStrCpy (NewPrivateFile->FileName, PrivateRoot->FilePath);
+    // Skip first '\'.
+    Src = FileName + 1;
+  } else {
+    AsciiStrCpy (NewPrivateFile->FileName, PrivateFile->FileName);
+    Src = FileName;
+  }
+  Dst = NewPrivateFile->FileName + AsciiStrLen (NewPrivateFile->FileName);
+  GuardPointer = NewPrivateFile->FileName + AsciiStrLen (PrivateRoot->FilePath);
+  *Dst++ = '/';
+  // Convert unicode to ascii and '\' to '/'
+  while (*Src) {
+    if (*Src == '\\') {
+      *Dst++ = '/';
+    } else {
+      *Dst++ = *Src;
+    }
+    Src++;
+  }
+  *Dst = 0;
+
+
+  //
+  // Get rid of . and .., except leading . or ..
+  //
+
+  //
+  // GuardPointer protect simplefilesystem root path not be destroyed
+  //
+
+  LoopFinish    = FALSE;
+  while (!LoopFinish) {
+    LoopFinish = TRUE;
+
+    for (ParseFileName = GuardPointer; *ParseFileName; ParseFileName++) {
+      if (*ParseFileName == '.' &&
+          (*(ParseFileName + 1) == 0 || *(ParseFileName + 1) == '/') &&
+          *(ParseFileName - 1) == '/'
+          ) {
+
+        //
+        // cut /.
+        //
+        CutPrefix (ParseFileName - 1, 2);
+        LoopFinish = FALSE;
+        break;
+      }
+
+      if (*ParseFileName == '.' &&
+          *(ParseFileName + 1) == '.' &&
+          (*(ParseFileName + 2) == 0 || *(ParseFileName + 2) == '/') &&
+          *(ParseFileName - 1) == '/'
+          ) {
+
+        ParseFileName--;
+        Count = 3;
+
+        while (ParseFileName != GuardPointer) {
+          ParseFileName--;
+          Count++;
+          if (*ParseFileName == '/') {
+            break;
+          }
+        }
+
+        //
+        // cut /.. and its left directory
+        //
+        CutPrefix (ParseFileName, Count);
+        LoopFinish = FALSE;
+        break;
+      }
+    }
+  }
+
+  if (AsciiStrCmp (NewPrivateFile->FileName, PrivateRoot->FilePath) == 0) {
+    NewPrivateFile->IsRootDirectory = TRUE;
+    free (NewPrivateFile->FileName);
+    free (NewPrivateFile);
+    goto OpenRoot;
+  }
+
+  RealFileName = NewPrivateFile->FileName + AsciiStrLen(NewPrivateFile->FileName) - 1;
+  while (RealFileName > NewPrivateFile->FileName && *RealFileName != '/') {
+    RealFileName--;
+  }
+
+  TempChar            = *(RealFileName - 1);
+  *(RealFileName - 1) = 0;
+  *(RealFileName - 1) = TempChar;
+
+
+  //
+  // Test whether file or directory
+  //
+  NewPrivateFile->IsRootDirectory = FALSE;
+  NewPrivateFile->fd = -1;
+  NewPrivateFile->Dir = NULL;
+  if (OpenMode & EFI_FILE_MODE_CREATE) {
+    if (Attributes & EFI_FILE_DIRECTORY) {
+      NewPrivateFile->IsDirectoryPath = TRUE;
+    } else {
+      NewPrivateFile->IsDirectoryPath = FALSE;
+    }
+  } else {
+    res = stat (NewPrivateFile->FileName, &finfo);
+    if (res == 0 && S_ISDIR(finfo.st_mode)) {
+      NewPrivateFile->IsDirectoryPath = TRUE;
+    } else {
+      NewPrivateFile->IsDirectoryPath = FALSE;
+    }
+  }
+
+  if (OpenMode & EFI_FILE_MODE_WRITE) {
+    NewPrivateFile->IsOpenedByRead = FALSE;
+  } else {
+    NewPrivateFile->IsOpenedByRead = TRUE;
+  }
+
+  Status = EFI_SUCCESS;
+
+  //
+  // deal with directory
+  //
+  if (NewPrivateFile->IsDirectoryPath) {
+    if ((OpenMode & EFI_FILE_MODE_CREATE)) {
+      //
+      // Create a directory
+      //
+      if (mkdir (NewPrivateFile->FileName, 0777) != 0) {
+        if (errno != EEXIST) {
+          //free (TempFileName);
+          Status = EFI_ACCESS_DENIED;
+          goto Done;
+        }
+      }
+    }
+
+    NewPrivateFile->Dir = opendir (NewPrivateFile->FileName);
+    if (NewPrivateFile->Dir == NULL) {
+      if (errno == EACCES) {
+        Status = EFI_ACCESS_DENIED;
+      } else {
+        Status = EFI_NOT_FOUND;
+      }
+
+      goto Done;
+    }
+
+  } else {
+    //
+    // deal with file
+    //
+    NewPrivateFile->fd = open (
+                          NewPrivateFile->FileName,
+                          ((OpenMode & EFI_FILE_MODE_CREATE) ? O_CREAT : 0) | (NewPrivateFile->IsOpenedByRead ? O_RDONLY : O_RDWR),
+                          0666
+                          );
+    if (NewPrivateFile->fd < 0) {
+      if (errno == ENOENT) {
+        Status = EFI_NOT_FOUND;
+      } else {
+        Status = EFI_ACCESS_DENIED;
+      }
+    }
+  }
+
+  if ((OpenMode & EFI_FILE_MODE_CREATE) && Status == EFI_SUCCESS) {
+    //
+    // Set the attribute
+    //
+    InfoSize  = 0;
+    Info      = NULL;
+    Status    = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, &InfoSize, Info);
+    if (Status != EFI_BUFFER_TOO_SMALL) {
+      Status = EFI_DEVICE_ERROR;
+      goto Done;
+    }
+
+    Info = malloc (InfoSize);
+    if (Info == NULL) {
+      goto Done;
+    }
+
+    Status = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, &InfoSize, Info);
+    if (EFI_ERROR (Status)) {
+      goto Done;
+    }
+
+    Info->Attribute = Attributes;
+    PosixFileSetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, InfoSize, Info);
+
+    free (Info);
+  }
+
+Done: ;
+  if (TrailingDash) {
+    FileName[StrLen (FileName) + 1]  = 0;
+    FileName[StrLen (FileName)]      = L'\\';
+  }
+
+  if (EFI_ERROR (Status)) {
+    if (NewPrivateFile) {
+      if (NewPrivateFile->FileName) {
+        free (NewPrivateFile->FileName);
+      }
+
+      free (NewPrivateFile);
+    }
+  } else {
+    *NewHandle = &NewPrivateFile->EfiFile;
+  }
+
+  return Status;
+}
+
+
+
+/**
+  Close the file handle
+
+  @param  This          Protocol instance pointer.
+
+  @retval EFI_SUCCESS   The device was opened.
+
+**/
+EFI_STATUS
+PosixFileCLose (
+  IN EFI_FILE_PROTOCOL  *This
+  )
+{
+  EMU_EFI_FILE_PRIVATE *PrivateFile;
+
+  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
+
+  if (PrivateFile->fd >= 0) {
+    close (PrivateFile->fd);
+  }
+  if (PrivateFile->Dir != NULL) {
+    closedir (PrivateFile->Dir);
+  }
+
+  PrivateFile->fd = -1;
+  PrivateFile->Dir = NULL;
+
+  if (PrivateFile->FileName) {
+    free (PrivateFile->FileName);
+  }
+
+  free (PrivateFile);
+
+  return EFI_SUCCESS;
+}
+
+
+/**
+  Close and delete the file handle.
+
+  @param  This                     Protocol instance pointer.
+
+  @retval EFI_SUCCESS              The device was opened.
+  @retval EFI_WARN_DELETE_FAILURE  The handle was closed but the file was not deleted.
+
+**/
+EFI_STATUS
+PosixFileDelete (
+  IN EFI_FILE_PROTOCOL  *This
+  )
+{
+  EFI_STATUS              Status;
+  EMU_EFI_FILE_PRIVATE   *PrivateFile;
+
+  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
+  Status      = EFI_WARN_DELETE_FAILURE;
+
+  if (PrivateFile->IsDirectoryPath) {
+    if (PrivateFile->Dir != NULL) {
+      closedir (PrivateFile->Dir);
+      PrivateFile->Dir = NULL;
+    }
+
+    if (rmdir (PrivateFile->FileName) == 0) {
+      Status = EFI_SUCCESS;
+    }
+  } else {
+    close (PrivateFile->fd);
+    PrivateFile->fd = -1;
+
+    if (!PrivateFile->IsOpenedByRead) {
+      if (!unlink (PrivateFile->FileName)) {
+        Status = EFI_SUCCESS;
+      }
+    }
+  }
+
+  free (PrivateFile->FileName);
+  free (PrivateFile);
+
+  return Status;
+}
+
+
+/**
+  Read data from the file.
+
+  @param  This       Protocol instance pointer.
+  @param  BufferSize On input size of buffer, on output amount of data in buffer.
+  @param  Buffer     The buffer in which data is read.
+
+  @retval EFI_SUCCESS          Data was read.
+  @retval EFI_NO_MEDIA         The device has no media.
+  @retval EFI_DEVICE_ERROR     The device reported an error.
+  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
+  @retval EFI_BUFFER_TO_SMALL  BufferSize is too small. BufferSize contains required size.
+
+**/
+EFI_STATUS
+PosixFileRead (
+  IN EFI_FILE_PROTOCOL        *This,
+  IN OUT UINTN                *BufferSize,
+  OUT VOID                    *Buffer
+  )
+{
+  EMU_EFI_FILE_PRIVATE    *PrivateFile;
+  EFI_STATUS              Status;
+  int                     Res;
+  UINTN                   Size;
+  UINTN                   NameSize;
+  UINTN                   ResultSize;
+  CHAR8                   *FullFileName;
+
+
+  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
+
+  if (!PrivateFile->IsDirectoryPath) {
+    if (PrivateFile->fd < 0) {
+      Status = EFI_DEVICE_ERROR;
+      goto Done;
+    }
+
+    Res = read (PrivateFile->fd, Buffer, *BufferSize);
+    if (Res < 0) {
+      Status = EFI_DEVICE_ERROR;
+      goto Done;
+    }
+    *BufferSize = Res;
+    Status = EFI_SUCCESS;
+    goto Done;
+  }
+
+  //
+  // Read on a directory.
+  //
+  if (PrivateFile->Dir == NULL) {
+    Status = EFI_DEVICE_ERROR;
+    goto Done;
+  }
+
+  if (PrivateFile->Dirent == NULL) {
+    PrivateFile->Dirent = readdir (PrivateFile->Dir);
+    if (PrivateFile->Dirent == NULL) {
+      *BufferSize = 0;
+      Status = EFI_SUCCESS;
+      goto Done;
+    }
+  }
+
+  Size        = SIZE_OF_EFI_FILE_INFO;
+  NameSize    = AsciiStrLen (PrivateFile->Dirent->d_name) + 1;
+  ResultSize  = Size + 2 * NameSize;
+
+  if (*BufferSize < ResultSize) {
+    *BufferSize = ResultSize;
+    Status = EFI_BUFFER_TOO_SMALL;
+    goto Done;
+  }
+  Status  = EFI_SUCCESS;
+
+  *BufferSize = ResultSize;
+
+  FullFileName = malloc (AsciiStrLen(PrivateFile->FileName) + 1 + NameSize);
+  if (FullFileName == NULL) {
+    Status = EFI_OUT_OF_RESOURCES;
+    goto Done;
+  }
+
+  AsciiStrCpy (FullFileName, PrivateFile->FileName);
+  AsciiStrCat (FullFileName, "/");
+  AsciiStrCat (FullFileName, PrivateFile->Dirent->d_name);
+  Status = UnixSimpleFileSystemFileInfo (
+            PrivateFile,
+            FullFileName,
+            BufferSize,
+            Buffer
+            );
+  free (FullFileName);
+
+  PrivateFile->Dirent = NULL;
+
+Done:
+  return Status;
+}
+
+
+
+/**
+  Write data to a file.
+
+  @param  This       Protocol instance pointer.
+  @param  BufferSize On input size of buffer, on output amount of data in buffer.
+  @param  Buffer     The buffer in which data to write.
+
+  @retval EFI_SUCCESS          Data was written.
+  @retval EFI_UNSUPPORTED      Writes to Open directory are not supported.
+  @retval EFI_NO_MEDIA         The device has no media.
+  @retval EFI_DEVICE_ERROR     The device reported an error.
+  @retval EFI_DEVICE_ERROR     An attempt was made to write to a deleted file.
+  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
+  @retval EFI_WRITE_PROTECTED  The device is write protected.
+  @retval EFI_ACCESS_DENIED    The file was open for read only.
+  @retval EFI_VOLUME_FULL      The volume is full.
+
+**/
+EFI_STATUS
+PosixFileWrite (
+  IN EFI_FILE_PROTOCOL        *This,
+  IN OUT UINTN                *BufferSize,
+  IN VOID                     *Buffer
+  )
+{
+  EMU_EFI_FILE_PRIVATE  *PrivateFile;
+  int                   Res;
+
+
+  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
+
+  if (PrivateFile->fd < 0) {
+    return EFI_DEVICE_ERROR;
+  }
+
+  if (PrivateFile->IsDirectoryPath) {
+    return EFI_UNSUPPORTED;
+  }
+
+  if (PrivateFile->IsOpenedByRead) {
+    return EFI_ACCESS_DENIED;
+  }
+
+  Res = write (PrivateFile->fd, Buffer, *BufferSize);
+  if (Res == (UINTN)-1) {
+    return ErrnoToEfiStatus ();
+  }
+
+  *BufferSize = Res;
+  return EFI_SUCCESS;
+}
+
+
+
+/**
+  Set a files current position
+
+  @param  This            Protocol instance pointer.
+  @param  Position        Byte position from the start of the file.
+
+  @retval EFI_SUCCESS     Data was written.
+  @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open.
+
+**/
+EFI_STATUS
+PosixFileSetPossition (
+  IN EFI_FILE_PROTOCOL        *This,
+  IN UINT64                   Position
+  )
+{
+  EMU_EFI_FILE_PRIVATE    *PrivateFile;
+  off_t                   Pos;
+
+  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
+
+  if (PrivateFile->IsDirectoryPath) {
+    if (Position != 0) {
+      return EFI_UNSUPPORTED;
+    }
+
+    if (PrivateFile->Dir == NULL) {
+      return EFI_DEVICE_ERROR;
+    }
+    rewinddir (PrivateFile->Dir);
+    return EFI_SUCCESS;
+  } else {
+    if (Position == (UINT64) -1) {
+      Pos = lseek (PrivateFile->fd, 0, SEEK_END);
+    } else {
+      Pos = lseek (PrivateFile->fd, Position, SEEK_SET);
+    }
+    if (Pos == (off_t)-1) {
+      return ErrnoToEfiStatus ();
+    }
+    return EFI_SUCCESS;
+  }
+}
+
+
+
+/**
+  Get a file's current position
+
+  @param  This            Protocol instance pointer.
+  @param  Position        Byte position from the start of the file.
+
+  @retval EFI_SUCCESS     Data was written.
+  @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open..
+
+**/
+EFI_STATUS
+PosixFileGetPossition (
+  IN EFI_FILE_PROTOCOL        *This,
+  OUT UINT64                  *Position
+  )
+{
+  EFI_STATUS            Status;
+  EMU_EFI_FILE_PRIVATE  *PrivateFile;
+
+  PrivateFile   = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
+
+  if (PrivateFile->IsDirectoryPath) {
+    Status = EFI_UNSUPPORTED;
+  } else {
+    *Position = (UINT64)lseek (PrivateFile->fd, 0, SEEK_CUR);
+    Status = (*Position == (UINT64) -1) ? ErrnoToEfiStatus () : EFI_SUCCESS;
+  }
+
+  return Status;
+}
+
+
+/**
+  Get information about a file.
+
+  @param  This            Protocol instance pointer.
+  @param  InformationType Type of information to return in Buffer.
+  @param  BufferSize      On input size of buffer, on output amount of data in buffer.
+  @param  Buffer          The buffer to return data.
+
+  @retval EFI_SUCCESS          Data was returned.
+  @retval EFI_UNSUPPORTED      InformationType is not supported.
+  @retval EFI_NO_MEDIA         The device has no media.
+  @retval EFI_DEVICE_ERROR     The device reported an error.
+  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
+  @retval EFI_WRITE_PROTECTED  The device is write protected.
+  @retval EFI_ACCESS_DENIED    The file was open for read only.
+  @retval EFI_BUFFER_TOO_SMALL Buffer was too small; required size returned in BufferSize.
+
+**/
+EFI_STATUS
+PosixFileGetInfo (
+  IN EFI_FILE_PROTOCOL        *This,
+  IN EFI_GUID                 *InformationType,
+  IN OUT UINTN                *BufferSize,
+  OUT VOID                    *Buffer
+  )
+{
+  EFI_STATUS                        Status;
+  EMU_EFI_FILE_PRIVATE              *PrivateFile;
+  EFI_FILE_SYSTEM_INFO              *FileSystemInfoBuffer;
+  int                               UnixStatus;
+  EMU_SIMPLE_FILE_SYSTEM_PRIVATE    *PrivateRoot;
+  struct statfs                     buf;
+
+  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
+  PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (PrivateFile->SimpleFileSystem);
+
+  Status = EFI_SUCCESS;
+  if (CompareGuid (InformationType, &gEfiFileInfoGuid)) {
+    Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, BufferSize, Buffer);
+  } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
+    if (*BufferSize < SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel)) {
+      *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);
+      return EFI_BUFFER_TOO_SMALL;
+    }
+
+    UnixStatus = statfs (PrivateFile->FileName, &buf);
+    if (UnixStatus < 0) {
+      return EFI_DEVICE_ERROR;
+    }
+
+    FileSystemInfoBuffer            = (EFI_FILE_SYSTEM_INFO *) Buffer;
+    FileSystemInfoBuffer->Size      = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);
+    FileSystemInfoBuffer->ReadOnly  = FALSE;
+
+    //
+    // Succeeded
+    //
+    FileSystemInfoBuffer->VolumeSize  = MultU64x32 (buf.f_blocks, buf.f_bsize);
+    FileSystemInfoBuffer->FreeSpace   = MultU64x32 (buf.f_bavail, buf.f_bsize);
+    FileSystemInfoBuffer->BlockSize   = buf.f_bsize;
+
+
+    StrCpy ((CHAR16 *) FileSystemInfoBuffer->VolumeLabel, PrivateRoot->VolumeLabel);
+    *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);
+
+  } else if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) {
+    if (*BufferSize < StrSize (PrivateRoot->VolumeLabel)) {
+      *BufferSize = StrSize (PrivateRoot->VolumeLabel);
+      return EFI_BUFFER_TOO_SMALL;
+    }
+
+    StrCpy ((CHAR16 *) Buffer, PrivateRoot->VolumeLabel);
+    *BufferSize = StrSize (PrivateRoot->VolumeLabel);
+
+  }
+
+  return Status;
+}
+
+
+/**
+  Set information about a file
+
+  @param  File            Protocol instance pointer.
+  @param  InformationType Type of information in Buffer.
+  @param  BufferSize      Size of buffer.
+  @param  Buffer          The data to write.
+
+  @retval EFI_SUCCESS          Data was returned.
+  @retval EFI_UNSUPPORTED      InformationType is not supported.
+  @retval EFI_NO_MEDIA         The device has no media.
+  @retval EFI_DEVICE_ERROR     The device reported an error.
+  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
+  @retval EFI_WRITE_PROTECTED  The device is write protected.
+  @retval EFI_ACCESS_DENIED    The file was open for read only.
+
+**/
+EFI_STATUS
+PosixFileSetInfo (
+  IN EFI_FILE_PROTOCOL        *This,
+  IN EFI_GUID                 *InformationType,
+  IN UINTN                    BufferSize,
+  IN VOID                     *Buffer
+  )
+{
+  EMU_SIMPLE_FILE_SYSTEM_PRIVATE    *PrivateRoot;
+  EMU_EFI_FILE_PRIVATE              *PrivateFile;
+  EFI_FILE_INFO                     *OldFileInfo;
+  EFI_FILE_INFO                     *NewFileInfo;
+  EFI_STATUS                        Status;
+  UINTN                             OldInfoSize;
+  mode_t                            NewAttr;
+  struct stat                       OldAttr;
+  CHAR8                             *OldFileName;
+  CHAR8                             *NewFileName;
+  CHAR8                             *CharPointer;
+  BOOLEAN                           AttrChangeFlag;
+  BOOLEAN                           NameChangeFlag;
+  BOOLEAN                           SizeChangeFlag;
+  BOOLEAN                           TimeChangeFlag;
+  struct tm                         NewLastAccessSystemTime;
+  struct tm                         NewLastWriteSystemTime;
+  EFI_FILE_SYSTEM_INFO              *NewFileSystemInfo;
+  CHAR8                             *AsciiFilePtr;
+  CHAR16                            *UnicodeFilePtr;
+  int                               UnixStatus;
+  struct utimbuf                    Utime;
+
+
+  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
+  PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (PrivateFile->SimpleFileSystem);
+  errno       = 0;
+  Status      = EFI_UNSUPPORTED;
+  OldFileInfo = NewFileInfo = NULL;
+  OldFileName = NewFileName = NULL;
+  AttrChangeFlag = NameChangeFlag = SizeChangeFlag = TimeChangeFlag = FALSE;
+
+  //
+  // Set file system information.
+  //
+  if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
+    if (BufferSize < (SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel))) {
+      Status = EFI_BAD_BUFFER_SIZE;
+      goto Done;
+    }
+
+    NewFileSystemInfo = (EFI_FILE_SYSTEM_INFO *) Buffer;
+
+    free (PrivateRoot->VolumeLabel);
+
+    PrivateRoot->VolumeLabel = malloc (StrSize (NewFileSystemInfo->VolumeLabel));
+    if (PrivateRoot->VolumeLabel == NULL) {
+      goto Done;
+    }
+
+    StrCpy (PrivateRoot->VolumeLabel, NewFileSystemInfo->VolumeLabel);
+
+    Status = EFI_SUCCESS;
+    goto Done;
+  }
+
+  //
+  // Set volume label information.
+  //
+  if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) {
+    if (BufferSize < StrSize (PrivateRoot->VolumeLabel)) {
+      Status = EFI_BAD_BUFFER_SIZE;
+      goto Done;
+    }
+
+    StrCpy (PrivateRoot->VolumeLabel, (CHAR16 *) Buffer);
+
+    Status = EFI_SUCCESS;
+    goto Done;
+  }
+
+  if (!CompareGuid (InformationType, &gEfiFileInfoGuid)) {
+    Status = EFI_UNSUPPORTED;
+    goto Done;
+  }
+
+  if (BufferSize < SIZE_OF_EFI_FILE_INFO) {
+    Status = EFI_BAD_BUFFER_SIZE;
+    goto Done;
+  }
+
+  //
+  // Set file/directory information.
+  //
+
+  //
+  // Check for invalid set file information parameters.
+  //
+  NewFileInfo = (EFI_FILE_INFO *) Buffer;
+  if (NewFileInfo->Size <= sizeof (EFI_FILE_INFO) ||
+      (NewFileInfo->Attribute &~(EFI_FILE_VALID_ATTR)) ||
+      (sizeof (UINTN) == 4 && NewFileInfo->Size > 0xFFFFFFFF)
+      ) {
+    Status = EFI_INVALID_PARAMETER;
+    goto Done;
+  }
+
+  //
+  // Get current file information so we can determine what kind
+  // of change request this is.
+  //
+  OldInfoSize = 0;
+  Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize, NULL);
+  if (Status != EFI_BUFFER_TOO_SMALL) {
+    Status = EFI_DEVICE_ERROR;
+    goto Done;
+  }
+
+  OldFileInfo = malloc (OldInfoSize);
+  if (OldFileInfo == NULL) {
+    goto Done;
+  }
+
+  Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize, OldFileInfo);
+  if (EFI_ERROR (Status)) {
+    goto Done;
+  }
+
+  OldFileName = malloc (AsciiStrSize (PrivateFile->FileName));
+  if (OldFileInfo == NULL) {
+    goto Done;
+  }
+
+  AsciiStrCpy (OldFileName, PrivateFile->FileName);
+
+  //
+  // Make full pathname from new filename and rootpath.
+  //
+  if (NewFileInfo->FileName[0] == '\\') {
+    NewFileName = malloc (AsciiStrLen (PrivateRoot->FilePath) + 1 + StrLen (NewFileInfo->FileName) + 1);
+    if (NewFileName == NULL) {
+      goto Done;
+    }
+
+    AsciiStrCpy (NewFileName, PrivateRoot->FilePath);
+    AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);
+    UnicodeFilePtr = NewFileInfo->FileName + 1;
+    *AsciiFilePtr++ ='/';
+  } else {
+    NewFileName = malloc (AsciiStrLen (PrivateFile->FileName) + 2 + StrLen (NewFileInfo->FileName) + 1);
+    if (NewFileName == NULL) {
+      goto Done;
+    }
+
+    AsciiStrCpy (NewFileName, PrivateRoot->FilePath);
+    AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);
+    if ((AsciiFilePtr[-1] != '/') && (NewFileInfo->FileName[0] != '/')) {
+      // make sure there is a / between Root FilePath and NewFileInfo Filename
+      AsciiFilePtr[0] = '/';
+      AsciiFilePtr[1] = '\0';
+      AsciiFilePtr++;
+    }
+    UnicodeFilePtr = NewFileInfo->FileName;
+  }
+  // Convert to ascii.
+  while (*UnicodeFilePtr) {
+    *AsciiFilePtr++ = *UnicodeFilePtr++;
+  }
+  *AsciiFilePtr = 0;
+
+  //
+  // Is there an attribute change request?
+  //
+  if (NewFileInfo->Attribute != OldFileInfo->Attribute) {
+    if ((NewFileInfo->Attribute & EFI_FILE_DIRECTORY) != (OldFileInfo->Attribute & EFI_FILE_DIRECTORY)) {
+      Status = EFI_INVALID_PARAMETER;
+      goto Done;
+    }
+
+    AttrChangeFlag = TRUE;
+  }
+
+  //
+  // Is there a name change request?
+  // bugbug: - Should really use EFI_UNICODE_COLLATION_PROTOCOL
+  //
+  if (StrCmp (NewFileInfo->FileName, OldFileInfo->FileName)) {
+    NameChangeFlag = TRUE;
+  }
+
+  //
+  // Is there a size change request?
+  //
+  if (NewFileInfo->FileSize != OldFileInfo->FileSize) {
+    SizeChangeFlag = TRUE;
+  }
+
+  //
+  // Is there a time stamp change request?
+  //
+  if (!IsZero (&NewFileInfo->CreateTime, sizeof (EFI_TIME)) &&
+      CompareMem (&NewFileInfo->CreateTime, &OldFileInfo->CreateTime, sizeof (EFI_TIME))
+      ) {
+    TimeChangeFlag = TRUE;
+  } else if (!IsZero (&NewFileInfo->LastAccessTime, sizeof (EFI_TIME)) &&
+             CompareMem (&NewFileInfo->LastAccessTime, &OldFileInfo->LastAccessTime, sizeof (EFI_TIME))
+             ) {
+    TimeChangeFlag = TRUE;
+  } else if (!IsZero (&NewFileInfo->ModificationTime, sizeof (EFI_TIME)) &&
+             CompareMem (&NewFileInfo->ModificationTime, &OldFileInfo->ModificationTime, sizeof (EFI_TIME))
+             ) {
+    TimeChangeFlag = TRUE;
+  }
+
+  //
+  // All done if there are no change requests being made.
+  //
+  if (!(AttrChangeFlag || NameChangeFlag || SizeChangeFlag || TimeChangeFlag)) {
+    Status = EFI_SUCCESS;
+    goto Done;
+  }
+
+  //
+  // Set file or directory information.
+  //
+  if (stat (OldFileName, &OldAttr) != 0) {
+    Status = ErrnoToEfiStatus ();
+    goto Done;
+  }
+
+  //
+  // Name change.
+  //
+  if (NameChangeFlag) {
+    //
+    // Close the handles first
+    //
+    if (PrivateFile->IsOpenedByRead) {
+      Status = EFI_ACCESS_DENIED;
+      goto Done;
+    }
+
+    for (CharPointer = NewFileName; *CharPointer != 0 && *CharPointer != L'/'; CharPointer++) {
+    }
+
+    if (*CharPointer != 0) {
+      Status = EFI_ACCESS_DENIED;
+      goto Done;
+    }
+
+    UnixStatus = rename (OldFileName, NewFileName);
+    if (UnixStatus == 0) {
+      //
+      // modify file name
+      //
+      free (PrivateFile->FileName);
+
+      PrivateFile->FileName = malloc (AsciiStrSize (NewFileName));
+      if (PrivateFile->FileName == NULL) {
+        goto Done;
+      }
+
+      AsciiStrCpy (PrivateFile->FileName, NewFileName);
+    } else {
+      Status    = EFI_DEVICE_ERROR;
+      goto Done;
+    }
+  }
+
+  //
+  //  Size change
+  //
+  if (SizeChangeFlag) {
+    if (PrivateFile->IsDirectoryPath) {
+      Status = EFI_UNSUPPORTED;
+      goto Done;
+    }
+
+    if (PrivateFile->IsOpenedByRead || OldFileInfo->Attribute & EFI_FILE_READ_ONLY) {
+      Status = EFI_ACCESS_DENIED;
+      goto Done;
+    }
+
+    if (ftruncate (PrivateFile->fd, NewFileInfo->FileSize) != 0) {
+      Status = ErrnoToEfiStatus ();
+      goto Done;
+    }
+
+  }
+
+  //
+  // Time change
+  //
+  if (TimeChangeFlag) {
+    NewLastAccessSystemTime.tm_year    = NewFileInfo->LastAccessTime.Year;
+    NewLastAccessSystemTime.tm_mon     = NewFileInfo->LastAccessTime.Month;
+    NewLastAccessSystemTime.tm_mday    = NewFileInfo->LastAccessTime.Day;
+    NewLastAccessSystemTime.tm_hour    = NewFileInfo->LastAccessTime.Hour;
+    NewLastAccessSystemTime.tm_min     = NewFileInfo->LastAccessTime.Minute;
+    NewLastAccessSystemTime.tm_sec     = NewFileInfo->LastAccessTime.Second;
+    NewLastAccessSystemTime.tm_isdst   = 0;
+
+    Utime.actime = mktime (&NewLastAccessSystemTime);
+
+    NewLastWriteSystemTime.tm_year    = NewFileInfo->ModificationTime.Year;
+    NewLastWriteSystemTime.tm_mon     = NewFileInfo->ModificationTime.Month;
+    NewLastWriteSystemTime.tm_mday    = NewFileInfo->ModificationTime.Day;
+    NewLastWriteSystemTime.tm_hour    = NewFileInfo->ModificationTime.Hour;
+    NewLastWriteSystemTime.tm_min     = NewFileInfo->ModificationTime.Minute;
+    NewLastWriteSystemTime.tm_sec     = NewFileInfo->ModificationTime.Second;
+    NewLastWriteSystemTime.tm_isdst   = 0;
+
+    Utime.modtime = mktime (&NewLastWriteSystemTime);
+
+    if (Utime.actime == (time_t)-1 || Utime.modtime == (time_t)-1) {
+      goto Done;
+    }
+
+    if (utime (PrivateFile->FileName, &Utime) == -1) {
+      Status = ErrnoToEfiStatus ();
+      goto Done;
+    }
+  }
+
+  //
+  // No matter about AttrChangeFlag, Attribute must be set.
+  // Because operation before may cause attribute change.
+  //
+  NewAttr = OldAttr.st_mode;
+
+  if (NewFileInfo->Attribute & EFI_FILE_READ_ONLY) {
+    NewAttr &= ~(S_IRUSR | S_IRGRP | S_IROTH);
+  } else {
+    NewAttr |= S_IRUSR;
+  }
+
+  if (chmod (NewFileName, NewAttr) != 0) {
+    Status = ErrnoToEfiStatus ();
+  }
+
+Done:
+  if (OldFileInfo != NULL) {
+    free (OldFileInfo);
+  }
+
+  if (OldFileName != NULL) {
+    free (OldFileName);
+  }
+
+  if (NewFileName != NULL) {
+    free (NewFileName);
+  }
+
+  return Status;
+}
+
+
+/**
+  Flush data back for the file handle.
+
+  @param  This Protocol instance pointer.
+
+  @retval EFI_SUCCESS          Data was written.
+  @retval EFI_UNSUPPORTED      Writes to Open directory are not supported.
+  @retval EFI_NO_MEDIA         The device has no media.
+  @retval EFI_DEVICE_ERROR     The device reported an error.
+  @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
+  @retval EFI_WRITE_PROTECTED  The device is write protected.
+  @retval EFI_ACCESS_DENIED    The file was open for read only.
+  @retval EFI_VOLUME_FULL      The volume is full.
+
+**/
+EFI_STATUS
+PosixFileFlush (
+  IN EFI_FILE_PROTOCOL  *This
+  )
+{
+  EMU_EFI_FILE_PRIVATE     *PrivateFile;
+
+
+  PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
+
+  if (PrivateFile->IsDirectoryPath) {
+    return EFI_UNSUPPORTED;
+  }
+
+  if (PrivateFile->IsOpenedByRead) {
+    return EFI_ACCESS_DENIED;
+  }
+
+  if (PrivateFile->fd < 0) {
+    return EFI_DEVICE_ERROR;
+  }
+
+  if (fsync (PrivateFile->fd) != 0) {
+    return ErrnoToEfiStatus ();
+  }
+
+  return EFI_SUCCESS;
+}
+
+
+
+EFI_STATUS
+PosixFileSystmeThunkOpen (
+  IN  EMU_IO_THUNK_PROTOCOL   *This
+  )
+{
+  EMU_SIMPLE_FILE_SYSTEM_PRIVATE  *Private;
+  UINTN                           i;
+
+  if (This->Private != NULL) {
+    return EFI_ALREADY_STARTED;
+  }
+
+  if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {
+    return EFI_UNSUPPORTED;
+  }
+
+  Private = malloc (sizeof (EMU_SIMPLE_FILE_SYSTEM_PRIVATE));
+  if (Private == NULL) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  Private->FilePath = malloc (StrLen (This->ConfigString) + 1);
+  if (Private->FilePath == NULL) {
+    free (Private);
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  // Convert Unicode to Ascii
+  for (i = 0; This->ConfigString[i] != 0; i++) {
+    Private->FilePath[i] = This->ConfigString[i];
+  }
+  Private->FilePath[i] = 0;
+
+
+  Private->VolumeLabel = malloc (StrSize (L"EFI_EMULATED"));
+  if (Private->VolumeLabel == NULL) {
+    free (Private->FilePath);
+    free (Private);
+    return EFI_OUT_OF_RESOURCES;
+  }
+  StrCpy (Private->VolumeLabel, L"EFI_EMULATED");
+
+  Private->Signature = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE;
+  Private->Thunk     = This;
+  CopyMem (&Private->SimpleFileSystem, &gPosixFileSystemProtocol, sizeof (Private->SimpleFileSystem));
+  Private->FileHandlesOpen = FALSE;
+
+  This->Interface = &Private->SimpleFileSystem;
+  This->Private   = Private;
+  return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+PosixFileSystmeThunkClose (
+  IN  EMU_IO_THUNK_PROTOCOL   *This
+  )
+{
+  EMU_SIMPLE_FILE_SYSTEM_PRIVATE  *Private;
+
+  if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {
+    return EFI_UNSUPPORTED;
+  }
+
+  Private = This->Private;
+
+  if (Private->FileHandlesOpen) {
+    //
+    // Close only supported if all the EFI_FILE_HANDLEs have been closed.
+    //
+    return EFI_NOT_READY;
+  }
+
+  if (This->Private != NULL) {
+    if (Private->VolumeLabel != NULL) {
+      free (Private->VolumeLabel);
+    }
+    free (This->Private);
+    This->Private = NULL;
+  }
+
+  return EFI_SUCCESS;
+}
+
+
+EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo = {
+  &gEfiSimpleFileSystemProtocolGuid,
+  NULL,
+  NULL,
+  0,
+  GasketPosixFileSystmeThunkOpen,
+  GasketPosixFileSystmeThunkClose,
+  NULL
+};
+
+

+ 235 - 235
EmulatorPkg/Unix/Host/Pthreads.c

@@ -1,235 +1,235 @@
-/*++ @file
- POSIX Pthreads to emulate APs and implement threads
-
-Copyright (c) 2011, Apple Inc. All rights reserved.
-Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
-
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution.  The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-
-**/
-
-#include "Host.h"
-#include <pthread.h>
-
-
-UINTN
-EFIAPI
-PthreadMutexLock (
-  IN VOID *Mutex
-  )
-{
-  return (UINTN)pthread_mutex_lock ((pthread_mutex_t *)Mutex);
-}
-
-
-
-UINTN
-EFIAPI
-PthreadMutexUnLock (
-  IN VOID *Mutex
-  )
-{
-  return (UINTN)pthread_mutex_unlock ((pthread_mutex_t *)Mutex);
-}
-
-
-UINTN
-EFIAPI
-PthreadMutexTryLock (
-  IN VOID *Mutex
-  )
-{
-  return (UINTN)pthread_mutex_trylock ((pthread_mutex_t *)Mutex);
-}
-
-
-VOID *
-PthreadMutexInit (
-  IN VOID
-  )
-{
-  pthread_mutex_t *Mutex;
-  int             err;
-
-  Mutex = malloc (sizeof (pthread_mutex_t));
-  err = pthread_mutex_init (Mutex, NULL);
-  if (err == 0) {
-    return Mutex;
-  }
-
-  return NULL;
-}
-
-
-UINTN
-PthreadMutexDestroy (
-  IN VOID *Mutex
-  )
-{
-  if (Mutex != NULL) {
-    return pthread_mutex_destroy ((pthread_mutex_t *)Mutex);
-  }
-
-  return -1;
-}
-
-// Can't store this data on PthreadCreate stack so we need a global
-typedef struct {
-  pthread_mutex_t             Mutex;
-  THREAD_THUNK_THREAD_ENTRY   Start;
-} THREAD_MANGLE;
-
-THREAD_MANGLE mThreadMangle = {
-  PTHREAD_MUTEX_INITIALIZER,
-  NULL
-};
-
-VOID *
-SecFakePthreadStart (
-  VOID  *Context
-  )
-{
-  THREAD_THUNK_THREAD_ENTRY Start;
-  sigset_t                  SigMask;
-
-  // Save global on the stack before we unlock
-  Start   = mThreadMangle.Start;
-  pthread_mutex_unlock (&mThreadMangle.Mutex);
-
-  // Mask all signals to the APs
-  sigfillset (&SigMask);
-  pthread_sigmask (SIG_BLOCK, &SigMask, NULL);
-
-  //
-  // We have to start the thread in SEC as we need to follow
-  // OS X calling conventions. We can then call back into
-  // to the callers Start.
-  //
-  // This is a great example of how all problems in computer
-  // science can be solved by adding another level of indirection
-  //
- return  (VOID *)ReverseGasketUint64 ((CALL_BACK)Start, (UINTN)Context);
-}
-
-UINTN
-PthreadCreate (
-  IN  VOID                      *Thread,
-  IN  VOID                      *Attribute,
-  IN  THREAD_THUNK_THREAD_ENTRY Start,
-  IN  VOID                      *Context
-  )
-{
-  int         err;
-  BOOLEAN     EnabledOnEntry;
-
-  //
-  // Threads inherit interrupt state so disable interrupts before we start thread
-  //
-  if (SecInterruptEanbled ()) {
-    SecDisableInterrupt ();
-    EnabledOnEntry = TRUE;
-  } else {
-    EnabledOnEntry = FALSE;
-  }
-
-  // Aquire lock for global, SecFakePthreadStart runs in a different thread.
-  pthread_mutex_lock (&mThreadMangle.Mutex);
-  mThreadMangle.Start   = Start;
-
-  err = pthread_create (Thread, Attribute, SecFakePthreadStart, Context);
-  if (err != 0) {
-    // Thread failed to launch so release the lock;
-    pthread_mutex_unlock (&mThreadMangle.Mutex);
-  }
-
-  if (EnabledOnEntry) {
-    // Restore interrupt state
-    SecEnableInterrupt ();
-  }
-
-  return err;
-}
-
-
-VOID
-PthreadExit (
-  IN VOID *ValuePtr
-  )
-{
-  pthread_exit (ValuePtr);
-  return;
-}
-
-
-UINTN
-PthreadSelf (
-  VOID
-  )
-{
-  // POSIX currently allows pthread_t to be a structure or arithmetic type.
-  // Check out sys/types.h to make sure this will work if you are porting.
-  // On OS X (Darwin) pthread_t is a pointer to a structure so this code works.
-  return (UINTN)pthread_self ();
-}
-
-
-EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {
-  GasketPthreadMutexLock,
-  GasketPthreadMutexUnLock,
-  GasketPthreadMutexTryLock,
-  GasketPthreadMutexInit,
-  GasketPthreadMutexDestroy,
-  GasketPthreadCreate,
-  GasketPthreadExit,
-  GasketPthreadSelf
-};
-
-
-EFI_STATUS
-PthreadOpen (
-  IN  EMU_IO_THUNK_PROTOCOL   *This
-  )
-{
-  if (This->Instance != 0) {
-    // Only single instance is supported
-    return EFI_NOT_FOUND;
-  }
-
-  if (This->ConfigString[0] == L'0') {
-    // If AP count is zero no need for threads
-    return EFI_NOT_FOUND;
-  }
-
-  This->Interface = &gPthreadThunk;
-
-  return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-PthreadClose (
-  IN  EMU_IO_THUNK_PROTOCOL   *This
-  )
-{
-  return EFI_SUCCESS;
-}
-
-
-EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {
-  &gEmuThreadThunkProtocolGuid,
-  NULL,
-  NULL,
-  0,
-  GasketPthreadOpen,
-  GasketPthreadClose,
-  NULL
-};
-
-
+/*++ @file
+ POSIX Pthreads to emulate APs and implement threads
+
+Copyright (c) 2011, Apple Inc. All rights reserved.
+Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
+
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+
+**/
+
+#include "Host.h"
+#include <pthread.h>
+
+
+UINTN
+EFIAPI
+PthreadMutexLock (
+  IN VOID *Mutex
+  )
+{
+  return (UINTN)pthread_mutex_lock ((pthread_mutex_t *)Mutex);
+}
+
+
+
+UINTN
+EFIAPI
+PthreadMutexUnLock (
+  IN VOID *Mutex
+  )
+{
+  return (UINTN)pthread_mutex_unlock ((pthread_mutex_t *)Mutex);
+}
+
+
+UINTN
+EFIAPI
+PthreadMutexTryLock (
+  IN VOID *Mutex
+  )
+{
+  return (UINTN)pthread_mutex_trylock ((pthread_mutex_t *)Mutex);
+}
+
+
+VOID *
+PthreadMutexInit (
+  IN VOID
+  )
+{
+  pthread_mutex_t *Mutex;
+  int             err;
+
+  Mutex = malloc (sizeof (pthread_mutex_t));
+  err = pthread_mutex_init (Mutex, NULL);
+  if (err == 0) {
+    return Mutex;
+  }
+
+  return NULL;
+}
+
+
+UINTN
+PthreadMutexDestroy (
+  IN VOID *Mutex
+  )
+{
+  if (Mutex != NULL) {
+    return pthread_mutex_destroy ((pthread_mutex_t *)Mutex);
+  }
+
+  return -1;
+}
+
+// Can't store this data on PthreadCreate stack so we need a global
+typedef struct {
+  pthread_mutex_t             Mutex;
+  THREAD_THUNK_THREAD_ENTRY   Start;
+} THREAD_MANGLE;
+
+THREAD_MANGLE mThreadMangle = {
+  PTHREAD_MUTEX_INITIALIZER,
+  NULL
+};
+
+VOID *
+SecFakePthreadStart (
+  VOID  *Context
+  )
+{
+  THREAD_THUNK_THREAD_ENTRY Start;
+  sigset_t                  SigMask;
+
+  // Save global on the stack before we unlock
+  Start   = mThreadMangle.Start;
+  pthread_mutex_unlock (&mThreadMangle.Mutex);
+
+  // Mask all signals to the APs
+  sigfillset (&SigMask);
+  pthread_sigmask (SIG_BLOCK, &SigMask, NULL);
+
+  //
+  // We have to start the thread in SEC as we need to follow
+  // OS X calling conventions. We can then call back into
+  // to the callers Start.
+  //
+  // This is a great example of how all problems in computer
+  // science can be solved by adding another level of indirection
+  //
+ return  (VOID *)ReverseGasketUint64 ((CALL_BACK)Start, (UINTN)Context);
+}
+
+UINTN
+PthreadCreate (
+  IN  VOID                      *Thread,
+  IN  VOID                      *Attribute,
+  IN  THREAD_THUNK_THREAD_ENTRY Start,
+  IN  VOID                      *Context
+  )
+{
+  int         err;
+  BOOLEAN     EnabledOnEntry;
+
+  //
+  // Threads inherit interrupt state so disable interrupts before we start thread
+  //
+  if (SecInterruptEanbled ()) {
+    SecDisableInterrupt ();
+    EnabledOnEntry = TRUE;
+  } else {
+    EnabledOnEntry = FALSE;
+  }
+
+  // Aquire lock for global, SecFakePthreadStart runs in a different thread.
+  pthread_mutex_lock (&mThreadMangle.Mutex);
+  mThreadMangle.Start   = Start;
+
+  err = pthread_create (Thread, Attribute, SecFakePthreadStart, Context);
+  if (err != 0) {
+    // Thread failed to launch so release the lock;
+    pthread_mutex_unlock (&mThreadMangle.Mutex);
+  }
+
+  if (EnabledOnEntry) {
+    // Restore interrupt state
+    SecEnableInterrupt ();
+  }
+
+  return err;
+}
+
+
+VOID
+PthreadExit (
+  IN VOID *ValuePtr
+  )
+{
+  pthread_exit (ValuePtr);
+  return;
+}
+
+
+UINTN
+PthreadSelf (
+  VOID
+  )
+{
+  // POSIX currently allows pthread_t to be a structure or arithmetic type.
+  // Check out sys/types.h to make sure this will work if you are porting.
+  // On OS X (Darwin) pthread_t is a pointer to a structure so this code works.
+  return (UINTN)pthread_self ();
+}
+
+
+EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {
+  GasketPthreadMutexLock,
+  GasketPthreadMutexUnLock,
+  GasketPthreadMutexTryLock,
+  GasketPthreadMutexInit,
+  GasketPthreadMutexDestroy,
+  GasketPthreadCreate,
+  GasketPthreadExit,
+  GasketPthreadSelf
+};
+
+
+EFI_STATUS
+PthreadOpen (
+  IN  EMU_IO_THUNK_PROTOCOL   *This
+  )
+{
+  if (This->Instance != 0) {
+    // Only single instance is supported
+    return EFI_NOT_FOUND;
+  }
+
+  if (This->ConfigString[0] == L'0') {
+    // If AP count is zero no need for threads
+    return EFI_NOT_FOUND;
+  }
+
+  This->Interface = &gPthreadThunk;
+
+  return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+PthreadClose (
+  IN  EMU_IO_THUNK_PROTOCOL   *This
+  )
+{
+  return EFI_SUCCESS;
+}
+
+
+EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {
+  &gEmuThreadThunkProtocolGuid,
+  NULL,
+  NULL,
+  0,
+  GasketPthreadOpen,
+  GasketPthreadClose,
+  NULL
+};
+
+

+ 1028 - 1028
EmulatorPkg/Unix/Host/X11GraphicsWindow.c

@@ -1,1028 +1,1028 @@
-/*++ @file
-
-Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
-Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
-
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution.  The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include "Host.h"
-
-#include <sys/ipc.h>
-#include <sys/shm.h>
-
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <X11/Xos.h>
-#include <X11/extensions/XShm.h>
-#include <X11/keysym.h>
-#include <X11/cursorfont.h>
-
-#define KEYSYM_LOWER  0
-#define KEYSYM_UPPER  1
-
-
-struct uga_drv_shift_mask {
-  unsigned char shift;
-  unsigned char size;
-  unsigned char csize;
-};
-
-#define NBR_KEYS 32
-typedef struct {
-  EMU_GRAPHICS_WINDOW_PROTOCOL GraphicsIo;
-
-  Display     *display;
-  int         screen;      // values for window_size in main
-  Window      win;
-  GC          gc;
-  Visual      *visual;
-
-  int           depth;
-  unsigned int  width;
-  unsigned int  height;
-  unsigned int  line_bytes;
-  unsigned int  pixel_shift;
-  unsigned char *image_data;
-
-  struct uga_drv_shift_mask r, g, b;
-
-  int             use_shm;
-  XShmSegmentInfo xshm_info;
-  XImage          *image;
-  char            *Title;
-
-  unsigned int key_rd;
-  unsigned int key_wr;
-  unsigned int key_count;
-  EFI_KEY_DATA keys[NBR_KEYS];
-
-  EFI_KEY_STATE KeyState;
-
-  EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK    MakeRegisterdKeyCallback;
-  EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK    BreakRegisterdKeyCallback;
-  VOID                                                *RegisterdKeyCallbackContext;
-
-  int                        previous_x;
-  int                        previous_y;
-  EFI_SIMPLE_POINTER_STATE   pointer_state;
-  int                        pointer_state_changed;
-} GRAPHICS_IO_PRIVATE;
-
-void
-HandleEvents(
-  IN GRAPHICS_IO_PRIVATE *Drv
-  );
-
-void
-fill_shift_mask (
-  IN  struct uga_drv_shift_mask *sm,
-  IN  unsigned long             mask
-  )
-{
-  sm->shift = 0;
-  sm->size = 0;
-  while ((mask & 1) == 0) {
-    mask >>= 1;
-    sm->shift++;
-  }
-  while (mask & 1) {
-    sm->size++;
-    mask >>= 1;
-  }
-  sm->csize = 8 - sm->size;
-}
-
-int
-TryCreateShmImage (
-  IN  GRAPHICS_IO_PRIVATE *Drv
-  )
-{
-  Drv->image = XShmCreateImage (
-                 Drv->display, Drv->visual,
-                 Drv->depth, ZPixmap, NULL, &Drv->xshm_info,
-                 Drv->width, Drv->height
-                 );
-  if (Drv->image == NULL) {
-    return 0;
-  }
-
-  switch (Drv->image->bitmap_unit) {
-  case 32:
-    Drv->pixel_shift = 2;
-    break;
-  case 16:
-    Drv->pixel_shift = 1;
-    break;
-  case 8:
-    Drv->pixel_shift = 0;
-    break;
-  }
-
-  Drv->xshm_info.shmid = shmget (
-                          IPC_PRIVATE, Drv->image->bytes_per_line * Drv->image->height,
-                          IPC_CREAT | 0777
-                          );
-  if (Drv->xshm_info.shmid < 0) {
-    XDestroyImage(Drv->image);
-    return 0;
-  }
-
-  Drv->image_data = shmat (Drv->xshm_info.shmid, NULL, 0);
-  if(!Drv->image_data) {
-    shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
-    XDestroyImage(Drv->image);
-    return 0;
-  }
-
-#ifndef __APPLE__
-  //
-  // This closes shared memory in real time on OS X. Only closes after folks quit using
-  // it on Linux.
-  //
-  shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
-#endif
-
-  Drv->xshm_info.shmaddr = (char*)Drv->image_data;
-  Drv->image->data = (char*)Drv->image_data;
-
-  if (!XShmAttach (Drv->display, &Drv->xshm_info)) {
-    shmdt (Drv->image_data);
-    XDestroyImage(Drv->image);
-    return 0;
-  }
-  return 1;
-}
-
-
-EFI_STATUS
-X11Size (
-  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsIo,
-  IN  UINT32                        Width,
-  IN  UINT32                        Height
-  )
-{
-  GRAPHICS_IO_PRIVATE *Drv;
-  XSizeHints          size_hints;
-
-  // Destroy current buffer if created.
-  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
-  if (Drv->image != NULL) {
-    // Before destroy buffer, need to make sure the buffer available for access.
-    XDestroyImage (Drv->image);
-
-    if (Drv->use_shm) {
-      shmdt (Drv->image_data);
-    }
-
-    Drv->image_data = NULL;
-    Drv->image = NULL;
-  }
-
-  Drv->width = Width;
-  Drv->height = Height;
-  XResizeWindow (Drv->display, Drv->win, Width, Height);
-
-  // Allocate image.
-  if (XShmQueryExtension(Drv->display) && TryCreateShmImage(Drv)) {
-    Drv->use_shm = 1;
-  } else {
-    Drv->use_shm = 0;
-    if (Drv->depth > 16) {
-      Drv->pixel_shift = 2;
-    } else if (Drv->depth > 8) {
-      Drv->pixel_shift = 1;
-    } else {
-      Drv->pixel_shift = 0;
-    }
-
-    Drv->image_data = malloc ((Drv->width * Drv->height) << Drv->pixel_shift);
-    Drv->image = XCreateImage (
-                    Drv->display, Drv->visual, Drv->depth,
-                    ZPixmap, 0, (char *)Drv->image_data,
-                    Drv->width, Drv->height,
-                    8 << Drv->pixel_shift, 0
-                    );
-  }
-
-  Drv->line_bytes = Drv->image->bytes_per_line;
-
-  fill_shift_mask (&Drv->r, Drv->image->red_mask);
-  fill_shift_mask (&Drv->g, Drv->image->green_mask);
-  fill_shift_mask (&Drv->b, Drv->image->blue_mask);
-
-  // Set WM hints.
-  size_hints.flags = PSize | PMinSize | PMaxSize;
-  size_hints.min_width = size_hints.max_width = size_hints.base_width = Width;
-  size_hints.min_height = size_hints.max_height = size_hints.base_height = Height;
-  XSetWMNormalHints (Drv->display, Drv->win, &size_hints);
-
-  XMapWindow (Drv->display, Drv->win);
-  HandleEvents (Drv);
-  return EFI_SUCCESS;
-}
-
-void
-handleKeyEvent (
-  IN  GRAPHICS_IO_PRIVATE *Drv,
-  IN  XEvent              *ev,
-  IN  BOOLEAN             Make
-  )
-{
-  KeySym        *KeySym;
-  EFI_KEY_DATA  KeyData;
-  int           KeySymArraySize;
-
-  if (Make) {
-    if (Drv->key_count == NBR_KEYS) {
-      return;
-    }
-  }
-
-  // keycode is a physical key on the keyboard
-  // KeySym is a mapping of a physical key
-  // KeyboardMapping is the array of KeySym for a given keycode. key, shifted key, option key, command key, ...
-  //
-  // Returns an array of KeySymArraySize of KeySym for the keycode. [0] is lower case, [1] is upper case,
-  // [2] and [3] are based on option and command modifiers. The problem we have is command V
-  // could be mapped to a crazy Unicode character so the old scheme of returning a string.
-  //
-  KeySym = XGetKeyboardMapping (Drv->display, ev->xkey.keycode, 1, &KeySymArraySize);
-
-  KeyData.Key.ScanCode = 0;
-  KeyData.Key.UnicodeChar = 0;
-  KeyData.KeyState.KeyShiftState = 0;
-
-  //
-  // Skipping EFI_SCROLL_LOCK_ACTIVE & EFI_NUM_LOCK_ACTIVE since they are not on Macs
-  //
-  if ((ev->xkey.state & LockMask) == 0) {
-    Drv->KeyState.KeyToggleState &= ~EFI_CAPS_LOCK_ACTIVE;
-  } else {
-    if (Make) {
-      Drv->KeyState.KeyToggleState |= EFI_CAPS_LOCK_ACTIVE;
-    }
-  }
-
-  // Skipping EFI_MENU_KEY_PRESSED and EFI_SYS_REQ_PRESSED
-
-  switch (*KeySym) {
-  case XK_Control_R:
-    if (Make) {
-      Drv->KeyState.KeyShiftState |=  EFI_RIGHT_CONTROL_PRESSED;
-    } else {
-      Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_CONTROL_PRESSED;
-    }
-   break;
-  case XK_Control_L:
-    if (Make) {
-      Drv->KeyState.KeyShiftState |=  EFI_LEFT_CONTROL_PRESSED;
-    } else {
-      Drv->KeyState.KeyShiftState &= ~EFI_LEFT_CONTROL_PRESSED;
-    }
-    break;
-
-  case XK_Shift_R:
-    if (Make) {
-      Drv->KeyState.KeyShiftState |=  EFI_RIGHT_SHIFT_PRESSED;
-    } else {
-      Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_SHIFT_PRESSED;
-    }
-    break;
-  case XK_Shift_L:
-    if (Make) {
-      Drv->KeyState.KeyShiftState |=  EFI_LEFT_SHIFT_PRESSED;
-    } else {
-      Drv->KeyState.KeyShiftState &= ~EFI_LEFT_SHIFT_PRESSED;
-    }
-    break;
-
-  case XK_Mode_switch:
-    if (Make) {
-      Drv->KeyState.KeyShiftState |=  EFI_LEFT_ALT_PRESSED;
-    } else {
-      Drv->KeyState.KeyShiftState &= ~EFI_LEFT_ALT_PRESSED;
-    }
-    break;
-
-  case XK_Meta_R:
-    if (Make) {
-      Drv->KeyState.KeyShiftState |=  EFI_RIGHT_LOGO_PRESSED;
-    } else {
-      Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_LOGO_PRESSED;
-    }
-    break;
-  case XK_Meta_L:
-    if (Make) {
-      Drv->KeyState.KeyShiftState |=  EFI_LEFT_LOGO_PRESSED;
-    } else {
-      Drv->KeyState.KeyShiftState &= ~EFI_LEFT_LOGO_PRESSED;
-    }
-    break;
-
-  case XK_KP_Home:
-  case XK_Home:       KeyData.Key.ScanCode = SCAN_HOME;       break;
-
-  case XK_KP_End:
-  case XK_End:        KeyData.Key.ScanCode = SCAN_END;        break;
-
-  case XK_KP_Left:
-  case XK_Left:       KeyData.Key.ScanCode = SCAN_LEFT;       break;
-
-  case XK_KP_Right:
-  case XK_Right:      KeyData.Key.ScanCode = SCAN_RIGHT;      break;
-
-  case XK_KP_Up:
-  case XK_Up:         KeyData.Key.ScanCode = SCAN_UP;         break;
-
-  case XK_KP_Down:
-  case XK_Down:       KeyData.Key.ScanCode = SCAN_DOWN;       break;
-
-  case XK_KP_Delete:
-  case XK_Delete:       KeyData.Key.ScanCode = SCAN_DELETE;     break;
-
-  case XK_KP_Insert:
-  case XK_Insert:     KeyData.Key.ScanCode = SCAN_INSERT;     break;
-
-  case XK_KP_Page_Up:
-  case XK_Page_Up:    KeyData.Key.ScanCode = SCAN_PAGE_UP;    break;
-
-  case XK_KP_Page_Down:
-  case XK_Page_Down:  KeyData.Key.ScanCode = SCAN_PAGE_DOWN;  break;
-
-  case XK_Escape:     KeyData.Key.ScanCode = SCAN_ESC;        break;
-
-  case XK_Pause:      KeyData.Key.ScanCode = SCAN_PAUSE;      break;
-
-  case XK_KP_F1:
-  case XK_F1:   KeyData.Key.ScanCode = SCAN_F1;   break;
-
-  case XK_KP_F2:
-  case XK_F2:   KeyData.Key.ScanCode = SCAN_F2;   break;
-
-  case XK_KP_F3:
-  case XK_F3:   KeyData.Key.ScanCode = SCAN_F3;   break;
-
-  case XK_KP_F4:
-  case XK_F4:   KeyData.Key.ScanCode = SCAN_F4;   break;
-
-  case XK_F5:   KeyData.Key.ScanCode = SCAN_F5;   break;
-  case XK_F6:   KeyData.Key.ScanCode = SCAN_F6;   break;
-  case XK_F7:   KeyData.Key.ScanCode = SCAN_F7;   break;
-
-  // Don't map into X11 by default on a Mac
-  // System Preferences->Keyboard->Keyboard Shortcuts can be configured
-  // to not use higher function keys as shortcuts and the will show up
-  // in X11.
-  case XK_F8:   KeyData.Key.ScanCode = SCAN_F8;   break;
-  case XK_F9:   KeyData.Key.ScanCode = SCAN_F9;   break;
-  case XK_F10:  KeyData.Key.ScanCode = SCAN_F10;  break;
-
-  case XK_F11:  KeyData.Key.ScanCode = SCAN_F11;  break;
-  case XK_F12:  KeyData.Key.ScanCode = SCAN_F12;  break;
-
-  case XK_F13:  KeyData.Key.ScanCode = SCAN_F13;  break;
-  case XK_F14:  KeyData.Key.ScanCode = SCAN_F14;  break;
-  case XK_F15:  KeyData.Key.ScanCode = SCAN_F15;  break;
-  case XK_F16:  KeyData.Key.ScanCode = SCAN_F16;  break;
-  case XK_F17:  KeyData.Key.ScanCode = SCAN_F17;  break;
-  case XK_F18:  KeyData.Key.ScanCode = SCAN_F18;  break;
-  case XK_F19:  KeyData.Key.ScanCode = SCAN_F19;  break;
-  case XK_F20:  KeyData.Key.ScanCode = SCAN_F20;  break;
-  case XK_F21:  KeyData.Key.ScanCode = SCAN_F21;  break;
-  case XK_F22:  KeyData.Key.ScanCode = SCAN_F22;  break;
-  case XK_F23:  KeyData.Key.ScanCode = SCAN_F23;  break;
-  case XK_F24:  KeyData.Key.ScanCode = SCAN_F24;  break;
-
-  // No mapping in X11
-  //case XK_:   KeyData.Key.ScanCode = SCAN_MUTE;            break;
-  //case XK_:   KeyData.Key.ScanCode = SCAN_VOLUME_UP;       break;
-  //case XK_:   KeyData.Key.ScanCode = SCAN_VOLUME_DOWN;     break;
-  //case XK_:   KeyData.Key.ScanCode = SCAN_BRIGHTNESS_UP;   break;
-  //case XK_:   KeyData.Key.ScanCode = SCAN_BRIGHTNESS_DOWN; break;
-  //case XK_:   KeyData.Key.ScanCode = SCAN_SUSPEND;         break;
-  //case XK_:   KeyData.Key.ScanCode = SCAN_HIBERNATE;       break;
-  //case XK_:   KeyData.Key.ScanCode = SCAN_TOGGLE_DISPLAY;  break;
-  //case XK_:   KeyData.Key.ScanCode = SCAN_RECOVERY;        break;
-  //case XK_:   KeyData.Key.ScanCode = SCAN_EJECT;           break;
-
-  case XK_BackSpace:  KeyData.Key.UnicodeChar = 0x0008; break;
-
-  case XK_KP_Tab:
-  case XK_Tab:        KeyData.Key.UnicodeChar = 0x0009; break;
-
-  case XK_Linefeed:   KeyData.Key.UnicodeChar = 0x000a; break;
-
-  case XK_KP_Enter:
-  case XK_Return:     KeyData.Key.UnicodeChar = 0x000d; break;
-
-  case XK_KP_Equal      : KeyData.Key.UnicodeChar = L'='; break;
-  case XK_KP_Multiply   : KeyData.Key.UnicodeChar = L'*'; break;
-  case XK_KP_Add        : KeyData.Key.UnicodeChar = L'+'; break;
-  case XK_KP_Separator  : KeyData.Key.UnicodeChar = L'~'; break;
-  case XK_KP_Subtract   : KeyData.Key.UnicodeChar = L'-'; break;
-  case XK_KP_Decimal    : KeyData.Key.UnicodeChar = L'.'; break;
-  case XK_KP_Divide     : KeyData.Key.UnicodeChar = L'/'; break;
-
-  case XK_KP_0    : KeyData.Key.UnicodeChar = L'0'; break;
-  case XK_KP_1    : KeyData.Key.UnicodeChar = L'1'; break;
-  case XK_KP_2    : KeyData.Key.UnicodeChar = L'2'; break;
-  case XK_KP_3    : KeyData.Key.UnicodeChar = L'3'; break;
-  case XK_KP_4    : KeyData.Key.UnicodeChar = L'4'; break;
-  case XK_KP_5    : KeyData.Key.UnicodeChar = L'5'; break;
-  case XK_KP_6    : KeyData.Key.UnicodeChar = L'6'; break;
-  case XK_KP_7    : KeyData.Key.UnicodeChar = L'7'; break;
-  case XK_KP_8    : KeyData.Key.UnicodeChar = L'8'; break;
-  case XK_KP_9    : KeyData.Key.UnicodeChar = L'9'; break;
-
-  default:
-    ;
-  }
-
-  // The global state is our state
-  KeyData.KeyState.KeyShiftState = Drv->KeyState.KeyShiftState;
-  KeyData.KeyState.KeyToggleState = Drv->KeyState.KeyToggleState;
-
-  if (*KeySym < XK_BackSpace) {
-    if (((Drv->KeyState.KeyShiftState & (EFI_LEFT_SHIFT_PRESSED | EFI_RIGHT_SHIFT_PRESSED)) != 0) ||
-        ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) != 0) ) {
-
-      KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_UPPER];
-
-      // Per UEFI spec since we converted the Unicode clear the shift bits we pass up
-      KeyData.KeyState.KeyShiftState &= ~(EFI_LEFT_SHIFT_PRESSED | EFI_RIGHT_SHIFT_PRESSED);
-    } else {
-      KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_LOWER];
-    }
-  } else {
-    // XK_BackSpace is the start of XK_MISCELLANY. These are the XK_? keys we process in this file
-    ;
-  }
-
-  if (Make) {
-    memcpy (&Drv->keys[Drv->key_wr], &KeyData, sizeof (EFI_KEY_DATA));
-    Drv->key_wr = (Drv->key_wr + 1) % NBR_KEYS;
-    Drv->key_count++;
-    if (Drv->MakeRegisterdKeyCallback != NULL) {
-      ReverseGasketUint64Uint64 (Drv->MakeRegisterdKeyCallback ,Drv->RegisterdKeyCallbackContext, &KeyData);
-    }
-  } else {
-    if (Drv->BreakRegisterdKeyCallback != NULL) {
-      ReverseGasketUint64Uint64 (Drv->BreakRegisterdKeyCallback ,Drv->RegisterdKeyCallbackContext, &KeyData);
-    }
-  }
-}
-
-
-void
-handleMouseMoved(
-  IN  GRAPHICS_IO_PRIVATE   *Drv,
-  IN  XEvent                *ev
-  )
-{
-  if (ev->xmotion.x != Drv->previous_x) {
-    Drv->pointer_state.RelativeMovementX += ( ev->xmotion.x - Drv->previous_x );
-    Drv->previous_x = ev->xmotion.x;
-    Drv->pointer_state_changed = 1;
-  }
-
-  if (ev->xmotion.y != Drv->previous_y) {
-    Drv->pointer_state.RelativeMovementY += ( ev->xmotion.y - Drv->previous_y );
-    Drv->previous_y = ev->xmotion.y;
-    Drv->pointer_state_changed = 1;
-  }
-
-  Drv->pointer_state.RelativeMovementZ = 0;
-}
-
-void
-handleMouseDown (
-  IN  GRAPHICS_IO_PRIVATE *Drv,
-  IN  XEvent              *ev,
-  IN  BOOLEAN             Pressed
-  )
-{
-  if (ev->xbutton.button == Button1) {
-    Drv->pointer_state_changed = (Drv->pointer_state.LeftButton != Pressed);
-    Drv->pointer_state.LeftButton = Pressed;
-  }
-  if ( ev->xbutton.button == Button2 ) {
-    Drv->pointer_state_changed = (Drv->pointer_state.RightButton != Pressed);
-    Drv->pointer_state.RightButton = Pressed;
-  }
-}
-
-void
-Redraw (
-  IN  GRAPHICS_IO_PRIVATE *Drv,
-  IN  UINTN               X,
-  IN  UINTN               Y,
-  IN  UINTN               Width,
-  IN  UINTN               Height
-  )
-{
-  if (Drv->use_shm) {
-    XShmPutImage (
-      Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height, False
-      );
-  } else {
-    XPutImage (
-      Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height
-      );
-  }
-  XFlush(Drv->display);
-}
-
-void
-HandleEvent(GRAPHICS_IO_PRIVATE *Drv, XEvent *ev)
-{
-  switch (ev->type) {
-  case Expose:
-    Redraw (Drv, ev->xexpose.x, ev->xexpose.y,
-      ev->xexpose.width, ev->xexpose.height);
-    break;
-  case GraphicsExpose:
-    Redraw (Drv, ev->xgraphicsexpose.x, ev->xgraphicsexpose.y,
-      ev->xgraphicsexpose.width, ev->xgraphicsexpose.height);
-    break;
-  case KeyPress:
-    handleKeyEvent (Drv, ev, TRUE);
-    break;
-  case KeyRelease:
-    handleKeyEvent (Drv, ev, FALSE);
-    break;
-  case MappingNotify:
-    XRefreshKeyboardMapping (&ev->xmapping);
-    break;
-  case MotionNotify:
-    handleMouseMoved (Drv, ev);
-    break;
-  case ButtonPress:
-    handleMouseDown (Drv, ev, TRUE);
-  break;
-  case ButtonRelease:
-    handleMouseDown (Drv, ev, FALSE);
-  break;
-#if 0
-  case DestroyNotify:
-    XCloseDisplay (Drv->display);
-    exit (1);
-    break;
-#endif
-  case NoExpose:
-  default:
-    break;
-  }
-}
-
-void
-HandleEvents (
-  IN  GRAPHICS_IO_PRIVATE *Drv
-  )
-{
-  XEvent ev;
-
-  while (XPending (Drv->display) != 0) {
-    XNextEvent (Drv->display, &ev);
-    HandleEvent (Drv, &ev);
-  }
-}
-
-unsigned long
-X11PixelToColor (
-  IN  GRAPHICS_IO_PRIVATE *Drv,
-  IN  EFI_UGA_PIXEL       pixel
-  )
-{
-  return ((pixel.Red   >> Drv->r.csize) << Drv->r.shift)
-       | ((pixel.Green >> Drv->g.csize) << Drv->g.shift)
-       | ((pixel.Blue  >> Drv->b.csize) << Drv->b.shift);
-}
-
-EFI_UGA_PIXEL
-X11ColorToPixel (
-  IN  GRAPHICS_IO_PRIVATE *Drv,
-  IN  unsigned long       val
-  )
-{
-  EFI_UGA_PIXEL Pixel;
-
-  memset (&Pixel, 0, sizeof (EFI_UGA_PIXEL));
-
-  // Truncation not an issue since X11 and EFI are both using 8 bits per color
-  Pixel.Red =   (val >> Drv->r.shift) << Drv->r.csize;
-  Pixel.Green = (val >> Drv->g.shift) << Drv->g.csize;
-  Pixel.Blue =  (val >> Drv->b.shift) << Drv->b.csize;
-
-  return Pixel;
-}
-
-
-EFI_STATUS
-X11CheckKey (
-  IN  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo
-  )
-{
-  GRAPHICS_IO_PRIVATE  *Drv;
-
-  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
-
-  HandleEvents (Drv);
-
-  if (Drv->key_count != 0) {
-    return EFI_SUCCESS;
-  }
-
-  return EFI_NOT_READY;
-}
-
-EFI_STATUS
-X11GetKey (
-  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsIo,
-  IN  EFI_KEY_DATA                  *KeyData
-  )
-{
-  EFI_STATUS          EfiStatus;
-  GRAPHICS_IO_PRIVATE *Drv;
-
-  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
-
-  EfiStatus = X11CheckKey (GraphicsIo);
-  if (EFI_ERROR (EfiStatus)) {
-    return EfiStatus;
-  }
-
-  CopyMem (KeyData, &Drv->keys[Drv->key_rd], sizeof (EFI_KEY_DATA));
-  Drv->key_rd = (Drv->key_rd + 1) % NBR_KEYS;
-  Drv->key_count--;
-
-  return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-X11KeySetState (
-  IN EMU_GRAPHICS_WINDOW_PROTOCOL   *GraphicsIo,
-  IN EFI_KEY_TOGGLE_STATE           *KeyToggleState
-  )
-{
-  GRAPHICS_IO_PRIVATE  *Drv;
-
-  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
-
-  if (*KeyToggleState & EFI_CAPS_LOCK_ACTIVE) {
-    if ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) == 0) {
-      //
-      // We could create an XKeyEvent and send a XK_Caps_Lock to
-      // the UGA/GOP Window
-      //
-    }
-  }
-
-  Drv->KeyState.KeyToggleState = *KeyToggleState;
-  return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-X11RegisterKeyNotify (
-  IN EMU_GRAPHICS_WINDOW_PROTOCOL                        *GraphicsIo,
-  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK    MakeCallBack,
-  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK    BreakCallBack,
-  IN VOID                                                *Context
-  )
-{
-  GRAPHICS_IO_PRIVATE  *Drv;
-
-  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
-
-  Drv->MakeRegisterdKeyCallback    = MakeCallBack;
-  Drv->BreakRegisterdKeyCallback   = BreakCallBack;
-  Drv->RegisterdKeyCallbackContext = Context;
-
-  return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-X11Blt (
-  IN EMU_GRAPHICS_WINDOW_PROTOCOL             *GraphicsIo,
-  IN  EFI_UGA_PIXEL                           *BltBuffer OPTIONAL,
-  IN  EFI_UGA_BLT_OPERATION                   BltOperation,
-  IN  EMU_GRAPHICS_WINDOWS__BLT_ARGS          *Args
-  )
-{
-  GRAPHICS_IO_PRIVATE *Private;
-  UINTN             DstY;
-  UINTN             SrcY;
-  UINTN             DstX;
-  UINTN             SrcX;
-  UINTN             Index;
-  EFI_UGA_PIXEL     *Blt;
-  UINT8             *Dst;
-  UINT8             *Src;
-  UINTN             Nbr;
-  unsigned long     Color;
-  XEvent            ev;
-
-  Private = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
-
-
-  //
-  //  Check bounds
-  //
-  if (BltOperation == EfiUgaVideoToBltBuffer
-      || BltOperation == EfiUgaVideoToVideo) {
-    //
-    // Source is Video.
-    //
-    if (Args->SourceY + Args->Height > Private->height) {
-      return EFI_INVALID_PARAMETER;
-    }
-
-    if (Args->SourceX + Args->Width > Private->width) {
-      return EFI_INVALID_PARAMETER;
-    }
-  }
-
-  if (BltOperation == EfiUgaBltBufferToVideo
-      || BltOperation == EfiUgaVideoToVideo
-      || BltOperation == EfiUgaVideoFill) {
-    //
-    // Destination is Video
-    //
-    if (Args->DestinationY + Args->Height > Private->height) {
-      return EFI_INVALID_PARAMETER;
-    }
-
-    if (Args->DestinationX + Args->Width > Private->width) {
-      return EFI_INVALID_PARAMETER;
-    }
-  }
-
-  switch (BltOperation) {
-  case EfiUgaVideoToBltBuffer:
-    Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->DestinationY * Args->Delta) + Args->DestinationX * sizeof (EFI_UGA_PIXEL));
-    Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);
-    for (SrcY = Args->SourceY; SrcY < (Args->Height + Args->SourceY); SrcY++) {
-      for (SrcX = Args->SourceX; SrcX < (Args->Width + Args->SourceX); SrcX++) {
-        *Blt++ = X11ColorToPixel (Private, XGetPixel (Private->image, SrcX, SrcY));
-      }
-      Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);
-    }
-    break;
-  case EfiUgaBltBufferToVideo:
-    Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->SourceY * Args->Delta) + Args->SourceX * sizeof (EFI_UGA_PIXEL));
-    Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);
-    for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY); DstY++) {
-      for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX); DstX++) {
-        XPutPixel(Private->image, DstX, DstY, X11PixelToColor(Private, *Blt));
-        Blt++;
-      }
-      Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);
-    }
-    break;
-  case EfiUgaVideoToVideo:
-    Dst = Private->image_data + (Args->DestinationX << Private->pixel_shift)
-          + Args->DestinationY * Private->line_bytes;
-    Src = Private->image_data + (Args->SourceX << Private->pixel_shift)
-          + Args->SourceY * Private->line_bytes;
-    Nbr = Args->Width << Private->pixel_shift;
-    if (Args->DestinationY < Args->SourceY) {
-      for (Index = 0; Index < Args->Height; Index++) {
-        memcpy (Dst, Src, Nbr);
-        Dst += Private->line_bytes;
-        Src += Private->line_bytes;
-      }
-    } else {
-      Dst += (Args->Height - 1) * Private->line_bytes;
-      Src += (Args->Height - 1) * Private->line_bytes;
-      for (Index = 0; Index < Args->Height; Index++) {
-      //
-      // Source and Destination Y may be equal, therefore Dst and Src may
-      // overlap.
-      //
-      memmove (Dst, Src, Nbr);
-      Dst -= Private->line_bytes;
-      Src -= Private->line_bytes;
-      }
-    }
-    break;
-  case EfiUgaVideoFill:
-    Color = X11PixelToColor(Private, *BltBuffer);
-    for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY); DstY++) {
-      for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX); DstX++) {
-        XPutPixel(Private->image, DstX, DstY, Color);
-      }
-    }
-    break;
-  default:
-    return EFI_INVALID_PARAMETER;
-  }
-
-  //
-  //  Refresh screen.
-  //
-  switch (BltOperation) {
-  case EfiUgaVideoToVideo:
-    XCopyArea(
-      Private->display, Private->win, Private->win, Private->gc,
-      Args->SourceX, Args->SourceY, Args->Width, Args->Height,
-      Args->DestinationX, Args->DestinationY
-      );
-
-    while (1) {
-      XNextEvent (Private->display, &ev);
-      HandleEvent (Private, &ev);
-      if (ev.type == NoExpose || ev.type == GraphicsExpose) {
-        break;
-      }
-    }
-    break;
-  case EfiUgaVideoFill:
-    Color = X11PixelToColor (Private, *BltBuffer);
-    XSetForeground (Private->display, Private->gc, Color);
-    XFillRectangle (
-      Private->display, Private->win, Private->gc,
-      Args->DestinationX, Args->DestinationY, Args->Width, Args->Height
-      );
-    XFlush (Private->display);
-    break;
-  case EfiUgaBltBufferToVideo:
-    Redraw (Private, Args->DestinationX, Args->DestinationY, Args->Width, Args->Height);
-    break;
-  default:
-    break;
-  }
-  return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-X11CheckPointer (
-  IN  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo
-  )
-{
-  GRAPHICS_IO_PRIVATE  *Drv;
-
-  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
-
-  HandleEvents (Drv);
-  if (Drv->pointer_state_changed != 0) {
-    return EFI_SUCCESS;
-  }
-
-  return EFI_NOT_READY;
-}
-
-
-EFI_STATUS
-X11GetPointerState (
-  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsIo,
-  IN  EFI_SIMPLE_POINTER_STATE      *State
-  )
-{
-  EFI_STATUS          EfiStatus;
-  GRAPHICS_IO_PRIVATE *Drv;
-
-  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
-
-  EfiStatus = X11CheckPointer (GraphicsIo);
-  if (EfiStatus != EFI_SUCCESS) {
-    return EfiStatus;
-  }
-
-  memcpy (State, &Drv->pointer_state, sizeof (EFI_SIMPLE_POINTER_STATE));
-
-  Drv->pointer_state.RelativeMovementX = 0;
-  Drv->pointer_state.RelativeMovementY = 0;
-  Drv->pointer_state.RelativeMovementZ = 0;
-  Drv->pointer_state_changed = 0;
-  return EFI_SUCCESS;
-}
-
-
-
-EFI_STATUS
-X11GraphicsWindowOpen (
-  IN  EMU_IO_THUNK_PROTOCOL   *This
-  )
-{
-  GRAPHICS_IO_PRIVATE *Drv;
-  unsigned int        border_width = 0;
-  char                *display_name = NULL;
-
-  Drv = (GRAPHICS_IO_PRIVATE *)calloc (1, sizeof (GRAPHICS_IO_PRIVATE));
-  if (Drv == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  Drv->GraphicsIo.Size                = GasketX11Size;
-  Drv->GraphicsIo.CheckKey            = GasketX11CheckKey;
-  Drv->GraphicsIo.GetKey              = GasketX11GetKey;
-  Drv->GraphicsIo.KeySetState         = GasketX11KeySetState;
-  Drv->GraphicsIo.RegisterKeyNotify   = GasketX11RegisterKeyNotify;
-  Drv->GraphicsIo.Blt                 = GasketX11Blt;
-  Drv->GraphicsIo.CheckPointer        = GasketX11CheckPointer;
-  Drv->GraphicsIo.GetPointerState     = GasketX11GetPointerState;
-
-
-  Drv->key_count = 0;
-  Drv->key_rd = 0;
-  Drv->key_wr = 0;
-  Drv->KeyState.KeyShiftState      = EFI_SHIFT_STATE_VALID;
-  Drv->KeyState.KeyToggleState     = EFI_TOGGLE_STATE_VALID;
-  Drv->MakeRegisterdKeyCallback    = NULL;
-  Drv->BreakRegisterdKeyCallback   = NULL;
-  Drv->RegisterdKeyCallbackContext = NULL;
-
-
-  Drv->display = XOpenDisplay (display_name);
-  if (Drv->display == NULL) {
-    fprintf (stderr, "uga: cannot connect to X server %s\n", XDisplayName (display_name));
-    free (Drv);
-    return EFI_DEVICE_ERROR;
-  }
-  Drv->screen = DefaultScreen (Drv->display);
-  Drv->visual = DefaultVisual (Drv->display, Drv->screen);
-  Drv->win = XCreateSimpleWindow (
-                Drv->display, RootWindow (Drv->display, Drv->screen),
-                0, 0, 4, 4, border_width,
-                WhitePixel (Drv->display, Drv->screen),
-                BlackPixel (Drv->display, Drv->screen)
-                );
-
-  Drv->depth = DefaultDepth (Drv->display, Drv->screen);
-  XDefineCursor (Drv->display, Drv->win, XCreateFontCursor (Drv->display, XC_pirate));
-
-  Drv->Title = malloc (StrSize (This->ConfigString));
-  UnicodeStrToAsciiStr (This->ConfigString, Drv->Title);
-  XStoreName (Drv->display, Drv->win, Drv->Title);
-
-//  XAutoRepeatOff (Drv->display);
-  XSelectInput (
-    Drv->display, Drv->win,
-    ExposureMask | KeyPressMask | KeyReleaseMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask
-    );
-  Drv->gc = DefaultGC (Drv->display, Drv->screen);
-
-  This->Private   = (VOID *)Drv;
-  This->Interface = (VOID *)Drv;
-  return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-X11GraphicsWindowClose (
-  IN  EMU_IO_THUNK_PROTOCOL   *This
-  )
-{
-  GRAPHICS_IO_PRIVATE *Drv;
-
-  Drv = (GRAPHICS_IO_PRIVATE *)This->Private;
-
-  if (Drv == NULL) {
-    return EFI_SUCCESS;
-  }
-
-  if (Drv->image != NULL) {
-    XDestroyImage(Drv->image);
-
-    if (Drv->use_shm) {
-      shmdt (Drv->image_data);
-    }
-
-    Drv->image_data = NULL;
-    Drv->image = NULL;
-  }
-  XDestroyWindow (Drv->display, Drv->win);
-  XCloseDisplay (Drv->display);
-
-#ifdef __APPLE__
-  // Free up the shared memory
-  shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
-#endif
-
-  free (Drv);
-  return EFI_SUCCESS;
-}
-
-
-EMU_IO_THUNK_PROTOCOL gX11ThunkIo = {
-  &gEmuGraphicsWindowProtocolGuid,
-  NULL,
-  NULL,
-  0,
-  GasketX11GraphicsWindowOpen,
-  GasketX11GraphicsWindowClose,
-  NULL
-};
-
-
+/*++ @file
+
+Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
+Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
+
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include "Host.h"
+
+#include <sys/ipc.h>
+#include <sys/shm.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xos.h>
+#include <X11/extensions/XShm.h>
+#include <X11/keysym.h>
+#include <X11/cursorfont.h>
+
+#define KEYSYM_LOWER  0
+#define KEYSYM_UPPER  1
+
+
+struct uga_drv_shift_mask {
+  unsigned char shift;
+  unsigned char size;
+  unsigned char csize;
+};
+
+#define NBR_KEYS 32
+typedef struct {
+  EMU_GRAPHICS_WINDOW_PROTOCOL GraphicsIo;
+
+  Display     *display;
+  int         screen;      // values for window_size in main
+  Window      win;
+  GC          gc;
+  Visual      *visual;
+
+  int           depth;
+  unsigned int  width;
+  unsigned int  height;
+  unsigned int  line_bytes;
+  unsigned int  pixel_shift;
+  unsigned char *image_data;
+
+  struct uga_drv_shift_mask r, g, b;
+
+  int             use_shm;
+  XShmSegmentInfo xshm_info;
+  XImage          *image;
+  char            *Title;
+
+  unsigned int key_rd;
+  unsigned int key_wr;
+  unsigned int key_count;
+  EFI_KEY_DATA keys[NBR_KEYS];
+
+  EFI_KEY_STATE KeyState;
+
+  EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK    MakeRegisterdKeyCallback;
+  EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK    BreakRegisterdKeyCallback;
+  VOID                                                *RegisterdKeyCallbackContext;
+
+  int                        previous_x;
+  int                        previous_y;
+  EFI_SIMPLE_POINTER_STATE   pointer_state;
+  int                        pointer_state_changed;
+} GRAPHICS_IO_PRIVATE;
+
+void
+HandleEvents(
+  IN GRAPHICS_IO_PRIVATE *Drv
+  );
+
+void
+fill_shift_mask (
+  IN  struct uga_drv_shift_mask *sm,
+  IN  unsigned long             mask
+  )
+{
+  sm->shift = 0;
+  sm->size = 0;
+  while ((mask & 1) == 0) {
+    mask >>= 1;
+    sm->shift++;
+  }
+  while (mask & 1) {
+    sm->size++;
+    mask >>= 1;
+  }
+  sm->csize = 8 - sm->size;
+}
+
+int
+TryCreateShmImage (
+  IN  GRAPHICS_IO_PRIVATE *Drv
+  )
+{
+  Drv->image = XShmCreateImage (
+                 Drv->display, Drv->visual,
+                 Drv->depth, ZPixmap, NULL, &Drv->xshm_info,
+                 Drv->width, Drv->height
+                 );
+  if (Drv->image == NULL) {
+    return 0;
+  }
+
+  switch (Drv->image->bitmap_unit) {
+  case 32:
+    Drv->pixel_shift = 2;
+    break;
+  case 16:
+    Drv->pixel_shift = 1;
+    break;
+  case 8:
+    Drv->pixel_shift = 0;
+    break;
+  }
+
+  Drv->xshm_info.shmid = shmget (
+                          IPC_PRIVATE, Drv->image->bytes_per_line * Drv->image->height,
+                          IPC_CREAT | 0777
+                          );
+  if (Drv->xshm_info.shmid < 0) {
+    XDestroyImage(Drv->image);
+    return 0;
+  }
+
+  Drv->image_data = shmat (Drv->xshm_info.shmid, NULL, 0);
+  if(!Drv->image_data) {
+    shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
+    XDestroyImage(Drv->image);
+    return 0;
+  }
+
+#ifndef __APPLE__
+  //
+  // This closes shared memory in real time on OS X. Only closes after folks quit using
+  // it on Linux.
+  //
+  shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
+#endif
+
+  Drv->xshm_info.shmaddr = (char*)Drv->image_data;
+  Drv->image->data = (char*)Drv->image_data;
+
+  if (!XShmAttach (Drv->display, &Drv->xshm_info)) {
+    shmdt (Drv->image_data);
+    XDestroyImage(Drv->image);
+    return 0;
+  }
+  return 1;
+}
+
+
+EFI_STATUS
+X11Size (
+  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsIo,
+  IN  UINT32                        Width,
+  IN  UINT32                        Height
+  )
+{
+  GRAPHICS_IO_PRIVATE *Drv;
+  XSizeHints          size_hints;
+
+  // Destroy current buffer if created.
+  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
+  if (Drv->image != NULL) {
+    // Before destroy buffer, need to make sure the buffer available for access.
+    XDestroyImage (Drv->image);
+
+    if (Drv->use_shm) {
+      shmdt (Drv->image_data);
+    }
+
+    Drv->image_data = NULL;
+    Drv->image = NULL;
+  }
+
+  Drv->width = Width;
+  Drv->height = Height;
+  XResizeWindow (Drv->display, Drv->win, Width, Height);
+
+  // Allocate image.
+  if (XShmQueryExtension(Drv->display) && TryCreateShmImage(Drv)) {
+    Drv->use_shm = 1;
+  } else {
+    Drv->use_shm = 0;
+    if (Drv->depth > 16) {
+      Drv->pixel_shift = 2;
+    } else if (Drv->depth > 8) {
+      Drv->pixel_shift = 1;
+    } else {
+      Drv->pixel_shift = 0;
+    }
+
+    Drv->image_data = malloc ((Drv->width * Drv->height) << Drv->pixel_shift);
+    Drv->image = XCreateImage (
+                    Drv->display, Drv->visual, Drv->depth,
+                    ZPixmap, 0, (char *)Drv->image_data,
+                    Drv->width, Drv->height,
+                    8 << Drv->pixel_shift, 0
+                    );
+  }
+
+  Drv->line_bytes = Drv->image->bytes_per_line;
+
+  fill_shift_mask (&Drv->r, Drv->image->red_mask);
+  fill_shift_mask (&Drv->g, Drv->image->green_mask);
+  fill_shift_mask (&Drv->b, Drv->image->blue_mask);
+
+  // Set WM hints.
+  size_hints.flags = PSize | PMinSize | PMaxSize;
+  size_hints.min_width = size_hints.max_width = size_hints.base_width = Width;
+  size_hints.min_height = size_hints.max_height = size_hints.base_height = Height;
+  XSetWMNormalHints (Drv->display, Drv->win, &size_hints);
+
+  XMapWindow (Drv->display, Drv->win);
+  HandleEvents (Drv);
+  return EFI_SUCCESS;
+}
+
+void
+handleKeyEvent (
+  IN  GRAPHICS_IO_PRIVATE *Drv,
+  IN  XEvent              *ev,
+  IN  BOOLEAN             Make
+  )
+{
+  KeySym        *KeySym;
+  EFI_KEY_DATA  KeyData;
+  int           KeySymArraySize;
+
+  if (Make) {
+    if (Drv->key_count == NBR_KEYS) {
+      return;
+    }
+  }
+
+  // keycode is a physical key on the keyboard
+  // KeySym is a mapping of a physical key
+  // KeyboardMapping is the array of KeySym for a given keycode. key, shifted key, option key, command key, ...
+  //
+  // Returns an array of KeySymArraySize of KeySym for the keycode. [0] is lower case, [1] is upper case,
+  // [2] and [3] are based on option and command modifiers. The problem we have is command V
+  // could be mapped to a crazy Unicode character so the old scheme of returning a string.
+  //
+  KeySym = XGetKeyboardMapping (Drv->display, ev->xkey.keycode, 1, &KeySymArraySize);
+
+  KeyData.Key.ScanCode = 0;
+  KeyData.Key.UnicodeChar = 0;
+  KeyData.KeyState.KeyShiftState = 0;
+
+  //
+  // Skipping EFI_SCROLL_LOCK_ACTIVE & EFI_NUM_LOCK_ACTIVE since they are not on Macs
+  //
+  if ((ev->xkey.state & LockMask) == 0) {
+    Drv->KeyState.KeyToggleState &= ~EFI_CAPS_LOCK_ACTIVE;
+  } else {
+    if (Make) {
+      Drv->KeyState.KeyToggleState |= EFI_CAPS_LOCK_ACTIVE;
+    }
+  }
+
+  // Skipping EFI_MENU_KEY_PRESSED and EFI_SYS_REQ_PRESSED
+
+  switch (*KeySym) {
+  case XK_Control_R:
+    if (Make) {
+      Drv->KeyState.KeyShiftState |=  EFI_RIGHT_CONTROL_PRESSED;
+    } else {
+      Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_CONTROL_PRESSED;
+    }
+   break;
+  case XK_Control_L:
+    if (Make) {
+      Drv->KeyState.KeyShiftState |=  EFI_LEFT_CONTROL_PRESSED;
+    } else {
+      Drv->KeyState.KeyShiftState &= ~EFI_LEFT_CONTROL_PRESSED;
+    }
+    break;
+
+  case XK_Shift_R:
+    if (Make) {
+      Drv->KeyState.KeyShiftState |=  EFI_RIGHT_SHIFT_PRESSED;
+    } else {
+      Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_SHIFT_PRESSED;
+    }
+    break;
+  case XK_Shift_L:
+    if (Make) {
+      Drv->KeyState.KeyShiftState |=  EFI_LEFT_SHIFT_PRESSED;
+    } else {
+      Drv->KeyState.KeyShiftState &= ~EFI_LEFT_SHIFT_PRESSED;
+    }
+    break;
+
+  case XK_Mode_switch:
+    if (Make) {
+      Drv->KeyState.KeyShiftState |=  EFI_LEFT_ALT_PRESSED;
+    } else {
+      Drv->KeyState.KeyShiftState &= ~EFI_LEFT_ALT_PRESSED;
+    }
+    break;
+
+  case XK_Meta_R:
+    if (Make) {
+      Drv->KeyState.KeyShiftState |=  EFI_RIGHT_LOGO_PRESSED;
+    } else {
+      Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_LOGO_PRESSED;
+    }
+    break;
+  case XK_Meta_L:
+    if (Make) {
+      Drv->KeyState.KeyShiftState |=  EFI_LEFT_LOGO_PRESSED;
+    } else {
+      Drv->KeyState.KeyShiftState &= ~EFI_LEFT_LOGO_PRESSED;
+    }
+    break;
+
+  case XK_KP_Home:
+  case XK_Home:       KeyData.Key.ScanCode = SCAN_HOME;       break;
+
+  case XK_KP_End:
+  case XK_End:        KeyData.Key.ScanCode = SCAN_END;        break;
+
+  case XK_KP_Left:
+  case XK_Left:       KeyData.Key.ScanCode = SCAN_LEFT;       break;
+
+  case XK_KP_Right:
+  case XK_Right:      KeyData.Key.ScanCode = SCAN_RIGHT;      break;
+
+  case XK_KP_Up:
+  case XK_Up:         KeyData.Key.ScanCode = SCAN_UP;         break;
+
+  case XK_KP_Down:
+  case XK_Down:       KeyData.Key.ScanCode = SCAN_DOWN;       break;
+
+  case XK_KP_Delete:
+  case XK_Delete:       KeyData.Key.ScanCode = SCAN_DELETE;     break;
+
+  case XK_KP_Insert:
+  case XK_Insert:     KeyData.Key.ScanCode = SCAN_INSERT;     break;
+
+  case XK_KP_Page_Up:
+  case XK_Page_Up:    KeyData.Key.ScanCode = SCAN_PAGE_UP;    break;
+
+  case XK_KP_Page_Down:
+  case XK_Page_Down:  KeyData.Key.ScanCode = SCAN_PAGE_DOWN;  break;
+
+  case XK_Escape:     KeyData.Key.ScanCode = SCAN_ESC;        break;
+
+  case XK_Pause:      KeyData.Key.ScanCode = SCAN_PAUSE;      break;
+
+  case XK_KP_F1:
+  case XK_F1:   KeyData.Key.ScanCode = SCAN_F1;   break;
+
+  case XK_KP_F2:
+  case XK_F2:   KeyData.Key.ScanCode = SCAN_F2;   break;
+
+  case XK_KP_F3:
+  case XK_F3:   KeyData.Key.ScanCode = SCAN_F3;   break;
+
+  case XK_KP_F4:
+  case XK_F4:   KeyData.Key.ScanCode = SCAN_F4;   break;
+
+  case XK_F5:   KeyData.Key.ScanCode = SCAN_F5;   break;
+  case XK_F6:   KeyData.Key.ScanCode = SCAN_F6;   break;
+  case XK_F7:   KeyData.Key.ScanCode = SCAN_F7;   break;
+
+  // Don't map into X11 by default on a Mac
+  // System Preferences->Keyboard->Keyboard Shortcuts can be configured
+  // to not use higher function keys as shortcuts and the will show up
+  // in X11.
+  case XK_F8:   KeyData.Key.ScanCode = SCAN_F8;   break;
+  case XK_F9:   KeyData.Key.ScanCode = SCAN_F9;   break;
+  case XK_F10:  KeyData.Key.ScanCode = SCAN_F10;  break;
+
+  case XK_F11:  KeyData.Key.ScanCode = SCAN_F11;  break;
+  case XK_F12:  KeyData.Key.ScanCode = SCAN_F12;  break;
+
+  case XK_F13:  KeyData.Key.ScanCode = SCAN_F13;  break;
+  case XK_F14:  KeyData.Key.ScanCode = SCAN_F14;  break;
+  case XK_F15:  KeyData.Key.ScanCode = SCAN_F15;  break;
+  case XK_F16:  KeyData.Key.ScanCode = SCAN_F16;  break;
+  case XK_F17:  KeyData.Key.ScanCode = SCAN_F17;  break;
+  case XK_F18:  KeyData.Key.ScanCode = SCAN_F18;  break;
+  case XK_F19:  KeyData.Key.ScanCode = SCAN_F19;  break;
+  case XK_F20:  KeyData.Key.ScanCode = SCAN_F20;  break;
+  case XK_F21:  KeyData.Key.ScanCode = SCAN_F21;  break;
+  case XK_F22:  KeyData.Key.ScanCode = SCAN_F22;  break;
+  case XK_F23:  KeyData.Key.ScanCode = SCAN_F23;  break;
+  case XK_F24:  KeyData.Key.ScanCode = SCAN_F24;  break;
+
+  // No mapping in X11
+  //case XK_:   KeyData.Key.ScanCode = SCAN_MUTE;            break;
+  //case XK_:   KeyData.Key.ScanCode = SCAN_VOLUME_UP;       break;
+  //case XK_:   KeyData.Key.ScanCode = SCAN_VOLUME_DOWN;     break;
+  //case XK_:   KeyData.Key.ScanCode = SCAN_BRIGHTNESS_UP;   break;
+  //case XK_:   KeyData.Key.ScanCode = SCAN_BRIGHTNESS_DOWN; break;
+  //case XK_:   KeyData.Key.ScanCode = SCAN_SUSPEND;         break;
+  //case XK_:   KeyData.Key.ScanCode = SCAN_HIBERNATE;       break;
+  //case XK_:   KeyData.Key.ScanCode = SCAN_TOGGLE_DISPLAY;  break;
+  //case XK_:   KeyData.Key.ScanCode = SCAN_RECOVERY;        break;
+  //case XK_:   KeyData.Key.ScanCode = SCAN_EJECT;           break;
+
+  case XK_BackSpace:  KeyData.Key.UnicodeChar = 0x0008; break;
+
+  case XK_KP_Tab:
+  case XK_Tab:        KeyData.Key.UnicodeChar = 0x0009; break;
+
+  case XK_Linefeed:   KeyData.Key.UnicodeChar = 0x000a; break;
+
+  case XK_KP_Enter:
+  case XK_Return:     KeyData.Key.UnicodeChar = 0x000d; break;
+
+  case XK_KP_Equal      : KeyData.Key.UnicodeChar = L'='; break;
+  case XK_KP_Multiply   : KeyData.Key.UnicodeChar = L'*'; break;
+  case XK_KP_Add        : KeyData.Key.UnicodeChar = L'+'; break;
+  case XK_KP_Separator  : KeyData.Key.UnicodeChar = L'~'; break;
+  case XK_KP_Subtract   : KeyData.Key.UnicodeChar = L'-'; break;
+  case XK_KP_Decimal    : KeyData.Key.UnicodeChar = L'.'; break;
+  case XK_KP_Divide     : KeyData.Key.UnicodeChar = L'/'; break;
+
+  case XK_KP_0    : KeyData.Key.UnicodeChar = L'0'; break;
+  case XK_KP_1    : KeyData.Key.UnicodeChar = L'1'; break;
+  case XK_KP_2    : KeyData.Key.UnicodeChar = L'2'; break;
+  case XK_KP_3    : KeyData.Key.UnicodeChar = L'3'; break;
+  case XK_KP_4    : KeyData.Key.UnicodeChar = L'4'; break;
+  case XK_KP_5    : KeyData.Key.UnicodeChar = L'5'; break;
+  case XK_KP_6    : KeyData.Key.UnicodeChar = L'6'; break;
+  case XK_KP_7    : KeyData.Key.UnicodeChar = L'7'; break;
+  case XK_KP_8    : KeyData.Key.UnicodeChar = L'8'; break;
+  case XK_KP_9    : KeyData.Key.UnicodeChar = L'9'; break;
+
+  default:
+    ;
+  }
+
+  // The global state is our state
+  KeyData.KeyState.KeyShiftState = Drv->KeyState.KeyShiftState;
+  KeyData.KeyState.KeyToggleState = Drv->KeyState.KeyToggleState;
+
+  if (*KeySym < XK_BackSpace) {
+    if (((Drv->KeyState.KeyShiftState & (EFI_LEFT_SHIFT_PRESSED | EFI_RIGHT_SHIFT_PRESSED)) != 0) ||
+        ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) != 0) ) {
+
+      KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_UPPER];
+
+      // Per UEFI spec since we converted the Unicode clear the shift bits we pass up
+      KeyData.KeyState.KeyShiftState &= ~(EFI_LEFT_SHIFT_PRESSED | EFI_RIGHT_SHIFT_PRESSED);
+    } else {
+      KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_LOWER];
+    }
+  } else {
+    // XK_BackSpace is the start of XK_MISCELLANY. These are the XK_? keys we process in this file
+    ;
+  }
+
+  if (Make) {
+    memcpy (&Drv->keys[Drv->key_wr], &KeyData, sizeof (EFI_KEY_DATA));
+    Drv->key_wr = (Drv->key_wr + 1) % NBR_KEYS;
+    Drv->key_count++;
+    if (Drv->MakeRegisterdKeyCallback != NULL) {
+      ReverseGasketUint64Uint64 (Drv->MakeRegisterdKeyCallback ,Drv->RegisterdKeyCallbackContext, &KeyData);
+    }
+  } else {
+    if (Drv->BreakRegisterdKeyCallback != NULL) {
+      ReverseGasketUint64Uint64 (Drv->BreakRegisterdKeyCallback ,Drv->RegisterdKeyCallbackContext, &KeyData);
+    }
+  }
+}
+
+
+void
+handleMouseMoved(
+  IN  GRAPHICS_IO_PRIVATE   *Drv,
+  IN  XEvent                *ev
+  )
+{
+  if (ev->xmotion.x != Drv->previous_x) {
+    Drv->pointer_state.RelativeMovementX += ( ev->xmotion.x - Drv->previous_x );
+    Drv->previous_x = ev->xmotion.x;
+    Drv->pointer_state_changed = 1;
+  }
+
+  if (ev->xmotion.y != Drv->previous_y) {
+    Drv->pointer_state.RelativeMovementY += ( ev->xmotion.y - Drv->previous_y );
+    Drv->previous_y = ev->xmotion.y;
+    Drv->pointer_state_changed = 1;
+  }
+
+  Drv->pointer_state.RelativeMovementZ = 0;
+}
+
+void
+handleMouseDown (
+  IN  GRAPHICS_IO_PRIVATE *Drv,
+  IN  XEvent              *ev,
+  IN  BOOLEAN             Pressed
+  )
+{
+  if (ev->xbutton.button == Button1) {
+    Drv->pointer_state_changed = (Drv->pointer_state.LeftButton != Pressed);
+    Drv->pointer_state.LeftButton = Pressed;
+  }
+  if ( ev->xbutton.button == Button2 ) {
+    Drv->pointer_state_changed = (Drv->pointer_state.RightButton != Pressed);
+    Drv->pointer_state.RightButton = Pressed;
+  }
+}
+
+void
+Redraw (
+  IN  GRAPHICS_IO_PRIVATE *Drv,
+  IN  UINTN               X,
+  IN  UINTN               Y,
+  IN  UINTN               Width,
+  IN  UINTN               Height
+  )
+{
+  if (Drv->use_shm) {
+    XShmPutImage (
+      Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height, False
+      );
+  } else {
+    XPutImage (
+      Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height
+      );
+  }
+  XFlush(Drv->display);
+}
+
+void
+HandleEvent(GRAPHICS_IO_PRIVATE *Drv, XEvent *ev)
+{
+  switch (ev->type) {
+  case Expose:
+    Redraw (Drv, ev->xexpose.x, ev->xexpose.y,
+      ev->xexpose.width, ev->xexpose.height);
+    break;
+  case GraphicsExpose:
+    Redraw (Drv, ev->xgraphicsexpose.x, ev->xgraphicsexpose.y,
+      ev->xgraphicsexpose.width, ev->xgraphicsexpose.height);
+    break;
+  case KeyPress:
+    handleKeyEvent (Drv, ev, TRUE);
+    break;
+  case KeyRelease:
+    handleKeyEvent (Drv, ev, FALSE);
+    break;
+  case MappingNotify:
+    XRefreshKeyboardMapping (&ev->xmapping);
+    break;
+  case MotionNotify:
+    handleMouseMoved (Drv, ev);
+    break;
+  case ButtonPress:
+    handleMouseDown (Drv, ev, TRUE);
+  break;
+  case ButtonRelease:
+    handleMouseDown (Drv, ev, FALSE);
+  break;
+#if 0
+  case DestroyNotify:
+    XCloseDisplay (Drv->display);
+    exit (1);
+    break;
+#endif
+  case NoExpose:
+  default:
+    break;
+  }
+}
+
+void
+HandleEvents (
+  IN  GRAPHICS_IO_PRIVATE *Drv
+  )
+{
+  XEvent ev;
+
+  while (XPending (Drv->display) != 0) {
+    XNextEvent (Drv->display, &ev);
+    HandleEvent (Drv, &ev);
+  }
+}
+
+unsigned long
+X11PixelToColor (
+  IN  GRAPHICS_IO_PRIVATE *Drv,
+  IN  EFI_UGA_PIXEL       pixel
+  )
+{
+  return ((pixel.Red   >> Drv->r.csize) << Drv->r.shift)
+       | ((pixel.Green >> Drv->g.csize) << Drv->g.shift)
+       | ((pixel.Blue  >> Drv->b.csize) << Drv->b.shift);
+}
+
+EFI_UGA_PIXEL
+X11ColorToPixel (
+  IN  GRAPHICS_IO_PRIVATE *Drv,
+  IN  unsigned long       val
+  )
+{
+  EFI_UGA_PIXEL Pixel;
+
+  memset (&Pixel, 0, sizeof (EFI_UGA_PIXEL));
+
+  // Truncation not an issue since X11 and EFI are both using 8 bits per color
+  Pixel.Red =   (val >> Drv->r.shift) << Drv->r.csize;
+  Pixel.Green = (val >> Drv->g.shift) << Drv->g.csize;
+  Pixel.Blue =  (val >> Drv->b.shift) << Drv->b.csize;
+
+  return Pixel;
+}
+
+
+EFI_STATUS
+X11CheckKey (
+  IN  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo
+  )
+{
+  GRAPHICS_IO_PRIVATE  *Drv;
+
+  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
+
+  HandleEvents (Drv);
+
+  if (Drv->key_count != 0) {
+    return EFI_SUCCESS;
+  }
+
+  return EFI_NOT_READY;
+}
+
+EFI_STATUS
+X11GetKey (
+  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsIo,
+  IN  EFI_KEY_DATA                  *KeyData
+  )
+{
+  EFI_STATUS          EfiStatus;
+  GRAPHICS_IO_PRIVATE *Drv;
+
+  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
+
+  EfiStatus = X11CheckKey (GraphicsIo);
+  if (EFI_ERROR (EfiStatus)) {
+    return EfiStatus;
+  }
+
+  CopyMem (KeyData, &Drv->keys[Drv->key_rd], sizeof (EFI_KEY_DATA));
+  Drv->key_rd = (Drv->key_rd + 1) % NBR_KEYS;
+  Drv->key_count--;
+
+  return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+X11KeySetState (
+  IN EMU_GRAPHICS_WINDOW_PROTOCOL   *GraphicsIo,
+  IN EFI_KEY_TOGGLE_STATE           *KeyToggleState
+  )
+{
+  GRAPHICS_IO_PRIVATE  *Drv;
+
+  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
+
+  if (*KeyToggleState & EFI_CAPS_LOCK_ACTIVE) {
+    if ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) == 0) {
+      //
+      // We could create an XKeyEvent and send a XK_Caps_Lock to
+      // the UGA/GOP Window
+      //
+    }
+  }
+
+  Drv->KeyState.KeyToggleState = *KeyToggleState;
+  return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+X11RegisterKeyNotify (
+  IN EMU_GRAPHICS_WINDOW_PROTOCOL                        *GraphicsIo,
+  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK    MakeCallBack,
+  IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK    BreakCallBack,
+  IN VOID                                                *Context
+  )
+{
+  GRAPHICS_IO_PRIVATE  *Drv;
+
+  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
+
+  Drv->MakeRegisterdKeyCallback    = MakeCallBack;
+  Drv->BreakRegisterdKeyCallback   = BreakCallBack;
+  Drv->RegisterdKeyCallbackContext = Context;
+
+  return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+X11Blt (
+  IN EMU_GRAPHICS_WINDOW_PROTOCOL             *GraphicsIo,
+  IN  EFI_UGA_PIXEL                           *BltBuffer OPTIONAL,
+  IN  EFI_UGA_BLT_OPERATION                   BltOperation,
+  IN  EMU_GRAPHICS_WINDOWS__BLT_ARGS          *Args
+  )
+{
+  GRAPHICS_IO_PRIVATE *Private;
+  UINTN             DstY;
+  UINTN             SrcY;
+  UINTN             DstX;
+  UINTN             SrcX;
+  UINTN             Index;
+  EFI_UGA_PIXEL     *Blt;
+  UINT8             *Dst;
+  UINT8             *Src;
+  UINTN             Nbr;
+  unsigned long     Color;
+  XEvent            ev;
+
+  Private = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
+
+
+  //
+  //  Check bounds
+  //
+  if (BltOperation == EfiUgaVideoToBltBuffer
+      || BltOperation == EfiUgaVideoToVideo) {
+    //
+    // Source is Video.
+    //
+    if (Args->SourceY + Args->Height > Private->height) {
+      return EFI_INVALID_PARAMETER;
+    }
+
+    if (Args->SourceX + Args->Width > Private->width) {
+      return EFI_INVALID_PARAMETER;
+    }
+  }
+
+  if (BltOperation == EfiUgaBltBufferToVideo
+      || BltOperation == EfiUgaVideoToVideo
+      || BltOperation == EfiUgaVideoFill) {
+    //
+    // Destination is Video
+    //
+    if (Args->DestinationY + Args->Height > Private->height) {
+      return EFI_INVALID_PARAMETER;
+    }
+
+    if (Args->DestinationX + Args->Width > Private->width) {
+      return EFI_INVALID_PARAMETER;
+    }
+  }
+
+  switch (BltOperation) {
+  case EfiUgaVideoToBltBuffer:
+    Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->DestinationY * Args->Delta) + Args->DestinationX * sizeof (EFI_UGA_PIXEL));
+    Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);
+    for (SrcY = Args->SourceY; SrcY < (Args->Height + Args->SourceY); SrcY++) {
+      for (SrcX = Args->SourceX; SrcX < (Args->Width + Args->SourceX); SrcX++) {
+        *Blt++ = X11ColorToPixel (Private, XGetPixel (Private->image, SrcX, SrcY));
+      }
+      Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);
+    }
+    break;
+  case EfiUgaBltBufferToVideo:
+    Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->SourceY * Args->Delta) + Args->SourceX * sizeof (EFI_UGA_PIXEL));
+    Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);
+    for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY); DstY++) {
+      for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX); DstX++) {
+        XPutPixel(Private->image, DstX, DstY, X11PixelToColor(Private, *Blt));
+        Blt++;
+      }
+      Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);
+    }
+    break;
+  case EfiUgaVideoToVideo:
+    Dst = Private->image_data + (Args->DestinationX << Private->pixel_shift)
+          + Args->DestinationY * Private->line_bytes;
+    Src = Private->image_data + (Args->SourceX << Private->pixel_shift)
+          + Args->SourceY * Private->line_bytes;
+    Nbr = Args->Width << Private->pixel_shift;
+    if (Args->DestinationY < Args->SourceY) {
+      for (Index = 0; Index < Args->Height; Index++) {
+        memcpy (Dst, Src, Nbr);
+        Dst += Private->line_bytes;
+        Src += Private->line_bytes;
+      }
+    } else {
+      Dst += (Args->Height - 1) * Private->line_bytes;
+      Src += (Args->Height - 1) * Private->line_bytes;
+      for (Index = 0; Index < Args->Height; Index++) {
+      //
+      // Source and Destination Y may be equal, therefore Dst and Src may
+      // overlap.
+      //
+      memmove (Dst, Src, Nbr);
+      Dst -= Private->line_bytes;
+      Src -= Private->line_bytes;
+      }
+    }
+    break;
+  case EfiUgaVideoFill:
+    Color = X11PixelToColor(Private, *BltBuffer);
+    for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY); DstY++) {
+      for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX); DstX++) {
+        XPutPixel(Private->image, DstX, DstY, Color);
+      }
+    }
+    break;
+  default:
+    return EFI_INVALID_PARAMETER;
+  }
+
+  //
+  //  Refresh screen.
+  //
+  switch (BltOperation) {
+  case EfiUgaVideoToVideo:
+    XCopyArea(
+      Private->display, Private->win, Private->win, Private->gc,
+      Args->SourceX, Args->SourceY, Args->Width, Args->Height,
+      Args->DestinationX, Args->DestinationY
+      );
+
+    while (1) {
+      XNextEvent (Private->display, &ev);
+      HandleEvent (Private, &ev);
+      if (ev.type == NoExpose || ev.type == GraphicsExpose) {
+        break;
+      }
+    }
+    break;
+  case EfiUgaVideoFill:
+    Color = X11PixelToColor (Private, *BltBuffer);
+    XSetForeground (Private->display, Private->gc, Color);
+    XFillRectangle (
+      Private->display, Private->win, Private->gc,
+      Args->DestinationX, Args->DestinationY, Args->Width, Args->Height
+      );
+    XFlush (Private->display);
+    break;
+  case EfiUgaBltBufferToVideo:
+    Redraw (Private, Args->DestinationX, Args->DestinationY, Args->Width, Args->Height);
+    break;
+  default:
+    break;
+  }
+  return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+X11CheckPointer (
+  IN  EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo
+  )
+{
+  GRAPHICS_IO_PRIVATE  *Drv;
+
+  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
+
+  HandleEvents (Drv);
+  if (Drv->pointer_state_changed != 0) {
+    return EFI_SUCCESS;
+  }
+
+  return EFI_NOT_READY;
+}
+
+
+EFI_STATUS
+X11GetPointerState (
+  IN  EMU_GRAPHICS_WINDOW_PROTOCOL  *GraphicsIo,
+  IN  EFI_SIMPLE_POINTER_STATE      *State
+  )
+{
+  EFI_STATUS          EfiStatus;
+  GRAPHICS_IO_PRIVATE *Drv;
+
+  Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
+
+  EfiStatus = X11CheckPointer (GraphicsIo);
+  if (EfiStatus != EFI_SUCCESS) {
+    return EfiStatus;
+  }
+
+  memcpy (State, &Drv->pointer_state, sizeof (EFI_SIMPLE_POINTER_STATE));
+
+  Drv->pointer_state.RelativeMovementX = 0;
+  Drv->pointer_state.RelativeMovementY = 0;
+  Drv->pointer_state.RelativeMovementZ = 0;
+  Drv->pointer_state_changed = 0;
+  return EFI_SUCCESS;
+}
+
+
+
+EFI_STATUS
+X11GraphicsWindowOpen (
+  IN  EMU_IO_THUNK_PROTOCOL   *This
+  )
+{
+  GRAPHICS_IO_PRIVATE *Drv;
+  unsigned int        border_width = 0;
+  char                *display_name = NULL;
+
+  Drv = (GRAPHICS_IO_PRIVATE *)calloc (1, sizeof (GRAPHICS_IO_PRIVATE));
+  if (Drv == NULL) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  Drv->GraphicsIo.Size                = GasketX11Size;
+  Drv->GraphicsIo.CheckKey            = GasketX11CheckKey;
+  Drv->GraphicsIo.GetKey              = GasketX11GetKey;
+  Drv->GraphicsIo.KeySetState         = GasketX11KeySetState;
+  Drv->GraphicsIo.RegisterKeyNotify   = GasketX11RegisterKeyNotify;
+  Drv->GraphicsIo.Blt                 = GasketX11Blt;
+  Drv->GraphicsIo.CheckPointer        = GasketX11CheckPointer;
+  Drv->GraphicsIo.GetPointerState     = GasketX11GetPointerState;
+
+
+  Drv->key_count = 0;
+  Drv->key_rd = 0;
+  Drv->key_wr = 0;
+  Drv->KeyState.KeyShiftState      = EFI_SHIFT_STATE_VALID;
+  Drv->KeyState.KeyToggleState     = EFI_TOGGLE_STATE_VALID;
+  Drv->MakeRegisterdKeyCallback    = NULL;
+  Drv->BreakRegisterdKeyCallback   = NULL;
+  Drv->RegisterdKeyCallbackContext = NULL;
+
+
+  Drv->display = XOpenDisplay (display_name);
+  if (Drv->display == NULL) {
+    fprintf (stderr, "uga: cannot connect to X server %s\n", XDisplayName (display_name));
+    free (Drv);
+    return EFI_DEVICE_ERROR;
+  }
+  Drv->screen = DefaultScreen (Drv->display);
+  Drv->visual = DefaultVisual (Drv->display, Drv->screen);
+  Drv->win = XCreateSimpleWindow (
+                Drv->display, RootWindow (Drv->display, Drv->screen),
+                0, 0, 4, 4, border_width,
+                WhitePixel (Drv->display, Drv->screen),
+                BlackPixel (Drv->display, Drv->screen)
+                );
+
+  Drv->depth = DefaultDepth (Drv->display, Drv->screen);
+  XDefineCursor (Drv->display, Drv->win, XCreateFontCursor (Drv->display, XC_pirate));
+
+  Drv->Title = malloc (StrSize (This->ConfigString));
+  UnicodeStrToAsciiStr (This->ConfigString, Drv->Title);
+  XStoreName (Drv->display, Drv->win, Drv->Title);
+
+//  XAutoRepeatOff (Drv->display);
+  XSelectInput (
+    Drv->display, Drv->win,
+    ExposureMask | KeyPressMask | KeyReleaseMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask
+    );
+  Drv->gc = DefaultGC (Drv->display, Drv->screen);
+
+  This->Private   = (VOID *)Drv;
+  This->Interface = (VOID *)Drv;
+  return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+X11GraphicsWindowClose (
+  IN  EMU_IO_THUNK_PROTOCOL   *This
+  )
+{
+  GRAPHICS_IO_PRIVATE *Drv;
+
+  Drv = (GRAPHICS_IO_PRIVATE *)This->Private;
+
+  if (Drv == NULL) {
+    return EFI_SUCCESS;
+  }
+
+  if (Drv->image != NULL) {
+    XDestroyImage(Drv->image);
+
+    if (Drv->use_shm) {
+      shmdt (Drv->image_data);
+    }
+
+    Drv->image_data = NULL;
+    Drv->image = NULL;
+  }
+  XDestroyWindow (Drv->display, Drv->win);
+  XCloseDisplay (Drv->display);
+
+#ifdef __APPLE__
+  // Free up the shared memory
+  shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
+#endif
+
+  free (Drv);
+  return EFI_SUCCESS;
+}
+
+
+EMU_IO_THUNK_PROTOCOL gX11ThunkIo = {
+  &gEmuGraphicsWindowProtocolGuid,
+  NULL,
+  NULL,
+  0,
+  GasketX11GraphicsWindowOpen,
+  GasketX11GraphicsWindowClose,
+  NULL
+};
+
+

+ 1631 - 1631
EmulatorPkg/Unix/Host/X64/Gasket.S

@@ -1,1631 +1,1631 @@
-#------------------------------------------------------------------------------
-#
-# Manage differenced between UNIX ABI and EFI/Windows ABI
-#
-# EFI  Arg passing: RCX, RDX, R8,  R9
-#                   Callee allocates 32 bytes on stack to spill registers
-# UNIX Arg passing: RDI, RSI, RDX, RCX, R8, R9
-# RSI, RDI calle-save on EFI, scatch on UNIX callign
-#
-# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
-# This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution.  The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-#------------------------------------------------------------------------------
-
-//
-// Gaskets are EFI ABI to UNIX ABI calls
-// EFI ABI code will sub 40 (0x28) from %rsp before calling a function
-//  This is the 32 (0x20) byte to spill registers and 8 bytes to align stack on 16 byte boundry.
-//
-  .text
-
-// 32 byte shadow to spill rcx-r9, 8 bytes to align stack on 16 byte boundry
-// Any call with 0 - 4 arguments allocates 40 bytes on the stack.
-// For more than 4 args you always have to increase in quanta of 16 so 5 or 6 args is 56,
-// 7 or 8 args is 72, and 9 or 10 args is 88
-
-
-
-  .text
-
-//
-// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)
-//
-
-
-
-
-ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)
-ASM_PFX(GasketSecWriteStdErr):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq    %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-
-  call  ASM_PFX(SecWriteStdErr)
-
-  popq  %rdi            // restore state
-  popq  %rsi
-  popq  %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)
-ASM_PFX(GasketSecConfigStdIn):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq    %rdi
-
-  call  ASM_PFX(SecConfigStdIn)
-
-  popq  %rdi            // restore state
-  popq  %rsi
-  popq  %rbp
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)
-ASM_PFX(GasketSecWriteStdOut):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq    %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-
-  call  ASM_PFX(SecWriteStdOut)
-
-  popq  %rdi            // restore state
-  popq  %rsi
-  popq  %rbp
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)
-ASM_PFX(GasketSecReadStdIn):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq    %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-
-  call  ASM_PFX(SecReadStdIn)
-
-  popq  %rdi            // restore state
-  popq  %rsi
-  popq  %rbp
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)
-ASM_PFX(GasketSecPollStdIn):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq    %rdi
-
-  call  ASM_PFX(SecPollStdIn)
-
-  popq  %rdi            // restore state
-  popq  %rsi
-  popq  %rbp
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketSecMalloc)
-ASM_PFX(GasketSecMalloc):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq    %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call  ASM_PFX(SecMalloc)
-
-  popq  %rdi            // restore state
-  popq  %rsi
-  popq  %rbp
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketSecValloc)
-ASM_PFX(GasketSecValloc):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq    %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call  ASM_PFX(SecValloc)
-
-  popq  %rdi            // restore state
-  popq  %rsi
-  popq  %rbp
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketSecFree)
-ASM_PFX(GasketSecFree):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq    %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call  ASM_PFX(SecFree)
-
-  popq  %rdi            // restore state
-  popq  %rsi
-  popq  %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecSetTimer)
-ASM_PFX(GasketSecSetTimer):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq    %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-
-  call  ASM_PFX(SecSetTimer)
-
-  popq  %rdi            // restore state
-  popq  %rsi
-  popq  %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)
-ASM_PFX(GasketSecEnableInterrupt):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  call    ASM_PFX(SecEnableInterrupt)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)
-ASM_PFX(GasketSecDisableInterrupt):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  call    ASM_PFX(SecDisableInterrupt)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)
-ASM_PFX(GasketQueryPerformanceFrequency):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  call    ASM_PFX(QueryPerformanceFrequency)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)
-ASM_PFX(GasketQueryPerformanceCounter):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  call    ASM_PFX(QueryPerformanceCounter)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecSleep)
-ASM_PFX(GasketSecSleep):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq    %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call  ASM_PFX(SecSleep)
-
-  popq  %rdi            // restore state
-  popq  %rsi
-  popq  %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)
-ASM_PFX(GasketSecCpuSleep):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq    %rdi
-
-  call  ASM_PFX(SecCpuSleep)
-
-  popq  %rdi            // restore state
-  popq  %rsi
-  popq  %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecExit)
-ASM_PFX(GasketSecExit):
-  pushq   %rbp                 // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  movq    %rcx, %rdi           // Swizzle args
-  call    ASM_PFX(SecExit)     // Less to do as we will never return to EFI ABI world
-LDEAD_LOOP:
-  jmp  LDEAD_LOOP              // _exit should never return
-
-
-ASM_GLOBAL ASM_PFX(GasketSecGetTime)
-ASM_PFX(GasketSecGetTime):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-
-  call  ASM_PFX(SecGetTime)
-
-  popq  %rdi            // restore state
-  popq  %rsi
-  popq  %rbp
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketSecSetTime)
-ASM_PFX(GasketSecSetTime):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-
-  call  ASM_PFX(SecSetTime)
-
-  popq  %rdi            // restore state
-  popq  %rsi
-  popq  %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)
-ASM_PFX(GasketSecGetNextProtocol):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-  movq    %r9,  %rcx
-
-  call    ASM_PFX(SecGetNextProtocol)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-// PPIs produced by SEC
-
-ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)
-ASM_PFX(GasketSecPeCoffGetEntryPoint):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-
-  call    ASM_PFX(SecPeCoffGetEntryPoint)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)
-ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(SecPeCoffRelocateImageExtraAction)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)
-ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(SecPeCoffUnloadImageExtraAction)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)
-ASM_PFX(GasketSecEmuThunkAddress):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  call    ASM_PFX(SecEmuThunkAddress)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-//
-// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
-//
-
-ASM_GLOBAL ASM_PFX(GasketX11Size)
-ASM_PFX(GasketX11Size):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-  movq    %r9,  %rcx
-
-  call    ASM_PFX(X11Size)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11CheckKey)
-ASM_PFX(GasketX11CheckKey):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(X11CheckKey)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketX11GetKey)
-ASM_PFX(GasketX11GetKey):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-
-  call    ASM_PFX(X11GetKey)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11KeySetState)
-ASM_PFX(GasketX11KeySetState):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-
-  call    ASM_PFX(X11KeySetState)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)
-ASM_PFX(GasketX11RegisterKeyNotify):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-  movq    %r9,  %rcx
-
-  call    ASM_PFX(X11RegisterKeyNotify)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11Blt)
-ASM_PFX(GasketX11Blt):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-  movq    %r9,  %rcx
-
-  call    ASM_PFX(X11Blt)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)
-ASM_PFX(GasketX11CheckPointer):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(X11CheckPointer)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)
-ASM_PFX(GasketX11GetPointerState):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-
-  call    ASM_PFX(X11GetPointerState)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)
-ASM_PFX(GasketX11GraphicsWindowOpen):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(X11GraphicsWindowOpen)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)
-ASM_PFX(GasketX11GraphicsWindowClose):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %r9,  %rcx
-
-  call    ASM_PFX(X11GraphicsWindowClose)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-// Pthreads
-
-ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)
-ASM_PFX(GasketPthreadMutexLock):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(PthreadMutexLock)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)
-ASM_PFX(GasketPthreadMutexUnLock):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(PthreadMutexUnLock)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)
-ASM_PFX(GasketPthreadMutexTryLock):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(PthreadMutexTryLock)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)
-ASM_PFX(GasketPthreadMutexInit):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-
-  call    ASM_PFX(PthreadMutexInit)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)
-ASM_PFX(GasketPthreadMutexDestroy):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(PthreadMutexDestroy)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadCreate)
-ASM_PFX(GasketPthreadCreate):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-  movq    %r9,  %rcx
-
-  call    ASM_PFX(PthreadCreate)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadExit)
-ASM_PFX(GasketPthreadExit):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(PthreadExit)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadSelf)
-ASM_PFX(GasketPthreadSelf):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-
-  call    ASM_PFX(PthreadSelf)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadOpen)
-ASM_PFX(GasketPthreadOpen):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(PthreadOpen)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadClose)
-ASM_PFX(GasketPthreadClose):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(PthreadClose)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-
-
-//
-// UNIX ABI to EFI ABI call
-//
-// UINTN
-// ReverseGasketUint64 (
-//   void *Api,
-//   UINTN Arg1
-//   );
-ASM_GLOBAL ASM_PFX(ReverseGasketUint64)
-ASM_PFX(ReverseGasketUint64):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  movq    %rdi, %rax    // Swizzle args
-  movq    %rsi, %rcx
-
-  subq  $32, %rsp        // 32-byte shadow space
-  call  *%rax
-  addq  $32, %rsp
-
-  popq   %rbp
-  ret
-
-//
-// UNIX ABI to EFI ABI call
-//
-// UINTN
-// ReverseGasketUint64Uint64 (
-//   void *Api,
-//   UINTN Arg1
-//   UINTN Arg2
-//   );
-ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)
-ASM_PFX(ReverseGasketUint64Uint64):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  movq    %rdi, %rax    // Swizzle args
-  movq    %rsi, %rcx
-
-  subq  $32, %rsp        // 32-byte shadow space
-  call  *%rax
-  addq  $32, %rsp
-
-  popq   %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)
-ASM_PFX(GasketSecUnixPeiAutoScan):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-
-  call    ASM_PFX(SecUnixPeiAutoScan)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)
-ASM_PFX(GasketSecUnixFdAddress):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-  movq    %r9,  %rcx
-
-  call    ASM_PFX(SecUnixFdAddress)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-// EmuIoThunk SimpleFileSystem
-
-ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)
-ASM_PFX(GasketPosixOpenVolume):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-  movq    %r9,  %rcx
-
-  call    ASM_PFX(PosixOpenVolume)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)
-ASM_PFX(GasketPosixFileOpen):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-  movq    %r9,  %rcx
-  movq    48(%rbp), %r8
-
-  call    ASM_PFX(PosixFileOpen)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)
-ASM_PFX(GasketPosixFileCLose):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(PosixFileCLose)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)
-ASM_PFX(GasketPosixFileDelete):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(PosixFileDelete)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileRead)
-ASM_PFX(GasketPosixFileRead):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-
-  call    ASM_PFX(PosixFileRead)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)
-ASM_PFX(GasketPosixFileWrite):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-
-  call    ASM_PFX(PosixFileWrite)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)
-ASM_PFX(GasketPosixFileSetPossition):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-
-  call    ASM_PFX(PosixFileSetPossition)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)
-ASM_PFX(GasketPosixFileGetPossition):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-
-  call    ASM_PFX(PosixFileGetPossition)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)
-ASM_PFX(GasketPosixFileGetInfo):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-  movq    %r9,  %rcx
-
-  call    ASM_PFX(PosixFileGetInfo)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)
-ASM_PFX(GasketPosixFileSetInfo):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-  movq    %r9,  %rcx
-
-  call    ASM_PFX(PosixFileSetInfo)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)
-ASM_PFX(GasketPosixFileFlush):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(PosixFileFlush)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)
-ASM_PFX(GasketPosixFileSystmeThunkOpen):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(PosixFileSystmeThunkOpen)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)
-ASM_PFX(GasketPosixFileSystmeThunkClose):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(PosixFileSystmeThunkClose)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)
-ASM_PFX(GasketEmuBlockIoReset):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-
-  call    ASM_PFX(EmuBlockIoReset)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)
-ASM_PFX(GasketEmuBlockIoReadBlocks):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-  movq    %r9,  %rcx
-  movq    48(%rbp), %r8
-  movq    56(%rbp), %r9
-
-  call    ASM_PFX(EmuBlockIoReadBlocks)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)
-ASM_PFX(GasketEmuBlockIoWriteBlocks):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-  movq    %r9,  %rcx
-  movq    48(%rbp), %r8
-  movq    56(%rbp), %r9
-
-  call    ASM_PFX(EmuBlockIoWriteBlocks)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)
-ASM_PFX(GasketEmuBlockIoFlushBlocks):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-
-  call    ASM_PFX(EmuBlockIoFlushBlocks)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)
-ASM_PFX(GasketEmuBlockIoCreateMapping):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-
-  call    ASM_PFX(EmuBlockIoCreateMapping)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)
-ASM_PFX(GasketBlockIoThunkOpen):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(EmuBlockIoThunkOpen)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)
-ASM_PFX(GasketBlockIoThunkClose):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(EmuBlockIoThunkClose)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)
-ASM_PFX(GasketSnpCreateMapping):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-
-  call    ASM_PFX(EmuSnpCreateMapping)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpStart)
-ASM_PFX(GasketSnpStart):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(EmuSnpStart)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpStop)
-ASM_PFX(GasketSnpStop):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(EmuSnpStop)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpInitialize)
-ASM_PFX(GasketSnpInitialize):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-
-  call    ASM_PFX(EmuSnpInitialize)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpReset)
-ASM_PFX(GasketSnpReset):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-
-  call    ASM_PFX(EmuSnpReset)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpShutdown)
-ASM_PFX(GasketSnpShutdown):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(EmuSnpShutdown)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)
-ASM_PFX(GasketSnpReceiveFilters):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-  movq    %r9,  %rcx
-  movq    48(%rbp), %r8
-  movq    56(%rbp), %r9
-
-  call    ASM_PFX(EmuSnpReceiveFilters)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)
-ASM_PFX(GasketSnpStationAddress):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-
-  call    ASM_PFX(EmuSnpStationAddress)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpStatistics)
-ASM_PFX(GasketSnpStatistics):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-  movq    %r9,  %rcx
-
-  call    ASM_PFX(EmuSnpStatistics)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)
-ASM_PFX(GasketSnpMCastIpToMac):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-  movq    %r9,  %rcx
-
-  call    ASM_PFX(EmuSnpMCastIpToMac)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpNvData)
-ASM_PFX(GasketSnpNvData):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-  movq    %r9,  %rcx
-  movq    48(%rbp), %r8
-
-  call    ASM_PFX(EmuSnpNvData)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)
-ASM_PFX(GasketSnpGetStatus):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-
-  call    ASM_PFX(EmuSnpGetStatus)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpTransmit)
-ASM_PFX(GasketSnpTransmit):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-	subq    $16, %rsp       // Allocate space for args on the stack
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-  movq    %r9,  %rcx
-  movq    48(%rbp), %r8
-  movq    56(%rbp), %r9
-  movq    64(%rbp), %rax
-  movq    %rax,     (%rsp)
-
-  call    ASM_PFX(EmuSnpTransmit)
-	addq    $16, %rsp
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpReceive)
-ASM_PFX(GasketSnpReceive):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-	subq    $16, %rsp       // Allocate space for args on the stack
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-  movq    %rdx, %rsi
-  movq    %r8,  %rdx
-  movq    %r9,  %rcx
-  movq    48(%rbp), %r8
-  movq    56(%rbp), %r9
-  movq    64(%rbp), %rax
-  movq    %rax,     (%rsp)
-
-  call    ASM_PFX(EmuSnpReceive)
-	addq    $16, %rsp
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)
-ASM_PFX(GasketSnpThunkOpen):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(EmuSnpThunkOpen)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)
-ASM_PFX(GasketSnpThunkClose):
-  pushq   %rbp            // stack frame is for the debugger
-  movq    %rsp, %rbp
-
-  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
-  pushq   %rdi
-
-  movq    %rcx, %rdi    // Swizzle args
-
-  call    ASM_PFX(EmuSnpThunkClose)
-
-  popq    %rdi          // restore state
-  popq    %rsi
-  popq    %rbp
-  ret
-
-
+#------------------------------------------------------------------------------
+#
+# Manage differenced between UNIX ABI and EFI/Windows ABI
+#
+# EFI  Arg passing: RCX, RDX, R8,  R9
+#                   Callee allocates 32 bytes on stack to spill registers
+# UNIX Arg passing: RDI, RSI, RDX, RCX, R8, R9
+# RSI, RDI calle-save on EFI, scatch on UNIX callign
+#
+# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution.  The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#------------------------------------------------------------------------------
+
+//
+// Gaskets are EFI ABI to UNIX ABI calls
+// EFI ABI code will sub 40 (0x28) from %rsp before calling a function
+//  This is the 32 (0x20) byte to spill registers and 8 bytes to align stack on 16 byte boundry.
+//
+  .text
+
+// 32 byte shadow to spill rcx-r9, 8 bytes to align stack on 16 byte boundry
+// Any call with 0 - 4 arguments allocates 40 bytes on the stack.
+// For more than 4 args you always have to increase in quanta of 16 so 5 or 6 args is 56,
+// 7 or 8 args is 72, and 9 or 10 args is 88
+
+
+
+  .text
+
+//
+// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)
+//
+
+
+
+
+ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)
+ASM_PFX(GasketSecWriteStdErr):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq    %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+
+  call  ASM_PFX(SecWriteStdErr)
+
+  popq  %rdi            // restore state
+  popq  %rsi
+  popq  %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)
+ASM_PFX(GasketSecConfigStdIn):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq    %rdi
+
+  call  ASM_PFX(SecConfigStdIn)
+
+  popq  %rdi            // restore state
+  popq  %rsi
+  popq  %rbp
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)
+ASM_PFX(GasketSecWriteStdOut):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq    %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+
+  call  ASM_PFX(SecWriteStdOut)
+
+  popq  %rdi            // restore state
+  popq  %rsi
+  popq  %rbp
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)
+ASM_PFX(GasketSecReadStdIn):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq    %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+
+  call  ASM_PFX(SecReadStdIn)
+
+  popq  %rdi            // restore state
+  popq  %rsi
+  popq  %rbp
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)
+ASM_PFX(GasketSecPollStdIn):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq    %rdi
+
+  call  ASM_PFX(SecPollStdIn)
+
+  popq  %rdi            // restore state
+  popq  %rsi
+  popq  %rbp
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketSecMalloc)
+ASM_PFX(GasketSecMalloc):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq    %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call  ASM_PFX(SecMalloc)
+
+  popq  %rdi            // restore state
+  popq  %rsi
+  popq  %rbp
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketSecValloc)
+ASM_PFX(GasketSecValloc):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq    %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call  ASM_PFX(SecValloc)
+
+  popq  %rdi            // restore state
+  popq  %rsi
+  popq  %rbp
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketSecFree)
+ASM_PFX(GasketSecFree):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq    %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call  ASM_PFX(SecFree)
+
+  popq  %rdi            // restore state
+  popq  %rsi
+  popq  %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecSetTimer)
+ASM_PFX(GasketSecSetTimer):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq    %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+
+  call  ASM_PFX(SecSetTimer)
+
+  popq  %rdi            // restore state
+  popq  %rsi
+  popq  %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)
+ASM_PFX(GasketSecEnableInterrupt):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  call    ASM_PFX(SecEnableInterrupt)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)
+ASM_PFX(GasketSecDisableInterrupt):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  call    ASM_PFX(SecDisableInterrupt)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)
+ASM_PFX(GasketQueryPerformanceFrequency):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  call    ASM_PFX(QueryPerformanceFrequency)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)
+ASM_PFX(GasketQueryPerformanceCounter):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  call    ASM_PFX(QueryPerformanceCounter)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecSleep)
+ASM_PFX(GasketSecSleep):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq    %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call  ASM_PFX(SecSleep)
+
+  popq  %rdi            // restore state
+  popq  %rsi
+  popq  %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)
+ASM_PFX(GasketSecCpuSleep):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq    %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq    %rdi
+
+  call  ASM_PFX(SecCpuSleep)
+
+  popq  %rdi            // restore state
+  popq  %rsi
+  popq  %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecExit)
+ASM_PFX(GasketSecExit):
+  pushq   %rbp                 // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  movq    %rcx, %rdi           // Swizzle args
+  call    ASM_PFX(SecExit)     // Less to do as we will never return to EFI ABI world
+LDEAD_LOOP:
+  jmp  LDEAD_LOOP              // _exit should never return
+
+
+ASM_GLOBAL ASM_PFX(GasketSecGetTime)
+ASM_PFX(GasketSecGetTime):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+
+  call  ASM_PFX(SecGetTime)
+
+  popq  %rdi            // restore state
+  popq  %rsi
+  popq  %rbp
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketSecSetTime)
+ASM_PFX(GasketSecSetTime):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+
+  call  ASM_PFX(SecSetTime)
+
+  popq  %rdi            // restore state
+  popq  %rsi
+  popq  %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)
+ASM_PFX(GasketSecGetNextProtocol):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+  movq    %r9,  %rcx
+
+  call    ASM_PFX(SecGetNextProtocol)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+// PPIs produced by SEC
+
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)
+ASM_PFX(GasketSecPeCoffGetEntryPoint):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+
+  call    ASM_PFX(SecPeCoffGetEntryPoint)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)
+ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(SecPeCoffRelocateImageExtraAction)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)
+ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(SecPeCoffUnloadImageExtraAction)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)
+ASM_PFX(GasketSecEmuThunkAddress):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  call    ASM_PFX(SecEmuThunkAddress)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+//
+// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
+//
+
+ASM_GLOBAL ASM_PFX(GasketX11Size)
+ASM_PFX(GasketX11Size):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+  movq    %r9,  %rcx
+
+  call    ASM_PFX(X11Size)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11CheckKey)
+ASM_PFX(GasketX11CheckKey):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(X11CheckKey)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketX11GetKey)
+ASM_PFX(GasketX11GetKey):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+
+  call    ASM_PFX(X11GetKey)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11KeySetState)
+ASM_PFX(GasketX11KeySetState):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+
+  call    ASM_PFX(X11KeySetState)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)
+ASM_PFX(GasketX11RegisterKeyNotify):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+  movq    %r9,  %rcx
+
+  call    ASM_PFX(X11RegisterKeyNotify)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11Blt)
+ASM_PFX(GasketX11Blt):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+  movq    %r9,  %rcx
+
+  call    ASM_PFX(X11Blt)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)
+ASM_PFX(GasketX11CheckPointer):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(X11CheckPointer)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)
+ASM_PFX(GasketX11GetPointerState):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+
+  call    ASM_PFX(X11GetPointerState)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)
+ASM_PFX(GasketX11GraphicsWindowOpen):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(X11GraphicsWindowOpen)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)
+ASM_PFX(GasketX11GraphicsWindowClose):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %r9,  %rcx
+
+  call    ASM_PFX(X11GraphicsWindowClose)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+// Pthreads
+
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)
+ASM_PFX(GasketPthreadMutexLock):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(PthreadMutexLock)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)
+ASM_PFX(GasketPthreadMutexUnLock):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(PthreadMutexUnLock)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)
+ASM_PFX(GasketPthreadMutexTryLock):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(PthreadMutexTryLock)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)
+ASM_PFX(GasketPthreadMutexInit):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+
+  call    ASM_PFX(PthreadMutexInit)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)
+ASM_PFX(GasketPthreadMutexDestroy):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(PthreadMutexDestroy)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadCreate)
+ASM_PFX(GasketPthreadCreate):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+  movq    %r9,  %rcx
+
+  call    ASM_PFX(PthreadCreate)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadExit)
+ASM_PFX(GasketPthreadExit):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(PthreadExit)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadSelf)
+ASM_PFX(GasketPthreadSelf):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+
+  call    ASM_PFX(PthreadSelf)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadOpen)
+ASM_PFX(GasketPthreadOpen):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(PthreadOpen)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadClose)
+ASM_PFX(GasketPthreadClose):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(PthreadClose)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+
+
+//
+// UNIX ABI to EFI ABI call
+//
+// UINTN
+// ReverseGasketUint64 (
+//   void *Api,
+//   UINTN Arg1
+//   );
+ASM_GLOBAL ASM_PFX(ReverseGasketUint64)
+ASM_PFX(ReverseGasketUint64):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  movq    %rdi, %rax    // Swizzle args
+  movq    %rsi, %rcx
+
+  subq  $32, %rsp        // 32-byte shadow space
+  call  *%rax
+  addq  $32, %rsp
+
+  popq   %rbp
+  ret
+
+//
+// UNIX ABI to EFI ABI call
+//
+// UINTN
+// ReverseGasketUint64Uint64 (
+//   void *Api,
+//   UINTN Arg1
+//   UINTN Arg2
+//   );
+ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)
+ASM_PFX(ReverseGasketUint64Uint64):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  movq    %rdi, %rax    // Swizzle args
+  movq    %rsi, %rcx
+
+  subq  $32, %rsp        // 32-byte shadow space
+  call  *%rax
+  addq  $32, %rsp
+
+  popq   %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)
+ASM_PFX(GasketSecUnixPeiAutoScan):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+
+  call    ASM_PFX(SecUnixPeiAutoScan)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)
+ASM_PFX(GasketSecUnixFdAddress):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+  movq    %r9,  %rcx
+
+  call    ASM_PFX(SecUnixFdAddress)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+// EmuIoThunk SimpleFileSystem
+
+ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)
+ASM_PFX(GasketPosixOpenVolume):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+  movq    %r9,  %rcx
+
+  call    ASM_PFX(PosixOpenVolume)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)
+ASM_PFX(GasketPosixFileOpen):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+  movq    %r9,  %rcx
+  movq    48(%rbp), %r8
+
+  call    ASM_PFX(PosixFileOpen)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)
+ASM_PFX(GasketPosixFileCLose):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(PosixFileCLose)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)
+ASM_PFX(GasketPosixFileDelete):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(PosixFileDelete)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileRead)
+ASM_PFX(GasketPosixFileRead):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+
+  call    ASM_PFX(PosixFileRead)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)
+ASM_PFX(GasketPosixFileWrite):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+
+  call    ASM_PFX(PosixFileWrite)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)
+ASM_PFX(GasketPosixFileSetPossition):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+
+  call    ASM_PFX(PosixFileSetPossition)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)
+ASM_PFX(GasketPosixFileGetPossition):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+
+  call    ASM_PFX(PosixFileGetPossition)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)
+ASM_PFX(GasketPosixFileGetInfo):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+  movq    %r9,  %rcx
+
+  call    ASM_PFX(PosixFileGetInfo)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)
+ASM_PFX(GasketPosixFileSetInfo):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+  movq    %r9,  %rcx
+
+  call    ASM_PFX(PosixFileSetInfo)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)
+ASM_PFX(GasketPosixFileFlush):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(PosixFileFlush)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)
+ASM_PFX(GasketPosixFileSystmeThunkOpen):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(PosixFileSystmeThunkOpen)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)
+ASM_PFX(GasketPosixFileSystmeThunkClose):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(PosixFileSystmeThunkClose)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)
+ASM_PFX(GasketEmuBlockIoReset):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+
+  call    ASM_PFX(EmuBlockIoReset)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)
+ASM_PFX(GasketEmuBlockIoReadBlocks):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+  movq    %r9,  %rcx
+  movq    48(%rbp), %r8
+  movq    56(%rbp), %r9
+
+  call    ASM_PFX(EmuBlockIoReadBlocks)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)
+ASM_PFX(GasketEmuBlockIoWriteBlocks):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+  movq    %r9,  %rcx
+  movq    48(%rbp), %r8
+  movq    56(%rbp), %r9
+
+  call    ASM_PFX(EmuBlockIoWriteBlocks)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)
+ASM_PFX(GasketEmuBlockIoFlushBlocks):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+
+  call    ASM_PFX(EmuBlockIoFlushBlocks)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)
+ASM_PFX(GasketEmuBlockIoCreateMapping):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+
+  call    ASM_PFX(EmuBlockIoCreateMapping)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)
+ASM_PFX(GasketBlockIoThunkOpen):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(EmuBlockIoThunkOpen)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)
+ASM_PFX(GasketBlockIoThunkClose):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(EmuBlockIoThunkClose)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)
+ASM_PFX(GasketSnpCreateMapping):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+
+  call    ASM_PFX(EmuSnpCreateMapping)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpStart)
+ASM_PFX(GasketSnpStart):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(EmuSnpStart)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpStop)
+ASM_PFX(GasketSnpStop):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(EmuSnpStop)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpInitialize)
+ASM_PFX(GasketSnpInitialize):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+
+  call    ASM_PFX(EmuSnpInitialize)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpReset)
+ASM_PFX(GasketSnpReset):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+
+  call    ASM_PFX(EmuSnpReset)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpShutdown)
+ASM_PFX(GasketSnpShutdown):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(EmuSnpShutdown)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)
+ASM_PFX(GasketSnpReceiveFilters):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+  movq    %r9,  %rcx
+  movq    48(%rbp), %r8
+  movq    56(%rbp), %r9
+
+  call    ASM_PFX(EmuSnpReceiveFilters)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)
+ASM_PFX(GasketSnpStationAddress):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+
+  call    ASM_PFX(EmuSnpStationAddress)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpStatistics)
+ASM_PFX(GasketSnpStatistics):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+  movq    %r9,  %rcx
+
+  call    ASM_PFX(EmuSnpStatistics)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)
+ASM_PFX(GasketSnpMCastIpToMac):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+  movq    %r9,  %rcx
+
+  call    ASM_PFX(EmuSnpMCastIpToMac)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpNvData)
+ASM_PFX(GasketSnpNvData):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+  movq    %r9,  %rcx
+  movq    48(%rbp), %r8
+
+  call    ASM_PFX(EmuSnpNvData)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)
+ASM_PFX(GasketSnpGetStatus):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+
+  call    ASM_PFX(EmuSnpGetStatus)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpTransmit)
+ASM_PFX(GasketSnpTransmit):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+  subq    $16, %rsp       // Allocate space for args on the stack
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+  movq    %r9,  %rcx
+  movq    48(%rbp), %r8
+  movq    56(%rbp), %r9
+  movq    64(%rbp), %rax
+  movq    %rax,     (%rsp)
+
+  call    ASM_PFX(EmuSnpTransmit)
+  addq    $16, %rsp
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpReceive)
+ASM_PFX(GasketSnpReceive):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+  subq    $16, %rsp       // Allocate space for args on the stack
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+  movq    %rdx, %rsi
+  movq    %r8,  %rdx
+  movq    %r9,  %rcx
+  movq    48(%rbp), %r8
+  movq    56(%rbp), %r9
+  movq    64(%rbp), %rax
+  movq    %rax,     (%rsp)
+
+  call    ASM_PFX(EmuSnpReceive)
+  addq    $16, %rsp
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)
+ASM_PFX(GasketSnpThunkOpen):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(EmuSnpThunkOpen)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)
+ASM_PFX(GasketSnpThunkClose):
+  pushq   %rbp            // stack frame is for the debugger
+  movq    %rsp, %rbp
+
+  pushq   %rsi          // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+  pushq   %rdi
+
+  movq    %rcx, %rdi    // Swizzle args
+
+  call    ASM_PFX(EmuSnpThunkClose)
+
+  popq    %rdi          // restore state
+  popq    %rsi
+  popq    %rbp
+  ret
+
+

+ 540 - 540
EmulatorPkg/Unix/lldbefi.py

@@ -1,540 +1,540 @@
-#!/usr/bin/python
-
-#
-#  Copyright 2014 Apple Inc. All righes reserved.
-#
-#  This program and the accompanying materials
-#  are licensed and made available under the terms and conditions of the BSD License
-#  which accompanies this distribution. The full text of the license may be found at
-#  http://opensource.org/licenses/bsd-license.php.
-#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-
-import lldb
-import os
-import uuid
-import string
-import commands
-import optparse
-import shlex
-
-guid_dict = {}
-
-
-def EFI_GUID_TypeSummary (valobj,internal_dict):
-    """ Type summary for EFI GUID, print C Name if known
-    """
-    # typedef struct {
-    #   UINT32  Data1;
-    #   UINT16  Data2;
-    #   UINT16  Data3;
-    #   UINT8   Data4[8];
-    # } EFI_GUID;
-    SBError = lldb.SBError()
-
-    data1_val = valobj.GetChildMemberWithName('Data1')
-    data1 = data1_val.GetValueAsUnsigned(0)
-    data2_val = valobj.GetChildMemberWithName('Data2')
-    data2 = data2_val.GetValueAsUnsigned(0)
-    data3_val = valobj.GetChildMemberWithName('Data3')
-    data3 = data3_val.GetValueAsUnsigned(0)
-    str = "%x-%x-%x-" % (data1, data2, data3)
-
-    data4_val = valobj.GetChildMemberWithName('Data4')
-    for i in range (data4_val.num_children):
-        if i == 2:
-            str +='-'
-        str += "%02x" % data4_val.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)
-    
-    return guid_dict.get (str.upper(), '')
-
-
-
-EFI_STATUS_Dict = {
-    (0x8000000000000000 |  1): "Load Error",
-    (0x8000000000000000 |  2): "Invalid Parameter",
-    (0x8000000000000000 |  3): "Unsupported",
-    (0x8000000000000000 |  4): "Bad Buffer Size",
-    (0x8000000000000000 |  5): "Buffer Too Small",
-    (0x8000000000000000 |  6): "Not Ready",
-    (0x8000000000000000 |  7): "Device Error",
-    (0x8000000000000000 |  8): "Write Protected",
-    (0x8000000000000000 |  9): "Out of Resources",
-    (0x8000000000000000 | 10): "Volume Corrupt",
-    (0x8000000000000000 | 11): "Volume Full",
-    (0x8000000000000000 | 12): "No Media",
-    (0x8000000000000000 | 13): "Media changed",
-    (0x8000000000000000 | 14): "Not Found",
-    (0x8000000000000000 | 15): "Access Denied",
-    (0x8000000000000000 | 16): "No Response",
-    (0x8000000000000000 | 17): "No mapping",
-    (0x8000000000000000 | 18): "Time out",
-    (0x8000000000000000 | 19): "Not started",
-    (0x8000000000000000 | 20): "Already started",
-    (0x8000000000000000 | 21): "Aborted",
-    (0x8000000000000000 | 22): "ICMP Error",
-    (0x8000000000000000 | 23): "TFTP Error",
-    (0x8000000000000000 | 24): "Protocol Error",
-
-                          0 : "Success",
-                          1 : "Warning Unknown Glyph",
-                          2 : "Warning Delete Failure",
-                          3 : "Warning Write Failure",
-                          4 : "Warning Buffer Too Small",
-
-    (0x80000000         |  1): "Load Error",
-    (0x80000000         |  2): "Invalid Parameter",
-    (0x80000000         |  3): "Unsupported",
-    (0x80000000         |  4): "Bad Buffer Size",
-    (0x80000000         |  5): "Buffer Too Small",
-    (0x80000000         |  6): "Not Ready",
-    (0x80000000         |  7): "Device Error",
-    (0x80000000         |  8): "Write Protected",
-    (0x80000000         |  9): "Out of Resources",
-    (0x80000000         | 10): "Volume Corrupt",
-    (0x80000000         | 11): "Volume Full",
-    (0x80000000         | 12): "No Media",
-    (0x80000000         | 13): "Media changed",
-    (0x80000000         | 14): "Not Found",
-    (0x80000000         | 15): "Access Denied",
-    (0x80000000         | 16): "No Response",
-    (0x80000000         | 17): "No mapping",
-    (0x80000000         | 18): "Time out",
-    (0x80000000         | 19): "Not started",
-    (0x80000000         | 20): "Already started",
-    (0x80000000         | 21): "Aborted",
-    (0x80000000         | 22): "ICMP Error",
-    (0x80000000         | 23): "TFTP Error",
-    (0x80000000         | 24): "Protocol Error",
-}
-
-def EFI_STATUS_TypeSummary (valobj,internal_dict):
-  #
-  # Return summary string for EFI_STATUS from dictionary
-  #
-  Status = valobj.GetValueAsUnsigned(0)
-  return EFI_STATUS_Dict.get (Status, '')
-
-
-def EFI_TPL_TypeSummary (valobj,internal_dict):
-  #
-  # Return TPL values 
-  #
-
-  if valobj.TypeIsPointerType():
-    return ""
-
-  Tpl = valobj.GetValueAsUnsigned(0)
-  if   Tpl < 4:
-    Str = "%d" % Tpl
-  elif Tpl == 6:
-    Str = "TPL_DRIVER (Obsolete Concept in edk2)"
-  elif Tpl < 8:
-    Str = "TPL_APPLICATION"
-    if Tpl - 4 > 0:
-      Str += " + " + "%d" % (Tpl - 4)
-  elif Tpl < 16:
-    Str = "TPL_CALLBACK"
-    if Tpl - 8 > 0:
-      Str += " + " + "%d" % (Tpl - 4)
-  elif Tpl < 31:
-    Str = "TPL_NOTIFY"
-    if Tpl - 16 > 0:
-      Str += " + " + "%d" % (Tpl - 4)
-  elif Tpl == 31:
-    Str = "TPL_HIGH_LEVEL"
-  else:
-    Str = "Invalid TPL"
-  
-  return Str
-
- 
-def CHAR16_TypeSummary (valobj,internal_dict):
-  #
-  # Display EFI CHAR16 'unsigned short' as string
-  #
-  SBError = lldb.SBError()
-  Str = ''
-  if valobj.TypeIsPointerType():
-    if valobj.GetValueAsUnsigned () == 0:
-      return "NULL"
-      
-    # CHAR16 *   max string size 1024
-    for i in range (1024):
-      Char = valobj.GetPointeeData(i,1).GetUnsignedInt16(SBError, 0)
-      if SBError.fail or Char == 0:
-        break
-      Str += unichr (Char)
-    Str = 'L"' + Str + '"'
-    return Str.encode ('utf-8', 'replace')
-  
-  if valobj.num_children == 0:
-    # CHAR16
-    if chr (valobj.unsigned) in string.printable:
-      Str = "L'" + unichr (valobj.unsigned) + "'"
-      return Str.encode ('utf-8', 'replace')
-  else:
-    # CHAR16 []
-    for i in range (valobj.num_children):
-      Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt16(SBError, 0)
-      if Char == 0:
-        break
-      Str += unichr (Char)
-    Str = 'L"' + Str + '"'
-    return Str.encode ('utf-8', 'replace')
-  
-  return Str
-
-def CHAR8_TypeSummary (valobj,internal_dict):
-  #
-  # Display EFI CHAR8 'signed char' as string
-  # unichr() is used as a junk string can produce an error message like this:
-  # UnicodeEncodeError: 'ascii' codec can't encode character u'\x90' in position 1: ordinal not in range(128)
-  #
-  SBError = lldb.SBError()
-  Str = ''
-  if valobj.TypeIsPointerType():
-    if valobj.GetValueAsUnsigned () == 0:
-      return "NULL"
-      
-    # CHAR8 *   max string size 1024
-    for i in range (1024):
-      Char = valobj.GetPointeeData(i,1).GetUnsignedInt8(SBError, 0)
-      if SBError.fail or Char == 0:
-        break
-      Str += unichr (Char)
-    Str = '"' + Str + '"'  
-    return Str.encode ('utf-8', 'replace')
-  
-  if valobj.num_children == 0:
-    # CHAR8
-    if chr (valobj.unsigned) in string.printable:
-      Str = '"' + unichr (valobj.unsigned)  + '"'
-      return Str.encode ('utf-8', 'replace')
-  else:
-    # CHAR8 []
-    for i in range (valobj.num_children):
-      Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)
-      if Char == 0:
-        break
-      Str += unichr (Char)
-    Str = '"' + Str + '"'  
-    return Str.encode ('utf-8', 'replace')
-  
-  return Str
-
-device_path_dict = {
-  (0x01, 0x01): "PCI_DEVICE_PATH",
-  (0x01, 0x02): "PCCARD_DEVICE_PATH",
-  (0x01, 0x03): "MEMMAP_DEVICE_PATH",
-  (0x01, 0x04): "VENDOR_DEVICE_PATH",
-  (0x01, 0x05): "CONTROLLER_DEVICE_PATH",
-  (0x02, 0x01): "ACPI_HID_DEVICE_PATH",
-  (0x02, 0x02): "ACPI_EXTENDED_HID_DEVICE_PATH",
-  (0x02, 0x03): "ACPI_ADR_DEVICE_PATH",
-  (0x03, 0x01): "ATAPI_DEVICE_PATH",
-  (0x03, 0x12): "SATA_DEVICE_PATH",
-  (0x03, 0x02): "SCSI_DEVICE_PATH",
-  (0x03, 0x03): "FIBRECHANNEL_DEVICE_PATH",
-  (0x03, 0x04): "F1394_DEVICE_PATH",
-  (0x03, 0x05): "USB_DEVICE_PATH",
-  (0x03, 0x0f): "USB_CLASS_DEVICE_PATH",
-  (0x03, 0x10): "FW_SBP2_UNIT_LUN_DEVICE_PATH",
-  (0x03, 0x11): "DEVICE_LOGICAL_UNIT_DEVICE_PATH",
-  (0x03, 0x06): "I2O_DEVICE_PATH",
-  (0x03, 0x0b): "MAC_ADDR_DEVICE_PATH",
-  (0x03, 0x0c): "IPv4_DEVICE_PATH",
-  (0x03, 0x09): "INFINIBAND_DEVICE_PATH",
-  (0x03, 0x0e): "UART_DEVICE_PATH",
-  (0x03, 0x0a): "VENDOR_DEVICE_PATH",
-  (0x03, 0x13): "ISCSI_DEVICE_PATH", 
-  (0x04, 0x01): "HARDDRIVE_DEVICE_PATH",
-  (0x04, 0x02): "CDROM_DEVICE_PATH",
-  (0x04, 0x03): "VENDOR_DEVICE_PATH",
-  (0x04, 0x04): "FILEPATH_DEVICE_PATH",
-  (0x04, 0x05): "MEDIA_PROTOCOL_DEVICE_PATH",
-  (0x05, 0x01): "BBS_BBS_DEVICE_PATH",
-  (0x7F, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",
-  (0xFF, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",
-}
-
-def EFI_DEVICE_PATH_PROTOCOL_TypeSummary (valobj,internal_dict):
-  #
-  #
-  #
-  if valobj.TypeIsPointerType():
-    # EFI_DEVICE_PATH_PROTOCOL *
-    return ""
-
-  Str = ""
-  if valobj.num_children == 3:
-    # EFI_DEVICE_PATH_PROTOCOL
-    Type    = valobj.GetChildMemberWithName('Type').unsigned
-    SubType = valobj.GetChildMemberWithName('SubType').unsigned
-    if (Type, SubType) in device_path_dict:
-      TypeStr = device_path_dict[Type, SubType]
-    else:
-      TypeStr = ""
-    
-    LenLow  = valobj.GetChildMemberWithName('Length').GetChildAtIndex(0).unsigned
-    LenHigh = valobj.GetChildMemberWithName('Length').GetChildAtIndex(1).unsigned
-    Len = LenLow + (LenHigh >> 8)
-    
-    Address = long ("%d" % valobj.addr)
-    if (Address == lldb.LLDB_INVALID_ADDRESS):
-      # Need to reserach this, it seems to be the nested struct case
-      ExprStr = ""
-    elif (Type & 0x7f == 0x7f):
-      ExprStr = "End Device Path" if SubType == 0xff else "End This Instance"
-    else:
-      ExprStr = "expr *(%s *)0x%08x" % (TypeStr, Address) 
-    
-    Str =  " {\n"
-    Str += "   (UINT8) Type    = 0x%02x // %s\n" % (Type, "END" if (Type & 0x7f == 0x7f) else "")
-    Str += "   (UINT8) SubType = 0x%02x // %s\n" % (SubType, ExprStr)
-    Str += "   (UINT8 [2]) Length = { // 0x%04x (%d) bytes\n" % (Len, Len)
-    Str += "     (UINT8) [0] = 0x%02x\n" % LenLow
-    Str += "     (UINT8) [1] = 0x%02x\n" % LenHigh
-    Str +=  "   }\n"
-    if (Type & 0x7f == 0x7f) and (SubType == 0xff):
-      pass
-    elif ExprStr != "":
-      NextNode = Address + Len
-      Str += "// Next node 'expr *(EFI_DEVICE_PATH_PROTOCOL *)0x%08x'\n" % NextNode
-
-  return Str
-
-
-
-def TypePrintFormating(debugger):
-    #
-    # Set the default print formating for EFI types in lldb.
-    # seems lldb defaults to decimal.
-    #
-    category = debugger.GetDefaultCategory()
-    FormatBool = lldb.SBTypeFormat(lldb.eFormatBoolean)
-    category.AddTypeFormat(lldb.SBTypeNameSpecifier("BOOLEAN"), FormatBool)
-
-    FormatHex  = lldb.SBTypeFormat(lldb.eFormatHex)
-    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT64"), FormatHex)
-    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT64"), FormatHex)
-    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT32"), FormatHex)
-    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT32"), FormatHex)
-    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT16"), FormatHex)
-    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT16"), FormatHex)
-    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT8"), FormatHex)
-    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT8"), FormatHex)
-    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINTN"), FormatHex)
-    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INTN"), FormatHex)
-    category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR8"), FormatHex)
-    category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR16"), FormatHex)
-
-    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_PHYSICAL_ADDRESS"), FormatHex)
-    category.AddTypeFormat(lldb.SBTypeNameSpecifier("PHYSICAL_ADDRESS"), FormatHex)
-    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_STATUS"), FormatHex)
-    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_TPL"), FormatHex)
-    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_LBA"), FormatHex)
-    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_BOOT_MODE"), FormatHex)
-    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_FV_FILETYPE"), FormatHex)
-
-    #
-    # Smart type printing for EFI
-    #
-    debugger.HandleCommand("type summary add EFI_GUID --python-function lldbefi.EFI_GUID_TypeSummary")
-    debugger.HandleCommand("type summary add EFI_STATUS --python-function lldbefi.EFI_STATUS_TypeSummary")
-    debugger.HandleCommand("type summary add EFI_TPL --python-function lldbefi.EFI_TPL_TypeSummary")
-    debugger.HandleCommand("type summary add EFI_DEVICE_PATH_PROTOCOL --python-function lldbefi.EFI_DEVICE_PATH_PROTOCOL_TypeSummary")
-
-    debugger.HandleCommand("type summary add CHAR16 --python-function lldbefi.CHAR16_TypeSummary")
-    debugger.HandleCommand('type summary add --regex "CHAR16 \[[0-9]+\]" --python-function lldbefi.CHAR16_TypeSummary')
-    debugger.HandleCommand("type summary add CHAR8 --python-function lldbefi.CHAR8_TypeSummary")
-    debugger.HandleCommand('type summary add --regex "CHAR8 \[[0-9]+\]" --python-function lldbefi.CHAR8_TypeSummary')
-
-
-gEmulatorBreakWorkaroundNeeded = True
-
-def LoadEmulatorEfiSymbols(frame, bp_loc , internal_dict):
-    #
-    # This is an lldb breakpoint script, and assumes the breakpoint is on a
-    # function with the same prototype as SecGdbScriptBreak(). The
-    # argument names are important as lldb looks them up.
-    #
-    # VOID
-    # SecGdbScriptBreak (
-    #   char                *FileName,
-    #   int                 FileNameLength,
-    #   long unsigned int   LoadAddress,
-    #   int                 AddSymbolFlag
-    #   )
-    # {
-    #   return;
-    # }
-    #
-    # When the emulator loads a PE/COFF image, it calls the stub function with
-    # the filename of the symbol file, the length of the FileName, the
-    # load address and a flag to indicate if this is a load or unload operation
-    #
-    global gEmulatorBreakWorkaroundNeeded
-
-    if gEmulatorBreakWorkaroundNeeded:
-        # turn off lldb debug prints on SIGALRM (EFI timer tick)
-        frame.thread.process.target.debugger.HandleCommand("process handle SIGALRM -n false")
-        gEmulatorBreakWorkaroundNeeded = False
-
-    # Convert C string to Python string
-    Error = lldb.SBError()
-    FileNamePtr = frame.FindVariable ("FileName").GetValueAsUnsigned()
-    FileNameLen = frame.FindVariable ("FileNameLength").GetValueAsUnsigned()
-    FileName = frame.thread.process.ReadCStringFromMemory (FileNamePtr, FileNameLen, Error)
-    if not Error.Success():
-        print "!ReadCStringFromMemory() did not find a %d byte C string at %x" % (FileNameLen, FileNamePtr)
-        # make breakpoint command contiue
-        frame.GetThread().GetProcess().Continue()
-
-    debugger = frame.thread.process.target.debugger
-    if frame.FindVariable ("AddSymbolFlag").GetValueAsUnsigned() == 1:
-        LoadAddress = frame.FindVariable ("LoadAddress").GetValueAsUnsigned()
-        
-        debugger.HandleCommand ("target modules add  %s" % FileName)
-        print "target modules load --slid 0x%x %s" % (LoadAddress, FileName)
-        debugger.HandleCommand ("target modules load --slide 0x%x --file %s" % (LoadAddress, FileName))
-    else:
-        target = debugger.GetSelectedTarget()
-        for SBModule in target.module_iter():
-            ModuleName  = SBModule.GetFileSpec().GetDirectory() + '/'
-            ModuleName += SBModule.GetFileSpec().GetFilename()
-            if FileName == ModuleName or FileName == SBModule.GetFileSpec().GetFilename():
-                target.ClearModuleLoadAddress (SBModule)
-                if not target.RemoveModule (SBModule):
-                    print "!lldb.target.RemoveModule (%s) FAILED" % SBModule
-
-    # make breakpoint command contiue
-    frame.thread.process.Continue()
-
-def GuidToCStructStr (guid, Name=False):
-  #
-  # Convert a 16-byte bytesarry (or bytearray compat object) to C guid string
-  # { 0xB402621F, 0xA940, 0x1E4A, { 0x86, 0x6B, 0x4D, 0xC9, 0x16, 0x2B, 0x34, 0x7C } }
-  #
-  # Name=True means lookup name in GuidNameDict and us it if you find it
-  #
-
-  if not isinstance (guid, bytearray):
-    # convert guid object to UUID, and UUID to bytearray
-    Uuid = uuid.UUID(guid)
-    guid = bytearray (Uuid.bytes_le)
-
-  return "{ 0x%02.2X%02.2X%02.2X%02.2X, 0x%02.2X%02.2X, 0x%02.2X%02.2X, { 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X } }" % \
-         (guid[3], guid[2], guid[1], guid[0], guid[5], guid[4], guid[7], guid[6], guid[8], guid[9], guid[10], guid[11], guid[12], guid[13], guid[14], guid[15])
-
-def ParseGuidString(GuidStr):
-  #
-  # Error check and convert C Guid init to string
-  # ParseGuidString("49152E77-1ADA-4764-B7A2-7AFEFED95E8B")
-  # ParseGuidString("{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7, 0x8A, 0x35, 0x46, 0xD1 } }")
-  #
-
-  if "{" in GuidStr                                                                                         :
-    # convert C form "{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7, 0x8A, 0x35, 0x46, 0xD1 } }"
-    # to string form BA24B391-73FD-C54C-9EAF-0CA78A3546D1
-    # make a list of Hex numbers like: ['0xBA24B391', '0x73FD', '0xC54C', '0x9E', '0xAF', '0x0C', '0xA7', '0x8A', '0x35', '0x46', '0xD1']
-    Hex = ''.join(x for x in GuidStr if x not in '{,}').split()
-    Str = "%08X-%04X-%04X-%02.2X%02.2X-%02.2X%02.2X%02.2X%02.2X%02.2X%02.2X" % \
-          (int(Hex[0], 0), int(Hex[1], 0), int(Hex[2], 0), int(Hex[3], 0), int(Hex[4], 0), \
-           int(Hex[5], 0), int(Hex[6], 0), int(Hex[7], 0), int(Hex[8], 0), int(Hex[9], 0), int(Hex[10], 0))
-  elif GuidStr.count('-') == 4:
-    # validate "49152E77-1ADA-4764-B7A2-7AFEFED95E8B" form
-    Check = "%s" % str(uuid.UUID(GuidStr)).upper()
-    if GuidStr.upper() == Check:
-      Str = GuidStr.upper()
-    else:
-      Ste = ""
-  else:
-    Str = ""
-
-  return Str
-
-
-def create_guid_options():
-    usage = "usage: %prog [data]"
-    description='''lookup EFI_GUID by CName, C struct, or GUID string and print out all three.
-    '''
-    parser = optparse.OptionParser(description=description, prog='guid',usage=usage)
-    return parser
-
-def efi_guid_command(debugger, command, result, dict):
-    # Use the Shell Lexer to properly parse up command options just like a 
-    # shell would
-    command_args = shlex.split(command)
-    parser = create_guid_options()
-    try:
-        (options, args) = parser.parse_args(command_args)
-        if len(args) >= 1:
-          if args[0] == "{":
-              # caller forgot to quote the string"
-              # mark arg[0] a string containing all args[n]
-              args[0] = ' '.join(args)
-          GuidStr = ParseGuidString (args[0]) 
-          if GuidStr == "":
-              # return Key of GuidNameDict for value args[0]
-              GuidStr = [Key for Key, Value in guid_dict.iteritems() if Value == args[0]][0]
-          GuidStr = GuidStr.upper()
-    except:
-        # if you don't handle exceptions, passing an incorrect argument to the OptionParser will cause LLDB to exit
-        # (courtesy of OptParse dealing with argument errors by throwing SystemExit)
-        result.SetError ("option parsing failed")
-        return
-
-    
-    if len(args) >= 1:
-        if GuidStr in guid_dict:
-            print "%s = %s" % (guid_dict[GuidStr], GuidStr)
-            print "%s = %s" % (guid_dict[GuidStr], GuidToCStructStr (GuidStr))
-        else:
-            print GuidStr
-    else:
-        # dump entire dictionary
-        width = max(len(v) for k,v in guid_dict.iteritems())
-        for value in sorted(guid_dict, key=guid_dict.get):
-            print '%-*s %s %s' % (width, guid_dict[value], value, GuidToCStructStr(value))
-
-    return
-
-
-#
-########## Code that runs when this script is imported into LLDB ###########
-#
-def __lldb_init_module (debugger, internal_dict):
-    # This initializer is being run from LLDB in the embedded command interpreter
-    # Make the options so we can generate the help text for the new LLDB
-    # command line command prior to registering it with LLDB below
-    
-    global guid_dict
-
-    # Source Guid.xref file if we can find it
-    inputfile = os.getcwd()
-    inputfile += os.sep + os.pardir + os.sep + 'FV' + os.sep + 'Guid.xref'
-    with open(inputfile) as f:
-        for line in f:
-            data = line.split(' ')
-            if len(data) >= 2:
-                guid_dict[data[0].upper()] = data[1].strip('\n')
-
-    # init EFI specific type formaters
-    TypePrintFormating (debugger)
-
-
-    # add guid command
-    parser = create_guid_options()
-    efi_guid_command.__doc__ = parser.format_help()
-    debugger.HandleCommand('command script add -f lldbefi.efi_guid_command guid')
-
-
-    Target = debugger.GetTargetAtIndex(0)
-    if Target:
-        Breakpoint = Target.BreakpointCreateByName('SecGdbScriptBreak')
-        if Breakpoint.GetNumLocations() == 1:
-            # Set the emulator breakpoints, if we are in the emulator
-            debugger.HandleCommand("breakpoint command add -s python -F lldbefi.LoadEmulatorEfiSymbols {id}".format(id=Breakpoint.GetID()))
-            print 'Type r to run emulator. SecLldbScriptBreak armed. EFI modules should now get source level debugging in the emulator.'
+#!/usr/bin/python
+
+#
+#  Copyright 2014 Apple Inc. All righes reserved.
+#
+#  This program and the accompanying materials
+#  are licensed and made available under the terms and conditions of the BSD License
+#  which accompanies this distribution. The full text of the license may be found at
+#  http://opensource.org/licenses/bsd-license.php.
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+
+import lldb
+import os
+import uuid
+import string
+import commands
+import optparse
+import shlex
+
+guid_dict = {}
+
+
+def EFI_GUID_TypeSummary (valobj,internal_dict):
+    """ Type summary for EFI GUID, print C Name if known
+    """
+    # typedef struct {
+    #   UINT32  Data1;
+    #   UINT16  Data2;
+    #   UINT16  Data3;
+    #   UINT8   Data4[8];
+    # } EFI_GUID;
+    SBError = lldb.SBError()
+
+    data1_val = valobj.GetChildMemberWithName('Data1')
+    data1 = data1_val.GetValueAsUnsigned(0)
+    data2_val = valobj.GetChildMemberWithName('Data2')
+    data2 = data2_val.GetValueAsUnsigned(0)
+    data3_val = valobj.GetChildMemberWithName('Data3')
+    data3 = data3_val.GetValueAsUnsigned(0)
+    str = "%x-%x-%x-" % (data1, data2, data3)
+
+    data4_val = valobj.GetChildMemberWithName('Data4')
+    for i in range (data4_val.num_children):
+        if i == 2:
+            str +='-'
+        str += "%02x" % data4_val.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)
+
+    return guid_dict.get (str.upper(), '')
+
+
+
+EFI_STATUS_Dict = {
+    (0x8000000000000000 |  1): "Load Error",
+    (0x8000000000000000 |  2): "Invalid Parameter",
+    (0x8000000000000000 |  3): "Unsupported",
+    (0x8000000000000000 |  4): "Bad Buffer Size",
+    (0x8000000000000000 |  5): "Buffer Too Small",
+    (0x8000000000000000 |  6): "Not Ready",
+    (0x8000000000000000 |  7): "Device Error",
+    (0x8000000000000000 |  8): "Write Protected",
+    (0x8000000000000000 |  9): "Out of Resources",
+    (0x8000000000000000 | 10): "Volume Corrupt",
+    (0x8000000000000000 | 11): "Volume Full",
+    (0x8000000000000000 | 12): "No Media",
+    (0x8000000000000000 | 13): "Media changed",
+    (0x8000000000000000 | 14): "Not Found",
+    (0x8000000000000000 | 15): "Access Denied",
+    (0x8000000000000000 | 16): "No Response",
+    (0x8000000000000000 | 17): "No mapping",
+    (0x8000000000000000 | 18): "Time out",
+    (0x8000000000000000 | 19): "Not started",
+    (0x8000000000000000 | 20): "Already started",
+    (0x8000000000000000 | 21): "Aborted",
+    (0x8000000000000000 | 22): "ICMP Error",
+    (0x8000000000000000 | 23): "TFTP Error",
+    (0x8000000000000000 | 24): "Protocol Error",
+
+                          0 : "Success",
+                          1 : "Warning Unknown Glyph",
+                          2 : "Warning Delete Failure",
+                          3 : "Warning Write Failure",
+                          4 : "Warning Buffer Too Small",
+
+    (0x80000000         |  1): "Load Error",
+    (0x80000000         |  2): "Invalid Parameter",
+    (0x80000000         |  3): "Unsupported",
+    (0x80000000         |  4): "Bad Buffer Size",
+    (0x80000000         |  5): "Buffer Too Small",
+    (0x80000000         |  6): "Not Ready",
+    (0x80000000         |  7): "Device Error",
+    (0x80000000         |  8): "Write Protected",
+    (0x80000000         |  9): "Out of Resources",
+    (0x80000000         | 10): "Volume Corrupt",
+    (0x80000000         | 11): "Volume Full",
+    (0x80000000         | 12): "No Media",
+    (0x80000000         | 13): "Media changed",
+    (0x80000000         | 14): "Not Found",
+    (0x80000000         | 15): "Access Denied",
+    (0x80000000         | 16): "No Response",
+    (0x80000000         | 17): "No mapping",
+    (0x80000000         | 18): "Time out",
+    (0x80000000         | 19): "Not started",
+    (0x80000000         | 20): "Already started",
+    (0x80000000         | 21): "Aborted",
+    (0x80000000         | 22): "ICMP Error",
+    (0x80000000         | 23): "TFTP Error",
+    (0x80000000         | 24): "Protocol Error",
+}
+
+def EFI_STATUS_TypeSummary (valobj,internal_dict):
+  #
+  # Return summary string for EFI_STATUS from dictionary
+  #
+  Status = valobj.GetValueAsUnsigned(0)
+  return EFI_STATUS_Dict.get (Status, '')
+
+
+def EFI_TPL_TypeSummary (valobj,internal_dict):
+  #
+  # Return TPL values
+  #
+
+  if valobj.TypeIsPointerType():
+    return ""
+
+  Tpl = valobj.GetValueAsUnsigned(0)
+  if   Tpl < 4:
+    Str = "%d" % Tpl
+  elif Tpl == 6:
+    Str = "TPL_DRIVER (Obsolete Concept in edk2)"
+  elif Tpl < 8:
+    Str = "TPL_APPLICATION"
+    if Tpl - 4 > 0:
+      Str += " + " + "%d" % (Tpl - 4)
+  elif Tpl < 16:
+    Str = "TPL_CALLBACK"
+    if Tpl - 8 > 0:
+      Str += " + " + "%d" % (Tpl - 4)
+  elif Tpl < 31:
+    Str = "TPL_NOTIFY"
+    if Tpl - 16 > 0:
+      Str += " + " + "%d" % (Tpl - 4)
+  elif Tpl == 31:
+    Str = "TPL_HIGH_LEVEL"
+  else:
+    Str = "Invalid TPL"
+
+  return Str
+
+
+def CHAR16_TypeSummary (valobj,internal_dict):
+  #
+  # Display EFI CHAR16 'unsigned short' as string
+  #
+  SBError = lldb.SBError()
+  Str = ''
+  if valobj.TypeIsPointerType():
+    if valobj.GetValueAsUnsigned () == 0:
+      return "NULL"
+
+    # CHAR16 *   max string size 1024
+    for i in range (1024):
+      Char = valobj.GetPointeeData(i,1).GetUnsignedInt16(SBError, 0)
+      if SBError.fail or Char == 0:
+        break
+      Str += unichr (Char)
+    Str = 'L"' + Str + '"'
+    return Str.encode ('utf-8', 'replace')
+
+  if valobj.num_children == 0:
+    # CHAR16
+    if chr (valobj.unsigned) in string.printable:
+      Str = "L'" + unichr (valobj.unsigned) + "'"
+      return Str.encode ('utf-8', 'replace')
+  else:
+    # CHAR16 []
+    for i in range (valobj.num_children):
+      Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt16(SBError, 0)
+      if Char == 0:
+        break
+      Str += unichr (Char)
+    Str = 'L"' + Str + '"'
+    return Str.encode ('utf-8', 'replace')
+
+  return Str
+
+def CHAR8_TypeSummary (valobj,internal_dict):
+  #
+  # Display EFI CHAR8 'signed char' as string
+  # unichr() is used as a junk string can produce an error message like this:
+  # UnicodeEncodeError: 'ascii' codec can't encode character u'\x90' in position 1: ordinal not in range(128)
+  #
+  SBError = lldb.SBError()
+  Str = ''
+  if valobj.TypeIsPointerType():
+    if valobj.GetValueAsUnsigned () == 0:
+      return "NULL"
+
+    # CHAR8 *   max string size 1024
+    for i in range (1024):
+      Char = valobj.GetPointeeData(i,1).GetUnsignedInt8(SBError, 0)
+      if SBError.fail or Char == 0:
+        break
+      Str += unichr (Char)
+    Str = '"' + Str + '"'
+    return Str.encode ('utf-8', 'replace')
+
+  if valobj.num_children == 0:
+    # CHAR8
+    if chr (valobj.unsigned) in string.printable:
+      Str = '"' + unichr (valobj.unsigned)  + '"'
+      return Str.encode ('utf-8', 'replace')
+  else:
+    # CHAR8 []
+    for i in range (valobj.num_children):
+      Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)
+      if Char == 0:
+        break
+      Str += unichr (Char)
+    Str = '"' + Str + '"'
+    return Str.encode ('utf-8', 'replace')
+
+  return Str
+
+device_path_dict = {
+  (0x01, 0x01): "PCI_DEVICE_PATH",
+  (0x01, 0x02): "PCCARD_DEVICE_PATH",
+  (0x01, 0x03): "MEMMAP_DEVICE_PATH",
+  (0x01, 0x04): "VENDOR_DEVICE_PATH",
+  (0x01, 0x05): "CONTROLLER_DEVICE_PATH",
+  (0x02, 0x01): "ACPI_HID_DEVICE_PATH",
+  (0x02, 0x02): "ACPI_EXTENDED_HID_DEVICE_PATH",
+  (0x02, 0x03): "ACPI_ADR_DEVICE_PATH",
+  (0x03, 0x01): "ATAPI_DEVICE_PATH",
+  (0x03, 0x12): "SATA_DEVICE_PATH",
+  (0x03, 0x02): "SCSI_DEVICE_PATH",
+  (0x03, 0x03): "FIBRECHANNEL_DEVICE_PATH",
+  (0x03, 0x04): "F1394_DEVICE_PATH",
+  (0x03, 0x05): "USB_DEVICE_PATH",
+  (0x03, 0x0f): "USB_CLASS_DEVICE_PATH",
+  (0x03, 0x10): "FW_SBP2_UNIT_LUN_DEVICE_PATH",
+  (0x03, 0x11): "DEVICE_LOGICAL_UNIT_DEVICE_PATH",
+  (0x03, 0x06): "I2O_DEVICE_PATH",
+  (0x03, 0x0b): "MAC_ADDR_DEVICE_PATH",
+  (0x03, 0x0c): "IPv4_DEVICE_PATH",
+  (0x03, 0x09): "INFINIBAND_DEVICE_PATH",
+  (0x03, 0x0e): "UART_DEVICE_PATH",
+  (0x03, 0x0a): "VENDOR_DEVICE_PATH",
+  (0x03, 0x13): "ISCSI_DEVICE_PATH",
+  (0x04, 0x01): "HARDDRIVE_DEVICE_PATH",
+  (0x04, 0x02): "CDROM_DEVICE_PATH",
+  (0x04, 0x03): "VENDOR_DEVICE_PATH",
+  (0x04, 0x04): "FILEPATH_DEVICE_PATH",
+  (0x04, 0x05): "MEDIA_PROTOCOL_DEVICE_PATH",
+  (0x05, 0x01): "BBS_BBS_DEVICE_PATH",
+  (0x7F, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",
+  (0xFF, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",
+}
+
+def EFI_DEVICE_PATH_PROTOCOL_TypeSummary (valobj,internal_dict):
+  #
+  #
+  #
+  if valobj.TypeIsPointerType():
+    # EFI_DEVICE_PATH_PROTOCOL *
+    return ""
+
+  Str = ""
+  if valobj.num_children == 3:
+    # EFI_DEVICE_PATH_PROTOCOL
+    Type    = valobj.GetChildMemberWithName('Type').unsigned
+    SubType = valobj.GetChildMemberWithName('SubType').unsigned
+    if (Type, SubType) in device_path_dict:
+      TypeStr = device_path_dict[Type, SubType]
+    else:
+      TypeStr = ""
+
+    LenLow  = valobj.GetChildMemberWithName('Length').GetChildAtIndex(0).unsigned
+    LenHigh = valobj.GetChildMemberWithName('Length').GetChildAtIndex(1).unsigned
+    Len = LenLow + (LenHigh >> 8)
+
+    Address = long ("%d" % valobj.addr)
+    if (Address == lldb.LLDB_INVALID_ADDRESS):
+      # Need to reserach this, it seems to be the nested struct case
+      ExprStr = ""
+    elif (Type & 0x7f == 0x7f):
+      ExprStr = "End Device Path" if SubType == 0xff else "End This Instance"
+    else:
+      ExprStr = "expr *(%s *)0x%08x" % (TypeStr, Address)
+
+    Str =  " {\n"
+    Str += "   (UINT8) Type    = 0x%02x // %s\n" % (Type, "END" if (Type & 0x7f == 0x7f) else "")
+    Str += "   (UINT8) SubType = 0x%02x // %s\n" % (SubType, ExprStr)
+    Str += "   (UINT8 [2]) Length = { // 0x%04x (%d) bytes\n" % (Len, Len)
+    Str += "     (UINT8) [0] = 0x%02x\n" % LenLow
+    Str += "     (UINT8) [1] = 0x%02x\n" % LenHigh
+    Str +=  "   }\n"
+    if (Type & 0x7f == 0x7f) and (SubType == 0xff):
+      pass
+    elif ExprStr != "":
+      NextNode = Address + Len
+      Str += "// Next node 'expr *(EFI_DEVICE_PATH_PROTOCOL *)0x%08x'\n" % NextNode
+
+  return Str
+
+
+
+def TypePrintFormating(debugger):
+    #
+    # Set the default print formating for EFI types in lldb.
+    # seems lldb defaults to decimal.
+    #
+    category = debugger.GetDefaultCategory()
+    FormatBool = lldb.SBTypeFormat(lldb.eFormatBoolean)
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("BOOLEAN"), FormatBool)
+
+    FormatHex  = lldb.SBTypeFormat(lldb.eFormatHex)
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT64"), FormatHex)
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT64"), FormatHex)
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT32"), FormatHex)
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT32"), FormatHex)
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT16"), FormatHex)
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT16"), FormatHex)
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT8"), FormatHex)
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT8"), FormatHex)
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINTN"), FormatHex)
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("INTN"), FormatHex)
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR8"), FormatHex)
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR16"), FormatHex)
+
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_PHYSICAL_ADDRESS"), FormatHex)
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("PHYSICAL_ADDRESS"), FormatHex)
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_STATUS"), FormatHex)
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_TPL"), FormatHex)
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_LBA"), FormatHex)
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_BOOT_MODE"), FormatHex)
+    category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_FV_FILETYPE"), FormatHex)
+
+    #
+    # Smart type printing for EFI
+    #
+    debugger.HandleCommand("type summary add EFI_GUID --python-function lldbefi.EFI_GUID_TypeSummary")
+    debugger.HandleCommand("type summary add EFI_STATUS --python-function lldbefi.EFI_STATUS_TypeSummary")
+    debugger.HandleCommand("type summary add EFI_TPL --python-function lldbefi.EFI_TPL_TypeSummary")
+    debugger.HandleCommand("type summary add EFI_DEVICE_PATH_PROTOCOL --python-function lldbefi.EFI_DEVICE_PATH_PROTOCOL_TypeSummary")
+
+    debugger.HandleCommand("type summary add CHAR16 --python-function lldbefi.CHAR16_TypeSummary")
+    debugger.HandleCommand('type summary add --regex "CHAR16 \[[0-9]+\]" --python-function lldbefi.CHAR16_TypeSummary')
+    debugger.HandleCommand("type summary add CHAR8 --python-function lldbefi.CHAR8_TypeSummary")
+    debugger.HandleCommand('type summary add --regex "CHAR8 \[[0-9]+\]" --python-function lldbefi.CHAR8_TypeSummary')
+
+
+gEmulatorBreakWorkaroundNeeded = True
+
+def LoadEmulatorEfiSymbols(frame, bp_loc , internal_dict):
+    #
+    # This is an lldb breakpoint script, and assumes the breakpoint is on a
+    # function with the same prototype as SecGdbScriptBreak(). The
+    # argument names are important as lldb looks them up.
+    #
+    # VOID
+    # SecGdbScriptBreak (
+    #   char                *FileName,
+    #   int                 FileNameLength,
+    #   long unsigned int   LoadAddress,
+    #   int                 AddSymbolFlag
+    #   )
+    # {
+    #   return;
+    # }
+    #
+    # When the emulator loads a PE/COFF image, it calls the stub function with
+    # the filename of the symbol file, the length of the FileName, the
+    # load address and a flag to indicate if this is a load or unload operation
+    #
+    global gEmulatorBreakWorkaroundNeeded
+
+    if gEmulatorBreakWorkaroundNeeded:
+        # turn off lldb debug prints on SIGALRM (EFI timer tick)
+        frame.thread.process.target.debugger.HandleCommand("process handle SIGALRM -n false")
+        gEmulatorBreakWorkaroundNeeded = False
+
+    # Convert C string to Python string
+    Error = lldb.SBError()
+    FileNamePtr = frame.FindVariable ("FileName").GetValueAsUnsigned()
+    FileNameLen = frame.FindVariable ("FileNameLength").GetValueAsUnsigned()
+    FileName = frame.thread.process.ReadCStringFromMemory (FileNamePtr, FileNameLen, Error)
+    if not Error.Success():
+        print "!ReadCStringFromMemory() did not find a %d byte C string at %x" % (FileNameLen, FileNamePtr)
+        # make breakpoint command contiue
+        frame.GetThread().GetProcess().Continue()
+
+    debugger = frame.thread.process.target.debugger
+    if frame.FindVariable ("AddSymbolFlag").GetValueAsUnsigned() == 1:
+        LoadAddress = frame.FindVariable ("LoadAddress").GetValueAsUnsigned()
+
+        debugger.HandleCommand ("target modules add  %s" % FileName)
+        print "target modules load --slid 0x%x %s" % (LoadAddress, FileName)
+        debugger.HandleCommand ("target modules load --slide 0x%x --file %s" % (LoadAddress, FileName))
+    else:
+        target = debugger.GetSelectedTarget()
+        for SBModule in target.module_iter():
+            ModuleName  = SBModule.GetFileSpec().GetDirectory() + '/'
+            ModuleName += SBModule.GetFileSpec().GetFilename()
+            if FileName == ModuleName or FileName == SBModule.GetFileSpec().GetFilename():
+                target.ClearModuleLoadAddress (SBModule)
+                if not target.RemoveModule (SBModule):
+                    print "!lldb.target.RemoveModule (%s) FAILED" % SBModule
+
+    # make breakpoint command contiue
+    frame.thread.process.Continue()
+
+def GuidToCStructStr (guid, Name=False):
+  #
+  # Convert a 16-byte bytesarry (or bytearray compat object) to C guid string
+  # { 0xB402621F, 0xA940, 0x1E4A, { 0x86, 0x6B, 0x4D, 0xC9, 0x16, 0x2B, 0x34, 0x7C } }
+  #
+  # Name=True means lookup name in GuidNameDict and us it if you find it
+  #
+
+  if not isinstance (guid, bytearray):
+    # convert guid object to UUID, and UUID to bytearray
+    Uuid = uuid.UUID(guid)
+    guid = bytearray (Uuid.bytes_le)
+
+  return "{ 0x%02.2X%02.2X%02.2X%02.2X, 0x%02.2X%02.2X, 0x%02.2X%02.2X, { 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X } }" % \
+         (guid[3], guid[2], guid[1], guid[0], guid[5], guid[4], guid[7], guid[6], guid[8], guid[9], guid[10], guid[11], guid[12], guid[13], guid[14], guid[15])
+
+def ParseGuidString(GuidStr):
+  #
+  # Error check and convert C Guid init to string
+  # ParseGuidString("49152E77-1ADA-4764-B7A2-7AFEFED95E8B")
+  # ParseGuidString("{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7, 0x8A, 0x35, 0x46, 0xD1 } }")
+  #
+
+  if "{" in GuidStr                                                                                         :
+    # convert C form "{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7, 0x8A, 0x35, 0x46, 0xD1 } }"
+    # to string form BA24B391-73FD-C54C-9EAF-0CA78A3546D1
+    # make a list of Hex numbers like: ['0xBA24B391', '0x73FD', '0xC54C', '0x9E', '0xAF', '0x0C', '0xA7', '0x8A', '0x35', '0x46', '0xD1']
+    Hex = ''.join(x for x in GuidStr if x not in '{,}').split()
+    Str = "%08X-%04X-%04X-%02.2X%02.2X-%02.2X%02.2X%02.2X%02.2X%02.2X%02.2X" % \
+          (int(Hex[0], 0), int(Hex[1], 0), int(Hex[2], 0), int(Hex[3], 0), int(Hex[4], 0), \
+           int(Hex[5], 0), int(Hex[6], 0), int(Hex[7], 0), int(Hex[8], 0), int(Hex[9], 0), int(Hex[10], 0))
+  elif GuidStr.count('-') == 4:
+    # validate "49152E77-1ADA-4764-B7A2-7AFEFED95E8B" form
+    Check = "%s" % str(uuid.UUID(GuidStr)).upper()
+    if GuidStr.upper() == Check:
+      Str = GuidStr.upper()
+    else:
+      Ste = ""
+  else:
+    Str = ""
+
+  return Str
+
+
+def create_guid_options():
+    usage = "usage: %prog [data]"
+    description='''lookup EFI_GUID by CName, C struct, or GUID string and print out all three.
+    '''
+    parser = optparse.OptionParser(description=description, prog='guid',usage=usage)
+    return parser
+
+def efi_guid_command(debugger, command, result, dict):
+    # Use the Shell Lexer to properly parse up command options just like a
+    # shell would
+    command_args = shlex.split(command)
+    parser = create_guid_options()
+    try:
+        (options, args) = parser.parse_args(command_args)
+        if len(args) >= 1:
+          if args[0] == "{":
+              # caller forgot to quote the string"
+              # mark arg[0] a string containing all args[n]
+              args[0] = ' '.join(args)
+          GuidStr = ParseGuidString (args[0])
+          if GuidStr == "":
+              # return Key of GuidNameDict for value args[0]
+              GuidStr = [Key for Key, Value in guid_dict.iteritems() if Value == args[0]][0]
+          GuidStr = GuidStr.upper()
+    except:
+        # if you don't handle exceptions, passing an incorrect argument to the OptionParser will cause LLDB to exit
+        # (courtesy of OptParse dealing with argument errors by throwing SystemExit)
+        result.SetError ("option parsing failed")
+        return
+
+
+    if len(args) >= 1:
+        if GuidStr in guid_dict:
+            print "%s = %s" % (guid_dict[GuidStr], GuidStr)
+            print "%s = %s" % (guid_dict[GuidStr], GuidToCStructStr (GuidStr))
+        else:
+            print GuidStr
+    else:
+        # dump entire dictionary
+        width = max(len(v) for k,v in guid_dict.iteritems())
+        for value in sorted(guid_dict, key=guid_dict.get):
+            print '%-*s %s %s' % (width, guid_dict[value], value, GuidToCStructStr(value))
+
+    return
+
+
+#
+########## Code that runs when this script is imported into LLDB ###########
+#
+def __lldb_init_module (debugger, internal_dict):
+    # This initializer is being run from LLDB in the embedded command interpreter
+    # Make the options so we can generate the help text for the new LLDB
+    # command line command prior to registering it with LLDB below
+
+    global guid_dict
+
+    # Source Guid.xref file if we can find it
+    inputfile = os.getcwd()
+    inputfile += os.sep + os.pardir + os.sep + 'FV' + os.sep + 'Guid.xref'
+    with open(inputfile) as f:
+        for line in f:
+            data = line.split(' ')
+            if len(data) >= 2:
+                guid_dict[data[0].upper()] = data[1].strip('\n')
+
+    # init EFI specific type formaters
+    TypePrintFormating (debugger)
+
+
+    # add guid command
+    parser = create_guid_options()
+    efi_guid_command.__doc__ = parser.format_help()
+    debugger.HandleCommand('command script add -f lldbefi.efi_guid_command guid')
+
+
+    Target = debugger.GetTargetAtIndex(0)
+    if Target:
+        Breakpoint = Target.BreakpointCreateByName('SecGdbScriptBreak')
+        if Breakpoint.GetNumLocations() == 1:
+            # Set the emulator breakpoints, if we are in the emulator
+            debugger.HandleCommand("breakpoint command add -s python -F lldbefi.LoadEmulatorEfiSymbols {id}".format(id=Breakpoint.GetID()))
+            print 'Type r to run emulator. SecLldbScriptBreak armed. EFI modules should now get source level debugging in the emulator.'

+ 1 - 1
EmulatorPkg/Win/Host/WinBlockIo.c

@@ -270,7 +270,7 @@ WinNtSignalToken (
   @param[in]       MediaId    Id of the media, changes every time the media is
                               replaced.
   @param[in]       Lba        The starting Logical Block Address to read from.
-  @param[in, out]  Token	    A pointer to the token associated with the transaction.
+  @param[in, out]  Token      A pointer to the token associated with the transaction.
   @param[in]       BufferSize Size of Buffer, must be a multiple of device block size.
   @param[out]      Buffer     A pointer to the destination buffer for the data. The
                               caller is responsible for either having implicit or

+ 1 - 1
EmulatorPkg/Win/Host/WinHost.h

@@ -206,4 +206,4 @@ extern EMU_THUNK_PROTOCOL    gEmuThunkProtocol;
 extern EMU_IO_THUNK_PROTOCOL mWinNtWndThunkIo;
 extern EMU_IO_THUNK_PROTOCOL mWinNtFileSystemThunkIo;
 extern EMU_IO_THUNK_PROTOCOL mWinNtBlockIoThunkIo;
-#endif
+#endif