* [PATCH] EmulatorPkg: formalize line endings
@ 2018-08-29 3:39 Ruiyu Ni
2018-08-29 5:06 ` Wu, Hao A
0 siblings, 1 reply; 2+ messages in thread
From: Ruiyu Ni @ 2018-08-29 3:39 UTC (permalink / raw)
To: edk2-devel; +Cc: Hao A Wu, Liming Gao
The patch is the result of running
"BaseTools/Scripts/FormatDosFiles.py EmulatorPkg/"
No functionality impact.
Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
Cc: Hao A Wu <hao.a.wu@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
---
EmulatorPkg/CpuRuntimeDxe/Cpu.c | 24 +-
EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c | 2 +-
EmulatorPkg/EmuGopDxe/Gop.h | 390 +--
EmulatorPkg/EmuGopDxe/GopInput.c | 1800 +++++------
EmulatorPkg/EmuGopDxe/GopScreen.c | 832 ++---
EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c | 2 +-
EmulatorPkg/Include/Library/EmuMagicPageLib.h | 76 +-
EmulatorPkg/Include/Library/EmuThunkLib.h | 84 +-
EmulatorPkg/Include/Library/PpiListLib.h | 42 +-
EmulatorPkg/Include/Library/SmbiosLib.h | 404 +--
EmulatorPkg/Include/Protocol/EmuBlockIo.h | 2 +-
EmulatorPkg/Include/Protocol/EmuFileSystem.h | 280 +-
EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h | 268 +-
.../Library/DevicePathTextLib/DevicePathTextLib.c | 2 +-
.../DevicePathTextLib/DevicePathTextLib.inf | 2 +-
EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c | 2 +-
| 96 +-
.../DxeEmuStdErrSerialPortLib.c | 2 +-
EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c | 2 +-
.../PeiServicesTablePointer.c | 12 +-
| 98 +-
.../PeiServicesTablePointer.c | 12 +-
.../PeiServicesTablePointer.c | 12 +-
EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf | 2 +-
EmulatorPkg/Library/SecPeiServicesLib/FwVol.c | 562 ++--
EmulatorPkg/Library/SecPpiListLib/PpiListLib.c | 34 +-
EmulatorPkg/Library/SmbiosLib/SmbiosLib.c | 704 ++---
EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf | 94 +-
.../MiscSubClassPlatformDxe/MiscSubClassDriver.h | 4 +-
.../MiscSubclassDriverEntryPoint.c | 4 +-
EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c | 18 +-
.../PlatformSmbiosDxe/PlatformSmbiosDxe.inf | 4 +-
EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c | 26 +-
EmulatorPkg/Sec/Ia32/SwitchRam.asm | 26 +-
EmulatorPkg/Sec/Sec.c | 298 +-
EmulatorPkg/Sec/Sec.h | 102 +-
EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c | 78 +-
EmulatorPkg/Unix/Host/BlockIo.c | 2 +-
EmulatorPkg/Unix/Host/EmuThunk.c | 880 +++---
EmulatorPkg/Unix/Host/Host.c | 14 +-
EmulatorPkg/Unix/Host/Host.h | 2 +-
EmulatorPkg/Unix/Host/Ia32/Gasket.S | 2984 +++++++++---------
EmulatorPkg/Unix/Host/Ia32/SwitchStack.c | 148 +-
EmulatorPkg/Unix/Host/MemoryAllocationLib.c | 290 +-
EmulatorPkg/Unix/Host/PosixFileSystem.c | 3112 +++++++++----------
EmulatorPkg/Unix/Host/Pthreads.c | 470 +--
EmulatorPkg/Unix/Host/X11GraphicsWindow.c | 2056 ++++++------
EmulatorPkg/Unix/Host/X64/Gasket.S | 3262 ++++++++++----------
EmulatorPkg/Unix/lldbefi.py | 1080 +++----
EmulatorPkg/Win/Host/WinBlockIo.c | 2 +-
EmulatorPkg/Win/Host/WinHost.h | 2 +-
51 files changed, 10353 insertions(+), 10353 deletions(-)
diff --git a/EmulatorPkg/CpuRuntimeDxe/Cpu.c b/EmulatorPkg/CpuRuntimeDxe/Cpu.c
index 47fb7f07e8..83e876509a 100644
--- a/EmulatorPkg/CpuRuntimeDxe/Cpu.c
+++ b/EmulatorPkg/CpuRuntimeDxe/Cpu.c
@@ -63,7 +63,7 @@ SMBIOS_TABLE_TYPE4 mCpuSmbiosType4 = {
0, // ProcessorXModel: 4;
0, // ProcessorXFamily: 8;
0, // ProcessorReserved2: 4;
- },
+ },
{ // PROCESSOR_FEATURE_FLAGS
0, // ProcessorFpu :1;
0, // ProcessorVme :1;
@@ -100,13 +100,13 @@ SMBIOS_TABLE_TYPE4 mCpuSmbiosType4 = {
},
3, // ProcessorVersion String;
{ // Voltage;
- 1, // ProcessorVoltageCapability5V :1;
- 1, // ProcessorVoltageCapability3_3V :1;
- 1, // ProcessorVoltageCapability2_9V :1;
+ 1, // ProcessorVoltageCapability5V :1;
+ 1, // ProcessorVoltageCapability3_3V :1;
+ 1, // ProcessorVoltageCapability2_9V :1;
0, // ProcessorVoltageCapabilityReserved :1; ///< Bit 3, must be zero.
0, // ProcessorVoltageReserved :3; ///< Bits 4-6, must be zero.
0 // ProcessorVoltageIndicateLegacy :1;
- },
+ },
0, // ExternalClock;
0, // MaxSpeed;
0, // CurrentSpeed;
@@ -151,26 +151,26 @@ CHAR8 *mCpuSmbiosType4Strings[] = {
"Not Found",
NULL
};
-
+
...
LogSmbiosData (
- (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
+ (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
gSmbiosType12Strings
);
@param Template Fixed SMBIOS structure, required.
- @param StringArray Array of strings to convert to an SMBIOS string pack.
+ @param StringArray Array of strings to convert to an SMBIOS string pack.
NULL is OK.
**/
EFI_STATUS
LogSmbiosData (
IN EFI_SMBIOS_TABLE_HEADER *Template,
- IN CHAR8 **StringPack
+ IN CHAR8 **StringPack
)
{
EFI_STATUS Status;
- EFI_SMBIOS_PROTOCOL *Smbios;
+ EFI_SMBIOS_PROTOCOL *Smbios;
EFI_SMBIOS_HANDLE SmbiosHandle;
EFI_SMBIOS_TABLE_HEADER *Record;
UINTN Index;
@@ -219,7 +219,7 @@ LogSmbiosData (
Str += StringSize;
}
*Str = 0;
-
+
SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
Status = Smbios->Add (
Smbios,
@@ -228,7 +228,7 @@ LogSmbiosData (
Record
);
ASSERT_EFI_ERROR (Status);
-
+
FreePool (Record);
return Status;
}
diff --git a/EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c b/EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c
index e77de2c7bc..b9ac6ce080 100644
--- a/EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c
+++ b/EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c
@@ -61,7 +61,7 @@ EmuBlockIo2Reset (
@param[in] MediaId Id of the media, changes every time the media is
replaced.
@param[in] Lba The starting Logical Block Address to read from.
- @param[in, out] Token A pointer to the token associated with the transaction.
+ @param[in, out] Token A pointer to the token associated with the transaction.
@param[in] BufferSize Size of Buffer, must be a multiple of device block size.
@param[out] Buffer A pointer to the destination buffer for the data. The
caller is responsible for either having implicit or
diff --git a/EmulatorPkg/EmuGopDxe/Gop.h b/EmulatorPkg/EmuGopDxe/Gop.h
index 6f7b082618..3b533013ce 100644
--- a/EmulatorPkg/EmuGopDxe/Gop.h
+++ b/EmulatorPkg/EmuGopDxe/Gop.h
@@ -1,195 +1,195 @@
-/*++ @file
-
-Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
-Portions copyright (c) 2010,Apple Inc. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef __UGA_H_
-#define __UGA_H_
-
-#include <PiDxe.h>
-
-#include <Protocol/GraphicsOutput.h>
-#include <Protocol/SimpleTextIn.h>
-#include <Protocol/SimpleTextInEx.h>
-#include <Protocol/SimplePointer.h>
-#include <Protocol/EmuIoThunk.h>
-#include <Protocol/EmuGraphicsWindow.h>
-
-#include <Guid/EventGroup.h>
-
-#include <Library/DebugLib.h>
-#include <Library/BaseLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/UefiLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/KeyMapLib.h>
-
-
-#define MAX_Q 256
-
-typedef struct {
- UINTN Front;
- UINTN Rear;
- UINTN Count;
- EFI_INPUT_KEY Q[MAX_Q];
-} GOP_QUEUE_FIXED;
-
-#define EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE SIGNATURE_32 ('U', 'g', 'S', 'n')
-typedef struct _EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY {
- UINTN Signature;
- EFI_HANDLE NotifyHandle;
- EFI_KEY_DATA KeyData;
- EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn;
- EFI_EVENT Event;
- LIST_ENTRY NotifyEntry;
-} EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY;
-
-#define GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER 0xffff
-
-typedef struct {
- UINT32 HorizontalResolution;
- UINT32 VerticalResolution;
- UINT32 ColorDepth;
- UINT32 RefreshRate;
-} GOP_MODE_DATA;
-
-
-
-extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
-extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
-
-#define EMU_UGA_CLASS_NAME L"EmuGopWindow"
-
-#define GOP_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('G', 'o', 'p', 'N')
-typedef struct {
- UINT64 Signature;
-
- EFI_HANDLE Handle;
- EFI_GRAPHICS_OUTPUT_PROTOCOL GraphicsOutput;
- EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleTextIn;
- EFI_SIMPLE_POINTER_PROTOCOL SimplePointer;
-
- EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
- EMU_GRAPHICS_WINDOW_PROTOCOL *EmuGraphicsWindow;
-
- EFI_UNICODE_STRING_TABLE *ControllerNameTable;
-
- EFI_SIMPLE_POINTER_MODE PointerMode;
- //
- // GOP Private Data for QueryMode ()
- //
- GOP_MODE_DATA *ModeData;
-
-
- //
- // UGA Private Data knowing when to start hardware
- //
- BOOLEAN HardwareNeedsStarting;
-
- CHAR16 *WindowName;
-
- GOP_QUEUE_FIXED Queue;
-
- EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleTextInEx;
- EFI_KEY_STATE KeyState;
- LIST_ENTRY NotifyList;
-} GOP_PRIVATE_DATA;
-
-
-#define GOP_PRIVATE_DATA_FROM_THIS(a) \
- CR(a, GOP_PRIVATE_DATA, GraphicsOutput, GOP_PRIVATE_DATA_SIGNATURE)
-
-#define GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS(a) \
- CR(a, GOP_PRIVATE_DATA, SimpleTextIn, GOP_PRIVATE_DATA_SIGNATURE)
-
-#define GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS(a) \
- CR(a, GOP_PRIVATE_DATA, SimpleTextInEx, GOP_PRIVATE_DATA_SIGNATURE)
-
-#define GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS(a) \
- CR(a, GOP_PRIVATE_DATA, SimplePointer, GOP_PRIVATE_DATA_SIGNATURE)
-
-
-//
-// Global Protocol Variables
-//
-extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
-extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
-extern EFI_COMPONENT_NAME2_PROTOCOL gEmuGopComponentName2;
-
-//
-// Gop Hardware abstraction internal worker functions
-//
-EFI_STATUS
-EmuGopSupported (
- IN EMU_IO_THUNK_PROTOCOL *EmuIoThunk
- );
-
-EFI_STATUS
-EmuGopConstructor (
- IN GOP_PRIVATE_DATA *Private
- );
-
-EFI_STATUS
-EmuGopDestructor (
- IN GOP_PRIVATE_DATA *Private
- );
-
-
-EFI_STATUS
-GopPrivateAddQ (
- IN GOP_PRIVATE_DATA *Private,
- IN EFI_INPUT_KEY Key
- );
-
-EFI_STATUS
-EmuGopInitializeSimpleTextInForWindow (
- IN GOP_PRIVATE_DATA *Private
- );
-
-EFI_STATUS
-EmuGopInitializeSimplePointerForWindow (
- IN GOP_PRIVATE_DATA *Private
- );
-
-EFI_STATUS
-EmuGopStartWindow (
- IN GOP_PRIVATE_DATA *Private,
- IN UINT32 HorizontalResolution,
- IN UINT32 VerticalResolution,
- IN UINT32 ColorDepth,
- IN UINT32 RefreshRate
- );
-
-VOID
-EFIAPI
-ShutdownGopEvent (
- IN EFI_EVENT Event,
- IN VOID *Context
- );
-
-VOID
-EFIAPI
-GopPrivateMakeCallbackFunction (
- IN VOID *Context,
- IN EFI_KEY_DATA *KeyData
- );
-
-VOID
-EFIAPI
-GopPrivateBreakCallbackFunction (
- IN VOID *Context,
- IN EFI_KEY_DATA *KeyData
- );
-
-#endif
+/*++ @file
+
+Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
+Portions copyright (c) 2010,Apple Inc. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __UGA_H_
+#define __UGA_H_
+
+#include <PiDxe.h>
+
+#include <Protocol/GraphicsOutput.h>
+#include <Protocol/SimpleTextIn.h>
+#include <Protocol/SimpleTextInEx.h>
+#include <Protocol/SimplePointer.h>
+#include <Protocol/EmuIoThunk.h>
+#include <Protocol/EmuGraphicsWindow.h>
+
+#include <Guid/EventGroup.h>
+
+#include <Library/DebugLib.h>
+#include <Library/BaseLib.h>
+#include <Library/UefiDriverEntryPoint.h>
+#include <Library/UefiLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/KeyMapLib.h>
+
+
+#define MAX_Q 256
+
+typedef struct {
+ UINTN Front;
+ UINTN Rear;
+ UINTN Count;
+ EFI_INPUT_KEY Q[MAX_Q];
+} GOP_QUEUE_FIXED;
+
+#define EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE SIGNATURE_32 ('U', 'g', 'S', 'n')
+typedef struct _EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY {
+ UINTN Signature;
+ EFI_HANDLE NotifyHandle;
+ EFI_KEY_DATA KeyData;
+ EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn;
+ EFI_EVENT Event;
+ LIST_ENTRY NotifyEntry;
+} EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY;
+
+#define GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER 0xffff
+
+typedef struct {
+ UINT32 HorizontalResolution;
+ UINT32 VerticalResolution;
+ UINT32 ColorDepth;
+ UINT32 RefreshRate;
+} GOP_MODE_DATA;
+
+
+
+extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
+extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
+
+#define EMU_UGA_CLASS_NAME L"EmuGopWindow"
+
+#define GOP_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('G', 'o', 'p', 'N')
+typedef struct {
+ UINT64 Signature;
+
+ EFI_HANDLE Handle;
+ EFI_GRAPHICS_OUTPUT_PROTOCOL GraphicsOutput;
+ EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleTextIn;
+ EFI_SIMPLE_POINTER_PROTOCOL SimplePointer;
+
+ EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
+ EMU_GRAPHICS_WINDOW_PROTOCOL *EmuGraphicsWindow;
+
+ EFI_UNICODE_STRING_TABLE *ControllerNameTable;
+
+ EFI_SIMPLE_POINTER_MODE PointerMode;
+ //
+ // GOP Private Data for QueryMode ()
+ //
+ GOP_MODE_DATA *ModeData;
+
+
+ //
+ // UGA Private Data knowing when to start hardware
+ //
+ BOOLEAN HardwareNeedsStarting;
+
+ CHAR16 *WindowName;
+
+ GOP_QUEUE_FIXED Queue;
+
+ EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleTextInEx;
+ EFI_KEY_STATE KeyState;
+ LIST_ENTRY NotifyList;
+} GOP_PRIVATE_DATA;
+
+
+#define GOP_PRIVATE_DATA_FROM_THIS(a) \
+ CR(a, GOP_PRIVATE_DATA, GraphicsOutput, GOP_PRIVATE_DATA_SIGNATURE)
+
+#define GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS(a) \
+ CR(a, GOP_PRIVATE_DATA, SimpleTextIn, GOP_PRIVATE_DATA_SIGNATURE)
+
+#define GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS(a) \
+ CR(a, GOP_PRIVATE_DATA, SimpleTextInEx, GOP_PRIVATE_DATA_SIGNATURE)
+
+#define GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS(a) \
+ CR(a, GOP_PRIVATE_DATA, SimplePointer, GOP_PRIVATE_DATA_SIGNATURE)
+
+
+//
+// Global Protocol Variables
+//
+extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
+extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
+extern EFI_COMPONENT_NAME2_PROTOCOL gEmuGopComponentName2;
+
+//
+// Gop Hardware abstraction internal worker functions
+//
+EFI_STATUS
+EmuGopSupported (
+ IN EMU_IO_THUNK_PROTOCOL *EmuIoThunk
+ );
+
+EFI_STATUS
+EmuGopConstructor (
+ IN GOP_PRIVATE_DATA *Private
+ );
+
+EFI_STATUS
+EmuGopDestructor (
+ IN GOP_PRIVATE_DATA *Private
+ );
+
+
+EFI_STATUS
+GopPrivateAddQ (
+ IN GOP_PRIVATE_DATA *Private,
+ IN EFI_INPUT_KEY Key
+ );
+
+EFI_STATUS
+EmuGopInitializeSimpleTextInForWindow (
+ IN GOP_PRIVATE_DATA *Private
+ );
+
+EFI_STATUS
+EmuGopInitializeSimplePointerForWindow (
+ IN GOP_PRIVATE_DATA *Private
+ );
+
+EFI_STATUS
+EmuGopStartWindow (
+ IN GOP_PRIVATE_DATA *Private,
+ IN UINT32 HorizontalResolution,
+ IN UINT32 VerticalResolution,
+ IN UINT32 ColorDepth,
+ IN UINT32 RefreshRate
+ );
+
+VOID
+EFIAPI
+ShutdownGopEvent (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ );
+
+VOID
+EFIAPI
+GopPrivateMakeCallbackFunction (
+ IN VOID *Context,
+ IN EFI_KEY_DATA *KeyData
+ );
+
+VOID
+EFIAPI
+GopPrivateBreakCallbackFunction (
+ IN VOID *Context,
+ IN EFI_KEY_DATA *KeyData
+ );
+
+#endif
diff --git a/EmulatorPkg/EmuGopDxe/GopInput.c b/EmulatorPkg/EmuGopDxe/GopInput.c
index cf37a7bd70..1d40b1d7d6 100644
--- a/EmulatorPkg/EmuGopDxe/GopInput.c
+++ b/EmulatorPkg/EmuGopDxe/GopInput.c
@@ -1,900 +1,900 @@
-/*++ @file
-
-Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
-Portions copyright (c) 2010 0 2011,Apple Inc. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-
-**/
-
-#include "Gop.h"
-
-
-BOOLEAN
-GopPrivateIsKeyRegistered (
- IN EFI_KEY_DATA *RegsiteredData,
- IN EFI_KEY_DATA *InputData
- )
-/*++
-
-Routine Description:
-
-Arguments:
-
- RegsiteredData - A pointer to a buffer that is filled in with the keystroke
- state data for the key that was registered.
- InputData - A pointer to a buffer that is filled in with the keystroke
- state data for the key that was pressed.
-
-Returns:
- TRUE - Key be pressed matches a registered key.
- FLASE - Match failed.
-
-**/
-{
- ASSERT (RegsiteredData != NULL && InputData != NULL);
-
- if ((RegsiteredData->Key.ScanCode != InputData->Key.ScanCode) ||
- (RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) {
- return FALSE;
- }
-
- //
- // Assume KeyShiftState/KeyToggleState = 0 in Registered key data means these state could be ignored.
- //
- if (RegsiteredData->KeyState.KeyShiftState != 0 &&
- RegsiteredData->KeyState.KeyShiftState != InputData->KeyState.KeyShiftState) {
- return FALSE;
- }
- if (RegsiteredData->KeyState.KeyToggleState != 0 &&
- RegsiteredData->KeyState.KeyToggleState != InputData->KeyState.KeyToggleState) {
- return FALSE;
- }
-
- return TRUE;
-
-}
-
-
-VOID
-EFIAPI
-GopPrivateMakeCallbackFunction (
- IN VOID *Context,
- IN EFI_KEY_DATA *KeyData
- )
-{
- LIST_ENTRY *Link;
- EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
- GOP_PRIVATE_DATA *Private = (GOP_PRIVATE_DATA *)Context;
-
- KeyMapMake (KeyData);
-
- for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {
- CurrentNotify = CR (
- Link,
- EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
- NotifyEntry,
- EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
- );
- if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
- // We could be called at a high TPL so signal an event to call the registered function
- // at a lower TPL.
- gBS->SignalEvent (CurrentNotify->Event);
- }
- }
-}
-
-
-VOID
-EFIAPI
-GopPrivateBreakCallbackFunction (
- IN VOID *Context,
- IN EFI_KEY_DATA *KeyData
- )
-{
- KeyMapBreak (KeyData);
-}
-
-
-
-//
-// Simple Text In implementation.
-//
-
-/**
- Reset the input device and optionally run diagnostics
-
- @param This Protocol instance pointer.
- @param ExtendedVerification Driver may perform diagnostics on reset.
-
- @retval EFI_SUCCESS The device was reset.
- @retval EFI_DEVICE_ERROR The device is not functioning properly and could not be reset.
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopSimpleTextInReset (
- IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
- IN BOOLEAN ExtendedVerification
- )
-{
- GOP_PRIVATE_DATA *Private;
- EFI_KEY_DATA KeyData;
- EFI_TPL OldTpl;
-
- Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
- if (Private->EmuGraphicsWindow == NULL) {
- return EFI_SUCCESS;
- }
-
- //
- // Enter critical section
- //
- OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
-
- //
- // A reset is draining the Queue
- //
- while (Private->EmuGraphicsWindow->GetKey (Private->EmuGraphicsWindow, &KeyData) == EFI_SUCCESS)
- ;
-
- //
- // Leave critical section and return
- //
- gBS->RestoreTPL (OldTpl);
- return EFI_SUCCESS;
-}
-
-
-/**
- Reads the next keystroke from the input device. The WaitForKey Event can
- be used to test for existence of a keystroke via WaitForEvent () call.
-
- @param This Protocol instance pointer.
- @param Key A pointer to a buffer that is filled in with the keystroke
- information for the key that was pressed.
-
- @retval EFI_SUCCESS The keystroke information was returned.
- @retval EFI_NOT_READY There was no keystroke data available.
- @retval EFI_DEVICE_ERROR The keystroke information was not returned due to
- hardware errors.
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopSimpleTextInReadKeyStroke (
- IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
- OUT EFI_INPUT_KEY *Key
- )
-{
- GOP_PRIVATE_DATA *Private;
- EFI_STATUS Status;
- EFI_TPL OldTpl;
- EFI_KEY_DATA KeyData;
-
- Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
- if (Private->EmuGraphicsWindow == NULL) {
- return EFI_NOT_READY;
- }
-
- //
- // Enter critical section
- //
- OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
-
- Status = Private->EmuGraphicsWindow->GetKey (Private->EmuGraphicsWindow, &KeyData);
- if (!EFI_ERROR (Status)) {
- if ((KeyData.Key.ScanCode == 0) && (KeyData.Key.UnicodeChar == 0)) {
- // Modifier key was pressed
- Status = EFI_NOT_READY;
- } else {
- CopyMem (Key, &KeyData.Key, sizeof (EFI_INPUT_KEY));
- }
- }
-
- //
- // Leave critical section and return
- //
- gBS->RestoreTPL (OldTpl);
-
- return Status;
-}
-
-
-
-/**
- SimpleTextIn and SimpleTextInEx Notify Wait Event
-
- @param Event Event whose notification function is being invoked.
- @param Context Pointer to GOP_PRIVATE_DATA.
-
-**/
-VOID
-EFIAPI
-EmuGopSimpleTextInWaitForKey (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- GOP_PRIVATE_DATA *Private;
- EFI_STATUS Status;
- EFI_TPL OldTpl;
-
- Private = (GOP_PRIVATE_DATA *) Context;
- if (Private->EmuGraphicsWindow == NULL) {
- return;
- }
-
- //
- // Enter critical section
- //
- OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
-
- Status = Private->EmuGraphicsWindow->CheckKey (Private->EmuGraphicsWindow);
- if (!EFI_ERROR (Status)) {
- //
- // If a there is a key in the queue signal our event.
- //
- gBS->SignalEvent (Event);
- }
- //
- // Leave critical section and return
- //
- gBS->RestoreTPL (OldTpl);
-}
-
-
-//
-// Simple Text Input Ex protocol functions
-//
-
-
-/**
- The Reset() function resets the input device hardware. As part
- of initialization process, the firmware/device will make a quick
- but reasonable attempt to verify that the device is functioning.
- If the ExtendedVerification flag is TRUE the firmware may take
- an extended amount of time to verify the device is operating on
- reset. Otherwise the reset operation is to occur as quickly as
- possible. The hardware verification process is not defined by
- this specification and is left up to the platform firmware or
- driver to implement.
-
- @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
-
- @param ExtendedVerification Indicates that the driver may
- perform a more exhaustive
- verification operation of the
- device during reset.
-
-
- @retval EFI_SUCCESS The device was reset.
-
- @retval EFI_DEVICE_ERROR The device is not functioning
- correctly and could not be reset.
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopSimpleTextInExResetEx (
- IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
- IN BOOLEAN ExtendedVerification
- )
-/*++
-
- Routine Description:
- Reset the input device and optionaly run diagnostics
-
- Arguments:
- This - Protocol instance pointer.
- ExtendedVerification - Driver may perform diagnostics on reset.
-
- Returns:
- EFI_SUCCESS - The device was reset.
-
-**/
-{
- return EFI_SUCCESS;
-}
-
-
-
-/**
- The function reads the next keystroke from the input device. If
- there is no pending keystroke the function returns
- EFI_NOT_READY. If there is a pending keystroke, then
- KeyData.Key.ScanCode is the EFI scan code defined in Error!
- Reference source not found. The KeyData.Key.UnicodeChar is the
- actual printable character or is zero if the key does not
- represent a printable character (control key, function key,
- etc.). The KeyData.KeyState is shift state for the character
- reflected in KeyData.Key.UnicodeChar or KeyData.Key.ScanCode .
- When interpreting the data from this function, it should be
- noted that if a class of printable characters that are
- normally adjusted by shift modifiers (e.g. Shift Key + "f"
- key) would be presented solely as a KeyData.Key.UnicodeChar
- without the associated shift state. So in the previous example
- of a Shift Key + "f" key being pressed, the only pertinent
- data returned would be KeyData.Key.UnicodeChar with the value
- of "F". This of course would not typically be the case for
- non-printable characters such as the pressing of the Right
- Shift Key + F10 key since the corresponding returned data
- would be reflected both in the KeyData.KeyState.KeyShiftState
- and KeyData.Key.ScanCode values. UEFI drivers which implement
- the EFI_SIMPLE_TEXT_INPUT_EX protocol are required to return
- KeyData.Key and KeyData.KeyState values. These drivers must
- always return the most current state of
- KeyData.KeyState.KeyShiftState and
- KeyData.KeyState.KeyToggleState. It should also be noted that
- certain input devices may not be able to produce shift or toggle
- state information, and in those cases the high order bit in the
- respective Toggle and Shift state fields should not be active.
-
-
- @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
-
- @param KeyData A pointer to a buffer that is filled in with
- the keystroke state data for the key that was
- pressed.
-
-
- @retval EFI_SUCCESS The keystroke information was
- returned.
-
- @retval EFI_NOT_READY There was no keystroke data available.
- EFI_DEVICE_ERROR The keystroke
- information was not returned due to
- hardware errors.
-
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopSimpleTextInExReadKeyStrokeEx (
- IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
- OUT EFI_KEY_DATA *KeyData
- )
-/*++
-
- Routine Description:
- Reads the next keystroke from the input device. The WaitForKey Event can
- be used to test for existance of a keystroke via WaitForEvent () call.
-
- Arguments:
- This - Protocol instance pointer.
- KeyData - A pointer to a buffer that is filled in with the keystroke
- state data for the key that was pressed.
-
- Returns:
- EFI_SUCCESS - The keystroke information was returned.
- EFI_NOT_READY - There was no keystroke data availiable.
- EFI_DEVICE_ERROR - The keystroke information was not returned due to
- hardware errors.
- EFI_INVALID_PARAMETER - KeyData is NULL.
-
-**/
-{
- EFI_STATUS Status;
- GOP_PRIVATE_DATA *Private;
- EFI_TPL OldTpl;
-
-
- if (KeyData == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
- if (Private->EmuGraphicsWindow == NULL) {
- return EFI_NOT_READY;
- }
-
- //
- // Enter critical section
- //
- OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
-
- Status = Private->EmuGraphicsWindow->GetKey(Private->EmuGraphicsWindow, KeyData);
-
- //
- // Leave critical section and return
- //
- gBS->RestoreTPL (OldTpl);
-
- return Status;
-}
-
-
-
-/**
- The SetState() function allows the input device hardware to
- have state settings adjusted.
-
- @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
-
- @param KeyToggleState Pointer to the EFI_KEY_TOGGLE_STATE to
- set the state for the input device.
-
-
- @retval EFI_SUCCESS The device state was set appropriately.
-
- @retval EFI_DEVICE_ERROR The device is not functioning
- correctly and could not have the
- setting adjusted.
-
- @retval EFI_UNSUPPORTED The device does not support the
- ability to have its state set.
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopSimpleTextInExSetState (
- IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
- IN EFI_KEY_TOGGLE_STATE *KeyToggleState
- )
-{
- GOP_PRIVATE_DATA *Private;
- EFI_STATUS Status;
- EFI_TPL OldTpl;
-
- Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
- if (Private->EmuGraphicsWindow == NULL) {
- return EFI_NOT_READY;
- }
-
- //
- // Enter critical section
- //
- OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
-
- Status = Private->EmuGraphicsWindow->KeySetState (Private->EmuGraphicsWindow, KeyToggleState);
- //
- // Leave critical section and return
- //
- gBS->RestoreTPL (OldTpl);
-
- return Status;
-}
-
-
-/**
- SimpleTextIn and SimpleTextInEx Notify Wait Event
-
- @param Event Event whose notification function is being invoked.
- @param Context Pointer to GOP_PRIVATE_DATA.
-
-**/
-VOID
-EFIAPI
-EmuGopRegisterKeyCallback (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *ExNotify = (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *)Context;
-
- ExNotify->KeyNotificationFn (&ExNotify->KeyData);
-}
-
-
-
-/**
- The RegisterKeystrokeNotify() function registers a function
- which will be called when a specified keystroke will occur.
-
- @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
-
- @param KeyData A pointer to a buffer that is filled in with
- the keystroke information for the key that was
- pressed.
-
- @param KeyNotificationFunction Points to the function to be
- called when the key sequence
- is typed specified by KeyData.
-
-
- @param NotifyHandle Points to the unique handle assigned to
- the registered notification.
-
- @retval EFI_SUCCESS The device state was set
- appropriately.
-
- @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary
- data structures.
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopSimpleTextInExRegisterKeyNotify (
- IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
- IN EFI_KEY_DATA *KeyData,
- IN EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction,
- OUT EFI_HANDLE *NotifyHandle
- )
-{
- EFI_STATUS Status;
- GOP_PRIVATE_DATA *Private;
- EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
- LIST_ENTRY *Link;
- EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *NewNotify;
-
- if (KeyData == NULL || KeyNotificationFunction == NULL || NotifyHandle == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
-
- //
- // Return EFI_SUCCESS if the (KeyData, NotificationFunction) is already registered.
- //
- for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {
- CurrentNotify = CR (
- Link,
- EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
- NotifyEntry,
- EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
- );
- if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
- if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) {
- *NotifyHandle = CurrentNotify->NotifyHandle;
- return EFI_SUCCESS;
- }
- }
- }
-
- //
- // Allocate resource to save the notification function
- //
- NewNotify = (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) AllocateZeroPool (sizeof (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY));
- if (NewNotify == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- NewNotify->Signature = EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE;
- NewNotify->KeyNotificationFn = KeyNotificationFunction;
- NewNotify->NotifyHandle = (EFI_HANDLE) NewNotify;
- CopyMem (&NewNotify->KeyData, KeyData, sizeof (KeyData));
- InsertTailList (&Private->NotifyList, &NewNotify->NotifyEntry);
-
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL,
- TPL_NOTIFY,
- EmuGopRegisterKeyCallback,
- NewNotify,
- &NewNotify->Event
- );
- ASSERT_EFI_ERROR (Status);
-
-
- *NotifyHandle = NewNotify->NotifyHandle;
-
- return EFI_SUCCESS;
-
-}
-
-
-/**
- The UnregisterKeystrokeNotify() function removes the
- notification which was previously registered.
-
- @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
-
- @param NotificationHandle The handle of the notification
- function being unregistered.
-
- @retval EFI_SUCCESS The device state was set appropriately.
-
- @retval EFI_INVALID_PARAMETER The NotificationHandle is
- invalid.
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopSimpleTextInExUnregisterKeyNotify (
- IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
- IN EFI_HANDLE NotificationHandle
- )
-/*++
-
- Routine Description:
- Remove a registered notification function from a particular keystroke.
-
- Arguments:
- This - Protocol instance pointer.
- NotificationHandle - The handle of the notification function being unregistered.
-
- Returns:
- EFI_SUCCESS - The notification function was unregistered successfully.
- EFI_INVALID_PARAMETER - The NotificationHandle is invalid.
-
-**/
-{
- GOP_PRIVATE_DATA *Private;
- LIST_ENTRY *Link;
- EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
-
- if (NotificationHandle == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (((EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) NotificationHandle)->Signature != EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE) {
- return EFI_INVALID_PARAMETER;
- }
-
- Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
-
- for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {
- CurrentNotify = CR (
- Link,
- EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
- NotifyEntry,
- EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
- );
- if (CurrentNotify->NotifyHandle == NotificationHandle) {
- //
- // Remove the notification function from NotifyList and free resources
- //
- RemoveEntryList (&CurrentNotify->NotifyEntry);
-
- gBS->CloseEvent (CurrentNotify->Event);
-
- gBS->FreePool (CurrentNotify);
- return EFI_SUCCESS;
- }
- }
-
- //
- // Can not find the specified Notification Handle
- //
- return EFI_INVALID_PARAMETER;
-}
-
-
-
-/**
- Initialize SimplelTextIn and SimpleTextInEx protocols in the Private
- context structure.
-
- @param Private Context structure to fill in.
-
- @return EFI_SUCCESS Initialization was a success
-
-**/
-EFI_STATUS
-EmuGopInitializeSimpleTextInForWindow (
- IN GOP_PRIVATE_DATA *Private
- )
-{
- EFI_STATUS Status;
-
- //
- // Initialize Simple Text In protoocol
- //
- Private->SimpleTextIn.Reset = EmuGopSimpleTextInReset;
- Private->SimpleTextIn.ReadKeyStroke = EmuGopSimpleTextInReadKeyStroke;
-
- Status = gBS->CreateEvent (
- EVT_NOTIFY_WAIT,
- TPL_NOTIFY,
- EmuGopSimpleTextInWaitForKey,
- Private,
- &Private->SimpleTextIn.WaitForKey
- );
- ASSERT_EFI_ERROR (Status);
-
-
- //
- // Initialize Simple Text In Ex
- //
-
- Private->SimpleTextInEx.Reset = EmuGopSimpleTextInExResetEx;
- Private->SimpleTextInEx.ReadKeyStrokeEx = EmuGopSimpleTextInExReadKeyStrokeEx;
- Private->SimpleTextInEx.SetState = EmuGopSimpleTextInExSetState;
- Private->SimpleTextInEx.RegisterKeyNotify = EmuGopSimpleTextInExRegisterKeyNotify;
- Private->SimpleTextInEx.UnregisterKeyNotify = EmuGopSimpleTextInExUnregisterKeyNotify;
-
- Private->SimpleTextInEx.Reset (&Private->SimpleTextInEx, FALSE);
-
- InitializeListHead (&Private->NotifyList);
-
- Status = gBS->CreateEvent (
- EVT_NOTIFY_WAIT,
- TPL_NOTIFY,
- EmuGopSimpleTextInWaitForKey,
- Private,
- &Private->SimpleTextInEx.WaitForKeyEx
- );
- ASSERT_EFI_ERROR (Status);
-
-
- return Status;
-}
-
-
-
-
-
-
-
-//
-// Simple Pointer implementation.
-//
-
-
-/**
- Resets the pointer device hardware.
-
- @param This A pointer to the EFI_SIMPLE_POINTER_PROTOCOL
- instance.
- @param ExtendedVerification Indicates that the driver may perform a more exhaustive
- verification operation of the device during reset.
-
- @retval EFI_SUCCESS The device was reset.
- @retval EFI_DEVICE_ERROR The device is not functioning correctly and could not be reset.
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopSimplePointerReset (
- IN EFI_SIMPLE_POINTER_PROTOCOL *This,
- IN BOOLEAN ExtendedVerification
- )
-{
- GOP_PRIVATE_DATA *Private;
- EFI_SIMPLE_POINTER_STATE State;
- EFI_TPL OldTpl;
-
- Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);
- if (Private->EmuGraphicsWindow == NULL) {
- return EFI_SUCCESS;
- }
-
- //
- // Enter critical section
- //
- OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
-
- //
- // A reset is draining the Queue
- //
- while (Private->EmuGraphicsWindow->GetPointerState (Private->EmuGraphicsWindow, &State) == EFI_SUCCESS)
- ;
-
- //
- // Leave critical section and return
- //
- gBS->RestoreTPL (OldTpl);
- return EFI_SUCCESS;
-}
-
-
-/**
- Retrieves the current state of a pointer device.
-
- @param This A pointer to the EFI_SIMPLE_POINTER_PROTOCOL
- instance.
- @param State A pointer to the state information on the pointer device.
-
- @retval EFI_SUCCESS The state of the pointer device was returned in State.
- @retval EFI_NOT_READY The state of the pointer device has not changed since the last call to
- GetState().
- @retval EFI_DEVICE_ERROR A device error occurred while attempting to retrieve the pointer device's
- current state.
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopSimplePointerGetState (
- IN EFI_SIMPLE_POINTER_PROTOCOL *This,
- IN OUT EFI_SIMPLE_POINTER_STATE *State
- )
-{
- GOP_PRIVATE_DATA *Private;
- EFI_STATUS Status;
- EFI_TPL OldTpl;
-
- Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);
- if (Private->EmuGraphicsWindow == NULL) {
- return EFI_NOT_READY;
- }
-
- //
- // Enter critical section
- //
- OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
-
- Status = Private->EmuGraphicsWindow->GetPointerState (Private->EmuGraphicsWindow, State);
- //
- // Leave critical section and return
- //
- gBS->RestoreTPL (OldTpl);
-
- return Status;
-}
-
-
-/**
- SimplePointer Notify Wait Event
-
- @param Event Event whose notification function is being invoked.
- @param Context Pointer to GOP_PRIVATE_DATA.
-
-**/
-VOID
-EFIAPI
-EmuGopSimplePointerWaitForInput (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-{
- GOP_PRIVATE_DATA *Private;
- EFI_STATUS Status;
- EFI_TPL OldTpl;
-
- Private = (GOP_PRIVATE_DATA *) Context;
- if (Private->EmuGraphicsWindow == NULL) {
- return;
- }
-
- //
- // Enter critical section
- //
- OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
-
- Status = Private->EmuGraphicsWindow->CheckPointer (Private->EmuGraphicsWindow);
- if (!EFI_ERROR (Status)) {
- //
- // If the pointer state has changed, signal our event.
- //
- gBS->SignalEvent (Event);
- }
- //
- // Leave critical section and return
- //
- gBS->RestoreTPL (OldTpl);
-}
-
-
-/**
- SimplePointer constructor
-
- @param Private Context structure to fill in.
-
- @retval EFI_SUCCESS Constructor had success
-
-**/
-EFI_STATUS
-EmuGopInitializeSimplePointerForWindow (
- IN GOP_PRIVATE_DATA *Private
- )
-{
- EFI_STATUS Status;
-
- //
- // Initialize Simple Pointer protoocol
- //
- Private->PointerMode.ResolutionX = 1;
- Private->PointerMode.ResolutionY = 1;
- Private->PointerMode.ResolutionZ = 1;
- Private->PointerMode.LeftButton = TRUE;
- Private->PointerMode.RightButton = TRUE;
-
- Private->SimplePointer.Reset = EmuGopSimplePointerReset;
- Private->SimplePointer.GetState = EmuGopSimplePointerGetState;
- Private->SimplePointer.Mode = &Private->PointerMode;
-
- Status = gBS->CreateEvent (
- EVT_NOTIFY_WAIT,
- TPL_NOTIFY,
- EmuGopSimplePointerWaitForInput,
- Private,
- &Private->SimplePointer.WaitForInput
- );
-
- return Status;
-}
+/*++ @file
+
+Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
+Portions copyright (c) 2010 0 2011,Apple Inc. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+
+**/
+
+#include "Gop.h"
+
+
+BOOLEAN
+GopPrivateIsKeyRegistered (
+ IN EFI_KEY_DATA *RegsiteredData,
+ IN EFI_KEY_DATA *InputData
+ )
+/*++
+
+Routine Description:
+
+Arguments:
+
+ RegsiteredData - A pointer to a buffer that is filled in with the keystroke
+ state data for the key that was registered.
+ InputData - A pointer to a buffer that is filled in with the keystroke
+ state data for the key that was pressed.
+
+Returns:
+ TRUE - Key be pressed matches a registered key.
+ FLASE - Match failed.
+
+**/
+{
+ ASSERT (RegsiteredData != NULL && InputData != NULL);
+
+ if ((RegsiteredData->Key.ScanCode != InputData->Key.ScanCode) ||
+ (RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) {
+ return FALSE;
+ }
+
+ //
+ // Assume KeyShiftState/KeyToggleState = 0 in Registered key data means these state could be ignored.
+ //
+ if (RegsiteredData->KeyState.KeyShiftState != 0 &&
+ RegsiteredData->KeyState.KeyShiftState != InputData->KeyState.KeyShiftState) {
+ return FALSE;
+ }
+ if (RegsiteredData->KeyState.KeyToggleState != 0 &&
+ RegsiteredData->KeyState.KeyToggleState != InputData->KeyState.KeyToggleState) {
+ return FALSE;
+ }
+
+ return TRUE;
+
+}
+
+
+VOID
+EFIAPI
+GopPrivateMakeCallbackFunction (
+ IN VOID *Context,
+ IN EFI_KEY_DATA *KeyData
+ )
+{
+ LIST_ENTRY *Link;
+ EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
+ GOP_PRIVATE_DATA *Private = (GOP_PRIVATE_DATA *)Context;
+
+ KeyMapMake (KeyData);
+
+ for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {
+ CurrentNotify = CR (
+ Link,
+ EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
+ NotifyEntry,
+ EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
+ );
+ if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
+ // We could be called at a high TPL so signal an event to call the registered function
+ // at a lower TPL.
+ gBS->SignalEvent (CurrentNotify->Event);
+ }
+ }
+}
+
+
+VOID
+EFIAPI
+GopPrivateBreakCallbackFunction (
+ IN VOID *Context,
+ IN EFI_KEY_DATA *KeyData
+ )
+{
+ KeyMapBreak (KeyData);
+}
+
+
+
+//
+// Simple Text In implementation.
+//
+
+/**
+ Reset the input device and optionally run diagnostics
+
+ @param This Protocol instance pointer.
+ @param ExtendedVerification Driver may perform diagnostics on reset.
+
+ @retval EFI_SUCCESS The device was reset.
+ @retval EFI_DEVICE_ERROR The device is not functioning properly and could not be reset.
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopSimpleTextInReset (
+ IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
+ IN BOOLEAN ExtendedVerification
+ )
+{
+ GOP_PRIVATE_DATA *Private;
+ EFI_KEY_DATA KeyData;
+ EFI_TPL OldTpl;
+
+ Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
+ if (Private->EmuGraphicsWindow == NULL) {
+ return EFI_SUCCESS;
+ }
+
+ //
+ // Enter critical section
+ //
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
+
+ //
+ // A reset is draining the Queue
+ //
+ while (Private->EmuGraphicsWindow->GetKey (Private->EmuGraphicsWindow, &KeyData) == EFI_SUCCESS)
+ ;
+
+ //
+ // Leave critical section and return
+ //
+ gBS->RestoreTPL (OldTpl);
+ return EFI_SUCCESS;
+}
+
+
+/**
+ Reads the next keystroke from the input device. The WaitForKey Event can
+ be used to test for existence of a keystroke via WaitForEvent () call.
+
+ @param This Protocol instance pointer.
+ @param Key A pointer to a buffer that is filled in with the keystroke
+ information for the key that was pressed.
+
+ @retval EFI_SUCCESS The keystroke information was returned.
+ @retval EFI_NOT_READY There was no keystroke data available.
+ @retval EFI_DEVICE_ERROR The keystroke information was not returned due to
+ hardware errors.
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopSimpleTextInReadKeyStroke (
+ IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
+ OUT EFI_INPUT_KEY *Key
+ )
+{
+ GOP_PRIVATE_DATA *Private;
+ EFI_STATUS Status;
+ EFI_TPL OldTpl;
+ EFI_KEY_DATA KeyData;
+
+ Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
+ if (Private->EmuGraphicsWindow == NULL) {
+ return EFI_NOT_READY;
+ }
+
+ //
+ // Enter critical section
+ //
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
+
+ Status = Private->EmuGraphicsWindow->GetKey (Private->EmuGraphicsWindow, &KeyData);
+ if (!EFI_ERROR (Status)) {
+ if ((KeyData.Key.ScanCode == 0) && (KeyData.Key.UnicodeChar == 0)) {
+ // Modifier key was pressed
+ Status = EFI_NOT_READY;
+ } else {
+ CopyMem (Key, &KeyData.Key, sizeof (EFI_INPUT_KEY));
+ }
+ }
+
+ //
+ // Leave critical section and return
+ //
+ gBS->RestoreTPL (OldTpl);
+
+ return Status;
+}
+
+
+
+/**
+ SimpleTextIn and SimpleTextInEx Notify Wait Event
+
+ @param Event Event whose notification function is being invoked.
+ @param Context Pointer to GOP_PRIVATE_DATA.
+
+**/
+VOID
+EFIAPI
+EmuGopSimpleTextInWaitForKey (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+{
+ GOP_PRIVATE_DATA *Private;
+ EFI_STATUS Status;
+ EFI_TPL OldTpl;
+
+ Private = (GOP_PRIVATE_DATA *) Context;
+ if (Private->EmuGraphicsWindow == NULL) {
+ return;
+ }
+
+ //
+ // Enter critical section
+ //
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
+
+ Status = Private->EmuGraphicsWindow->CheckKey (Private->EmuGraphicsWindow);
+ if (!EFI_ERROR (Status)) {
+ //
+ // If a there is a key in the queue signal our event.
+ //
+ gBS->SignalEvent (Event);
+ }
+ //
+ // Leave critical section and return
+ //
+ gBS->RestoreTPL (OldTpl);
+}
+
+
+//
+// Simple Text Input Ex protocol functions
+//
+
+
+/**
+ The Reset() function resets the input device hardware. As part
+ of initialization process, the firmware/device will make a quick
+ but reasonable attempt to verify that the device is functioning.
+ If the ExtendedVerification flag is TRUE the firmware may take
+ an extended amount of time to verify the device is operating on
+ reset. Otherwise the reset operation is to occur as quickly as
+ possible. The hardware verification process is not defined by
+ this specification and is left up to the platform firmware or
+ driver to implement.
+
+ @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
+
+ @param ExtendedVerification Indicates that the driver may
+ perform a more exhaustive
+ verification operation of the
+ device during reset.
+
+
+ @retval EFI_SUCCESS The device was reset.
+
+ @retval EFI_DEVICE_ERROR The device is not functioning
+ correctly and could not be reset.
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopSimpleTextInExResetEx (
+ IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
+ IN BOOLEAN ExtendedVerification
+ )
+/*++
+
+ Routine Description:
+ Reset the input device and optionaly run diagnostics
+
+ Arguments:
+ This - Protocol instance pointer.
+ ExtendedVerification - Driver may perform diagnostics on reset.
+
+ Returns:
+ EFI_SUCCESS - The device was reset.
+
+**/
+{
+ return EFI_SUCCESS;
+}
+
+
+
+/**
+ The function reads the next keystroke from the input device. If
+ there is no pending keystroke the function returns
+ EFI_NOT_READY. If there is a pending keystroke, then
+ KeyData.Key.ScanCode is the EFI scan code defined in Error!
+ Reference source not found. The KeyData.Key.UnicodeChar is the
+ actual printable character or is zero if the key does not
+ represent a printable character (control key, function key,
+ etc.). The KeyData.KeyState is shift state for the character
+ reflected in KeyData.Key.UnicodeChar or KeyData.Key.ScanCode .
+ When interpreting the data from this function, it should be
+ noted that if a class of printable characters that are
+ normally adjusted by shift modifiers (e.g. Shift Key + "f"
+ key) would be presented solely as a KeyData.Key.UnicodeChar
+ without the associated shift state. So in the previous example
+ of a Shift Key + "f" key being pressed, the only pertinent
+ data returned would be KeyData.Key.UnicodeChar with the value
+ of "F". This of course would not typically be the case for
+ non-printable characters such as the pressing of the Right
+ Shift Key + F10 key since the corresponding returned data
+ would be reflected both in the KeyData.KeyState.KeyShiftState
+ and KeyData.Key.ScanCode values. UEFI drivers which implement
+ the EFI_SIMPLE_TEXT_INPUT_EX protocol are required to return
+ KeyData.Key and KeyData.KeyState values. These drivers must
+ always return the most current state of
+ KeyData.KeyState.KeyShiftState and
+ KeyData.KeyState.KeyToggleState. It should also be noted that
+ certain input devices may not be able to produce shift or toggle
+ state information, and in those cases the high order bit in the
+ respective Toggle and Shift state fields should not be active.
+
+
+ @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
+
+ @param KeyData A pointer to a buffer that is filled in with
+ the keystroke state data for the key that was
+ pressed.
+
+
+ @retval EFI_SUCCESS The keystroke information was
+ returned.
+
+ @retval EFI_NOT_READY There was no keystroke data available.
+ EFI_DEVICE_ERROR The keystroke
+ information was not returned due to
+ hardware errors.
+
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopSimpleTextInExReadKeyStrokeEx (
+ IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
+ OUT EFI_KEY_DATA *KeyData
+ )
+/*++
+
+ Routine Description:
+ Reads the next keystroke from the input device. The WaitForKey Event can
+ be used to test for existance of a keystroke via WaitForEvent () call.
+
+ Arguments:
+ This - Protocol instance pointer.
+ KeyData - A pointer to a buffer that is filled in with the keystroke
+ state data for the key that was pressed.
+
+ Returns:
+ EFI_SUCCESS - The keystroke information was returned.
+ EFI_NOT_READY - There was no keystroke data availiable.
+ EFI_DEVICE_ERROR - The keystroke information was not returned due to
+ hardware errors.
+ EFI_INVALID_PARAMETER - KeyData is NULL.
+
+**/
+{
+ EFI_STATUS Status;
+ GOP_PRIVATE_DATA *Private;
+ EFI_TPL OldTpl;
+
+
+ if (KeyData == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
+ if (Private->EmuGraphicsWindow == NULL) {
+ return EFI_NOT_READY;
+ }
+
+ //
+ // Enter critical section
+ //
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
+
+ Status = Private->EmuGraphicsWindow->GetKey(Private->EmuGraphicsWindow, KeyData);
+
+ //
+ // Leave critical section and return
+ //
+ gBS->RestoreTPL (OldTpl);
+
+ return Status;
+}
+
+
+
+/**
+ The SetState() function allows the input device hardware to
+ have state settings adjusted.
+
+ @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
+
+ @param KeyToggleState Pointer to the EFI_KEY_TOGGLE_STATE to
+ set the state for the input device.
+
+
+ @retval EFI_SUCCESS The device state was set appropriately.
+
+ @retval EFI_DEVICE_ERROR The device is not functioning
+ correctly and could not have the
+ setting adjusted.
+
+ @retval EFI_UNSUPPORTED The device does not support the
+ ability to have its state set.
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopSimpleTextInExSetState (
+ IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
+ IN EFI_KEY_TOGGLE_STATE *KeyToggleState
+ )
+{
+ GOP_PRIVATE_DATA *Private;
+ EFI_STATUS Status;
+ EFI_TPL OldTpl;
+
+ Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
+ if (Private->EmuGraphicsWindow == NULL) {
+ return EFI_NOT_READY;
+ }
+
+ //
+ // Enter critical section
+ //
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
+
+ Status = Private->EmuGraphicsWindow->KeySetState (Private->EmuGraphicsWindow, KeyToggleState);
+ //
+ // Leave critical section and return
+ //
+ gBS->RestoreTPL (OldTpl);
+
+ return Status;
+}
+
+
+/**
+ SimpleTextIn and SimpleTextInEx Notify Wait Event
+
+ @param Event Event whose notification function is being invoked.
+ @param Context Pointer to GOP_PRIVATE_DATA.
+
+**/
+VOID
+EFIAPI
+EmuGopRegisterKeyCallback (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+{
+ EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *ExNotify = (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *)Context;
+
+ ExNotify->KeyNotificationFn (&ExNotify->KeyData);
+}
+
+
+
+/**
+ The RegisterKeystrokeNotify() function registers a function
+ which will be called when a specified keystroke will occur.
+
+ @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
+
+ @param KeyData A pointer to a buffer that is filled in with
+ the keystroke information for the key that was
+ pressed.
+
+ @param KeyNotificationFunction Points to the function to be
+ called when the key sequence
+ is typed specified by KeyData.
+
+
+ @param NotifyHandle Points to the unique handle assigned to
+ the registered notification.
+
+ @retval EFI_SUCCESS The device state was set
+ appropriately.
+
+ @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary
+ data structures.
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopSimpleTextInExRegisterKeyNotify (
+ IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
+ IN EFI_KEY_DATA *KeyData,
+ IN EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction,
+ OUT EFI_HANDLE *NotifyHandle
+ )
+{
+ EFI_STATUS Status;
+ GOP_PRIVATE_DATA *Private;
+ EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
+ LIST_ENTRY *Link;
+ EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *NewNotify;
+
+ if (KeyData == NULL || KeyNotificationFunction == NULL || NotifyHandle == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
+
+ //
+ // Return EFI_SUCCESS if the (KeyData, NotificationFunction) is already registered.
+ //
+ for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {
+ CurrentNotify = CR (
+ Link,
+ EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
+ NotifyEntry,
+ EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
+ );
+ if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
+ if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) {
+ *NotifyHandle = CurrentNotify->NotifyHandle;
+ return EFI_SUCCESS;
+ }
+ }
+ }
+
+ //
+ // Allocate resource to save the notification function
+ //
+ NewNotify = (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) AllocateZeroPool (sizeof (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY));
+ if (NewNotify == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ NewNotify->Signature = EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE;
+ NewNotify->KeyNotificationFn = KeyNotificationFunction;
+ NewNotify->NotifyHandle = (EFI_HANDLE) NewNotify;
+ CopyMem (&NewNotify->KeyData, KeyData, sizeof (KeyData));
+ InsertTailList (&Private->NotifyList, &NewNotify->NotifyEntry);
+
+ Status = gBS->CreateEvent (
+ EVT_NOTIFY_SIGNAL,
+ TPL_NOTIFY,
+ EmuGopRegisterKeyCallback,
+ NewNotify,
+ &NewNotify->Event
+ );
+ ASSERT_EFI_ERROR (Status);
+
+
+ *NotifyHandle = NewNotify->NotifyHandle;
+
+ return EFI_SUCCESS;
+
+}
+
+
+/**
+ The UnregisterKeystrokeNotify() function removes the
+ notification which was previously registered.
+
+ @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
+
+ @param NotificationHandle The handle of the notification
+ function being unregistered.
+
+ @retval EFI_SUCCESS The device state was set appropriately.
+
+ @retval EFI_INVALID_PARAMETER The NotificationHandle is
+ invalid.
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopSimpleTextInExUnregisterKeyNotify (
+ IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
+ IN EFI_HANDLE NotificationHandle
+ )
+/*++
+
+ Routine Description:
+ Remove a registered notification function from a particular keystroke.
+
+ Arguments:
+ This - Protocol instance pointer.
+ NotificationHandle - The handle of the notification function being unregistered.
+
+ Returns:
+ EFI_SUCCESS - The notification function was unregistered successfully.
+ EFI_INVALID_PARAMETER - The NotificationHandle is invalid.
+
+**/
+{
+ GOP_PRIVATE_DATA *Private;
+ LIST_ENTRY *Link;
+ EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
+
+ if (NotificationHandle == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (((EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) NotificationHandle)->Signature != EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
+
+ for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {
+ CurrentNotify = CR (
+ Link,
+ EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
+ NotifyEntry,
+ EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
+ );
+ if (CurrentNotify->NotifyHandle == NotificationHandle) {
+ //
+ // Remove the notification function from NotifyList and free resources
+ //
+ RemoveEntryList (&CurrentNotify->NotifyEntry);
+
+ gBS->CloseEvent (CurrentNotify->Event);
+
+ gBS->FreePool (CurrentNotify);
+ return EFI_SUCCESS;
+ }
+ }
+
+ //
+ // Can not find the specified Notification Handle
+ //
+ return EFI_INVALID_PARAMETER;
+}
+
+
+
+/**
+ Initialize SimplelTextIn and SimpleTextInEx protocols in the Private
+ context structure.
+
+ @param Private Context structure to fill in.
+
+ @return EFI_SUCCESS Initialization was a success
+
+**/
+EFI_STATUS
+EmuGopInitializeSimpleTextInForWindow (
+ IN GOP_PRIVATE_DATA *Private
+ )
+{
+ EFI_STATUS Status;
+
+ //
+ // Initialize Simple Text In protoocol
+ //
+ Private->SimpleTextIn.Reset = EmuGopSimpleTextInReset;
+ Private->SimpleTextIn.ReadKeyStroke = EmuGopSimpleTextInReadKeyStroke;
+
+ Status = gBS->CreateEvent (
+ EVT_NOTIFY_WAIT,
+ TPL_NOTIFY,
+ EmuGopSimpleTextInWaitForKey,
+ Private,
+ &Private->SimpleTextIn.WaitForKey
+ );
+ ASSERT_EFI_ERROR (Status);
+
+
+ //
+ // Initialize Simple Text In Ex
+ //
+
+ Private->SimpleTextInEx.Reset = EmuGopSimpleTextInExResetEx;
+ Private->SimpleTextInEx.ReadKeyStrokeEx = EmuGopSimpleTextInExReadKeyStrokeEx;
+ Private->SimpleTextInEx.SetState = EmuGopSimpleTextInExSetState;
+ Private->SimpleTextInEx.RegisterKeyNotify = EmuGopSimpleTextInExRegisterKeyNotify;
+ Private->SimpleTextInEx.UnregisterKeyNotify = EmuGopSimpleTextInExUnregisterKeyNotify;
+
+ Private->SimpleTextInEx.Reset (&Private->SimpleTextInEx, FALSE);
+
+ InitializeListHead (&Private->NotifyList);
+
+ Status = gBS->CreateEvent (
+ EVT_NOTIFY_WAIT,
+ TPL_NOTIFY,
+ EmuGopSimpleTextInWaitForKey,
+ Private,
+ &Private->SimpleTextInEx.WaitForKeyEx
+ );
+ ASSERT_EFI_ERROR (Status);
+
+
+ return Status;
+}
+
+
+
+
+
+
+
+//
+// Simple Pointer implementation.
+//
+
+
+/**
+ Resets the pointer device hardware.
+
+ @param This A pointer to the EFI_SIMPLE_POINTER_PROTOCOL
+ instance.
+ @param ExtendedVerification Indicates that the driver may perform a more exhaustive
+ verification operation of the device during reset.
+
+ @retval EFI_SUCCESS The device was reset.
+ @retval EFI_DEVICE_ERROR The device is not functioning correctly and could not be reset.
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopSimplePointerReset (
+ IN EFI_SIMPLE_POINTER_PROTOCOL *This,
+ IN BOOLEAN ExtendedVerification
+ )
+{
+ GOP_PRIVATE_DATA *Private;
+ EFI_SIMPLE_POINTER_STATE State;
+ EFI_TPL OldTpl;
+
+ Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);
+ if (Private->EmuGraphicsWindow == NULL) {
+ return EFI_SUCCESS;
+ }
+
+ //
+ // Enter critical section
+ //
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
+
+ //
+ // A reset is draining the Queue
+ //
+ while (Private->EmuGraphicsWindow->GetPointerState (Private->EmuGraphicsWindow, &State) == EFI_SUCCESS)
+ ;
+
+ //
+ // Leave critical section and return
+ //
+ gBS->RestoreTPL (OldTpl);
+ return EFI_SUCCESS;
+}
+
+
+/**
+ Retrieves the current state of a pointer device.
+
+ @param This A pointer to the EFI_SIMPLE_POINTER_PROTOCOL
+ instance.
+ @param State A pointer to the state information on the pointer device.
+
+ @retval EFI_SUCCESS The state of the pointer device was returned in State.
+ @retval EFI_NOT_READY The state of the pointer device has not changed since the last call to
+ GetState().
+ @retval EFI_DEVICE_ERROR A device error occurred while attempting to retrieve the pointer device's
+ current state.
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopSimplePointerGetState (
+ IN EFI_SIMPLE_POINTER_PROTOCOL *This,
+ IN OUT EFI_SIMPLE_POINTER_STATE *State
+ )
+{
+ GOP_PRIVATE_DATA *Private;
+ EFI_STATUS Status;
+ EFI_TPL OldTpl;
+
+ Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);
+ if (Private->EmuGraphicsWindow == NULL) {
+ return EFI_NOT_READY;
+ }
+
+ //
+ // Enter critical section
+ //
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
+
+ Status = Private->EmuGraphicsWindow->GetPointerState (Private->EmuGraphicsWindow, State);
+ //
+ // Leave critical section and return
+ //
+ gBS->RestoreTPL (OldTpl);
+
+ return Status;
+}
+
+
+/**
+ SimplePointer Notify Wait Event
+
+ @param Event Event whose notification function is being invoked.
+ @param Context Pointer to GOP_PRIVATE_DATA.
+
+**/
+VOID
+EFIAPI
+EmuGopSimplePointerWaitForInput (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+{
+ GOP_PRIVATE_DATA *Private;
+ EFI_STATUS Status;
+ EFI_TPL OldTpl;
+
+ Private = (GOP_PRIVATE_DATA *) Context;
+ if (Private->EmuGraphicsWindow == NULL) {
+ return;
+ }
+
+ //
+ // Enter critical section
+ //
+ OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
+
+ Status = Private->EmuGraphicsWindow->CheckPointer (Private->EmuGraphicsWindow);
+ if (!EFI_ERROR (Status)) {
+ //
+ // If the pointer state has changed, signal our event.
+ //
+ gBS->SignalEvent (Event);
+ }
+ //
+ // Leave critical section and return
+ //
+ gBS->RestoreTPL (OldTpl);
+}
+
+
+/**
+ SimplePointer constructor
+
+ @param Private Context structure to fill in.
+
+ @retval EFI_SUCCESS Constructor had success
+
+**/
+EFI_STATUS
+EmuGopInitializeSimplePointerForWindow (
+ IN GOP_PRIVATE_DATA *Private
+ )
+{
+ EFI_STATUS Status;
+
+ //
+ // Initialize Simple Pointer protoocol
+ //
+ Private->PointerMode.ResolutionX = 1;
+ Private->PointerMode.ResolutionY = 1;
+ Private->PointerMode.ResolutionZ = 1;
+ Private->PointerMode.LeftButton = TRUE;
+ Private->PointerMode.RightButton = TRUE;
+
+ Private->SimplePointer.Reset = EmuGopSimplePointerReset;
+ Private->SimplePointer.GetState = EmuGopSimplePointerGetState;
+ Private->SimplePointer.Mode = &Private->PointerMode;
+
+ Status = gBS->CreateEvent (
+ EVT_NOTIFY_WAIT,
+ TPL_NOTIFY,
+ EmuGopSimplePointerWaitForInput,
+ Private,
+ &Private->SimplePointer.WaitForInput
+ );
+
+ return Status;
+}
diff --git a/EmulatorPkg/EmuGopDxe/GopScreen.c b/EmulatorPkg/EmuGopDxe/GopScreen.c
index aa21fa68de..761d945c15 100644
--- a/EmulatorPkg/EmuGopDxe/GopScreen.c
+++ b/EmulatorPkg/EmuGopDxe/GopScreen.c
@@ -1,416 +1,416 @@
-/*++ @file
-
-Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
-Portions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-Module Name:
-
- EmuGopScreen.c
-
-Abstract:
-
- This file produces the graphics abstration of UGA. It is called by
- EmuGopDriver.c file which deals with the EFI 1.1 driver model.
- This file just does graphics.
-
-**/
-
-#include "Gop.h"
-
-
-EFI_EVENT mGopScreenExitBootServicesEvent;
-
-GOP_MODE_DATA mGopModeData[] = {
- { 800, 600, 0, 0 },
- { 640, 480, 0, 0 },
- { 720, 400, 0, 0 },
- {1024, 768, 0, 0 },
- {1280, 1024, 0, 0 }
- };
-
-
-/**
- Returns information for an available graphics mode that the graphics device
- and the set of active video output devices supports.
-
- @param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
- @param ModeNumber The mode number to return information on.
- @param SizeOfInfo A pointer to the size, in bytes, of the Info buffer.
- @param Info A pointer to callee allocated buffer that returns information about ModeNumber.
-
- @retval EFI_SUCCESS Mode information returned.
- @retval EFI_BUFFER_TOO_SMALL The Info buffer was too small.
- @retval EFI_DEVICE_ERROR A hardware error occurred trying to retrieve the video mode.
- @retval EFI_NOT_STARTED Video display is not initialized. Call SetMode ()
- @retval EFI_INVALID_PARAMETER One of the input args was NULL.
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopQuerytMode (
- IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
- IN UINT32 ModeNumber,
- OUT UINTN *SizeOfInfo,
- OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info
- )
-{
- GOP_PRIVATE_DATA *Private;
-
- Private = GOP_PRIVATE_DATA_FROM_THIS (This);
-
- if (Info == NULL || SizeOfInfo == NULL || (UINTN) ModeNumber >= This->Mode->MaxMode) {
- return EFI_INVALID_PARAMETER;
- }
-
- *Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
- if (*Info == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
-
- (*Info)->Version = 0;
- (*Info)->HorizontalResolution = Private->ModeData[ModeNumber].HorizontalResolution;
- (*Info)->VerticalResolution = Private->ModeData[ModeNumber].VerticalResolution;
- (*Info)->PixelFormat = PixelBltOnly;
- (*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution;
-
- return EFI_SUCCESS;
-}
-
-
-
-/**
- Set the video device into the specified mode and clears the visible portions of
- the output display to black.
-
- @param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
- @param ModeNumber Abstraction that defines the current video mode.
-
- @retval EFI_SUCCESS The graphics mode specified by ModeNumber was selected.
- @retval EFI_DEVICE_ERROR The device had an error and could not complete the request.
- @retval EFI_UNSUPPORTED ModeNumber is not supported by this device.
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopSetMode (
- IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
- IN UINT32 ModeNumber
- )
-{
- EFI_STATUS Status;
- GOP_PRIVATE_DATA *Private;
- GOP_MODE_DATA *ModeData;
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL Fill;
-
- Private = GOP_PRIVATE_DATA_FROM_THIS (This);
-
- if (ModeNumber >= This->Mode->MaxMode) {
- return EFI_UNSUPPORTED;
- }
-
- ModeData = &Private->ModeData[ModeNumber];
- This->Mode->Mode = ModeNumber;
- Private->GraphicsOutput.Mode->Info->HorizontalResolution = ModeData->HorizontalResolution;
- Private->GraphicsOutput.Mode->Info->VerticalResolution = ModeData->VerticalResolution;
- Private->GraphicsOutput.Mode->Info->PixelsPerScanLine = ModeData->HorizontalResolution;
-
- if (Private->HardwareNeedsStarting) {
- Status = EmuGopStartWindow (
- Private,
- ModeData->HorizontalResolution,
- ModeData->VerticalResolution,
- ModeData->ColorDepth,
- ModeData->RefreshRate
- );
- if (EFI_ERROR (Status)) {
- return EFI_DEVICE_ERROR;
- }
-
- Private->HardwareNeedsStarting = FALSE;
- }
-
-
- Status = Private->EmuGraphicsWindow->Size(
- Private->EmuGraphicsWindow,
- ModeData->HorizontalResolution,
- ModeData->VerticalResolution
- );
-
-
- Fill.Red = 0x7f;
- Fill.Green = 0x7F;
- Fill.Blue = 0x7f;
- This->Blt (
- This,
- &Fill,
- EfiBltVideoFill,
- 0,
- 0,
- 0,
- 0,
- ModeData->HorizontalResolution,
- ModeData->VerticalResolution,
- ModeData->HorizontalResolution * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
- );
- return EFI_SUCCESS;
-}
-
-
-
-/**
- Blt a rectangle of pixels on the graphics screen. Blt stands for BLock Transfer.
-
- @param This Protocol instance pointer.
- @param BltBuffer Buffer containing data to blit into video buffer. This
- buffer has a size of Width*Height*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
- @param BltOperation Operation to perform on BlitBuffer and video memory
- @param SourceX X coordinate of source for the BltBuffer.
- @param SourceY Y coordinate of source for the BltBuffer.
- @param DestinationX X coordinate of destination for the BltBuffer.
- @param DestinationY Y coordinate of destination for the BltBuffer.
- @param Width Width of rectangle in BltBuffer in pixels.
- @param Height Hight of rectangle in BltBuffer in pixels.
- @param Delta OPTIONAL
-
- @retval EFI_SUCCESS The Blt operation completed.
- @retval EFI_INVALID_PARAMETER BltOperation is not valid.
- @retval EFI_DEVICE_ERROR A hardware error occured writting to the video buffer.
-
-**/
-EFI_STATUS
-EFIAPI
-EmuGopBlt (
- IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
- IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL
- IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,
- IN UINTN SourceX,
- IN UINTN SourceY,
- IN UINTN DestinationX,
- IN UINTN DestinationY,
- IN UINTN Width,
- IN UINTN Height,
- IN UINTN Delta OPTIONAL
- )
-{
- GOP_PRIVATE_DATA *Private;
- EFI_TPL OriginalTPL;
- EFI_STATUS Status;
- EMU_GRAPHICS_WINDOWS__BLT_ARGS GopBltArgs;
-
- Private = GOP_PRIVATE_DATA_FROM_THIS (This);
-
- if ((UINT32)BltOperation >= EfiGraphicsOutputBltOperationMax) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (Width == 0 || Height == 0) {
- return EFI_INVALID_PARAMETER;
- }
- //
- // If Delta is zero, then the entire BltBuffer is being used, so Delta
- // is the number of bytes in each row of BltBuffer. Since BltBuffer is Width pixels size,
- // the number of bytes in each row can be computed.
- //
- if (Delta == 0) {
- Delta = Width * sizeof (EFI_UGA_PIXEL);
- }
-
- //
- // We have to raise to TPL Notify, so we make an atomic write the frame buffer.
- // We would not want a timer based event (Cursor, ...) to come in while we are
- // doing this operation.
- //
- OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY);
-
- //
- // Pack UGA Draw protocol parameters to EMU_GRAPHICS_WINDOWS__BLT_ARGS structure to adapt to
- // GopBlt() API of Unix UGA IO protocol.
- //
- GopBltArgs.DestinationX = DestinationX;
- GopBltArgs.DestinationY = DestinationY;
- GopBltArgs.Height = Height;
- GopBltArgs.Width = Width;
- GopBltArgs.SourceX = SourceX;
- GopBltArgs.SourceY = SourceY;
- GopBltArgs.Delta = Delta;
- Status = Private->EmuGraphicsWindow->Blt (
- Private->EmuGraphicsWindow,
- (EFI_UGA_PIXEL *)BltBuffer,
- (EFI_UGA_BLT_OPERATION)BltOperation,
- &GopBltArgs
- );
-
- gBS->RestoreTPL (OriginalTPL);
-
- return Status;
-}
-
-
-//
-// Construction and Destruction functions
-//
-
-EFI_STATUS
-EmuGopSupported (
- IN EMU_IO_THUNK_PROTOCOL *EmuIoThunk
- )
-{
- //
- // Check to see if the IO abstraction represents a device type we support.
- //
- // This would be replaced a check of PCI subsystem ID, etc.
- //
- if (!CompareGuid (EmuIoThunk->Protocol, &gEmuGraphicsWindowProtocolGuid)) {
- return EFI_UNSUPPORTED;
- }
-
- return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-EmuGopStartWindow (
- IN GOP_PRIVATE_DATA *Private,
- IN UINT32 HorizontalResolution,
- IN UINT32 VerticalResolution,
- IN UINT32 ColorDepth,
- IN UINT32 RefreshRate
- )
-{
- EFI_STATUS Status;
-
- //
- // Register to be notified on exit boot services so we can destroy the window.
- //
- Status = gBS->CreateEvent (
- EVT_SIGNAL_EXIT_BOOT_SERVICES,
- TPL_CALLBACK,
- ShutdownGopEvent,
- Private,
- &mGopScreenExitBootServicesEvent
- );
-
- Status = Private->EmuIoThunk->Open (Private->EmuIoThunk);
- if (!EFI_ERROR (Status)) {
- Private->EmuGraphicsWindow = Private->EmuIoThunk->Interface;
-
- // Register callback to support RegisterKeyNotify()
- Status = Private->EmuGraphicsWindow->RegisterKeyNotify (
- Private->EmuGraphicsWindow,
- GopPrivateMakeCallbackFunction,
- GopPrivateBreakCallbackFunction,
- Private
- );
- ASSERT_EFI_ERROR (Status);
- }
- return Status;
-}
-
-EFI_STATUS
-EmuGopConstructor (
- GOP_PRIVATE_DATA *Private
- )
-{
- Private->ModeData = mGopModeData;
-
- Private->GraphicsOutput.QueryMode = EmuGopQuerytMode;
- Private->GraphicsOutput.SetMode = EmuGopSetMode;
- Private->GraphicsOutput.Blt = EmuGopBlt;
-
- //
- // Allocate buffer for Graphics Output Protocol mode information
- //
- Private->GraphicsOutput.Mode = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE));
- if (Private->GraphicsOutput.Mode == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- Private->GraphicsOutput.Mode->Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
- if (Private->GraphicsOutput.Mode->Info == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Private->GraphicsOutput.Mode->MaxMode = sizeof(mGopModeData) / sizeof(GOP_MODE_DATA);
- //
- // Till now, we have no idea about the window size.
- //
- Private->GraphicsOutput.Mode->Mode = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;
- Private->GraphicsOutput.Mode->Info->Version = 0;
- Private->GraphicsOutput.Mode->Info->HorizontalResolution = 0;
- Private->GraphicsOutput.Mode->Info->VerticalResolution = 0;
- Private->GraphicsOutput.Mode->Info->PixelFormat = PixelBltOnly;
- Private->GraphicsOutput.Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
- Private->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) (UINTN) NULL;
- Private->GraphicsOutput.Mode->FrameBufferSize = 0;
-
- Private->HardwareNeedsStarting = TRUE;
- Private->EmuGraphicsWindow = NULL;
-
- EmuGopInitializeSimpleTextInForWindow (Private);
-
- EmuGopInitializeSimplePointerForWindow (Private);
-
- return EFI_SUCCESS;
-}
-
-
-
-EFI_STATUS
-EmuGopDestructor (
- GOP_PRIVATE_DATA *Private
- )
-{
- if (!Private->HardwareNeedsStarting) {
- Private->EmuIoThunk->Close (Private->EmuIoThunk);
- Private->EmuGraphicsWindow = NULL;
- }
-
- //
- // Free graphics output protocol occupied resource
- //
- if (Private->GraphicsOutput.Mode != NULL) {
- if (Private->GraphicsOutput.Mode->Info != NULL) {
- FreePool (Private->GraphicsOutput.Mode->Info);
- }
- FreePool (Private->GraphicsOutput.Mode);
- }
-
- return EFI_SUCCESS;
-}
-
-
-VOID
-EFIAPI
-ShutdownGopEvent (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
-/*++
-
-Routine Description:
-
- This is the UGA screen's callback notification function for exit-boot-services.
- All we do here is call EmuGopDestructor().
-
-Arguments:
-
- Event - not used
- Context - pointer to the Private structure.
-
-Returns:
-
- None.
-
-**/
-{
- EmuGopDestructor (Context);
-}
-
+/*++ @file
+
+Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
+Portions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+Module Name:
+
+ EmuGopScreen.c
+
+Abstract:
+
+ This file produces the graphics abstration of UGA. It is called by
+ EmuGopDriver.c file which deals with the EFI 1.1 driver model.
+ This file just does graphics.
+
+**/
+
+#include "Gop.h"
+
+
+EFI_EVENT mGopScreenExitBootServicesEvent;
+
+GOP_MODE_DATA mGopModeData[] = {
+ { 800, 600, 0, 0 },
+ { 640, 480, 0, 0 },
+ { 720, 400, 0, 0 },
+ {1024, 768, 0, 0 },
+ {1280, 1024, 0, 0 }
+ };
+
+
+/**
+ Returns information for an available graphics mode that the graphics device
+ and the set of active video output devices supports.
+
+ @param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
+ @param ModeNumber The mode number to return information on.
+ @param SizeOfInfo A pointer to the size, in bytes, of the Info buffer.
+ @param Info A pointer to callee allocated buffer that returns information about ModeNumber.
+
+ @retval EFI_SUCCESS Mode information returned.
+ @retval EFI_BUFFER_TOO_SMALL The Info buffer was too small.
+ @retval EFI_DEVICE_ERROR A hardware error occurred trying to retrieve the video mode.
+ @retval EFI_NOT_STARTED Video display is not initialized. Call SetMode ()
+ @retval EFI_INVALID_PARAMETER One of the input args was NULL.
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopQuerytMode (
+ IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
+ IN UINT32 ModeNumber,
+ OUT UINTN *SizeOfInfo,
+ OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info
+ )
+{
+ GOP_PRIVATE_DATA *Private;
+
+ Private = GOP_PRIVATE_DATA_FROM_THIS (This);
+
+ if (Info == NULL || SizeOfInfo == NULL || (UINTN) ModeNumber >= This->Mode->MaxMode) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ *Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
+ if (*Info == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
+
+ (*Info)->Version = 0;
+ (*Info)->HorizontalResolution = Private->ModeData[ModeNumber].HorizontalResolution;
+ (*Info)->VerticalResolution = Private->ModeData[ModeNumber].VerticalResolution;
+ (*Info)->PixelFormat = PixelBltOnly;
+ (*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution;
+
+ return EFI_SUCCESS;
+}
+
+
+
+/**
+ Set the video device into the specified mode and clears the visible portions of
+ the output display to black.
+
+ @param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
+ @param ModeNumber Abstraction that defines the current video mode.
+
+ @retval EFI_SUCCESS The graphics mode specified by ModeNumber was selected.
+ @retval EFI_DEVICE_ERROR The device had an error and could not complete the request.
+ @retval EFI_UNSUPPORTED ModeNumber is not supported by this device.
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopSetMode (
+ IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
+ IN UINT32 ModeNumber
+ )
+{
+ EFI_STATUS Status;
+ GOP_PRIVATE_DATA *Private;
+ GOP_MODE_DATA *ModeData;
+ EFI_GRAPHICS_OUTPUT_BLT_PIXEL Fill;
+
+ Private = GOP_PRIVATE_DATA_FROM_THIS (This);
+
+ if (ModeNumber >= This->Mode->MaxMode) {
+ return EFI_UNSUPPORTED;
+ }
+
+ ModeData = &Private->ModeData[ModeNumber];
+ This->Mode->Mode = ModeNumber;
+ Private->GraphicsOutput.Mode->Info->HorizontalResolution = ModeData->HorizontalResolution;
+ Private->GraphicsOutput.Mode->Info->VerticalResolution = ModeData->VerticalResolution;
+ Private->GraphicsOutput.Mode->Info->PixelsPerScanLine = ModeData->HorizontalResolution;
+
+ if (Private->HardwareNeedsStarting) {
+ Status = EmuGopStartWindow (
+ Private,
+ ModeData->HorizontalResolution,
+ ModeData->VerticalResolution,
+ ModeData->ColorDepth,
+ ModeData->RefreshRate
+ );
+ if (EFI_ERROR (Status)) {
+ return EFI_DEVICE_ERROR;
+ }
+
+ Private->HardwareNeedsStarting = FALSE;
+ }
+
+
+ Status = Private->EmuGraphicsWindow->Size(
+ Private->EmuGraphicsWindow,
+ ModeData->HorizontalResolution,
+ ModeData->VerticalResolution
+ );
+
+
+ Fill.Red = 0x7f;
+ Fill.Green = 0x7F;
+ Fill.Blue = 0x7f;
+ This->Blt (
+ This,
+ &Fill,
+ EfiBltVideoFill,
+ 0,
+ 0,
+ 0,
+ 0,
+ ModeData->HorizontalResolution,
+ ModeData->VerticalResolution,
+ ModeData->HorizontalResolution * sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
+ );
+ return EFI_SUCCESS;
+}
+
+
+
+/**
+ Blt a rectangle of pixels on the graphics screen. Blt stands for BLock Transfer.
+
+ @param This Protocol instance pointer.
+ @param BltBuffer Buffer containing data to blit into video buffer. This
+ buffer has a size of Width*Height*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
+ @param BltOperation Operation to perform on BlitBuffer and video memory
+ @param SourceX X coordinate of source for the BltBuffer.
+ @param SourceY Y coordinate of source for the BltBuffer.
+ @param DestinationX X coordinate of destination for the BltBuffer.
+ @param DestinationY Y coordinate of destination for the BltBuffer.
+ @param Width Width of rectangle in BltBuffer in pixels.
+ @param Height Hight of rectangle in BltBuffer in pixels.
+ @param Delta OPTIONAL
+
+ @retval EFI_SUCCESS The Blt operation completed.
+ @retval EFI_INVALID_PARAMETER BltOperation is not valid.
+ @retval EFI_DEVICE_ERROR A hardware error occured writting to the video buffer.
+
+**/
+EFI_STATUS
+EFIAPI
+EmuGopBlt (
+ IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
+ IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL
+ IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,
+ IN UINTN SourceX,
+ IN UINTN SourceY,
+ IN UINTN DestinationX,
+ IN UINTN DestinationY,
+ IN UINTN Width,
+ IN UINTN Height,
+ IN UINTN Delta OPTIONAL
+ )
+{
+ GOP_PRIVATE_DATA *Private;
+ EFI_TPL OriginalTPL;
+ EFI_STATUS Status;
+ EMU_GRAPHICS_WINDOWS__BLT_ARGS GopBltArgs;
+
+ Private = GOP_PRIVATE_DATA_FROM_THIS (This);
+
+ if ((UINT32)BltOperation >= EfiGraphicsOutputBltOperationMax) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (Width == 0 || Height == 0) {
+ return EFI_INVALID_PARAMETER;
+ }
+ //
+ // If Delta is zero, then the entire BltBuffer is being used, so Delta
+ // is the number of bytes in each row of BltBuffer. Since BltBuffer is Width pixels size,
+ // the number of bytes in each row can be computed.
+ //
+ if (Delta == 0) {
+ Delta = Width * sizeof (EFI_UGA_PIXEL);
+ }
+
+ //
+ // We have to raise to TPL Notify, so we make an atomic write the frame buffer.
+ // We would not want a timer based event (Cursor, ...) to come in while we are
+ // doing this operation.
+ //
+ OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY);
+
+ //
+ // Pack UGA Draw protocol parameters to EMU_GRAPHICS_WINDOWS__BLT_ARGS structure to adapt to
+ // GopBlt() API of Unix UGA IO protocol.
+ //
+ GopBltArgs.DestinationX = DestinationX;
+ GopBltArgs.DestinationY = DestinationY;
+ GopBltArgs.Height = Height;
+ GopBltArgs.Width = Width;
+ GopBltArgs.SourceX = SourceX;
+ GopBltArgs.SourceY = SourceY;
+ GopBltArgs.Delta = Delta;
+ Status = Private->EmuGraphicsWindow->Blt (
+ Private->EmuGraphicsWindow,
+ (EFI_UGA_PIXEL *)BltBuffer,
+ (EFI_UGA_BLT_OPERATION)BltOperation,
+ &GopBltArgs
+ );
+
+ gBS->RestoreTPL (OriginalTPL);
+
+ return Status;
+}
+
+
+//
+// Construction and Destruction functions
+//
+
+EFI_STATUS
+EmuGopSupported (
+ IN EMU_IO_THUNK_PROTOCOL *EmuIoThunk
+ )
+{
+ //
+ // Check to see if the IO abstraction represents a device type we support.
+ //
+ // This would be replaced a check of PCI subsystem ID, etc.
+ //
+ if (!CompareGuid (EmuIoThunk->Protocol, &gEmuGraphicsWindowProtocolGuid)) {
+ return EFI_UNSUPPORTED;
+ }
+
+ return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+EmuGopStartWindow (
+ IN GOP_PRIVATE_DATA *Private,
+ IN UINT32 HorizontalResolution,
+ IN UINT32 VerticalResolution,
+ IN UINT32 ColorDepth,
+ IN UINT32 RefreshRate
+ )
+{
+ EFI_STATUS Status;
+
+ //
+ // Register to be notified on exit boot services so we can destroy the window.
+ //
+ Status = gBS->CreateEvent (
+ EVT_SIGNAL_EXIT_BOOT_SERVICES,
+ TPL_CALLBACK,
+ ShutdownGopEvent,
+ Private,
+ &mGopScreenExitBootServicesEvent
+ );
+
+ Status = Private->EmuIoThunk->Open (Private->EmuIoThunk);
+ if (!EFI_ERROR (Status)) {
+ Private->EmuGraphicsWindow = Private->EmuIoThunk->Interface;
+
+ // Register callback to support RegisterKeyNotify()
+ Status = Private->EmuGraphicsWindow->RegisterKeyNotify (
+ Private->EmuGraphicsWindow,
+ GopPrivateMakeCallbackFunction,
+ GopPrivateBreakCallbackFunction,
+ Private
+ );
+ ASSERT_EFI_ERROR (Status);
+ }
+ return Status;
+}
+
+EFI_STATUS
+EmuGopConstructor (
+ GOP_PRIVATE_DATA *Private
+ )
+{
+ Private->ModeData = mGopModeData;
+
+ Private->GraphicsOutput.QueryMode = EmuGopQuerytMode;
+ Private->GraphicsOutput.SetMode = EmuGopSetMode;
+ Private->GraphicsOutput.Blt = EmuGopBlt;
+
+ //
+ // Allocate buffer for Graphics Output Protocol mode information
+ //
+ Private->GraphicsOutput.Mode = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE));
+ if (Private->GraphicsOutput.Mode == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+ Private->GraphicsOutput.Mode->Info = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
+ if (Private->GraphicsOutput.Mode->Info == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ Private->GraphicsOutput.Mode->MaxMode = sizeof(mGopModeData) / sizeof(GOP_MODE_DATA);
+ //
+ // Till now, we have no idea about the window size.
+ //
+ Private->GraphicsOutput.Mode->Mode = GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;
+ Private->GraphicsOutput.Mode->Info->Version = 0;
+ Private->GraphicsOutput.Mode->Info->HorizontalResolution = 0;
+ Private->GraphicsOutput.Mode->Info->VerticalResolution = 0;
+ Private->GraphicsOutput.Mode->Info->PixelFormat = PixelBltOnly;
+ Private->GraphicsOutput.Mode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
+ Private->GraphicsOutput.Mode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) (UINTN) NULL;
+ Private->GraphicsOutput.Mode->FrameBufferSize = 0;
+
+ Private->HardwareNeedsStarting = TRUE;
+ Private->EmuGraphicsWindow = NULL;
+
+ EmuGopInitializeSimpleTextInForWindow (Private);
+
+ EmuGopInitializeSimplePointerForWindow (Private);
+
+ return EFI_SUCCESS;
+}
+
+
+
+EFI_STATUS
+EmuGopDestructor (
+ GOP_PRIVATE_DATA *Private
+ )
+{
+ if (!Private->HardwareNeedsStarting) {
+ Private->EmuIoThunk->Close (Private->EmuIoThunk);
+ Private->EmuGraphicsWindow = NULL;
+ }
+
+ //
+ // Free graphics output protocol occupied resource
+ //
+ if (Private->GraphicsOutput.Mode != NULL) {
+ if (Private->GraphicsOutput.Mode->Info != NULL) {
+ FreePool (Private->GraphicsOutput.Mode->Info);
+ }
+ FreePool (Private->GraphicsOutput.Mode);
+ }
+
+ return EFI_SUCCESS;
+}
+
+
+VOID
+EFIAPI
+ShutdownGopEvent (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+/*++
+
+Routine Description:
+
+ This is the UGA screen's callback notification function for exit-boot-services.
+ All we do here is call EmuGopDestructor().
+
+Arguments:
+
+ Event - not used
+ Context - pointer to the Private structure.
+
+Returns:
+
+ None.
+
+**/
+{
+ EmuGopDestructor (Context);
+}
+
diff --git a/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c b/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c
index 09d16fd8b6..0031baea52 100644
--- a/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c
+++ b/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c
@@ -42,7 +42,7 @@ EFI_SIMPLE_NETWORK_PROTOCOL gEmuSnpTemplate = {
NULL // Mode
};
-EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {
+EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {
EfiSimpleNetworkStopped, // State
NET_ETHER_ADDR_LEN, // HwAddressSize
NET_ETHER_HEADER_SIZE, // MediaHeaderSize
diff --git a/EmulatorPkg/Include/Library/EmuMagicPageLib.h b/EmulatorPkg/Include/Library/EmuMagicPageLib.h
index e0c339a3b8..edae364b06 100644
--- a/EmulatorPkg/Include/Library/EmuMagicPageLib.h
+++ b/EmulatorPkg/Include/Library/EmuMagicPageLib.h
@@ -1,38 +1,38 @@
-/*++ @file
-The PCD, gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage, points to a magic page
-of memory that is like SRAM on an embedded system. This file defines what goes
-where in the magic page.
-
-Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef __EMU_MAGIC_PAGE_LIB_H__
-#define __EMU_MAGIC_PAGE_LIB_H__
-
-#include <PiPei.h>
-#include <Library/PcdLib.h>
-#include <Protocol/EmuThunk.h>
-
-typedef struct {
- // Used by PEI Core and PEIMs to store the PEI Services pointer.
- // Privilege issues prevent using the PI mechanism in the emulator.
- CONST EFI_PEI_SERVICES **PeiServicesTablePointer;
-
- // Used by SecPeiServicesLib
- EFI_PEI_PPI_DESCRIPTOR *PpiList;
-
- // Needed by PEI PEI PeCoffLoaderExtraActionLib
- EMU_THUNK_PROTOCOL *Thunk;
-} EMU_MAGIC_PAGE_LAYOUT;
-
-#define EMU_MAGIC_PAGE() ((EMU_MAGIC_PAGE_LAYOUT *)((UINTN)PcdGet64 (PcdPeiServicesTablePage)))
-
-#endif
+/*++ @file
+The PCD, gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage, points to a magic page
+of memory that is like SRAM on an embedded system. This file defines what goes
+where in the magic page.
+
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __EMU_MAGIC_PAGE_LIB_H__
+#define __EMU_MAGIC_PAGE_LIB_H__
+
+#include <PiPei.h>
+#include <Library/PcdLib.h>
+#include <Protocol/EmuThunk.h>
+
+typedef struct {
+ // Used by PEI Core and PEIMs to store the PEI Services pointer.
+ // Privilege issues prevent using the PI mechanism in the emulator.
+ CONST EFI_PEI_SERVICES **PeiServicesTablePointer;
+
+ // Used by SecPeiServicesLib
+ EFI_PEI_PPI_DESCRIPTOR *PpiList;
+
+ // Needed by PEI PEI PeCoffLoaderExtraActionLib
+ EMU_THUNK_PROTOCOL *Thunk;
+} EMU_MAGIC_PAGE_LAYOUT;
+
+#define EMU_MAGIC_PAGE() ((EMU_MAGIC_PAGE_LAYOUT *)((UINTN)PcdGet64 (PcdPeiServicesTablePage)))
+
+#endif
diff --git a/EmulatorPkg/Include/Library/EmuThunkLib.h b/EmulatorPkg/Include/Library/EmuThunkLib.h
index 98b22e16ee..e18a613d94 100644
--- a/EmulatorPkg/Include/Library/EmuThunkLib.h
+++ b/EmulatorPkg/Include/Library/EmuThunkLib.h
@@ -1,42 +1,42 @@
-/*++ @file
-
-Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef __EMU_THUNK_LIB_H__
-#define __EMU_THUNK_LIB_H__
-
-#include <Protocol/EmuThunk.h>
-
-
-extern EMU_THUNK_PROTOCOL *gEmuThunk;
-
-
-/**
- Serach the EMU IO Thunk database for a matching EMU IO Thunk
- Protocol instance.
-
- @param Protocol Protocol to search for.
- @param Instance Instance of protocol to search for.
-
- @retval NULL Protocol and Instance not found.
- @retval other EMU IO Thunk protocol that matched.
-
-**/
-EMU_IO_THUNK_PROTOCOL *
-EFIAPI
-GetIoThunkInstance (
- IN EFI_GUID *Protocol,
- IN UINTN Instance
- );
-
-
-#endif
+/*++ @file
+
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __EMU_THUNK_LIB_H__
+#define __EMU_THUNK_LIB_H__
+
+#include <Protocol/EmuThunk.h>
+
+
+extern EMU_THUNK_PROTOCOL *gEmuThunk;
+
+
+/**
+ Serach the EMU IO Thunk database for a matching EMU IO Thunk
+ Protocol instance.
+
+ @param Protocol Protocol to search for.
+ @param Instance Instance of protocol to search for.
+
+ @retval NULL Protocol and Instance not found.
+ @retval other EMU IO Thunk protocol that matched.
+
+**/
+EMU_IO_THUNK_PROTOCOL *
+EFIAPI
+GetIoThunkInstance (
+ IN EFI_GUID *Protocol,
+ IN UINTN Instance
+ );
+
+
+#endif
diff --git a/EmulatorPkg/Include/Library/PpiListLib.h b/EmulatorPkg/Include/Library/PpiListLib.h
index c1271b23c8..fad1473a41 100644
--- a/EmulatorPkg/Include/Library/PpiListLib.h
+++ b/EmulatorPkg/Include/Library/PpiListLib.h
@@ -1,21 +1,21 @@
-/*++ @file
-
-Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef __PPI_LIST_LIB_H__
-#define __PPI_LIST_LIB_H__
-
-
-extern CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList;
-
-
-#endif
+/*++ @file
+
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __PPI_LIST_LIB_H__
+#define __PPI_LIST_LIB_H__
+
+
+extern CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList;
+
+
+#endif
diff --git a/EmulatorPkg/Include/Library/SmbiosLib.h b/EmulatorPkg/Include/Library/SmbiosLib.h
index 8ee14e07dd..6dcb7336d5 100644
--- a/EmulatorPkg/Include/Library/SmbiosLib.h
+++ b/EmulatorPkg/Include/Library/SmbiosLib.h
@@ -1,202 +1,202 @@
-/** @file
- Provides library functions for common SMBIOS operations. Only available to DXE
- and UEFI module types.
-
-
-Copyright (c) 2012, Apple Inc. All rights reserved.
-Portitions Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials are licensed and made available under
-the terms and conditions of the BSD License that accompanies this distribution.
-The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php.
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _SMBIOS_LIB_H__
-#define _SMBIOS_LIB_H__
-
-#include <IndustryStandard/SmBios.h>
-#include <Protocol/Smbios.h>
-
-
-///
-/// Cache copy of the SMBIOS Protocol pointer
-///
-extern EFI_SMBIOS_PROTOCOL *gSmbios;
-
-
-///
-/// Template for SMBIOS table initialization.
-/// The SMBIOS_TABLE_STRING types in the formated area must match the
-/// StringArray sequene.
-///
-typedef struct {
- //
- // formatted area of a given SMBIOS record
- //
- SMBIOS_STRUCTURE *Entry;
- //
- // NULL terminated array of ASCII strings to be added to the SMBIOS record.
- //
- CHAR8 **StringArray;
-} SMBIOS_TEMPLATE_ENTRY;
-
-
-/**
- Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
- entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
-
- @param Template Array of SMBIOS_TEMPLATE_ENTRY entries.
-
- @retval EFI_SUCCESS New SMBIOS tables were created.
- @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.
-**/
-EFI_STATUS
-EFIAPI
-SmbiosLibInitializeFromTemplate (
- IN SMBIOS_TEMPLATE_ENTRY *Template
- );
-
-
-
-/**
- Create SMBIOS record.
-
- Converts a fixed SMBIOS structure and an array of pointers to strings into
- an SMBIOS record where the strings are cat'ed on the end of the fixed record
- and terminated via a double NULL and add to SMBIOS table.
-
- SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
- { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof (SMBIOS_TABLE_TYPE12), 0 },
- 1 // StringCount
- };
- CHAR8 *gSmbiosType12Strings[] = {
- "Not Found",
- NULL
- };
-
- ...
- AddSmbiosEntryFromTemplate (
- (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
- gSmbiosType12Strings
- );
-
- @param SmbiosEntry Fixed SMBIOS structure
- @param StringArray Array of strings to convert to an SMBIOS string pack.
- NULL is OK.
-
- @retval EFI_SUCCESS New SmbiosEntry was added to SMBIOS table.
- @retval EFI_OUT_OF_RESOURCES SmbiosEntry was not added.
-**/
-EFI_STATUS
-EFIAPI
-SmbiosLibCreateEntry (
- IN SMBIOS_STRUCTURE *SmbiosEntry,
- IN CHAR8 **StringArray
- );
-
-
-/**
- Update the string associated with an existing SMBIOS record.
-
- This function allows the update of specific SMBIOS strings. The number of valid strings for any
- SMBIOS record is defined by how many strings were present when Add() was called.
-
- @param[in] SmbiosHandle SMBIOS Handle of structure that will have its string updated.
- @param[in] StringNumber The non-zero string number of the string to update.
- @param[in] String Update the StringNumber string with String.
-
- @retval EFI_SUCCESS SmbiosHandle had its StringNumber String updated.
- @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
- @retval EFI_UNSUPPORTED String was not added because it is longer than the SMBIOS Table supports.
- @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS record.
-**/
-EFI_STATUS
-EFIAPI
-SmbiosLibUpdateString (
- IN EFI_SMBIOS_HANDLE SmbiosHandle,
- IN SMBIOS_TABLE_STRING StringNumber,
- IN CHAR8 *String
- );
-
-/**
- Update the string associated with an existing SMBIOS record.
-
- This function allows the update of specific SMBIOS strings. The number of valid strings for any
- SMBIOS record is defined by how many strings were present when Add() was called.
-
- @param[in] SmbiosHandle SMBIOS Handle of structure that will have its string updated.
- @param[in] StringNumber The non-zero string number of the string to update.
- @param[in] String Update the StringNumber string with String.
-
- @retval EFI_SUCCESS SmbiosHandle had its StringNumber String updated.
- @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
- @retval EFI_UNSUPPORTED String was not added because it is longer than the SMBIOS Table supports.
- @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS record.
-**/
-EFI_STATUS
-EFIAPI
-SmbiosLibUpdateUnicodeString (
- IN EFI_SMBIOS_HANDLE SmbiosHandle,
- IN SMBIOS_TABLE_STRING StringNumber,
- IN CHAR16 *String
- );
-
-/**
- Allow caller to read a specific SMBIOS string
-
- @param[in] Header SMBIOS record that contains the string.
- @param[in[ StringNumber Instance of SMBIOS string 1 - N.
-
- @retval NULL Instance of Type SMBIOS string was not found.
- @retval Other Pointer to matching SMBIOS string.
-**/
-CHAR8 *
-EFIAPI
-SmbiosLibReadString (
- IN SMBIOS_STRUCTURE *Header,
- IN EFI_SMBIOS_STRING StringNumber
- );
-
-
-/**
- Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
-
- @param[in] Type Type of the next SMBIOS record to return.
- @param[in[ Instance Instance of SMBIOS record 0 - N-1.
- @param[out] SmbiosHandle Returns SMBIOS handle for the matching record.
-
- @retval NULL Instance of Type SMBIOS record was not found.
- @retval Other Pointer to matching SMBIOS record.
-**/
-SMBIOS_STRUCTURE *
-EFIAPI
-SmbiosLibGetRecord (
- IN EFI_SMBIOS_TYPE Type,
- IN UINTN Instance,
- OUT EFI_SMBIOS_HANDLE *SmbiosHandle
- );
-
-/**
- Remove an SMBIOS record.
-
- This function removes an SMBIOS record using the handle specified by SmbiosHandle.
-
- @param[in] SmbiosHandle The handle of the SMBIOS record to remove.
-
- @retval EFI_SUCCESS SMBIOS record was removed.
- @retval EFI_INVALID_PARAMETER SmbiosHandle does not specify a valid SMBIOS record.
-**/
-EFI_STATUS
-EFIAPI
-SmbiosLibRemove (
- OUT EFI_SMBIOS_HANDLE SmbiosHandle
- );
-
-
-
-
-#endif
+/** @file
+ Provides library functions for common SMBIOS operations. Only available to DXE
+ and UEFI module types.
+
+
+Copyright (c) 2012, Apple Inc. All rights reserved.
+Portitions Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials are licensed and made available under
+the terms and conditions of the BSD License that accompanies this distribution.
+The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php.
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef _SMBIOS_LIB_H__
+#define _SMBIOS_LIB_H__
+
+#include <IndustryStandard/SmBios.h>
+#include <Protocol/Smbios.h>
+
+
+///
+/// Cache copy of the SMBIOS Protocol pointer
+///
+extern EFI_SMBIOS_PROTOCOL *gSmbios;
+
+
+///
+/// Template for SMBIOS table initialization.
+/// The SMBIOS_TABLE_STRING types in the formated area must match the
+/// StringArray sequene.
+///
+typedef struct {
+ //
+ // formatted area of a given SMBIOS record
+ //
+ SMBIOS_STRUCTURE *Entry;
+ //
+ // NULL terminated array of ASCII strings to be added to the SMBIOS record.
+ //
+ CHAR8 **StringArray;
+} SMBIOS_TEMPLATE_ENTRY;
+
+
+/**
+ Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
+ entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
+
+ @param Template Array of SMBIOS_TEMPLATE_ENTRY entries.
+
+ @retval EFI_SUCCESS New SMBIOS tables were created.
+ @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.
+**/
+EFI_STATUS
+EFIAPI
+SmbiosLibInitializeFromTemplate (
+ IN SMBIOS_TEMPLATE_ENTRY *Template
+ );
+
+
+
+/**
+ Create SMBIOS record.
+
+ Converts a fixed SMBIOS structure and an array of pointers to strings into
+ an SMBIOS record where the strings are cat'ed on the end of the fixed record
+ and terminated via a double NULL and add to SMBIOS table.
+
+ SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
+ { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof (SMBIOS_TABLE_TYPE12), 0 },
+ 1 // StringCount
+ };
+ CHAR8 *gSmbiosType12Strings[] = {
+ "Not Found",
+ NULL
+ };
+
+ ...
+ AddSmbiosEntryFromTemplate (
+ (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
+ gSmbiosType12Strings
+ );
+
+ @param SmbiosEntry Fixed SMBIOS structure
+ @param StringArray Array of strings to convert to an SMBIOS string pack.
+ NULL is OK.
+
+ @retval EFI_SUCCESS New SmbiosEntry was added to SMBIOS table.
+ @retval EFI_OUT_OF_RESOURCES SmbiosEntry was not added.
+**/
+EFI_STATUS
+EFIAPI
+SmbiosLibCreateEntry (
+ IN SMBIOS_STRUCTURE *SmbiosEntry,
+ IN CHAR8 **StringArray
+ );
+
+
+/**
+ Update the string associated with an existing SMBIOS record.
+
+ This function allows the update of specific SMBIOS strings. The number of valid strings for any
+ SMBIOS record is defined by how many strings were present when Add() was called.
+
+ @param[in] SmbiosHandle SMBIOS Handle of structure that will have its string updated.
+ @param[in] StringNumber The non-zero string number of the string to update.
+ @param[in] String Update the StringNumber string with String.
+
+ @retval EFI_SUCCESS SmbiosHandle had its StringNumber String updated.
+ @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
+ @retval EFI_UNSUPPORTED String was not added because it is longer than the SMBIOS Table supports.
+ @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS record.
+**/
+EFI_STATUS
+EFIAPI
+SmbiosLibUpdateString (
+ IN EFI_SMBIOS_HANDLE SmbiosHandle,
+ IN SMBIOS_TABLE_STRING StringNumber,
+ IN CHAR8 *String
+ );
+
+/**
+ Update the string associated with an existing SMBIOS record.
+
+ This function allows the update of specific SMBIOS strings. The number of valid strings for any
+ SMBIOS record is defined by how many strings were present when Add() was called.
+
+ @param[in] SmbiosHandle SMBIOS Handle of structure that will have its string updated.
+ @param[in] StringNumber The non-zero string number of the string to update.
+ @param[in] String Update the StringNumber string with String.
+
+ @retval EFI_SUCCESS SmbiosHandle had its StringNumber String updated.
+ @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
+ @retval EFI_UNSUPPORTED String was not added because it is longer than the SMBIOS Table supports.
+ @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS record.
+**/
+EFI_STATUS
+EFIAPI
+SmbiosLibUpdateUnicodeString (
+ IN EFI_SMBIOS_HANDLE SmbiosHandle,
+ IN SMBIOS_TABLE_STRING StringNumber,
+ IN CHAR16 *String
+ );
+
+/**
+ Allow caller to read a specific SMBIOS string
+
+ @param[in] Header SMBIOS record that contains the string.
+ @param[in[ StringNumber Instance of SMBIOS string 1 - N.
+
+ @retval NULL Instance of Type SMBIOS string was not found.
+ @retval Other Pointer to matching SMBIOS string.
+**/
+CHAR8 *
+EFIAPI
+SmbiosLibReadString (
+ IN SMBIOS_STRUCTURE *Header,
+ IN EFI_SMBIOS_STRING StringNumber
+ );
+
+
+/**
+ Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
+
+ @param[in] Type Type of the next SMBIOS record to return.
+ @param[in[ Instance Instance of SMBIOS record 0 - N-1.
+ @param[out] SmbiosHandle Returns SMBIOS handle for the matching record.
+
+ @retval NULL Instance of Type SMBIOS record was not found.
+ @retval Other Pointer to matching SMBIOS record.
+**/
+SMBIOS_STRUCTURE *
+EFIAPI
+SmbiosLibGetRecord (
+ IN EFI_SMBIOS_TYPE Type,
+ IN UINTN Instance,
+ OUT EFI_SMBIOS_HANDLE *SmbiosHandle
+ );
+
+/**
+ Remove an SMBIOS record.
+
+ This function removes an SMBIOS record using the handle specified by SmbiosHandle.
+
+ @param[in] SmbiosHandle The handle of the SMBIOS record to remove.
+
+ @retval EFI_SUCCESS SMBIOS record was removed.
+ @retval EFI_INVALID_PARAMETER SmbiosHandle does not specify a valid SMBIOS record.
+**/
+EFI_STATUS
+EFIAPI
+SmbiosLibRemove (
+ OUT EFI_SMBIOS_HANDLE SmbiosHandle
+ );
+
+
+
+
+#endif
diff --git a/EmulatorPkg/Include/Protocol/EmuBlockIo.h b/EmulatorPkg/Include/Protocol/EmuBlockIo.h
index 8e5463c74e..45ca5b9a7a 100644
--- a/EmulatorPkg/Include/Protocol/EmuBlockIo.h
+++ b/EmulatorPkg/Include/Protocol/EmuBlockIo.h
@@ -62,7 +62,7 @@ EFI_STATUS
@param[in] MediaId Id of the media, changes every time the media is
replaced.
@param[in] Lba The starting Logical Block Address to read from.
- @param[in, out] Token A pointer to the token associated with the transaction.
+ @param[in, out] Token A pointer to the token associated with the transaction.
@param[in] BufferSize Size of Buffer, must be a multiple of device block size.
@param[out] Buffer A pointer to the destination buffer for the data. The
caller is responsible for either having implicit or
diff --git a/EmulatorPkg/Include/Protocol/EmuFileSystem.h b/EmulatorPkg/Include/Protocol/EmuFileSystem.h
index 6d8717479b..d13853877e 100644
--- a/EmulatorPkg/Include/Protocol/EmuFileSystem.h
+++ b/EmulatorPkg/Include/Protocol/EmuFileSystem.h
@@ -1,140 +1,140 @@
-/** @file
- SimpleFileSystem protocol as defined in the UEFI 2.0 specification.
-
- The SimpleFileSystem protocol is the programmatic access to the FAT (12,16,32)
- file system specified in UEFI 2.0. It can also be used to abstract a file
- system other than FAT.
-
- UEFI 2.0 can boot from any valid EFI image contained in a SimpleFileSystem.
-
-Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
-Portions copyright (c) 2011, Apple Inc. All rights reserved.
-This program and the accompanying materials are licensed and made available under
-the terms and conditions of the BSD License that accompanies this distribution.
-The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php.
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _EMU_UGA_IO_H_
-#define _EMU_UGA_IO_H_
-
-#include <Protocol/SimplePointer.h>
-#include <Protocol/SimpleTextIn.h>
-#include <Protocol/SimpleTextInEx.h>
-#include <Protocol/UgaDraw.h>
-
-#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
- { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA, 0xC1 } }
-
-typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL EMU_GRAPHICS_WINDOW_PROTOCOL;
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
- EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
- );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
- EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
- UINT32 Width,
- UINT32 Height
- );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
- EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
- );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
- EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
- EFI_KEY_DATA *key
- );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
- IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
- IN EFI_KEY_TOGGLE_STATE *KeyToggleState
- );
-
-
-typedef
-VOID
-(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
- IN VOID *Context,
- IN EFI_KEY_DATA *KeyData
- );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
- IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
- IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK CallBack,
- IN VOID *Context
- );
-
-
-typedef struct {
- UINTN SourceX;
- UINTN SourceY;
- UINTN DestinationX;
- UINTN DestinationY;
- UINTN Width;
- UINTN Height;
- UINTN Delta;
-} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
- IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
- IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
- IN EFI_UGA_BLT_OPERATION BltOperation,
- IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args
- );
-
-typedef
-BOOLEAN
-(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
- IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
- IN EFI_KEY_DATA *KeyData
- );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
- EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
- );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
- EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
- EFI_SIMPLE_POINTER_STATE *state
- );
-
-struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
- EMU_GRAPHICS_WINDOWS_SIZE Size;
- EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey;
- EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState;
- EMU_GRAPHICS_WINDOWS_GET_KEY GetKey;
- EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify;
- EMU_GRAPHICS_WINDOWS_BLT Blt;
- EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed;
- EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer;
- EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState;
-};
-
-
-extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
-
-#endif
+/** @file
+ SimpleFileSystem protocol as defined in the UEFI 2.0 specification.
+
+ The SimpleFileSystem protocol is the programmatic access to the FAT (12,16,32)
+ file system specified in UEFI 2.0. It can also be used to abstract a file
+ system other than FAT.
+
+ UEFI 2.0 can boot from any valid EFI image contained in a SimpleFileSystem.
+
+Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
+Portions copyright (c) 2011, Apple Inc. All rights reserved.
+This program and the accompanying materials are licensed and made available under
+the terms and conditions of the BSD License that accompanies this distribution.
+The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php.
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef _EMU_UGA_IO_H_
+#define _EMU_UGA_IO_H_
+
+#include <Protocol/SimplePointer.h>
+#include <Protocol/SimpleTextIn.h>
+#include <Protocol/SimpleTextInEx.h>
+#include <Protocol/UgaDraw.h>
+
+#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
+ { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA, 0xC1 } }
+
+typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL EMU_GRAPHICS_WINDOW_PROTOCOL;
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
+ EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
+ );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
+ EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
+ UINT32 Width,
+ UINT32 Height
+ );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
+ EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
+ );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
+ EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
+ EFI_KEY_DATA *key
+ );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
+ IN EFI_KEY_TOGGLE_STATE *KeyToggleState
+ );
+
+
+typedef
+VOID
+(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
+ IN VOID *Context,
+ IN EFI_KEY_DATA *KeyData
+ );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
+ IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK CallBack,
+ IN VOID *Context
+ );
+
+
+typedef struct {
+ UINTN SourceX;
+ UINTN SourceY;
+ UINTN DestinationX;
+ UINTN DestinationY;
+ UINTN Width;
+ UINTN Height;
+ UINTN Delta;
+} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
+ IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
+ IN EFI_UGA_BLT_OPERATION BltOperation,
+ IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args
+ );
+
+typedef
+BOOLEAN
+(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
+ IN EFI_KEY_DATA *KeyData
+ );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
+ EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
+ );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
+ EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
+ EFI_SIMPLE_POINTER_STATE *state
+ );
+
+struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
+ EMU_GRAPHICS_WINDOWS_SIZE Size;
+ EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey;
+ EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState;
+ EMU_GRAPHICS_WINDOWS_GET_KEY GetKey;
+ EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify;
+ EMU_GRAPHICS_WINDOWS_BLT Blt;
+ EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed;
+ EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer;
+ EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState;
+};
+
+
+extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
+
+#endif
diff --git a/EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h b/EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h
index 844159a766..e502fc68da 100644
--- a/EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h
+++ b/EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h
@@ -1,134 +1,134 @@
-/*++ @file
-
-Copyright (c) 2006, Tristan Gingold. All rights reserved.<BR>
-Portitions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the
-BSD License which accompanies this distribution. The full text of the
-license may be found at http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _EMU_UGA_IO_H_
-#define _EMU_UGA_IO_H_
-
-#include <Protocol/SimplePointer.h>
-#include <Protocol/SimpleTextIn.h>
-#include <Protocol/SimpleTextInEx.h>
-#include <Protocol/UgaDraw.h>
-
-#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
- { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA, 0xC1 } }
-
-typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL EMU_GRAPHICS_WINDOW_PROTOCOL;
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
- EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
- );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
- EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
- UINT32 Width,
- UINT32 Height
- );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
- EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
- );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
- EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
- EFI_KEY_DATA *key
- );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
- IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
- IN EFI_KEY_TOGGLE_STATE *KeyToggleState
- );
-
-
-typedef
-VOID
-(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
- IN VOID *Context,
- IN EFI_KEY_DATA *KeyData
- );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
- IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
- IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK MakeCallBack,
- IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK BreakCallBack,
- IN VOID *Context
- );
-
-
-typedef struct {
- UINTN SourceX;
- UINTN SourceY;
- UINTN DestinationX;
- UINTN DestinationY;
- UINTN Width;
- UINTN Height;
- UINTN Delta;
-} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
- IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
- IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
- IN EFI_UGA_BLT_OPERATION BltOperation,
- IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args
- );
-
-typedef
-BOOLEAN
-(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
- IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
- IN EFI_KEY_DATA *KeyData
- );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
- EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
- );
-
-typedef
-EFI_STATUS
-(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
- EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
- EFI_SIMPLE_POINTER_STATE *state
- );
-
-struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
- EMU_GRAPHICS_WINDOWS_SIZE Size;
- EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey;
- EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState;
- EMU_GRAPHICS_WINDOWS_GET_KEY GetKey;
- EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify;
- EMU_GRAPHICS_WINDOWS_BLT Blt;
- EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed;
- EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer;
- EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState;
-};
-
-
-extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
-
-#endif
+/*++ @file
+
+Copyright (c) 2006, Tristan Gingold. All rights reserved.<BR>
+Portitions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the
+BSD License which accompanies this distribution. The full text of the
+license may be found at http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef _EMU_UGA_IO_H_
+#define _EMU_UGA_IO_H_
+
+#include <Protocol/SimplePointer.h>
+#include <Protocol/SimpleTextIn.h>
+#include <Protocol/SimpleTextInEx.h>
+#include <Protocol/UgaDraw.h>
+
+#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
+ { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA, 0xC1 } }
+
+typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL EMU_GRAPHICS_WINDOW_PROTOCOL;
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
+ EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
+ );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
+ EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
+ UINT32 Width,
+ UINT32 Height
+ );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
+ EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
+ );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
+ EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
+ EFI_KEY_DATA *key
+ );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
+ IN EFI_KEY_TOGGLE_STATE *KeyToggleState
+ );
+
+
+typedef
+VOID
+(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
+ IN VOID *Context,
+ IN EFI_KEY_DATA *KeyData
+ );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
+ IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK MakeCallBack,
+ IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK BreakCallBack,
+ IN VOID *Context
+ );
+
+
+typedef struct {
+ UINTN SourceX;
+ UINTN SourceY;
+ UINTN DestinationX;
+ UINTN DestinationY;
+ UINTN Width;
+ UINTN Height;
+ UINTN Delta;
+} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
+ IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
+ IN EFI_UGA_BLT_OPERATION BltOperation,
+ IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args
+ );
+
+typedef
+BOOLEAN
+(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
+ IN EFI_KEY_DATA *KeyData
+ );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
+ EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
+ );
+
+typedef
+EFI_STATUS
+(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
+ EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
+ EFI_SIMPLE_POINTER_STATE *state
+ );
+
+struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
+ EMU_GRAPHICS_WINDOWS_SIZE Size;
+ EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey;
+ EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState;
+ EMU_GRAPHICS_WINDOWS_GET_KEY GetKey;
+ EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify;
+ EMU_GRAPHICS_WINDOWS_BLT Blt;
+ EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed;
+ EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer;
+ EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState;
+};
+
+
+extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
+
+#endif
diff --git a/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c b/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c
index 7478a5ef2a..aa2066e132 100644
--- a/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c
+++ b/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c
@@ -180,4 +180,4 @@ DevicePathToTextLibConstructor (
DevicePathFromTextAddFilter (L"EmuThread", DevPathFromTextEmuThread);
DevicePathFromTextAddFilter (L"EmuFs", DevPathFromTextEmuFs);
return EFI_SUCCESS;
-}
\ No newline at end of file
+}
diff --git a/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf b/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf
index f5726785e1..c484f8ec16 100644
--- a/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf
+++ b/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf
@@ -45,4 +45,4 @@ [Protocols]
gEmuGraphicsWindowProtocolGuid
gEfiSimpleFileSystemProtocolGuid
gEmuBlockIoProtocolGuid
- gEmuThreadThunkProtocolGuid
\ No newline at end of file
+ gEmuThreadThunkProtocolGuid
diff --git a/EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c b/EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c
index 22f8da7b64..7dd2d49451 100644
--- a/EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c
+++ b/EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c
@@ -85,4 +85,4 @@ GetIoThunkInstance (
}
return NULL;
-}
\ No newline at end of file
+}
--git a/EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActionLib.inf b/EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActionLib.inf
index f79ebc78e2..682231b83e 100644
--- a/EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActionLib.inf
+++ b/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
+
diff --git a/EmulatorPkg/Library/DxeEmuStdErrSerialPortLib/DxeEmuStdErrSerialPortLib.c b/EmulatorPkg/Library/DxeEmuStdErrSerialPortLib/DxeEmuStdErrSerialPortLib.c
index 00d9f19369..6bd44bfd0d 100644
--- a/EmulatorPkg/Library/DxeEmuStdErrSerialPortLib/DxeEmuStdErrSerialPortLib.c
+++ b/EmulatorPkg/Library/DxeEmuStdErrSerialPortLib/DxeEmuStdErrSerialPortLib.c
@@ -69,7 +69,7 @@ SerialPortWrite (
if (gEmuThunk == NULL) {
return NumberOfBytes;
}
-
+
return gEmuThunk->WriteStdErr (Buffer, NumberOfBytes);
}
diff --git a/EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c b/EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c
index e555026601..b995266cc8 100644
--- a/EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c
+++ b/EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c
@@ -47,4 +47,4 @@ KeyMapBreak (
)
{
return EFI_SUCCESS;
-}
\ No newline at end of file
+}
diff --git a/EmulatorPkg/Library/PeiCoreServicesTablePointerLib/PeiServicesTablePointer.c b/EmulatorPkg/Library/PeiCoreServicesTablePointerLib/PeiServicesTablePointer.c
index 06f995b0d3..72b68c283c 100644
--- a/EmulatorPkg/Library/PeiCoreServicesTablePointerLib/PeiServicesTablePointer.c
+++ b/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;
--git a/EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraActionLib.inf b/EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraActionLib.inf
index 9a757f7294..fdaf19ab6c 100644
--- a/EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraActionLib.inf
+++ b/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
diff --git a/EmulatorPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c b/EmulatorPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c
index 5aaf296389..d79688820b 100644
--- a/EmulatorPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c
+++ b/EmulatorPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c
@@ -134,16 +134,16 @@ PeiServicesTablePointerLibConstructor (
}
/**
- Perform CPU specific actions required to migrate the PEI Services Table
+ Perform CPU specific actions required to migrate the PEI Services Table
pointer from temporary RAM to permanent RAM.
- For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
+ For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
immediately preceding the Interrupt Descriptor Table (IDT) in memory.
- For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
+ For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
immediately preceding the Interrupt Descriptor Table (IDT) in memory.
For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in
- a dedicated CPU register. This means that there is no memory storage
- associated with storing the PEI Services Table pointer, so no additional
+ a dedicated CPU register. This means that there is no memory storage
+ associated with storing the PEI Services Table pointer, so no additional
migration actions are required for Itanium or ARM CPUs.
**/
@@ -154,7 +154,7 @@ MigratePeiServicesTablePointer (
)
{
//
- // PEI Services Table pointer is cached in the global variable. No additional
+ // PEI Services Table pointer is cached in the global variable. No additional
// migration actions are required.
//
return;
diff --git a/EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTablePointer.c b/EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTablePointer.c
index fa04ed3e04..383460b342 100644
--- a/EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTablePointer.c
+++ b/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;
diff --git a/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf b/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf
index e473b52376..0f23178533 100644
--- a/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf
+++ b/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf
@@ -44,4 +44,4 @@ [LibraryClasses]
PeiServicesLib
[Ppis]
- gEmuThunkPpiGuid
\ No newline at end of file
+ gEmuThunkPpiGuid
diff --git a/EmulatorPkg/Library/SecPeiServicesLib/FwVol.c b/EmulatorPkg/Library/SecPeiServicesLib/FwVol.c
index 7fa4ddb594..a48f2b5f53 100644
--- a/EmulatorPkg/Library/SecPeiServicesLib/FwVol.c
+++ b/EmulatorPkg/Library/SecPeiServicesLib/FwVol.c
@@ -1,281 +1,281 @@
-/*++ @file
- A simple FV stack so the SEC can extract the SEC Core from an
- FV.
-
-Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include <PiPei.h>
-
-
-#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
- (ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1))
-
-EFI_FFS_FILE_STATE
-GetFileState (
- IN UINT8 ErasePolarity,
- IN EFI_FFS_FILE_HEADER *FfsHeader
- )
-/*++
-
-Routine Description:
- Returns the highest bit set of the State field
-
-Arguments:
- ErasePolarity - Erase Polarity as defined by EFI_FVB2_ERASE_POLARITY
- in the Attributes field.
- FfsHeader - Pointer to FFS File Header.
-
-Returns:
- Returns the highest bit in the State field
-
-**/
-{
- EFI_FFS_FILE_STATE FileState;
- EFI_FFS_FILE_STATE HighestBit;
-
- FileState = FfsHeader->State;
-
- if (ErasePolarity != 0) {
- FileState = (EFI_FFS_FILE_STATE)~FileState;
- }
-
- HighestBit = 0x80;
- while (HighestBit != 0 && (HighestBit & FileState) == 0) {
- HighestBit >>= 1;
- }
-
- return HighestBit;
-}
-
-UINT8
-CalculateHeaderChecksum (
- IN EFI_FFS_FILE_HEADER *FileHeader
- )
-/*++
-
-Routine Description:
- Calculates the checksum of the header of a file.
-
-Arguments:
- FileHeader - Pointer to FFS File Header.
-
-Returns:
- Checksum of the header.
-
-**/
-{
- UINT8 *ptr;
- UINTN Index;
- UINT8 Sum;
-
- Sum = 0;
- ptr = (UINT8 *) FileHeader;
-
- for (Index = 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index += 4) {
- Sum = (UINT8) (Sum + ptr[Index]);
- Sum = (UINT8) (Sum + ptr[Index + 1]);
- Sum = (UINT8) (Sum + ptr[Index + 2]);
- Sum = (UINT8) (Sum + ptr[Index + 3]);
- }
-
- for (; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) {
- Sum = (UINT8) (Sum + ptr[Index]);
- }
- //
- // State field (since this indicates the different state of file).
- //
- Sum = (UINT8) (Sum - FileHeader->State);
- //
- // Checksum field of the file is not part of the header checksum.
- //
- Sum = (UINT8) (Sum - FileHeader->IntegrityCheck.Checksum.File);
-
- return Sum;
-}
-
-EFI_STATUS
-SecFfsFindNextFile (
- IN EFI_FV_FILETYPE SearchType,
- IN EFI_PEI_FV_HANDLE FvHandle,
- IN OUT EFI_PEI_FILE_HANDLE *FileHandle
- )
-/*++
-
-Routine Description:
- Given the input file pointer, search for the next matching file in the
- FFS volume as defined by SearchType. The search starts from FileHeader inside
- the Firmware Volume defined by FwVolHeader.
-
-Arguments:
- SearchType - Filter to find only files of this type.
- Type EFI_FV_FILETYPE_ALL causes no filtering to be done.
- FwVolHeader - Pointer to the FV header of the volume to search.
- This parameter must point to a valid FFS volume.
- FileHeader - Pointer to the current file from which to begin searching.
- This pointer will be updated upon return to reflect the file
- found.
-
-Returns:
- EFI_NOT_FOUND - No files matching the search criteria were found
- EFI_SUCCESS
-
-**/
-{
- EFI_FFS_FILE_HEADER *FfsFileHeader;
- UINT32 FileLength;
- UINT32 FileOccupiedSize;
- UINT32 FileOffset;
- UINT64 FvLength;
- UINT8 ErasePolarity;
- UINT8 FileState;
- EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;
- EFI_FFS_FILE_HEADER **FileHeader;
-
- //
- // Convert the handle of FV to FV header for memory-mapped firmware volume
- //
- FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) FvHandle;
- FileHeader = (EFI_FFS_FILE_HEADER **)FileHandle;
-
- FvLength = FwVolHeader->FvLength;
- if (FwVolHeader->Attributes & EFI_FVB2_ERASE_POLARITY) {
- ErasePolarity = 1;
- } else {
- ErasePolarity = 0;
- }
- //
- // If FileHeader is not specified (NULL) start with the first file in the
- // firmware volume. Otherwise, start from the FileHeader.
- //
- if (*FileHeader == NULL) {
- FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FwVolHeader + FwVolHeader->HeaderLength);
- } else {
- //
- // Length is 24 bits wide so mask upper 8 bits
- // FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.
- //
- FileLength = *(UINT32 *) (*FileHeader)->Size & 0x00FFFFFF;
- FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
- FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) *FileHeader + FileOccupiedSize);
- }
-
- FileOffset = (UINT32) ((UINT8 *) FfsFileHeader - (UINT8 *) FwVolHeader);
-
- while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) {
- //
- // Get FileState which is the highest bit of the State
- //
- FileState = GetFileState (ErasePolarity, FfsFileHeader);
-
- switch (FileState) {
-
- case EFI_FILE_HEADER_INVALID:
- FileOffset += sizeof (EFI_FFS_FILE_HEADER);
- FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER));
- break;
-
- case EFI_FILE_DATA_VALID:
- case EFI_FILE_MARKED_FOR_UPDATE:
- if (CalculateHeaderChecksum (FfsFileHeader) == 0) {
- FileLength = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
- FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
-
- if ((SearchType == FfsFileHeader->Type) || (SearchType == EFI_FV_FILETYPE_ALL)) {
-
- *FileHeader = FfsFileHeader;
-
- return EFI_SUCCESS;
- }
-
- FileOffset += FileOccupiedSize;
- FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + FileOccupiedSize);
- } else {
- return EFI_NOT_FOUND;
- }
- break;
-
- case EFI_FILE_DELETED:
- FileLength = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
- FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
- FileOffset += FileOccupiedSize;
- FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + FileOccupiedSize);
- break;
-
- default:
- return EFI_NOT_FOUND;
-
- }
- }
-
- return EFI_NOT_FOUND;
-}
-
-EFI_STATUS
-SecFfsFindSectionData (
- IN EFI_SECTION_TYPE SectionType,
- IN EFI_FFS_FILE_HEADER *FfsFileHeader,
- IN OUT VOID **SectionData
- )
-/*++
-
-Routine Description:
- Given the input file pointer, search for the next matching section in the
- FFS volume.
-
-Arguments:
- SearchType - Filter to find only sections of this type.
- FfsFileHeader - Pointer to the current file to search.
- SectionData - Pointer to the Section matching SectionType in FfsFileHeader.
- NULL if section not found
-
-Returns:
- EFI_NOT_FOUND - No files matching the search criteria were found
- EFI_SUCCESS
-
-**/
-{
- UINT32 FileSize;
- EFI_COMMON_SECTION_HEADER *Section;
- UINT32 SectionLength;
- UINT32 ParsedLength;
-
- //
- // Size is 24 bits wide so mask upper 8 bits.
- // Does not include FfsFileHeader header size
- // FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
- //
- Section = (EFI_COMMON_SECTION_HEADER *) (FfsFileHeader + 1);
- FileSize = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
- FileSize -= sizeof (EFI_FFS_FILE_HEADER);
-
- *SectionData = NULL;
- ParsedLength = 0;
- while (ParsedLength < FileSize) {
- if (Section->Type == SectionType) {
- *SectionData = (VOID *) (Section + 1);
- return EFI_SUCCESS;
- }
- //
- // Size is 24 bits wide so mask upper 8 bits.
- // SectionLength is adjusted it is 4 byte aligned.
- // Go to the next section
- //
- SectionLength = *(UINT32 *) Section->Size & 0x00FFFFFF;
- SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
-
- ParsedLength += SectionLength;
- Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + SectionLength);
- }
-
- return EFI_NOT_FOUND;
-}
-
+/*++ @file
+ A simple FV stack so the SEC can extract the SEC Core from an
+ FV.
+
+Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <PiPei.h>
+
+
+#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
+ (ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1))
+
+EFI_FFS_FILE_STATE
+GetFileState (
+ IN UINT8 ErasePolarity,
+ IN EFI_FFS_FILE_HEADER *FfsHeader
+ )
+/*++
+
+Routine Description:
+ Returns the highest bit set of the State field
+
+Arguments:
+ ErasePolarity - Erase Polarity as defined by EFI_FVB2_ERASE_POLARITY
+ in the Attributes field.
+ FfsHeader - Pointer to FFS File Header.
+
+Returns:
+ Returns the highest bit in the State field
+
+**/
+{
+ EFI_FFS_FILE_STATE FileState;
+ EFI_FFS_FILE_STATE HighestBit;
+
+ FileState = FfsHeader->State;
+
+ if (ErasePolarity != 0) {
+ FileState = (EFI_FFS_FILE_STATE)~FileState;
+ }
+
+ HighestBit = 0x80;
+ while (HighestBit != 0 && (HighestBit & FileState) == 0) {
+ HighestBit >>= 1;
+ }
+
+ return HighestBit;
+}
+
+UINT8
+CalculateHeaderChecksum (
+ IN EFI_FFS_FILE_HEADER *FileHeader
+ )
+/*++
+
+Routine Description:
+ Calculates the checksum of the header of a file.
+
+Arguments:
+ FileHeader - Pointer to FFS File Header.
+
+Returns:
+ Checksum of the header.
+
+**/
+{
+ UINT8 *ptr;
+ UINTN Index;
+ UINT8 Sum;
+
+ Sum = 0;
+ ptr = (UINT8 *) FileHeader;
+
+ for (Index = 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index += 4) {
+ Sum = (UINT8) (Sum + ptr[Index]);
+ Sum = (UINT8) (Sum + ptr[Index + 1]);
+ Sum = (UINT8) (Sum + ptr[Index + 2]);
+ Sum = (UINT8) (Sum + ptr[Index + 3]);
+ }
+
+ for (; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) {
+ Sum = (UINT8) (Sum + ptr[Index]);
+ }
+ //
+ // State field (since this indicates the different state of file).
+ //
+ Sum = (UINT8) (Sum - FileHeader->State);
+ //
+ // Checksum field of the file is not part of the header checksum.
+ //
+ Sum = (UINT8) (Sum - FileHeader->IntegrityCheck.Checksum.File);
+
+ return Sum;
+}
+
+EFI_STATUS
+SecFfsFindNextFile (
+ IN EFI_FV_FILETYPE SearchType,
+ IN EFI_PEI_FV_HANDLE FvHandle,
+ IN OUT EFI_PEI_FILE_HANDLE *FileHandle
+ )
+/*++
+
+Routine Description:
+ Given the input file pointer, search for the next matching file in the
+ FFS volume as defined by SearchType. The search starts from FileHeader inside
+ the Firmware Volume defined by FwVolHeader.
+
+Arguments:
+ SearchType - Filter to find only files of this type.
+ Type EFI_FV_FILETYPE_ALL causes no filtering to be done.
+ FwVolHeader - Pointer to the FV header of the volume to search.
+ This parameter must point to a valid FFS volume.
+ FileHeader - Pointer to the current file from which to begin searching.
+ This pointer will be updated upon return to reflect the file
+ found.
+
+Returns:
+ EFI_NOT_FOUND - No files matching the search criteria were found
+ EFI_SUCCESS
+
+**/
+{
+ EFI_FFS_FILE_HEADER *FfsFileHeader;
+ UINT32 FileLength;
+ UINT32 FileOccupiedSize;
+ UINT32 FileOffset;
+ UINT64 FvLength;
+ UINT8 ErasePolarity;
+ UINT8 FileState;
+ EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;
+ EFI_FFS_FILE_HEADER **FileHeader;
+
+ //
+ // Convert the handle of FV to FV header for memory-mapped firmware volume
+ //
+ FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) FvHandle;
+ FileHeader = (EFI_FFS_FILE_HEADER **)FileHandle;
+
+ FvLength = FwVolHeader->FvLength;
+ if (FwVolHeader->Attributes & EFI_FVB2_ERASE_POLARITY) {
+ ErasePolarity = 1;
+ } else {
+ ErasePolarity = 0;
+ }
+ //
+ // If FileHeader is not specified (NULL) start with the first file in the
+ // firmware volume. Otherwise, start from the FileHeader.
+ //
+ if (*FileHeader == NULL) {
+ FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FwVolHeader + FwVolHeader->HeaderLength);
+ } else {
+ //
+ // Length is 24 bits wide so mask upper 8 bits
+ // FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.
+ //
+ FileLength = *(UINT32 *) (*FileHeader)->Size & 0x00FFFFFF;
+ FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
+ FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) *FileHeader + FileOccupiedSize);
+ }
+
+ FileOffset = (UINT32) ((UINT8 *) FfsFileHeader - (UINT8 *) FwVolHeader);
+
+ while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) {
+ //
+ // Get FileState which is the highest bit of the State
+ //
+ FileState = GetFileState (ErasePolarity, FfsFileHeader);
+
+ switch (FileState) {
+
+ case EFI_FILE_HEADER_INVALID:
+ FileOffset += sizeof (EFI_FFS_FILE_HEADER);
+ FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER));
+ break;
+
+ case EFI_FILE_DATA_VALID:
+ case EFI_FILE_MARKED_FOR_UPDATE:
+ if (CalculateHeaderChecksum (FfsFileHeader) == 0) {
+ FileLength = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
+ FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
+
+ if ((SearchType == FfsFileHeader->Type) || (SearchType == EFI_FV_FILETYPE_ALL)) {
+
+ *FileHeader = FfsFileHeader;
+
+ return EFI_SUCCESS;
+ }
+
+ FileOffset += FileOccupiedSize;
+ FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + FileOccupiedSize);
+ } else {
+ return EFI_NOT_FOUND;
+ }
+ break;
+
+ case EFI_FILE_DELETED:
+ FileLength = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
+ FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
+ FileOffset += FileOccupiedSize;
+ FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + FileOccupiedSize);
+ break;
+
+ default:
+ return EFI_NOT_FOUND;
+
+ }
+ }
+
+ return EFI_NOT_FOUND;
+}
+
+EFI_STATUS
+SecFfsFindSectionData (
+ IN EFI_SECTION_TYPE SectionType,
+ IN EFI_FFS_FILE_HEADER *FfsFileHeader,
+ IN OUT VOID **SectionData
+ )
+/*++
+
+Routine Description:
+ Given the input file pointer, search for the next matching section in the
+ FFS volume.
+
+Arguments:
+ SearchType - Filter to find only sections of this type.
+ FfsFileHeader - Pointer to the current file to search.
+ SectionData - Pointer to the Section matching SectionType in FfsFileHeader.
+ NULL if section not found
+
+Returns:
+ EFI_NOT_FOUND - No files matching the search criteria were found
+ EFI_SUCCESS
+
+**/
+{
+ UINT32 FileSize;
+ EFI_COMMON_SECTION_HEADER *Section;
+ UINT32 SectionLength;
+ UINT32 ParsedLength;
+
+ //
+ // Size is 24 bits wide so mask upper 8 bits.
+ // Does not include FfsFileHeader header size
+ // FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
+ //
+ Section = (EFI_COMMON_SECTION_HEADER *) (FfsFileHeader + 1);
+ FileSize = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
+ FileSize -= sizeof (EFI_FFS_FILE_HEADER);
+
+ *SectionData = NULL;
+ ParsedLength = 0;
+ while (ParsedLength < FileSize) {
+ if (Section->Type == SectionType) {
+ *SectionData = (VOID *) (Section + 1);
+ return EFI_SUCCESS;
+ }
+ //
+ // Size is 24 bits wide so mask upper 8 bits.
+ // SectionLength is adjusted it is 4 byte aligned.
+ // Go to the next section
+ //
+ SectionLength = *(UINT32 *) Section->Size & 0x00FFFFFF;
+ SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
+
+ ParsedLength += SectionLength;
+ Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + SectionLength);
+ }
+
+ return EFI_NOT_FOUND;
+}
+
diff --git a/EmulatorPkg/Library/SecPpiListLib/PpiListLib.c b/EmulatorPkg/Library/SecPpiListLib/PpiListLib.c
index f9c0c3d677..b8c5504b70 100644
--- a/EmulatorPkg/Library/SecPpiListLib/PpiListLib.c
+++ b/EmulatorPkg/Library/SecPpiListLib/PpiListLib.c
@@ -1,17 +1,17 @@
-/*++ @file
-
-Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include <PiPei.h>
-
-CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList = NULL;
-
+/*++ @file
+
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <PiPei.h>
+
+CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList = NULL;
+
diff --git a/EmulatorPkg/Library/SmbiosLib/SmbiosLib.c b/EmulatorPkg/Library/SmbiosLib/SmbiosLib.c
index 3382d7d2a6..7bdadb32a3 100644
--- a/EmulatorPkg/Library/SmbiosLib/SmbiosLib.c
+++ b/EmulatorPkg/Library/SmbiosLib/SmbiosLib.c
@@ -1,352 +1,352 @@
-/** @file
- Provides library functions for common SMBIOS operations. Only available to DXE
- and UEFI module types.
-
-
-Copyright (c) 2012, Apple Inc. All rights reserved.
-Portitions Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
-This program and the accompanying materials are licensed and made available under
-the terms and conditions of the BSD License that accompanies this distribution.
-The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php.
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include <PiDxe.h>
-#include <Library/BaseLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/DebugLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiLib.h>
-#include <Library/SmbiosLib.h>
-
-
-EFI_SMBIOS_PROTOCOL *gSmbios = NULL;
-
-
-/**
- Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
- entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
-
- @param Template Array of SMBIOS_TEMPLATE_ENTRY entries.
-
- @retval EFI_SUCCESS New SMBIOS tables were created.
- @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.
-**/
-EFI_STATUS
-EFIAPI
-SmbiosLibInitializeFromTemplate (
- IN SMBIOS_TEMPLATE_ENTRY *Template
- )
-{
- EFI_STATUS Status;
- UINTN Index;
-
- if (Template == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- Status = EFI_SUCCESS;
-
- for (Index = 0; Template[Index].Entry != NULL; Index++) {
- Status = SmbiosLibCreateEntry (Template[Index].Entry, Template[Index].StringArray);
- }
-
- return Status;
-}
-
-
-
-/**
- Create SMBIOS record.
-
- Converts a fixed SMBIOS structure and an array of pointers to strings into
- an SMBIOS record where the strings are cat'ed on the end of the fixed record
- and terminated via a double NULL and add to SMBIOS table.
-
- SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
- { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof (SMBIOS_TABLE_TYPE12), 0 },
- 1 // StringCount
- };
- CHAR8 *gSmbiosType12Strings[] = {
- "Not Found",
- NULL
- };
-
- ...
- CreateSmbiosEntry (
- (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
- gSmbiosType12Strings
- );
-
- @param SmbiosEntry Fixed SMBIOS structure
- @param StringArray Array of strings to convert to an SMBIOS string pack.
- NULL is OK.
-
-**/
-EFI_STATUS
-EFIAPI
-SmbiosLibCreateEntry (
- IN SMBIOS_STRUCTURE *SmbiosEntry,
- IN CHAR8 **StringArray
- )
-{
- EFI_STATUS Status;
- EFI_SMBIOS_HANDLE SmbiosHandle;
- EFI_SMBIOS_TABLE_HEADER *Record;
- UINTN Index;
- UINTN StringSize;
- UINTN Size;
- CHAR8 *Str;
-
- // Calculate the size of the fixed record and optional string pack
- Size = SmbiosEntry->Length;
- if (StringArray == NULL) {
- Size += 2; // Min string section is double null
- } else if (StringArray[0] == NULL) {
- Size += 2; // Min string section is double null
- } else {
- for (Index = 0; StringArray[Index] != NULL; Index++) {
- StringSize = AsciiStrSize (StringArray[Index]);
- Size += StringSize;
- }
- // Don't forget the terminating double null
- Size += 1;
- }
-
- // Copy over Template
- Record = (EFI_SMBIOS_TABLE_HEADER *)AllocateZeroPool (Size);
- if (Record == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- CopyMem (Record, SmbiosEntry, SmbiosEntry->Length);
-
- if (StringArray != NULL) {
- // Append string pack
- Str = ((CHAR8 *)Record) + Record->Length;
- for (Index = 0; StringArray[Index] != NULL; Index++) {
- StringSize = AsciiStrSize (StringArray[Index]);
- CopyMem (Str, StringArray[Index], StringSize);
- Str += StringSize;
- }
- *Str = 0;
- }
-
- SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
- Status = gSmbios->Add (
- gSmbios,
- gImageHandle,
- &SmbiosHandle,
- Record
- );
-
- FreePool (Record);
- return Status;
-}
-
-
-
-/**
- Update the string associated with an existing SMBIOS record.
-
- This function allows the update of specific SMBIOS strings. The number of valid strings for any
- SMBIOS record is defined by how many strings were present when Add() was called.
-
- @param[in] SmbiosHandle SMBIOS Handle of structure that will have its string updated.
- @param[in] StringNumber The non-zero string number of the string to update.
- @param[in] String Update the StringNumber string with String.
-
- @retval EFI_SUCCESS SmbiosHandle had its StringNumber String updated.
- @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
- @retval EFI_UNSUPPORTED String was not added because it is longer than the SMBIOS Table supports.
- @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS record.
-**/
-EFI_STATUS
-EFIAPI
-SmbiosLibUpdateString (
- IN EFI_SMBIOS_HANDLE SmbiosHandle,
- IN SMBIOS_TABLE_STRING StringNumber,
- IN CHAR8 *String
- )
-{
- UINTN StringIndex;
-
- if (String == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (*String == '\0') {
- // A string with no data is not legal in SMBIOS
- return EFI_INVALID_PARAMETER;
- }
-
- StringIndex = StringNumber;
- return gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex, String);
-}
-
-
-/**
- Update the string associated with an existing SMBIOS record.
-
- This function allows the update of specific SMBIOS strings. The number of valid strings for any
- SMBIOS record is defined by how many strings were present when Add() was called.
-
- @param[in] SmbiosHandle SMBIOS Handle of structure that will have its string updated.
- @param[in] StringNumber The non-zero string number of the string to update.
- @param[in] String Update the StringNumber string with String.
-
- @retval EFI_SUCCESS SmbiosHandle had its StringNumber String updated.
- @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
- @retval EFI_UNSUPPORTED String was not added because it is longer than the SMBIOS Table supports.
- @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS record.
-**/
-EFI_STATUS
-EFIAPI
-SmbiosLibUpdateUnicodeString (
- IN EFI_SMBIOS_HANDLE SmbiosHandle,
- IN SMBIOS_TABLE_STRING StringNumber,
- IN CHAR16 *String
- )
-{
- EFI_STATUS Status;
- UINTN StringIndex;
- CHAR8 *Ascii;
-
- if (String == NULL) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (*String == '\0') {
- // A string with no data is not legal in SMBIOS
- return EFI_INVALID_PARAMETER;
- }
-
- Ascii = AllocateZeroPool (StrSize (String));
- if (Ascii == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- UnicodeStrToAsciiStr (String, Ascii);
-
- StringIndex = StringNumber;
- Status = gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex, Ascii);
-
- FreePool (Ascii);
- return Status;
-}
-
-
-/**
- Allow caller to read a specific SMBIOS string
-
- @param[in] Header SMBIOS record that contains the string.
- @param[in[ StringNumber Instance of SMBIOS string 1 - N.
-
- @retval NULL Instance of Type SMBIOS string was not found.
- @retval Other Pointer to matching SMBIOS string.
-**/
-CHAR8 *
-EFIAPI
-SmbiosLibReadString (
- IN SMBIOS_STRUCTURE *Header,
- IN EFI_SMBIOS_STRING StringNumber
- )
-{
- CHAR8 *Data;
- UINTN Match;
-
- Data = (CHAR8 *)Header + Header->Length;
- for (Match = 1;!(*Data == 0 && *(Data+1) == 0); ) {
- if (StringNumber == Match) {
- return Data;
- }
- Data++;
- if (*(Data - 1) == '\0') {
- Match++;
- }
- }
-
- return NULL;
-}
-
-
-/**
- Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
-
- @param[in] Type Type of the next SMBIOS record to return.
- @param[in[ Instance Instance of SMBIOS record 0 - N-1.
- @param[out] SmbiosHandle Returns SMBIOS handle for the matching record.
-
- @retval NULL Instance of Type SMBIOS record was not found.
- @retval Other Pointer to matching SMBIOS record.
-**/
-SMBIOS_STRUCTURE *
-EFIAPI
-SmbiosLibGetRecord (
- IN EFI_SMBIOS_TYPE Type,
- IN UINTN Instance,
- OUT EFI_SMBIOS_HANDLE *SmbiosHandle
- )
-{
- EFI_STATUS Status;
- EFI_SMBIOS_TABLE_HEADER *Record;
- UINTN Match;
-
- Match = 0;
- *SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
- do {
- Status = gSmbios->GetNext (gSmbios, SmbiosHandle, &Type, &Record, NULL);
- if (!EFI_ERROR (Status)) {
- if (Match == Instance) {
- return (SMBIOS_STRUCTURE *)Record;
- }
- Match++;
- }
- } while (!EFI_ERROR (Status));
-
- return NULL;
-}
-
-
-/**
- Remove an SMBIOS record.
-
- This function removes an SMBIOS record using the handle specified by SmbiosHandle.
-
- @param[in] SmbiosHandle The handle of the SMBIOS record to remove.
-
- @retval EFI_SUCCESS SMBIOS record was removed.
- @retval EFI_INVALID_PARAMETER SmbiosHandle does not specify a valid SMBIOS record.
-**/
-EFI_STATUS
-EFIAPI
-SmbiosLibRemove (
- OUT EFI_SMBIOS_HANDLE SmbiosHandle
- )
-{
- return gSmbios->Remove (gSmbios, SmbiosHandle);
-}
-
-
-
-/**
-
- @param ImageHandle ImageHandle of the loaded driver.
- @param SystemTable Pointer to the EFI System Table.
-
- @retval EFI_SUCCESS Register successfully.
- @retval EFI_OUT_OF_RESOURCES No enough memory to register this handler.
-**/
-EFI_STATUS
-EFIAPI
-SmbiosLibConstructor (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
-{
- return gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **)&gSmbios);
-}
-
+/** @file
+ Provides library functions for common SMBIOS operations. Only available to DXE
+ and UEFI module types.
+
+
+Copyright (c) 2012, Apple Inc. All rights reserved.
+Portitions Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
+This program and the accompanying materials are licensed and made available under
+the terms and conditions of the BSD License that accompanies this distribution.
+The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php.
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <PiDxe.h>
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiLib.h>
+#include <Library/SmbiosLib.h>
+
+
+EFI_SMBIOS_PROTOCOL *gSmbios = NULL;
+
+
+/**
+ Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
+ entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
+
+ @param Template Array of SMBIOS_TEMPLATE_ENTRY entries.
+
+ @retval EFI_SUCCESS New SMBIOS tables were created.
+ @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.
+**/
+EFI_STATUS
+EFIAPI
+SmbiosLibInitializeFromTemplate (
+ IN SMBIOS_TEMPLATE_ENTRY *Template
+ )
+{
+ EFI_STATUS Status;
+ UINTN Index;
+
+ if (Template == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Status = EFI_SUCCESS;
+
+ for (Index = 0; Template[Index].Entry != NULL; Index++) {
+ Status = SmbiosLibCreateEntry (Template[Index].Entry, Template[Index].StringArray);
+ }
+
+ return Status;
+}
+
+
+
+/**
+ Create SMBIOS record.
+
+ Converts a fixed SMBIOS structure and an array of pointers to strings into
+ an SMBIOS record where the strings are cat'ed on the end of the fixed record
+ and terminated via a double NULL and add to SMBIOS table.
+
+ SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
+ { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof (SMBIOS_TABLE_TYPE12), 0 },
+ 1 // StringCount
+ };
+ CHAR8 *gSmbiosType12Strings[] = {
+ "Not Found",
+ NULL
+ };
+
+ ...
+ CreateSmbiosEntry (
+ (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
+ gSmbiosType12Strings
+ );
+
+ @param SmbiosEntry Fixed SMBIOS structure
+ @param StringArray Array of strings to convert to an SMBIOS string pack.
+ NULL is OK.
+
+**/
+EFI_STATUS
+EFIAPI
+SmbiosLibCreateEntry (
+ IN SMBIOS_STRUCTURE *SmbiosEntry,
+ IN CHAR8 **StringArray
+ )
+{
+ EFI_STATUS Status;
+ EFI_SMBIOS_HANDLE SmbiosHandle;
+ EFI_SMBIOS_TABLE_HEADER *Record;
+ UINTN Index;
+ UINTN StringSize;
+ UINTN Size;
+ CHAR8 *Str;
+
+ // Calculate the size of the fixed record and optional string pack
+ Size = SmbiosEntry->Length;
+ if (StringArray == NULL) {
+ Size += 2; // Min string section is double null
+ } else if (StringArray[0] == NULL) {
+ Size += 2; // Min string section is double null
+ } else {
+ for (Index = 0; StringArray[Index] != NULL; Index++) {
+ StringSize = AsciiStrSize (StringArray[Index]);
+ Size += StringSize;
+ }
+ // Don't forget the terminating double null
+ Size += 1;
+ }
+
+ // Copy over Template
+ Record = (EFI_SMBIOS_TABLE_HEADER *)AllocateZeroPool (Size);
+ if (Record == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+ CopyMem (Record, SmbiosEntry, SmbiosEntry->Length);
+
+ if (StringArray != NULL) {
+ // Append string pack
+ Str = ((CHAR8 *)Record) + Record->Length;
+ for (Index = 0; StringArray[Index] != NULL; Index++) {
+ StringSize = AsciiStrSize (StringArray[Index]);
+ CopyMem (Str, StringArray[Index], StringSize);
+ Str += StringSize;
+ }
+ *Str = 0;
+ }
+
+ SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
+ Status = gSmbios->Add (
+ gSmbios,
+ gImageHandle,
+ &SmbiosHandle,
+ Record
+ );
+
+ FreePool (Record);
+ return Status;
+}
+
+
+
+/**
+ Update the string associated with an existing SMBIOS record.
+
+ This function allows the update of specific SMBIOS strings. The number of valid strings for any
+ SMBIOS record is defined by how many strings were present when Add() was called.
+
+ @param[in] SmbiosHandle SMBIOS Handle of structure that will have its string updated.
+ @param[in] StringNumber The non-zero string number of the string to update.
+ @param[in] String Update the StringNumber string with String.
+
+ @retval EFI_SUCCESS SmbiosHandle had its StringNumber String updated.
+ @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
+ @retval EFI_UNSUPPORTED String was not added because it is longer than the SMBIOS Table supports.
+ @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS record.
+**/
+EFI_STATUS
+EFIAPI
+SmbiosLibUpdateString (
+ IN EFI_SMBIOS_HANDLE SmbiosHandle,
+ IN SMBIOS_TABLE_STRING StringNumber,
+ IN CHAR8 *String
+ )
+{
+ UINTN StringIndex;
+
+ if (String == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (*String == '\0') {
+ // A string with no data is not legal in SMBIOS
+ return EFI_INVALID_PARAMETER;
+ }
+
+ StringIndex = StringNumber;
+ return gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex, String);
+}
+
+
+/**
+ Update the string associated with an existing SMBIOS record.
+
+ This function allows the update of specific SMBIOS strings. The number of valid strings for any
+ SMBIOS record is defined by how many strings were present when Add() was called.
+
+ @param[in] SmbiosHandle SMBIOS Handle of structure that will have its string updated.
+ @param[in] StringNumber The non-zero string number of the string to update.
+ @param[in] String Update the StringNumber string with String.
+
+ @retval EFI_SUCCESS SmbiosHandle had its StringNumber String updated.
+ @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is invalid.
+ @retval EFI_UNSUPPORTED String was not added because it is longer than the SMBIOS Table supports.
+ @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS record.
+**/
+EFI_STATUS
+EFIAPI
+SmbiosLibUpdateUnicodeString (
+ IN EFI_SMBIOS_HANDLE SmbiosHandle,
+ IN SMBIOS_TABLE_STRING StringNumber,
+ IN CHAR16 *String
+ )
+{
+ EFI_STATUS Status;
+ UINTN StringIndex;
+ CHAR8 *Ascii;
+
+ if (String == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (*String == '\0') {
+ // A string with no data is not legal in SMBIOS
+ return EFI_INVALID_PARAMETER;
+ }
+
+ Ascii = AllocateZeroPool (StrSize (String));
+ if (Ascii == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+ UnicodeStrToAsciiStr (String, Ascii);
+
+ StringIndex = StringNumber;
+ Status = gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex, Ascii);
+
+ FreePool (Ascii);
+ return Status;
+}
+
+
+/**
+ Allow caller to read a specific SMBIOS string
+
+ @param[in] Header SMBIOS record that contains the string.
+ @param[in[ StringNumber Instance of SMBIOS string 1 - N.
+
+ @retval NULL Instance of Type SMBIOS string was not found.
+ @retval Other Pointer to matching SMBIOS string.
+**/
+CHAR8 *
+EFIAPI
+SmbiosLibReadString (
+ IN SMBIOS_STRUCTURE *Header,
+ IN EFI_SMBIOS_STRING StringNumber
+ )
+{
+ CHAR8 *Data;
+ UINTN Match;
+
+ Data = (CHAR8 *)Header + Header->Length;
+ for (Match = 1;!(*Data == 0 && *(Data+1) == 0); ) {
+ if (StringNumber == Match) {
+ return Data;
+ }
+ Data++;
+ if (*(Data - 1) == '\0') {
+ Match++;
+ }
+ }
+
+ return NULL;
+}
+
+
+/**
+ Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
+
+ @param[in] Type Type of the next SMBIOS record to return.
+ @param[in[ Instance Instance of SMBIOS record 0 - N-1.
+ @param[out] SmbiosHandle Returns SMBIOS handle for the matching record.
+
+ @retval NULL Instance of Type SMBIOS record was not found.
+ @retval Other Pointer to matching SMBIOS record.
+**/
+SMBIOS_STRUCTURE *
+EFIAPI
+SmbiosLibGetRecord (
+ IN EFI_SMBIOS_TYPE Type,
+ IN UINTN Instance,
+ OUT EFI_SMBIOS_HANDLE *SmbiosHandle
+ )
+{
+ EFI_STATUS Status;
+ EFI_SMBIOS_TABLE_HEADER *Record;
+ UINTN Match;
+
+ Match = 0;
+ *SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
+ do {
+ Status = gSmbios->GetNext (gSmbios, SmbiosHandle, &Type, &Record, NULL);
+ if (!EFI_ERROR (Status)) {
+ if (Match == Instance) {
+ return (SMBIOS_STRUCTURE *)Record;
+ }
+ Match++;
+ }
+ } while (!EFI_ERROR (Status));
+
+ return NULL;
+}
+
+
+/**
+ Remove an SMBIOS record.
+
+ This function removes an SMBIOS record using the handle specified by SmbiosHandle.
+
+ @param[in] SmbiosHandle The handle of the SMBIOS record to remove.
+
+ @retval EFI_SUCCESS SMBIOS record was removed.
+ @retval EFI_INVALID_PARAMETER SmbiosHandle does not specify a valid SMBIOS record.
+**/
+EFI_STATUS
+EFIAPI
+SmbiosLibRemove (
+ OUT EFI_SMBIOS_HANDLE SmbiosHandle
+ )
+{
+ return gSmbios->Remove (gSmbios, SmbiosHandle);
+}
+
+
+
+/**
+
+ @param ImageHandle ImageHandle of the loaded driver.
+ @param SystemTable Pointer to the EFI System Table.
+
+ @retval EFI_SUCCESS Register successfully.
+ @retval EFI_OUT_OF_RESOURCES No enough memory to register this handler.
+**/
+EFI_STATUS
+EFIAPI
+SmbiosLibConstructor (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ return gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **)&gSmbios);
+}
+
diff --git a/EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf b/EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf
index 0593c47d48..8f4d4c6307 100644
--- a/EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf
+++ b/EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf
@@ -1,47 +1,47 @@
-## @file
-# SMBIOS Library
-#
-# Copyright (c) 2012, Apple Inc. All rights reserved.
-# Portions copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
-#
-# This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution. The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-#
-##
-
-[Defines]
- INF_VERSION = 0x00010005
- BASE_NAME = SmbiosLib
- FILE_GUID = 881863A2-09FD-3E44-8D62-7AE038D03747
- MODULE_TYPE = DXE_DRIVER
- VERSION_STRING = 1.0
- LIBRARY_CLASS = SmbiosLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER SMM_CORE UEFI_APPLICATION UEFI_DRIVER
-
- CONSTRUCTOR = SmbiosLibConstructor
-
-
-[Sources]
- SmbiosLib.c
-
-[Packages]
- MdePkg/MdePkg.dec
- EmulatorPkg/EmulatorPkg.dec
-
-[LibraryClasses]
- BaseLib
- BaseMemoryLib
- DebugLib
- MemoryAllocationLib
- UefiBootServicesTableLib
- UefiLib
-
-[Protocols]
- gEfiSmbiosProtocolGuid
-
-[Depex]
- gEfiSmbiosProtocolGuid
\ No newline at end of file
+## @file
+# SMBIOS Library
+#
+# Copyright (c) 2012, Apple Inc. All rights reserved.
+# Portions copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = SmbiosLib
+ FILE_GUID = 881863A2-09FD-3E44-8D62-7AE038D03747
+ MODULE_TYPE = DXE_DRIVER
+ VERSION_STRING = 1.0
+ LIBRARY_CLASS = SmbiosLib|DXE_CORE DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER SMM_CORE UEFI_APPLICATION UEFI_DRIVER
+
+ CONSTRUCTOR = SmbiosLibConstructor
+
+
+[Sources]
+ SmbiosLib.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ EmulatorPkg/EmulatorPkg.dec
+
+[LibraryClasses]
+ BaseLib
+ BaseMemoryLib
+ DebugLib
+ MemoryAllocationLib
+ UefiBootServicesTableLib
+ UefiLib
+
+[Protocols]
+ gEfiSmbiosProtocolGuid
+
+[Depex]
+ gEfiSmbiosProtocolGuid
diff --git a/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubClassDriver.h b/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubClassDriver.h
index c7749f3f17..e4d7cb67c8 100644
--- a/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubClassDriver.h
+++ b/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubClassDriver.h
@@ -112,8 +112,8 @@ extern EFI_HII_HANDLE mHiiHandle;
@param Smbios The EFI_SMBIOS_PROTOCOL instance.
@param SmbiosHandle A unique handle will be assigned to the SMBIOS record.
@param Record The data for the fixed portion of the SMBIOS record. The format of the record is
- determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted area is defined
- by EFI_SMBIOS_TABLE_HEADER.Length and either followed by a double-null (0x0000) or
+ determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted area is defined
+ by EFI_SMBIOS_TABLE_HEADER.Length and either followed by a double-null (0x0000) or
a set of null terminated strings and a null.
@retval EFI_SUCCESS Record was added.
diff --git a/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c b/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c
index 65fec01158..ab8ee258c8 100644
--- a/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c
+++ b/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c
@@ -174,8 +174,8 @@ Returns:
@param Smbios The EFI_SMBIOS_PROTOCOL instance.
@param SmbiosHandle A unique handle will be assigned to the SMBIOS record.
@param Record The data for the fixed portion of the SMBIOS record. The format of the record is
- determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted area is defined
- by EFI_SMBIOS_TABLE_HEADER.Length and either followed by a double-null (0x0000) or
+ determined by EFI_SMBIOS_TABLE_HEADER.Type. The size of the formatted area is defined
+ by EFI_SMBIOS_TABLE_HEADER.Length and either followed by a double-null (0x0000) or
a set of null terminated strings and a null.
@retval EFI_SUCCESS Record was added.
diff --git a/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c b/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c
index 123e090ed0..676d324e6b 100644
--- a/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c
+++ b/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c
@@ -66,10 +66,10 @@ CreatePlatformSmbiosMemoryRecords (
while ((HobPtr.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, HobPtr.Raw)) != NULL) {
if (HobPtr.ResourceDescriptor->ResourceType == EFI_RESOURCE_SYSTEM_MEMORY) {
gSmbiosType19Template.ExtendedStartingAddress = HobPtr.ResourceDescriptor->PhysicalStart;
- gSmbiosType19Template.ExtendedEndingAddress =
- HobPtr.ResourceDescriptor->PhysicalStart +
+ gSmbiosType19Template.ExtendedEndingAddress =
+ HobPtr.ResourceDescriptor->PhysicalStart +
HobPtr.ResourceDescriptor->ResourceLength - 1;
-
+
SmbiosLibCreateEntry ((SMBIOS_STRUCTURE *)&gSmbiosType19Template, NULL);
}
HobPtr.Raw = GET_NEXT_HOB (HobPtr);
@@ -97,7 +97,7 @@ PlatfomrSmbiosDriverEntryPoint (
EFI_SMBIOS_HANDLE SmbiosHandle;
SMBIOS_STRUCTURE_POINTER Smbios;
- // Phase 0 - Patch table to make SMBIOS 2.7 structures smaller to conform
+ // Phase 0 - Patch table to make SMBIOS 2.7 structures smaller to conform
// to an early version of the specification.
// Phase 1 - Initialize SMBIOS tables from template
@@ -112,18 +112,18 @@ PlatfomrSmbiosDriverEntryPoint (
Smbios.Type0->BiosSize = (UINT8)DivU64x32 (FixedPcdGet64 (PcdEmuFirmwareFdSize), 64*1024) - 1;
SmbiosLibUpdateUnicodeString (
- SmbiosHandle,
- Smbios.Type0->BiosVersion,
+ SmbiosHandle,
+ Smbios.Type0->BiosVersion,
(CHAR16 *) PcdGetPtr (PcdFirmwareVersionString)
);
SmbiosLibUpdateUnicodeString (
- SmbiosHandle,
- Smbios.Type0->BiosReleaseDate,
+ SmbiosHandle,
+ Smbios.Type0->BiosReleaseDate,
(CHAR16 *) PcdGetPtr (PcdFirmwareReleaseDateString)
);
}
- // Phase 3 - Create tables from scratch
+ // Phase 3 - Create tables from scratch
// Create Type 13 record from EFI Variables
// Do we need this record for EFI as the info is available from EFI varaibles
diff --git a/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.inf b/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.inf
index 737310f470..bee1abb3eb 100644
--- a/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.inf
+++ b/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.inf
@@ -1,7 +1,7 @@
## @file
# Platform SMBIOS driver that fills in SMBIOS table entries.
#
-# Copyright (c) 2012, Apple Inc. All rights reserved.
+# Copyright (c) 2012, Apple Inc. All rights reserved.
# Portions copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
#
# This program and the accompanying materials
@@ -52,4 +52,4 @@ [Pcd]
gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareFdSize
[Depex]
- TRUE
\ No newline at end of file
+ TRUE
diff --git a/EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c b/EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c
index c79e57b304..27679518ef 100644
--- a/EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c
+++ b/EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c
@@ -8,7 +8,7 @@
Processor Information (Type 4) - CPU Driver
Cache Information (Type 7) - For cache that is external to processor
System Slots (Type 9) - If system has slots
- Physical Memory Array (Type 16)
+ Physical Memory Array (Type 16)
Memory Device (Type 17) - For each socketed system-memory Device
Memory Array Mapped Address (Type 19) - One per contiguous block per Physical Memroy Array
System Boot Information (Type 32)
@@ -69,9 +69,9 @@ SMBIOS_TABLE_TYPE0 gSmbiosType0Template = {
0, // PrinterIsSupported :1;
0, // CgaMonoIsSupported :1;
0, // NecPc98 :1;
- 0 // ReservedForVendor :32; ///< Bits 32-63. Bits 32-47 reserved for BIOS vendor
- ///< and bits 48-63 reserved for System Vendor.
- },
+ 0 // ReservedForVendor :32; ///< Bits 32-63. Bits 32-47 reserved for BIOS vendor
+ ///< and bits 48-63 reserved for System Vendor.
+ },
{ // BIOSCharacteristicsExtensionBytes[]
0x81, // AcpiIsSupported :1;
// UsbLegacyIsSupported :1;
@@ -108,7 +108,7 @@ SMBIOS_TABLE_TYPE1 gSmbiosType1Template = {
3, // Version String
4, // SerialNumber String
{ 0x25EF0280, 0xEC82, 0x42B0, { 0x8F, 0xB6, 0x10, 0xAD, 0xCC, 0xC6, 0x7C, 0x02 } },
- SystemWakeupTypePowerSwitch,
+ SystemWakeupTypePowerSwitch,
5, // SKUNumber String
6, // Family String
};
@@ -119,7 +119,7 @@ CHAR8 *gSmbiosType1Strings[] = {
"System Serial#",
"System SKU#",
"edk2",
- NULL
+ NULL
};
SMBIOS_TABLE_TYPE2 gSmbiosType2Template = {
@@ -139,7 +139,7 @@ SMBIOS_TABLE_TYPE2 gSmbiosType2Template = {
},
6, // LocationInChassis String
0, // ChassisHandle;
- BaseBoardTypeMotherBoard, // BoardType;
+ BaseBoardTypeMotherBoard, // BoardType;
0, // NumberOfContainedObjectHandles;
{ 0 } // ContainedObjectHandles[1];
};
@@ -150,7 +150,7 @@ CHAR8 *gSmbiosType2Strings[] = {
"Base Board Serial#",
"Base Board Asset Tag#",
"Part Component",
- NULL
+ NULL
};
SMBIOS_TABLE_TYPE3 gSmbiosType3Template = {
@@ -160,10 +160,10 @@ SMBIOS_TABLE_TYPE3 gSmbiosType3Template = {
2, // Version String
3, // SerialNumber String
4, // AssetTag String
- ChassisStateSafe, // BootupState;
- ChassisStateSafe, // PowerSupplyState;
- ChassisStateSafe, // ThermalState;
- ChassisSecurityStatusNone,// SecurityStatus;
+ ChassisStateSafe, // BootupState;
+ ChassisStateSafe, // PowerSupplyState;
+ ChassisStateSafe, // ThermalState;
+ ChassisSecurityStatusNone,// SecurityStatus;
{ 0, 0, 0, 0 }, // OemDefined[4];
0, // Height;
0, // NumberofPowerCords;
@@ -176,7 +176,7 @@ CHAR8 *gSmbiosType3Strings[] = {
"EmulatorPkg",
"Chassis Board Serial#",
"Chassis Board Asset Tag#",
- NULL
+ NULL
};
SMBIOS_TABLE_TYPE8 gSmbiosType8Template1 = {
diff --git a/EmulatorPkg/Sec/Ia32/SwitchRam.asm b/EmulatorPkg/Sec/Ia32/SwitchRam.asm
index a2e1f3e910..731ee0ffdb 100644
--- a/EmulatorPkg/Sec/Ia32/SwitchRam.asm
+++ b/EmulatorPkg/Sec/Ia32/SwitchRam.asm
@@ -22,7 +22,7 @@
.586p
.model flat,C
.code
-
+
;------------------------------------------------------------------------------
; VOID
; EFIAPI
@@ -30,7 +30,7 @@
; UINT32 TemporaryMemoryBase,
; UINT32 PermenentMemoryBase
; );
-;------------------------------------------------------------------------------
+;------------------------------------------------------------------------------
SecSwitchStack PROC
;
; Save three register: eax, ebx, ecx
@@ -39,16 +39,16 @@ SecSwitchStack PROC
push ebx
push ecx
push edx
-
+
;
; !!CAUTION!! this function address's is pushed into stack after
; migration of whole temporary memory, so need save it to permenent
; memory at first!
;
-
+
mov ebx, [esp + 20] ; Save the first parameter
mov ecx, [esp + 24] ; Save the second parameter
-
+
;
; Save this function's return address into permenent memory at first.
; Then, Fixup the esp point to permenent memory
@@ -57,17 +57,17 @@ SecSwitchStack PROC
sub eax, ebx
add eax, ecx
mov edx, dword ptr [esp] ; copy pushed register's value to permenent memory
- mov dword ptr [eax], edx
+ mov dword ptr [eax], edx
mov edx, dword ptr [esp + 4]
- mov dword ptr [eax + 4], edx
+ mov dword ptr [eax + 4], edx
mov edx, dword ptr [esp + 8]
- mov dword ptr [eax + 8], edx
+ mov dword ptr [eax + 8], edx
mov edx, dword ptr [esp + 12]
- mov dword ptr [eax + 12], edx
+ mov dword ptr [eax + 12], edx
mov edx, dword ptr [esp + 16] ; Update this function's return address into permenent memory
- mov dword ptr [eax + 16], edx
+ mov dword ptr [eax + 16], edx
mov esp, eax ; From now, esp is pointed to permenent memory
-
+
;
; Fixup the ebp point to permenent memory
;
@@ -75,7 +75,7 @@ SecSwitchStack PROC
sub eax, ebx
add eax, ecx
mov ebp, eax ; From now, ebp is pointed to permenent memory
-
+
;
; Fixup callee's ebp point for PeiDispatch
;
@@ -83,7 +83,7 @@ SecSwitchStack PROC
sub eax, ebx
add eax, ecx
mov dword ptr [ebp], eax ; From now, Temporary's PPI caller's stack is in permenent memory
-
+
pop edx
pop ecx
pop ebx
diff --git a/EmulatorPkg/Sec/Sec.c b/EmulatorPkg/Sec/Sec.c
index 8a015682dd..4132e9d9b7 100644
--- a/EmulatorPkg/Sec/Sec.c
+++ b/EmulatorPkg/Sec/Sec.c
@@ -1,149 +1,149 @@
-/*++ @file
- Stub SEC that is called from the OS appliation that is the root of the emulator.
-
- The OS application will call the SEC with the PEI Entry Point API.
-
-Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include "Sec.h"
-
-
-
-EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {
- SecTemporaryRamSupport
-};
-
-
-EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = {
- {
- EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
- &gEfiTemporaryRamSupportPpiGuid,
- &mSecTemporaryRamSupportPpi
- }
-};
-
-
-
-/**
- The entry point of PE/COFF Image for the PEI Core, that has been hijacked by this
- SEC that sits on top of an OS application. So the entry and exit of this module
- has the same API.
-
- This function is the entry point for the PEI Foundation, which allows the SEC phase
- to pass information about the stack, temporary RAM and the Boot Firmware Volume.
- In addition, it also allows the SEC phase to pass services and data forward for use
- during the PEI phase in the form of one or more PPIs.
- There is no limit to the number of additional PPIs that can be passed from SEC into
- the PEI Foundation. As part of its initialization phase, the PEI Foundation will add
- these SEC-hosted PPIs to its PPI database such that both the PEI Foundation and any
- modules can leverage the associated service calls and/or code in these early PPIs.
- This function is required to call ProcessModuleEntryPointList() with the Context
- parameter set to NULL. ProcessModuleEntryPoint() is never expected to return.
- The PEI Core is responsible for calling ProcessLibraryConstructorList() as soon as
- the PEI Services Table and the file handle for the PEI Core itself have been established.
- If ProcessModuleEntryPointList() returns, then ASSERT() and halt the system.
-
- @param SecCoreData Points to a data structure containing information about the PEI
- core's operating environment, such as the size and location of
- temporary RAM, the stack location and the BFV location.
-
- @param PpiList Points to a list of one or more PPI descriptors to be installed
- initially by the PEI core. An empty PPI list consists of a single
- descriptor with the end-tag EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST.
- As part of its initialization phase, the PEI Foundation will add
- these SEC-hosted PPIs to its PPI database such that both the PEI
- Foundation and any modules can leverage the associated service calls
- and/or code in these early PPIs.
-
-**/
-VOID
-EFIAPI
-_ModuleEntryPoint (
- IN EFI_SEC_PEI_HAND_OFF *SecCoreData,
- IN EFI_PEI_PPI_DESCRIPTOR *PpiList
- )
-{
- EFI_STATUS Status;
- EFI_PEI_FV_HANDLE VolumeHandle;
- EFI_PEI_FILE_HANDLE FileHandle;
- VOID *PeCoffImage;
- EFI_PEI_CORE_ENTRY_POINT EntryPoint;
- EFI_PEI_PPI_DESCRIPTOR *Ppi;
- EFI_PEI_PPI_DESCRIPTOR *SecPpiList;
- UINTN SecReseveredMemorySize;
- UINTN Index;
-
- EMU_MAGIC_PAGE()->PpiList = PpiList;
- ProcessLibraryConstructorList ();
-
- DEBUG ((EFI_D_ERROR, "SEC Has Started\n"));
-
- //
- // Add Our PPIs to the list
- //
- SecReseveredMemorySize = sizeof (gPrivateDispatchTable);
- for (Ppi = PpiList, Index = 1; ; Ppi++, Index++) {
- SecReseveredMemorySize += sizeof (EFI_PEI_PPI_DESCRIPTOR);
-
- if ((Ppi->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) == EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) {
- // Since we are appending, need to clear out privious list terminator.
- Ppi->Flags &= ~EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
- break;
- }
- }
-
- // Keep everything on a good alignment
- SecReseveredMemorySize = ALIGN_VALUE (SecReseveredMemorySize, CPU_STACK_ALIGNMENT);
-
-#if 0
- // Tell the PEI Core to not use our buffer in temp RAM
- SecPpiList = (EFI_PEI_PPI_DESCRIPTOR *)SecCoreData->PeiTemporaryRamBase;
- SecCoreData->PeiTemporaryRamBase = (VOID *)((UINTN)SecCoreData->PeiTemporaryRamBase + SecReseveredMemorySize);
- SecCoreData->PeiTemporaryRamSize -= SecReseveredMemorySize;
-#else
- {
- //
- // When I subtrack from SecCoreData->PeiTemporaryRamBase PEI Core crashes? Either there is a bug
- // or I don't understand temp RAM correctly?
- //
- EFI_PEI_PPI_DESCRIPTOR PpiArray[10];
-
- SecPpiList = &PpiArray[0];
- ASSERT (sizeof (PpiArray) >= SecReseveredMemorySize);
- }
-#endif
- // Copy existing list, and append our entries.
- CopyMem (SecPpiList, PpiList, sizeof (EFI_PEI_PPI_DESCRIPTOR) * Index);
- CopyMem (&SecPpiList[Index], gPrivateDispatchTable, sizeof (gPrivateDispatchTable));
-
- // Find PEI Core and transfer control
- VolumeHandle = (EFI_PEI_FV_HANDLE)(UINTN)SecCoreData->BootFirmwareVolumeBase;
- FileHandle = NULL;
- Status = PeiServicesFfsFindNextFile (EFI_FV_FILETYPE_PEI_CORE, VolumeHandle, &FileHandle);
- ASSERT_EFI_ERROR (Status);
-
- Status = PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle, &PeCoffImage);
- ASSERT_EFI_ERROR (Status);
-
- Status = PeCoffLoaderGetEntryPoint (PeCoffImage, (VOID **)&EntryPoint);
- ASSERT_EFI_ERROR (Status);
-
- // Transfer control to PEI Core
- EntryPoint (SecCoreData, SecPpiList);
-
- // PEI Core never returns
- ASSERT (FALSE);
- return;
-}
-
-
-
+/*++ @file
+ Stub SEC that is called from the OS appliation that is the root of the emulator.
+
+ The OS application will call the SEC with the PEI Entry Point API.
+
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include "Sec.h"
+
+
+
+EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {
+ SecTemporaryRamSupport
+};
+
+
+EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = {
+ {
+ EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
+ &gEfiTemporaryRamSupportPpiGuid,
+ &mSecTemporaryRamSupportPpi
+ }
+};
+
+
+
+/**
+ The entry point of PE/COFF Image for the PEI Core, that has been hijacked by this
+ SEC that sits on top of an OS application. So the entry and exit of this module
+ has the same API.
+
+ This function is the entry point for the PEI Foundation, which allows the SEC phase
+ to pass information about the stack, temporary RAM and the Boot Firmware Volume.
+ In addition, it also allows the SEC phase to pass services and data forward for use
+ during the PEI phase in the form of one or more PPIs.
+ There is no limit to the number of additional PPIs that can be passed from SEC into
+ the PEI Foundation. As part of its initialization phase, the PEI Foundation will add
+ these SEC-hosted PPIs to its PPI database such that both the PEI Foundation and any
+ modules can leverage the associated service calls and/or code in these early PPIs.
+ This function is required to call ProcessModuleEntryPointList() with the Context
+ parameter set to NULL. ProcessModuleEntryPoint() is never expected to return.
+ The PEI Core is responsible for calling ProcessLibraryConstructorList() as soon as
+ the PEI Services Table and the file handle for the PEI Core itself have been established.
+ If ProcessModuleEntryPointList() returns, then ASSERT() and halt the system.
+
+ @param SecCoreData Points to a data structure containing information about the PEI
+ core's operating environment, such as the size and location of
+ temporary RAM, the stack location and the BFV location.
+
+ @param PpiList Points to a list of one or more PPI descriptors to be installed
+ initially by the PEI core. An empty PPI list consists of a single
+ descriptor with the end-tag EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST.
+ As part of its initialization phase, the PEI Foundation will add
+ these SEC-hosted PPIs to its PPI database such that both the PEI
+ Foundation and any modules can leverage the associated service calls
+ and/or code in these early PPIs.
+
+**/
+VOID
+EFIAPI
+_ModuleEntryPoint (
+ IN EFI_SEC_PEI_HAND_OFF *SecCoreData,
+ IN EFI_PEI_PPI_DESCRIPTOR *PpiList
+ )
+{
+ EFI_STATUS Status;
+ EFI_PEI_FV_HANDLE VolumeHandle;
+ EFI_PEI_FILE_HANDLE FileHandle;
+ VOID *PeCoffImage;
+ EFI_PEI_CORE_ENTRY_POINT EntryPoint;
+ EFI_PEI_PPI_DESCRIPTOR *Ppi;
+ EFI_PEI_PPI_DESCRIPTOR *SecPpiList;
+ UINTN SecReseveredMemorySize;
+ UINTN Index;
+
+ EMU_MAGIC_PAGE()->PpiList = PpiList;
+ ProcessLibraryConstructorList ();
+
+ DEBUG ((EFI_D_ERROR, "SEC Has Started\n"));
+
+ //
+ // Add Our PPIs to the list
+ //
+ SecReseveredMemorySize = sizeof (gPrivateDispatchTable);
+ for (Ppi = PpiList, Index = 1; ; Ppi++, Index++) {
+ SecReseveredMemorySize += sizeof (EFI_PEI_PPI_DESCRIPTOR);
+
+ if ((Ppi->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) == EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) {
+ // Since we are appending, need to clear out privious list terminator.
+ Ppi->Flags &= ~EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
+ break;
+ }
+ }
+
+ // Keep everything on a good alignment
+ SecReseveredMemorySize = ALIGN_VALUE (SecReseveredMemorySize, CPU_STACK_ALIGNMENT);
+
+#if 0
+ // Tell the PEI Core to not use our buffer in temp RAM
+ SecPpiList = (EFI_PEI_PPI_DESCRIPTOR *)SecCoreData->PeiTemporaryRamBase;
+ SecCoreData->PeiTemporaryRamBase = (VOID *)((UINTN)SecCoreData->PeiTemporaryRamBase + SecReseveredMemorySize);
+ SecCoreData->PeiTemporaryRamSize -= SecReseveredMemorySize;
+#else
+ {
+ //
+ // When I subtrack from SecCoreData->PeiTemporaryRamBase PEI Core crashes? Either there is a bug
+ // or I don't understand temp RAM correctly?
+ //
+ EFI_PEI_PPI_DESCRIPTOR PpiArray[10];
+
+ SecPpiList = &PpiArray[0];
+ ASSERT (sizeof (PpiArray) >= SecReseveredMemorySize);
+ }
+#endif
+ // Copy existing list, and append our entries.
+ CopyMem (SecPpiList, PpiList, sizeof (EFI_PEI_PPI_DESCRIPTOR) * Index);
+ CopyMem (&SecPpiList[Index], gPrivateDispatchTable, sizeof (gPrivateDispatchTable));
+
+ // Find PEI Core and transfer control
+ VolumeHandle = (EFI_PEI_FV_HANDLE)(UINTN)SecCoreData->BootFirmwareVolumeBase;
+ FileHandle = NULL;
+ Status = PeiServicesFfsFindNextFile (EFI_FV_FILETYPE_PEI_CORE, VolumeHandle, &FileHandle);
+ ASSERT_EFI_ERROR (Status);
+
+ Status = PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle, &PeCoffImage);
+ ASSERT_EFI_ERROR (Status);
+
+ Status = PeCoffLoaderGetEntryPoint (PeCoffImage, (VOID **)&EntryPoint);
+ ASSERT_EFI_ERROR (Status);
+
+ // Transfer control to PEI Core
+ EntryPoint (SecCoreData, SecPpiList);
+
+ // PEI Core never returns
+ ASSERT (FALSE);
+ return;
+}
+
+
+
diff --git a/EmulatorPkg/Sec/Sec.h b/EmulatorPkg/Sec/Sec.h
index 4782578efa..c5781201eb 100644
--- a/EmulatorPkg/Sec/Sec.h
+++ b/EmulatorPkg/Sec/Sec.h
@@ -1,51 +1,51 @@
-/*++ @file
- Stub SEC that is called from the OS appliation that is the root of the emulator.
-
- The OS application will call the SEC with the PEI Entry Point API.
-
-Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef __SEC_H___
-#define __SEC_H___
-
-
-#include <PiPei.h>
-#include <Library/EmuMagicPageLib.h>
-#include <Library/DebugLib.h>
-#include <Library/PeiServicesLib.h>
-#include <Library/PeCoffGetEntryPointLib.h>
-#include <Library/BaseMemoryLib.h>
-
-#include <Ppi/TemporaryRamSupport.h>
-
-
-//
-// I think this shold be defined in a MdePkg include file?
-//
-VOID
-EFIAPI
-ProcessLibraryConstructorList (
- VOID
- );
-
-EFI_STATUS
-EFIAPI
-SecTemporaryRamSupport (
- IN CONST EFI_PEI_SERVICES **PeiServices,
- IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
- IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
- IN UINTN CopySize
- );
-
-
-#endif
-
+/*++ @file
+ Stub SEC that is called from the OS appliation that is the root of the emulator.
+
+ The OS application will call the SEC with the PEI Entry Point API.
+
+Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef __SEC_H___
+#define __SEC_H___
+
+
+#include <PiPei.h>
+#include <Library/EmuMagicPageLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PeiServicesLib.h>
+#include <Library/PeCoffGetEntryPointLib.h>
+#include <Library/BaseMemoryLib.h>
+
+#include <Ppi/TemporaryRamSupport.h>
+
+
+//
+// I think this shold be defined in a MdePkg include file?
+//
+VOID
+EFIAPI
+ProcessLibraryConstructorList (
+ VOID
+ );
+
+EFI_STATUS
+EFIAPI
+SecTemporaryRamSupport (
+ IN CONST EFI_PEI_SERVICES **PeiServices,
+ IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
+ IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
+ IN UINTN CopySize
+ );
+
+
+#endif
+
diff --git a/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c b/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c
index 4ba27c2a6a..42103e100a 100644
--- a/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c
+++ b/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c
@@ -47,8 +47,8 @@ typedef struct {
VOID *CurrentReadPointer;
VOID *EndReadPointer;
- UINT32 ReceivedPackets;
- UINT32 DroppedPackets;
+ UINT32 ReceivedPackets;
+ UINT32 DroppedPackets;
} EMU_SNP_PRIVATE;
@@ -200,8 +200,8 @@ EmuSnpStart (
struct ifreq BoundIf;
struct bpf_program BpfProgram;
struct bpf_insn *FilterProgram;
- u_int Value;
- u_int ReadBufferSize;
+ u_int Value;
+ u_int ReadBufferSize;
UINT16 Temp16;
UINT32 Temp32;
@@ -229,23 +229,23 @@ EmuSnpStart (
}
//
- // Get the read buffer size.
- //
- if (ioctl (Private->BpfFd, BIOCGBLEN, &ReadBufferSize) < 0) {
- goto DeviceErrorExit;
- }
-
- //
- // Default value from BIOCGBLEN is usually too small, so use a much larger size, if necessary.
- //
- if (ReadBufferSize < FixedPcdGet32 (PcdNetworkPacketFilterSize)) {
- ReadBufferSize = FixedPcdGet32 (PcdNetworkPacketFilterSize);
- if (ioctl (Private->BpfFd, BIOCSBLEN, &ReadBufferSize) < 0) {
- goto DeviceErrorExit;
- }
- }
-
- //
+ // Get the read buffer size.
+ //
+ if (ioctl (Private->BpfFd, BIOCGBLEN, &ReadBufferSize) < 0) {
+ goto DeviceErrorExit;
+ }
+
+ //
+ // Default value from BIOCGBLEN is usually too small, so use a much larger size, if necessary.
+ //
+ if (ReadBufferSize < FixedPcdGet32 (PcdNetworkPacketFilterSize)) {
+ ReadBufferSize = FixedPcdGet32 (PcdNetworkPacketFilterSize);
+ if (ioctl (Private->BpfFd, BIOCSBLEN, &ReadBufferSize) < 0) {
+ goto DeviceErrorExit;
+ }
+ }
+
+ //
// Associate our interface with this BPF file descriptor.
//
AsciiStrCpy (BoundIf.ifr_name, Private->InterfaceName);
@@ -254,7 +254,7 @@ EmuSnpStart (
}
//
- // Enable immediate mode.
+ // Enable immediate mode.
//
Value = 1;
if (ioctl (Private->BpfFd, BIOCIMMEDIATE, &Value) < 0) {
@@ -286,8 +286,8 @@ EmuSnpStart (
//
// Allocate read buffer.
//
- Private->ReadBufferSize = ReadBufferSize;
- Private->ReadBuffer = malloc (Private->ReadBufferSize);
+ Private->ReadBufferSize = ReadBufferSize;
+ Private->ReadBuffer = malloc (Private->ReadBufferSize);
if (Private->ReadBuffer == NULL) {
goto ErrorExit;
}
@@ -295,7 +295,7 @@ EmuSnpStart (
Private->CurrentReadPointer = Private->EndReadPointer = Private->ReadBuffer;
//
- // Install our packet filter: successful reads should only produce broadcast or unicast
+ // Install our packet filter: successful reads should only produce broadcast or unicast
// packets directed to our fake MAC address.
//
FilterProgram = malloc (sizeof (mFilterInstructionTemplate)) ;
@@ -906,7 +906,7 @@ EmuSnpReceive (
{
EMU_SNP_PRIVATE *Private;
struct bpf_hdr *BpfHeader;
- struct bpf_stat BpfStats;
+ struct bpf_stat BpfStats;
ETHERNET_HEADER *EnetHeader;
ssize_t Result;
@@ -916,19 +916,19 @@ EmuSnpReceive (
return EFI_NOT_STARTED;
}
- ZeroMem (&BpfStats, sizeof( BpfStats));
+ ZeroMem (&BpfStats, sizeof( BpfStats));
- if (ioctl (Private->BpfFd, BIOCGSTATS, &BpfStats) == 0) {
- Private->ReceivedPackets += BpfStats.bs_recv;
- if (BpfStats.bs_drop > Private->DroppedPackets) {
- printf (
- "SNP: STATS: RCVD = %d DROPPED = %d. Probably need to increase BPF PcdNetworkPacketFilterSize?\n",
- BpfStats.bs_recv,
- BpfStats.bs_drop - Private->DroppedPackets
- );
- Private->DroppedPackets = BpfStats.bs_drop;
- }
- }
+ if (ioctl (Private->BpfFd, BIOCGSTATS, &BpfStats) == 0) {
+ Private->ReceivedPackets += BpfStats.bs_recv;
+ if (BpfStats.bs_drop > Private->DroppedPackets) {
+ printf (
+ "SNP: STATS: RCVD = %d DROPPED = %d. Probably need to increase BPF PcdNetworkPacketFilterSize?\n",
+ BpfStats.bs_recv,
+ BpfStats.bs_drop - Private->DroppedPackets
+ );
+ Private->DroppedPackets = BpfStats.bs_drop;
+ }
+ }
//
// Do we have any remaining packets from the previous read?
@@ -1004,7 +1004,7 @@ GetInterfaceMacAddr (
EMU_SNP_PRIVATE *Private
)
{
- EFI_STATUS Status;
+ EFI_STATUS Status;
struct ifaddrs *IfAddrs;
struct ifaddrs *If;
struct sockaddr_dl *IfSdl;
diff --git a/EmulatorPkg/Unix/Host/BlockIo.c b/EmulatorPkg/Unix/Host/BlockIo.c
index fa05fbc107..3b87a9e5b1 100644
--- a/EmulatorPkg/Unix/Host/BlockIo.c
+++ b/EmulatorPkg/Unix/Host/BlockIo.c
@@ -347,7 +347,7 @@ EmuBlockIoReadWriteCommon (
@param[in] MediaId Id of the media, changes every time the media is
replaced.
@param[in] Lba The starting Logical Block Address to read from.
- @param[in, out] Token A pointer to the token associated with the transaction.
+ @param[in, out] Token A pointer to the token associated with the transaction.
@param[in] BufferSize Size of Buffer, must be a multiple of device block size.
@param[out] Buffer A pointer to the destination buffer for the data. The
caller is responsible for either having implicit or
diff --git a/EmulatorPkg/Unix/Host/EmuThunk.c b/EmulatorPkg/Unix/Host/EmuThunk.c
index a7b12b14e5..1a2037f931 100644
--- a/EmulatorPkg/Unix/Host/EmuThunk.c
+++ b/EmulatorPkg/Unix/Host/EmuThunk.c
@@ -1,440 +1,440 @@
-/*++ @file
- Since the SEC is the only program in our emulation we
- must use a UEFI/PI mechanism to export APIs to other modules.
- This is the role of the EFI_EMU_THUNK_PROTOCOL.
-
- The mUnixThunkTable exists so that a change to EFI_EMU_THUNK_PROTOCOL
- will cause an error in initializing the array if all the member functions
- are not added. It looks like adding a element to end and not initializing
- it may cause the table to be initaliized with the members at the end being
- set to zero. This is bad as jumping to zero will crash.
-
-Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR>
-Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include "Host.h"
-
-#ifdef __APPLE__
-#define DebugAssert _Mangle__DebugAssert
-
-#include <assert.h>
-#include <CoreServices/CoreServices.h>
-#include <mach/mach.h>
-#include <mach/mach_time.h>
-
-#undef DebugAssert
-#endif
-
-int settimer_initialized;
-struct timeval settimer_timeval;
-void (*settimer_callback)(UINT64 delta);
-
-BOOLEAN gEmulatorInterruptEnabled = FALSE;
-
-
-UINTN
-SecWriteStdErr (
- IN UINT8 *Buffer,
- IN UINTN NumberOfBytes
- )
-{
- ssize_t Return;
-
- Return = write (STDERR_FILENO, (const void *)Buffer, (size_t)NumberOfBytes);
-
- return (Return == -1) ? 0 : Return;
-}
-
-
-EFI_STATUS
-SecConfigStdIn (
- VOID
- )
-{
- struct termios tty;
-
- //
- // Need to turn off line buffering, ECHO, and make it unbuffered.
- //
- tcgetattr (STDIN_FILENO, &tty);
- tty.c_lflag &= ~(ICANON | ECHO);
- tcsetattr (STDIN_FILENO, TCSANOW, &tty);
-
-// setvbuf (STDIN_FILENO, NULL, _IONBF, 0);
-
- // now ioctl FIONREAD will do what we need
- return EFI_SUCCESS;
-}
-
-UINTN
-SecWriteStdOut (
- IN UINT8 *Buffer,
- IN UINTN NumberOfBytes
- )
-{
- ssize_t Return;
-
- Return = write (STDOUT_FILENO, (const void *)Buffer, (size_t)NumberOfBytes);
-
- return (Return == -1) ? 0 : Return;
-}
-
-UINTN
-SecReadStdIn (
- IN UINT8 *Buffer,
- IN UINTN NumberOfBytes
- )
-{
- ssize_t Return;
-
- Return = read (STDIN_FILENO, Buffer, (size_t)NumberOfBytes);
-
- return (Return == -1) ? 0 : Return;
-}
-
-BOOLEAN
-SecPollStdIn (
- VOID
- )
-{
- int Result;
- int Bytes;
-
- Result = ioctl (STDIN_FILENO, FIONREAD, &Bytes);
- if (Result == -1) {
- return FALSE;
- }
-
- return (BOOLEAN)(Bytes > 0);
-}
-
-
-VOID *
-SecMalloc (
- IN UINTN Size
- )
-{
- return malloc ((size_t)Size);
-}
-
-VOID *
-SecValloc (
- IN UINTN Size
- )
-{
- return valloc ((size_t)Size);
-}
-
-BOOLEAN
-SecFree (
- IN VOID *Ptr
- )
-{
- if (EfiSystemMemoryRange (Ptr)) {
- // If an address range is in the EFI memory map it was alloced via EFI.
- // So don't free those ranges and let the caller know.
- return FALSE;
- }
-
- free (Ptr);
- return TRUE;
-}
-
-
-void
-settimer_handler (int sig)
-{
- struct timeval timeval;
- UINT64 delta;
-
- gettimeofday (&timeval, NULL);
- delta = ((UINT64)timeval.tv_sec * 1000) + (timeval.tv_usec / 1000)
- - ((UINT64)settimer_timeval.tv_sec * 1000)
- - (settimer_timeval.tv_usec / 1000);
- settimer_timeval = timeval;
-
- if (settimer_callback) {
- ReverseGasketUint64 (settimer_callback, delta);
- }
-}
-
-VOID
-SecSetTimer (
- IN UINT64 PeriodMs,
- IN EMU_SET_TIMER_CALLBACK CallBack
- )
-{
- struct itimerval timerval;
- UINT32 remainder;
-
- if (!settimer_initialized) {
- struct sigaction act;
-
- settimer_initialized = 1;
- act.sa_handler = settimer_handler;
- act.sa_flags = 0;
- sigemptyset (&act.sa_mask);
- gEmulatorInterruptEnabled = TRUE;
- if (sigaction (SIGALRM, &act, NULL) != 0) {
- printf ("SetTimer: sigaction error %s\n", strerror (errno));
- }
- if (gettimeofday (&settimer_timeval, NULL) != 0) {
- printf ("SetTimer: gettimeofday error %s\n", strerror (errno));
- }
- }
- timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);
- DivU64x32Remainder(PeriodMs, 1000, &remainder);
- timerval.it_value.tv_usec = remainder * 1000;
- timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);
- timerval.it_interval = timerval.it_value;
-
- if (setitimer (ITIMER_REAL, &timerval, NULL) != 0) {
- printf ("SetTimer: setitimer error %s\n", strerror (errno));
- }
- settimer_callback = CallBack;
-}
-
-
-VOID
-SecEnableInterrupt (
- VOID
- )
-{
- sigset_t sigset;
-
- gEmulatorInterruptEnabled = TRUE;
- // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
- // by enabling/disabling SIGALRM.
- sigemptyset (&sigset);
- sigaddset (&sigset, SIGALRM);
- pthread_sigmask (SIG_UNBLOCK, &sigset, NULL);
-}
-
-
-VOID
-SecDisableInterrupt (
- VOID
- )
-{
- sigset_t sigset;
-
- // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
- // by enabling/disabling SIGALRM.
- sigemptyset (&sigset);
- sigaddset (&sigset, SIGALRM);
- pthread_sigmask (SIG_BLOCK, &sigset, NULL);
- gEmulatorInterruptEnabled = FALSE;
-}
-
-
-BOOLEAN
-SecInterruptEanbled (void)
-{
- return gEmulatorInterruptEnabled;
-}
-
-
-UINT64
-QueryPerformanceFrequency (
- VOID
- )
-{
- // Hard code to nanoseconds
- return 1000000000ULL;
-}
-
-UINT64
-QueryPerformanceCounter (
- VOID
- )
-{
-#if __APPLE__
- UINT64 Start;
- static mach_timebase_info_data_t sTimebaseInfo;
-
-
- Start = mach_absolute_time ();
-
- // Convert to nanoseconds.
-
- // If this is the first time we've run, get the timebase.
- // We can use denom == 0 to indicate that sTimebaseInfo is
- // uninitialised because it makes no sense to have a zero
- // denominator is a fraction.
-
- if ( sTimebaseInfo.denom == 0 ) {
- (void) mach_timebase_info(&sTimebaseInfo);
- }
-
- // Do the maths. We hope that the multiplication doesn't
- // overflow; the price you pay for working in fixed point.
-
- return (Start * sTimebaseInfo.numer) / sTimebaseInfo.denom;
-#else
- // Need to figure out what to do for Linux?
- return 0;
-#endif
-}
-
-
-
-VOID
-SecSleep (
- IN UINT64 Nanoseconds
- )
-{
- struct timespec rq, rm;
- struct timeval start, end;
- unsigned long MicroSec;
-
- rq.tv_sec = DivU64x32 (Nanoseconds, 1000000000);
- rq.tv_nsec = ModU64x32 (Nanoseconds, 1000000000);
-
- //
- // nanosleep gets interrupted by our timer tic.
- // we need to track wall clock time or we will stall for way too long
- //
- gettimeofday (&start, NULL);
- end.tv_sec = start.tv_sec + rq.tv_sec;
- MicroSec = (start.tv_usec + rq.tv_nsec/1000);
- end.tv_usec = MicroSec % 1000000;
- if (MicroSec > 1000000) {
- end.tv_sec++;
- }
-
- while (nanosleep (&rq, &rm) == -1) {
- if (errno != EINTR) {
- break;
- }
- gettimeofday (&start, NULL);
- if (start.tv_sec > end.tv_sec) {
- break;
- } if ((start.tv_sec == end.tv_sec) && (start.tv_usec > end.tv_usec)) {
- break;
- }
- rq = rm;
- }
-}
-
-
-VOID
-SecCpuSleep (
- VOID
- )
-{
- struct timespec rq, rm;
-
- // nanosleep gets interrupted by the timer tic
- rq.tv_sec = 1;
- rq.tv_nsec = 0;
-
- nanosleep (&rq, &rm);
-}
-
-
-VOID
-SecExit (
- UINTN Status
- )
-{
- exit (Status);
-}
-
-
-VOID
-SecGetTime (
- OUT EFI_TIME *Time,
- OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
- )
-{
- struct tm *tm;
- time_t t;
-
- t = time (NULL);
- tm = localtime (&t);
-
- Time->Year = 1900 + tm->tm_year;
- Time->Month = tm->tm_mon + 1;
- Time->Day = tm->tm_mday;
- Time->Hour = tm->tm_hour;
- Time->Minute = tm->tm_min;
- Time->Second = tm->tm_sec;
- Time->Nanosecond = 0;
- Time->TimeZone = timezone;
- Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0)
- | (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
-
- if (Capabilities != NULL) {
- Capabilities->Resolution = 1;
- Capabilities->Accuracy = 50000000;
- Capabilities->SetsToZero = FALSE;
- }
-}
-
-
-
-VOID
-SecSetTime (
- IN EFI_TIME *Time
- )
-{
- // Don't change the time on the system
- // We could save delta to localtime() and have SecGetTime adjust return values?
- return;
-}
-
-
-EFI_STATUS
-SecGetNextProtocol (
- IN BOOLEAN EmuBusDriver,
- OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL
- )
-{
- return GetNextThunkProtocol (EmuBusDriver, Instance);
-}
-
-
-EMU_THUNK_PROTOCOL gEmuThunkProtocol = {
- GasketSecWriteStdErr,
- GasketSecConfigStdIn,
- GasketSecWriteStdOut,
- GasketSecReadStdIn,
- GasketSecPollStdIn,
- GasketSecMalloc,
- GasketSecValloc,
- GasketSecFree,
- GasketSecPeCoffGetEntryPoint,
- GasketSecPeCoffRelocateImageExtraAction,
- GasketSecPeCoffUnloadImageExtraAction,
- GasketSecEnableInterrupt,
- GasketSecDisableInterrupt,
- GasketQueryPerformanceFrequency,
- GasketQueryPerformanceCounter,
- GasketSecSleep,
- GasketSecCpuSleep,
- GasketSecExit,
- GasketSecGetTime,
- GasketSecSetTime,
- GasketSecSetTimer,
- GasketSecGetNextProtocol
-};
-
-
-VOID
-SecInitThunkProtocol (
- VOID
- )
-{
- // timezone and daylight lib globals depend on tzset be called 1st.
- tzset ();
-}
-
+/*++ @file
+ Since the SEC is the only program in our emulation we
+ must use a UEFI/PI mechanism to export APIs to other modules.
+ This is the role of the EFI_EMU_THUNK_PROTOCOL.
+
+ The mUnixThunkTable exists so that a change to EFI_EMU_THUNK_PROTOCOL
+ will cause an error in initializing the array if all the member functions
+ are not added. It looks like adding a element to end and not initializing
+ it may cause the table to be initaliized with the members at the end being
+ set to zero. This is bad as jumping to zero will crash.
+
+Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR>
+Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include "Host.h"
+
+#ifdef __APPLE__
+#define DebugAssert _Mangle__DebugAssert
+
+#include <assert.h>
+#include <CoreServices/CoreServices.h>
+#include <mach/mach.h>
+#include <mach/mach_time.h>
+
+#undef DebugAssert
+#endif
+
+int settimer_initialized;
+struct timeval settimer_timeval;
+void (*settimer_callback)(UINT64 delta);
+
+BOOLEAN gEmulatorInterruptEnabled = FALSE;
+
+
+UINTN
+SecWriteStdErr (
+ IN UINT8 *Buffer,
+ IN UINTN NumberOfBytes
+ )
+{
+ ssize_t Return;
+
+ Return = write (STDERR_FILENO, (const void *)Buffer, (size_t)NumberOfBytes);
+
+ return (Return == -1) ? 0 : Return;
+}
+
+
+EFI_STATUS
+SecConfigStdIn (
+ VOID
+ )
+{
+ struct termios tty;
+
+ //
+ // Need to turn off line buffering, ECHO, and make it unbuffered.
+ //
+ tcgetattr (STDIN_FILENO, &tty);
+ tty.c_lflag &= ~(ICANON | ECHO);
+ tcsetattr (STDIN_FILENO, TCSANOW, &tty);
+
+// setvbuf (STDIN_FILENO, NULL, _IONBF, 0);
+
+ // now ioctl FIONREAD will do what we need
+ return EFI_SUCCESS;
+}
+
+UINTN
+SecWriteStdOut (
+ IN UINT8 *Buffer,
+ IN UINTN NumberOfBytes
+ )
+{
+ ssize_t Return;
+
+ Return = write (STDOUT_FILENO, (const void *)Buffer, (size_t)NumberOfBytes);
+
+ return (Return == -1) ? 0 : Return;
+}
+
+UINTN
+SecReadStdIn (
+ IN UINT8 *Buffer,
+ IN UINTN NumberOfBytes
+ )
+{
+ ssize_t Return;
+
+ Return = read (STDIN_FILENO, Buffer, (size_t)NumberOfBytes);
+
+ return (Return == -1) ? 0 : Return;
+}
+
+BOOLEAN
+SecPollStdIn (
+ VOID
+ )
+{
+ int Result;
+ int Bytes;
+
+ Result = ioctl (STDIN_FILENO, FIONREAD, &Bytes);
+ if (Result == -1) {
+ return FALSE;
+ }
+
+ return (BOOLEAN)(Bytes > 0);
+}
+
+
+VOID *
+SecMalloc (
+ IN UINTN Size
+ )
+{
+ return malloc ((size_t)Size);
+}
+
+VOID *
+SecValloc (
+ IN UINTN Size
+ )
+{
+ return valloc ((size_t)Size);
+}
+
+BOOLEAN
+SecFree (
+ IN VOID *Ptr
+ )
+{
+ if (EfiSystemMemoryRange (Ptr)) {
+ // If an address range is in the EFI memory map it was alloced via EFI.
+ // So don't free those ranges and let the caller know.
+ return FALSE;
+ }
+
+ free (Ptr);
+ return TRUE;
+}
+
+
+void
+settimer_handler (int sig)
+{
+ struct timeval timeval;
+ UINT64 delta;
+
+ gettimeofday (&timeval, NULL);
+ delta = ((UINT64)timeval.tv_sec * 1000) + (timeval.tv_usec / 1000)
+ - ((UINT64)settimer_timeval.tv_sec * 1000)
+ - (settimer_timeval.tv_usec / 1000);
+ settimer_timeval = timeval;
+
+ if (settimer_callback) {
+ ReverseGasketUint64 (settimer_callback, delta);
+ }
+}
+
+VOID
+SecSetTimer (
+ IN UINT64 PeriodMs,
+ IN EMU_SET_TIMER_CALLBACK CallBack
+ )
+{
+ struct itimerval timerval;
+ UINT32 remainder;
+
+ if (!settimer_initialized) {
+ struct sigaction act;
+
+ settimer_initialized = 1;
+ act.sa_handler = settimer_handler;
+ act.sa_flags = 0;
+ sigemptyset (&act.sa_mask);
+ gEmulatorInterruptEnabled = TRUE;
+ if (sigaction (SIGALRM, &act, NULL) != 0) {
+ printf ("SetTimer: sigaction error %s\n", strerror (errno));
+ }
+ if (gettimeofday (&settimer_timeval, NULL) != 0) {
+ printf ("SetTimer: gettimeofday error %s\n", strerror (errno));
+ }
+ }
+ timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);
+ DivU64x32Remainder(PeriodMs, 1000, &remainder);
+ timerval.it_value.tv_usec = remainder * 1000;
+ timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);
+ timerval.it_interval = timerval.it_value;
+
+ if (setitimer (ITIMER_REAL, &timerval, NULL) != 0) {
+ printf ("SetTimer: setitimer error %s\n", strerror (errno));
+ }
+ settimer_callback = CallBack;
+}
+
+
+VOID
+SecEnableInterrupt (
+ VOID
+ )
+{
+ sigset_t sigset;
+
+ gEmulatorInterruptEnabled = TRUE;
+ // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
+ // by enabling/disabling SIGALRM.
+ sigemptyset (&sigset);
+ sigaddset (&sigset, SIGALRM);
+ pthread_sigmask (SIG_UNBLOCK, &sigset, NULL);
+}
+
+
+VOID
+SecDisableInterrupt (
+ VOID
+ )
+{
+ sigset_t sigset;
+
+ // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
+ // by enabling/disabling SIGALRM.
+ sigemptyset (&sigset);
+ sigaddset (&sigset, SIGALRM);
+ pthread_sigmask (SIG_BLOCK, &sigset, NULL);
+ gEmulatorInterruptEnabled = FALSE;
+}
+
+
+BOOLEAN
+SecInterruptEanbled (void)
+{
+ return gEmulatorInterruptEnabled;
+}
+
+
+UINT64
+QueryPerformanceFrequency (
+ VOID
+ )
+{
+ // Hard code to nanoseconds
+ return 1000000000ULL;
+}
+
+UINT64
+QueryPerformanceCounter (
+ VOID
+ )
+{
+#if __APPLE__
+ UINT64 Start;
+ static mach_timebase_info_data_t sTimebaseInfo;
+
+
+ Start = mach_absolute_time ();
+
+ // Convert to nanoseconds.
+
+ // If this is the first time we've run, get the timebase.
+ // We can use denom == 0 to indicate that sTimebaseInfo is
+ // uninitialised because it makes no sense to have a zero
+ // denominator is a fraction.
+
+ if ( sTimebaseInfo.denom == 0 ) {
+ (void) mach_timebase_info(&sTimebaseInfo);
+ }
+
+ // Do the maths. We hope that the multiplication doesn't
+ // overflow; the price you pay for working in fixed point.
+
+ return (Start * sTimebaseInfo.numer) / sTimebaseInfo.denom;
+#else
+ // Need to figure out what to do for Linux?
+ return 0;
+#endif
+}
+
+
+
+VOID
+SecSleep (
+ IN UINT64 Nanoseconds
+ )
+{
+ struct timespec rq, rm;
+ struct timeval start, end;
+ unsigned long MicroSec;
+
+ rq.tv_sec = DivU64x32 (Nanoseconds, 1000000000);
+ rq.tv_nsec = ModU64x32 (Nanoseconds, 1000000000);
+
+ //
+ // nanosleep gets interrupted by our timer tic.
+ // we need to track wall clock time or we will stall for way too long
+ //
+ gettimeofday (&start, NULL);
+ end.tv_sec = start.tv_sec + rq.tv_sec;
+ MicroSec = (start.tv_usec + rq.tv_nsec/1000);
+ end.tv_usec = MicroSec % 1000000;
+ if (MicroSec > 1000000) {
+ end.tv_sec++;
+ }
+
+ while (nanosleep (&rq, &rm) == -1) {
+ if (errno != EINTR) {
+ break;
+ }
+ gettimeofday (&start, NULL);
+ if (start.tv_sec > end.tv_sec) {
+ break;
+ } if ((start.tv_sec == end.tv_sec) && (start.tv_usec > end.tv_usec)) {
+ break;
+ }
+ rq = rm;
+ }
+}
+
+
+VOID
+SecCpuSleep (
+ VOID
+ )
+{
+ struct timespec rq, rm;
+
+ // nanosleep gets interrupted by the timer tic
+ rq.tv_sec = 1;
+ rq.tv_nsec = 0;
+
+ nanosleep (&rq, &rm);
+}
+
+
+VOID
+SecExit (
+ UINTN Status
+ )
+{
+ exit (Status);
+}
+
+
+VOID
+SecGetTime (
+ OUT EFI_TIME *Time,
+ OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
+ )
+{
+ struct tm *tm;
+ time_t t;
+
+ t = time (NULL);
+ tm = localtime (&t);
+
+ Time->Year = 1900 + tm->tm_year;
+ Time->Month = tm->tm_mon + 1;
+ Time->Day = tm->tm_mday;
+ Time->Hour = tm->tm_hour;
+ Time->Minute = tm->tm_min;
+ Time->Second = tm->tm_sec;
+ Time->Nanosecond = 0;
+ Time->TimeZone = timezone;
+ Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0)
+ | (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
+
+ if (Capabilities != NULL) {
+ Capabilities->Resolution = 1;
+ Capabilities->Accuracy = 50000000;
+ Capabilities->SetsToZero = FALSE;
+ }
+}
+
+
+
+VOID
+SecSetTime (
+ IN EFI_TIME *Time
+ )
+{
+ // Don't change the time on the system
+ // We could save delta to localtime() and have SecGetTime adjust return values?
+ return;
+}
+
+
+EFI_STATUS
+SecGetNextProtocol (
+ IN BOOLEAN EmuBusDriver,
+ OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL
+ )
+{
+ return GetNextThunkProtocol (EmuBusDriver, Instance);
+}
+
+
+EMU_THUNK_PROTOCOL gEmuThunkProtocol = {
+ GasketSecWriteStdErr,
+ GasketSecConfigStdIn,
+ GasketSecWriteStdOut,
+ GasketSecReadStdIn,
+ GasketSecPollStdIn,
+ GasketSecMalloc,
+ GasketSecValloc,
+ GasketSecFree,
+ GasketSecPeCoffGetEntryPoint,
+ GasketSecPeCoffRelocateImageExtraAction,
+ GasketSecPeCoffUnloadImageExtraAction,
+ GasketSecEnableInterrupt,
+ GasketSecDisableInterrupt,
+ GasketQueryPerformanceFrequency,
+ GasketQueryPerformanceCounter,
+ GasketSecSleep,
+ GasketSecCpuSleep,
+ GasketSecExit,
+ GasketSecGetTime,
+ GasketSecSetTime,
+ GasketSecSetTimer,
+ GasketSecGetNextProtocol
+};
+
+
+VOID
+SecInitThunkProtocol (
+ VOID
+ )
+{
+ // timezone and daylight lib globals depend on tzset be called 1st.
+ tzset ();
+}
+
diff --git a/EmulatorPkg/Unix/Host/Host.c b/EmulatorPkg/Unix/Host/Host.c
index f84b22f576..9aba7c854d 100644
--- a/EmulatorPkg/Unix/Host/Host.c
+++ b/EmulatorPkg/Unix/Host/Host.c
@@ -1148,7 +1148,7 @@ GdbScriptAddImage (
if (ImageContext->PdbPointer != NULL && !IsPdbFile (ImageContext->PdbPointer)) {
FILE *GdbTempFile;
- if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
+ if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
GdbTempFile = fopen (gGdbWorkingFileName, "a");
if (GdbTempFile != NULL) {
long unsigned int SymbolsAddr = (long unsigned int)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders);
@@ -1170,13 +1170,13 @@ GdbScriptAddImage (
GdbTempFile = fopen (gGdbWorkingFileName, "w");
if (GdbTempFile != NULL) {
fprintf (
- GdbTempFile,
- "add-symbol-file %s 0x%08lx\n",
- ImageContext->PdbPointer,
+ GdbTempFile,
+ "add-symbol-file %s 0x%08lx\n",
+ ImageContext->PdbPointer,
(long unsigned int)(ImageContext->ImageAddress + ImageContext->SizeOfHeaders)
);
fclose (GdbTempFile);
-
+
//
// Target for gdb breakpoint in a script that uses gGdbWorkingFileName to set a breakpoint.
// Hey what can you say scripting in gdb is not that great....
@@ -1225,7 +1225,7 @@ GdbScriptRemoveImage (
return;
}
- if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
+ if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
//
// Write the file we need for the gdb script
//
@@ -1256,7 +1256,7 @@ GdbScriptRemoveImage (
SecGdbScriptBreak (ImageContext->PdbPointer, strlen (ImageContext->PdbPointer) + 1, 0, 0);
} else {
ASSERT (FALSE);
- }
+ }
}
}
diff --git a/EmulatorPkg/Unix/Host/Host.h b/EmulatorPkg/Unix/Host/Host.h
index 66c7c8df12..f7db46cdcd 100644
--- a/EmulatorPkg/Unix/Host/Host.h
+++ b/EmulatorPkg/Unix/Host/Host.h
@@ -82,7 +82,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#undef NTOHS
#undef HTONS
#undef B0
-#undef CR3
+#undef CR3
#include <PiPei.h>
#include <Uefi.h>
diff --git a/EmulatorPkg/Unix/Host/Ia32/Gasket.S b/EmulatorPkg/Unix/Host/Ia32/Gasket.S
index aa90ea8095..5664cc54b4 100644
--- a/EmulatorPkg/Unix/Host/Ia32/Gasket.S
+++ b/EmulatorPkg/Unix/Host/Ia32/Gasket.S
@@ -1,1492 +1,1492 @@
-#------------------------------------------------------------------------------
-#
-# Manage differenced between UNIX ABI and EFI/Windows ABI
-#
-# For IA-32 the only difference is Mac OS X requires a 16-byte aligned stack.
-# For Linux this stack adjustment is a no-op, but we may as well make the
-# the code common.
-#
-# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
-# This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution. The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-#------------------------------------------------------------------------------
-
-
-
- .text
-
-//
-// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)
-//
-
-
-ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)
-ASM_PFX(GasketSecWriteStdErr):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(SecWriteStdErr)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)
-ASM_PFX(GasketSecConfigStdIn):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(SecConfigStdIn)
-
- leave
- ret
-
-ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)
-ASM_PFX(GasketSecWriteStdOut):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(SecWriteStdOut)
-
- leave
- ret
-
-ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)
-ASM_PFX(GasketSecReadStdIn):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(SecReadStdIn)
-
- leave
- ret
-
-ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)
-ASM_PFX(GasketSecPollStdIn):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(SecPollStdIn)
-
- leave
- ret
-
-ASM_GLOBAL ASM_PFX(GasketSecMalloc)
-ASM_PFX(GasketSecMalloc):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(SecMalloc)
-
- leave
- ret
-
-ASM_GLOBAL ASM_PFX(GasketSecValloc)
-ASM_PFX(GasketSecValloc):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(SecValloc)
-
- leave
- ret
-
-ASM_GLOBAL ASM_PFX(GasketSecFree)
-ASM_PFX(GasketSecFree):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(SecFree)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecSetTimer)
-ASM_PFX(GasketSecSetTimer):
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 8(%ebp), %eax
- movl 12(%ebp), %edx
- movl %edx, 4(%esp)
- movl %eax, (%esp)
-
- call ASM_PFX(SecSetTimer)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)
-ASM_PFX(GasketSecEnableInterrupt):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
-
- call ASM_PFX(SecEnableInterrupt)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)
-ASM_PFX(GasketSecDisableInterrupt):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
-
- call ASM_PFX(SecDisableInterrupt)
-
- leave
- ret
-
-ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)
-ASM_PFX(GasketQueryPerformanceFrequency):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
-
- call ASM_PFX(QueryPerformanceFrequency)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)
-ASM_PFX(GasketQueryPerformanceCounter):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
-
- call ASM_PFX(QueryPerformanceCounter)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecSleep)
-ASM_PFX(GasketSecSleep):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl 12(%ebp), %ecx
- movl %ecx, 4(%esp)
- movl %eax, (%esp)
-
- call ASM_PFX(SecSleep)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)
-ASM_PFX(GasketSecCpuSleep):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
-
- call ASM_PFX(SecCpuSleep)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecExit)
-ASM_PFX(GasketSecExit):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(SecExit) // Less to do as we will never return to EFI ABI world
-LDEAD_LOOP:
- jmp LDEAD_LOOP // _exit should never return
-
-
-ASM_GLOBAL ASM_PFX(GasketSecGetTime)
-ASM_PFX(GasketSecGetTime):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(SecGetTime)
-
- leave
- ret
-
-ASM_GLOBAL ASM_PFX(GasketSecSetTime)
-ASM_PFX(GasketSecSetTime):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(SecSetTime)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)
-ASM_PFX(GasketSecGetNextProtocol):
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 20(%ebp), %eax
- movl %eax, 12(%esp)
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(SecGetNextProtocol)
-
- leave
- ret
-
-// PPIs produced by SEC
-
-ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)
-ASM_PFX(GasketSecPeCoffGetEntryPoint):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(SecPeCoffGetEntryPoint)
-
- leave
- ret
-
-ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)
-ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(SecPeCoffRelocateImageExtraAction)
-
- leave
- ret
-
-ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)
-ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(SecPeCoffUnloadImageExtraAction)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)
-ASM_PFX(GasketSecEmuThunkAddress):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
-
- call ASM_PFX(SecEmuThunkAddress)
-
- leave
- ret
-
-//
-// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
-//
-
-ASM_GLOBAL ASM_PFX(GasketX11Size)
-ASM_PFX(GasketX11Size):
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 20(%ebp), %eax
- movl %eax, 12(%esp)
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(X11Size)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11CheckKey)
-ASM_PFX(GasketX11CheckKey):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(X11CheckKey)
-
- leave
- ret
-
-ASM_GLOBAL ASM_PFX(GasketX11GetKey)
-ASM_PFX(GasketX11GetKey):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(X11GetKey)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11KeySetState)
-ASM_PFX(GasketX11KeySetState):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(X11KeySetState)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)
-ASM_PFX(GasketX11RegisterKeyNotify):
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 20(%ebp), %eax
- movl %eax, 12(%esp)
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(X11RegisterKeyNotify)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11Blt)
-ASM_PFX(GasketX11Blt):
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 20(%ebp), %eax
- movl %eax, 12(%esp)
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(X11Blt)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)
-ASM_PFX(GasketX11CheckPointer):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(X11CheckPointer)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)
-ASM_PFX(GasketX11GetPointerState):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(X11GetPointerState)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)
-ASM_PFX(GasketX11GraphicsWindowOpen):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(X11GraphicsWindowOpen)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)
-ASM_PFX(GasketX11GraphicsWindowClose):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(X11GraphicsWindowClose)
-
- leave
- ret
-
-
-// Pthreads
-
-ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)
-ASM_PFX(GasketPthreadMutexLock):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(PthreadMutexLock)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)
-ASM_PFX(GasketPthreadMutexUnLock):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(PthreadMutexUnLock)
-
- leave
- ret
-
-ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)
-ASM_PFX(GasketPthreadMutexTryLock):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(PthreadMutexTryLock)
-
- leave
- ret
-
-ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)
-ASM_PFX(GasketPthreadMutexInit):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
-
- call ASM_PFX(PthreadMutexInit)
-
- leave
- ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)
-ASM_PFX(GasketPthreadMutexDestroy):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(PthreadMutexDestroy)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadCreate)
-ASM_PFX(GasketPthreadCreate):
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 20(%ebp), %eax
- movl %eax, 12(%esp)
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(PthreadCreate)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadExit)
-ASM_PFX(GasketPthreadExit):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(PthreadExit)
-
- leave
- ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadSelf)
-ASM_PFX(GasketPthreadSelf):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
-
- call ASM_PFX(PthreadSelf)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadOpen)
-ASM_PFX(GasketPthreadOpen):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(PthreadOpen)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadClose)
-ASM_PFX(GasketPthreadClose):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(PthreadClose)
-
- leave
- ret
-
-
-
-
-//
-// UNIX ABI to EFI ABI call
-//
-// UINTN
-// ReverseGasketUint64 (
-// void *Api,
-// UINTN Arg1
-// );
-ASM_GLOBAL ASM_PFX(ReverseGasketUint64)
-ASM_PFX(ReverseGasketUint64):
- pushl %ebp
- movl %esp, %ebp
- subl $8, %esp
- movl 16(%ebp), %eax
- movl %eax, 4(%esp)
- movl 12(%ebp), %eax
- movl %eax, (%esp)
- calll *8(%ebp)
- addl $8, %esp
- popl %ebp
- ret
-
-
-
-//
-// UNIX ABI to EFI ABI call
-//
-// UINTN
-// ReverseGasketUint64Uint64 (
-// void *Api,
-// UINTN Arg1
-// UINTN Arg2
-// );
-ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)
-ASM_PFX(ReverseGasketUint64Uint64):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp
- movl 24(%ebp), %eax
- movl %eax, 12(%esp)
- movl 20(%ebp), %eax
- movl %eax, 8(%esp)
- movl 16(%ebp), %eax
- movl %eax, 4(%esp)
- movl 12(%ebp), %eax
- movl %eax, (%esp)
- calll *8(%ebp)
- addl $24, %esp
- popl %ebp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)
-ASM_PFX(GasketSecUnixPeiAutoScan):
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(SecUnixPeiAutoScan)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)
-ASM_PFX(GasketSecUnixFdAddress):
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 20(%ebp), %eax
- movl %eax, 12(%esp)
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(SecUnixFdAddress)
-
- leave
- ret
-
-
-// EmuIoThunk SimpleFileSystem
-
-ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)
-ASM_PFX(GasketPosixOpenVolume):
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 20(%ebp), %eax
- movl %eax, 12(%esp)
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(PosixOpenVolume)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)
-ASM_PFX(GasketPosixFileOpen):
- pushl %ebp
- movl %esp, %ebp
- subl $56, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 28(%ebp), %eax
- movl 32(%ebp), %ecx
- movl %ecx, 24(%esp)
- movl %eax, 20(%esp)
- movl 20(%ebp), %eax
- movl 24(%ebp), %ecx
- movl %ecx, 16(%esp)
- movl %eax, 12(%esp)
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(PosixFileOpen)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)
-ASM_PFX(GasketPosixFileCLose):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(PosixFileCLose)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)
-ASM_PFX(GasketPosixFileDelete):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(PosixFileDelete)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileRead)
-ASM_PFX(GasketPosixFileRead):
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(PosixFileRead)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)
-ASM_PFX(GasketPosixFileWrite):
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(PosixFileWrite)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)
-ASM_PFX(GasketPosixFileSetPossition):
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl 16(%ebp), %ecx
- movl %ecx, 8(%esp)
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(PosixFileSetPossition)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)
-ASM_PFX(GasketPosixFileGetPossition):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(PosixFileGetPossition)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)
-ASM_PFX(GasketPosixFileGetInfo):
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 20(%ebp), %eax
- movl %eax, 12(%esp)
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(PosixFileGetInfo)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)
-ASM_PFX(GasketPosixFileSetInfo):
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 20(%ebp), %eax
- movl %eax, 12(%esp)
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(PosixFileSetInfo)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)
-ASM_PFX(GasketPosixFileFlush):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(PosixFileFlush)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)
-ASM_PFX(GasketPosixFileSystmeThunkOpen):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(PosixFileSystmeThunkOpen)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)
-ASM_PFX(GasketPosixFileSystmeThunkClose):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(PosixFileSystmeThunkClose)
-
- leave
- ret
-
-ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)
-ASM_PFX(GasketEmuBlockIoReset):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(EmuBlockIoReset)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)
-ASM_PFX(GasketEmuBlockIoReadBlocks):
- pushl %ebp
- movl %esp, %ebp
- subl $56, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 32(%ebp), %eax
- movl %eax, 24(%esp)
- movl 28(%ebp), %eax
- movl %eax, 20(%esp)
- movl 24(%ebp), %eax
- movl %eax, 16(%esp)
- movl 16(%ebp), %eax
- movl 20(%ebp), %edx
- movl %edx, 12(%esp)
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(EmuBlockIoReadBlocks)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)
-ASM_PFX(GasketEmuBlockIoWriteBlocks):
- pushl %ebp
- movl %esp, %ebp
- subl $56, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 32(%ebp), %eax
- movl %eax, 24(%esp)
- movl 28(%ebp), %eax
- movl %eax, 20(%esp)
- movl 24(%ebp), %eax
- movl %eax, 16(%esp)
- movl 16(%ebp), %eax
- movl 20(%ebp), %edx
- movl %edx, 12(%esp)
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(EmuBlockIoWriteBlocks)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)
-ASM_PFX(GasketEmuBlockIoFlushBlocks): pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
-
- call ASM_PFX(EmuBlockIoFlushBlocks)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)
-ASM_PFX(GasketEmuBlockIoCreateMapping):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(EmuBlockIoCreateMapping)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)
-ASM_PFX(GasketBlockIoThunkOpen):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(EmuBlockIoThunkOpen)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)
-ASM_PFX(GasketBlockIoThunkClose):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(EmuBlockIoThunkClose)
-
- leave
- ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)
-ASM_PFX(GasketSnpCreateMapping):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(EmuSnpCreateMapping)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpStart)
-ASM_PFX(GasketSnpStart):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(EmuSnpStart)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpStop)
-ASM_PFX(GasketSnpStop):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(EmuSnpStop)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpInitialize)
-ASM_PFX(GasketSnpInitialize):
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(EmuSnpInitialize)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpReset)
-ASM_PFX(GasketSnpReset):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(EmuSnpReset)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpShutdown)
-ASM_PFX(GasketSnpShutdown):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(EmuSnpShutdown)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)
-ASM_PFX(GasketSnpReceiveFilters):
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 28(%ebp), %eax
- movl %eax, 20(%esp)
- movl 24(%ebp), %eax
- movl %eax, 16(%esp)
- movl 20(%ebp), %eax
- movl %eax, 12(%esp)
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(EmuSnpReceiveFilters)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)
-ASM_PFX(GasketSnpStationAddress):
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- leave
- ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpStatistics)
-ASM_PFX(GasketSnpStatistics):
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 20(%ebp), %eax
- movl %eax, 12(%esp)
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(EmuSnpStatistics)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)
-ASM_PFX(GasketSnpMCastIpToMac):
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 20(%ebp), %eax
- movl %eax, 12(%esp)
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(EmuSnpMCastIpToMac)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpNvData)
-ASM_PFX(GasketSnpNvData):
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 24(%ebp), %eax
- movl %eax, 16(%esp)
- movl 20(%ebp), %eax
- movl %eax, 12(%esp)
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(EmuSnpNvData)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)
-ASM_PFX(GasketSnpGetStatus):
- pushl %ebp
- movl %esp, %ebp
- subl $40, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(EmuSnpGetStatus)
-
- leave
- ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpTransmit)
-ASM_PFX(GasketSnpTransmit):
- pushl %ebp
- movl %esp, %ebp
- subl $56, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 32(%ebp), %eax
- movl %eax, 24(%esp)
- movl 28(%ebp), %eax
- movl %eax, 20(%esp)
- movl 24(%ebp), %eax
- movl %eax, 16(%esp)
- movl 20(%ebp), %eax
- movl %eax, 12(%esp)
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(EmuSnpTransmit)
-
- leave
- ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpReceive)
-ASM_PFX(GasketSnpReceive):
- pushl %ebp
- movl %esp, %ebp
- subl $56, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 32(%ebp), %eax
- movl %eax, 24(%esp)
- movl 28(%ebp), %eax
- movl %eax, 20(%esp)
- movl 24(%ebp), %eax
- movl %eax, 16(%esp)
- movl 20(%ebp), %eax
- movl %eax, 12(%esp)
- movl 16(%ebp), %eax
- movl %eax, 8(%esp)
- movl 12(%ebp), %eax
- movl %eax, 4(%esp)
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(EmuSnpReceive)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)
-ASM_PFX(GasketSnpThunkOpen):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(EmuSnpThunkOpen)
-
- leave
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)
-ASM_PFX(GasketSnpThunkClose):
- pushl %ebp
- movl %esp, %ebp
- subl $24, %esp // sub extra 16 from the stack for alignment
- and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
- movl 8(%ebp), %eax
- movl %eax, (%esp)
-
- call ASM_PFX(EmuSnpThunkClose)
-
- leave
- ret
-
-
+#------------------------------------------------------------------------------
+#
+# Manage differenced between UNIX ABI and EFI/Windows ABI
+#
+# For IA-32 the only difference is Mac OS X requires a 16-byte aligned stack.
+# For Linux this stack adjustment is a no-op, but we may as well make the
+# the code common.
+#
+# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#------------------------------------------------------------------------------
+
+
+
+ .text
+
+//
+// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)
+//
+
+
+ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)
+ASM_PFX(GasketSecWriteStdErr):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(SecWriteStdErr)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)
+ASM_PFX(GasketSecConfigStdIn):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(SecConfigStdIn)
+
+ leave
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)
+ASM_PFX(GasketSecWriteStdOut):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(SecWriteStdOut)
+
+ leave
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)
+ASM_PFX(GasketSecReadStdIn):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(SecReadStdIn)
+
+ leave
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)
+ASM_PFX(GasketSecPollStdIn):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(SecPollStdIn)
+
+ leave
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketSecMalloc)
+ASM_PFX(GasketSecMalloc):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(SecMalloc)
+
+ leave
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketSecValloc)
+ASM_PFX(GasketSecValloc):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(SecValloc)
+
+ leave
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketSecFree)
+ASM_PFX(GasketSecFree):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(SecFree)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecSetTimer)
+ASM_PFX(GasketSecSetTimer):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 8(%ebp), %eax
+ movl 12(%ebp), %edx
+ movl %edx, 4(%esp)
+ movl %eax, (%esp)
+
+ call ASM_PFX(SecSetTimer)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)
+ASM_PFX(GasketSecEnableInterrupt):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+
+ call ASM_PFX(SecEnableInterrupt)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)
+ASM_PFX(GasketSecDisableInterrupt):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+
+ call ASM_PFX(SecDisableInterrupt)
+
+ leave
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)
+ASM_PFX(GasketQueryPerformanceFrequency):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+
+ call ASM_PFX(QueryPerformanceFrequency)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)
+ASM_PFX(GasketQueryPerformanceCounter):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+
+ call ASM_PFX(QueryPerformanceCounter)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecSleep)
+ASM_PFX(GasketSecSleep):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl 12(%ebp), %ecx
+ movl %ecx, 4(%esp)
+ movl %eax, (%esp)
+
+ call ASM_PFX(SecSleep)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)
+ASM_PFX(GasketSecCpuSleep):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+
+ call ASM_PFX(SecCpuSleep)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecExit)
+ASM_PFX(GasketSecExit):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(SecExit) // Less to do as we will never return to EFI ABI world
+LDEAD_LOOP:
+ jmp LDEAD_LOOP // _exit should never return
+
+
+ASM_GLOBAL ASM_PFX(GasketSecGetTime)
+ASM_PFX(GasketSecGetTime):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(SecGetTime)
+
+ leave
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketSecSetTime)
+ASM_PFX(GasketSecSetTime):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(SecSetTime)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)
+ASM_PFX(GasketSecGetNextProtocol):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 20(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(SecGetNextProtocol)
+
+ leave
+ ret
+
+// PPIs produced by SEC
+
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)
+ASM_PFX(GasketSecPeCoffGetEntryPoint):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(SecPeCoffGetEntryPoint)
+
+ leave
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)
+ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(SecPeCoffRelocateImageExtraAction)
+
+ leave
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)
+ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(SecPeCoffUnloadImageExtraAction)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)
+ASM_PFX(GasketSecEmuThunkAddress):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+
+ call ASM_PFX(SecEmuThunkAddress)
+
+ leave
+ ret
+
+//
+// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
+//
+
+ASM_GLOBAL ASM_PFX(GasketX11Size)
+ASM_PFX(GasketX11Size):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 20(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(X11Size)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11CheckKey)
+ASM_PFX(GasketX11CheckKey):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(X11CheckKey)
+
+ leave
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketX11GetKey)
+ASM_PFX(GasketX11GetKey):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(X11GetKey)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11KeySetState)
+ASM_PFX(GasketX11KeySetState):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(X11KeySetState)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)
+ASM_PFX(GasketX11RegisterKeyNotify):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 20(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(X11RegisterKeyNotify)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11Blt)
+ASM_PFX(GasketX11Blt):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 20(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(X11Blt)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)
+ASM_PFX(GasketX11CheckPointer):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(X11CheckPointer)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)
+ASM_PFX(GasketX11GetPointerState):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(X11GetPointerState)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)
+ASM_PFX(GasketX11GraphicsWindowOpen):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(X11GraphicsWindowOpen)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)
+ASM_PFX(GasketX11GraphicsWindowClose):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(X11GraphicsWindowClose)
+
+ leave
+ ret
+
+
+// Pthreads
+
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)
+ASM_PFX(GasketPthreadMutexLock):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(PthreadMutexLock)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)
+ASM_PFX(GasketPthreadMutexUnLock):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(PthreadMutexUnLock)
+
+ leave
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)
+ASM_PFX(GasketPthreadMutexTryLock):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(PthreadMutexTryLock)
+
+ leave
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)
+ASM_PFX(GasketPthreadMutexInit):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+
+ call ASM_PFX(PthreadMutexInit)
+
+ leave
+ ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)
+ASM_PFX(GasketPthreadMutexDestroy):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(PthreadMutexDestroy)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadCreate)
+ASM_PFX(GasketPthreadCreate):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 20(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(PthreadCreate)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadExit)
+ASM_PFX(GasketPthreadExit):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(PthreadExit)
+
+ leave
+ ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadSelf)
+ASM_PFX(GasketPthreadSelf):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+
+ call ASM_PFX(PthreadSelf)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadOpen)
+ASM_PFX(GasketPthreadOpen):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(PthreadOpen)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadClose)
+ASM_PFX(GasketPthreadClose):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(PthreadClose)
+
+ leave
+ ret
+
+
+
+
+//
+// UNIX ABI to EFI ABI call
+//
+// UINTN
+// ReverseGasketUint64 (
+// void *Api,
+// UINTN Arg1
+// );
+ASM_GLOBAL ASM_PFX(ReverseGasketUint64)
+ASM_PFX(ReverseGasketUint64):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $8, %esp
+ movl 16(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ calll *8(%ebp)
+ addl $8, %esp
+ popl %ebp
+ ret
+
+
+
+//
+// UNIX ABI to EFI ABI call
+//
+// UINTN
+// ReverseGasketUint64Uint64 (
+// void *Api,
+// UINTN Arg1
+// UINTN Arg2
+// );
+ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)
+ASM_PFX(ReverseGasketUint64Uint64):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp
+ movl 24(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 20(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, (%esp)
+ calll *8(%ebp)
+ addl $24, %esp
+ popl %ebp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)
+ASM_PFX(GasketSecUnixPeiAutoScan):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(SecUnixPeiAutoScan)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)
+ASM_PFX(GasketSecUnixFdAddress):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 20(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(SecUnixFdAddress)
+
+ leave
+ ret
+
+
+// EmuIoThunk SimpleFileSystem
+
+ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)
+ASM_PFX(GasketPosixOpenVolume):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 20(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(PosixOpenVolume)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)
+ASM_PFX(GasketPosixFileOpen):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $56, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 28(%ebp), %eax
+ movl 32(%ebp), %ecx
+ movl %ecx, 24(%esp)
+ movl %eax, 20(%esp)
+ movl 20(%ebp), %eax
+ movl 24(%ebp), %ecx
+ movl %ecx, 16(%esp)
+ movl %eax, 12(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(PosixFileOpen)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)
+ASM_PFX(GasketPosixFileCLose):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(PosixFileCLose)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)
+ASM_PFX(GasketPosixFileDelete):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(PosixFileDelete)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileRead)
+ASM_PFX(GasketPosixFileRead):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(PosixFileRead)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)
+ASM_PFX(GasketPosixFileWrite):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(PosixFileWrite)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)
+ASM_PFX(GasketPosixFileSetPossition):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl 16(%ebp), %ecx
+ movl %ecx, 8(%esp)
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(PosixFileSetPossition)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)
+ASM_PFX(GasketPosixFileGetPossition):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(PosixFileGetPossition)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)
+ASM_PFX(GasketPosixFileGetInfo):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 20(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(PosixFileGetInfo)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)
+ASM_PFX(GasketPosixFileSetInfo):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 20(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(PosixFileSetInfo)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)
+ASM_PFX(GasketPosixFileFlush):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(PosixFileFlush)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)
+ASM_PFX(GasketPosixFileSystmeThunkOpen):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(PosixFileSystmeThunkOpen)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)
+ASM_PFX(GasketPosixFileSystmeThunkClose):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(PosixFileSystmeThunkClose)
+
+ leave
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)
+ASM_PFX(GasketEmuBlockIoReset):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(EmuBlockIoReset)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)
+ASM_PFX(GasketEmuBlockIoReadBlocks):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $56, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 32(%ebp), %eax
+ movl %eax, 24(%esp)
+ movl 28(%ebp), %eax
+ movl %eax, 20(%esp)
+ movl 24(%ebp), %eax
+ movl %eax, 16(%esp)
+ movl 16(%ebp), %eax
+ movl 20(%ebp), %edx
+ movl %edx, 12(%esp)
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(EmuBlockIoReadBlocks)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)
+ASM_PFX(GasketEmuBlockIoWriteBlocks):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $56, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 32(%ebp), %eax
+ movl %eax, 24(%esp)
+ movl 28(%ebp), %eax
+ movl %eax, 20(%esp)
+ movl 24(%ebp), %eax
+ movl %eax, 16(%esp)
+ movl 16(%ebp), %eax
+ movl 20(%ebp), %edx
+ movl %edx, 12(%esp)
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(EmuBlockIoWriteBlocks)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)
+ASM_PFX(GasketEmuBlockIoFlushBlocks): pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+
+ call ASM_PFX(EmuBlockIoFlushBlocks)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)
+ASM_PFX(GasketEmuBlockIoCreateMapping):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(EmuBlockIoCreateMapping)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)
+ASM_PFX(GasketBlockIoThunkOpen):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(EmuBlockIoThunkOpen)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)
+ASM_PFX(GasketBlockIoThunkClose):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(EmuBlockIoThunkClose)
+
+ leave
+ ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)
+ASM_PFX(GasketSnpCreateMapping):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(EmuSnpCreateMapping)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpStart)
+ASM_PFX(GasketSnpStart):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(EmuSnpStart)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpStop)
+ASM_PFX(GasketSnpStop):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(EmuSnpStop)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpInitialize)
+ASM_PFX(GasketSnpInitialize):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(EmuSnpInitialize)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpReset)
+ASM_PFX(GasketSnpReset):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(EmuSnpReset)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpShutdown)
+ASM_PFX(GasketSnpShutdown):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(EmuSnpShutdown)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)
+ASM_PFX(GasketSnpReceiveFilters):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 28(%ebp), %eax
+ movl %eax, 20(%esp)
+ movl 24(%ebp), %eax
+ movl %eax, 16(%esp)
+ movl 20(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(EmuSnpReceiveFilters)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)
+ASM_PFX(GasketSnpStationAddress):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ leave
+ ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpStatistics)
+ASM_PFX(GasketSnpStatistics):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 20(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(EmuSnpStatistics)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)
+ASM_PFX(GasketSnpMCastIpToMac):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 20(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(EmuSnpMCastIpToMac)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpNvData)
+ASM_PFX(GasketSnpNvData):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 24(%ebp), %eax
+ movl %eax, 16(%esp)
+ movl 20(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(EmuSnpNvData)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)
+ASM_PFX(GasketSnpGetStatus):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $40, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(EmuSnpGetStatus)
+
+ leave
+ ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpTransmit)
+ASM_PFX(GasketSnpTransmit):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $56, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 32(%ebp), %eax
+ movl %eax, 24(%esp)
+ movl 28(%ebp), %eax
+ movl %eax, 20(%esp)
+ movl 24(%ebp), %eax
+ movl %eax, 16(%esp)
+ movl 20(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(EmuSnpTransmit)
+
+ leave
+ ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpReceive)
+ASM_PFX(GasketSnpReceive):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $56, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 32(%ebp), %eax
+ movl %eax, 24(%esp)
+ movl 28(%ebp), %eax
+ movl %eax, 20(%esp)
+ movl 24(%ebp), %eax
+ movl %eax, 16(%esp)
+ movl 20(%ebp), %eax
+ movl %eax, 12(%esp)
+ movl 16(%ebp), %eax
+ movl %eax, 8(%esp)
+ movl 12(%ebp), %eax
+ movl %eax, 4(%esp)
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(EmuSnpReceive)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)
+ASM_PFX(GasketSnpThunkOpen):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(EmuSnpThunkOpen)
+
+ leave
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)
+ASM_PFX(GasketSnpThunkClose):
+ pushl %ebp
+ movl %esp, %ebp
+ subl $24, %esp // sub extra 16 from the stack for alignment
+ and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
+ movl 8(%ebp), %eax
+ movl %eax, (%esp)
+
+ call ASM_PFX(EmuSnpThunkClose)
+
+ leave
+ ret
+
+
diff --git a/EmulatorPkg/Unix/Host/Ia32/SwitchStack.c b/EmulatorPkg/Unix/Host/Ia32/SwitchStack.c
index 118083f4b5..79baeaf1f2 100644
--- a/EmulatorPkg/Unix/Host/Ia32/SwitchStack.c
+++ b/EmulatorPkg/Unix/Host/Ia32/SwitchStack.c
@@ -1,74 +1,74 @@
-/*++
-
-Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
-Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-
---*/
-
-#include "Host.h"
-
-
-/**
- Transfers control to a function starting with a new stack.
-
- Transfers control to the function specified by EntryPoint using the new stack
- specified by NewStack and passing in the parameters specified by Context1 and
- Context2. Context1 and Context2 are optional and may be NULL. The function
- EntryPoint must never return.
-
- If EntryPoint is NULL, then ASSERT().
- If NewStack is NULL, then ASSERT().
-
- @param EntryPoint A pointer to function to call with the new stack.
- @param Context1 A pointer to the context to pass into the EntryPoint
- function.
- @param Context2 A pointer to the context to pass into the EntryPoint
- function.
- @param NewStack A pointer to the new stack to use for the EntryPoint
- function.
-
-**/
-VOID
-EFIAPI
-PeiSwitchStacks (
- IN SWITCH_STACK_ENTRY_POINT EntryPoint,
- IN VOID *Context1, OPTIONAL
- IN VOID *Context2, OPTIONAL
- IN VOID *NewStack
- )
-{
- BASE_LIBRARY_JUMP_BUFFER JumpBuffer;
-
- ASSERT (EntryPoint != NULL);
- ASSERT (NewStack != NULL);
-
- //
- // Stack should be aligned with CPU_STACK_ALIGNMENT
- //
- ASSERT (((UINTN)NewStack & (CPU_STACK_ALIGNMENT - 1)) == 0);
-
- JumpBuffer.Eip = (UINTN)EntryPoint;
- JumpBuffer.Esp = (UINTN)NewStack - sizeof (VOID*);
- JumpBuffer.Esp -= sizeof (Context1) + sizeof (Context2);
- ((VOID**)JumpBuffer.Esp)[1] = Context1;
- ((VOID**)JumpBuffer.Esp)[2] = Context2;
-
- LongJump (&JumpBuffer, (UINTN)-1);
-
-
- //
- // PeiSwitchStacks () will never return
- //
- ASSERT (FALSE);
-}
-
-
-
+/*++
+
+Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
+Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+
+--*/
+
+#include "Host.h"
+
+
+/**
+ Transfers control to a function starting with a new stack.
+
+ Transfers control to the function specified by EntryPoint using the new stack
+ specified by NewStack and passing in the parameters specified by Context1 and
+ Context2. Context1 and Context2 are optional and may be NULL. The function
+ EntryPoint must never return.
+
+ If EntryPoint is NULL, then ASSERT().
+ If NewStack is NULL, then ASSERT().
+
+ @param EntryPoint A pointer to function to call with the new stack.
+ @param Context1 A pointer to the context to pass into the EntryPoint
+ function.
+ @param Context2 A pointer to the context to pass into the EntryPoint
+ function.
+ @param NewStack A pointer to the new stack to use for the EntryPoint
+ function.
+
+**/
+VOID
+EFIAPI
+PeiSwitchStacks (
+ IN SWITCH_STACK_ENTRY_POINT EntryPoint,
+ IN VOID *Context1, OPTIONAL
+ IN VOID *Context2, OPTIONAL
+ IN VOID *NewStack
+ )
+{
+ BASE_LIBRARY_JUMP_BUFFER JumpBuffer;
+
+ ASSERT (EntryPoint != NULL);
+ ASSERT (NewStack != NULL);
+
+ //
+ // Stack should be aligned with CPU_STACK_ALIGNMENT
+ //
+ ASSERT (((UINTN)NewStack & (CPU_STACK_ALIGNMENT - 1)) == 0);
+
+ JumpBuffer.Eip = (UINTN)EntryPoint;
+ JumpBuffer.Esp = (UINTN)NewStack - sizeof (VOID*);
+ JumpBuffer.Esp -= sizeof (Context1) + sizeof (Context2);
+ ((VOID**)JumpBuffer.Esp)[1] = Context1;
+ ((VOID**)JumpBuffer.Esp)[2] = Context2;
+
+ LongJump (&JumpBuffer, (UINTN)-1);
+
+
+ //
+ // PeiSwitchStacks () will never return
+ //
+ ASSERT (FALSE);
+}
+
+
+
diff --git a/EmulatorPkg/Unix/Host/MemoryAllocationLib.c b/EmulatorPkg/Unix/Host/MemoryAllocationLib.c
index 9db91b83d9..df39358e2a 100644
--- a/EmulatorPkg/Unix/Host/MemoryAllocationLib.c
+++ b/EmulatorPkg/Unix/Host/MemoryAllocationLib.c
@@ -1,145 +1,145 @@
-/*++ @file
-
- Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
-
- This program and the accompanying materials
- are licensed and made available under the terms and conditions of the BSD License
- which accompanies this distribution. The full text of the license may be found at
- http://opensource.org/licenses/bsd-license.php
-
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include "Base.h"
-#include "Library/BaseMemoryLib.h"
-#include "Library/MemoryAllocationLib.h"
-
-#include <stdlib.h>
-
-/**
- Allocates a buffer of type EfiBootServicesData.
-
- Allocates the number bytes specified by AllocationSize of type EfiBootServicesData and returns a
- pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is
- returned. If there is not enough memory remaining to satisfy the request, then NULL is returned.
-
- @param AllocationSize The number of bytes to allocate.
-
- @return A pointer to the allocated buffer or NULL if allocation fails.
-
-**/
-VOID *
-EFIAPI
-AllocatePool (
- IN UINTN AllocationSize
- )
-{
- return (VOID*) malloc (AllocationSize);
-}
-
-
-/**
- Allocates and zeros a buffer of type EfiBootServicesData.
-
- Allocates the number bytes specified by AllocationSize of type EfiBootServicesData, clears the
- buffer with zeros, and returns a pointer to the allocated buffer. If AllocationSize is 0, then a
- valid buffer of 0 size is returned. If there is not enough memory remaining to satisfy the
- request, then NULL is returned.
-
- @param AllocationSize The number of bytes to allocate and zero.
-
- @return A pointer to the allocated buffer or NULL if allocation fails.
-
-**/
-VOID *
-EFIAPI
-AllocateZeroPool (
- IN UINTN AllocationSize
- )
-{
- VOID *Buffer;
-
- Buffer = AllocatePool (AllocationSize);
- if (Buffer == NULL) {
- return NULL;
- }
-
- ZeroMem (Buffer, AllocationSize);
-
- return Buffer;
-}
-
-
-/**
- Reallocates a buffer of type EfiBootServicesData.
-
- Allocates and zeros the number bytes specified by NewSize from memory of type
- EfiBootServicesData. If OldBuffer is not NULL, then the smaller of OldSize and
- NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
- OldBuffer is freed. A pointer to the newly allocated buffer is returned.
- If NewSize is 0, then a valid buffer of 0 size is returned. If there is not
- enough memory remaining to satisfy the request, then NULL is returned.
-
- If the allocation of the new buffer is successful and the smaller of NewSize and OldSize
- is greater than (MAX_ADDRESS - OldBuffer + 1), then ASSERT().
-
- @param OldSize The size, in bytes, of OldBuffer.
- @param NewSize The size, in bytes, of the buffer to reallocate.
- @param OldBuffer The buffer to copy to the allocated buffer. This is an optional
- parameter that may be NULL.
-
- @return A pointer to the allocated buffer or NULL if allocation fails.
-
-**/
-VOID *
-EFIAPI
-ReallocatePool (
- IN UINTN OldSize,
- IN UINTN NewSize,
- IN VOID *OldBuffer OPTIONAL
- )
-{
- VOID *NewBuffer;
-
- NewBuffer = AllocatePool (NewSize);
- if (NewBuffer == NULL) {
- return NULL;
- }
-
- if (OldBuffer != NULL) {
- if (OldSize > 0) {
- CopyMem (NewBuffer, OldBuffer, OldSize);
- }
-
- FreePool (OldBuffer);
- }
-
- return NewBuffer;
-}
-
-
-/**
- Frees a buffer that was previously allocated with one of the pool allocation functions in the
- Memory Allocation Library.
-
- Frees the buffer specified by Buffer. Buffer must have been allocated on a previous call to the
- pool allocation services of the Memory Allocation Library. If it is not possible to free pool
- resources, then this function will perform no actions.
-
- If Buffer was not allocated with a pool allocation function in the Memory Allocation Library,
- then ASSERT().
-
- @param Buffer Pointer to the buffer to free.
-
-**/
-VOID
-EFIAPI
-FreePool (
- IN VOID *Buffer
- )
-{
- free ((void *) Buffer);
-}
-
+/*++ @file
+
+ Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
+
+ This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include "Base.h"
+#include "Library/BaseMemoryLib.h"
+#include "Library/MemoryAllocationLib.h"
+
+#include <stdlib.h>
+
+/**
+ Allocates a buffer of type EfiBootServicesData.
+
+ Allocates the number bytes specified by AllocationSize of type EfiBootServicesData and returns a
+ pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0 size is
+ returned. If there is not enough memory remaining to satisfy the request, then NULL is returned.
+
+ @param AllocationSize The number of bytes to allocate.
+
+ @return A pointer to the allocated buffer or NULL if allocation fails.
+
+**/
+VOID *
+EFIAPI
+AllocatePool (
+ IN UINTN AllocationSize
+ )
+{
+ return (VOID*) malloc (AllocationSize);
+}
+
+
+/**
+ Allocates and zeros a buffer of type EfiBootServicesData.
+
+ Allocates the number bytes specified by AllocationSize of type EfiBootServicesData, clears the
+ buffer with zeros, and returns a pointer to the allocated buffer. If AllocationSize is 0, then a
+ valid buffer of 0 size is returned. If there is not enough memory remaining to satisfy the
+ request, then NULL is returned.
+
+ @param AllocationSize The number of bytes to allocate and zero.
+
+ @return A pointer to the allocated buffer or NULL if allocation fails.
+
+**/
+VOID *
+EFIAPI
+AllocateZeroPool (
+ IN UINTN AllocationSize
+ )
+{
+ VOID *Buffer;
+
+ Buffer = AllocatePool (AllocationSize);
+ if (Buffer == NULL) {
+ return NULL;
+ }
+
+ ZeroMem (Buffer, AllocationSize);
+
+ return Buffer;
+}
+
+
+/**
+ Reallocates a buffer of type EfiBootServicesData.
+
+ Allocates and zeros the number bytes specified by NewSize from memory of type
+ EfiBootServicesData. If OldBuffer is not NULL, then the smaller of OldSize and
+ NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
+ OldBuffer is freed. A pointer to the newly allocated buffer is returned.
+ If NewSize is 0, then a valid buffer of 0 size is returned. If there is not
+ enough memory remaining to satisfy the request, then NULL is returned.
+
+ If the allocation of the new buffer is successful and the smaller of NewSize and OldSize
+ is greater than (MAX_ADDRESS - OldBuffer + 1), then ASSERT().
+
+ @param OldSize The size, in bytes, of OldBuffer.
+ @param NewSize The size, in bytes, of the buffer to reallocate.
+ @param OldBuffer The buffer to copy to the allocated buffer. This is an optional
+ parameter that may be NULL.
+
+ @return A pointer to the allocated buffer or NULL if allocation fails.
+
+**/
+VOID *
+EFIAPI
+ReallocatePool (
+ IN UINTN OldSize,
+ IN UINTN NewSize,
+ IN VOID *OldBuffer OPTIONAL
+ )
+{
+ VOID *NewBuffer;
+
+ NewBuffer = AllocatePool (NewSize);
+ if (NewBuffer == NULL) {
+ return NULL;
+ }
+
+ if (OldBuffer != NULL) {
+ if (OldSize > 0) {
+ CopyMem (NewBuffer, OldBuffer, OldSize);
+ }
+
+ FreePool (OldBuffer);
+ }
+
+ return NewBuffer;
+}
+
+
+/**
+ Frees a buffer that was previously allocated with one of the pool allocation functions in the
+ Memory Allocation Library.
+
+ Frees the buffer specified by Buffer. Buffer must have been allocated on a previous call to the
+ pool allocation services of the Memory Allocation Library. If it is not possible to free pool
+ resources, then this function will perform no actions.
+
+ If Buffer was not allocated with a pool allocation function in the Memory Allocation Library,
+ then ASSERT().
+
+ @param Buffer Pointer to the buffer to free.
+
+**/
+VOID
+EFIAPI
+FreePool (
+ IN VOID *Buffer
+ )
+{
+ free ((void *) Buffer);
+}
+
diff --git a/EmulatorPkg/Unix/Host/PosixFileSystem.c b/EmulatorPkg/Unix/Host/PosixFileSystem.c
index 98e8c894eb..529543d6eb 100644
--- a/EmulatorPkg/Unix/Host/PosixFileSystem.c
+++ b/EmulatorPkg/Unix/Host/PosixFileSystem.c
@@ -1,1556 +1,1556 @@
-/*++ @file
- POSIX Pthreads to emulate APs and implement threads
-
-Copyright (c) 2011, Apple Inc. All rights reserved.
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-
-**/
-
-#include "Host.h"
-
-
-#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'P', 'f', 's')
-
-typedef struct {
- UINTN Signature;
- EMU_IO_THUNK_PROTOCOL *Thunk;
- EFI_SIMPLE_FILE_SYSTEM_PROTOCOL SimpleFileSystem;
- CHAR8 *FilePath;
- CHAR16 *VolumeLabel;
- BOOLEAN FileHandlesOpen;
-} EMU_SIMPLE_FILE_SYSTEM_PRIVATE;
-
-#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS(a) \
- CR (a, \
- EMU_SIMPLE_FILE_SYSTEM_PRIVATE, \
- SimpleFileSystem, \
- EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE \
- )
-
-
-#define EMU_EFI_FILE_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'P', 'f', 'i')
-
-typedef struct {
- UINTN Signature;
- EMU_IO_THUNK_PROTOCOL *Thunk;
- EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;
- EFI_FILE_PROTOCOL EfiFile;
- int fd;
- DIR *Dir;
- BOOLEAN IsRootDirectory;
- BOOLEAN IsDirectoryPath;
- BOOLEAN IsOpenedByRead;
- char *FileName;
- struct dirent *Dirent;
-} EMU_EFI_FILE_PRIVATE;
-
-#define EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS(a) \
- CR (a, \
- EMU_EFI_FILE_PRIVATE, \
- EfiFile, \
- EMU_EFI_FILE_PRIVATE_SIGNATURE \
- )
-
-EFI_STATUS
-PosixFileGetInfo (
- IN EFI_FILE_PROTOCOL *This,
- IN EFI_GUID *InformationType,
- IN OUT UINTN *BufferSize,
- OUT VOID *Buffer
- );
-
-EFI_STATUS
-PosixFileSetInfo (
- IN EFI_FILE_PROTOCOL *This,
- IN EFI_GUID *InformationType,
- IN UINTN BufferSize,
- IN VOID *Buffer
- );
-
-
-EFI_FILE_PROTOCOL gPosixFileProtocol = {
- EFI_FILE_REVISION,
- GasketPosixFileOpen,
- GasketPosixFileCLose,
- GasketPosixFileDelete,
- GasketPosixFileRead,
- GasketPosixFileWrite,
- GasketPosixFileGetPossition,
- GasketPosixFileSetPossition,
- GasketPosixFileGetInfo,
- GasketPosixFileSetInfo,
- GasketPosixFileFlush
-};
-
-EFI_SIMPLE_FILE_SYSTEM_PROTOCOL gPosixFileSystemProtocol = {
- EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION,
- GasketPosixOpenVolume,
-};
-
-
-/**
- Open the root directory on a volume.
-
- @param This Protocol instance pointer.
- @param Root Returns an Open file handle for the root directory
-
- @retval EFI_SUCCESS The device was opened.
- @retval EFI_UNSUPPORTED This volume does not support the file system.
- @retval EFI_NO_MEDIA The device has no media.
- @retval EFI_DEVICE_ERROR The device reported an error.
- @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
- @retval EFI_ACCESS_DENIED The service denied access to the file.
- @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of resources.
-
-**/
-EFI_STATUS
-PosixOpenVolume (
- IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
- OUT EFI_FILE_PROTOCOL **Root
- )
-{
- EFI_STATUS Status;
- EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
- EMU_EFI_FILE_PRIVATE *PrivateFile;
-
- Private = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (This);
-
- Status = EFI_OUT_OF_RESOURCES;
- PrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));
- if (PrivateFile == NULL) {
- goto Done;
- }
-
- PrivateFile->FileName = malloc (AsciiStrSize (Private->FilePath));
- if (PrivateFile->FileName == NULL) {
- goto Done;
- }
- AsciiStrCpy (PrivateFile->FileName, Private->FilePath);
-
- PrivateFile->Signature = EMU_EFI_FILE_PRIVATE_SIGNATURE;
- PrivateFile->Thunk = Private->Thunk;
- PrivateFile->SimpleFileSystem = This;
- PrivateFile->IsRootDirectory = TRUE;
- PrivateFile->IsDirectoryPath = TRUE;
- PrivateFile->IsOpenedByRead = TRUE;
-
- CopyMem (&PrivateFile->EfiFile, &gPosixFileProtocol, sizeof (EFI_FILE_PROTOCOL));
-
- PrivateFile->fd = -1;
- PrivateFile->Dir = NULL;
- PrivateFile->Dirent = NULL;
-
- *Root = &PrivateFile->EfiFile;
-
- PrivateFile->Dir = opendir (PrivateFile->FileName);
- if (PrivateFile->Dir == NULL) {
- Status = EFI_ACCESS_DENIED;
- } else {
- Status = EFI_SUCCESS;
- }
-
-Done:
- if (EFI_ERROR (Status)) {
- if (PrivateFile != NULL) {
- if (PrivateFile->FileName != NULL) {
- free (PrivateFile->FileName);
- }
-
- free (PrivateFile);
- }
-
- *Root = NULL;
- }
-
- return Status;
-}
-
-
-EFI_STATUS
-ErrnoToEfiStatus ()
-{
- switch (errno) {
- case EACCES:
- return EFI_ACCESS_DENIED;
-
- case EDQUOT:
- case ENOSPC:
- return EFI_VOLUME_FULL;
-
- default:
- return EFI_DEVICE_ERROR;
- }
-}
-
-VOID
-CutPrefix (
- IN CHAR8 *Str,
- IN UINTN Count
- )
-{
- CHAR8 *Pointer;
-
- if (AsciiStrLen (Str) < Count) {
- ASSERT (0);
- }
-
- for (Pointer = Str; *(Pointer + Count); Pointer++) {
- *Pointer = *(Pointer + Count);
- }
-
- *Pointer = *(Pointer + Count);
-}
-
-
-VOID
-PosixSystemTimeToEfiTime (
- IN time_t SystemTime,
- OUT EFI_TIME *Time
- )
-{
- struct tm *tm;
-
- tm = gmtime (&SystemTime);
- Time->Year = tm->tm_year;
- Time->Month = tm->tm_mon + 1;
- Time->Day = tm->tm_mday;
- Time->Hour = tm->tm_hour;
- Time->Minute = tm->tm_min;
- Time->Second = tm->tm_sec;
- Time->Nanosecond = 0;
-
- Time->TimeZone = timezone;
- Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0) | (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
-}
-
-
-EFI_STATUS
-UnixSimpleFileSystemFileInfo (
- EMU_EFI_FILE_PRIVATE *PrivateFile,
- IN CHAR8 *FileName,
- IN OUT UINTN *BufferSize,
- OUT VOID *Buffer
- )
-{
- EFI_STATUS Status;
- UINTN Size;
- UINTN NameSize;
- UINTN ResultSize;
- EFI_FILE_INFO *Info;
- CHAR8 *RealFileName;
- CHAR8 *TempPointer;
- CHAR16 *BufferFileName;
- struct stat buf;
-
- if (FileName != NULL) {
- RealFileName = FileName;
- } else if (PrivateFile->IsRootDirectory) {
- RealFileName = "";
- } else {
- RealFileName = PrivateFile->FileName;
- }
-
- TempPointer = RealFileName;
- while (*TempPointer) {
- if (*TempPointer == '/') {
- RealFileName = TempPointer + 1;
- }
-
- TempPointer++;
- }
-
- Size = SIZE_OF_EFI_FILE_INFO;
- NameSize = AsciiStrSize (RealFileName) * 2;
- ResultSize = Size + NameSize;
-
- if (*BufferSize < ResultSize) {
- *BufferSize = ResultSize;
- return EFI_BUFFER_TOO_SMALL;
- }
- if (stat (FileName == NULL ? PrivateFile->FileName : FileName, &buf) < 0) {
- return EFI_DEVICE_ERROR;
- }
-
- Status = EFI_SUCCESS;
-
- Info = Buffer;
- ZeroMem (Info, ResultSize);
-
- Info->Size = ResultSize;
- Info->FileSize = buf.st_size;
- Info->PhysicalSize = MultU64x32 (buf.st_blocks, buf.st_blksize);
-
- PosixSystemTimeToEfiTime (buf.st_ctime, &Info->CreateTime);
- PosixSystemTimeToEfiTime (buf.st_atime, &Info->LastAccessTime);
- PosixSystemTimeToEfiTime (buf.st_mtime, &Info->ModificationTime);
-
- if (!(buf.st_mode & S_IWUSR)) {
- Info->Attribute |= EFI_FILE_READ_ONLY;
- }
-
- if (S_ISDIR(buf.st_mode)) {
- Info->Attribute |= EFI_FILE_DIRECTORY;
- }
-
-
- BufferFileName = (CHAR16 *)((CHAR8 *) Buffer + Size);
- while (*RealFileName) {
- *BufferFileName++ = *RealFileName++;
- }
- *BufferFileName = 0;
-
- *BufferSize = ResultSize;
- return Status;
-}
-
-BOOLEAN
-IsZero (
- IN VOID *Buffer,
- IN UINTN Length
- )
-{
- if (Buffer == NULL || Length == 0) {
- return FALSE;
- }
-
- if (*(UINT8 *) Buffer != 0) {
- return FALSE;
- }
-
- if (Length > 1) {
- if (!CompareMem (Buffer, (UINT8 *) Buffer + 1, Length - 1)) {
- return FALSE;
- }
- }
-
- return TRUE;
-}
-
-
-
-/**
- Opens a new file relative to the source file's location.
-
- @param This The protocol instance pointer.
- @param NewHandle Returns File Handle for FileName.
- @param FileName Null terminated string. "\", ".", and ".." are supported.
- @param OpenMode Open mode for file.
- @param Attributes Only used for EFI_FILE_MODE_CREATE.
-
- @retval EFI_SUCCESS The device was opened.
- @retval EFI_NOT_FOUND The specified file could not be found on the device.
- @retval EFI_NO_MEDIA The device has no media.
- @retval EFI_MEDIA_CHANGED The media has changed.
- @retval EFI_DEVICE_ERROR The device reported an error.
- @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
- @retval EFI_ACCESS_DENIED The service denied access to the file.
- @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of resources.
- @retval EFI_VOLUME_FULL The volume is full.
-
-**/
-EFI_STATUS
-PosixFileOpen (
- IN EFI_FILE_PROTOCOL *This,
- OUT EFI_FILE_PROTOCOL **NewHandle,
- IN CHAR16 *FileName,
- IN UINT64 OpenMode,
- IN UINT64 Attributes
- )
-{
- EFI_FILE_PROTOCOL *Root;
- EMU_EFI_FILE_PRIVATE *PrivateFile;
- EMU_EFI_FILE_PRIVATE *NewPrivateFile;
- EMU_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;
- EFI_STATUS Status;
- CHAR16 *Src;
- char *Dst;
- CHAR8 *RealFileName;
- char *ParseFileName;
- char *GuardPointer;
- CHAR8 TempChar;
- UINTN Count;
- BOOLEAN TrailingDash;
- BOOLEAN LoopFinish;
- UINTN InfoSize;
- EFI_FILE_INFO *Info;
- struct stat finfo;
- int res;
-
-
- PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
- PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (PrivateFile->SimpleFileSystem);
- NewPrivateFile = NULL;
- Status = EFI_OUT_OF_RESOURCES;
-
- //
- // BUGBUG: assume an open of root
- // if current location, return current data
- //
- TrailingDash = FALSE;
- if ((StrCmp (FileName, L"\\") == 0) ||
- (StrCmp (FileName, L".") == 0 && PrivateFile->IsRootDirectory)) {
-OpenRoot:
- Status = PosixOpenVolume (PrivateFile->SimpleFileSystem, &Root);
- NewPrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (Root);
- goto Done;
- }
-
- if (FileName[StrLen (FileName) - 1] == L'\\') {
- TrailingDash = TRUE;
- FileName[StrLen (FileName) - 1] = 0;
- }
-
- //
- // Attempt to open the file
- //
- NewPrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));
- if (NewPrivateFile == NULL) {
- goto Done;
- }
-
- CopyMem (NewPrivateFile, PrivateFile, sizeof (EMU_EFI_FILE_PRIVATE));
-
- NewPrivateFile->FileName = malloc (AsciiStrSize (PrivateFile->FileName) + 1 + StrLen (FileName) + 1);
- if (NewPrivateFile->FileName == NULL) {
- goto Done;
- }
-
- if (*FileName == L'\\') {
- AsciiStrCpy (NewPrivateFile->FileName, PrivateRoot->FilePath);
- // Skip first '\'.
- Src = FileName + 1;
- } else {
- AsciiStrCpy (NewPrivateFile->FileName, PrivateFile->FileName);
- Src = FileName;
- }
- Dst = NewPrivateFile->FileName + AsciiStrLen (NewPrivateFile->FileName);
- GuardPointer = NewPrivateFile->FileName + AsciiStrLen (PrivateRoot->FilePath);
- *Dst++ = '/';
- // Convert unicode to ascii and '\' to '/'
- while (*Src) {
- if (*Src == '\\') {
- *Dst++ = '/';
- } else {
- *Dst++ = *Src;
- }
- Src++;
- }
- *Dst = 0;
-
-
- //
- // Get rid of . and .., except leading . or ..
- //
-
- //
- // GuardPointer protect simplefilesystem root path not be destroyed
- //
-
- LoopFinish = FALSE;
- while (!LoopFinish) {
- LoopFinish = TRUE;
-
- for (ParseFileName = GuardPointer; *ParseFileName; ParseFileName++) {
- if (*ParseFileName == '.' &&
- (*(ParseFileName + 1) == 0 || *(ParseFileName + 1) == '/') &&
- *(ParseFileName - 1) == '/'
- ) {
-
- //
- // cut /.
- //
- CutPrefix (ParseFileName - 1, 2);
- LoopFinish = FALSE;
- break;
- }
-
- if (*ParseFileName == '.' &&
- *(ParseFileName + 1) == '.' &&
- (*(ParseFileName + 2) == 0 || *(ParseFileName + 2) == '/') &&
- *(ParseFileName - 1) == '/'
- ) {
-
- ParseFileName--;
- Count = 3;
-
- while (ParseFileName != GuardPointer) {
- ParseFileName--;
- Count++;
- if (*ParseFileName == '/') {
- break;
- }
- }
-
- //
- // cut /.. and its left directory
- //
- CutPrefix (ParseFileName, Count);
- LoopFinish = FALSE;
- break;
- }
- }
- }
-
- if (AsciiStrCmp (NewPrivateFile->FileName, PrivateRoot->FilePath) == 0) {
- NewPrivateFile->IsRootDirectory = TRUE;
- free (NewPrivateFile->FileName);
- free (NewPrivateFile);
- goto OpenRoot;
- }
-
- RealFileName = NewPrivateFile->FileName + AsciiStrLen(NewPrivateFile->FileName) - 1;
- while (RealFileName > NewPrivateFile->FileName && *RealFileName != '/') {
- RealFileName--;
- }
-
- TempChar = *(RealFileName - 1);
- *(RealFileName - 1) = 0;
- *(RealFileName - 1) = TempChar;
-
-
- //
- // Test whether file or directory
- //
- NewPrivateFile->IsRootDirectory = FALSE;
- NewPrivateFile->fd = -1;
- NewPrivateFile->Dir = NULL;
- if (OpenMode & EFI_FILE_MODE_CREATE) {
- if (Attributes & EFI_FILE_DIRECTORY) {
- NewPrivateFile->IsDirectoryPath = TRUE;
- } else {
- NewPrivateFile->IsDirectoryPath = FALSE;
- }
- } else {
- res = stat (NewPrivateFile->FileName, &finfo);
- if (res == 0 && S_ISDIR(finfo.st_mode)) {
- NewPrivateFile->IsDirectoryPath = TRUE;
- } else {
- NewPrivateFile->IsDirectoryPath = FALSE;
- }
- }
-
- if (OpenMode & EFI_FILE_MODE_WRITE) {
- NewPrivateFile->IsOpenedByRead = FALSE;
- } else {
- NewPrivateFile->IsOpenedByRead = TRUE;
- }
-
- Status = EFI_SUCCESS;
-
- //
- // deal with directory
- //
- if (NewPrivateFile->IsDirectoryPath) {
- if ((OpenMode & EFI_FILE_MODE_CREATE)) {
- //
- // Create a directory
- //
- if (mkdir (NewPrivateFile->FileName, 0777) != 0) {
- if (errno != EEXIST) {
- //free (TempFileName);
- Status = EFI_ACCESS_DENIED;
- goto Done;
- }
- }
- }
-
- NewPrivateFile->Dir = opendir (NewPrivateFile->FileName);
- if (NewPrivateFile->Dir == NULL) {
- if (errno == EACCES) {
- Status = EFI_ACCESS_DENIED;
- } else {
- Status = EFI_NOT_FOUND;
- }
-
- goto Done;
- }
-
- } else {
- //
- // deal with file
- //
- NewPrivateFile->fd = open (
- NewPrivateFile->FileName,
- ((OpenMode & EFI_FILE_MODE_CREATE) ? O_CREAT : 0) | (NewPrivateFile->IsOpenedByRead ? O_RDONLY : O_RDWR),
- 0666
- );
- if (NewPrivateFile->fd < 0) {
- if (errno == ENOENT) {
- Status = EFI_NOT_FOUND;
- } else {
- Status = EFI_ACCESS_DENIED;
- }
- }
- }
-
- if ((OpenMode & EFI_FILE_MODE_CREATE) && Status == EFI_SUCCESS) {
- //
- // Set the attribute
- //
- InfoSize = 0;
- Info = NULL;
- Status = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, &InfoSize, Info);
- if (Status != EFI_BUFFER_TOO_SMALL) {
- Status = EFI_DEVICE_ERROR;
- goto Done;
- }
-
- Info = malloc (InfoSize);
- if (Info == NULL) {
- goto Done;
- }
-
- Status = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, &InfoSize, Info);
- if (EFI_ERROR (Status)) {
- goto Done;
- }
-
- Info->Attribute = Attributes;
- PosixFileSetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, InfoSize, Info);
-
- free (Info);
- }
-
-Done: ;
- if (TrailingDash) {
- FileName[StrLen (FileName) + 1] = 0;
- FileName[StrLen (FileName)] = L'\\';
- }
-
- if (EFI_ERROR (Status)) {
- if (NewPrivateFile) {
- if (NewPrivateFile->FileName) {
- free (NewPrivateFile->FileName);
- }
-
- free (NewPrivateFile);
- }
- } else {
- *NewHandle = &NewPrivateFile->EfiFile;
- }
-
- return Status;
-}
-
-
-
-/**
- Close the file handle
-
- @param This Protocol instance pointer.
-
- @retval EFI_SUCCESS The device was opened.
-
-**/
-EFI_STATUS
-PosixFileCLose (
- IN EFI_FILE_PROTOCOL *This
- )
-{
- EMU_EFI_FILE_PRIVATE *PrivateFile;
-
- PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
-
- if (PrivateFile->fd >= 0) {
- close (PrivateFile->fd);
- }
- if (PrivateFile->Dir != NULL) {
- closedir (PrivateFile->Dir);
- }
-
- PrivateFile->fd = -1;
- PrivateFile->Dir = NULL;
-
- if (PrivateFile->FileName) {
- free (PrivateFile->FileName);
- }
-
- free (PrivateFile);
-
- return EFI_SUCCESS;
-}
-
-
-/**
- Close and delete the file handle.
-
- @param This Protocol instance pointer.
-
- @retval EFI_SUCCESS The device was opened.
- @retval EFI_WARN_DELETE_FAILURE The handle was closed but the file was not deleted.
-
-**/
-EFI_STATUS
-PosixFileDelete (
- IN EFI_FILE_PROTOCOL *This
- )
-{
- EFI_STATUS Status;
- EMU_EFI_FILE_PRIVATE *PrivateFile;
-
- PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
- Status = EFI_WARN_DELETE_FAILURE;
-
- if (PrivateFile->IsDirectoryPath) {
- if (PrivateFile->Dir != NULL) {
- closedir (PrivateFile->Dir);
- PrivateFile->Dir = NULL;
- }
-
- if (rmdir (PrivateFile->FileName) == 0) {
- Status = EFI_SUCCESS;
- }
- } else {
- close (PrivateFile->fd);
- PrivateFile->fd = -1;
-
- if (!PrivateFile->IsOpenedByRead) {
- if (!unlink (PrivateFile->FileName)) {
- Status = EFI_SUCCESS;
- }
- }
- }
-
- free (PrivateFile->FileName);
- free (PrivateFile);
-
- return Status;
-}
-
-
-/**
- Read data from the file.
-
- @param This Protocol instance pointer.
- @param BufferSize On input size of buffer, on output amount of data in buffer.
- @param Buffer The buffer in which data is read.
-
- @retval EFI_SUCCESS Data was read.
- @retval EFI_NO_MEDIA The device has no media.
- @retval EFI_DEVICE_ERROR The device reported an error.
- @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
- @retval EFI_BUFFER_TO_SMALL BufferSize is too small. BufferSize contains required size.
-
-**/
-EFI_STATUS
-PosixFileRead (
- IN EFI_FILE_PROTOCOL *This,
- IN OUT UINTN *BufferSize,
- OUT VOID *Buffer
- )
-{
- EMU_EFI_FILE_PRIVATE *PrivateFile;
- EFI_STATUS Status;
- int Res;
- UINTN Size;
- UINTN NameSize;
- UINTN ResultSize;
- CHAR8 *FullFileName;
-
-
- PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
-
- if (!PrivateFile->IsDirectoryPath) {
- if (PrivateFile->fd < 0) {
- Status = EFI_DEVICE_ERROR;
- goto Done;
- }
-
- Res = read (PrivateFile->fd, Buffer, *BufferSize);
- if (Res < 0) {
- Status = EFI_DEVICE_ERROR;
- goto Done;
- }
- *BufferSize = Res;
- Status = EFI_SUCCESS;
- goto Done;
- }
-
- //
- // Read on a directory.
- //
- if (PrivateFile->Dir == NULL) {
- Status = EFI_DEVICE_ERROR;
- goto Done;
- }
-
- if (PrivateFile->Dirent == NULL) {
- PrivateFile->Dirent = readdir (PrivateFile->Dir);
- if (PrivateFile->Dirent == NULL) {
- *BufferSize = 0;
- Status = EFI_SUCCESS;
- goto Done;
- }
- }
-
- Size = SIZE_OF_EFI_FILE_INFO;
- NameSize = AsciiStrLen (PrivateFile->Dirent->d_name) + 1;
- ResultSize = Size + 2 * NameSize;
-
- if (*BufferSize < ResultSize) {
- *BufferSize = ResultSize;
- Status = EFI_BUFFER_TOO_SMALL;
- goto Done;
- }
- Status = EFI_SUCCESS;
-
- *BufferSize = ResultSize;
-
- FullFileName = malloc (AsciiStrLen(PrivateFile->FileName) + 1 + NameSize);
- if (FullFileName == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto Done;
- }
-
- AsciiStrCpy (FullFileName, PrivateFile->FileName);
- AsciiStrCat (FullFileName, "/");
- AsciiStrCat (FullFileName, PrivateFile->Dirent->d_name);
- Status = UnixSimpleFileSystemFileInfo (
- PrivateFile,
- FullFileName,
- BufferSize,
- Buffer
- );
- free (FullFileName);
-
- PrivateFile->Dirent = NULL;
-
-Done:
- return Status;
-}
-
-
-
-/**
- Write data to a file.
-
- @param This Protocol instance pointer.
- @param BufferSize On input size of buffer, on output amount of data in buffer.
- @param Buffer The buffer in which data to write.
-
- @retval EFI_SUCCESS Data was written.
- @retval EFI_UNSUPPORTED Writes to Open directory are not supported.
- @retval EFI_NO_MEDIA The device has no media.
- @retval EFI_DEVICE_ERROR The device reported an error.
- @retval EFI_DEVICE_ERROR An attempt was made to write to a deleted file.
- @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
- @retval EFI_WRITE_PROTECTED The device is write protected.
- @retval EFI_ACCESS_DENIED The file was open for read only.
- @retval EFI_VOLUME_FULL The volume is full.
-
-**/
-EFI_STATUS
-PosixFileWrite (
- IN EFI_FILE_PROTOCOL *This,
- IN OUT UINTN *BufferSize,
- IN VOID *Buffer
- )
-{
- EMU_EFI_FILE_PRIVATE *PrivateFile;
- int Res;
-
-
- PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
-
- if (PrivateFile->fd < 0) {
- return EFI_DEVICE_ERROR;
- }
-
- if (PrivateFile->IsDirectoryPath) {
- return EFI_UNSUPPORTED;
- }
-
- if (PrivateFile->IsOpenedByRead) {
- return EFI_ACCESS_DENIED;
- }
-
- Res = write (PrivateFile->fd, Buffer, *BufferSize);
- if (Res == (UINTN)-1) {
- return ErrnoToEfiStatus ();
- }
-
- *BufferSize = Res;
- return EFI_SUCCESS;
-}
-
-
-
-/**
- Set a files current position
-
- @param This Protocol instance pointer.
- @param Position Byte position from the start of the file.
-
- @retval EFI_SUCCESS Data was written.
- @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open.
-
-**/
-EFI_STATUS
-PosixFileSetPossition (
- IN EFI_FILE_PROTOCOL *This,
- IN UINT64 Position
- )
-{
- EMU_EFI_FILE_PRIVATE *PrivateFile;
- off_t Pos;
-
- PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
-
- if (PrivateFile->IsDirectoryPath) {
- if (Position != 0) {
- return EFI_UNSUPPORTED;
- }
-
- if (PrivateFile->Dir == NULL) {
- return EFI_DEVICE_ERROR;
- }
- rewinddir (PrivateFile->Dir);
- return EFI_SUCCESS;
- } else {
- if (Position == (UINT64) -1) {
- Pos = lseek (PrivateFile->fd, 0, SEEK_END);
- } else {
- Pos = lseek (PrivateFile->fd, Position, SEEK_SET);
- }
- if (Pos == (off_t)-1) {
- return ErrnoToEfiStatus ();
- }
- return EFI_SUCCESS;
- }
-}
-
-
-
-/**
- Get a file's current position
-
- @param This Protocol instance pointer.
- @param Position Byte position from the start of the file.
-
- @retval EFI_SUCCESS Data was written.
- @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open..
-
-**/
-EFI_STATUS
-PosixFileGetPossition (
- IN EFI_FILE_PROTOCOL *This,
- OUT UINT64 *Position
- )
-{
- EFI_STATUS Status;
- EMU_EFI_FILE_PRIVATE *PrivateFile;
-
- PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
-
- if (PrivateFile->IsDirectoryPath) {
- Status = EFI_UNSUPPORTED;
- } else {
- *Position = (UINT64)lseek (PrivateFile->fd, 0, SEEK_CUR);
- Status = (*Position == (UINT64) -1) ? ErrnoToEfiStatus () : EFI_SUCCESS;
- }
-
- return Status;
-}
-
-
-/**
- Get information about a file.
-
- @param This Protocol instance pointer.
- @param InformationType Type of information to return in Buffer.
- @param BufferSize On input size of buffer, on output amount of data in buffer.
- @param Buffer The buffer to return data.
-
- @retval EFI_SUCCESS Data was returned.
- @retval EFI_UNSUPPORTED InformationType is not supported.
- @retval EFI_NO_MEDIA The device has no media.
- @retval EFI_DEVICE_ERROR The device reported an error.
- @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
- @retval EFI_WRITE_PROTECTED The device is write protected.
- @retval EFI_ACCESS_DENIED The file was open for read only.
- @retval EFI_BUFFER_TOO_SMALL Buffer was too small; required size returned in BufferSize.
-
-**/
-EFI_STATUS
-PosixFileGetInfo (
- IN EFI_FILE_PROTOCOL *This,
- IN EFI_GUID *InformationType,
- IN OUT UINTN *BufferSize,
- OUT VOID *Buffer
- )
-{
- EFI_STATUS Status;
- EMU_EFI_FILE_PRIVATE *PrivateFile;
- EFI_FILE_SYSTEM_INFO *FileSystemInfoBuffer;
- int UnixStatus;
- EMU_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;
- struct statfs buf;
-
- PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
- PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (PrivateFile->SimpleFileSystem);
-
- Status = EFI_SUCCESS;
- if (CompareGuid (InformationType, &gEfiFileInfoGuid)) {
- Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, BufferSize, Buffer);
- } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
- if (*BufferSize < SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel)) {
- *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);
- return EFI_BUFFER_TOO_SMALL;
- }
-
- UnixStatus = statfs (PrivateFile->FileName, &buf);
- if (UnixStatus < 0) {
- return EFI_DEVICE_ERROR;
- }
-
- FileSystemInfoBuffer = (EFI_FILE_SYSTEM_INFO *) Buffer;
- FileSystemInfoBuffer->Size = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);
- FileSystemInfoBuffer->ReadOnly = FALSE;
-
- //
- // Succeeded
- //
- FileSystemInfoBuffer->VolumeSize = MultU64x32 (buf.f_blocks, buf.f_bsize);
- FileSystemInfoBuffer->FreeSpace = MultU64x32 (buf.f_bavail, buf.f_bsize);
- FileSystemInfoBuffer->BlockSize = buf.f_bsize;
-
-
- StrCpy ((CHAR16 *) FileSystemInfoBuffer->VolumeLabel, PrivateRoot->VolumeLabel);
- *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);
-
- } else if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) {
- if (*BufferSize < StrSize (PrivateRoot->VolumeLabel)) {
- *BufferSize = StrSize (PrivateRoot->VolumeLabel);
- return EFI_BUFFER_TOO_SMALL;
- }
-
- StrCpy ((CHAR16 *) Buffer, PrivateRoot->VolumeLabel);
- *BufferSize = StrSize (PrivateRoot->VolumeLabel);
-
- }
-
- return Status;
-}
-
-
-/**
- Set information about a file
-
- @param File Protocol instance pointer.
- @param InformationType Type of information in Buffer.
- @param BufferSize Size of buffer.
- @param Buffer The data to write.
-
- @retval EFI_SUCCESS Data was returned.
- @retval EFI_UNSUPPORTED InformationType is not supported.
- @retval EFI_NO_MEDIA The device has no media.
- @retval EFI_DEVICE_ERROR The device reported an error.
- @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
- @retval EFI_WRITE_PROTECTED The device is write protected.
- @retval EFI_ACCESS_DENIED The file was open for read only.
-
-**/
-EFI_STATUS
-PosixFileSetInfo (
- IN EFI_FILE_PROTOCOL *This,
- IN EFI_GUID *InformationType,
- IN UINTN BufferSize,
- IN VOID *Buffer
- )
-{
- EMU_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;
- EMU_EFI_FILE_PRIVATE *PrivateFile;
- EFI_FILE_INFO *OldFileInfo;
- EFI_FILE_INFO *NewFileInfo;
- EFI_STATUS Status;
- UINTN OldInfoSize;
- mode_t NewAttr;
- struct stat OldAttr;
- CHAR8 *OldFileName;
- CHAR8 *NewFileName;
- CHAR8 *CharPointer;
- BOOLEAN AttrChangeFlag;
- BOOLEAN NameChangeFlag;
- BOOLEAN SizeChangeFlag;
- BOOLEAN TimeChangeFlag;
- struct tm NewLastAccessSystemTime;
- struct tm NewLastWriteSystemTime;
- EFI_FILE_SYSTEM_INFO *NewFileSystemInfo;
- CHAR8 *AsciiFilePtr;
- CHAR16 *UnicodeFilePtr;
- int UnixStatus;
- struct utimbuf Utime;
-
-
- PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
- PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (PrivateFile->SimpleFileSystem);
- errno = 0;
- Status = EFI_UNSUPPORTED;
- OldFileInfo = NewFileInfo = NULL;
- OldFileName = NewFileName = NULL;
- AttrChangeFlag = NameChangeFlag = SizeChangeFlag = TimeChangeFlag = FALSE;
-
- //
- // Set file system information.
- //
- if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
- if (BufferSize < (SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel))) {
- Status = EFI_BAD_BUFFER_SIZE;
- goto Done;
- }
-
- NewFileSystemInfo = (EFI_FILE_SYSTEM_INFO *) Buffer;
-
- free (PrivateRoot->VolumeLabel);
-
- PrivateRoot->VolumeLabel = malloc (StrSize (NewFileSystemInfo->VolumeLabel));
- if (PrivateRoot->VolumeLabel == NULL) {
- goto Done;
- }
-
- StrCpy (PrivateRoot->VolumeLabel, NewFileSystemInfo->VolumeLabel);
-
- Status = EFI_SUCCESS;
- goto Done;
- }
-
- //
- // Set volume label information.
- //
- if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) {
- if (BufferSize < StrSize (PrivateRoot->VolumeLabel)) {
- Status = EFI_BAD_BUFFER_SIZE;
- goto Done;
- }
-
- StrCpy (PrivateRoot->VolumeLabel, (CHAR16 *) Buffer);
-
- Status = EFI_SUCCESS;
- goto Done;
- }
-
- if (!CompareGuid (InformationType, &gEfiFileInfoGuid)) {
- Status = EFI_UNSUPPORTED;
- goto Done;
- }
-
- if (BufferSize < SIZE_OF_EFI_FILE_INFO) {
- Status = EFI_BAD_BUFFER_SIZE;
- goto Done;
- }
-
- //
- // Set file/directory information.
- //
-
- //
- // Check for invalid set file information parameters.
- //
- NewFileInfo = (EFI_FILE_INFO *) Buffer;
- if (NewFileInfo->Size <= sizeof (EFI_FILE_INFO) ||
- (NewFileInfo->Attribute &~(EFI_FILE_VALID_ATTR)) ||
- (sizeof (UINTN) == 4 && NewFileInfo->Size > 0xFFFFFFFF)
- ) {
- Status = EFI_INVALID_PARAMETER;
- goto Done;
- }
-
- //
- // Get current file information so we can determine what kind
- // of change request this is.
- //
- OldInfoSize = 0;
- Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize, NULL);
- if (Status != EFI_BUFFER_TOO_SMALL) {
- Status = EFI_DEVICE_ERROR;
- goto Done;
- }
-
- OldFileInfo = malloc (OldInfoSize);
- if (OldFileInfo == NULL) {
- goto Done;
- }
-
- Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize, OldFileInfo);
- if (EFI_ERROR (Status)) {
- goto Done;
- }
-
- OldFileName = malloc (AsciiStrSize (PrivateFile->FileName));
- if (OldFileInfo == NULL) {
- goto Done;
- }
-
- AsciiStrCpy (OldFileName, PrivateFile->FileName);
-
- //
- // Make full pathname from new filename and rootpath.
- //
- if (NewFileInfo->FileName[0] == '\\') {
- NewFileName = malloc (AsciiStrLen (PrivateRoot->FilePath) + 1 + StrLen (NewFileInfo->FileName) + 1);
- if (NewFileName == NULL) {
- goto Done;
- }
-
- AsciiStrCpy (NewFileName, PrivateRoot->FilePath);
- AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);
- UnicodeFilePtr = NewFileInfo->FileName + 1;
- *AsciiFilePtr++ ='/';
- } else {
- NewFileName = malloc (AsciiStrLen (PrivateFile->FileName) + 2 + StrLen (NewFileInfo->FileName) + 1);
- if (NewFileName == NULL) {
- goto Done;
- }
-
- AsciiStrCpy (NewFileName, PrivateRoot->FilePath);
- AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);
- if ((AsciiFilePtr[-1] != '/') && (NewFileInfo->FileName[0] != '/')) {
- // make sure there is a / between Root FilePath and NewFileInfo Filename
- AsciiFilePtr[0] = '/';
- AsciiFilePtr[1] = '\0';
- AsciiFilePtr++;
- }
- UnicodeFilePtr = NewFileInfo->FileName;
- }
- // Convert to ascii.
- while (*UnicodeFilePtr) {
- *AsciiFilePtr++ = *UnicodeFilePtr++;
- }
- *AsciiFilePtr = 0;
-
- //
- // Is there an attribute change request?
- //
- if (NewFileInfo->Attribute != OldFileInfo->Attribute) {
- if ((NewFileInfo->Attribute & EFI_FILE_DIRECTORY) != (OldFileInfo->Attribute & EFI_FILE_DIRECTORY)) {
- Status = EFI_INVALID_PARAMETER;
- goto Done;
- }
-
- AttrChangeFlag = TRUE;
- }
-
- //
- // Is there a name change request?
- // bugbug: - Should really use EFI_UNICODE_COLLATION_PROTOCOL
- //
- if (StrCmp (NewFileInfo->FileName, OldFileInfo->FileName)) {
- NameChangeFlag = TRUE;
- }
-
- //
- // Is there a size change request?
- //
- if (NewFileInfo->FileSize != OldFileInfo->FileSize) {
- SizeChangeFlag = TRUE;
- }
-
- //
- // Is there a time stamp change request?
- //
- if (!IsZero (&NewFileInfo->CreateTime, sizeof (EFI_TIME)) &&
- CompareMem (&NewFileInfo->CreateTime, &OldFileInfo->CreateTime, sizeof (EFI_TIME))
- ) {
- TimeChangeFlag = TRUE;
- } else if (!IsZero (&NewFileInfo->LastAccessTime, sizeof (EFI_TIME)) &&
- CompareMem (&NewFileInfo->LastAccessTime, &OldFileInfo->LastAccessTime, sizeof (EFI_TIME))
- ) {
- TimeChangeFlag = TRUE;
- } else if (!IsZero (&NewFileInfo->ModificationTime, sizeof (EFI_TIME)) &&
- CompareMem (&NewFileInfo->ModificationTime, &OldFileInfo->ModificationTime, sizeof (EFI_TIME))
- ) {
- TimeChangeFlag = TRUE;
- }
-
- //
- // All done if there are no change requests being made.
- //
- if (!(AttrChangeFlag || NameChangeFlag || SizeChangeFlag || TimeChangeFlag)) {
- Status = EFI_SUCCESS;
- goto Done;
- }
-
- //
- // Set file or directory information.
- //
- if (stat (OldFileName, &OldAttr) != 0) {
- Status = ErrnoToEfiStatus ();
- goto Done;
- }
-
- //
- // Name change.
- //
- if (NameChangeFlag) {
- //
- // Close the handles first
- //
- if (PrivateFile->IsOpenedByRead) {
- Status = EFI_ACCESS_DENIED;
- goto Done;
- }
-
- for (CharPointer = NewFileName; *CharPointer != 0 && *CharPointer != L'/'; CharPointer++) {
- }
-
- if (*CharPointer != 0) {
- Status = EFI_ACCESS_DENIED;
- goto Done;
- }
-
- UnixStatus = rename (OldFileName, NewFileName);
- if (UnixStatus == 0) {
- //
- // modify file name
- //
- free (PrivateFile->FileName);
-
- PrivateFile->FileName = malloc (AsciiStrSize (NewFileName));
- if (PrivateFile->FileName == NULL) {
- goto Done;
- }
-
- AsciiStrCpy (PrivateFile->FileName, NewFileName);
- } else {
- Status = EFI_DEVICE_ERROR;
- goto Done;
- }
- }
-
- //
- // Size change
- //
- if (SizeChangeFlag) {
- if (PrivateFile->IsDirectoryPath) {
- Status = EFI_UNSUPPORTED;
- goto Done;
- }
-
- if (PrivateFile->IsOpenedByRead || OldFileInfo->Attribute & EFI_FILE_READ_ONLY) {
- Status = EFI_ACCESS_DENIED;
- goto Done;
- }
-
- if (ftruncate (PrivateFile->fd, NewFileInfo->FileSize) != 0) {
- Status = ErrnoToEfiStatus ();
- goto Done;
- }
-
- }
-
- //
- // Time change
- //
- if (TimeChangeFlag) {
- NewLastAccessSystemTime.tm_year = NewFileInfo->LastAccessTime.Year;
- NewLastAccessSystemTime.tm_mon = NewFileInfo->LastAccessTime.Month;
- NewLastAccessSystemTime.tm_mday = NewFileInfo->LastAccessTime.Day;
- NewLastAccessSystemTime.tm_hour = NewFileInfo->LastAccessTime.Hour;
- NewLastAccessSystemTime.tm_min = NewFileInfo->LastAccessTime.Minute;
- NewLastAccessSystemTime.tm_sec = NewFileInfo->LastAccessTime.Second;
- NewLastAccessSystemTime.tm_isdst = 0;
-
- Utime.actime = mktime (&NewLastAccessSystemTime);
-
- NewLastWriteSystemTime.tm_year = NewFileInfo->ModificationTime.Year;
- NewLastWriteSystemTime.tm_mon = NewFileInfo->ModificationTime.Month;
- NewLastWriteSystemTime.tm_mday = NewFileInfo->ModificationTime.Day;
- NewLastWriteSystemTime.tm_hour = NewFileInfo->ModificationTime.Hour;
- NewLastWriteSystemTime.tm_min = NewFileInfo->ModificationTime.Minute;
- NewLastWriteSystemTime.tm_sec = NewFileInfo->ModificationTime.Second;
- NewLastWriteSystemTime.tm_isdst = 0;
-
- Utime.modtime = mktime (&NewLastWriteSystemTime);
-
- if (Utime.actime == (time_t)-1 || Utime.modtime == (time_t)-1) {
- goto Done;
- }
-
- if (utime (PrivateFile->FileName, &Utime) == -1) {
- Status = ErrnoToEfiStatus ();
- goto Done;
- }
- }
-
- //
- // No matter about AttrChangeFlag, Attribute must be set.
- // Because operation before may cause attribute change.
- //
- NewAttr = OldAttr.st_mode;
-
- if (NewFileInfo->Attribute & EFI_FILE_READ_ONLY) {
- NewAttr &= ~(S_IRUSR | S_IRGRP | S_IROTH);
- } else {
- NewAttr |= S_IRUSR;
- }
-
- if (chmod (NewFileName, NewAttr) != 0) {
- Status = ErrnoToEfiStatus ();
- }
-
-Done:
- if (OldFileInfo != NULL) {
- free (OldFileInfo);
- }
-
- if (OldFileName != NULL) {
- free (OldFileName);
- }
-
- if (NewFileName != NULL) {
- free (NewFileName);
- }
-
- return Status;
-}
-
-
-/**
- Flush data back for the file handle.
-
- @param This Protocol instance pointer.
-
- @retval EFI_SUCCESS Data was written.
- @retval EFI_UNSUPPORTED Writes to Open directory are not supported.
- @retval EFI_NO_MEDIA The device has no media.
- @retval EFI_DEVICE_ERROR The device reported an error.
- @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
- @retval EFI_WRITE_PROTECTED The device is write protected.
- @retval EFI_ACCESS_DENIED The file was open for read only.
- @retval EFI_VOLUME_FULL The volume is full.
-
-**/
-EFI_STATUS
-PosixFileFlush (
- IN EFI_FILE_PROTOCOL *This
- )
-{
- EMU_EFI_FILE_PRIVATE *PrivateFile;
-
-
- PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
-
- if (PrivateFile->IsDirectoryPath) {
- return EFI_UNSUPPORTED;
- }
-
- if (PrivateFile->IsOpenedByRead) {
- return EFI_ACCESS_DENIED;
- }
-
- if (PrivateFile->fd < 0) {
- return EFI_DEVICE_ERROR;
- }
-
- if (fsync (PrivateFile->fd) != 0) {
- return ErrnoToEfiStatus ();
- }
-
- return EFI_SUCCESS;
-}
-
-
-
-EFI_STATUS
-PosixFileSystmeThunkOpen (
- IN EMU_IO_THUNK_PROTOCOL *This
- )
-{
- EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
- UINTN i;
-
- if (This->Private != NULL) {
- return EFI_ALREADY_STARTED;
- }
-
- if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {
- return EFI_UNSUPPORTED;
- }
-
- Private = malloc (sizeof (EMU_SIMPLE_FILE_SYSTEM_PRIVATE));
- if (Private == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Private->FilePath = malloc (StrLen (This->ConfigString) + 1);
- if (Private->FilePath == NULL) {
- free (Private);
- return EFI_OUT_OF_RESOURCES;
- }
-
- // Convert Unicode to Ascii
- for (i = 0; This->ConfigString[i] != 0; i++) {
- Private->FilePath[i] = This->ConfigString[i];
- }
- Private->FilePath[i] = 0;
-
-
- Private->VolumeLabel = malloc (StrSize (L"EFI_EMULATED"));
- if (Private->VolumeLabel == NULL) {
- free (Private->FilePath);
- free (Private);
- return EFI_OUT_OF_RESOURCES;
- }
- StrCpy (Private->VolumeLabel, L"EFI_EMULATED");
-
- Private->Signature = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE;
- Private->Thunk = This;
- CopyMem (&Private->SimpleFileSystem, &gPosixFileSystemProtocol, sizeof (Private->SimpleFileSystem));
- Private->FileHandlesOpen = FALSE;
-
- This->Interface = &Private->SimpleFileSystem;
- This->Private = Private;
- return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-PosixFileSystmeThunkClose (
- IN EMU_IO_THUNK_PROTOCOL *This
- )
-{
- EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
-
- if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {
- return EFI_UNSUPPORTED;
- }
-
- Private = This->Private;
-
- if (Private->FileHandlesOpen) {
- //
- // Close only supported if all the EFI_FILE_HANDLEs have been closed.
- //
- return EFI_NOT_READY;
- }
-
- if (This->Private != NULL) {
- if (Private->VolumeLabel != NULL) {
- free (Private->VolumeLabel);
- }
- free (This->Private);
- This->Private = NULL;
- }
-
- return EFI_SUCCESS;
-}
-
-
-EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo = {
- &gEfiSimpleFileSystemProtocolGuid,
- NULL,
- NULL,
- 0,
- GasketPosixFileSystmeThunkOpen,
- GasketPosixFileSystmeThunkClose,
- NULL
-};
-
-
+/*++ @file
+ POSIX Pthreads to emulate APs and implement threads
+
+Copyright (c) 2011, Apple Inc. All rights reserved.
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+
+**/
+
+#include "Host.h"
+
+
+#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'P', 'f', 's')
+
+typedef struct {
+ UINTN Signature;
+ EMU_IO_THUNK_PROTOCOL *Thunk;
+ EFI_SIMPLE_FILE_SYSTEM_PROTOCOL SimpleFileSystem;
+ CHAR8 *FilePath;
+ CHAR16 *VolumeLabel;
+ BOOLEAN FileHandlesOpen;
+} EMU_SIMPLE_FILE_SYSTEM_PRIVATE;
+
+#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS(a) \
+ CR (a, \
+ EMU_SIMPLE_FILE_SYSTEM_PRIVATE, \
+ SimpleFileSystem, \
+ EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE \
+ )
+
+
+#define EMU_EFI_FILE_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'P', 'f', 'i')
+
+typedef struct {
+ UINTN Signature;
+ EMU_IO_THUNK_PROTOCOL *Thunk;
+ EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;
+ EFI_FILE_PROTOCOL EfiFile;
+ int fd;
+ DIR *Dir;
+ BOOLEAN IsRootDirectory;
+ BOOLEAN IsDirectoryPath;
+ BOOLEAN IsOpenedByRead;
+ char *FileName;
+ struct dirent *Dirent;
+} EMU_EFI_FILE_PRIVATE;
+
+#define EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS(a) \
+ CR (a, \
+ EMU_EFI_FILE_PRIVATE, \
+ EfiFile, \
+ EMU_EFI_FILE_PRIVATE_SIGNATURE \
+ )
+
+EFI_STATUS
+PosixFileGetInfo (
+ IN EFI_FILE_PROTOCOL *This,
+ IN EFI_GUID *InformationType,
+ IN OUT UINTN *BufferSize,
+ OUT VOID *Buffer
+ );
+
+EFI_STATUS
+PosixFileSetInfo (
+ IN EFI_FILE_PROTOCOL *This,
+ IN EFI_GUID *InformationType,
+ IN UINTN BufferSize,
+ IN VOID *Buffer
+ );
+
+
+EFI_FILE_PROTOCOL gPosixFileProtocol = {
+ EFI_FILE_REVISION,
+ GasketPosixFileOpen,
+ GasketPosixFileCLose,
+ GasketPosixFileDelete,
+ GasketPosixFileRead,
+ GasketPosixFileWrite,
+ GasketPosixFileGetPossition,
+ GasketPosixFileSetPossition,
+ GasketPosixFileGetInfo,
+ GasketPosixFileSetInfo,
+ GasketPosixFileFlush
+};
+
+EFI_SIMPLE_FILE_SYSTEM_PROTOCOL gPosixFileSystemProtocol = {
+ EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION,
+ GasketPosixOpenVolume,
+};
+
+
+/**
+ Open the root directory on a volume.
+
+ @param This Protocol instance pointer.
+ @param Root Returns an Open file handle for the root directory
+
+ @retval EFI_SUCCESS The device was opened.
+ @retval EFI_UNSUPPORTED This volume does not support the file system.
+ @retval EFI_NO_MEDIA The device has no media.
+ @retval EFI_DEVICE_ERROR The device reported an error.
+ @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
+ @retval EFI_ACCESS_DENIED The service denied access to the file.
+ @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of resources.
+
+**/
+EFI_STATUS
+PosixOpenVolume (
+ IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
+ OUT EFI_FILE_PROTOCOL **Root
+ )
+{
+ EFI_STATUS Status;
+ EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
+ EMU_EFI_FILE_PRIVATE *PrivateFile;
+
+ Private = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (This);
+
+ Status = EFI_OUT_OF_RESOURCES;
+ PrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));
+ if (PrivateFile == NULL) {
+ goto Done;
+ }
+
+ PrivateFile->FileName = malloc (AsciiStrSize (Private->FilePath));
+ if (PrivateFile->FileName == NULL) {
+ goto Done;
+ }
+ AsciiStrCpy (PrivateFile->FileName, Private->FilePath);
+
+ PrivateFile->Signature = EMU_EFI_FILE_PRIVATE_SIGNATURE;
+ PrivateFile->Thunk = Private->Thunk;
+ PrivateFile->SimpleFileSystem = This;
+ PrivateFile->IsRootDirectory = TRUE;
+ PrivateFile->IsDirectoryPath = TRUE;
+ PrivateFile->IsOpenedByRead = TRUE;
+
+ CopyMem (&PrivateFile->EfiFile, &gPosixFileProtocol, sizeof (EFI_FILE_PROTOCOL));
+
+ PrivateFile->fd = -1;
+ PrivateFile->Dir = NULL;
+ PrivateFile->Dirent = NULL;
+
+ *Root = &PrivateFile->EfiFile;
+
+ PrivateFile->Dir = opendir (PrivateFile->FileName);
+ if (PrivateFile->Dir == NULL) {
+ Status = EFI_ACCESS_DENIED;
+ } else {
+ Status = EFI_SUCCESS;
+ }
+
+Done:
+ if (EFI_ERROR (Status)) {
+ if (PrivateFile != NULL) {
+ if (PrivateFile->FileName != NULL) {
+ free (PrivateFile->FileName);
+ }
+
+ free (PrivateFile);
+ }
+
+ *Root = NULL;
+ }
+
+ return Status;
+}
+
+
+EFI_STATUS
+ErrnoToEfiStatus ()
+{
+ switch (errno) {
+ case EACCES:
+ return EFI_ACCESS_DENIED;
+
+ case EDQUOT:
+ case ENOSPC:
+ return EFI_VOLUME_FULL;
+
+ default:
+ return EFI_DEVICE_ERROR;
+ }
+}
+
+VOID
+CutPrefix (
+ IN CHAR8 *Str,
+ IN UINTN Count
+ )
+{
+ CHAR8 *Pointer;
+
+ if (AsciiStrLen (Str) < Count) {
+ ASSERT (0);
+ }
+
+ for (Pointer = Str; *(Pointer + Count); Pointer++) {
+ *Pointer = *(Pointer + Count);
+ }
+
+ *Pointer = *(Pointer + Count);
+}
+
+
+VOID
+PosixSystemTimeToEfiTime (
+ IN time_t SystemTime,
+ OUT EFI_TIME *Time
+ )
+{
+ struct tm *tm;
+
+ tm = gmtime (&SystemTime);
+ Time->Year = tm->tm_year;
+ Time->Month = tm->tm_mon + 1;
+ Time->Day = tm->tm_mday;
+ Time->Hour = tm->tm_hour;
+ Time->Minute = tm->tm_min;
+ Time->Second = tm->tm_sec;
+ Time->Nanosecond = 0;
+
+ Time->TimeZone = timezone;
+ Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0) | (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
+}
+
+
+EFI_STATUS
+UnixSimpleFileSystemFileInfo (
+ EMU_EFI_FILE_PRIVATE *PrivateFile,
+ IN CHAR8 *FileName,
+ IN OUT UINTN *BufferSize,
+ OUT VOID *Buffer
+ )
+{
+ EFI_STATUS Status;
+ UINTN Size;
+ UINTN NameSize;
+ UINTN ResultSize;
+ EFI_FILE_INFO *Info;
+ CHAR8 *RealFileName;
+ CHAR8 *TempPointer;
+ CHAR16 *BufferFileName;
+ struct stat buf;
+
+ if (FileName != NULL) {
+ RealFileName = FileName;
+ } else if (PrivateFile->IsRootDirectory) {
+ RealFileName = "";
+ } else {
+ RealFileName = PrivateFile->FileName;
+ }
+
+ TempPointer = RealFileName;
+ while (*TempPointer) {
+ if (*TempPointer == '/') {
+ RealFileName = TempPointer + 1;
+ }
+
+ TempPointer++;
+ }
+
+ Size = SIZE_OF_EFI_FILE_INFO;
+ NameSize = AsciiStrSize (RealFileName) * 2;
+ ResultSize = Size + NameSize;
+
+ if (*BufferSize < ResultSize) {
+ *BufferSize = ResultSize;
+ return EFI_BUFFER_TOO_SMALL;
+ }
+ if (stat (FileName == NULL ? PrivateFile->FileName : FileName, &buf) < 0) {
+ return EFI_DEVICE_ERROR;
+ }
+
+ Status = EFI_SUCCESS;
+
+ Info = Buffer;
+ ZeroMem (Info, ResultSize);
+
+ Info->Size = ResultSize;
+ Info->FileSize = buf.st_size;
+ Info->PhysicalSize = MultU64x32 (buf.st_blocks, buf.st_blksize);
+
+ PosixSystemTimeToEfiTime (buf.st_ctime, &Info->CreateTime);
+ PosixSystemTimeToEfiTime (buf.st_atime, &Info->LastAccessTime);
+ PosixSystemTimeToEfiTime (buf.st_mtime, &Info->ModificationTime);
+
+ if (!(buf.st_mode & S_IWUSR)) {
+ Info->Attribute |= EFI_FILE_READ_ONLY;
+ }
+
+ if (S_ISDIR(buf.st_mode)) {
+ Info->Attribute |= EFI_FILE_DIRECTORY;
+ }
+
+
+ BufferFileName = (CHAR16 *)((CHAR8 *) Buffer + Size);
+ while (*RealFileName) {
+ *BufferFileName++ = *RealFileName++;
+ }
+ *BufferFileName = 0;
+
+ *BufferSize = ResultSize;
+ return Status;
+}
+
+BOOLEAN
+IsZero (
+ IN VOID *Buffer,
+ IN UINTN Length
+ )
+{
+ if (Buffer == NULL || Length == 0) {
+ return FALSE;
+ }
+
+ if (*(UINT8 *) Buffer != 0) {
+ return FALSE;
+ }
+
+ if (Length > 1) {
+ if (!CompareMem (Buffer, (UINT8 *) Buffer + 1, Length - 1)) {
+ return FALSE;
+ }
+ }
+
+ return TRUE;
+}
+
+
+
+/**
+ Opens a new file relative to the source file's location.
+
+ @param This The protocol instance pointer.
+ @param NewHandle Returns File Handle for FileName.
+ @param FileName Null terminated string. "\", ".", and ".." are supported.
+ @param OpenMode Open mode for file.
+ @param Attributes Only used for EFI_FILE_MODE_CREATE.
+
+ @retval EFI_SUCCESS The device was opened.
+ @retval EFI_NOT_FOUND The specified file could not be found on the device.
+ @retval EFI_NO_MEDIA The device has no media.
+ @retval EFI_MEDIA_CHANGED The media has changed.
+ @retval EFI_DEVICE_ERROR The device reported an error.
+ @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
+ @retval EFI_ACCESS_DENIED The service denied access to the file.
+ @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of resources.
+ @retval EFI_VOLUME_FULL The volume is full.
+
+**/
+EFI_STATUS
+PosixFileOpen (
+ IN EFI_FILE_PROTOCOL *This,
+ OUT EFI_FILE_PROTOCOL **NewHandle,
+ IN CHAR16 *FileName,
+ IN UINT64 OpenMode,
+ IN UINT64 Attributes
+ )
+{
+ EFI_FILE_PROTOCOL *Root;
+ EMU_EFI_FILE_PRIVATE *PrivateFile;
+ EMU_EFI_FILE_PRIVATE *NewPrivateFile;
+ EMU_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;
+ EFI_STATUS Status;
+ CHAR16 *Src;
+ char *Dst;
+ CHAR8 *RealFileName;
+ char *ParseFileName;
+ char *GuardPointer;
+ CHAR8 TempChar;
+ UINTN Count;
+ BOOLEAN TrailingDash;
+ BOOLEAN LoopFinish;
+ UINTN InfoSize;
+ EFI_FILE_INFO *Info;
+ struct stat finfo;
+ int res;
+
+
+ PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
+ PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (PrivateFile->SimpleFileSystem);
+ NewPrivateFile = NULL;
+ Status = EFI_OUT_OF_RESOURCES;
+
+ //
+ // BUGBUG: assume an open of root
+ // if current location, return current data
+ //
+ TrailingDash = FALSE;
+ if ((StrCmp (FileName, L"\\") == 0) ||
+ (StrCmp (FileName, L".") == 0 && PrivateFile->IsRootDirectory)) {
+OpenRoot:
+ Status = PosixOpenVolume (PrivateFile->SimpleFileSystem, &Root);
+ NewPrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (Root);
+ goto Done;
+ }
+
+ if (FileName[StrLen (FileName) - 1] == L'\\') {
+ TrailingDash = TRUE;
+ FileName[StrLen (FileName) - 1] = 0;
+ }
+
+ //
+ // Attempt to open the file
+ //
+ NewPrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));
+ if (NewPrivateFile == NULL) {
+ goto Done;
+ }
+
+ CopyMem (NewPrivateFile, PrivateFile, sizeof (EMU_EFI_FILE_PRIVATE));
+
+ NewPrivateFile->FileName = malloc (AsciiStrSize (PrivateFile->FileName) + 1 + StrLen (FileName) + 1);
+ if (NewPrivateFile->FileName == NULL) {
+ goto Done;
+ }
+
+ if (*FileName == L'\\') {
+ AsciiStrCpy (NewPrivateFile->FileName, PrivateRoot->FilePath);
+ // Skip first '\'.
+ Src = FileName + 1;
+ } else {
+ AsciiStrCpy (NewPrivateFile->FileName, PrivateFile->FileName);
+ Src = FileName;
+ }
+ Dst = NewPrivateFile->FileName + AsciiStrLen (NewPrivateFile->FileName);
+ GuardPointer = NewPrivateFile->FileName + AsciiStrLen (PrivateRoot->FilePath);
+ *Dst++ = '/';
+ // Convert unicode to ascii and '\' to '/'
+ while (*Src) {
+ if (*Src == '\\') {
+ *Dst++ = '/';
+ } else {
+ *Dst++ = *Src;
+ }
+ Src++;
+ }
+ *Dst = 0;
+
+
+ //
+ // Get rid of . and .., except leading . or ..
+ //
+
+ //
+ // GuardPointer protect simplefilesystem root path not be destroyed
+ //
+
+ LoopFinish = FALSE;
+ while (!LoopFinish) {
+ LoopFinish = TRUE;
+
+ for (ParseFileName = GuardPointer; *ParseFileName; ParseFileName++) {
+ if (*ParseFileName == '.' &&
+ (*(ParseFileName + 1) == 0 || *(ParseFileName + 1) == '/') &&
+ *(ParseFileName - 1) == '/'
+ ) {
+
+ //
+ // cut /.
+ //
+ CutPrefix (ParseFileName - 1, 2);
+ LoopFinish = FALSE;
+ break;
+ }
+
+ if (*ParseFileName == '.' &&
+ *(ParseFileName + 1) == '.' &&
+ (*(ParseFileName + 2) == 0 || *(ParseFileName + 2) == '/') &&
+ *(ParseFileName - 1) == '/'
+ ) {
+
+ ParseFileName--;
+ Count = 3;
+
+ while (ParseFileName != GuardPointer) {
+ ParseFileName--;
+ Count++;
+ if (*ParseFileName == '/') {
+ break;
+ }
+ }
+
+ //
+ // cut /.. and its left directory
+ //
+ CutPrefix (ParseFileName, Count);
+ LoopFinish = FALSE;
+ break;
+ }
+ }
+ }
+
+ if (AsciiStrCmp (NewPrivateFile->FileName, PrivateRoot->FilePath) == 0) {
+ NewPrivateFile->IsRootDirectory = TRUE;
+ free (NewPrivateFile->FileName);
+ free (NewPrivateFile);
+ goto OpenRoot;
+ }
+
+ RealFileName = NewPrivateFile->FileName + AsciiStrLen(NewPrivateFile->FileName) - 1;
+ while (RealFileName > NewPrivateFile->FileName && *RealFileName != '/') {
+ RealFileName--;
+ }
+
+ TempChar = *(RealFileName - 1);
+ *(RealFileName - 1) = 0;
+ *(RealFileName - 1) = TempChar;
+
+
+ //
+ // Test whether file or directory
+ //
+ NewPrivateFile->IsRootDirectory = FALSE;
+ NewPrivateFile->fd = -1;
+ NewPrivateFile->Dir = NULL;
+ if (OpenMode & EFI_FILE_MODE_CREATE) {
+ if (Attributes & EFI_FILE_DIRECTORY) {
+ NewPrivateFile->IsDirectoryPath = TRUE;
+ } else {
+ NewPrivateFile->IsDirectoryPath = FALSE;
+ }
+ } else {
+ res = stat (NewPrivateFile->FileName, &finfo);
+ if (res == 0 && S_ISDIR(finfo.st_mode)) {
+ NewPrivateFile->IsDirectoryPath = TRUE;
+ } else {
+ NewPrivateFile->IsDirectoryPath = FALSE;
+ }
+ }
+
+ if (OpenMode & EFI_FILE_MODE_WRITE) {
+ NewPrivateFile->IsOpenedByRead = FALSE;
+ } else {
+ NewPrivateFile->IsOpenedByRead = TRUE;
+ }
+
+ Status = EFI_SUCCESS;
+
+ //
+ // deal with directory
+ //
+ if (NewPrivateFile->IsDirectoryPath) {
+ if ((OpenMode & EFI_FILE_MODE_CREATE)) {
+ //
+ // Create a directory
+ //
+ if (mkdir (NewPrivateFile->FileName, 0777) != 0) {
+ if (errno != EEXIST) {
+ //free (TempFileName);
+ Status = EFI_ACCESS_DENIED;
+ goto Done;
+ }
+ }
+ }
+
+ NewPrivateFile->Dir = opendir (NewPrivateFile->FileName);
+ if (NewPrivateFile->Dir == NULL) {
+ if (errno == EACCES) {
+ Status = EFI_ACCESS_DENIED;
+ } else {
+ Status = EFI_NOT_FOUND;
+ }
+
+ goto Done;
+ }
+
+ } else {
+ //
+ // deal with file
+ //
+ NewPrivateFile->fd = open (
+ NewPrivateFile->FileName,
+ ((OpenMode & EFI_FILE_MODE_CREATE) ? O_CREAT : 0) | (NewPrivateFile->IsOpenedByRead ? O_RDONLY : O_RDWR),
+ 0666
+ );
+ if (NewPrivateFile->fd < 0) {
+ if (errno == ENOENT) {
+ Status = EFI_NOT_FOUND;
+ } else {
+ Status = EFI_ACCESS_DENIED;
+ }
+ }
+ }
+
+ if ((OpenMode & EFI_FILE_MODE_CREATE) && Status == EFI_SUCCESS) {
+ //
+ // Set the attribute
+ //
+ InfoSize = 0;
+ Info = NULL;
+ Status = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, &InfoSize, Info);
+ if (Status != EFI_BUFFER_TOO_SMALL) {
+ Status = EFI_DEVICE_ERROR;
+ goto Done;
+ }
+
+ Info = malloc (InfoSize);
+ if (Info == NULL) {
+ goto Done;
+ }
+
+ Status = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, &InfoSize, Info);
+ if (EFI_ERROR (Status)) {
+ goto Done;
+ }
+
+ Info->Attribute = Attributes;
+ PosixFileSetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, InfoSize, Info);
+
+ free (Info);
+ }
+
+Done: ;
+ if (TrailingDash) {
+ FileName[StrLen (FileName) + 1] = 0;
+ FileName[StrLen (FileName)] = L'\\';
+ }
+
+ if (EFI_ERROR (Status)) {
+ if (NewPrivateFile) {
+ if (NewPrivateFile->FileName) {
+ free (NewPrivateFile->FileName);
+ }
+
+ free (NewPrivateFile);
+ }
+ } else {
+ *NewHandle = &NewPrivateFile->EfiFile;
+ }
+
+ return Status;
+}
+
+
+
+/**
+ Close the file handle
+
+ @param This Protocol instance pointer.
+
+ @retval EFI_SUCCESS The device was opened.
+
+**/
+EFI_STATUS
+PosixFileCLose (
+ IN EFI_FILE_PROTOCOL *This
+ )
+{
+ EMU_EFI_FILE_PRIVATE *PrivateFile;
+
+ PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
+
+ if (PrivateFile->fd >= 0) {
+ close (PrivateFile->fd);
+ }
+ if (PrivateFile->Dir != NULL) {
+ closedir (PrivateFile->Dir);
+ }
+
+ PrivateFile->fd = -1;
+ PrivateFile->Dir = NULL;
+
+ if (PrivateFile->FileName) {
+ free (PrivateFile->FileName);
+ }
+
+ free (PrivateFile);
+
+ return EFI_SUCCESS;
+}
+
+
+/**
+ Close and delete the file handle.
+
+ @param This Protocol instance pointer.
+
+ @retval EFI_SUCCESS The device was opened.
+ @retval EFI_WARN_DELETE_FAILURE The handle was closed but the file was not deleted.
+
+**/
+EFI_STATUS
+PosixFileDelete (
+ IN EFI_FILE_PROTOCOL *This
+ )
+{
+ EFI_STATUS Status;
+ EMU_EFI_FILE_PRIVATE *PrivateFile;
+
+ PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
+ Status = EFI_WARN_DELETE_FAILURE;
+
+ if (PrivateFile->IsDirectoryPath) {
+ if (PrivateFile->Dir != NULL) {
+ closedir (PrivateFile->Dir);
+ PrivateFile->Dir = NULL;
+ }
+
+ if (rmdir (PrivateFile->FileName) == 0) {
+ Status = EFI_SUCCESS;
+ }
+ } else {
+ close (PrivateFile->fd);
+ PrivateFile->fd = -1;
+
+ if (!PrivateFile->IsOpenedByRead) {
+ if (!unlink (PrivateFile->FileName)) {
+ Status = EFI_SUCCESS;
+ }
+ }
+ }
+
+ free (PrivateFile->FileName);
+ free (PrivateFile);
+
+ return Status;
+}
+
+
+/**
+ Read data from the file.
+
+ @param This Protocol instance pointer.
+ @param BufferSize On input size of buffer, on output amount of data in buffer.
+ @param Buffer The buffer in which data is read.
+
+ @retval EFI_SUCCESS Data was read.
+ @retval EFI_NO_MEDIA The device has no media.
+ @retval EFI_DEVICE_ERROR The device reported an error.
+ @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
+ @retval EFI_BUFFER_TO_SMALL BufferSize is too small. BufferSize contains required size.
+
+**/
+EFI_STATUS
+PosixFileRead (
+ IN EFI_FILE_PROTOCOL *This,
+ IN OUT UINTN *BufferSize,
+ OUT VOID *Buffer
+ )
+{
+ EMU_EFI_FILE_PRIVATE *PrivateFile;
+ EFI_STATUS Status;
+ int Res;
+ UINTN Size;
+ UINTN NameSize;
+ UINTN ResultSize;
+ CHAR8 *FullFileName;
+
+
+ PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
+
+ if (!PrivateFile->IsDirectoryPath) {
+ if (PrivateFile->fd < 0) {
+ Status = EFI_DEVICE_ERROR;
+ goto Done;
+ }
+
+ Res = read (PrivateFile->fd, Buffer, *BufferSize);
+ if (Res < 0) {
+ Status = EFI_DEVICE_ERROR;
+ goto Done;
+ }
+ *BufferSize = Res;
+ Status = EFI_SUCCESS;
+ goto Done;
+ }
+
+ //
+ // Read on a directory.
+ //
+ if (PrivateFile->Dir == NULL) {
+ Status = EFI_DEVICE_ERROR;
+ goto Done;
+ }
+
+ if (PrivateFile->Dirent == NULL) {
+ PrivateFile->Dirent = readdir (PrivateFile->Dir);
+ if (PrivateFile->Dirent == NULL) {
+ *BufferSize = 0;
+ Status = EFI_SUCCESS;
+ goto Done;
+ }
+ }
+
+ Size = SIZE_OF_EFI_FILE_INFO;
+ NameSize = AsciiStrLen (PrivateFile->Dirent->d_name) + 1;
+ ResultSize = Size + 2 * NameSize;
+
+ if (*BufferSize < ResultSize) {
+ *BufferSize = ResultSize;
+ Status = EFI_BUFFER_TOO_SMALL;
+ goto Done;
+ }
+ Status = EFI_SUCCESS;
+
+ *BufferSize = ResultSize;
+
+ FullFileName = malloc (AsciiStrLen(PrivateFile->FileName) + 1 + NameSize);
+ if (FullFileName == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto Done;
+ }
+
+ AsciiStrCpy (FullFileName, PrivateFile->FileName);
+ AsciiStrCat (FullFileName, "/");
+ AsciiStrCat (FullFileName, PrivateFile->Dirent->d_name);
+ Status = UnixSimpleFileSystemFileInfo (
+ PrivateFile,
+ FullFileName,
+ BufferSize,
+ Buffer
+ );
+ free (FullFileName);
+
+ PrivateFile->Dirent = NULL;
+
+Done:
+ return Status;
+}
+
+
+
+/**
+ Write data to a file.
+
+ @param This Protocol instance pointer.
+ @param BufferSize On input size of buffer, on output amount of data in buffer.
+ @param Buffer The buffer in which data to write.
+
+ @retval EFI_SUCCESS Data was written.
+ @retval EFI_UNSUPPORTED Writes to Open directory are not supported.
+ @retval EFI_NO_MEDIA The device has no media.
+ @retval EFI_DEVICE_ERROR The device reported an error.
+ @retval EFI_DEVICE_ERROR An attempt was made to write to a deleted file.
+ @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
+ @retval EFI_WRITE_PROTECTED The device is write protected.
+ @retval EFI_ACCESS_DENIED The file was open for read only.
+ @retval EFI_VOLUME_FULL The volume is full.
+
+**/
+EFI_STATUS
+PosixFileWrite (
+ IN EFI_FILE_PROTOCOL *This,
+ IN OUT UINTN *BufferSize,
+ IN VOID *Buffer
+ )
+{
+ EMU_EFI_FILE_PRIVATE *PrivateFile;
+ int Res;
+
+
+ PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
+
+ if (PrivateFile->fd < 0) {
+ return EFI_DEVICE_ERROR;
+ }
+
+ if (PrivateFile->IsDirectoryPath) {
+ return EFI_UNSUPPORTED;
+ }
+
+ if (PrivateFile->IsOpenedByRead) {
+ return EFI_ACCESS_DENIED;
+ }
+
+ Res = write (PrivateFile->fd, Buffer, *BufferSize);
+ if (Res == (UINTN)-1) {
+ return ErrnoToEfiStatus ();
+ }
+
+ *BufferSize = Res;
+ return EFI_SUCCESS;
+}
+
+
+
+/**
+ Set a files current position
+
+ @param This Protocol instance pointer.
+ @param Position Byte position from the start of the file.
+
+ @retval EFI_SUCCESS Data was written.
+ @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open.
+
+**/
+EFI_STATUS
+PosixFileSetPossition (
+ IN EFI_FILE_PROTOCOL *This,
+ IN UINT64 Position
+ )
+{
+ EMU_EFI_FILE_PRIVATE *PrivateFile;
+ off_t Pos;
+
+ PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
+
+ if (PrivateFile->IsDirectoryPath) {
+ if (Position != 0) {
+ return EFI_UNSUPPORTED;
+ }
+
+ if (PrivateFile->Dir == NULL) {
+ return EFI_DEVICE_ERROR;
+ }
+ rewinddir (PrivateFile->Dir);
+ return EFI_SUCCESS;
+ } else {
+ if (Position == (UINT64) -1) {
+ Pos = lseek (PrivateFile->fd, 0, SEEK_END);
+ } else {
+ Pos = lseek (PrivateFile->fd, Position, SEEK_SET);
+ }
+ if (Pos == (off_t)-1) {
+ return ErrnoToEfiStatus ();
+ }
+ return EFI_SUCCESS;
+ }
+}
+
+
+
+/**
+ Get a file's current position
+
+ @param This Protocol instance pointer.
+ @param Position Byte position from the start of the file.
+
+ @retval EFI_SUCCESS Data was written.
+ @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open..
+
+**/
+EFI_STATUS
+PosixFileGetPossition (
+ IN EFI_FILE_PROTOCOL *This,
+ OUT UINT64 *Position
+ )
+{
+ EFI_STATUS Status;
+ EMU_EFI_FILE_PRIVATE *PrivateFile;
+
+ PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
+
+ if (PrivateFile->IsDirectoryPath) {
+ Status = EFI_UNSUPPORTED;
+ } else {
+ *Position = (UINT64)lseek (PrivateFile->fd, 0, SEEK_CUR);
+ Status = (*Position == (UINT64) -1) ? ErrnoToEfiStatus () : EFI_SUCCESS;
+ }
+
+ return Status;
+}
+
+
+/**
+ Get information about a file.
+
+ @param This Protocol instance pointer.
+ @param InformationType Type of information to return in Buffer.
+ @param BufferSize On input size of buffer, on output amount of data in buffer.
+ @param Buffer The buffer to return data.
+
+ @retval EFI_SUCCESS Data was returned.
+ @retval EFI_UNSUPPORTED InformationType is not supported.
+ @retval EFI_NO_MEDIA The device has no media.
+ @retval EFI_DEVICE_ERROR The device reported an error.
+ @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
+ @retval EFI_WRITE_PROTECTED The device is write protected.
+ @retval EFI_ACCESS_DENIED The file was open for read only.
+ @retval EFI_BUFFER_TOO_SMALL Buffer was too small; required size returned in BufferSize.
+
+**/
+EFI_STATUS
+PosixFileGetInfo (
+ IN EFI_FILE_PROTOCOL *This,
+ IN EFI_GUID *InformationType,
+ IN OUT UINTN *BufferSize,
+ OUT VOID *Buffer
+ )
+{
+ EFI_STATUS Status;
+ EMU_EFI_FILE_PRIVATE *PrivateFile;
+ EFI_FILE_SYSTEM_INFO *FileSystemInfoBuffer;
+ int UnixStatus;
+ EMU_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;
+ struct statfs buf;
+
+ PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
+ PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (PrivateFile->SimpleFileSystem);
+
+ Status = EFI_SUCCESS;
+ if (CompareGuid (InformationType, &gEfiFileInfoGuid)) {
+ Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, BufferSize, Buffer);
+ } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
+ if (*BufferSize < SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel)) {
+ *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);
+ return EFI_BUFFER_TOO_SMALL;
+ }
+
+ UnixStatus = statfs (PrivateFile->FileName, &buf);
+ if (UnixStatus < 0) {
+ return EFI_DEVICE_ERROR;
+ }
+
+ FileSystemInfoBuffer = (EFI_FILE_SYSTEM_INFO *) Buffer;
+ FileSystemInfoBuffer->Size = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);
+ FileSystemInfoBuffer->ReadOnly = FALSE;
+
+ //
+ // Succeeded
+ //
+ FileSystemInfoBuffer->VolumeSize = MultU64x32 (buf.f_blocks, buf.f_bsize);
+ FileSystemInfoBuffer->FreeSpace = MultU64x32 (buf.f_bavail, buf.f_bsize);
+ FileSystemInfoBuffer->BlockSize = buf.f_bsize;
+
+
+ StrCpy ((CHAR16 *) FileSystemInfoBuffer->VolumeLabel, PrivateRoot->VolumeLabel);
+ *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel);
+
+ } else if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) {
+ if (*BufferSize < StrSize (PrivateRoot->VolumeLabel)) {
+ *BufferSize = StrSize (PrivateRoot->VolumeLabel);
+ return EFI_BUFFER_TOO_SMALL;
+ }
+
+ StrCpy ((CHAR16 *) Buffer, PrivateRoot->VolumeLabel);
+ *BufferSize = StrSize (PrivateRoot->VolumeLabel);
+
+ }
+
+ return Status;
+}
+
+
+/**
+ Set information about a file
+
+ @param File Protocol instance pointer.
+ @param InformationType Type of information in Buffer.
+ @param BufferSize Size of buffer.
+ @param Buffer The data to write.
+
+ @retval EFI_SUCCESS Data was returned.
+ @retval EFI_UNSUPPORTED InformationType is not supported.
+ @retval EFI_NO_MEDIA The device has no media.
+ @retval EFI_DEVICE_ERROR The device reported an error.
+ @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
+ @retval EFI_WRITE_PROTECTED The device is write protected.
+ @retval EFI_ACCESS_DENIED The file was open for read only.
+
+**/
+EFI_STATUS
+PosixFileSetInfo (
+ IN EFI_FILE_PROTOCOL *This,
+ IN EFI_GUID *InformationType,
+ IN UINTN BufferSize,
+ IN VOID *Buffer
+ )
+{
+ EMU_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;
+ EMU_EFI_FILE_PRIVATE *PrivateFile;
+ EFI_FILE_INFO *OldFileInfo;
+ EFI_FILE_INFO *NewFileInfo;
+ EFI_STATUS Status;
+ UINTN OldInfoSize;
+ mode_t NewAttr;
+ struct stat OldAttr;
+ CHAR8 *OldFileName;
+ CHAR8 *NewFileName;
+ CHAR8 *CharPointer;
+ BOOLEAN AttrChangeFlag;
+ BOOLEAN NameChangeFlag;
+ BOOLEAN SizeChangeFlag;
+ BOOLEAN TimeChangeFlag;
+ struct tm NewLastAccessSystemTime;
+ struct tm NewLastWriteSystemTime;
+ EFI_FILE_SYSTEM_INFO *NewFileSystemInfo;
+ CHAR8 *AsciiFilePtr;
+ CHAR16 *UnicodeFilePtr;
+ int UnixStatus;
+ struct utimbuf Utime;
+
+
+ PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
+ PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (PrivateFile->SimpleFileSystem);
+ errno = 0;
+ Status = EFI_UNSUPPORTED;
+ OldFileInfo = NewFileInfo = NULL;
+ OldFileName = NewFileName = NULL;
+ AttrChangeFlag = NameChangeFlag = SizeChangeFlag = TimeChangeFlag = FALSE;
+
+ //
+ // Set file system information.
+ //
+ if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
+ if (BufferSize < (SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot->VolumeLabel))) {
+ Status = EFI_BAD_BUFFER_SIZE;
+ goto Done;
+ }
+
+ NewFileSystemInfo = (EFI_FILE_SYSTEM_INFO *) Buffer;
+
+ free (PrivateRoot->VolumeLabel);
+
+ PrivateRoot->VolumeLabel = malloc (StrSize (NewFileSystemInfo->VolumeLabel));
+ if (PrivateRoot->VolumeLabel == NULL) {
+ goto Done;
+ }
+
+ StrCpy (PrivateRoot->VolumeLabel, NewFileSystemInfo->VolumeLabel);
+
+ Status = EFI_SUCCESS;
+ goto Done;
+ }
+
+ //
+ // Set volume label information.
+ //
+ if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) {
+ if (BufferSize < StrSize (PrivateRoot->VolumeLabel)) {
+ Status = EFI_BAD_BUFFER_SIZE;
+ goto Done;
+ }
+
+ StrCpy (PrivateRoot->VolumeLabel, (CHAR16 *) Buffer);
+
+ Status = EFI_SUCCESS;
+ goto Done;
+ }
+
+ if (!CompareGuid (InformationType, &gEfiFileInfoGuid)) {
+ Status = EFI_UNSUPPORTED;
+ goto Done;
+ }
+
+ if (BufferSize < SIZE_OF_EFI_FILE_INFO) {
+ Status = EFI_BAD_BUFFER_SIZE;
+ goto Done;
+ }
+
+ //
+ // Set file/directory information.
+ //
+
+ //
+ // Check for invalid set file information parameters.
+ //
+ NewFileInfo = (EFI_FILE_INFO *) Buffer;
+ if (NewFileInfo->Size <= sizeof (EFI_FILE_INFO) ||
+ (NewFileInfo->Attribute &~(EFI_FILE_VALID_ATTR)) ||
+ (sizeof (UINTN) == 4 && NewFileInfo->Size > 0xFFFFFFFF)
+ ) {
+ Status = EFI_INVALID_PARAMETER;
+ goto Done;
+ }
+
+ //
+ // Get current file information so we can determine what kind
+ // of change request this is.
+ //
+ OldInfoSize = 0;
+ Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize, NULL);
+ if (Status != EFI_BUFFER_TOO_SMALL) {
+ Status = EFI_DEVICE_ERROR;
+ goto Done;
+ }
+
+ OldFileInfo = malloc (OldInfoSize);
+ if (OldFileInfo == NULL) {
+ goto Done;
+ }
+
+ Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize, OldFileInfo);
+ if (EFI_ERROR (Status)) {
+ goto Done;
+ }
+
+ OldFileName = malloc (AsciiStrSize (PrivateFile->FileName));
+ if (OldFileInfo == NULL) {
+ goto Done;
+ }
+
+ AsciiStrCpy (OldFileName, PrivateFile->FileName);
+
+ //
+ // Make full pathname from new filename and rootpath.
+ //
+ if (NewFileInfo->FileName[0] == '\\') {
+ NewFileName = malloc (AsciiStrLen (PrivateRoot->FilePath) + 1 + StrLen (NewFileInfo->FileName) + 1);
+ if (NewFileName == NULL) {
+ goto Done;
+ }
+
+ AsciiStrCpy (NewFileName, PrivateRoot->FilePath);
+ AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);
+ UnicodeFilePtr = NewFileInfo->FileName + 1;
+ *AsciiFilePtr++ ='/';
+ } else {
+ NewFileName = malloc (AsciiStrLen (PrivateFile->FileName) + 2 + StrLen (NewFileInfo->FileName) + 1);
+ if (NewFileName == NULL) {
+ goto Done;
+ }
+
+ AsciiStrCpy (NewFileName, PrivateRoot->FilePath);
+ AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);
+ if ((AsciiFilePtr[-1] != '/') && (NewFileInfo->FileName[0] != '/')) {
+ // make sure there is a / between Root FilePath and NewFileInfo Filename
+ AsciiFilePtr[0] = '/';
+ AsciiFilePtr[1] = '\0';
+ AsciiFilePtr++;
+ }
+ UnicodeFilePtr = NewFileInfo->FileName;
+ }
+ // Convert to ascii.
+ while (*UnicodeFilePtr) {
+ *AsciiFilePtr++ = *UnicodeFilePtr++;
+ }
+ *AsciiFilePtr = 0;
+
+ //
+ // Is there an attribute change request?
+ //
+ if (NewFileInfo->Attribute != OldFileInfo->Attribute) {
+ if ((NewFileInfo->Attribute & EFI_FILE_DIRECTORY) != (OldFileInfo->Attribute & EFI_FILE_DIRECTORY)) {
+ Status = EFI_INVALID_PARAMETER;
+ goto Done;
+ }
+
+ AttrChangeFlag = TRUE;
+ }
+
+ //
+ // Is there a name change request?
+ // bugbug: - Should really use EFI_UNICODE_COLLATION_PROTOCOL
+ //
+ if (StrCmp (NewFileInfo->FileName, OldFileInfo->FileName)) {
+ NameChangeFlag = TRUE;
+ }
+
+ //
+ // Is there a size change request?
+ //
+ if (NewFileInfo->FileSize != OldFileInfo->FileSize) {
+ SizeChangeFlag = TRUE;
+ }
+
+ //
+ // Is there a time stamp change request?
+ //
+ if (!IsZero (&NewFileInfo->CreateTime, sizeof (EFI_TIME)) &&
+ CompareMem (&NewFileInfo->CreateTime, &OldFileInfo->CreateTime, sizeof (EFI_TIME))
+ ) {
+ TimeChangeFlag = TRUE;
+ } else if (!IsZero (&NewFileInfo->LastAccessTime, sizeof (EFI_TIME)) &&
+ CompareMem (&NewFileInfo->LastAccessTime, &OldFileInfo->LastAccessTime, sizeof (EFI_TIME))
+ ) {
+ TimeChangeFlag = TRUE;
+ } else if (!IsZero (&NewFileInfo->ModificationTime, sizeof (EFI_TIME)) &&
+ CompareMem (&NewFileInfo->ModificationTime, &OldFileInfo->ModificationTime, sizeof (EFI_TIME))
+ ) {
+ TimeChangeFlag = TRUE;
+ }
+
+ //
+ // All done if there are no change requests being made.
+ //
+ if (!(AttrChangeFlag || NameChangeFlag || SizeChangeFlag || TimeChangeFlag)) {
+ Status = EFI_SUCCESS;
+ goto Done;
+ }
+
+ //
+ // Set file or directory information.
+ //
+ if (stat (OldFileName, &OldAttr) != 0) {
+ Status = ErrnoToEfiStatus ();
+ goto Done;
+ }
+
+ //
+ // Name change.
+ //
+ if (NameChangeFlag) {
+ //
+ // Close the handles first
+ //
+ if (PrivateFile->IsOpenedByRead) {
+ Status = EFI_ACCESS_DENIED;
+ goto Done;
+ }
+
+ for (CharPointer = NewFileName; *CharPointer != 0 && *CharPointer != L'/'; CharPointer++) {
+ }
+
+ if (*CharPointer != 0) {
+ Status = EFI_ACCESS_DENIED;
+ goto Done;
+ }
+
+ UnixStatus = rename (OldFileName, NewFileName);
+ if (UnixStatus == 0) {
+ //
+ // modify file name
+ //
+ free (PrivateFile->FileName);
+
+ PrivateFile->FileName = malloc (AsciiStrSize (NewFileName));
+ if (PrivateFile->FileName == NULL) {
+ goto Done;
+ }
+
+ AsciiStrCpy (PrivateFile->FileName, NewFileName);
+ } else {
+ Status = EFI_DEVICE_ERROR;
+ goto Done;
+ }
+ }
+
+ //
+ // Size change
+ //
+ if (SizeChangeFlag) {
+ if (PrivateFile->IsDirectoryPath) {
+ Status = EFI_UNSUPPORTED;
+ goto Done;
+ }
+
+ if (PrivateFile->IsOpenedByRead || OldFileInfo->Attribute & EFI_FILE_READ_ONLY) {
+ Status = EFI_ACCESS_DENIED;
+ goto Done;
+ }
+
+ if (ftruncate (PrivateFile->fd, NewFileInfo->FileSize) != 0) {
+ Status = ErrnoToEfiStatus ();
+ goto Done;
+ }
+
+ }
+
+ //
+ // Time change
+ //
+ if (TimeChangeFlag) {
+ NewLastAccessSystemTime.tm_year = NewFileInfo->LastAccessTime.Year;
+ NewLastAccessSystemTime.tm_mon = NewFileInfo->LastAccessTime.Month;
+ NewLastAccessSystemTime.tm_mday = NewFileInfo->LastAccessTime.Day;
+ NewLastAccessSystemTime.tm_hour = NewFileInfo->LastAccessTime.Hour;
+ NewLastAccessSystemTime.tm_min = NewFileInfo->LastAccessTime.Minute;
+ NewLastAccessSystemTime.tm_sec = NewFileInfo->LastAccessTime.Second;
+ NewLastAccessSystemTime.tm_isdst = 0;
+
+ Utime.actime = mktime (&NewLastAccessSystemTime);
+
+ NewLastWriteSystemTime.tm_year = NewFileInfo->ModificationTime.Year;
+ NewLastWriteSystemTime.tm_mon = NewFileInfo->ModificationTime.Month;
+ NewLastWriteSystemTime.tm_mday = NewFileInfo->ModificationTime.Day;
+ NewLastWriteSystemTime.tm_hour = NewFileInfo->ModificationTime.Hour;
+ NewLastWriteSystemTime.tm_min = NewFileInfo->ModificationTime.Minute;
+ NewLastWriteSystemTime.tm_sec = NewFileInfo->ModificationTime.Second;
+ NewLastWriteSystemTime.tm_isdst = 0;
+
+ Utime.modtime = mktime (&NewLastWriteSystemTime);
+
+ if (Utime.actime == (time_t)-1 || Utime.modtime == (time_t)-1) {
+ goto Done;
+ }
+
+ if (utime (PrivateFile->FileName, &Utime) == -1) {
+ Status = ErrnoToEfiStatus ();
+ goto Done;
+ }
+ }
+
+ //
+ // No matter about AttrChangeFlag, Attribute must be set.
+ // Because operation before may cause attribute change.
+ //
+ NewAttr = OldAttr.st_mode;
+
+ if (NewFileInfo->Attribute & EFI_FILE_READ_ONLY) {
+ NewAttr &= ~(S_IRUSR | S_IRGRP | S_IROTH);
+ } else {
+ NewAttr |= S_IRUSR;
+ }
+
+ if (chmod (NewFileName, NewAttr) != 0) {
+ Status = ErrnoToEfiStatus ();
+ }
+
+Done:
+ if (OldFileInfo != NULL) {
+ free (OldFileInfo);
+ }
+
+ if (OldFileName != NULL) {
+ free (OldFileName);
+ }
+
+ if (NewFileName != NULL) {
+ free (NewFileName);
+ }
+
+ return Status;
+}
+
+
+/**
+ Flush data back for the file handle.
+
+ @param This Protocol instance pointer.
+
+ @retval EFI_SUCCESS Data was written.
+ @retval EFI_UNSUPPORTED Writes to Open directory are not supported.
+ @retval EFI_NO_MEDIA The device has no media.
+ @retval EFI_DEVICE_ERROR The device reported an error.
+ @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
+ @retval EFI_WRITE_PROTECTED The device is write protected.
+ @retval EFI_ACCESS_DENIED The file was open for read only.
+ @retval EFI_VOLUME_FULL The volume is full.
+
+**/
+EFI_STATUS
+PosixFileFlush (
+ IN EFI_FILE_PROTOCOL *This
+ )
+{
+ EMU_EFI_FILE_PRIVATE *PrivateFile;
+
+
+ PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
+
+ if (PrivateFile->IsDirectoryPath) {
+ return EFI_UNSUPPORTED;
+ }
+
+ if (PrivateFile->IsOpenedByRead) {
+ return EFI_ACCESS_DENIED;
+ }
+
+ if (PrivateFile->fd < 0) {
+ return EFI_DEVICE_ERROR;
+ }
+
+ if (fsync (PrivateFile->fd) != 0) {
+ return ErrnoToEfiStatus ();
+ }
+
+ return EFI_SUCCESS;
+}
+
+
+
+EFI_STATUS
+PosixFileSystmeThunkOpen (
+ IN EMU_IO_THUNK_PROTOCOL *This
+ )
+{
+ EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
+ UINTN i;
+
+ if (This->Private != NULL) {
+ return EFI_ALREADY_STARTED;
+ }
+
+ if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {
+ return EFI_UNSUPPORTED;
+ }
+
+ Private = malloc (sizeof (EMU_SIMPLE_FILE_SYSTEM_PRIVATE));
+ if (Private == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ Private->FilePath = malloc (StrLen (This->ConfigString) + 1);
+ if (Private->FilePath == NULL) {
+ free (Private);
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ // Convert Unicode to Ascii
+ for (i = 0; This->ConfigString[i] != 0; i++) {
+ Private->FilePath[i] = This->ConfigString[i];
+ }
+ Private->FilePath[i] = 0;
+
+
+ Private->VolumeLabel = malloc (StrSize (L"EFI_EMULATED"));
+ if (Private->VolumeLabel == NULL) {
+ free (Private->FilePath);
+ free (Private);
+ return EFI_OUT_OF_RESOURCES;
+ }
+ StrCpy (Private->VolumeLabel, L"EFI_EMULATED");
+
+ Private->Signature = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE;
+ Private->Thunk = This;
+ CopyMem (&Private->SimpleFileSystem, &gPosixFileSystemProtocol, sizeof (Private->SimpleFileSystem));
+ Private->FileHandlesOpen = FALSE;
+
+ This->Interface = &Private->SimpleFileSystem;
+ This->Private = Private;
+ return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+PosixFileSystmeThunkClose (
+ IN EMU_IO_THUNK_PROTOCOL *This
+ )
+{
+ EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
+
+ if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {
+ return EFI_UNSUPPORTED;
+ }
+
+ Private = This->Private;
+
+ if (Private->FileHandlesOpen) {
+ //
+ // Close only supported if all the EFI_FILE_HANDLEs have been closed.
+ //
+ return EFI_NOT_READY;
+ }
+
+ if (This->Private != NULL) {
+ if (Private->VolumeLabel != NULL) {
+ free (Private->VolumeLabel);
+ }
+ free (This->Private);
+ This->Private = NULL;
+ }
+
+ return EFI_SUCCESS;
+}
+
+
+EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo = {
+ &gEfiSimpleFileSystemProtocolGuid,
+ NULL,
+ NULL,
+ 0,
+ GasketPosixFileSystmeThunkOpen,
+ GasketPosixFileSystmeThunkClose,
+ NULL
+};
+
+
diff --git a/EmulatorPkg/Unix/Host/Pthreads.c b/EmulatorPkg/Unix/Host/Pthreads.c
index c60c298099..cb9ffeea84 100644
--- a/EmulatorPkg/Unix/Host/Pthreads.c
+++ b/EmulatorPkg/Unix/Host/Pthreads.c
@@ -1,235 +1,235 @@
-/*++ @file
- POSIX Pthreads to emulate APs and implement threads
-
-Copyright (c) 2011, Apple Inc. All rights reserved.
-Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
-
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-
-**/
-
-#include "Host.h"
-#include <pthread.h>
-
-
-UINTN
-EFIAPI
-PthreadMutexLock (
- IN VOID *Mutex
- )
-{
- return (UINTN)pthread_mutex_lock ((pthread_mutex_t *)Mutex);
-}
-
-
-
-UINTN
-EFIAPI
-PthreadMutexUnLock (
- IN VOID *Mutex
- )
-{
- return (UINTN)pthread_mutex_unlock ((pthread_mutex_t *)Mutex);
-}
-
-
-UINTN
-EFIAPI
-PthreadMutexTryLock (
- IN VOID *Mutex
- )
-{
- return (UINTN)pthread_mutex_trylock ((pthread_mutex_t *)Mutex);
-}
-
-
-VOID *
-PthreadMutexInit (
- IN VOID
- )
-{
- pthread_mutex_t *Mutex;
- int err;
-
- Mutex = malloc (sizeof (pthread_mutex_t));
- err = pthread_mutex_init (Mutex, NULL);
- if (err == 0) {
- return Mutex;
- }
-
- return NULL;
-}
-
-
-UINTN
-PthreadMutexDestroy (
- IN VOID *Mutex
- )
-{
- if (Mutex != NULL) {
- return pthread_mutex_destroy ((pthread_mutex_t *)Mutex);
- }
-
- return -1;
-}
-
-// Can't store this data on PthreadCreate stack so we need a global
-typedef struct {
- pthread_mutex_t Mutex;
- THREAD_THUNK_THREAD_ENTRY Start;
-} THREAD_MANGLE;
-
-THREAD_MANGLE mThreadMangle = {
- PTHREAD_MUTEX_INITIALIZER,
- NULL
-};
-
-VOID *
-SecFakePthreadStart (
- VOID *Context
- )
-{
- THREAD_THUNK_THREAD_ENTRY Start;
- sigset_t SigMask;
-
- // Save global on the stack before we unlock
- Start = mThreadMangle.Start;
- pthread_mutex_unlock (&mThreadMangle.Mutex);
-
- // Mask all signals to the APs
- sigfillset (&SigMask);
- pthread_sigmask (SIG_BLOCK, &SigMask, NULL);
-
- //
- // We have to start the thread in SEC as we need to follow
- // OS X calling conventions. We can then call back into
- // to the callers Start.
- //
- // This is a great example of how all problems in computer
- // science can be solved by adding another level of indirection
- //
- return (VOID *)ReverseGasketUint64 ((CALL_BACK)Start, (UINTN)Context);
-}
-
-UINTN
-PthreadCreate (
- IN VOID *Thread,
- IN VOID *Attribute,
- IN THREAD_THUNK_THREAD_ENTRY Start,
- IN VOID *Context
- )
-{
- int err;
- BOOLEAN EnabledOnEntry;
-
- //
- // Threads inherit interrupt state so disable interrupts before we start thread
- //
- if (SecInterruptEanbled ()) {
- SecDisableInterrupt ();
- EnabledOnEntry = TRUE;
- } else {
- EnabledOnEntry = FALSE;
- }
-
- // Aquire lock for global, SecFakePthreadStart runs in a different thread.
- pthread_mutex_lock (&mThreadMangle.Mutex);
- mThreadMangle.Start = Start;
-
- err = pthread_create (Thread, Attribute, SecFakePthreadStart, Context);
- if (err != 0) {
- // Thread failed to launch so release the lock;
- pthread_mutex_unlock (&mThreadMangle.Mutex);
- }
-
- if (EnabledOnEntry) {
- // Restore interrupt state
- SecEnableInterrupt ();
- }
-
- return err;
-}
-
-
-VOID
-PthreadExit (
- IN VOID *ValuePtr
- )
-{
- pthread_exit (ValuePtr);
- return;
-}
-
-
-UINTN
-PthreadSelf (
- VOID
- )
-{
- // POSIX currently allows pthread_t to be a structure or arithmetic type.
- // Check out sys/types.h to make sure this will work if you are porting.
- // On OS X (Darwin) pthread_t is a pointer to a structure so this code works.
- return (UINTN)pthread_self ();
-}
-
-
-EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {
- GasketPthreadMutexLock,
- GasketPthreadMutexUnLock,
- GasketPthreadMutexTryLock,
- GasketPthreadMutexInit,
- GasketPthreadMutexDestroy,
- GasketPthreadCreate,
- GasketPthreadExit,
- GasketPthreadSelf
-};
-
-
-EFI_STATUS
-PthreadOpen (
- IN EMU_IO_THUNK_PROTOCOL *This
- )
-{
- if (This->Instance != 0) {
- // Only single instance is supported
- return EFI_NOT_FOUND;
- }
-
- if (This->ConfigString[0] == L'0') {
- // If AP count is zero no need for threads
- return EFI_NOT_FOUND;
- }
-
- This->Interface = &gPthreadThunk;
-
- return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-PthreadClose (
- IN EMU_IO_THUNK_PROTOCOL *This
- )
-{
- return EFI_SUCCESS;
-}
-
-
-EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {
- &gEmuThreadThunkProtocolGuid,
- NULL,
- NULL,
- 0,
- GasketPthreadOpen,
- GasketPthreadClose,
- NULL
-};
-
-
+/*++ @file
+ POSIX Pthreads to emulate APs and implement threads
+
+Copyright (c) 2011, Apple Inc. All rights reserved.
+Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
+
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+
+**/
+
+#include "Host.h"
+#include <pthread.h>
+
+
+UINTN
+EFIAPI
+PthreadMutexLock (
+ IN VOID *Mutex
+ )
+{
+ return (UINTN)pthread_mutex_lock ((pthread_mutex_t *)Mutex);
+}
+
+
+
+UINTN
+EFIAPI
+PthreadMutexUnLock (
+ IN VOID *Mutex
+ )
+{
+ return (UINTN)pthread_mutex_unlock ((pthread_mutex_t *)Mutex);
+}
+
+
+UINTN
+EFIAPI
+PthreadMutexTryLock (
+ IN VOID *Mutex
+ )
+{
+ return (UINTN)pthread_mutex_trylock ((pthread_mutex_t *)Mutex);
+}
+
+
+VOID *
+PthreadMutexInit (
+ IN VOID
+ )
+{
+ pthread_mutex_t *Mutex;
+ int err;
+
+ Mutex = malloc (sizeof (pthread_mutex_t));
+ err = pthread_mutex_init (Mutex, NULL);
+ if (err == 0) {
+ return Mutex;
+ }
+
+ return NULL;
+}
+
+
+UINTN
+PthreadMutexDestroy (
+ IN VOID *Mutex
+ )
+{
+ if (Mutex != NULL) {
+ return pthread_mutex_destroy ((pthread_mutex_t *)Mutex);
+ }
+
+ return -1;
+}
+
+// Can't store this data on PthreadCreate stack so we need a global
+typedef struct {
+ pthread_mutex_t Mutex;
+ THREAD_THUNK_THREAD_ENTRY Start;
+} THREAD_MANGLE;
+
+THREAD_MANGLE mThreadMangle = {
+ PTHREAD_MUTEX_INITIALIZER,
+ NULL
+};
+
+VOID *
+SecFakePthreadStart (
+ VOID *Context
+ )
+{
+ THREAD_THUNK_THREAD_ENTRY Start;
+ sigset_t SigMask;
+
+ // Save global on the stack before we unlock
+ Start = mThreadMangle.Start;
+ pthread_mutex_unlock (&mThreadMangle.Mutex);
+
+ // Mask all signals to the APs
+ sigfillset (&SigMask);
+ pthread_sigmask (SIG_BLOCK, &SigMask, NULL);
+
+ //
+ // We have to start the thread in SEC as we need to follow
+ // OS X calling conventions. We can then call back into
+ // to the callers Start.
+ //
+ // This is a great example of how all problems in computer
+ // science can be solved by adding another level of indirection
+ //
+ return (VOID *)ReverseGasketUint64 ((CALL_BACK)Start, (UINTN)Context);
+}
+
+UINTN
+PthreadCreate (
+ IN VOID *Thread,
+ IN VOID *Attribute,
+ IN THREAD_THUNK_THREAD_ENTRY Start,
+ IN VOID *Context
+ )
+{
+ int err;
+ BOOLEAN EnabledOnEntry;
+
+ //
+ // Threads inherit interrupt state so disable interrupts before we start thread
+ //
+ if (SecInterruptEanbled ()) {
+ SecDisableInterrupt ();
+ EnabledOnEntry = TRUE;
+ } else {
+ EnabledOnEntry = FALSE;
+ }
+
+ // Aquire lock for global, SecFakePthreadStart runs in a different thread.
+ pthread_mutex_lock (&mThreadMangle.Mutex);
+ mThreadMangle.Start = Start;
+
+ err = pthread_create (Thread, Attribute, SecFakePthreadStart, Context);
+ if (err != 0) {
+ // Thread failed to launch so release the lock;
+ pthread_mutex_unlock (&mThreadMangle.Mutex);
+ }
+
+ if (EnabledOnEntry) {
+ // Restore interrupt state
+ SecEnableInterrupt ();
+ }
+
+ return err;
+}
+
+
+VOID
+PthreadExit (
+ IN VOID *ValuePtr
+ )
+{
+ pthread_exit (ValuePtr);
+ return;
+}
+
+
+UINTN
+PthreadSelf (
+ VOID
+ )
+{
+ // POSIX currently allows pthread_t to be a structure or arithmetic type.
+ // Check out sys/types.h to make sure this will work if you are porting.
+ // On OS X (Darwin) pthread_t is a pointer to a structure so this code works.
+ return (UINTN)pthread_self ();
+}
+
+
+EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {
+ GasketPthreadMutexLock,
+ GasketPthreadMutexUnLock,
+ GasketPthreadMutexTryLock,
+ GasketPthreadMutexInit,
+ GasketPthreadMutexDestroy,
+ GasketPthreadCreate,
+ GasketPthreadExit,
+ GasketPthreadSelf
+};
+
+
+EFI_STATUS
+PthreadOpen (
+ IN EMU_IO_THUNK_PROTOCOL *This
+ )
+{
+ if (This->Instance != 0) {
+ // Only single instance is supported
+ return EFI_NOT_FOUND;
+ }
+
+ if (This->ConfigString[0] == L'0') {
+ // If AP count is zero no need for threads
+ return EFI_NOT_FOUND;
+ }
+
+ This->Interface = &gPthreadThunk;
+
+ return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+PthreadClose (
+ IN EMU_IO_THUNK_PROTOCOL *This
+ )
+{
+ return EFI_SUCCESS;
+}
+
+
+EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {
+ &gEmuThreadThunkProtocolGuid,
+ NULL,
+ NULL,
+ 0,
+ GasketPthreadOpen,
+ GasketPthreadClose,
+ NULL
+};
+
+
diff --git a/EmulatorPkg/Unix/Host/X11GraphicsWindow.c b/EmulatorPkg/Unix/Host/X11GraphicsWindow.c
index adb9b2b830..a3cc28c223 100644
--- a/EmulatorPkg/Unix/Host/X11GraphicsWindow.c
+++ b/EmulatorPkg/Unix/Host/X11GraphicsWindow.c
@@ -1,1028 +1,1028 @@
-/*++ @file
-
-Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
-Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
-
-This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution. The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#include "Host.h"
-
-#include <sys/ipc.h>
-#include <sys/shm.h>
-
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include <X11/Xos.h>
-#include <X11/extensions/XShm.h>
-#include <X11/keysym.h>
-#include <X11/cursorfont.h>
-
-#define KEYSYM_LOWER 0
-#define KEYSYM_UPPER 1
-
-
-struct uga_drv_shift_mask {
- unsigned char shift;
- unsigned char size;
- unsigned char csize;
-};
-
-#define NBR_KEYS 32
-typedef struct {
- EMU_GRAPHICS_WINDOW_PROTOCOL GraphicsIo;
-
- Display *display;
- int screen; // values for window_size in main
- Window win;
- GC gc;
- Visual *visual;
-
- int depth;
- unsigned int width;
- unsigned int height;
- unsigned int line_bytes;
- unsigned int pixel_shift;
- unsigned char *image_data;
-
- struct uga_drv_shift_mask r, g, b;
-
- int use_shm;
- XShmSegmentInfo xshm_info;
- XImage *image;
- char *Title;
-
- unsigned int key_rd;
- unsigned int key_wr;
- unsigned int key_count;
- EFI_KEY_DATA keys[NBR_KEYS];
-
- EFI_KEY_STATE KeyState;
-
- EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK MakeRegisterdKeyCallback;
- EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK BreakRegisterdKeyCallback;
- VOID *RegisterdKeyCallbackContext;
-
- int previous_x;
- int previous_y;
- EFI_SIMPLE_POINTER_STATE pointer_state;
- int pointer_state_changed;
-} GRAPHICS_IO_PRIVATE;
-
-void
-HandleEvents(
- IN GRAPHICS_IO_PRIVATE *Drv
- );
-
-void
-fill_shift_mask (
- IN struct uga_drv_shift_mask *sm,
- IN unsigned long mask
- )
-{
- sm->shift = 0;
- sm->size = 0;
- while ((mask & 1) == 0) {
- mask >>= 1;
- sm->shift++;
- }
- while (mask & 1) {
- sm->size++;
- mask >>= 1;
- }
- sm->csize = 8 - sm->size;
-}
-
-int
-TryCreateShmImage (
- IN GRAPHICS_IO_PRIVATE *Drv
- )
-{
- Drv->image = XShmCreateImage (
- Drv->display, Drv->visual,
- Drv->depth, ZPixmap, NULL, &Drv->xshm_info,
- Drv->width, Drv->height
- );
- if (Drv->image == NULL) {
- return 0;
- }
-
- switch (Drv->image->bitmap_unit) {
- case 32:
- Drv->pixel_shift = 2;
- break;
- case 16:
- Drv->pixel_shift = 1;
- break;
- case 8:
- Drv->pixel_shift = 0;
- break;
- }
-
- Drv->xshm_info.shmid = shmget (
- IPC_PRIVATE, Drv->image->bytes_per_line * Drv->image->height,
- IPC_CREAT | 0777
- );
- if (Drv->xshm_info.shmid < 0) {
- XDestroyImage(Drv->image);
- return 0;
- }
-
- Drv->image_data = shmat (Drv->xshm_info.shmid, NULL, 0);
- if(!Drv->image_data) {
- shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
- XDestroyImage(Drv->image);
- return 0;
- }
-
-#ifndef __APPLE__
- //
- // This closes shared memory in real time on OS X. Only closes after folks quit using
- // it on Linux.
- //
- shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
-#endif
-
- Drv->xshm_info.shmaddr = (char*)Drv->image_data;
- Drv->image->data = (char*)Drv->image_data;
-
- if (!XShmAttach (Drv->display, &Drv->xshm_info)) {
- shmdt (Drv->image_data);
- XDestroyImage(Drv->image);
- return 0;
- }
- return 1;
-}
-
-
-EFI_STATUS
-X11Size (
- IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
- IN UINT32 Width,
- IN UINT32 Height
- )
-{
- GRAPHICS_IO_PRIVATE *Drv;
- XSizeHints size_hints;
-
- // Destroy current buffer if created.
- Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
- if (Drv->image != NULL) {
- // Before destroy buffer, need to make sure the buffer available for access.
- XDestroyImage (Drv->image);
-
- if (Drv->use_shm) {
- shmdt (Drv->image_data);
- }
-
- Drv->image_data = NULL;
- Drv->image = NULL;
- }
-
- Drv->width = Width;
- Drv->height = Height;
- XResizeWindow (Drv->display, Drv->win, Width, Height);
-
- // Allocate image.
- if (XShmQueryExtension(Drv->display) && TryCreateShmImage(Drv)) {
- Drv->use_shm = 1;
- } else {
- Drv->use_shm = 0;
- if (Drv->depth > 16) {
- Drv->pixel_shift = 2;
- } else if (Drv->depth > 8) {
- Drv->pixel_shift = 1;
- } else {
- Drv->pixel_shift = 0;
- }
-
- Drv->image_data = malloc ((Drv->width * Drv->height) << Drv->pixel_shift);
- Drv->image = XCreateImage (
- Drv->display, Drv->visual, Drv->depth,
- ZPixmap, 0, (char *)Drv->image_data,
- Drv->width, Drv->height,
- 8 << Drv->pixel_shift, 0
- );
- }
-
- Drv->line_bytes = Drv->image->bytes_per_line;
-
- fill_shift_mask (&Drv->r, Drv->image->red_mask);
- fill_shift_mask (&Drv->g, Drv->image->green_mask);
- fill_shift_mask (&Drv->b, Drv->image->blue_mask);
-
- // Set WM hints.
- size_hints.flags = PSize | PMinSize | PMaxSize;
- size_hints.min_width = size_hints.max_width = size_hints.base_width = Width;
- size_hints.min_height = size_hints.max_height = size_hints.base_height = Height;
- XSetWMNormalHints (Drv->display, Drv->win, &size_hints);
-
- XMapWindow (Drv->display, Drv->win);
- HandleEvents (Drv);
- return EFI_SUCCESS;
-}
-
-void
-handleKeyEvent (
- IN GRAPHICS_IO_PRIVATE *Drv,
- IN XEvent *ev,
- IN BOOLEAN Make
- )
-{
- KeySym *KeySym;
- EFI_KEY_DATA KeyData;
- int KeySymArraySize;
-
- if (Make) {
- if (Drv->key_count == NBR_KEYS) {
- return;
- }
- }
-
- // keycode is a physical key on the keyboard
- // KeySym is a mapping of a physical key
- // KeyboardMapping is the array of KeySym for a given keycode. key, shifted key, option key, command key, ...
- //
- // Returns an array of KeySymArraySize of KeySym for the keycode. [0] is lower case, [1] is upper case,
- // [2] and [3] are based on option and command modifiers. The problem we have is command V
- // could be mapped to a crazy Unicode character so the old scheme of returning a string.
- //
- KeySym = XGetKeyboardMapping (Drv->display, ev->xkey.keycode, 1, &KeySymArraySize);
-
- KeyData.Key.ScanCode = 0;
- KeyData.Key.UnicodeChar = 0;
- KeyData.KeyState.KeyShiftState = 0;
-
- //
- // Skipping EFI_SCROLL_LOCK_ACTIVE & EFI_NUM_LOCK_ACTIVE since they are not on Macs
- //
- if ((ev->xkey.state & LockMask) == 0) {
- Drv->KeyState.KeyToggleState &= ~EFI_CAPS_LOCK_ACTIVE;
- } else {
- if (Make) {
- Drv->KeyState.KeyToggleState |= EFI_CAPS_LOCK_ACTIVE;
- }
- }
-
- // Skipping EFI_MENU_KEY_PRESSED and EFI_SYS_REQ_PRESSED
-
- switch (*KeySym) {
- case XK_Control_R:
- if (Make) {
- Drv->KeyState.KeyShiftState |= EFI_RIGHT_CONTROL_PRESSED;
- } else {
- Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_CONTROL_PRESSED;
- }
- break;
- case XK_Control_L:
- if (Make) {
- Drv->KeyState.KeyShiftState |= EFI_LEFT_CONTROL_PRESSED;
- } else {
- Drv->KeyState.KeyShiftState &= ~EFI_LEFT_CONTROL_PRESSED;
- }
- break;
-
- case XK_Shift_R:
- if (Make) {
- Drv->KeyState.KeyShiftState |= EFI_RIGHT_SHIFT_PRESSED;
- } else {
- Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_SHIFT_PRESSED;
- }
- break;
- case XK_Shift_L:
- if (Make) {
- Drv->KeyState.KeyShiftState |= EFI_LEFT_SHIFT_PRESSED;
- } else {
- Drv->KeyState.KeyShiftState &= ~EFI_LEFT_SHIFT_PRESSED;
- }
- break;
-
- case XK_Mode_switch:
- if (Make) {
- Drv->KeyState.KeyShiftState |= EFI_LEFT_ALT_PRESSED;
- } else {
- Drv->KeyState.KeyShiftState &= ~EFI_LEFT_ALT_PRESSED;
- }
- break;
-
- case XK_Meta_R:
- if (Make) {
- Drv->KeyState.KeyShiftState |= EFI_RIGHT_LOGO_PRESSED;
- } else {
- Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_LOGO_PRESSED;
- }
- break;
- case XK_Meta_L:
- if (Make) {
- Drv->KeyState.KeyShiftState |= EFI_LEFT_LOGO_PRESSED;
- } else {
- Drv->KeyState.KeyShiftState &= ~EFI_LEFT_LOGO_PRESSED;
- }
- break;
-
- case XK_KP_Home:
- case XK_Home: KeyData.Key.ScanCode = SCAN_HOME; break;
-
- case XK_KP_End:
- case XK_End: KeyData.Key.ScanCode = SCAN_END; break;
-
- case XK_KP_Left:
- case XK_Left: KeyData.Key.ScanCode = SCAN_LEFT; break;
-
- case XK_KP_Right:
- case XK_Right: KeyData.Key.ScanCode = SCAN_RIGHT; break;
-
- case XK_KP_Up:
- case XK_Up: KeyData.Key.ScanCode = SCAN_UP; break;
-
- case XK_KP_Down:
- case XK_Down: KeyData.Key.ScanCode = SCAN_DOWN; break;
-
- case XK_KP_Delete:
- case XK_Delete: KeyData.Key.ScanCode = SCAN_DELETE; break;
-
- case XK_KP_Insert:
- case XK_Insert: KeyData.Key.ScanCode = SCAN_INSERT; break;
-
- case XK_KP_Page_Up:
- case XK_Page_Up: KeyData.Key.ScanCode = SCAN_PAGE_UP; break;
-
- case XK_KP_Page_Down:
- case XK_Page_Down: KeyData.Key.ScanCode = SCAN_PAGE_DOWN; break;
-
- case XK_Escape: KeyData.Key.ScanCode = SCAN_ESC; break;
-
- case XK_Pause: KeyData.Key.ScanCode = SCAN_PAUSE; break;
-
- case XK_KP_F1:
- case XK_F1: KeyData.Key.ScanCode = SCAN_F1; break;
-
- case XK_KP_F2:
- case XK_F2: KeyData.Key.ScanCode = SCAN_F2; break;
-
- case XK_KP_F3:
- case XK_F3: KeyData.Key.ScanCode = SCAN_F3; break;
-
- case XK_KP_F4:
- case XK_F4: KeyData.Key.ScanCode = SCAN_F4; break;
-
- case XK_F5: KeyData.Key.ScanCode = SCAN_F5; break;
- case XK_F6: KeyData.Key.ScanCode = SCAN_F6; break;
- case XK_F7: KeyData.Key.ScanCode = SCAN_F7; break;
-
- // Don't map into X11 by default on a Mac
- // System Preferences->Keyboard->Keyboard Shortcuts can be configured
- // to not use higher function keys as shortcuts and the will show up
- // in X11.
- case XK_F8: KeyData.Key.ScanCode = SCAN_F8; break;
- case XK_F9: KeyData.Key.ScanCode = SCAN_F9; break;
- case XK_F10: KeyData.Key.ScanCode = SCAN_F10; break;
-
- case XK_F11: KeyData.Key.ScanCode = SCAN_F11; break;
- case XK_F12: KeyData.Key.ScanCode = SCAN_F12; break;
-
- case XK_F13: KeyData.Key.ScanCode = SCAN_F13; break;
- case XK_F14: KeyData.Key.ScanCode = SCAN_F14; break;
- case XK_F15: KeyData.Key.ScanCode = SCAN_F15; break;
- case XK_F16: KeyData.Key.ScanCode = SCAN_F16; break;
- case XK_F17: KeyData.Key.ScanCode = SCAN_F17; break;
- case XK_F18: KeyData.Key.ScanCode = SCAN_F18; break;
- case XK_F19: KeyData.Key.ScanCode = SCAN_F19; break;
- case XK_F20: KeyData.Key.ScanCode = SCAN_F20; break;
- case XK_F21: KeyData.Key.ScanCode = SCAN_F21; break;
- case XK_F22: KeyData.Key.ScanCode = SCAN_F22; break;
- case XK_F23: KeyData.Key.ScanCode = SCAN_F23; break;
- case XK_F24: KeyData.Key.ScanCode = SCAN_F24; break;
-
- // No mapping in X11
- //case XK_: KeyData.Key.ScanCode = SCAN_MUTE; break;
- //case XK_: KeyData.Key.ScanCode = SCAN_VOLUME_UP; break;
- //case XK_: KeyData.Key.ScanCode = SCAN_VOLUME_DOWN; break;
- //case XK_: KeyData.Key.ScanCode = SCAN_BRIGHTNESS_UP; break;
- //case XK_: KeyData.Key.ScanCode = SCAN_BRIGHTNESS_DOWN; break;
- //case XK_: KeyData.Key.ScanCode = SCAN_SUSPEND; break;
- //case XK_: KeyData.Key.ScanCode = SCAN_HIBERNATE; break;
- //case XK_: KeyData.Key.ScanCode = SCAN_TOGGLE_DISPLAY; break;
- //case XK_: KeyData.Key.ScanCode = SCAN_RECOVERY; break;
- //case XK_: KeyData.Key.ScanCode = SCAN_EJECT; break;
-
- case XK_BackSpace: KeyData.Key.UnicodeChar = 0x0008; break;
-
- case XK_KP_Tab:
- case XK_Tab: KeyData.Key.UnicodeChar = 0x0009; break;
-
- case XK_Linefeed: KeyData.Key.UnicodeChar = 0x000a; break;
-
- case XK_KP_Enter:
- case XK_Return: KeyData.Key.UnicodeChar = 0x000d; break;
-
- case XK_KP_Equal : KeyData.Key.UnicodeChar = L'='; break;
- case XK_KP_Multiply : KeyData.Key.UnicodeChar = L'*'; break;
- case XK_KP_Add : KeyData.Key.UnicodeChar = L'+'; break;
- case XK_KP_Separator : KeyData.Key.UnicodeChar = L'~'; break;
- case XK_KP_Subtract : KeyData.Key.UnicodeChar = L'-'; break;
- case XK_KP_Decimal : KeyData.Key.UnicodeChar = L'.'; break;
- case XK_KP_Divide : KeyData.Key.UnicodeChar = L'/'; break;
-
- case XK_KP_0 : KeyData.Key.UnicodeChar = L'0'; break;
- case XK_KP_1 : KeyData.Key.UnicodeChar = L'1'; break;
- case XK_KP_2 : KeyData.Key.UnicodeChar = L'2'; break;
- case XK_KP_3 : KeyData.Key.UnicodeChar = L'3'; break;
- case XK_KP_4 : KeyData.Key.UnicodeChar = L'4'; break;
- case XK_KP_5 : KeyData.Key.UnicodeChar = L'5'; break;
- case XK_KP_6 : KeyData.Key.UnicodeChar = L'6'; break;
- case XK_KP_7 : KeyData.Key.UnicodeChar = L'7'; break;
- case XK_KP_8 : KeyData.Key.UnicodeChar = L'8'; break;
- case XK_KP_9 : KeyData.Key.UnicodeChar = L'9'; break;
-
- default:
- ;
- }
-
- // The global state is our state
- KeyData.KeyState.KeyShiftState = Drv->KeyState.KeyShiftState;
- KeyData.KeyState.KeyToggleState = Drv->KeyState.KeyToggleState;
-
- if (*KeySym < XK_BackSpace) {
- if (((Drv->KeyState.KeyShiftState & (EFI_LEFT_SHIFT_PRESSED | EFI_RIGHT_SHIFT_PRESSED)) != 0) ||
- ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) != 0) ) {
-
- KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_UPPER];
-
- // Per UEFI spec since we converted the Unicode clear the shift bits we pass up
- KeyData.KeyState.KeyShiftState &= ~(EFI_LEFT_SHIFT_PRESSED | EFI_RIGHT_SHIFT_PRESSED);
- } else {
- KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_LOWER];
- }
- } else {
- // XK_BackSpace is the start of XK_MISCELLANY. These are the XK_? keys we process in this file
- ;
- }
-
- if (Make) {
- memcpy (&Drv->keys[Drv->key_wr], &KeyData, sizeof (EFI_KEY_DATA));
- Drv->key_wr = (Drv->key_wr + 1) % NBR_KEYS;
- Drv->key_count++;
- if (Drv->MakeRegisterdKeyCallback != NULL) {
- ReverseGasketUint64Uint64 (Drv->MakeRegisterdKeyCallback ,Drv->RegisterdKeyCallbackContext, &KeyData);
- }
- } else {
- if (Drv->BreakRegisterdKeyCallback != NULL) {
- ReverseGasketUint64Uint64 (Drv->BreakRegisterdKeyCallback ,Drv->RegisterdKeyCallbackContext, &KeyData);
- }
- }
-}
-
-
-void
-handleMouseMoved(
- IN GRAPHICS_IO_PRIVATE *Drv,
- IN XEvent *ev
- )
-{
- if (ev->xmotion.x != Drv->previous_x) {
- Drv->pointer_state.RelativeMovementX += ( ev->xmotion.x - Drv->previous_x );
- Drv->previous_x = ev->xmotion.x;
- Drv->pointer_state_changed = 1;
- }
-
- if (ev->xmotion.y != Drv->previous_y) {
- Drv->pointer_state.RelativeMovementY += ( ev->xmotion.y - Drv->previous_y );
- Drv->previous_y = ev->xmotion.y;
- Drv->pointer_state_changed = 1;
- }
-
- Drv->pointer_state.RelativeMovementZ = 0;
-}
-
-void
-handleMouseDown (
- IN GRAPHICS_IO_PRIVATE *Drv,
- IN XEvent *ev,
- IN BOOLEAN Pressed
- )
-{
- if (ev->xbutton.button == Button1) {
- Drv->pointer_state_changed = (Drv->pointer_state.LeftButton != Pressed);
- Drv->pointer_state.LeftButton = Pressed;
- }
- if ( ev->xbutton.button == Button2 ) {
- Drv->pointer_state_changed = (Drv->pointer_state.RightButton != Pressed);
- Drv->pointer_state.RightButton = Pressed;
- }
-}
-
-void
-Redraw (
- IN GRAPHICS_IO_PRIVATE *Drv,
- IN UINTN X,
- IN UINTN Y,
- IN UINTN Width,
- IN UINTN Height
- )
-{
- if (Drv->use_shm) {
- XShmPutImage (
- Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height, False
- );
- } else {
- XPutImage (
- Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height
- );
- }
- XFlush(Drv->display);
-}
-
-void
-HandleEvent(GRAPHICS_IO_PRIVATE *Drv, XEvent *ev)
-{
- switch (ev->type) {
- case Expose:
- Redraw (Drv, ev->xexpose.x, ev->xexpose.y,
- ev->xexpose.width, ev->xexpose.height);
- break;
- case GraphicsExpose:
- Redraw (Drv, ev->xgraphicsexpose.x, ev->xgraphicsexpose.y,
- ev->xgraphicsexpose.width, ev->xgraphicsexpose.height);
- break;
- case KeyPress:
- handleKeyEvent (Drv, ev, TRUE);
- break;
- case KeyRelease:
- handleKeyEvent (Drv, ev, FALSE);
- break;
- case MappingNotify:
- XRefreshKeyboardMapping (&ev->xmapping);
- break;
- case MotionNotify:
- handleMouseMoved (Drv, ev);
- break;
- case ButtonPress:
- handleMouseDown (Drv, ev, TRUE);
- break;
- case ButtonRelease:
- handleMouseDown (Drv, ev, FALSE);
- break;
-#if 0
- case DestroyNotify:
- XCloseDisplay (Drv->display);
- exit (1);
- break;
-#endif
- case NoExpose:
- default:
- break;
- }
-}
-
-void
-HandleEvents (
- IN GRAPHICS_IO_PRIVATE *Drv
- )
-{
- XEvent ev;
-
- while (XPending (Drv->display) != 0) {
- XNextEvent (Drv->display, &ev);
- HandleEvent (Drv, &ev);
- }
-}
-
-unsigned long
-X11PixelToColor (
- IN GRAPHICS_IO_PRIVATE *Drv,
- IN EFI_UGA_PIXEL pixel
- )
-{
- return ((pixel.Red >> Drv->r.csize) << Drv->r.shift)
- | ((pixel.Green >> Drv->g.csize) << Drv->g.shift)
- | ((pixel.Blue >> Drv->b.csize) << Drv->b.shift);
-}
-
-EFI_UGA_PIXEL
-X11ColorToPixel (
- IN GRAPHICS_IO_PRIVATE *Drv,
- IN unsigned long val
- )
-{
- EFI_UGA_PIXEL Pixel;
-
- memset (&Pixel, 0, sizeof (EFI_UGA_PIXEL));
-
- // Truncation not an issue since X11 and EFI are both using 8 bits per color
- Pixel.Red = (val >> Drv->r.shift) << Drv->r.csize;
- Pixel.Green = (val >> Drv->g.shift) << Drv->g.csize;
- Pixel.Blue = (val >> Drv->b.shift) << Drv->b.csize;
-
- return Pixel;
-}
-
-
-EFI_STATUS
-X11CheckKey (
- IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo
- )
-{
- GRAPHICS_IO_PRIVATE *Drv;
-
- Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
-
- HandleEvents (Drv);
-
- if (Drv->key_count != 0) {
- return EFI_SUCCESS;
- }
-
- return EFI_NOT_READY;
-}
-
-EFI_STATUS
-X11GetKey (
- IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
- IN EFI_KEY_DATA *KeyData
- )
-{
- EFI_STATUS EfiStatus;
- GRAPHICS_IO_PRIVATE *Drv;
-
- Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
-
- EfiStatus = X11CheckKey (GraphicsIo);
- if (EFI_ERROR (EfiStatus)) {
- return EfiStatus;
- }
-
- CopyMem (KeyData, &Drv->keys[Drv->key_rd], sizeof (EFI_KEY_DATA));
- Drv->key_rd = (Drv->key_rd + 1) % NBR_KEYS;
- Drv->key_count--;
-
- return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-X11KeySetState (
- IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
- IN EFI_KEY_TOGGLE_STATE *KeyToggleState
- )
-{
- GRAPHICS_IO_PRIVATE *Drv;
-
- Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
-
- if (*KeyToggleState & EFI_CAPS_LOCK_ACTIVE) {
- if ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) == 0) {
- //
- // We could create an XKeyEvent and send a XK_Caps_Lock to
- // the UGA/GOP Window
- //
- }
- }
-
- Drv->KeyState.KeyToggleState = *KeyToggleState;
- return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-X11RegisterKeyNotify (
- IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
- IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK MakeCallBack,
- IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK BreakCallBack,
- IN VOID *Context
- )
-{
- GRAPHICS_IO_PRIVATE *Drv;
-
- Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
-
- Drv->MakeRegisterdKeyCallback = MakeCallBack;
- Drv->BreakRegisterdKeyCallback = BreakCallBack;
- Drv->RegisterdKeyCallbackContext = Context;
-
- return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-X11Blt (
- IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
- IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
- IN EFI_UGA_BLT_OPERATION BltOperation,
- IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args
- )
-{
- GRAPHICS_IO_PRIVATE *Private;
- UINTN DstY;
- UINTN SrcY;
- UINTN DstX;
- UINTN SrcX;
- UINTN Index;
- EFI_UGA_PIXEL *Blt;
- UINT8 *Dst;
- UINT8 *Src;
- UINTN Nbr;
- unsigned long Color;
- XEvent ev;
-
- Private = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
-
-
- //
- // Check bounds
- //
- if (BltOperation == EfiUgaVideoToBltBuffer
- || BltOperation == EfiUgaVideoToVideo) {
- //
- // Source is Video.
- //
- if (Args->SourceY + Args->Height > Private->height) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (Args->SourceX + Args->Width > Private->width) {
- return EFI_INVALID_PARAMETER;
- }
- }
-
- if (BltOperation == EfiUgaBltBufferToVideo
- || BltOperation == EfiUgaVideoToVideo
- || BltOperation == EfiUgaVideoFill) {
- //
- // Destination is Video
- //
- if (Args->DestinationY + Args->Height > Private->height) {
- return EFI_INVALID_PARAMETER;
- }
-
- if (Args->DestinationX + Args->Width > Private->width) {
- return EFI_INVALID_PARAMETER;
- }
- }
-
- switch (BltOperation) {
- case EfiUgaVideoToBltBuffer:
- Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->DestinationY * Args->Delta) + Args->DestinationX * sizeof (EFI_UGA_PIXEL));
- Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);
- for (SrcY = Args->SourceY; SrcY < (Args->Height + Args->SourceY); SrcY++) {
- for (SrcX = Args->SourceX; SrcX < (Args->Width + Args->SourceX); SrcX++) {
- *Blt++ = X11ColorToPixel (Private, XGetPixel (Private->image, SrcX, SrcY));
- }
- Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);
- }
- break;
- case EfiUgaBltBufferToVideo:
- Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->SourceY * Args->Delta) + Args->SourceX * sizeof (EFI_UGA_PIXEL));
- Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);
- for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY); DstY++) {
- for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX); DstX++) {
- XPutPixel(Private->image, DstX, DstY, X11PixelToColor(Private, *Blt));
- Blt++;
- }
- Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);
- }
- break;
- case EfiUgaVideoToVideo:
- Dst = Private->image_data + (Args->DestinationX << Private->pixel_shift)
- + Args->DestinationY * Private->line_bytes;
- Src = Private->image_data + (Args->SourceX << Private->pixel_shift)
- + Args->SourceY * Private->line_bytes;
- Nbr = Args->Width << Private->pixel_shift;
- if (Args->DestinationY < Args->SourceY) {
- for (Index = 0; Index < Args->Height; Index++) {
- memcpy (Dst, Src, Nbr);
- Dst += Private->line_bytes;
- Src += Private->line_bytes;
- }
- } else {
- Dst += (Args->Height - 1) * Private->line_bytes;
- Src += (Args->Height - 1) * Private->line_bytes;
- for (Index = 0; Index < Args->Height; Index++) {
- //
- // Source and Destination Y may be equal, therefore Dst and Src may
- // overlap.
- //
- memmove (Dst, Src, Nbr);
- Dst -= Private->line_bytes;
- Src -= Private->line_bytes;
- }
- }
- break;
- case EfiUgaVideoFill:
- Color = X11PixelToColor(Private, *BltBuffer);
- for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY); DstY++) {
- for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX); DstX++) {
- XPutPixel(Private->image, DstX, DstY, Color);
- }
- }
- break;
- default:
- return EFI_INVALID_PARAMETER;
- }
-
- //
- // Refresh screen.
- //
- switch (BltOperation) {
- case EfiUgaVideoToVideo:
- XCopyArea(
- Private->display, Private->win, Private->win, Private->gc,
- Args->SourceX, Args->SourceY, Args->Width, Args->Height,
- Args->DestinationX, Args->DestinationY
- );
-
- while (1) {
- XNextEvent (Private->display, &ev);
- HandleEvent (Private, &ev);
- if (ev.type == NoExpose || ev.type == GraphicsExpose) {
- break;
- }
- }
- break;
- case EfiUgaVideoFill:
- Color = X11PixelToColor (Private, *BltBuffer);
- XSetForeground (Private->display, Private->gc, Color);
- XFillRectangle (
- Private->display, Private->win, Private->gc,
- Args->DestinationX, Args->DestinationY, Args->Width, Args->Height
- );
- XFlush (Private->display);
- break;
- case EfiUgaBltBufferToVideo:
- Redraw (Private, Args->DestinationX, Args->DestinationY, Args->Width, Args->Height);
- break;
- default:
- break;
- }
- return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-X11CheckPointer (
- IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo
- )
-{
- GRAPHICS_IO_PRIVATE *Drv;
-
- Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
-
- HandleEvents (Drv);
- if (Drv->pointer_state_changed != 0) {
- return EFI_SUCCESS;
- }
-
- return EFI_NOT_READY;
-}
-
-
-EFI_STATUS
-X11GetPointerState (
- IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
- IN EFI_SIMPLE_POINTER_STATE *State
- )
-{
- EFI_STATUS EfiStatus;
- GRAPHICS_IO_PRIVATE *Drv;
-
- Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
-
- EfiStatus = X11CheckPointer (GraphicsIo);
- if (EfiStatus != EFI_SUCCESS) {
- return EfiStatus;
- }
-
- memcpy (State, &Drv->pointer_state, sizeof (EFI_SIMPLE_POINTER_STATE));
-
- Drv->pointer_state.RelativeMovementX = 0;
- Drv->pointer_state.RelativeMovementY = 0;
- Drv->pointer_state.RelativeMovementZ = 0;
- Drv->pointer_state_changed = 0;
- return EFI_SUCCESS;
-}
-
-
-
-EFI_STATUS
-X11GraphicsWindowOpen (
- IN EMU_IO_THUNK_PROTOCOL *This
- )
-{
- GRAPHICS_IO_PRIVATE *Drv;
- unsigned int border_width = 0;
- char *display_name = NULL;
-
- Drv = (GRAPHICS_IO_PRIVATE *)calloc (1, sizeof (GRAPHICS_IO_PRIVATE));
- if (Drv == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
-
- Drv->GraphicsIo.Size = GasketX11Size;
- Drv->GraphicsIo.CheckKey = GasketX11CheckKey;
- Drv->GraphicsIo.GetKey = GasketX11GetKey;
- Drv->GraphicsIo.KeySetState = GasketX11KeySetState;
- Drv->GraphicsIo.RegisterKeyNotify = GasketX11RegisterKeyNotify;
- Drv->GraphicsIo.Blt = GasketX11Blt;
- Drv->GraphicsIo.CheckPointer = GasketX11CheckPointer;
- Drv->GraphicsIo.GetPointerState = GasketX11GetPointerState;
-
-
- Drv->key_count = 0;
- Drv->key_rd = 0;
- Drv->key_wr = 0;
- Drv->KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID;
- Drv->KeyState.KeyToggleState = EFI_TOGGLE_STATE_VALID;
- Drv->MakeRegisterdKeyCallback = NULL;
- Drv->BreakRegisterdKeyCallback = NULL;
- Drv->RegisterdKeyCallbackContext = NULL;
-
-
- Drv->display = XOpenDisplay (display_name);
- if (Drv->display == NULL) {
- fprintf (stderr, "uga: cannot connect to X server %s\n", XDisplayName (display_name));
- free (Drv);
- return EFI_DEVICE_ERROR;
- }
- Drv->screen = DefaultScreen (Drv->display);
- Drv->visual = DefaultVisual (Drv->display, Drv->screen);
- Drv->win = XCreateSimpleWindow (
- Drv->display, RootWindow (Drv->display, Drv->screen),
- 0, 0, 4, 4, border_width,
- WhitePixel (Drv->display, Drv->screen),
- BlackPixel (Drv->display, Drv->screen)
- );
-
- Drv->depth = DefaultDepth (Drv->display, Drv->screen);
- XDefineCursor (Drv->display, Drv->win, XCreateFontCursor (Drv->display, XC_pirate));
-
- Drv->Title = malloc (StrSize (This->ConfigString));
- UnicodeStrToAsciiStr (This->ConfigString, Drv->Title);
- XStoreName (Drv->display, Drv->win, Drv->Title);
-
-// XAutoRepeatOff (Drv->display);
- XSelectInput (
- Drv->display, Drv->win,
- ExposureMask | KeyPressMask | KeyReleaseMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask
- );
- Drv->gc = DefaultGC (Drv->display, Drv->screen);
-
- This->Private = (VOID *)Drv;
- This->Interface = (VOID *)Drv;
- return EFI_SUCCESS;
-}
-
-
-EFI_STATUS
-X11GraphicsWindowClose (
- IN EMU_IO_THUNK_PROTOCOL *This
- )
-{
- GRAPHICS_IO_PRIVATE *Drv;
-
- Drv = (GRAPHICS_IO_PRIVATE *)This->Private;
-
- if (Drv == NULL) {
- return EFI_SUCCESS;
- }
-
- if (Drv->image != NULL) {
- XDestroyImage(Drv->image);
-
- if (Drv->use_shm) {
- shmdt (Drv->image_data);
- }
-
- Drv->image_data = NULL;
- Drv->image = NULL;
- }
- XDestroyWindow (Drv->display, Drv->win);
- XCloseDisplay (Drv->display);
-
-#ifdef __APPLE__
- // Free up the shared memory
- shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
-#endif
-
- free (Drv);
- return EFI_SUCCESS;
-}
-
-
-EMU_IO_THUNK_PROTOCOL gX11ThunkIo = {
- &gEmuGraphicsWindowProtocolGuid,
- NULL,
- NULL,
- 0,
- GasketX11GraphicsWindowOpen,
- GasketX11GraphicsWindowClose,
- NULL
-};
-
-
+/*++ @file
+
+Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
+Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
+
+This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include "Host.h"
+
+#include <sys/ipc.h>
+#include <sys/shm.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xos.h>
+#include <X11/extensions/XShm.h>
+#include <X11/keysym.h>
+#include <X11/cursorfont.h>
+
+#define KEYSYM_LOWER 0
+#define KEYSYM_UPPER 1
+
+
+struct uga_drv_shift_mask {
+ unsigned char shift;
+ unsigned char size;
+ unsigned char csize;
+};
+
+#define NBR_KEYS 32
+typedef struct {
+ EMU_GRAPHICS_WINDOW_PROTOCOL GraphicsIo;
+
+ Display *display;
+ int screen; // values for window_size in main
+ Window win;
+ GC gc;
+ Visual *visual;
+
+ int depth;
+ unsigned int width;
+ unsigned int height;
+ unsigned int line_bytes;
+ unsigned int pixel_shift;
+ unsigned char *image_data;
+
+ struct uga_drv_shift_mask r, g, b;
+
+ int use_shm;
+ XShmSegmentInfo xshm_info;
+ XImage *image;
+ char *Title;
+
+ unsigned int key_rd;
+ unsigned int key_wr;
+ unsigned int key_count;
+ EFI_KEY_DATA keys[NBR_KEYS];
+
+ EFI_KEY_STATE KeyState;
+
+ EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK MakeRegisterdKeyCallback;
+ EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK BreakRegisterdKeyCallback;
+ VOID *RegisterdKeyCallbackContext;
+
+ int previous_x;
+ int previous_y;
+ EFI_SIMPLE_POINTER_STATE pointer_state;
+ int pointer_state_changed;
+} GRAPHICS_IO_PRIVATE;
+
+void
+HandleEvents(
+ IN GRAPHICS_IO_PRIVATE *Drv
+ );
+
+void
+fill_shift_mask (
+ IN struct uga_drv_shift_mask *sm,
+ IN unsigned long mask
+ )
+{
+ sm->shift = 0;
+ sm->size = 0;
+ while ((mask & 1) == 0) {
+ mask >>= 1;
+ sm->shift++;
+ }
+ while (mask & 1) {
+ sm->size++;
+ mask >>= 1;
+ }
+ sm->csize = 8 - sm->size;
+}
+
+int
+TryCreateShmImage (
+ IN GRAPHICS_IO_PRIVATE *Drv
+ )
+{
+ Drv->image = XShmCreateImage (
+ Drv->display, Drv->visual,
+ Drv->depth, ZPixmap, NULL, &Drv->xshm_info,
+ Drv->width, Drv->height
+ );
+ if (Drv->image == NULL) {
+ return 0;
+ }
+
+ switch (Drv->image->bitmap_unit) {
+ case 32:
+ Drv->pixel_shift = 2;
+ break;
+ case 16:
+ Drv->pixel_shift = 1;
+ break;
+ case 8:
+ Drv->pixel_shift = 0;
+ break;
+ }
+
+ Drv->xshm_info.shmid = shmget (
+ IPC_PRIVATE, Drv->image->bytes_per_line * Drv->image->height,
+ IPC_CREAT | 0777
+ );
+ if (Drv->xshm_info.shmid < 0) {
+ XDestroyImage(Drv->image);
+ return 0;
+ }
+
+ Drv->image_data = shmat (Drv->xshm_info.shmid, NULL, 0);
+ if(!Drv->image_data) {
+ shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
+ XDestroyImage(Drv->image);
+ return 0;
+ }
+
+#ifndef __APPLE__
+ //
+ // This closes shared memory in real time on OS X. Only closes after folks quit using
+ // it on Linux.
+ //
+ shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
+#endif
+
+ Drv->xshm_info.shmaddr = (char*)Drv->image_data;
+ Drv->image->data = (char*)Drv->image_data;
+
+ if (!XShmAttach (Drv->display, &Drv->xshm_info)) {
+ shmdt (Drv->image_data);
+ XDestroyImage(Drv->image);
+ return 0;
+ }
+ return 1;
+}
+
+
+EFI_STATUS
+X11Size (
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
+ IN UINT32 Width,
+ IN UINT32 Height
+ )
+{
+ GRAPHICS_IO_PRIVATE *Drv;
+ XSizeHints size_hints;
+
+ // Destroy current buffer if created.
+ Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
+ if (Drv->image != NULL) {
+ // Before destroy buffer, need to make sure the buffer available for access.
+ XDestroyImage (Drv->image);
+
+ if (Drv->use_shm) {
+ shmdt (Drv->image_data);
+ }
+
+ Drv->image_data = NULL;
+ Drv->image = NULL;
+ }
+
+ Drv->width = Width;
+ Drv->height = Height;
+ XResizeWindow (Drv->display, Drv->win, Width, Height);
+
+ // Allocate image.
+ if (XShmQueryExtension(Drv->display) && TryCreateShmImage(Drv)) {
+ Drv->use_shm = 1;
+ } else {
+ Drv->use_shm = 0;
+ if (Drv->depth > 16) {
+ Drv->pixel_shift = 2;
+ } else if (Drv->depth > 8) {
+ Drv->pixel_shift = 1;
+ } else {
+ Drv->pixel_shift = 0;
+ }
+
+ Drv->image_data = malloc ((Drv->width * Drv->height) << Drv->pixel_shift);
+ Drv->image = XCreateImage (
+ Drv->display, Drv->visual, Drv->depth,
+ ZPixmap, 0, (char *)Drv->image_data,
+ Drv->width, Drv->height,
+ 8 << Drv->pixel_shift, 0
+ );
+ }
+
+ Drv->line_bytes = Drv->image->bytes_per_line;
+
+ fill_shift_mask (&Drv->r, Drv->image->red_mask);
+ fill_shift_mask (&Drv->g, Drv->image->green_mask);
+ fill_shift_mask (&Drv->b, Drv->image->blue_mask);
+
+ // Set WM hints.
+ size_hints.flags = PSize | PMinSize | PMaxSize;
+ size_hints.min_width = size_hints.max_width = size_hints.base_width = Width;
+ size_hints.min_height = size_hints.max_height = size_hints.base_height = Height;
+ XSetWMNormalHints (Drv->display, Drv->win, &size_hints);
+
+ XMapWindow (Drv->display, Drv->win);
+ HandleEvents (Drv);
+ return EFI_SUCCESS;
+}
+
+void
+handleKeyEvent (
+ IN GRAPHICS_IO_PRIVATE *Drv,
+ IN XEvent *ev,
+ IN BOOLEAN Make
+ )
+{
+ KeySym *KeySym;
+ EFI_KEY_DATA KeyData;
+ int KeySymArraySize;
+
+ if (Make) {
+ if (Drv->key_count == NBR_KEYS) {
+ return;
+ }
+ }
+
+ // keycode is a physical key on the keyboard
+ // KeySym is a mapping of a physical key
+ // KeyboardMapping is the array of KeySym for a given keycode. key, shifted key, option key, command key, ...
+ //
+ // Returns an array of KeySymArraySize of KeySym for the keycode. [0] is lower case, [1] is upper case,
+ // [2] and [3] are based on option and command modifiers. The problem we have is command V
+ // could be mapped to a crazy Unicode character so the old scheme of returning a string.
+ //
+ KeySym = XGetKeyboardMapping (Drv->display, ev->xkey.keycode, 1, &KeySymArraySize);
+
+ KeyData.Key.ScanCode = 0;
+ KeyData.Key.UnicodeChar = 0;
+ KeyData.KeyState.KeyShiftState = 0;
+
+ //
+ // Skipping EFI_SCROLL_LOCK_ACTIVE & EFI_NUM_LOCK_ACTIVE since they are not on Macs
+ //
+ if ((ev->xkey.state & LockMask) == 0) {
+ Drv->KeyState.KeyToggleState &= ~EFI_CAPS_LOCK_ACTIVE;
+ } else {
+ if (Make) {
+ Drv->KeyState.KeyToggleState |= EFI_CAPS_LOCK_ACTIVE;
+ }
+ }
+
+ // Skipping EFI_MENU_KEY_PRESSED and EFI_SYS_REQ_PRESSED
+
+ switch (*KeySym) {
+ case XK_Control_R:
+ if (Make) {
+ Drv->KeyState.KeyShiftState |= EFI_RIGHT_CONTROL_PRESSED;
+ } else {
+ Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_CONTROL_PRESSED;
+ }
+ break;
+ case XK_Control_L:
+ if (Make) {
+ Drv->KeyState.KeyShiftState |= EFI_LEFT_CONTROL_PRESSED;
+ } else {
+ Drv->KeyState.KeyShiftState &= ~EFI_LEFT_CONTROL_PRESSED;
+ }
+ break;
+
+ case XK_Shift_R:
+ if (Make) {
+ Drv->KeyState.KeyShiftState |= EFI_RIGHT_SHIFT_PRESSED;
+ } else {
+ Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_SHIFT_PRESSED;
+ }
+ break;
+ case XK_Shift_L:
+ if (Make) {
+ Drv->KeyState.KeyShiftState |= EFI_LEFT_SHIFT_PRESSED;
+ } else {
+ Drv->KeyState.KeyShiftState &= ~EFI_LEFT_SHIFT_PRESSED;
+ }
+ break;
+
+ case XK_Mode_switch:
+ if (Make) {
+ Drv->KeyState.KeyShiftState |= EFI_LEFT_ALT_PRESSED;
+ } else {
+ Drv->KeyState.KeyShiftState &= ~EFI_LEFT_ALT_PRESSED;
+ }
+ break;
+
+ case XK_Meta_R:
+ if (Make) {
+ Drv->KeyState.KeyShiftState |= EFI_RIGHT_LOGO_PRESSED;
+ } else {
+ Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_LOGO_PRESSED;
+ }
+ break;
+ case XK_Meta_L:
+ if (Make) {
+ Drv->KeyState.KeyShiftState |= EFI_LEFT_LOGO_PRESSED;
+ } else {
+ Drv->KeyState.KeyShiftState &= ~EFI_LEFT_LOGO_PRESSED;
+ }
+ break;
+
+ case XK_KP_Home:
+ case XK_Home: KeyData.Key.ScanCode = SCAN_HOME; break;
+
+ case XK_KP_End:
+ case XK_End: KeyData.Key.ScanCode = SCAN_END; break;
+
+ case XK_KP_Left:
+ case XK_Left: KeyData.Key.ScanCode = SCAN_LEFT; break;
+
+ case XK_KP_Right:
+ case XK_Right: KeyData.Key.ScanCode = SCAN_RIGHT; break;
+
+ case XK_KP_Up:
+ case XK_Up: KeyData.Key.ScanCode = SCAN_UP; break;
+
+ case XK_KP_Down:
+ case XK_Down: KeyData.Key.ScanCode = SCAN_DOWN; break;
+
+ case XK_KP_Delete:
+ case XK_Delete: KeyData.Key.ScanCode = SCAN_DELETE; break;
+
+ case XK_KP_Insert:
+ case XK_Insert: KeyData.Key.ScanCode = SCAN_INSERT; break;
+
+ case XK_KP_Page_Up:
+ case XK_Page_Up: KeyData.Key.ScanCode = SCAN_PAGE_UP; break;
+
+ case XK_KP_Page_Down:
+ case XK_Page_Down: KeyData.Key.ScanCode = SCAN_PAGE_DOWN; break;
+
+ case XK_Escape: KeyData.Key.ScanCode = SCAN_ESC; break;
+
+ case XK_Pause: KeyData.Key.ScanCode = SCAN_PAUSE; break;
+
+ case XK_KP_F1:
+ case XK_F1: KeyData.Key.ScanCode = SCAN_F1; break;
+
+ case XK_KP_F2:
+ case XK_F2: KeyData.Key.ScanCode = SCAN_F2; break;
+
+ case XK_KP_F3:
+ case XK_F3: KeyData.Key.ScanCode = SCAN_F3; break;
+
+ case XK_KP_F4:
+ case XK_F4: KeyData.Key.ScanCode = SCAN_F4; break;
+
+ case XK_F5: KeyData.Key.ScanCode = SCAN_F5; break;
+ case XK_F6: KeyData.Key.ScanCode = SCAN_F6; break;
+ case XK_F7: KeyData.Key.ScanCode = SCAN_F7; break;
+
+ // Don't map into X11 by default on a Mac
+ // System Preferences->Keyboard->Keyboard Shortcuts can be configured
+ // to not use higher function keys as shortcuts and the will show up
+ // in X11.
+ case XK_F8: KeyData.Key.ScanCode = SCAN_F8; break;
+ case XK_F9: KeyData.Key.ScanCode = SCAN_F9; break;
+ case XK_F10: KeyData.Key.ScanCode = SCAN_F10; break;
+
+ case XK_F11: KeyData.Key.ScanCode = SCAN_F11; break;
+ case XK_F12: KeyData.Key.ScanCode = SCAN_F12; break;
+
+ case XK_F13: KeyData.Key.ScanCode = SCAN_F13; break;
+ case XK_F14: KeyData.Key.ScanCode = SCAN_F14; break;
+ case XK_F15: KeyData.Key.ScanCode = SCAN_F15; break;
+ case XK_F16: KeyData.Key.ScanCode = SCAN_F16; break;
+ case XK_F17: KeyData.Key.ScanCode = SCAN_F17; break;
+ case XK_F18: KeyData.Key.ScanCode = SCAN_F18; break;
+ case XK_F19: KeyData.Key.ScanCode = SCAN_F19; break;
+ case XK_F20: KeyData.Key.ScanCode = SCAN_F20; break;
+ case XK_F21: KeyData.Key.ScanCode = SCAN_F21; break;
+ case XK_F22: KeyData.Key.ScanCode = SCAN_F22; break;
+ case XK_F23: KeyData.Key.ScanCode = SCAN_F23; break;
+ case XK_F24: KeyData.Key.ScanCode = SCAN_F24; break;
+
+ // No mapping in X11
+ //case XK_: KeyData.Key.ScanCode = SCAN_MUTE; break;
+ //case XK_: KeyData.Key.ScanCode = SCAN_VOLUME_UP; break;
+ //case XK_: KeyData.Key.ScanCode = SCAN_VOLUME_DOWN; break;
+ //case XK_: KeyData.Key.ScanCode = SCAN_BRIGHTNESS_UP; break;
+ //case XK_: KeyData.Key.ScanCode = SCAN_BRIGHTNESS_DOWN; break;
+ //case XK_: KeyData.Key.ScanCode = SCAN_SUSPEND; break;
+ //case XK_: KeyData.Key.ScanCode = SCAN_HIBERNATE; break;
+ //case XK_: KeyData.Key.ScanCode = SCAN_TOGGLE_DISPLAY; break;
+ //case XK_: KeyData.Key.ScanCode = SCAN_RECOVERY; break;
+ //case XK_: KeyData.Key.ScanCode = SCAN_EJECT; break;
+
+ case XK_BackSpace: KeyData.Key.UnicodeChar = 0x0008; break;
+
+ case XK_KP_Tab:
+ case XK_Tab: KeyData.Key.UnicodeChar = 0x0009; break;
+
+ case XK_Linefeed: KeyData.Key.UnicodeChar = 0x000a; break;
+
+ case XK_KP_Enter:
+ case XK_Return: KeyData.Key.UnicodeChar = 0x000d; break;
+
+ case XK_KP_Equal : KeyData.Key.UnicodeChar = L'='; break;
+ case XK_KP_Multiply : KeyData.Key.UnicodeChar = L'*'; break;
+ case XK_KP_Add : KeyData.Key.UnicodeChar = L'+'; break;
+ case XK_KP_Separator : KeyData.Key.UnicodeChar = L'~'; break;
+ case XK_KP_Subtract : KeyData.Key.UnicodeChar = L'-'; break;
+ case XK_KP_Decimal : KeyData.Key.UnicodeChar = L'.'; break;
+ case XK_KP_Divide : KeyData.Key.UnicodeChar = L'/'; break;
+
+ case XK_KP_0 : KeyData.Key.UnicodeChar = L'0'; break;
+ case XK_KP_1 : KeyData.Key.UnicodeChar = L'1'; break;
+ case XK_KP_2 : KeyData.Key.UnicodeChar = L'2'; break;
+ case XK_KP_3 : KeyData.Key.UnicodeChar = L'3'; break;
+ case XK_KP_4 : KeyData.Key.UnicodeChar = L'4'; break;
+ case XK_KP_5 : KeyData.Key.UnicodeChar = L'5'; break;
+ case XK_KP_6 : KeyData.Key.UnicodeChar = L'6'; break;
+ case XK_KP_7 : KeyData.Key.UnicodeChar = L'7'; break;
+ case XK_KP_8 : KeyData.Key.UnicodeChar = L'8'; break;
+ case XK_KP_9 : KeyData.Key.UnicodeChar = L'9'; break;
+
+ default:
+ ;
+ }
+
+ // The global state is our state
+ KeyData.KeyState.KeyShiftState = Drv->KeyState.KeyShiftState;
+ KeyData.KeyState.KeyToggleState = Drv->KeyState.KeyToggleState;
+
+ if (*KeySym < XK_BackSpace) {
+ if (((Drv->KeyState.KeyShiftState & (EFI_LEFT_SHIFT_PRESSED | EFI_RIGHT_SHIFT_PRESSED)) != 0) ||
+ ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) != 0) ) {
+
+ KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_UPPER];
+
+ // Per UEFI spec since we converted the Unicode clear the shift bits we pass up
+ KeyData.KeyState.KeyShiftState &= ~(EFI_LEFT_SHIFT_PRESSED | EFI_RIGHT_SHIFT_PRESSED);
+ } else {
+ KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_LOWER];
+ }
+ } else {
+ // XK_BackSpace is the start of XK_MISCELLANY. These are the XK_? keys we process in this file
+ ;
+ }
+
+ if (Make) {
+ memcpy (&Drv->keys[Drv->key_wr], &KeyData, sizeof (EFI_KEY_DATA));
+ Drv->key_wr = (Drv->key_wr + 1) % NBR_KEYS;
+ Drv->key_count++;
+ if (Drv->MakeRegisterdKeyCallback != NULL) {
+ ReverseGasketUint64Uint64 (Drv->MakeRegisterdKeyCallback ,Drv->RegisterdKeyCallbackContext, &KeyData);
+ }
+ } else {
+ if (Drv->BreakRegisterdKeyCallback != NULL) {
+ ReverseGasketUint64Uint64 (Drv->BreakRegisterdKeyCallback ,Drv->RegisterdKeyCallbackContext, &KeyData);
+ }
+ }
+}
+
+
+void
+handleMouseMoved(
+ IN GRAPHICS_IO_PRIVATE *Drv,
+ IN XEvent *ev
+ )
+{
+ if (ev->xmotion.x != Drv->previous_x) {
+ Drv->pointer_state.RelativeMovementX += ( ev->xmotion.x - Drv->previous_x );
+ Drv->previous_x = ev->xmotion.x;
+ Drv->pointer_state_changed = 1;
+ }
+
+ if (ev->xmotion.y != Drv->previous_y) {
+ Drv->pointer_state.RelativeMovementY += ( ev->xmotion.y - Drv->previous_y );
+ Drv->previous_y = ev->xmotion.y;
+ Drv->pointer_state_changed = 1;
+ }
+
+ Drv->pointer_state.RelativeMovementZ = 0;
+}
+
+void
+handleMouseDown (
+ IN GRAPHICS_IO_PRIVATE *Drv,
+ IN XEvent *ev,
+ IN BOOLEAN Pressed
+ )
+{
+ if (ev->xbutton.button == Button1) {
+ Drv->pointer_state_changed = (Drv->pointer_state.LeftButton != Pressed);
+ Drv->pointer_state.LeftButton = Pressed;
+ }
+ if ( ev->xbutton.button == Button2 ) {
+ Drv->pointer_state_changed = (Drv->pointer_state.RightButton != Pressed);
+ Drv->pointer_state.RightButton = Pressed;
+ }
+}
+
+void
+Redraw (
+ IN GRAPHICS_IO_PRIVATE *Drv,
+ IN UINTN X,
+ IN UINTN Y,
+ IN UINTN Width,
+ IN UINTN Height
+ )
+{
+ if (Drv->use_shm) {
+ XShmPutImage (
+ Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height, False
+ );
+ } else {
+ XPutImage (
+ Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height
+ );
+ }
+ XFlush(Drv->display);
+}
+
+void
+HandleEvent(GRAPHICS_IO_PRIVATE *Drv, XEvent *ev)
+{
+ switch (ev->type) {
+ case Expose:
+ Redraw (Drv, ev->xexpose.x, ev->xexpose.y,
+ ev->xexpose.width, ev->xexpose.height);
+ break;
+ case GraphicsExpose:
+ Redraw (Drv, ev->xgraphicsexpose.x, ev->xgraphicsexpose.y,
+ ev->xgraphicsexpose.width, ev->xgraphicsexpose.height);
+ break;
+ case KeyPress:
+ handleKeyEvent (Drv, ev, TRUE);
+ break;
+ case KeyRelease:
+ handleKeyEvent (Drv, ev, FALSE);
+ break;
+ case MappingNotify:
+ XRefreshKeyboardMapping (&ev->xmapping);
+ break;
+ case MotionNotify:
+ handleMouseMoved (Drv, ev);
+ break;
+ case ButtonPress:
+ handleMouseDown (Drv, ev, TRUE);
+ break;
+ case ButtonRelease:
+ handleMouseDown (Drv, ev, FALSE);
+ break;
+#if 0
+ case DestroyNotify:
+ XCloseDisplay (Drv->display);
+ exit (1);
+ break;
+#endif
+ case NoExpose:
+ default:
+ break;
+ }
+}
+
+void
+HandleEvents (
+ IN GRAPHICS_IO_PRIVATE *Drv
+ )
+{
+ XEvent ev;
+
+ while (XPending (Drv->display) != 0) {
+ XNextEvent (Drv->display, &ev);
+ HandleEvent (Drv, &ev);
+ }
+}
+
+unsigned long
+X11PixelToColor (
+ IN GRAPHICS_IO_PRIVATE *Drv,
+ IN EFI_UGA_PIXEL pixel
+ )
+{
+ return ((pixel.Red >> Drv->r.csize) << Drv->r.shift)
+ | ((pixel.Green >> Drv->g.csize) << Drv->g.shift)
+ | ((pixel.Blue >> Drv->b.csize) << Drv->b.shift);
+}
+
+EFI_UGA_PIXEL
+X11ColorToPixel (
+ IN GRAPHICS_IO_PRIVATE *Drv,
+ IN unsigned long val
+ )
+{
+ EFI_UGA_PIXEL Pixel;
+
+ memset (&Pixel, 0, sizeof (EFI_UGA_PIXEL));
+
+ // Truncation not an issue since X11 and EFI are both using 8 bits per color
+ Pixel.Red = (val >> Drv->r.shift) << Drv->r.csize;
+ Pixel.Green = (val >> Drv->g.shift) << Drv->g.csize;
+ Pixel.Blue = (val >> Drv->b.shift) << Drv->b.csize;
+
+ return Pixel;
+}
+
+
+EFI_STATUS
+X11CheckKey (
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo
+ )
+{
+ GRAPHICS_IO_PRIVATE *Drv;
+
+ Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
+
+ HandleEvents (Drv);
+
+ if (Drv->key_count != 0) {
+ return EFI_SUCCESS;
+ }
+
+ return EFI_NOT_READY;
+}
+
+EFI_STATUS
+X11GetKey (
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
+ IN EFI_KEY_DATA *KeyData
+ )
+{
+ EFI_STATUS EfiStatus;
+ GRAPHICS_IO_PRIVATE *Drv;
+
+ Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
+
+ EfiStatus = X11CheckKey (GraphicsIo);
+ if (EFI_ERROR (EfiStatus)) {
+ return EfiStatus;
+ }
+
+ CopyMem (KeyData, &Drv->keys[Drv->key_rd], sizeof (EFI_KEY_DATA));
+ Drv->key_rd = (Drv->key_rd + 1) % NBR_KEYS;
+ Drv->key_count--;
+
+ return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+X11KeySetState (
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
+ IN EFI_KEY_TOGGLE_STATE *KeyToggleState
+ )
+{
+ GRAPHICS_IO_PRIVATE *Drv;
+
+ Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
+
+ if (*KeyToggleState & EFI_CAPS_LOCK_ACTIVE) {
+ if ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) == 0) {
+ //
+ // We could create an XKeyEvent and send a XK_Caps_Lock to
+ // the UGA/GOP Window
+ //
+ }
+ }
+
+ Drv->KeyState.KeyToggleState = *KeyToggleState;
+ return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+X11RegisterKeyNotify (
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
+ IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK MakeCallBack,
+ IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK BreakCallBack,
+ IN VOID *Context
+ )
+{
+ GRAPHICS_IO_PRIVATE *Drv;
+
+ Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
+
+ Drv->MakeRegisterdKeyCallback = MakeCallBack;
+ Drv->BreakRegisterdKeyCallback = BreakCallBack;
+ Drv->RegisterdKeyCallbackContext = Context;
+
+ return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+X11Blt (
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
+ IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
+ IN EFI_UGA_BLT_OPERATION BltOperation,
+ IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args
+ )
+{
+ GRAPHICS_IO_PRIVATE *Private;
+ UINTN DstY;
+ UINTN SrcY;
+ UINTN DstX;
+ UINTN SrcX;
+ UINTN Index;
+ EFI_UGA_PIXEL *Blt;
+ UINT8 *Dst;
+ UINT8 *Src;
+ UINTN Nbr;
+ unsigned long Color;
+ XEvent ev;
+
+ Private = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
+
+
+ //
+ // Check bounds
+ //
+ if (BltOperation == EfiUgaVideoToBltBuffer
+ || BltOperation == EfiUgaVideoToVideo) {
+ //
+ // Source is Video.
+ //
+ if (Args->SourceY + Args->Height > Private->height) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (Args->SourceX + Args->Width > Private->width) {
+ return EFI_INVALID_PARAMETER;
+ }
+ }
+
+ if (BltOperation == EfiUgaBltBufferToVideo
+ || BltOperation == EfiUgaVideoToVideo
+ || BltOperation == EfiUgaVideoFill) {
+ //
+ // Destination is Video
+ //
+ if (Args->DestinationY + Args->Height > Private->height) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (Args->DestinationX + Args->Width > Private->width) {
+ return EFI_INVALID_PARAMETER;
+ }
+ }
+
+ switch (BltOperation) {
+ case EfiUgaVideoToBltBuffer:
+ Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->DestinationY * Args->Delta) + Args->DestinationX * sizeof (EFI_UGA_PIXEL));
+ Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);
+ for (SrcY = Args->SourceY; SrcY < (Args->Height + Args->SourceY); SrcY++) {
+ for (SrcX = Args->SourceX; SrcX < (Args->Width + Args->SourceX); SrcX++) {
+ *Blt++ = X11ColorToPixel (Private, XGetPixel (Private->image, SrcX, SrcY));
+ }
+ Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);
+ }
+ break;
+ case EfiUgaBltBufferToVideo:
+ Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->SourceY * Args->Delta) + Args->SourceX * sizeof (EFI_UGA_PIXEL));
+ Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);
+ for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY); DstY++) {
+ for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX); DstX++) {
+ XPutPixel(Private->image, DstX, DstY, X11PixelToColor(Private, *Blt));
+ Blt++;
+ }
+ Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);
+ }
+ break;
+ case EfiUgaVideoToVideo:
+ Dst = Private->image_data + (Args->DestinationX << Private->pixel_shift)
+ + Args->DestinationY * Private->line_bytes;
+ Src = Private->image_data + (Args->SourceX << Private->pixel_shift)
+ + Args->SourceY * Private->line_bytes;
+ Nbr = Args->Width << Private->pixel_shift;
+ if (Args->DestinationY < Args->SourceY) {
+ for (Index = 0; Index < Args->Height; Index++) {
+ memcpy (Dst, Src, Nbr);
+ Dst += Private->line_bytes;
+ Src += Private->line_bytes;
+ }
+ } else {
+ Dst += (Args->Height - 1) * Private->line_bytes;
+ Src += (Args->Height - 1) * Private->line_bytes;
+ for (Index = 0; Index < Args->Height; Index++) {
+ //
+ // Source and Destination Y may be equal, therefore Dst and Src may
+ // overlap.
+ //
+ memmove (Dst, Src, Nbr);
+ Dst -= Private->line_bytes;
+ Src -= Private->line_bytes;
+ }
+ }
+ break;
+ case EfiUgaVideoFill:
+ Color = X11PixelToColor(Private, *BltBuffer);
+ for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY); DstY++) {
+ for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX); DstX++) {
+ XPutPixel(Private->image, DstX, DstY, Color);
+ }
+ }
+ break;
+ default:
+ return EFI_INVALID_PARAMETER;
+ }
+
+ //
+ // Refresh screen.
+ //
+ switch (BltOperation) {
+ case EfiUgaVideoToVideo:
+ XCopyArea(
+ Private->display, Private->win, Private->win, Private->gc,
+ Args->SourceX, Args->SourceY, Args->Width, Args->Height,
+ Args->DestinationX, Args->DestinationY
+ );
+
+ while (1) {
+ XNextEvent (Private->display, &ev);
+ HandleEvent (Private, &ev);
+ if (ev.type == NoExpose || ev.type == GraphicsExpose) {
+ break;
+ }
+ }
+ break;
+ case EfiUgaVideoFill:
+ Color = X11PixelToColor (Private, *BltBuffer);
+ XSetForeground (Private->display, Private->gc, Color);
+ XFillRectangle (
+ Private->display, Private->win, Private->gc,
+ Args->DestinationX, Args->DestinationY, Args->Width, Args->Height
+ );
+ XFlush (Private->display);
+ break;
+ case EfiUgaBltBufferToVideo:
+ Redraw (Private, Args->DestinationX, Args->DestinationY, Args->Width, Args->Height);
+ break;
+ default:
+ break;
+ }
+ return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+X11CheckPointer (
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo
+ )
+{
+ GRAPHICS_IO_PRIVATE *Drv;
+
+ Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
+
+ HandleEvents (Drv);
+ if (Drv->pointer_state_changed != 0) {
+ return EFI_SUCCESS;
+ }
+
+ return EFI_NOT_READY;
+}
+
+
+EFI_STATUS
+X11GetPointerState (
+ IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
+ IN EFI_SIMPLE_POINTER_STATE *State
+ )
+{
+ EFI_STATUS EfiStatus;
+ GRAPHICS_IO_PRIVATE *Drv;
+
+ Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
+
+ EfiStatus = X11CheckPointer (GraphicsIo);
+ if (EfiStatus != EFI_SUCCESS) {
+ return EfiStatus;
+ }
+
+ memcpy (State, &Drv->pointer_state, sizeof (EFI_SIMPLE_POINTER_STATE));
+
+ Drv->pointer_state.RelativeMovementX = 0;
+ Drv->pointer_state.RelativeMovementY = 0;
+ Drv->pointer_state.RelativeMovementZ = 0;
+ Drv->pointer_state_changed = 0;
+ return EFI_SUCCESS;
+}
+
+
+
+EFI_STATUS
+X11GraphicsWindowOpen (
+ IN EMU_IO_THUNK_PROTOCOL *This
+ )
+{
+ GRAPHICS_IO_PRIVATE *Drv;
+ unsigned int border_width = 0;
+ char *display_name = NULL;
+
+ Drv = (GRAPHICS_IO_PRIVATE *)calloc (1, sizeof (GRAPHICS_IO_PRIVATE));
+ if (Drv == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ Drv->GraphicsIo.Size = GasketX11Size;
+ Drv->GraphicsIo.CheckKey = GasketX11CheckKey;
+ Drv->GraphicsIo.GetKey = GasketX11GetKey;
+ Drv->GraphicsIo.KeySetState = GasketX11KeySetState;
+ Drv->GraphicsIo.RegisterKeyNotify = GasketX11RegisterKeyNotify;
+ Drv->GraphicsIo.Blt = GasketX11Blt;
+ Drv->GraphicsIo.CheckPointer = GasketX11CheckPointer;
+ Drv->GraphicsIo.GetPointerState = GasketX11GetPointerState;
+
+
+ Drv->key_count = 0;
+ Drv->key_rd = 0;
+ Drv->key_wr = 0;
+ Drv->KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID;
+ Drv->KeyState.KeyToggleState = EFI_TOGGLE_STATE_VALID;
+ Drv->MakeRegisterdKeyCallback = NULL;
+ Drv->BreakRegisterdKeyCallback = NULL;
+ Drv->RegisterdKeyCallbackContext = NULL;
+
+
+ Drv->display = XOpenDisplay (display_name);
+ if (Drv->display == NULL) {
+ fprintf (stderr, "uga: cannot connect to X server %s\n", XDisplayName (display_name));
+ free (Drv);
+ return EFI_DEVICE_ERROR;
+ }
+ Drv->screen = DefaultScreen (Drv->display);
+ Drv->visual = DefaultVisual (Drv->display, Drv->screen);
+ Drv->win = XCreateSimpleWindow (
+ Drv->display, RootWindow (Drv->display, Drv->screen),
+ 0, 0, 4, 4, border_width,
+ WhitePixel (Drv->display, Drv->screen),
+ BlackPixel (Drv->display, Drv->screen)
+ );
+
+ Drv->depth = DefaultDepth (Drv->display, Drv->screen);
+ XDefineCursor (Drv->display, Drv->win, XCreateFontCursor (Drv->display, XC_pirate));
+
+ Drv->Title = malloc (StrSize (This->ConfigString));
+ UnicodeStrToAsciiStr (This->ConfigString, Drv->Title);
+ XStoreName (Drv->display, Drv->win, Drv->Title);
+
+// XAutoRepeatOff (Drv->display);
+ XSelectInput (
+ Drv->display, Drv->win,
+ ExposureMask | KeyPressMask | KeyReleaseMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask
+ );
+ Drv->gc = DefaultGC (Drv->display, Drv->screen);
+
+ This->Private = (VOID *)Drv;
+ This->Interface = (VOID *)Drv;
+ return EFI_SUCCESS;
+}
+
+
+EFI_STATUS
+X11GraphicsWindowClose (
+ IN EMU_IO_THUNK_PROTOCOL *This
+ )
+{
+ GRAPHICS_IO_PRIVATE *Drv;
+
+ Drv = (GRAPHICS_IO_PRIVATE *)This->Private;
+
+ if (Drv == NULL) {
+ return EFI_SUCCESS;
+ }
+
+ if (Drv->image != NULL) {
+ XDestroyImage(Drv->image);
+
+ if (Drv->use_shm) {
+ shmdt (Drv->image_data);
+ }
+
+ Drv->image_data = NULL;
+ Drv->image = NULL;
+ }
+ XDestroyWindow (Drv->display, Drv->win);
+ XCloseDisplay (Drv->display);
+
+#ifdef __APPLE__
+ // Free up the shared memory
+ shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
+#endif
+
+ free (Drv);
+ return EFI_SUCCESS;
+}
+
+
+EMU_IO_THUNK_PROTOCOL gX11ThunkIo = {
+ &gEmuGraphicsWindowProtocolGuid,
+ NULL,
+ NULL,
+ 0,
+ GasketX11GraphicsWindowOpen,
+ GasketX11GraphicsWindowClose,
+ NULL
+};
+
+
diff --git a/EmulatorPkg/Unix/Host/X64/Gasket.S b/EmulatorPkg/Unix/Host/X64/Gasket.S
index c339461cd8..118a218818 100644
--- a/EmulatorPkg/Unix/Host/X64/Gasket.S
+++ b/EmulatorPkg/Unix/Host/X64/Gasket.S
@@ -1,1631 +1,1631 @@
-#------------------------------------------------------------------------------
-#
-# Manage differenced between UNIX ABI and EFI/Windows ABI
-#
-# EFI Arg passing: RCX, RDX, R8, R9
-# Callee allocates 32 bytes on stack to spill registers
-# UNIX Arg passing: RDI, RSI, RDX, RCX, R8, R9
-# RSI, RDI calle-save on EFI, scatch on UNIX callign
-#
-# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
-# This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution. The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php
-#
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-#------------------------------------------------------------------------------
-
-//
-// Gaskets are EFI ABI to UNIX ABI calls
-// EFI ABI code will sub 40 (0x28) from %rsp before calling a function
-// This is the 32 (0x20) byte to spill registers and 8 bytes to align stack on 16 byte boundry.
-//
- .text
-
-// 32 byte shadow to spill rcx-r9, 8 bytes to align stack on 16 byte boundry
-// Any call with 0 - 4 arguments allocates 40 bytes on the stack.
-// For more than 4 args you always have to increase in quanta of 16 so 5 or 6 args is 56,
-// 7 or 8 args is 72, and 9 or 10 args is 88
-
-
-
- .text
-
-//
-// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)
-//
-
-
-
-
-ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)
-ASM_PFX(GasketSecWriteStdErr):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
-
- call ASM_PFX(SecWriteStdErr)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)
-ASM_PFX(GasketSecConfigStdIn):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- call ASM_PFX(SecConfigStdIn)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)
-ASM_PFX(GasketSecWriteStdOut):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
-
- call ASM_PFX(SecWriteStdOut)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)
-ASM_PFX(GasketSecReadStdIn):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
-
- call ASM_PFX(SecReadStdIn)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)
-ASM_PFX(GasketSecPollStdIn):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- call ASM_PFX(SecPollStdIn)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-ASM_GLOBAL ASM_PFX(GasketSecMalloc)
-ASM_PFX(GasketSecMalloc):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(SecMalloc)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-ASM_GLOBAL ASM_PFX(GasketSecValloc)
-ASM_PFX(GasketSecValloc):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(SecValloc)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-ASM_GLOBAL ASM_PFX(GasketSecFree)
-ASM_PFX(GasketSecFree):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(SecFree)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecSetTimer)
-ASM_PFX(GasketSecSetTimer):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
-
- call ASM_PFX(SecSetTimer)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)
-ASM_PFX(GasketSecEnableInterrupt):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- call ASM_PFX(SecEnableInterrupt)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)
-ASM_PFX(GasketSecDisableInterrupt):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- call ASM_PFX(SecDisableInterrupt)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)
-ASM_PFX(GasketQueryPerformanceFrequency):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- call ASM_PFX(QueryPerformanceFrequency)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)
-ASM_PFX(GasketQueryPerformanceCounter):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- call ASM_PFX(QueryPerformanceCounter)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecSleep)
-ASM_PFX(GasketSecSleep):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(SecSleep)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)
-ASM_PFX(GasketSecCpuSleep):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- call ASM_PFX(SecCpuSleep)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecExit)
-ASM_PFX(GasketSecExit):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- movq %rcx, %rdi // Swizzle args
- call ASM_PFX(SecExit) // Less to do as we will never return to EFI ABI world
-LDEAD_LOOP:
- jmp LDEAD_LOOP // _exit should never return
-
-
-ASM_GLOBAL ASM_PFX(GasketSecGetTime)
-ASM_PFX(GasketSecGetTime):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
-
- call ASM_PFX(SecGetTime)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-ASM_GLOBAL ASM_PFX(GasketSecSetTime)
-ASM_PFX(GasketSecSetTime):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
-
- call ASM_PFX(SecSetTime)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)
-ASM_PFX(GasketSecGetNextProtocol):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
- movq %r9, %rcx
-
- call ASM_PFX(SecGetNextProtocol)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-// PPIs produced by SEC
-
-ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)
-ASM_PFX(GasketSecPeCoffGetEntryPoint):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
-
- call ASM_PFX(SecPeCoffGetEntryPoint)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)
-ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(SecPeCoffRelocateImageExtraAction)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)
-ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(SecPeCoffUnloadImageExtraAction)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)
-ASM_PFX(GasketSecEmuThunkAddress):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- call ASM_PFX(SecEmuThunkAddress)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-//
-// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
-//
-
-ASM_GLOBAL ASM_PFX(GasketX11Size)
-ASM_PFX(GasketX11Size):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
- movq %r9, %rcx
-
- call ASM_PFX(X11Size)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11CheckKey)
-ASM_PFX(GasketX11CheckKey):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(X11CheckKey)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-ASM_GLOBAL ASM_PFX(GasketX11GetKey)
-ASM_PFX(GasketX11GetKey):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
-
- call ASM_PFX(X11GetKey)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11KeySetState)
-ASM_PFX(GasketX11KeySetState):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
-
- call ASM_PFX(X11KeySetState)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)
-ASM_PFX(GasketX11RegisterKeyNotify):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
- movq %r9, %rcx
-
- call ASM_PFX(X11RegisterKeyNotify)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11Blt)
-ASM_PFX(GasketX11Blt):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
- movq %r9, %rcx
-
- call ASM_PFX(X11Blt)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)
-ASM_PFX(GasketX11CheckPointer):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(X11CheckPointer)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)
-ASM_PFX(GasketX11GetPointerState):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
-
- call ASM_PFX(X11GetPointerState)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)
-ASM_PFX(GasketX11GraphicsWindowOpen):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(X11GraphicsWindowOpen)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)
-ASM_PFX(GasketX11GraphicsWindowClose):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %r9, %rcx
-
- call ASM_PFX(X11GraphicsWindowClose)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-// Pthreads
-
-ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)
-ASM_PFX(GasketPthreadMutexLock):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(PthreadMutexLock)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)
-ASM_PFX(GasketPthreadMutexUnLock):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(PthreadMutexUnLock)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)
-ASM_PFX(GasketPthreadMutexTryLock):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(PthreadMutexTryLock)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)
-ASM_PFX(GasketPthreadMutexInit):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
-
- call ASM_PFX(PthreadMutexInit)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)
-ASM_PFX(GasketPthreadMutexDestroy):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(PthreadMutexDestroy)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadCreate)
-ASM_PFX(GasketPthreadCreate):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
- movq %r9, %rcx
-
- call ASM_PFX(PthreadCreate)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadExit)
-ASM_PFX(GasketPthreadExit):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(PthreadExit)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadSelf)
-ASM_PFX(GasketPthreadSelf):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
-
- call ASM_PFX(PthreadSelf)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadOpen)
-ASM_PFX(GasketPthreadOpen):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(PthreadOpen)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPthreadClose)
-ASM_PFX(GasketPthreadClose):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(PthreadClose)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-
-
-//
-// UNIX ABI to EFI ABI call
-//
-// UINTN
-// ReverseGasketUint64 (
-// void *Api,
-// UINTN Arg1
-// );
-ASM_GLOBAL ASM_PFX(ReverseGasketUint64)
-ASM_PFX(ReverseGasketUint64):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- movq %rdi, %rax // Swizzle args
- movq %rsi, %rcx
-
- subq $32, %rsp // 32-byte shadow space
- call *%rax
- addq $32, %rsp
-
- popq %rbp
- ret
-
-//
-// UNIX ABI to EFI ABI call
-//
-// UINTN
-// ReverseGasketUint64Uint64 (
-// void *Api,
-// UINTN Arg1
-// UINTN Arg2
-// );
-ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)
-ASM_PFX(ReverseGasketUint64Uint64):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- movq %rdi, %rax // Swizzle args
- movq %rsi, %rcx
-
- subq $32, %rsp // 32-byte shadow space
- call *%rax
- addq $32, %rsp
-
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)
-ASM_PFX(GasketSecUnixPeiAutoScan):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
-
- call ASM_PFX(SecUnixPeiAutoScan)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)
-ASM_PFX(GasketSecUnixFdAddress):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
- movq %r9, %rcx
-
- call ASM_PFX(SecUnixFdAddress)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-// EmuIoThunk SimpleFileSystem
-
-ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)
-ASM_PFX(GasketPosixOpenVolume):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
- movq %r9, %rcx
-
- call ASM_PFX(PosixOpenVolume)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)
-ASM_PFX(GasketPosixFileOpen):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
- movq %r9, %rcx
- movq 48(%rbp), %r8
-
- call ASM_PFX(PosixFileOpen)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)
-ASM_PFX(GasketPosixFileCLose):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(PosixFileCLose)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)
-ASM_PFX(GasketPosixFileDelete):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(PosixFileDelete)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileRead)
-ASM_PFX(GasketPosixFileRead):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
-
- call ASM_PFX(PosixFileRead)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)
-ASM_PFX(GasketPosixFileWrite):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
-
- call ASM_PFX(PosixFileWrite)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)
-ASM_PFX(GasketPosixFileSetPossition):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
-
- call ASM_PFX(PosixFileSetPossition)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)
-ASM_PFX(GasketPosixFileGetPossition):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
-
- call ASM_PFX(PosixFileGetPossition)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)
-ASM_PFX(GasketPosixFileGetInfo):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
- movq %r9, %rcx
-
- call ASM_PFX(PosixFileGetInfo)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)
-ASM_PFX(GasketPosixFileSetInfo):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
- movq %r9, %rcx
-
- call ASM_PFX(PosixFileSetInfo)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)
-ASM_PFX(GasketPosixFileFlush):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(PosixFileFlush)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)
-ASM_PFX(GasketPosixFileSystmeThunkOpen):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(PosixFileSystmeThunkOpen)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)
-ASM_PFX(GasketPosixFileSystmeThunkClose):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(PosixFileSystmeThunkClose)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)
-ASM_PFX(GasketEmuBlockIoReset):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
-
- call ASM_PFX(EmuBlockIoReset)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)
-ASM_PFX(GasketEmuBlockIoReadBlocks):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
- movq %r9, %rcx
- movq 48(%rbp), %r8
- movq 56(%rbp), %r9
-
- call ASM_PFX(EmuBlockIoReadBlocks)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)
-ASM_PFX(GasketEmuBlockIoWriteBlocks):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
- movq %r9, %rcx
- movq 48(%rbp), %r8
- movq 56(%rbp), %r9
-
- call ASM_PFX(EmuBlockIoWriteBlocks)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)
-ASM_PFX(GasketEmuBlockIoFlushBlocks):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
-
- call ASM_PFX(EmuBlockIoFlushBlocks)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)
-ASM_PFX(GasketEmuBlockIoCreateMapping):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
-
- call ASM_PFX(EmuBlockIoCreateMapping)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)
-ASM_PFX(GasketBlockIoThunkOpen):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(EmuBlockIoThunkOpen)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)
-ASM_PFX(GasketBlockIoThunkClose):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(EmuBlockIoThunkClose)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)
-ASM_PFX(GasketSnpCreateMapping):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
-
- call ASM_PFX(EmuSnpCreateMapping)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpStart)
-ASM_PFX(GasketSnpStart):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(EmuSnpStart)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpStop)
-ASM_PFX(GasketSnpStop):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(EmuSnpStop)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpInitialize)
-ASM_PFX(GasketSnpInitialize):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
-
- call ASM_PFX(EmuSnpInitialize)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpReset)
-ASM_PFX(GasketSnpReset):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
-
- call ASM_PFX(EmuSnpReset)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpShutdown)
-ASM_PFX(GasketSnpShutdown):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(EmuSnpShutdown)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)
-ASM_PFX(GasketSnpReceiveFilters):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
- movq %r9, %rcx
- movq 48(%rbp), %r8
- movq 56(%rbp), %r9
-
- call ASM_PFX(EmuSnpReceiveFilters)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)
-ASM_PFX(GasketSnpStationAddress):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
-
- call ASM_PFX(EmuSnpStationAddress)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpStatistics)
-ASM_PFX(GasketSnpStatistics):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
- movq %r9, %rcx
-
- call ASM_PFX(EmuSnpStatistics)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)
-ASM_PFX(GasketSnpMCastIpToMac):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
- movq %r9, %rcx
-
- call ASM_PFX(EmuSnpMCastIpToMac)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpNvData)
-ASM_PFX(GasketSnpNvData):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
- movq %r9, %rcx
- movq 48(%rbp), %r8
-
- call ASM_PFX(EmuSnpNvData)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)
-ASM_PFX(GasketSnpGetStatus):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
-
- call ASM_PFX(EmuSnpGetStatus)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpTransmit)
-ASM_PFX(GasketSnpTransmit):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
- subq $16, %rsp // Allocate space for args on the stack
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
- movq %r9, %rcx
- movq 48(%rbp), %r8
- movq 56(%rbp), %r9
- movq 64(%rbp), %rax
- movq %rax, (%rsp)
-
- call ASM_PFX(EmuSnpTransmit)
- addq $16, %rsp
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpReceive)
-ASM_PFX(GasketSnpReceive):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
- subq $16, %rsp // Allocate space for args on the stack
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
- movq %rdx, %rsi
- movq %r8, %rdx
- movq %r9, %rcx
- movq 48(%rbp), %r8
- movq 56(%rbp), %r9
- movq 64(%rbp), %rax
- movq %rax, (%rsp)
-
- call ASM_PFX(EmuSnpReceive)
- addq $16, %rsp
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)
-ASM_PFX(GasketSnpThunkOpen):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(EmuSnpThunkOpen)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
-ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)
-ASM_PFX(GasketSnpThunkClose):
- pushq %rbp // stack frame is for the debugger
- movq %rsp, %rbp
-
- pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
- pushq %rdi
-
- movq %rcx, %rdi // Swizzle args
-
- call ASM_PFX(EmuSnpThunkClose)
-
- popq %rdi // restore state
- popq %rsi
- popq %rbp
- ret
-
-
+#------------------------------------------------------------------------------
+#
+# Manage differenced between UNIX ABI and EFI/Windows ABI
+#
+# EFI Arg passing: RCX, RDX, R8, R9
+# Callee allocates 32 bytes on stack to spill registers
+# UNIX Arg passing: RDI, RSI, RDX, RCX, R8, R9
+# RSI, RDI calle-save on EFI, scatch on UNIX callign
+#
+# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php
+#
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+#------------------------------------------------------------------------------
+
+//
+// Gaskets are EFI ABI to UNIX ABI calls
+// EFI ABI code will sub 40 (0x28) from %rsp before calling a function
+// This is the 32 (0x20) byte to spill registers and 8 bytes to align stack on 16 byte boundry.
+//
+ .text
+
+// 32 byte shadow to spill rcx-r9, 8 bytes to align stack on 16 byte boundry
+// Any call with 0 - 4 arguments allocates 40 bytes on the stack.
+// For more than 4 args you always have to increase in quanta of 16 so 5 or 6 args is 56,
+// 7 or 8 args is 72, and 9 or 10 args is 88
+
+
+
+ .text
+
+//
+// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)
+//
+
+
+
+
+ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)
+ASM_PFX(GasketSecWriteStdErr):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+
+ call ASM_PFX(SecWriteStdErr)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)
+ASM_PFX(GasketSecConfigStdIn):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ call ASM_PFX(SecConfigStdIn)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)
+ASM_PFX(GasketSecWriteStdOut):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+
+ call ASM_PFX(SecWriteStdOut)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)
+ASM_PFX(GasketSecReadStdIn):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+
+ call ASM_PFX(SecReadStdIn)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)
+ASM_PFX(GasketSecPollStdIn):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ call ASM_PFX(SecPollStdIn)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketSecMalloc)
+ASM_PFX(GasketSecMalloc):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(SecMalloc)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketSecValloc)
+ASM_PFX(GasketSecValloc):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(SecValloc)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketSecFree)
+ASM_PFX(GasketSecFree):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(SecFree)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecSetTimer)
+ASM_PFX(GasketSecSetTimer):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+
+ call ASM_PFX(SecSetTimer)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)
+ASM_PFX(GasketSecEnableInterrupt):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ call ASM_PFX(SecEnableInterrupt)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)
+ASM_PFX(GasketSecDisableInterrupt):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ call ASM_PFX(SecDisableInterrupt)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)
+ASM_PFX(GasketQueryPerformanceFrequency):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ call ASM_PFX(QueryPerformanceFrequency)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)
+ASM_PFX(GasketQueryPerformanceCounter):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ call ASM_PFX(QueryPerformanceCounter)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecSleep)
+ASM_PFX(GasketSecSleep):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(SecSleep)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)
+ASM_PFX(GasketSecCpuSleep):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ call ASM_PFX(SecCpuSleep)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecExit)
+ASM_PFX(GasketSecExit):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ movq %rcx, %rdi // Swizzle args
+ call ASM_PFX(SecExit) // Less to do as we will never return to EFI ABI world
+LDEAD_LOOP:
+ jmp LDEAD_LOOP // _exit should never return
+
+
+ASM_GLOBAL ASM_PFX(GasketSecGetTime)
+ASM_PFX(GasketSecGetTime):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+
+ call ASM_PFX(SecGetTime)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketSecSetTime)
+ASM_PFX(GasketSecSetTime):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+
+ call ASM_PFX(SecSetTime)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)
+ASM_PFX(GasketSecGetNextProtocol):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+ movq %r9, %rcx
+
+ call ASM_PFX(SecGetNextProtocol)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+// PPIs produced by SEC
+
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)
+ASM_PFX(GasketSecPeCoffGetEntryPoint):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+
+ call ASM_PFX(SecPeCoffGetEntryPoint)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)
+ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(SecPeCoffRelocateImageExtraAction)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)
+ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(SecPeCoffUnloadImageExtraAction)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)
+ASM_PFX(GasketSecEmuThunkAddress):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ call ASM_PFX(SecEmuThunkAddress)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+//
+// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
+//
+
+ASM_GLOBAL ASM_PFX(GasketX11Size)
+ASM_PFX(GasketX11Size):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+ movq %r9, %rcx
+
+ call ASM_PFX(X11Size)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11CheckKey)
+ASM_PFX(GasketX11CheckKey):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(X11CheckKey)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketX11GetKey)
+ASM_PFX(GasketX11GetKey):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+
+ call ASM_PFX(X11GetKey)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11KeySetState)
+ASM_PFX(GasketX11KeySetState):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+
+ call ASM_PFX(X11KeySetState)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)
+ASM_PFX(GasketX11RegisterKeyNotify):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+ movq %r9, %rcx
+
+ call ASM_PFX(X11RegisterKeyNotify)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11Blt)
+ASM_PFX(GasketX11Blt):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+ movq %r9, %rcx
+
+ call ASM_PFX(X11Blt)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)
+ASM_PFX(GasketX11CheckPointer):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(X11CheckPointer)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)
+ASM_PFX(GasketX11GetPointerState):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+
+ call ASM_PFX(X11GetPointerState)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)
+ASM_PFX(GasketX11GraphicsWindowOpen):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(X11GraphicsWindowOpen)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)
+ASM_PFX(GasketX11GraphicsWindowClose):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %r9, %rcx
+
+ call ASM_PFX(X11GraphicsWindowClose)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+// Pthreads
+
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)
+ASM_PFX(GasketPthreadMutexLock):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(PthreadMutexLock)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)
+ASM_PFX(GasketPthreadMutexUnLock):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(PthreadMutexUnLock)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)
+ASM_PFX(GasketPthreadMutexTryLock):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(PthreadMutexTryLock)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)
+ASM_PFX(GasketPthreadMutexInit):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+
+ call ASM_PFX(PthreadMutexInit)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)
+ASM_PFX(GasketPthreadMutexDestroy):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(PthreadMutexDestroy)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadCreate)
+ASM_PFX(GasketPthreadCreate):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+ movq %r9, %rcx
+
+ call ASM_PFX(PthreadCreate)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadExit)
+ASM_PFX(GasketPthreadExit):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(PthreadExit)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadSelf)
+ASM_PFX(GasketPthreadSelf):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+
+ call ASM_PFX(PthreadSelf)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadOpen)
+ASM_PFX(GasketPthreadOpen):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(PthreadOpen)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPthreadClose)
+ASM_PFX(GasketPthreadClose):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(PthreadClose)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+
+
+//
+// UNIX ABI to EFI ABI call
+//
+// UINTN
+// ReverseGasketUint64 (
+// void *Api,
+// UINTN Arg1
+// );
+ASM_GLOBAL ASM_PFX(ReverseGasketUint64)
+ASM_PFX(ReverseGasketUint64):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ movq %rdi, %rax // Swizzle args
+ movq %rsi, %rcx
+
+ subq $32, %rsp // 32-byte shadow space
+ call *%rax
+ addq $32, %rsp
+
+ popq %rbp
+ ret
+
+//
+// UNIX ABI to EFI ABI call
+//
+// UINTN
+// ReverseGasketUint64Uint64 (
+// void *Api,
+// UINTN Arg1
+// UINTN Arg2
+// );
+ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)
+ASM_PFX(ReverseGasketUint64Uint64):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ movq %rdi, %rax // Swizzle args
+ movq %rsi, %rcx
+
+ subq $32, %rsp // 32-byte shadow space
+ call *%rax
+ addq $32, %rsp
+
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)
+ASM_PFX(GasketSecUnixPeiAutoScan):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+
+ call ASM_PFX(SecUnixPeiAutoScan)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)
+ASM_PFX(GasketSecUnixFdAddress):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+ movq %r9, %rcx
+
+ call ASM_PFX(SecUnixFdAddress)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+// EmuIoThunk SimpleFileSystem
+
+ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)
+ASM_PFX(GasketPosixOpenVolume):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+ movq %r9, %rcx
+
+ call ASM_PFX(PosixOpenVolume)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)
+ASM_PFX(GasketPosixFileOpen):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+ movq %r9, %rcx
+ movq 48(%rbp), %r8
+
+ call ASM_PFX(PosixFileOpen)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)
+ASM_PFX(GasketPosixFileCLose):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(PosixFileCLose)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)
+ASM_PFX(GasketPosixFileDelete):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(PosixFileDelete)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileRead)
+ASM_PFX(GasketPosixFileRead):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+
+ call ASM_PFX(PosixFileRead)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)
+ASM_PFX(GasketPosixFileWrite):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+
+ call ASM_PFX(PosixFileWrite)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)
+ASM_PFX(GasketPosixFileSetPossition):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+
+ call ASM_PFX(PosixFileSetPossition)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)
+ASM_PFX(GasketPosixFileGetPossition):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+
+ call ASM_PFX(PosixFileGetPossition)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)
+ASM_PFX(GasketPosixFileGetInfo):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+ movq %r9, %rcx
+
+ call ASM_PFX(PosixFileGetInfo)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)
+ASM_PFX(GasketPosixFileSetInfo):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+ movq %r9, %rcx
+
+ call ASM_PFX(PosixFileSetInfo)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)
+ASM_PFX(GasketPosixFileFlush):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(PosixFileFlush)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)
+ASM_PFX(GasketPosixFileSystmeThunkOpen):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(PosixFileSystmeThunkOpen)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)
+ASM_PFX(GasketPosixFileSystmeThunkClose):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(PosixFileSystmeThunkClose)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)
+ASM_PFX(GasketEmuBlockIoReset):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+
+ call ASM_PFX(EmuBlockIoReset)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)
+ASM_PFX(GasketEmuBlockIoReadBlocks):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+ movq %r9, %rcx
+ movq 48(%rbp), %r8
+ movq 56(%rbp), %r9
+
+ call ASM_PFX(EmuBlockIoReadBlocks)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)
+ASM_PFX(GasketEmuBlockIoWriteBlocks):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+ movq %r9, %rcx
+ movq 48(%rbp), %r8
+ movq 56(%rbp), %r9
+
+ call ASM_PFX(EmuBlockIoWriteBlocks)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)
+ASM_PFX(GasketEmuBlockIoFlushBlocks):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+
+ call ASM_PFX(EmuBlockIoFlushBlocks)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)
+ASM_PFX(GasketEmuBlockIoCreateMapping):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+
+ call ASM_PFX(EmuBlockIoCreateMapping)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)
+ASM_PFX(GasketBlockIoThunkOpen):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(EmuBlockIoThunkOpen)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)
+ASM_PFX(GasketBlockIoThunkClose):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(EmuBlockIoThunkClose)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)
+ASM_PFX(GasketSnpCreateMapping):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+
+ call ASM_PFX(EmuSnpCreateMapping)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpStart)
+ASM_PFX(GasketSnpStart):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(EmuSnpStart)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpStop)
+ASM_PFX(GasketSnpStop):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(EmuSnpStop)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpInitialize)
+ASM_PFX(GasketSnpInitialize):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+
+ call ASM_PFX(EmuSnpInitialize)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpReset)
+ASM_PFX(GasketSnpReset):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+
+ call ASM_PFX(EmuSnpReset)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpShutdown)
+ASM_PFX(GasketSnpShutdown):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(EmuSnpShutdown)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)
+ASM_PFX(GasketSnpReceiveFilters):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+ movq %r9, %rcx
+ movq 48(%rbp), %r8
+ movq 56(%rbp), %r9
+
+ call ASM_PFX(EmuSnpReceiveFilters)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)
+ASM_PFX(GasketSnpStationAddress):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+
+ call ASM_PFX(EmuSnpStationAddress)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpStatistics)
+ASM_PFX(GasketSnpStatistics):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+ movq %r9, %rcx
+
+ call ASM_PFX(EmuSnpStatistics)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)
+ASM_PFX(GasketSnpMCastIpToMac):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+ movq %r9, %rcx
+
+ call ASM_PFX(EmuSnpMCastIpToMac)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpNvData)
+ASM_PFX(GasketSnpNvData):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+ movq %r9, %rcx
+ movq 48(%rbp), %r8
+
+ call ASM_PFX(EmuSnpNvData)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)
+ASM_PFX(GasketSnpGetStatus):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+
+ call ASM_PFX(EmuSnpGetStatus)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpTransmit)
+ASM_PFX(GasketSnpTransmit):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+ subq $16, %rsp // Allocate space for args on the stack
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+ movq %r9, %rcx
+ movq 48(%rbp), %r8
+ movq 56(%rbp), %r9
+ movq 64(%rbp), %rax
+ movq %rax, (%rsp)
+
+ call ASM_PFX(EmuSnpTransmit)
+ addq $16, %rsp
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpReceive)
+ASM_PFX(GasketSnpReceive):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+ subq $16, %rsp // Allocate space for args on the stack
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+ movq %rdx, %rsi
+ movq %r8, %rdx
+ movq %r9, %rcx
+ movq 48(%rbp), %r8
+ movq 56(%rbp), %r9
+ movq 64(%rbp), %rax
+ movq %rax, (%rsp)
+
+ call ASM_PFX(EmuSnpReceive)
+ addq $16, %rsp
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)
+ASM_PFX(GasketSnpThunkOpen):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(EmuSnpThunkOpen)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
+ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)
+ASM_PFX(GasketSnpThunkClose):
+ pushq %rbp // stack frame is for the debugger
+ movq %rsp, %rbp
+
+ pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
+ pushq %rdi
+
+ movq %rcx, %rdi // Swizzle args
+
+ call ASM_PFX(EmuSnpThunkClose)
+
+ popq %rdi // restore state
+ popq %rsi
+ popq %rbp
+ ret
+
+
diff --git a/EmulatorPkg/Unix/lldbefi.py b/EmulatorPkg/Unix/lldbefi.py
index 64549ce3ec..a130cbee5c 100755
--- a/EmulatorPkg/Unix/lldbefi.py
+++ b/EmulatorPkg/Unix/lldbefi.py
@@ -1,540 +1,540 @@
-#!/usr/bin/python
-
-#
-# Copyright 2014 Apple Inc. All righes reserved.
-#
-# This program and the accompanying materials
-# are licensed and made available under the terms and conditions of the BSD License
-# which accompanies this distribution. The full text of the license may be found at
-# http://opensource.org/licenses/bsd-license.php.
-# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-#
-
-import lldb
-import os
-import uuid
-import string
-import commands
-import optparse
-import shlex
-
-guid_dict = {}
-
-
-def EFI_GUID_TypeSummary (valobj,internal_dict):
- """ Type summary for EFI GUID, print C Name if known
- """
- # typedef struct {
- # UINT32 Data1;
- # UINT16 Data2;
- # UINT16 Data3;
- # UINT8 Data4[8];
- # } EFI_GUID;
- SBError = lldb.SBError()
-
- data1_val = valobj.GetChildMemberWithName('Data1')
- data1 = data1_val.GetValueAsUnsigned(0)
- data2_val = valobj.GetChildMemberWithName('Data2')
- data2 = data2_val.GetValueAsUnsigned(0)
- data3_val = valobj.GetChildMemberWithName('Data3')
- data3 = data3_val.GetValueAsUnsigned(0)
- str = "%x-%x-%x-" % (data1, data2, data3)
-
- data4_val = valobj.GetChildMemberWithName('Data4')
- for i in range (data4_val.num_children):
- if i == 2:
- str +='-'
- str += "%02x" % data4_val.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)
-
- return guid_dict.get (str.upper(), '')
-
-
-
-EFI_STATUS_Dict = {
- (0x8000000000000000 | 1): "Load Error",
- (0x8000000000000000 | 2): "Invalid Parameter",
- (0x8000000000000000 | 3): "Unsupported",
- (0x8000000000000000 | 4): "Bad Buffer Size",
- (0x8000000000000000 | 5): "Buffer Too Small",
- (0x8000000000000000 | 6): "Not Ready",
- (0x8000000000000000 | 7): "Device Error",
- (0x8000000000000000 | 8): "Write Protected",
- (0x8000000000000000 | 9): "Out of Resources",
- (0x8000000000000000 | 10): "Volume Corrupt",
- (0x8000000000000000 | 11): "Volume Full",
- (0x8000000000000000 | 12): "No Media",
- (0x8000000000000000 | 13): "Media changed",
- (0x8000000000000000 | 14): "Not Found",
- (0x8000000000000000 | 15): "Access Denied",
- (0x8000000000000000 | 16): "No Response",
- (0x8000000000000000 | 17): "No mapping",
- (0x8000000000000000 | 18): "Time out",
- (0x8000000000000000 | 19): "Not started",
- (0x8000000000000000 | 20): "Already started",
- (0x8000000000000000 | 21): "Aborted",
- (0x8000000000000000 | 22): "ICMP Error",
- (0x8000000000000000 | 23): "TFTP Error",
- (0x8000000000000000 | 24): "Protocol Error",
-
- 0 : "Success",
- 1 : "Warning Unknown Glyph",
- 2 : "Warning Delete Failure",
- 3 : "Warning Write Failure",
- 4 : "Warning Buffer Too Small",
-
- (0x80000000 | 1): "Load Error",
- (0x80000000 | 2): "Invalid Parameter",
- (0x80000000 | 3): "Unsupported",
- (0x80000000 | 4): "Bad Buffer Size",
- (0x80000000 | 5): "Buffer Too Small",
- (0x80000000 | 6): "Not Ready",
- (0x80000000 | 7): "Device Error",
- (0x80000000 | 8): "Write Protected",
- (0x80000000 | 9): "Out of Resources",
- (0x80000000 | 10): "Volume Corrupt",
- (0x80000000 | 11): "Volume Full",
- (0x80000000 | 12): "No Media",
- (0x80000000 | 13): "Media changed",
- (0x80000000 | 14): "Not Found",
- (0x80000000 | 15): "Access Denied",
- (0x80000000 | 16): "No Response",
- (0x80000000 | 17): "No mapping",
- (0x80000000 | 18): "Time out",
- (0x80000000 | 19): "Not started",
- (0x80000000 | 20): "Already started",
- (0x80000000 | 21): "Aborted",
- (0x80000000 | 22): "ICMP Error",
- (0x80000000 | 23): "TFTP Error",
- (0x80000000 | 24): "Protocol Error",
-}
-
-def EFI_STATUS_TypeSummary (valobj,internal_dict):
- #
- # Return summary string for EFI_STATUS from dictionary
- #
- Status = valobj.GetValueAsUnsigned(0)
- return EFI_STATUS_Dict.get (Status, '')
-
-
-def EFI_TPL_TypeSummary (valobj,internal_dict):
- #
- # Return TPL values
- #
-
- if valobj.TypeIsPointerType():
- return ""
-
- Tpl = valobj.GetValueAsUnsigned(0)
- if Tpl < 4:
- Str = "%d" % Tpl
- elif Tpl == 6:
- Str = "TPL_DRIVER (Obsolete Concept in edk2)"
- elif Tpl < 8:
- Str = "TPL_APPLICATION"
- if Tpl - 4 > 0:
- Str += " + " + "%d" % (Tpl - 4)
- elif Tpl < 16:
- Str = "TPL_CALLBACK"
- if Tpl - 8 > 0:
- Str += " + " + "%d" % (Tpl - 4)
- elif Tpl < 31:
- Str = "TPL_NOTIFY"
- if Tpl - 16 > 0:
- Str += " + " + "%d" % (Tpl - 4)
- elif Tpl == 31:
- Str = "TPL_HIGH_LEVEL"
- else:
- Str = "Invalid TPL"
-
- return Str
-
-
-def CHAR16_TypeSummary (valobj,internal_dict):
- #
- # Display EFI CHAR16 'unsigned short' as string
- #
- SBError = lldb.SBError()
- Str = ''
- if valobj.TypeIsPointerType():
- if valobj.GetValueAsUnsigned () == 0:
- return "NULL"
-
- # CHAR16 * max string size 1024
- for i in range (1024):
- Char = valobj.GetPointeeData(i,1).GetUnsignedInt16(SBError, 0)
- if SBError.fail or Char == 0:
- break
- Str += unichr (Char)
- Str = 'L"' + Str + '"'
- return Str.encode ('utf-8', 'replace')
-
- if valobj.num_children == 0:
- # CHAR16
- if chr (valobj.unsigned) in string.printable:
- Str = "L'" + unichr (valobj.unsigned) + "'"
- return Str.encode ('utf-8', 'replace')
- else:
- # CHAR16 []
- for i in range (valobj.num_children):
- Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt16(SBError, 0)
- if Char == 0:
- break
- Str += unichr (Char)
- Str = 'L"' + Str + '"'
- return Str.encode ('utf-8', 'replace')
-
- return Str
-
-def CHAR8_TypeSummary (valobj,internal_dict):
- #
- # Display EFI CHAR8 'signed char' as string
- # unichr() is used as a junk string can produce an error message like this:
- # UnicodeEncodeError: 'ascii' codec can't encode character u'\x90' in position 1: ordinal not in range(128)
- #
- SBError = lldb.SBError()
- Str = ''
- if valobj.TypeIsPointerType():
- if valobj.GetValueAsUnsigned () == 0:
- return "NULL"
-
- # CHAR8 * max string size 1024
- for i in range (1024):
- Char = valobj.GetPointeeData(i,1).GetUnsignedInt8(SBError, 0)
- if SBError.fail or Char == 0:
- break
- Str += unichr (Char)
- Str = '"' + Str + '"'
- return Str.encode ('utf-8', 'replace')
-
- if valobj.num_children == 0:
- # CHAR8
- if chr (valobj.unsigned) in string.printable:
- Str = '"' + unichr (valobj.unsigned) + '"'
- return Str.encode ('utf-8', 'replace')
- else:
- # CHAR8 []
- for i in range (valobj.num_children):
- Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)
- if Char == 0:
- break
- Str += unichr (Char)
- Str = '"' + Str + '"'
- return Str.encode ('utf-8', 'replace')
-
- return Str
-
-device_path_dict = {
- (0x01, 0x01): "PCI_DEVICE_PATH",
- (0x01, 0x02): "PCCARD_DEVICE_PATH",
- (0x01, 0x03): "MEMMAP_DEVICE_PATH",
- (0x01, 0x04): "VENDOR_DEVICE_PATH",
- (0x01, 0x05): "CONTROLLER_DEVICE_PATH",
- (0x02, 0x01): "ACPI_HID_DEVICE_PATH",
- (0x02, 0x02): "ACPI_EXTENDED_HID_DEVICE_PATH",
- (0x02, 0x03): "ACPI_ADR_DEVICE_PATH",
- (0x03, 0x01): "ATAPI_DEVICE_PATH",
- (0x03, 0x12): "SATA_DEVICE_PATH",
- (0x03, 0x02): "SCSI_DEVICE_PATH",
- (0x03, 0x03): "FIBRECHANNEL_DEVICE_PATH",
- (0x03, 0x04): "F1394_DEVICE_PATH",
- (0x03, 0x05): "USB_DEVICE_PATH",
- (0x03, 0x0f): "USB_CLASS_DEVICE_PATH",
- (0x03, 0x10): "FW_SBP2_UNIT_LUN_DEVICE_PATH",
- (0x03, 0x11): "DEVICE_LOGICAL_UNIT_DEVICE_PATH",
- (0x03, 0x06): "I2O_DEVICE_PATH",
- (0x03, 0x0b): "MAC_ADDR_DEVICE_PATH",
- (0x03, 0x0c): "IPv4_DEVICE_PATH",
- (0x03, 0x09): "INFINIBAND_DEVICE_PATH",
- (0x03, 0x0e): "UART_DEVICE_PATH",
- (0x03, 0x0a): "VENDOR_DEVICE_PATH",
- (0x03, 0x13): "ISCSI_DEVICE_PATH",
- (0x04, 0x01): "HARDDRIVE_DEVICE_PATH",
- (0x04, 0x02): "CDROM_DEVICE_PATH",
- (0x04, 0x03): "VENDOR_DEVICE_PATH",
- (0x04, 0x04): "FILEPATH_DEVICE_PATH",
- (0x04, 0x05): "MEDIA_PROTOCOL_DEVICE_PATH",
- (0x05, 0x01): "BBS_BBS_DEVICE_PATH",
- (0x7F, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",
- (0xFF, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",
-}
-
-def EFI_DEVICE_PATH_PROTOCOL_TypeSummary (valobj,internal_dict):
- #
- #
- #
- if valobj.TypeIsPointerType():
- # EFI_DEVICE_PATH_PROTOCOL *
- return ""
-
- Str = ""
- if valobj.num_children == 3:
- # EFI_DEVICE_PATH_PROTOCOL
- Type = valobj.GetChildMemberWithName('Type').unsigned
- SubType = valobj.GetChildMemberWithName('SubType').unsigned
- if (Type, SubType) in device_path_dict:
- TypeStr = device_path_dict[Type, SubType]
- else:
- TypeStr = ""
-
- LenLow = valobj.GetChildMemberWithName('Length').GetChildAtIndex(0).unsigned
- LenHigh = valobj.GetChildMemberWithName('Length').GetChildAtIndex(1).unsigned
- Len = LenLow + (LenHigh >> 8)
-
- Address = long ("%d" % valobj.addr)
- if (Address == lldb.LLDB_INVALID_ADDRESS):
- # Need to reserach this, it seems to be the nested struct case
- ExprStr = ""
- elif (Type & 0x7f == 0x7f):
- ExprStr = "End Device Path" if SubType == 0xff else "End This Instance"
- else:
- ExprStr = "expr *(%s *)0x%08x" % (TypeStr, Address)
-
- Str = " {\n"
- Str += " (UINT8) Type = 0x%02x // %s\n" % (Type, "END" if (Type & 0x7f == 0x7f) else "")
- Str += " (UINT8) SubType = 0x%02x // %s\n" % (SubType, ExprStr)
- Str += " (UINT8 [2]) Length = { // 0x%04x (%d) bytes\n" % (Len, Len)
- Str += " (UINT8) [0] = 0x%02x\n" % LenLow
- Str += " (UINT8) [1] = 0x%02x\n" % LenHigh
- Str += " }\n"
- if (Type & 0x7f == 0x7f) and (SubType == 0xff):
- pass
- elif ExprStr != "":
- NextNode = Address + Len
- Str += "// Next node 'expr *(EFI_DEVICE_PATH_PROTOCOL *)0x%08x'\n" % NextNode
-
- return Str
-
-
-
-def TypePrintFormating(debugger):
- #
- # Set the default print formating for EFI types in lldb.
- # seems lldb defaults to decimal.
- #
- category = debugger.GetDefaultCategory()
- FormatBool = lldb.SBTypeFormat(lldb.eFormatBoolean)
- category.AddTypeFormat(lldb.SBTypeNameSpecifier("BOOLEAN"), FormatBool)
-
- FormatHex = lldb.SBTypeFormat(lldb.eFormatHex)
- category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT64"), FormatHex)
- category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT64"), FormatHex)
- category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT32"), FormatHex)
- category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT32"), FormatHex)
- category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT16"), FormatHex)
- category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT16"), FormatHex)
- category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT8"), FormatHex)
- category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT8"), FormatHex)
- category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINTN"), FormatHex)
- category.AddTypeFormat(lldb.SBTypeNameSpecifier("INTN"), FormatHex)
- category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR8"), FormatHex)
- category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR16"), FormatHex)
-
- category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_PHYSICAL_ADDRESS"), FormatHex)
- category.AddTypeFormat(lldb.SBTypeNameSpecifier("PHYSICAL_ADDRESS"), FormatHex)
- category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_STATUS"), FormatHex)
- category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_TPL"), FormatHex)
- category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_LBA"), FormatHex)
- category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_BOOT_MODE"), FormatHex)
- category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_FV_FILETYPE"), FormatHex)
-
- #
- # Smart type printing for EFI
- #
- debugger.HandleCommand("type summary add EFI_GUID --python-function lldbefi.EFI_GUID_TypeSummary")
- debugger.HandleCommand("type summary add EFI_STATUS --python-function lldbefi.EFI_STATUS_TypeSummary")
- debugger.HandleCommand("type summary add EFI_TPL --python-function lldbefi.EFI_TPL_TypeSummary")
- debugger.HandleCommand("type summary add EFI_DEVICE_PATH_PROTOCOL --python-function lldbefi.EFI_DEVICE_PATH_PROTOCOL_TypeSummary")
-
- debugger.HandleCommand("type summary add CHAR16 --python-function lldbefi.CHAR16_TypeSummary")
- debugger.HandleCommand('type summary add --regex "CHAR16 \[[0-9]+\]" --python-function lldbefi.CHAR16_TypeSummary')
- debugger.HandleCommand("type summary add CHAR8 --python-function lldbefi.CHAR8_TypeSummary")
- debugger.HandleCommand('type summary add --regex "CHAR8 \[[0-9]+\]" --python-function lldbefi.CHAR8_TypeSummary')
-
-
-gEmulatorBreakWorkaroundNeeded = True
-
-def LoadEmulatorEfiSymbols(frame, bp_loc , internal_dict):
- #
- # This is an lldb breakpoint script, and assumes the breakpoint is on a
- # function with the same prototype as SecGdbScriptBreak(). The
- # argument names are important as lldb looks them up.
- #
- # VOID
- # SecGdbScriptBreak (
- # char *FileName,
- # int FileNameLength,
- # long unsigned int LoadAddress,
- # int AddSymbolFlag
- # )
- # {
- # return;
- # }
- #
- # When the emulator loads a PE/COFF image, it calls the stub function with
- # the filename of the symbol file, the length of the FileName, the
- # load address and a flag to indicate if this is a load or unload operation
- #
- global gEmulatorBreakWorkaroundNeeded
-
- if gEmulatorBreakWorkaroundNeeded:
- # turn off lldb debug prints on SIGALRM (EFI timer tick)
- frame.thread.process.target.debugger.HandleCommand("process handle SIGALRM -n false")
- gEmulatorBreakWorkaroundNeeded = False
-
- # Convert C string to Python string
- Error = lldb.SBError()
- FileNamePtr = frame.FindVariable ("FileName").GetValueAsUnsigned()
- FileNameLen = frame.FindVariable ("FileNameLength").GetValueAsUnsigned()
- FileName = frame.thread.process.ReadCStringFromMemory (FileNamePtr, FileNameLen, Error)
- if not Error.Success():
- print "!ReadCStringFromMemory() did not find a %d byte C string at %x" % (FileNameLen, FileNamePtr)
- # make breakpoint command contiue
- frame.GetThread().GetProcess().Continue()
-
- debugger = frame.thread.process.target.debugger
- if frame.FindVariable ("AddSymbolFlag").GetValueAsUnsigned() == 1:
- LoadAddress = frame.FindVariable ("LoadAddress").GetValueAsUnsigned()
-
- debugger.HandleCommand ("target modules add %s" % FileName)
- print "target modules load --slid 0x%x %s" % (LoadAddress, FileName)
- debugger.HandleCommand ("target modules load --slide 0x%x --file %s" % (LoadAddress, FileName))
- else:
- target = debugger.GetSelectedTarget()
- for SBModule in target.module_iter():
- ModuleName = SBModule.GetFileSpec().GetDirectory() + '/'
- ModuleName += SBModule.GetFileSpec().GetFilename()
- if FileName == ModuleName or FileName == SBModule.GetFileSpec().GetFilename():
- target.ClearModuleLoadAddress (SBModule)
- if not target.RemoveModule (SBModule):
- print "!lldb.target.RemoveModule (%s) FAILED" % SBModule
-
- # make breakpoint command contiue
- frame.thread.process.Continue()
-
-def GuidToCStructStr (guid, Name=False):
- #
- # Convert a 16-byte bytesarry (or bytearray compat object) to C guid string
- # { 0xB402621F, 0xA940, 0x1E4A, { 0x86, 0x6B, 0x4D, 0xC9, 0x16, 0x2B, 0x34, 0x7C } }
- #
- # Name=True means lookup name in GuidNameDict and us it if you find it
- #
-
- if not isinstance (guid, bytearray):
- # convert guid object to UUID, and UUID to bytearray
- Uuid = uuid.UUID(guid)
- guid = bytearray (Uuid.bytes_le)
-
- return "{ 0x%02.2X%02.2X%02.2X%02.2X, 0x%02.2X%02.2X, 0x%02.2X%02.2X, { 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X } }" % \
- (guid[3], guid[2], guid[1], guid[0], guid[5], guid[4], guid[7], guid[6], guid[8], guid[9], guid[10], guid[11], guid[12], guid[13], guid[14], guid[15])
-
-def ParseGuidString(GuidStr):
- #
- # Error check and convert C Guid init to string
- # ParseGuidString("49152E77-1ADA-4764-B7A2-7AFEFED95E8B")
- # ParseGuidString("{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7, 0x8A, 0x35, 0x46, 0xD1 } }")
- #
-
- if "{" in GuidStr :
- # convert C form "{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7, 0x8A, 0x35, 0x46, 0xD1 } }"
- # to string form BA24B391-73FD-C54C-9EAF-0CA78A3546D1
- # make a list of Hex numbers like: ['0xBA24B391', '0x73FD', '0xC54C', '0x9E', '0xAF', '0x0C', '0xA7', '0x8A', '0x35', '0x46', '0xD1']
- Hex = ''.join(x for x in GuidStr if x not in '{,}').split()
- Str = "%08X-%04X-%04X-%02.2X%02.2X-%02.2X%02.2X%02.2X%02.2X%02.2X%02.2X" % \
- (int(Hex[0], 0), int(Hex[1], 0), int(Hex[2], 0), int(Hex[3], 0), int(Hex[4], 0), \
- int(Hex[5], 0), int(Hex[6], 0), int(Hex[7], 0), int(Hex[8], 0), int(Hex[9], 0), int(Hex[10], 0))
- elif GuidStr.count('-') == 4:
- # validate "49152E77-1ADA-4764-B7A2-7AFEFED95E8B" form
- Check = "%s" % str(uuid.UUID(GuidStr)).upper()
- if GuidStr.upper() == Check:
- Str = GuidStr.upper()
- else:
- Ste = ""
- else:
- Str = ""
-
- return Str
-
-
-def create_guid_options():
- usage = "usage: %prog [data]"
- description='''lookup EFI_GUID by CName, C struct, or GUID string and print out all three.
- '''
- parser = optparse.OptionParser(description=description, prog='guid',usage=usage)
- return parser
-
-def efi_guid_command(debugger, command, result, dict):
- # Use the Shell Lexer to properly parse up command options just like a
- # shell would
- command_args = shlex.split(command)
- parser = create_guid_options()
- try:
- (options, args) = parser.parse_args(command_args)
- if len(args) >= 1:
- if args[0] == "{":
- # caller forgot to quote the string"
- # mark arg[0] a string containing all args[n]
- args[0] = ' '.join(args)
- GuidStr = ParseGuidString (args[0])
- if GuidStr == "":
- # return Key of GuidNameDict for value args[0]
- GuidStr = [Key for Key, Value in guid_dict.iteritems() if Value == args[0]][0]
- GuidStr = GuidStr.upper()
- except:
- # if you don't handle exceptions, passing an incorrect argument to the OptionParser will cause LLDB to exit
- # (courtesy of OptParse dealing with argument errors by throwing SystemExit)
- result.SetError ("option parsing failed")
- return
-
-
- if len(args) >= 1:
- if GuidStr in guid_dict:
- print "%s = %s" % (guid_dict[GuidStr], GuidStr)
- print "%s = %s" % (guid_dict[GuidStr], GuidToCStructStr (GuidStr))
- else:
- print GuidStr
- else:
- # dump entire dictionary
- width = max(len(v) for k,v in guid_dict.iteritems())
- for value in sorted(guid_dict, key=guid_dict.get):
- print '%-*s %s %s' % (width, guid_dict[value], value, GuidToCStructStr(value))
-
- return
-
-
-#
-########## Code that runs when this script is imported into LLDB ###########
-#
-def __lldb_init_module (debugger, internal_dict):
- # This initializer is being run from LLDB in the embedded command interpreter
- # Make the options so we can generate the help text for the new LLDB
- # command line command prior to registering it with LLDB below
-
- global guid_dict
-
- # Source Guid.xref file if we can find it
- inputfile = os.getcwd()
- inputfile += os.sep + os.pardir + os.sep + 'FV' + os.sep + 'Guid.xref'
- with open(inputfile) as f:
- for line in f:
- data = line.split(' ')
- if len(data) >= 2:
- guid_dict[data[0].upper()] = data[1].strip('\n')
-
- # init EFI specific type formaters
- TypePrintFormating (debugger)
-
-
- # add guid command
- parser = create_guid_options()
- efi_guid_command.__doc__ = parser.format_help()
- debugger.HandleCommand('command script add -f lldbefi.efi_guid_command guid')
-
-
- Target = debugger.GetTargetAtIndex(0)
- if Target:
- Breakpoint = Target.BreakpointCreateByName('SecGdbScriptBreak')
- if Breakpoint.GetNumLocations() == 1:
- # Set the emulator breakpoints, if we are in the emulator
- debugger.HandleCommand("breakpoint command add -s python -F lldbefi.LoadEmulatorEfiSymbols {id}".format(id=Breakpoint.GetID()))
- print 'Type r to run emulator. SecLldbScriptBreak armed. EFI modules should now get source level debugging in the emulator.'
+#!/usr/bin/python
+
+#
+# Copyright 2014 Apple Inc. All righes reserved.
+#
+# This program and the accompanying materials
+# are licensed and made available under the terms and conditions of the BSD License
+# which accompanies this distribution. The full text of the license may be found at
+# http://opensource.org/licenses/bsd-license.php.
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+#
+
+import lldb
+import os
+import uuid
+import string
+import commands
+import optparse
+import shlex
+
+guid_dict = {}
+
+
+def EFI_GUID_TypeSummary (valobj,internal_dict):
+ """ Type summary for EFI GUID, print C Name if known
+ """
+ # typedef struct {
+ # UINT32 Data1;
+ # UINT16 Data2;
+ # UINT16 Data3;
+ # UINT8 Data4[8];
+ # } EFI_GUID;
+ SBError = lldb.SBError()
+
+ data1_val = valobj.GetChildMemberWithName('Data1')
+ data1 = data1_val.GetValueAsUnsigned(0)
+ data2_val = valobj.GetChildMemberWithName('Data2')
+ data2 = data2_val.GetValueAsUnsigned(0)
+ data3_val = valobj.GetChildMemberWithName('Data3')
+ data3 = data3_val.GetValueAsUnsigned(0)
+ str = "%x-%x-%x-" % (data1, data2, data3)
+
+ data4_val = valobj.GetChildMemberWithName('Data4')
+ for i in range (data4_val.num_children):
+ if i == 2:
+ str +='-'
+ str += "%02x" % data4_val.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)
+
+ return guid_dict.get (str.upper(), '')
+
+
+
+EFI_STATUS_Dict = {
+ (0x8000000000000000 | 1): "Load Error",
+ (0x8000000000000000 | 2): "Invalid Parameter",
+ (0x8000000000000000 | 3): "Unsupported",
+ (0x8000000000000000 | 4): "Bad Buffer Size",
+ (0x8000000000000000 | 5): "Buffer Too Small",
+ (0x8000000000000000 | 6): "Not Ready",
+ (0x8000000000000000 | 7): "Device Error",
+ (0x8000000000000000 | 8): "Write Protected",
+ (0x8000000000000000 | 9): "Out of Resources",
+ (0x8000000000000000 | 10): "Volume Corrupt",
+ (0x8000000000000000 | 11): "Volume Full",
+ (0x8000000000000000 | 12): "No Media",
+ (0x8000000000000000 | 13): "Media changed",
+ (0x8000000000000000 | 14): "Not Found",
+ (0x8000000000000000 | 15): "Access Denied",
+ (0x8000000000000000 | 16): "No Response",
+ (0x8000000000000000 | 17): "No mapping",
+ (0x8000000000000000 | 18): "Time out",
+ (0x8000000000000000 | 19): "Not started",
+ (0x8000000000000000 | 20): "Already started",
+ (0x8000000000000000 | 21): "Aborted",
+ (0x8000000000000000 | 22): "ICMP Error",
+ (0x8000000000000000 | 23): "TFTP Error",
+ (0x8000000000000000 | 24): "Protocol Error",
+
+ 0 : "Success",
+ 1 : "Warning Unknown Glyph",
+ 2 : "Warning Delete Failure",
+ 3 : "Warning Write Failure",
+ 4 : "Warning Buffer Too Small",
+
+ (0x80000000 | 1): "Load Error",
+ (0x80000000 | 2): "Invalid Parameter",
+ (0x80000000 | 3): "Unsupported",
+ (0x80000000 | 4): "Bad Buffer Size",
+ (0x80000000 | 5): "Buffer Too Small",
+ (0x80000000 | 6): "Not Ready",
+ (0x80000000 | 7): "Device Error",
+ (0x80000000 | 8): "Write Protected",
+ (0x80000000 | 9): "Out of Resources",
+ (0x80000000 | 10): "Volume Corrupt",
+ (0x80000000 | 11): "Volume Full",
+ (0x80000000 | 12): "No Media",
+ (0x80000000 | 13): "Media changed",
+ (0x80000000 | 14): "Not Found",
+ (0x80000000 | 15): "Access Denied",
+ (0x80000000 | 16): "No Response",
+ (0x80000000 | 17): "No mapping",
+ (0x80000000 | 18): "Time out",
+ (0x80000000 | 19): "Not started",
+ (0x80000000 | 20): "Already started",
+ (0x80000000 | 21): "Aborted",
+ (0x80000000 | 22): "ICMP Error",
+ (0x80000000 | 23): "TFTP Error",
+ (0x80000000 | 24): "Protocol Error",
+}
+
+def EFI_STATUS_TypeSummary (valobj,internal_dict):
+ #
+ # Return summary string for EFI_STATUS from dictionary
+ #
+ Status = valobj.GetValueAsUnsigned(0)
+ return EFI_STATUS_Dict.get (Status, '')
+
+
+def EFI_TPL_TypeSummary (valobj,internal_dict):
+ #
+ # Return TPL values
+ #
+
+ if valobj.TypeIsPointerType():
+ return ""
+
+ Tpl = valobj.GetValueAsUnsigned(0)
+ if Tpl < 4:
+ Str = "%d" % Tpl
+ elif Tpl == 6:
+ Str = "TPL_DRIVER (Obsolete Concept in edk2)"
+ elif Tpl < 8:
+ Str = "TPL_APPLICATION"
+ if Tpl - 4 > 0:
+ Str += " + " + "%d" % (Tpl - 4)
+ elif Tpl < 16:
+ Str = "TPL_CALLBACK"
+ if Tpl - 8 > 0:
+ Str += " + " + "%d" % (Tpl - 4)
+ elif Tpl < 31:
+ Str = "TPL_NOTIFY"
+ if Tpl - 16 > 0:
+ Str += " + " + "%d" % (Tpl - 4)
+ elif Tpl == 31:
+ Str = "TPL_HIGH_LEVEL"
+ else:
+ Str = "Invalid TPL"
+
+ return Str
+
+
+def CHAR16_TypeSummary (valobj,internal_dict):
+ #
+ # Display EFI CHAR16 'unsigned short' as string
+ #
+ SBError = lldb.SBError()
+ Str = ''
+ if valobj.TypeIsPointerType():
+ if valobj.GetValueAsUnsigned () == 0:
+ return "NULL"
+
+ # CHAR16 * max string size 1024
+ for i in range (1024):
+ Char = valobj.GetPointeeData(i,1).GetUnsignedInt16(SBError, 0)
+ if SBError.fail or Char == 0:
+ break
+ Str += unichr (Char)
+ Str = 'L"' + Str + '"'
+ return Str.encode ('utf-8', 'replace')
+
+ if valobj.num_children == 0:
+ # CHAR16
+ if chr (valobj.unsigned) in string.printable:
+ Str = "L'" + unichr (valobj.unsigned) + "'"
+ return Str.encode ('utf-8', 'replace')
+ else:
+ # CHAR16 []
+ for i in range (valobj.num_children):
+ Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt16(SBError, 0)
+ if Char == 0:
+ break
+ Str += unichr (Char)
+ Str = 'L"' + Str + '"'
+ return Str.encode ('utf-8', 'replace')
+
+ return Str
+
+def CHAR8_TypeSummary (valobj,internal_dict):
+ #
+ # Display EFI CHAR8 'signed char' as string
+ # unichr() is used as a junk string can produce an error message like this:
+ # UnicodeEncodeError: 'ascii' codec can't encode character u'\x90' in position 1: ordinal not in range(128)
+ #
+ SBError = lldb.SBError()
+ Str = ''
+ if valobj.TypeIsPointerType():
+ if valobj.GetValueAsUnsigned () == 0:
+ return "NULL"
+
+ # CHAR8 * max string size 1024
+ for i in range (1024):
+ Char = valobj.GetPointeeData(i,1).GetUnsignedInt8(SBError, 0)
+ if SBError.fail or Char == 0:
+ break
+ Str += unichr (Char)
+ Str = '"' + Str + '"'
+ return Str.encode ('utf-8', 'replace')
+
+ if valobj.num_children == 0:
+ # CHAR8
+ if chr (valobj.unsigned) in string.printable:
+ Str = '"' + unichr (valobj.unsigned) + '"'
+ return Str.encode ('utf-8', 'replace')
+ else:
+ # CHAR8 []
+ for i in range (valobj.num_children):
+ Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)
+ if Char == 0:
+ break
+ Str += unichr (Char)
+ Str = '"' + Str + '"'
+ return Str.encode ('utf-8', 'replace')
+
+ return Str
+
+device_path_dict = {
+ (0x01, 0x01): "PCI_DEVICE_PATH",
+ (0x01, 0x02): "PCCARD_DEVICE_PATH",
+ (0x01, 0x03): "MEMMAP_DEVICE_PATH",
+ (0x01, 0x04): "VENDOR_DEVICE_PATH",
+ (0x01, 0x05): "CONTROLLER_DEVICE_PATH",
+ (0x02, 0x01): "ACPI_HID_DEVICE_PATH",
+ (0x02, 0x02): "ACPI_EXTENDED_HID_DEVICE_PATH",
+ (0x02, 0x03): "ACPI_ADR_DEVICE_PATH",
+ (0x03, 0x01): "ATAPI_DEVICE_PATH",
+ (0x03, 0x12): "SATA_DEVICE_PATH",
+ (0x03, 0x02): "SCSI_DEVICE_PATH",
+ (0x03, 0x03): "FIBRECHANNEL_DEVICE_PATH",
+ (0x03, 0x04): "F1394_DEVICE_PATH",
+ (0x03, 0x05): "USB_DEVICE_PATH",
+ (0x03, 0x0f): "USB_CLASS_DEVICE_PATH",
+ (0x03, 0x10): "FW_SBP2_UNIT_LUN_DEVICE_PATH",
+ (0x03, 0x11): "DEVICE_LOGICAL_UNIT_DEVICE_PATH",
+ (0x03, 0x06): "I2O_DEVICE_PATH",
+ (0x03, 0x0b): "MAC_ADDR_DEVICE_PATH",
+ (0x03, 0x0c): "IPv4_DEVICE_PATH",
+ (0x03, 0x09): "INFINIBAND_DEVICE_PATH",
+ (0x03, 0x0e): "UART_DEVICE_PATH",
+ (0x03, 0x0a): "VENDOR_DEVICE_PATH",
+ (0x03, 0x13): "ISCSI_DEVICE_PATH",
+ (0x04, 0x01): "HARDDRIVE_DEVICE_PATH",
+ (0x04, 0x02): "CDROM_DEVICE_PATH",
+ (0x04, 0x03): "VENDOR_DEVICE_PATH",
+ (0x04, 0x04): "FILEPATH_DEVICE_PATH",
+ (0x04, 0x05): "MEDIA_PROTOCOL_DEVICE_PATH",
+ (0x05, 0x01): "BBS_BBS_DEVICE_PATH",
+ (0x7F, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",
+ (0xFF, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",
+}
+
+def EFI_DEVICE_PATH_PROTOCOL_TypeSummary (valobj,internal_dict):
+ #
+ #
+ #
+ if valobj.TypeIsPointerType():
+ # EFI_DEVICE_PATH_PROTOCOL *
+ return ""
+
+ Str = ""
+ if valobj.num_children == 3:
+ # EFI_DEVICE_PATH_PROTOCOL
+ Type = valobj.GetChildMemberWithName('Type').unsigned
+ SubType = valobj.GetChildMemberWithName('SubType').unsigned
+ if (Type, SubType) in device_path_dict:
+ TypeStr = device_path_dict[Type, SubType]
+ else:
+ TypeStr = ""
+
+ LenLow = valobj.GetChildMemberWithName('Length').GetChildAtIndex(0).unsigned
+ LenHigh = valobj.GetChildMemberWithName('Length').GetChildAtIndex(1).unsigned
+ Len = LenLow + (LenHigh >> 8)
+
+ Address = long ("%d" % valobj.addr)
+ if (Address == lldb.LLDB_INVALID_ADDRESS):
+ # Need to reserach this, it seems to be the nested struct case
+ ExprStr = ""
+ elif (Type & 0x7f == 0x7f):
+ ExprStr = "End Device Path" if SubType == 0xff else "End This Instance"
+ else:
+ ExprStr = "expr *(%s *)0x%08x" % (TypeStr, Address)
+
+ Str = " {\n"
+ Str += " (UINT8) Type = 0x%02x // %s\n" % (Type, "END" if (Type & 0x7f == 0x7f) else "")
+ Str += " (UINT8) SubType = 0x%02x // %s\n" % (SubType, ExprStr)
+ Str += " (UINT8 [2]) Length = { // 0x%04x (%d) bytes\n" % (Len, Len)
+ Str += " (UINT8) [0] = 0x%02x\n" % LenLow
+ Str += " (UINT8) [1] = 0x%02x\n" % LenHigh
+ Str += " }\n"
+ if (Type & 0x7f == 0x7f) and (SubType == 0xff):
+ pass
+ elif ExprStr != "":
+ NextNode = Address + Len
+ Str += "// Next node 'expr *(EFI_DEVICE_PATH_PROTOCOL *)0x%08x'\n" % NextNode
+
+ return Str
+
+
+
+def TypePrintFormating(debugger):
+ #
+ # Set the default print formating for EFI types in lldb.
+ # seems lldb defaults to decimal.
+ #
+ category = debugger.GetDefaultCategory()
+ FormatBool = lldb.SBTypeFormat(lldb.eFormatBoolean)
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("BOOLEAN"), FormatBool)
+
+ FormatHex = lldb.SBTypeFormat(lldb.eFormatHex)
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT64"), FormatHex)
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT64"), FormatHex)
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT32"), FormatHex)
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT32"), FormatHex)
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT16"), FormatHex)
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT16"), FormatHex)
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT8"), FormatHex)
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT8"), FormatHex)
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINTN"), FormatHex)
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("INTN"), FormatHex)
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR8"), FormatHex)
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR16"), FormatHex)
+
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_PHYSICAL_ADDRESS"), FormatHex)
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("PHYSICAL_ADDRESS"), FormatHex)
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_STATUS"), FormatHex)
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_TPL"), FormatHex)
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_LBA"), FormatHex)
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_BOOT_MODE"), FormatHex)
+ category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_FV_FILETYPE"), FormatHex)
+
+ #
+ # Smart type printing for EFI
+ #
+ debugger.HandleCommand("type summary add EFI_GUID --python-function lldbefi.EFI_GUID_TypeSummary")
+ debugger.HandleCommand("type summary add EFI_STATUS --python-function lldbefi.EFI_STATUS_TypeSummary")
+ debugger.HandleCommand("type summary add EFI_TPL --python-function lldbefi.EFI_TPL_TypeSummary")
+ debugger.HandleCommand("type summary add EFI_DEVICE_PATH_PROTOCOL --python-function lldbefi.EFI_DEVICE_PATH_PROTOCOL_TypeSummary")
+
+ debugger.HandleCommand("type summary add CHAR16 --python-function lldbefi.CHAR16_TypeSummary")
+ debugger.HandleCommand('type summary add --regex "CHAR16 \[[0-9]+\]" --python-function lldbefi.CHAR16_TypeSummary')
+ debugger.HandleCommand("type summary add CHAR8 --python-function lldbefi.CHAR8_TypeSummary")
+ debugger.HandleCommand('type summary add --regex "CHAR8 \[[0-9]+\]" --python-function lldbefi.CHAR8_TypeSummary')
+
+
+gEmulatorBreakWorkaroundNeeded = True
+
+def LoadEmulatorEfiSymbols(frame, bp_loc , internal_dict):
+ #
+ # This is an lldb breakpoint script, and assumes the breakpoint is on a
+ # function with the same prototype as SecGdbScriptBreak(). The
+ # argument names are important as lldb looks them up.
+ #
+ # VOID
+ # SecGdbScriptBreak (
+ # char *FileName,
+ # int FileNameLength,
+ # long unsigned int LoadAddress,
+ # int AddSymbolFlag
+ # )
+ # {
+ # return;
+ # }
+ #
+ # When the emulator loads a PE/COFF image, it calls the stub function with
+ # the filename of the symbol file, the length of the FileName, the
+ # load address and a flag to indicate if this is a load or unload operation
+ #
+ global gEmulatorBreakWorkaroundNeeded
+
+ if gEmulatorBreakWorkaroundNeeded:
+ # turn off lldb debug prints on SIGALRM (EFI timer tick)
+ frame.thread.process.target.debugger.HandleCommand("process handle SIGALRM -n false")
+ gEmulatorBreakWorkaroundNeeded = False
+
+ # Convert C string to Python string
+ Error = lldb.SBError()
+ FileNamePtr = frame.FindVariable ("FileName").GetValueAsUnsigned()
+ FileNameLen = frame.FindVariable ("FileNameLength").GetValueAsUnsigned()
+ FileName = frame.thread.process.ReadCStringFromMemory (FileNamePtr, FileNameLen, Error)
+ if not Error.Success():
+ print "!ReadCStringFromMemory() did not find a %d byte C string at %x" % (FileNameLen, FileNamePtr)
+ # make breakpoint command contiue
+ frame.GetThread().GetProcess().Continue()
+
+ debugger = frame.thread.process.target.debugger
+ if frame.FindVariable ("AddSymbolFlag").GetValueAsUnsigned() == 1:
+ LoadAddress = frame.FindVariable ("LoadAddress").GetValueAsUnsigned()
+
+ debugger.HandleCommand ("target modules add %s" % FileName)
+ print "target modules load --slid 0x%x %s" % (LoadAddress, FileName)
+ debugger.HandleCommand ("target modules load --slide 0x%x --file %s" % (LoadAddress, FileName))
+ else:
+ target = debugger.GetSelectedTarget()
+ for SBModule in target.module_iter():
+ ModuleName = SBModule.GetFileSpec().GetDirectory() + '/'
+ ModuleName += SBModule.GetFileSpec().GetFilename()
+ if FileName == ModuleName or FileName == SBModule.GetFileSpec().GetFilename():
+ target.ClearModuleLoadAddress (SBModule)
+ if not target.RemoveModule (SBModule):
+ print "!lldb.target.RemoveModule (%s) FAILED" % SBModule
+
+ # make breakpoint command contiue
+ frame.thread.process.Continue()
+
+def GuidToCStructStr (guid, Name=False):
+ #
+ # Convert a 16-byte bytesarry (or bytearray compat object) to C guid string
+ # { 0xB402621F, 0xA940, 0x1E4A, { 0x86, 0x6B, 0x4D, 0xC9, 0x16, 0x2B, 0x34, 0x7C } }
+ #
+ # Name=True means lookup name in GuidNameDict and us it if you find it
+ #
+
+ if not isinstance (guid, bytearray):
+ # convert guid object to UUID, and UUID to bytearray
+ Uuid = uuid.UUID(guid)
+ guid = bytearray (Uuid.bytes_le)
+
+ return "{ 0x%02.2X%02.2X%02.2X%02.2X, 0x%02.2X%02.2X, 0x%02.2X%02.2X, { 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X } }" % \
+ (guid[3], guid[2], guid[1], guid[0], guid[5], guid[4], guid[7], guid[6], guid[8], guid[9], guid[10], guid[11], guid[12], guid[13], guid[14], guid[15])
+
+def ParseGuidString(GuidStr):
+ #
+ # Error check and convert C Guid init to string
+ # ParseGuidString("49152E77-1ADA-4764-B7A2-7AFEFED95E8B")
+ # ParseGuidString("{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7, 0x8A, 0x35, 0x46, 0xD1 } }")
+ #
+
+ if "{" in GuidStr :
+ # convert C form "{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7, 0x8A, 0x35, 0x46, 0xD1 } }"
+ # to string form BA24B391-73FD-C54C-9EAF-0CA78A3546D1
+ # make a list of Hex numbers like: ['0xBA24B391', '0x73FD', '0xC54C', '0x9E', '0xAF', '0x0C', '0xA7', '0x8A', '0x35', '0x46', '0xD1']
+ Hex = ''.join(x for x in GuidStr if x not in '{,}').split()
+ Str = "%08X-%04X-%04X-%02.2X%02.2X-%02.2X%02.2X%02.2X%02.2X%02.2X%02.2X" % \
+ (int(Hex[0], 0), int(Hex[1], 0), int(Hex[2], 0), int(Hex[3], 0), int(Hex[4], 0), \
+ int(Hex[5], 0), int(Hex[6], 0), int(Hex[7], 0), int(Hex[8], 0), int(Hex[9], 0), int(Hex[10], 0))
+ elif GuidStr.count('-') == 4:
+ # validate "49152E77-1ADA-4764-B7A2-7AFEFED95E8B" form
+ Check = "%s" % str(uuid.UUID(GuidStr)).upper()
+ if GuidStr.upper() == Check:
+ Str = GuidStr.upper()
+ else:
+ Ste = ""
+ else:
+ Str = ""
+
+ return Str
+
+
+def create_guid_options():
+ usage = "usage: %prog [data]"
+ description='''lookup EFI_GUID by CName, C struct, or GUID string and print out all three.
+ '''
+ parser = optparse.OptionParser(description=description, prog='guid',usage=usage)
+ return parser
+
+def efi_guid_command(debugger, command, result, dict):
+ # Use the Shell Lexer to properly parse up command options just like a
+ # shell would
+ command_args = shlex.split(command)
+ parser = create_guid_options()
+ try:
+ (options, args) = parser.parse_args(command_args)
+ if len(args) >= 1:
+ if args[0] == "{":
+ # caller forgot to quote the string"
+ # mark arg[0] a string containing all args[n]
+ args[0] = ' '.join(args)
+ GuidStr = ParseGuidString (args[0])
+ if GuidStr == "":
+ # return Key of GuidNameDict for value args[0]
+ GuidStr = [Key for Key, Value in guid_dict.iteritems() if Value == args[0]][0]
+ GuidStr = GuidStr.upper()
+ except:
+ # if you don't handle exceptions, passing an incorrect argument to the OptionParser will cause LLDB to exit
+ # (courtesy of OptParse dealing with argument errors by throwing SystemExit)
+ result.SetError ("option parsing failed")
+ return
+
+
+ if len(args) >= 1:
+ if GuidStr in guid_dict:
+ print "%s = %s" % (guid_dict[GuidStr], GuidStr)
+ print "%s = %s" % (guid_dict[GuidStr], GuidToCStructStr (GuidStr))
+ else:
+ print GuidStr
+ else:
+ # dump entire dictionary
+ width = max(len(v) for k,v in guid_dict.iteritems())
+ for value in sorted(guid_dict, key=guid_dict.get):
+ print '%-*s %s %s' % (width, guid_dict[value], value, GuidToCStructStr(value))
+
+ return
+
+
+#
+########## Code that runs when this script is imported into LLDB ###########
+#
+def __lldb_init_module (debugger, internal_dict):
+ # This initializer is being run from LLDB in the embedded command interpreter
+ # Make the options so we can generate the help text for the new LLDB
+ # command line command prior to registering it with LLDB below
+
+ global guid_dict
+
+ # Source Guid.xref file if we can find it
+ inputfile = os.getcwd()
+ inputfile += os.sep + os.pardir + os.sep + 'FV' + os.sep + 'Guid.xref'
+ with open(inputfile) as f:
+ for line in f:
+ data = line.split(' ')
+ if len(data) >= 2:
+ guid_dict[data[0].upper()] = data[1].strip('\n')
+
+ # init EFI specific type formaters
+ TypePrintFormating (debugger)
+
+
+ # add guid command
+ parser = create_guid_options()
+ efi_guid_command.__doc__ = parser.format_help()
+ debugger.HandleCommand('command script add -f lldbefi.efi_guid_command guid')
+
+
+ Target = debugger.GetTargetAtIndex(0)
+ if Target:
+ Breakpoint = Target.BreakpointCreateByName('SecGdbScriptBreak')
+ if Breakpoint.GetNumLocations() == 1:
+ # Set the emulator breakpoints, if we are in the emulator
+ debugger.HandleCommand("breakpoint command add -s python -F lldbefi.LoadEmulatorEfiSymbols {id}".format(id=Breakpoint.GetID()))
+ print 'Type r to run emulator. SecLldbScriptBreak armed. EFI modules should now get source level debugging in the emulator.'
diff --git a/EmulatorPkg/Win/Host/WinBlockIo.c b/EmulatorPkg/Win/Host/WinBlockIo.c
index 14491a6e90..d5944c4227 100644
--- a/EmulatorPkg/Win/Host/WinBlockIo.c
+++ b/EmulatorPkg/Win/Host/WinBlockIo.c
@@ -270,7 +270,7 @@ WinNtSignalToken (
@param[in] MediaId Id of the media, changes every time the media is
replaced.
@param[in] Lba The starting Logical Block Address to read from.
- @param[in, out] Token A pointer to the token associated with the transaction.
+ @param[in, out] Token A pointer to the token associated with the transaction.
@param[in] BufferSize Size of Buffer, must be a multiple of device block size.
@param[out] Buffer A pointer to the destination buffer for the data. The
caller is responsible for either having implicit or
diff --git a/EmulatorPkg/Win/Host/WinHost.h b/EmulatorPkg/Win/Host/WinHost.h
index 6f1f1a2dd3..991da1c15b 100644
--- a/EmulatorPkg/Win/Host/WinHost.h
+++ b/EmulatorPkg/Win/Host/WinHost.h
@@ -206,4 +206,4 @@ extern EMU_THUNK_PROTOCOL gEmuThunkProtocol;
extern EMU_IO_THUNK_PROTOCOL mWinNtWndThunkIo;
extern EMU_IO_THUNK_PROTOCOL mWinNtFileSystemThunkIo;
extern EMU_IO_THUNK_PROTOCOL mWinNtBlockIoThunkIo;
-#endif
\ No newline at end of file
+#endif
--
2.16.1.windows.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] EmulatorPkg: formalize line endings
2018-08-29 3:39 [PATCH] EmulatorPkg: formalize line endings Ruiyu Ni
@ 2018-08-29 5:06 ` Wu, Hao A
0 siblings, 0 replies; 2+ messages in thread
From: Wu, Hao A @ 2018-08-29 5:06 UTC (permalink / raw)
To: Ni, Ruiyu, edk2-devel@lists.01.org; +Cc: Gao, Liming
Reviewed-by: Hao Wu <hao.a.wu@intel.com>
Best Regards,
Hao Wu
> -----Original Message-----
> From: Ni, Ruiyu
> Sent: Wednesday, August 29, 2018 11:40 AM
> To: edk2-devel@lists.01.org
> Cc: Wu, Hao A; Gao, Liming
> Subject: [PATCH] EmulatorPkg: formalize line endings
>
> The patch is the result of running
> "BaseTools/Scripts/FormatDosFiles.py EmulatorPkg/"
>
> No functionality impact.
>
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com>
> Cc: Hao A Wu <hao.a.wu@intel.com>
> Cc: Liming Gao <liming.gao@intel.com>
> ---
> EmulatorPkg/CpuRuntimeDxe/Cpu.c | 24 +-
> EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c | 2 +-
> EmulatorPkg/EmuGopDxe/Gop.h | 390 +--
> EmulatorPkg/EmuGopDxe/GopInput.c | 1800 +++++------
> EmulatorPkg/EmuGopDxe/GopScreen.c | 832 ++---
> EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c | 2 +-
> EmulatorPkg/Include/Library/EmuMagicPageLib.h | 76 +-
> EmulatorPkg/Include/Library/EmuThunkLib.h | 84 +-
> EmulatorPkg/Include/Library/PpiListLib.h | 42 +-
> EmulatorPkg/Include/Library/SmbiosLib.h | 404 +--
> EmulatorPkg/Include/Protocol/EmuBlockIo.h | 2 +-
> EmulatorPkg/Include/Protocol/EmuFileSystem.h | 280 +-
> EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h | 268 +-
> .../Library/DevicePathTextLib/DevicePathTextLib.c | 2 +-
> .../DevicePathTextLib/DevicePathTextLib.inf | 2 +-
> EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c | 2 +-
> .../DxeEmuPeCoffExtraActionLib.inf | 96 +-
> .../DxeEmuStdErrSerialPortLib.c | 2 +-
> EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c | 2 +-
> .../PeiServicesTablePointer.c | 12 +-
> .../PeiEmuPeCoffExtraActionLib.inf | 98 +-
> .../PeiServicesTablePointer.c | 12 +-
> .../PeiServicesTablePointer.c | 12 +-
> EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf | 2 +-
> EmulatorPkg/Library/SecPeiServicesLib/FwVol.c | 562 ++--
> EmulatorPkg/Library/SecPpiListLib/PpiListLib.c | 34 +-
> EmulatorPkg/Library/SmbiosLib/SmbiosLib.c | 704 ++---
> EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf | 94 +-
> .../MiscSubClassPlatformDxe/MiscSubClassDriver.h | 4 +-
> .../MiscSubclassDriverEntryPoint.c | 4 +-
> EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c | 18 +-
> .../PlatformSmbiosDxe/PlatformSmbiosDxe.inf | 4 +-
> EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c | 26 +-
> EmulatorPkg/Sec/Ia32/SwitchRam.asm | 26 +-
> EmulatorPkg/Sec/Sec.c | 298 +-
> EmulatorPkg/Sec/Sec.h | 102 +-
> EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c | 78 +-
> EmulatorPkg/Unix/Host/BlockIo.c | 2 +-
> EmulatorPkg/Unix/Host/EmuThunk.c | 880 +++---
> EmulatorPkg/Unix/Host/Host.c | 14 +-
> EmulatorPkg/Unix/Host/Host.h | 2 +-
> EmulatorPkg/Unix/Host/Ia32/Gasket.S | 2984 +++++++++---------
> EmulatorPkg/Unix/Host/Ia32/SwitchStack.c | 148 +-
> EmulatorPkg/Unix/Host/MemoryAllocationLib.c | 290 +-
> EmulatorPkg/Unix/Host/PosixFileSystem.c | 3112 +++++++++----------
> EmulatorPkg/Unix/Host/Pthreads.c | 470 +--
> EmulatorPkg/Unix/Host/X11GraphicsWindow.c | 2056 ++++++------
> EmulatorPkg/Unix/Host/X64/Gasket.S | 3262 ++++++++++----------
> EmulatorPkg/Unix/lldbefi.py | 1080 +++----
> EmulatorPkg/Win/Host/WinBlockIo.c | 2 +-
> EmulatorPkg/Win/Host/WinHost.h | 2 +-
> 51 files changed, 10353 insertions(+), 10353 deletions(-)
>
> diff --git a/EmulatorPkg/CpuRuntimeDxe/Cpu.c
> b/EmulatorPkg/CpuRuntimeDxe/Cpu.c
> index 47fb7f07e8..83e876509a 100644
> --- a/EmulatorPkg/CpuRuntimeDxe/Cpu.c
> +++ b/EmulatorPkg/CpuRuntimeDxe/Cpu.c
> @@ -63,7 +63,7 @@ SMBIOS_TABLE_TYPE4 mCpuSmbiosType4 = {
> 0, // ProcessorXModel: 4;
> 0, // ProcessorXFamily: 8;
> 0, // ProcessorReserved2: 4;
> - },
> + },
> { // PROCESSOR_FEATURE_FLAGS
> 0, // ProcessorFpu :1;
> 0, // ProcessorVme :1;
> @@ -100,13 +100,13 @@ SMBIOS_TABLE_TYPE4 mCpuSmbiosType4 = {
> },
> 3, // ProcessorVersion String;
> { // Voltage;
> - 1, // ProcessorVoltageCapability5V :1;
> - 1, // ProcessorVoltageCapability3_3V :1;
> - 1, // ProcessorVoltageCapability2_9V :1;
> + 1, // ProcessorVoltageCapability5V :1;
> + 1, // ProcessorVoltageCapability3_3V :1;
> + 1, // ProcessorVoltageCapability2_9V :1;
> 0, // ProcessorVoltageCapabilityReserved :1; ///< Bit 3, must be zero.
> 0, // ProcessorVoltageReserved :3; ///< Bits 4-6, must be zero.
> 0 // ProcessorVoltageIndicateLegacy :1;
> - },
> + },
> 0, // ExternalClock;
> 0, // MaxSpeed;
> 0, // CurrentSpeed;
> @@ -151,26 +151,26 @@ CHAR8 *mCpuSmbiosType4Strings[] = {
> "Not Found",
> NULL
> };
> -
> +
> ...
> LogSmbiosData (
> - (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
> + (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
> gSmbiosType12Strings
> );
>
> @param Template Fixed SMBIOS structure, required.
> - @param StringArray Array of strings to convert to an SMBIOS string pack.
> + @param StringArray Array of strings to convert to an SMBIOS string pack.
> NULL is OK.
>
> **/
> EFI_STATUS
> LogSmbiosData (
> IN EFI_SMBIOS_TABLE_HEADER *Template,
> - IN CHAR8 **StringPack
> + IN CHAR8 **StringPack
> )
> {
> EFI_STATUS Status;
> - EFI_SMBIOS_PROTOCOL *Smbios;
> + EFI_SMBIOS_PROTOCOL *Smbios;
> EFI_SMBIOS_HANDLE SmbiosHandle;
> EFI_SMBIOS_TABLE_HEADER *Record;
> UINTN Index;
> @@ -219,7 +219,7 @@ LogSmbiosData (
> Str += StringSize;
> }
> *Str = 0;
> -
> +
> SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
> Status = Smbios->Add (
> Smbios,
> @@ -228,7 +228,7 @@ LogSmbiosData (
> Record
> );
> ASSERT_EFI_ERROR (Status);
> -
> +
> FreePool (Record);
> return Status;
> }
> diff --git a/EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c
> b/EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c
> index e77de2c7bc..b9ac6ce080 100644
> --- a/EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c
> +++ b/EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c
> @@ -61,7 +61,7 @@ EmuBlockIo2Reset (
> @param[in] MediaId Id of the media, changes every time the media is
> replaced.
> @param[in] Lba The starting Logical Block Address to read from.
> - @param[in, out] Token A pointer to the token associated with the
> transaction.
> + @param[in, out] Token A pointer to the token associated with the
> transaction.
> @param[in] BufferSize Size of Buffer, must be a multiple of device block
> size.
> @param[out] Buffer A pointer to the destination buffer for the data.
> The
> caller is responsible for either having implicit or
> diff --git a/EmulatorPkg/EmuGopDxe/Gop.h b/EmulatorPkg/EmuGopDxe/Gop.h
> index 6f7b082618..3b533013ce 100644
> --- a/EmulatorPkg/EmuGopDxe/Gop.h
> +++ b/EmulatorPkg/EmuGopDxe/Gop.h
> @@ -1,195 +1,195 @@
> -/*++ @file
> -
> -Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
> -Portions copyright (c) 2010,Apple Inc. All rights reserved.<BR>
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#ifndef __UGA_H_
> -#define __UGA_H_
> -
> -#include <PiDxe.h>
> -
> -#include <Protocol/GraphicsOutput.h>
> -#include <Protocol/SimpleTextIn.h>
> -#include <Protocol/SimpleTextInEx.h>
> -#include <Protocol/SimplePointer.h>
> -#include <Protocol/EmuIoThunk.h>
> -#include <Protocol/EmuGraphicsWindow.h>
> -
> -#include <Guid/EventGroup.h>
> -
> -#include <Library/DebugLib.h>
> -#include <Library/BaseLib.h>
> -#include <Library/UefiDriverEntryPoint.h>
> -#include <Library/UefiLib.h>
> -#include <Library/BaseMemoryLib.h>
> -#include <Library/MemoryAllocationLib.h>
> -#include <Library/UefiBootServicesTableLib.h>
> -#include <Library/KeyMapLib.h>
> -
> -
> -#define MAX_Q 256
> -
> -typedef struct {
> - UINTN Front;
> - UINTN Rear;
> - UINTN Count;
> - EFI_INPUT_KEY Q[MAX_Q];
> -} GOP_QUEUE_FIXED;
> -
> -#define EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE SIGNATURE_32
> ('U', 'g', 'S', 'n')
> -typedef struct _EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY {
> - UINTN Signature;
> - EFI_HANDLE NotifyHandle;
> - EFI_KEY_DATA KeyData;
> - EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn;
> - EFI_EVENT Event;
> - LIST_ENTRY NotifyEntry;
> -} EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY;
> -
> -#define GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER 0xffff
> -
> -typedef struct {
> - UINT32 HorizontalResolution;
> - UINT32 VerticalResolution;
> - UINT32 ColorDepth;
> - UINT32 RefreshRate;
> -} GOP_MODE_DATA;
> -
> -
> -
> -extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
> -extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
> -
> -#define EMU_UGA_CLASS_NAME L"EmuGopWindow"
> -
> -#define GOP_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('G', 'o', 'p', 'N')
> -typedef struct {
> - UINT64 Signature;
> -
> - EFI_HANDLE Handle;
> - EFI_GRAPHICS_OUTPUT_PROTOCOL GraphicsOutput;
> - EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleTextIn;
> - EFI_SIMPLE_POINTER_PROTOCOL SimplePointer;
> -
> - EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
> - EMU_GRAPHICS_WINDOW_PROTOCOL *EmuGraphicsWindow;
> -
> - EFI_UNICODE_STRING_TABLE *ControllerNameTable;
> -
> - EFI_SIMPLE_POINTER_MODE PointerMode;
> - //
> - // GOP Private Data for QueryMode ()
> - //
> - GOP_MODE_DATA *ModeData;
> -
> -
> - //
> - // UGA Private Data knowing when to start hardware
> - //
> - BOOLEAN HardwareNeedsStarting;
> -
> - CHAR16 *WindowName;
> -
> - GOP_QUEUE_FIXED Queue;
> -
> - EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleTextInEx;
> - EFI_KEY_STATE KeyState;
> - LIST_ENTRY NotifyList;
> -} GOP_PRIVATE_DATA;
> -
> -
> -#define GOP_PRIVATE_DATA_FROM_THIS(a) \
> - CR(a, GOP_PRIVATE_DATA, GraphicsOutput,
> GOP_PRIVATE_DATA_SIGNATURE)
> -
> -#define GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS(a) \
> - CR(a, GOP_PRIVATE_DATA, SimpleTextIn,
> GOP_PRIVATE_DATA_SIGNATURE)
> -
> -#define GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS(a) \
> - CR(a, GOP_PRIVATE_DATA, SimpleTextInEx,
> GOP_PRIVATE_DATA_SIGNATURE)
> -
> -#define GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS(a) \
> - CR(a, GOP_PRIVATE_DATA, SimplePointer,
> GOP_PRIVATE_DATA_SIGNATURE)
> -
> -
> -//
> -// Global Protocol Variables
> -//
> -extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
> -extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
> -extern EFI_COMPONENT_NAME2_PROTOCOL gEmuGopComponentName2;
> -
> -//
> -// Gop Hardware abstraction internal worker functions
> -//
> -EFI_STATUS
> -EmuGopSupported (
> - IN EMU_IO_THUNK_PROTOCOL *EmuIoThunk
> - );
> -
> -EFI_STATUS
> -EmuGopConstructor (
> - IN GOP_PRIVATE_DATA *Private
> - );
> -
> -EFI_STATUS
> -EmuGopDestructor (
> - IN GOP_PRIVATE_DATA *Private
> - );
> -
> -
> -EFI_STATUS
> -GopPrivateAddQ (
> - IN GOP_PRIVATE_DATA *Private,
> - IN EFI_INPUT_KEY Key
> - );
> -
> -EFI_STATUS
> -EmuGopInitializeSimpleTextInForWindow (
> - IN GOP_PRIVATE_DATA *Private
> - );
> -
> -EFI_STATUS
> -EmuGopInitializeSimplePointerForWindow (
> - IN GOP_PRIVATE_DATA *Private
> - );
> -
> -EFI_STATUS
> -EmuGopStartWindow (
> - IN GOP_PRIVATE_DATA *Private,
> - IN UINT32 HorizontalResolution,
> - IN UINT32 VerticalResolution,
> - IN UINT32 ColorDepth,
> - IN UINT32 RefreshRate
> - );
> -
> -VOID
> -EFIAPI
> -ShutdownGopEvent (
> - IN EFI_EVENT Event,
> - IN VOID *Context
> - );
> -
> -VOID
> -EFIAPI
> -GopPrivateMakeCallbackFunction (
> - IN VOID *Context,
> - IN EFI_KEY_DATA *KeyData
> - );
> -
> -VOID
> -EFIAPI
> -GopPrivateBreakCallbackFunction (
> - IN VOID *Context,
> - IN EFI_KEY_DATA *KeyData
> - );
> -
> -#endif
> +/*++ @file
> +
> +Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
> +Portions copyright (c) 2010,Apple Inc. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#ifndef __UGA_H_
> +#define __UGA_H_
> +
> +#include <PiDxe.h>
> +
> +#include <Protocol/GraphicsOutput.h>
> +#include <Protocol/SimpleTextIn.h>
> +#include <Protocol/SimpleTextInEx.h>
> +#include <Protocol/SimplePointer.h>
> +#include <Protocol/EmuIoThunk.h>
> +#include <Protocol/EmuGraphicsWindow.h>
> +
> +#include <Guid/EventGroup.h>
> +
> +#include <Library/DebugLib.h>
> +#include <Library/BaseLib.h>
> +#include <Library/UefiDriverEntryPoint.h>
> +#include <Library/UefiLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/KeyMapLib.h>
> +
> +
> +#define MAX_Q 256
> +
> +typedef struct {
> + UINTN Front;
> + UINTN Rear;
> + UINTN Count;
> + EFI_INPUT_KEY Q[MAX_Q];
> +} GOP_QUEUE_FIXED;
> +
> +#define EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE SIGNATURE_32
> ('U', 'g', 'S', 'n')
> +typedef struct _EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY {
> + UINTN Signature;
> + EFI_HANDLE NotifyHandle;
> + EFI_KEY_DATA KeyData;
> + EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn;
> + EFI_EVENT Event;
> + LIST_ENTRY NotifyEntry;
> +} EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY;
> +
> +#define GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER 0xffff
> +
> +typedef struct {
> + UINT32 HorizontalResolution;
> + UINT32 VerticalResolution;
> + UINT32 ColorDepth;
> + UINT32 RefreshRate;
> +} GOP_MODE_DATA;
> +
> +
> +
> +extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
> +extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
> +
> +#define EMU_UGA_CLASS_NAME L"EmuGopWindow"
> +
> +#define GOP_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('G', 'o', 'p', 'N')
> +typedef struct {
> + UINT64 Signature;
> +
> + EFI_HANDLE Handle;
> + EFI_GRAPHICS_OUTPUT_PROTOCOL GraphicsOutput;
> + EFI_SIMPLE_TEXT_INPUT_PROTOCOL SimpleTextIn;
> + EFI_SIMPLE_POINTER_PROTOCOL SimplePointer;
> +
> + EMU_IO_THUNK_PROTOCOL *EmuIoThunk;
> + EMU_GRAPHICS_WINDOW_PROTOCOL *EmuGraphicsWindow;
> +
> + EFI_UNICODE_STRING_TABLE *ControllerNameTable;
> +
> + EFI_SIMPLE_POINTER_MODE PointerMode;
> + //
> + // GOP Private Data for QueryMode ()
> + //
> + GOP_MODE_DATA *ModeData;
> +
> +
> + //
> + // UGA Private Data knowing when to start hardware
> + //
> + BOOLEAN HardwareNeedsStarting;
> +
> + CHAR16 *WindowName;
> +
> + GOP_QUEUE_FIXED Queue;
> +
> + EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleTextInEx;
> + EFI_KEY_STATE KeyState;
> + LIST_ENTRY NotifyList;
> +} GOP_PRIVATE_DATA;
> +
> +
> +#define GOP_PRIVATE_DATA_FROM_THIS(a) \
> + CR(a, GOP_PRIVATE_DATA, GraphicsOutput,
> GOP_PRIVATE_DATA_SIGNATURE)
> +
> +#define GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS(a) \
> + CR(a, GOP_PRIVATE_DATA, SimpleTextIn,
> GOP_PRIVATE_DATA_SIGNATURE)
> +
> +#define GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS(a) \
> + CR(a, GOP_PRIVATE_DATA, SimpleTextInEx,
> GOP_PRIVATE_DATA_SIGNATURE)
> +
> +#define GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS(a) \
> + CR(a, GOP_PRIVATE_DATA, SimplePointer,
> GOP_PRIVATE_DATA_SIGNATURE)
> +
> +
> +//
> +// Global Protocol Variables
> +//
> +extern EFI_DRIVER_BINDING_PROTOCOL gEmuGopDriverBinding;
> +extern EFI_COMPONENT_NAME_PROTOCOL gEmuGopComponentName;
> +extern EFI_COMPONENT_NAME2_PROTOCOL gEmuGopComponentName2;
> +
> +//
> +// Gop Hardware abstraction internal worker functions
> +//
> +EFI_STATUS
> +EmuGopSupported (
> + IN EMU_IO_THUNK_PROTOCOL *EmuIoThunk
> + );
> +
> +EFI_STATUS
> +EmuGopConstructor (
> + IN GOP_PRIVATE_DATA *Private
> + );
> +
> +EFI_STATUS
> +EmuGopDestructor (
> + IN GOP_PRIVATE_DATA *Private
> + );
> +
> +
> +EFI_STATUS
> +GopPrivateAddQ (
> + IN GOP_PRIVATE_DATA *Private,
> + IN EFI_INPUT_KEY Key
> + );
> +
> +EFI_STATUS
> +EmuGopInitializeSimpleTextInForWindow (
> + IN GOP_PRIVATE_DATA *Private
> + );
> +
> +EFI_STATUS
> +EmuGopInitializeSimplePointerForWindow (
> + IN GOP_PRIVATE_DATA *Private
> + );
> +
> +EFI_STATUS
> +EmuGopStartWindow (
> + IN GOP_PRIVATE_DATA *Private,
> + IN UINT32 HorizontalResolution,
> + IN UINT32 VerticalResolution,
> + IN UINT32 ColorDepth,
> + IN UINT32 RefreshRate
> + );
> +
> +VOID
> +EFIAPI
> +ShutdownGopEvent (
> + IN EFI_EVENT Event,
> + IN VOID *Context
> + );
> +
> +VOID
> +EFIAPI
> +GopPrivateMakeCallbackFunction (
> + IN VOID *Context,
> + IN EFI_KEY_DATA *KeyData
> + );
> +
> +VOID
> +EFIAPI
> +GopPrivateBreakCallbackFunction (
> + IN VOID *Context,
> + IN EFI_KEY_DATA *KeyData
> + );
> +
> +#endif
> diff --git a/EmulatorPkg/EmuGopDxe/GopInput.c
> b/EmulatorPkg/EmuGopDxe/GopInput.c
> index cf37a7bd70..1d40b1d7d6 100644
> --- a/EmulatorPkg/EmuGopDxe/GopInput.c
> +++ b/EmulatorPkg/EmuGopDxe/GopInput.c
> @@ -1,900 +1,900 @@
> -/*++ @file
> -
> -Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
> -Portions copyright (c) 2010 0 2011,Apple Inc. All rights reserved.<BR>
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -
> -**/
> -
> -#include "Gop.h"
> -
> -
> -BOOLEAN
> -GopPrivateIsKeyRegistered (
> - IN EFI_KEY_DATA *RegsiteredData,
> - IN EFI_KEY_DATA *InputData
> - )
> -/*++
> -
> -Routine Description:
> -
> -Arguments:
> -
> - RegsiteredData - A pointer to a buffer that is filled in with the keystroke
> - state data for the key that was registered.
> - InputData - A pointer to a buffer that is filled in with the keystroke
> - state data for the key that was pressed.
> -
> -Returns:
> - TRUE - Key be pressed matches a registered key.
> - FLASE - Match failed.
> -
> -**/
> -{
> - ASSERT (RegsiteredData != NULL && InputData != NULL);
> -
> - if ((RegsiteredData->Key.ScanCode != InputData->Key.ScanCode) ||
> - (RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) {
> - return FALSE;
> - }
> -
> - //
> - // Assume KeyShiftState/KeyToggleState = 0 in Registered key data means
> these state could be ignored.
> - //
> - if (RegsiteredData->KeyState.KeyShiftState != 0 &&
> - RegsiteredData->KeyState.KeyShiftState != InputData-
> >KeyState.KeyShiftState) {
> - return FALSE;
> - }
> - if (RegsiteredData->KeyState.KeyToggleState != 0 &&
> - RegsiteredData->KeyState.KeyToggleState != InputData-
> >KeyState.KeyToggleState) {
> - return FALSE;
> - }
> -
> - return TRUE;
> -
> -}
> -
> -
> -VOID
> -EFIAPI
> -GopPrivateMakeCallbackFunction (
> - IN VOID *Context,
> - IN EFI_KEY_DATA *KeyData
> - )
> -{
> - LIST_ENTRY *Link;
> - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
> - GOP_PRIVATE_DATA *Private = (GOP_PRIVATE_DATA *)Context;
> -
> - KeyMapMake (KeyData);
> -
> - for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link =
> Link->ForwardLink) {
> - CurrentNotify = CR (
> - Link,
> - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
> - NotifyEntry,
> - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
> - );
> - if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
> - // We could be called at a high TPL so signal an event to call the registered
> function
> - // at a lower TPL.
> - gBS->SignalEvent (CurrentNotify->Event);
> - }
> - }
> -}
> -
> -
> -VOID
> -EFIAPI
> -GopPrivateBreakCallbackFunction (
> - IN VOID *Context,
> - IN EFI_KEY_DATA *KeyData
> - )
> -{
> - KeyMapBreak (KeyData);
> -}
> -
> -
> -
> -//
> -// Simple Text In implementation.
> -//
> -
> -/**
> - Reset the input device and optionally run diagnostics
> -
> - @param This Protocol instance pointer.
> - @param ExtendedVerification Driver may perform diagnostics on reset.
> -
> - @retval EFI_SUCCESS The device was reset.
> - @retval EFI_DEVICE_ERROR The device is not functioning properly and
> could not be reset.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimpleTextInReset (
> - IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
> - IN BOOLEAN ExtendedVerification
> - )
> -{
> - GOP_PRIVATE_DATA *Private;
> - EFI_KEY_DATA KeyData;
> - EFI_TPL OldTpl;
> -
> - Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
> - if (Private->EmuGraphicsWindow == NULL) {
> - return EFI_SUCCESS;
> - }
> -
> - //
> - // Enter critical section
> - //
> - OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> -
> - //
> - // A reset is draining the Queue
> - //
> - while (Private->EmuGraphicsWindow->GetKey (Private-
> >EmuGraphicsWindow, &KeyData) == EFI_SUCCESS)
> - ;
> -
> - //
> - // Leave critical section and return
> - //
> - gBS->RestoreTPL (OldTpl);
> - return EFI_SUCCESS;
> -}
> -
> -
> -/**
> - Reads the next keystroke from the input device. The WaitForKey Event can
> - be used to test for existence of a keystroke via WaitForEvent () call.
> -
> - @param This Protocol instance pointer.
> - @param Key A pointer to a buffer that is filled in with the keystroke
> - information for the key that was pressed.
> -
> - @retval EFI_SUCCESS The keystroke information was returned.
> - @retval EFI_NOT_READY There was no keystroke data available.
> - @retval EFI_DEVICE_ERROR The keystroke information was not returned due
> to
> - hardware errors.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimpleTextInReadKeyStroke (
> - IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
> - OUT EFI_INPUT_KEY *Key
> - )
> -{
> - GOP_PRIVATE_DATA *Private;
> - EFI_STATUS Status;
> - EFI_TPL OldTpl;
> - EFI_KEY_DATA KeyData;
> -
> - Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
> - if (Private->EmuGraphicsWindow == NULL) {
> - return EFI_NOT_READY;
> - }
> -
> - //
> - // Enter critical section
> - //
> - OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> -
> - Status = Private->EmuGraphicsWindow->GetKey (Private-
> >EmuGraphicsWindow, &KeyData);
> - if (!EFI_ERROR (Status)) {
> - if ((KeyData.Key.ScanCode == 0) && (KeyData.Key.UnicodeChar == 0)) {
> - // Modifier key was pressed
> - Status = EFI_NOT_READY;
> - } else {
> - CopyMem (Key, &KeyData.Key, sizeof (EFI_INPUT_KEY));
> - }
> - }
> -
> - //
> - // Leave critical section and return
> - //
> - gBS->RestoreTPL (OldTpl);
> -
> - return Status;
> -}
> -
> -
> -
> -/**
> - SimpleTextIn and SimpleTextInEx Notify Wait Event
> -
> - @param Event Event whose notification function is being invoked.
> - @param Context Pointer to GOP_PRIVATE_DATA.
> -
> -**/
> -VOID
> -EFIAPI
> -EmuGopSimpleTextInWaitForKey (
> - IN EFI_EVENT Event,
> - IN VOID *Context
> - )
> -{
> - GOP_PRIVATE_DATA *Private;
> - EFI_STATUS Status;
> - EFI_TPL OldTpl;
> -
> - Private = (GOP_PRIVATE_DATA *) Context;
> - if (Private->EmuGraphicsWindow == NULL) {
> - return;
> - }
> -
> - //
> - // Enter critical section
> - //
> - OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> -
> - Status = Private->EmuGraphicsWindow->CheckKey (Private-
> >EmuGraphicsWindow);
> - if (!EFI_ERROR (Status)) {
> - //
> - // If a there is a key in the queue signal our event.
> - //
> - gBS->SignalEvent (Event);
> - }
> - //
> - // Leave critical section and return
> - //
> - gBS->RestoreTPL (OldTpl);
> -}
> -
> -
> -//
> -// Simple Text Input Ex protocol functions
> -//
> -
> -
> -/**
> - The Reset() function resets the input device hardware. As part
> - of initialization process, the firmware/device will make a quick
> - but reasonable attempt to verify that the device is functioning.
> - If the ExtendedVerification flag is TRUE the firmware may take
> - an extended amount of time to verify the device is operating on
> - reset. Otherwise the reset operation is to occur as quickly as
> - possible. The hardware verification process is not defined by
> - this specification and is left up to the platform firmware or
> - driver to implement.
> -
> - @param This A pointer to the
> EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
> -
> - @param ExtendedVerification Indicates that the driver may
> - perform a more exhaustive
> - verification operation of the
> - device during reset.
> -
> -
> - @retval EFI_SUCCESS The device was reset.
> -
> - @retval EFI_DEVICE_ERROR The device is not functioning
> - correctly and could not be reset.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimpleTextInExResetEx (
> - IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
> - IN BOOLEAN ExtendedVerification
> - )
> -/*++
> -
> - Routine Description:
> - Reset the input device and optionaly run diagnostics
> -
> - Arguments:
> - This - Protocol instance pointer.
> - ExtendedVerification - Driver may perform diagnostics on reset.
> -
> - Returns:
> - EFI_SUCCESS - The device was reset.
> -
> -**/
> -{
> - return EFI_SUCCESS;
> -}
> -
> -
> -
> -/**
> - The function reads the next keystroke from the input device. If
> - there is no pending keystroke the function returns
> - EFI_NOT_READY. If there is a pending keystroke, then
> - KeyData.Key.ScanCode is the EFI scan code defined in Error!
> - Reference source not found. The KeyData.Key.UnicodeChar is the
> - actual printable character or is zero if the key does not
> - represent a printable character (control key, function key,
> - etc.). The KeyData.KeyState is shift state for the character
> - reflected in KeyData.Key.UnicodeChar or KeyData.Key.ScanCode .
> - When interpreting the data from this function, it should be
> - noted that if a class of printable characters that are
> - normally adjusted by shift modifiers (e.g. Shift Key + "f"
> - key) would be presented solely as a KeyData.Key.UnicodeChar
> - without the associated shift state. So in the previous example
> - of a Shift Key + "f" key being pressed, the only pertinent
> - data returned would be KeyData.Key.UnicodeChar with the value
> - of "F". This of course would not typically be the case for
> - non-printable characters such as the pressing of the Right
> - Shift Key + F10 key since the corresponding returned data
> - would be reflected both in the KeyData.KeyState.KeyShiftState
> - and KeyData.Key.ScanCode values. UEFI drivers which implement
> - the EFI_SIMPLE_TEXT_INPUT_EX protocol are required to return
> - KeyData.Key and KeyData.KeyState values. These drivers must
> - always return the most current state of
> - KeyData.KeyState.KeyShiftState and
> - KeyData.KeyState.KeyToggleState. It should also be noted that
> - certain input devices may not be able to produce shift or toggle
> - state information, and in those cases the high order bit in the
> - respective Toggle and Shift state fields should not be active.
> -
> -
> - @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL
> instance.
> -
> - @param KeyData A pointer to a buffer that is filled in with
> - the keystroke state data for the key that was
> - pressed.
> -
> -
> - @retval EFI_SUCCESS The keystroke information was
> - returned.
> -
> - @retval EFI_NOT_READY There was no keystroke data available.
> - EFI_DEVICE_ERROR The keystroke
> - information was not returned due to
> - hardware errors.
> -
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimpleTextInExReadKeyStrokeEx (
> - IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
> - OUT EFI_KEY_DATA *KeyData
> - )
> -/*++
> -
> - Routine Description:
> - Reads the next keystroke from the input device. The WaitForKey Event can
> - be used to test for existance of a keystroke via WaitForEvent () call.
> -
> - Arguments:
> - This - Protocol instance pointer.
> - KeyData - A pointer to a buffer that is filled in with the keystroke
> - state data for the key that was pressed.
> -
> - Returns:
> - EFI_SUCCESS - The keystroke information was returned.
> - EFI_NOT_READY - There was no keystroke data availiable.
> - EFI_DEVICE_ERROR - The keystroke information was not returned due to
> - hardware errors.
> - EFI_INVALID_PARAMETER - KeyData is NULL.
> -
> -**/
> -{
> - EFI_STATUS Status;
> - GOP_PRIVATE_DATA *Private;
> - EFI_TPL OldTpl;
> -
> -
> - if (KeyData == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> - if (Private->EmuGraphicsWindow == NULL) {
> - return EFI_NOT_READY;
> - }
> -
> - //
> - // Enter critical section
> - //
> - OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> -
> - Status = Private->EmuGraphicsWindow->GetKey(Private-
> >EmuGraphicsWindow, KeyData);
> -
> - //
> - // Leave critical section and return
> - //
> - gBS->RestoreTPL (OldTpl);
> -
> - return Status;
> -}
> -
> -
> -
> -/**
> - The SetState() function allows the input device hardware to
> - have state settings adjusted.
> -
> - @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL
> instance.
> -
> - @param KeyToggleState Pointer to the EFI_KEY_TOGGLE_STATE to
> - set the state for the input device.
> -
> -
> - @retval EFI_SUCCESS The device state was set appropriately.
> -
> - @retval EFI_DEVICE_ERROR The device is not functioning
> - correctly and could not have the
> - setting adjusted.
> -
> - @retval EFI_UNSUPPORTED The device does not support the
> - ability to have its state set.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimpleTextInExSetState (
> - IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
> - IN EFI_KEY_TOGGLE_STATE *KeyToggleState
> - )
> -{
> - GOP_PRIVATE_DATA *Private;
> - EFI_STATUS Status;
> - EFI_TPL OldTpl;
> -
> - Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> - if (Private->EmuGraphicsWindow == NULL) {
> - return EFI_NOT_READY;
> - }
> -
> - //
> - // Enter critical section
> - //
> - OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> -
> - Status = Private->EmuGraphicsWindow->KeySetState (Private-
> >EmuGraphicsWindow, KeyToggleState);
> - //
> - // Leave critical section and return
> - //
> - gBS->RestoreTPL (OldTpl);
> -
> - return Status;
> -}
> -
> -
> -/**
> - SimpleTextIn and SimpleTextInEx Notify Wait Event
> -
> - @param Event Event whose notification function is being invoked.
> - @param Context Pointer to GOP_PRIVATE_DATA.
> -
> -**/
> -VOID
> -EFIAPI
> -EmuGopRegisterKeyCallback (
> - IN EFI_EVENT Event,
> - IN VOID *Context
> - )
> -{
> - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *ExNotify =
> (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *)Context;
> -
> - ExNotify->KeyNotificationFn (&ExNotify->KeyData);
> -}
> -
> -
> -
> -/**
> - The RegisterKeystrokeNotify() function registers a function
> - which will be called when a specified keystroke will occur.
> -
> - @param This A pointer to the
> EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
> -
> - @param KeyData A pointer to a buffer that is filled in with
> - the keystroke information for the key that was
> - pressed.
> -
> - @param KeyNotificationFunction Points to the function to be
> - called when the key sequence
> - is typed specified by KeyData.
> -
> -
> - @param NotifyHandle Points to the unique handle assigned to
> - the registered notification.
> -
> - @retval EFI_SUCCESS The device state was set
> - appropriately.
> -
> - @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary
> - data structures.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimpleTextInExRegisterKeyNotify (
> - IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
> - IN EFI_KEY_DATA *KeyData,
> - IN EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction,
> - OUT EFI_HANDLE *NotifyHandle
> - )
> -{
> - EFI_STATUS Status;
> - GOP_PRIVATE_DATA *Private;
> - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
> - LIST_ENTRY *Link;
> - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *NewNotify;
> -
> - if (KeyData == NULL || KeyNotificationFunction == NULL || NotifyHandle ==
> NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> -
> - //
> - // Return EFI_SUCCESS if the (KeyData, NotificationFunction) is already
> registered.
> - //
> - for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link =
> Link->ForwardLink) {
> - CurrentNotify = CR (
> - Link,
> - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
> - NotifyEntry,
> - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
> - );
> - if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
> - if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) {
> - *NotifyHandle = CurrentNotify->NotifyHandle;
> - return EFI_SUCCESS;
> - }
> - }
> - }
> -
> - //
> - // Allocate resource to save the notification function
> - //
> - NewNotify = (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) AllocateZeroPool
> (sizeof (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY));
> - if (NewNotify == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - NewNotify->Signature =
> EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE;
> - NewNotify->KeyNotificationFn = KeyNotificationFunction;
> - NewNotify->NotifyHandle = (EFI_HANDLE) NewNotify;
> - CopyMem (&NewNotify->KeyData, KeyData, sizeof (KeyData));
> - InsertTailList (&Private->NotifyList, &NewNotify->NotifyEntry);
> -
> - Status = gBS->CreateEvent (
> - EVT_NOTIFY_SIGNAL,
> - TPL_NOTIFY,
> - EmuGopRegisterKeyCallback,
> - NewNotify,
> - &NewNotify->Event
> - );
> - ASSERT_EFI_ERROR (Status);
> -
> -
> - *NotifyHandle = NewNotify->NotifyHandle;
> -
> - return EFI_SUCCESS;
> -
> -}
> -
> -
> -/**
> - The UnregisterKeystrokeNotify() function removes the
> - notification which was previously registered.
> -
> - @param This A pointer to the
> EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
> -
> - @param NotificationHandle The handle of the notification
> - function being unregistered.
> -
> - @retval EFI_SUCCESS The device state was set appropriately.
> -
> - @retval EFI_INVALID_PARAMETER The NotificationHandle is
> - invalid.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimpleTextInExUnregisterKeyNotify (
> - IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
> - IN EFI_HANDLE NotificationHandle
> - )
> -/*++
> -
> - Routine Description:
> - Remove a registered notification function from a particular keystroke.
> -
> - Arguments:
> - This - Protocol instance pointer.
> - NotificationHandle - The handle of the notification function being
> unregistered.
> -
> - Returns:
> - EFI_SUCCESS - The notification function was unregistered
> successfully.
> - EFI_INVALID_PARAMETER - The NotificationHandle is invalid.
> -
> -**/
> -{
> - GOP_PRIVATE_DATA *Private;
> - LIST_ENTRY *Link;
> - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
> -
> - if (NotificationHandle == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (((EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) NotificationHandle)-
> >Signature != EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> -
> - for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link =
> Link->ForwardLink) {
> - CurrentNotify = CR (
> - Link,
> - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
> - NotifyEntry,
> - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
> - );
> - if (CurrentNotify->NotifyHandle == NotificationHandle) {
> - //
> - // Remove the notification function from NotifyList and free resources
> - //
> - RemoveEntryList (&CurrentNotify->NotifyEntry);
> -
> - gBS->CloseEvent (CurrentNotify->Event);
> -
> - gBS->FreePool (CurrentNotify);
> - return EFI_SUCCESS;
> - }
> - }
> -
> - //
> - // Can not find the specified Notification Handle
> - //
> - return EFI_INVALID_PARAMETER;
> -}
> -
> -
> -
> -/**
> - Initialize SimplelTextIn and SimpleTextInEx protocols in the Private
> - context structure.
> -
> - @param Private Context structure to fill in.
> -
> - @return EFI_SUCCESS Initialization was a success
> -
> -**/
> -EFI_STATUS
> -EmuGopInitializeSimpleTextInForWindow (
> - IN GOP_PRIVATE_DATA *Private
> - )
> -{
> - EFI_STATUS Status;
> -
> - //
> - // Initialize Simple Text In protoocol
> - //
> - Private->SimpleTextIn.Reset = EmuGopSimpleTextInReset;
> - Private->SimpleTextIn.ReadKeyStroke = EmuGopSimpleTextInReadKeyStroke;
> -
> - Status = gBS->CreateEvent (
> - EVT_NOTIFY_WAIT,
> - TPL_NOTIFY,
> - EmuGopSimpleTextInWaitForKey,
> - Private,
> - &Private->SimpleTextIn.WaitForKey
> - );
> - ASSERT_EFI_ERROR (Status);
> -
> -
> - //
> - // Initialize Simple Text In Ex
> - //
> -
> - Private->SimpleTextInEx.Reset = EmuGopSimpleTextInExResetEx;
> - Private->SimpleTextInEx.ReadKeyStrokeEx =
> EmuGopSimpleTextInExReadKeyStrokeEx;
> - Private->SimpleTextInEx.SetState = EmuGopSimpleTextInExSetState;
> - Private->SimpleTextInEx.RegisterKeyNotify =
> EmuGopSimpleTextInExRegisterKeyNotify;
> - Private->SimpleTextInEx.UnregisterKeyNotify =
> EmuGopSimpleTextInExUnregisterKeyNotify;
> -
> - Private->SimpleTextInEx.Reset (&Private->SimpleTextInEx, FALSE);
> -
> - InitializeListHead (&Private->NotifyList);
> -
> - Status = gBS->CreateEvent (
> - EVT_NOTIFY_WAIT,
> - TPL_NOTIFY,
> - EmuGopSimpleTextInWaitForKey,
> - Private,
> - &Private->SimpleTextInEx.WaitForKeyEx
> - );
> - ASSERT_EFI_ERROR (Status);
> -
> -
> - return Status;
> -}
> -
> -
> -
> -
> -
> -
> -
> -//
> -// Simple Pointer implementation.
> -//
> -
> -
> -/**
> - Resets the pointer device hardware.
> -
> - @param This A pointer to the EFI_SIMPLE_POINTER_PROTOCOL
> - instance.
> - @param ExtendedVerification Indicates that the driver may perform a more
> exhaustive
> - verification operation of the device during reset.
> -
> - @retval EFI_SUCCESS The device was reset.
> - @retval EFI_DEVICE_ERROR The device is not functioning correctly and
> could not be reset.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimplePointerReset (
> - IN EFI_SIMPLE_POINTER_PROTOCOL *This,
> - IN BOOLEAN ExtendedVerification
> - )
> -{
> - GOP_PRIVATE_DATA *Private;
> - EFI_SIMPLE_POINTER_STATE State;
> - EFI_TPL OldTpl;
> -
> - Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);
> - if (Private->EmuGraphicsWindow == NULL) {
> - return EFI_SUCCESS;
> - }
> -
> - //
> - // Enter critical section
> - //
> - OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> -
> - //
> - // A reset is draining the Queue
> - //
> - while (Private->EmuGraphicsWindow->GetPointerState (Private-
> >EmuGraphicsWindow, &State) == EFI_SUCCESS)
> - ;
> -
> - //
> - // Leave critical section and return
> - //
> - gBS->RestoreTPL (OldTpl);
> - return EFI_SUCCESS;
> -}
> -
> -
> -/**
> - Retrieves the current state of a pointer device.
> -
> - @param This A pointer to the EFI_SIMPLE_POINTER_PROTOCOL
> - instance.
> - @param State A pointer to the state information on the pointer
> device.
> -
> - @retval EFI_SUCCESS The state of the pointer device was returned in
> State.
> - @retval EFI_NOT_READY The state of the pointer device has not
> changed since the last call to
> - GetState().
> - @retval EFI_DEVICE_ERROR A device error occurred while attempting to
> retrieve the pointer device's
> - current state.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSimplePointerGetState (
> - IN EFI_SIMPLE_POINTER_PROTOCOL *This,
> - IN OUT EFI_SIMPLE_POINTER_STATE *State
> - )
> -{
> - GOP_PRIVATE_DATA *Private;
> - EFI_STATUS Status;
> - EFI_TPL OldTpl;
> -
> - Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);
> - if (Private->EmuGraphicsWindow == NULL) {
> - return EFI_NOT_READY;
> - }
> -
> - //
> - // Enter critical section
> - //
> - OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> -
> - Status = Private->EmuGraphicsWindow->GetPointerState (Private-
> >EmuGraphicsWindow, State);
> - //
> - // Leave critical section and return
> - //
> - gBS->RestoreTPL (OldTpl);
> -
> - return Status;
> -}
> -
> -
> -/**
> - SimplePointer Notify Wait Event
> -
> - @param Event Event whose notification function is being invoked.
> - @param Context Pointer to GOP_PRIVATE_DATA.
> -
> -**/
> -VOID
> -EFIAPI
> -EmuGopSimplePointerWaitForInput (
> - IN EFI_EVENT Event,
> - IN VOID *Context
> - )
> -{
> - GOP_PRIVATE_DATA *Private;
> - EFI_STATUS Status;
> - EFI_TPL OldTpl;
> -
> - Private = (GOP_PRIVATE_DATA *) Context;
> - if (Private->EmuGraphicsWindow == NULL) {
> - return;
> - }
> -
> - //
> - // Enter critical section
> - //
> - OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> -
> - Status = Private->EmuGraphicsWindow->CheckPointer (Private-
> >EmuGraphicsWindow);
> - if (!EFI_ERROR (Status)) {
> - //
> - // If the pointer state has changed, signal our event.
> - //
> - gBS->SignalEvent (Event);
> - }
> - //
> - // Leave critical section and return
> - //
> - gBS->RestoreTPL (OldTpl);
> -}
> -
> -
> -/**
> - SimplePointer constructor
> -
> - @param Private Context structure to fill in.
> -
> - @retval EFI_SUCCESS Constructor had success
> -
> -**/
> -EFI_STATUS
> -EmuGopInitializeSimplePointerForWindow (
> - IN GOP_PRIVATE_DATA *Private
> - )
> -{
> - EFI_STATUS Status;
> -
> - //
> - // Initialize Simple Pointer protoocol
> - //
> - Private->PointerMode.ResolutionX = 1;
> - Private->PointerMode.ResolutionY = 1;
> - Private->PointerMode.ResolutionZ = 1;
> - Private->PointerMode.LeftButton = TRUE;
> - Private->PointerMode.RightButton = TRUE;
> -
> - Private->SimplePointer.Reset = EmuGopSimplePointerReset;
> - Private->SimplePointer.GetState = EmuGopSimplePointerGetState;
> - Private->SimplePointer.Mode = &Private->PointerMode;
> -
> - Status = gBS->CreateEvent (
> - EVT_NOTIFY_WAIT,
> - TPL_NOTIFY,
> - EmuGopSimplePointerWaitForInput,
> - Private,
> - &Private->SimplePointer.WaitForInput
> - );
> -
> - return Status;
> -}
> +/*++ @file
> +
> +Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>
> +Portions copyright (c) 2010 0 2011,Apple Inc. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +
> +**/
> +
> +#include "Gop.h"
> +
> +
> +BOOLEAN
> +GopPrivateIsKeyRegistered (
> + IN EFI_KEY_DATA *RegsiteredData,
> + IN EFI_KEY_DATA *InputData
> + )
> +/*++
> +
> +Routine Description:
> +
> +Arguments:
> +
> + RegsiteredData - A pointer to a buffer that is filled in with the keystroke
> + state data for the key that was registered.
> + InputData - A pointer to a buffer that is filled in with the keystroke
> + state data for the key that was pressed.
> +
> +Returns:
> + TRUE - Key be pressed matches a registered key.
> + FLASE - Match failed.
> +
> +**/
> +{
> + ASSERT (RegsiteredData != NULL && InputData != NULL);
> +
> + if ((RegsiteredData->Key.ScanCode != InputData->Key.ScanCode) ||
> + (RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) {
> + return FALSE;
> + }
> +
> + //
> + // Assume KeyShiftState/KeyToggleState = 0 in Registered key data means
> these state could be ignored.
> + //
> + if (RegsiteredData->KeyState.KeyShiftState != 0 &&
> + RegsiteredData->KeyState.KeyShiftState != InputData-
> >KeyState.KeyShiftState) {
> + return FALSE;
> + }
> + if (RegsiteredData->KeyState.KeyToggleState != 0 &&
> + RegsiteredData->KeyState.KeyToggleState != InputData-
> >KeyState.KeyToggleState) {
> + return FALSE;
> + }
> +
> + return TRUE;
> +
> +}
> +
> +
> +VOID
> +EFIAPI
> +GopPrivateMakeCallbackFunction (
> + IN VOID *Context,
> + IN EFI_KEY_DATA *KeyData
> + )
> +{
> + LIST_ENTRY *Link;
> + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
> + GOP_PRIVATE_DATA *Private = (GOP_PRIVATE_DATA *)Context;
> +
> + KeyMapMake (KeyData);
> +
> + for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link
> = Link->ForwardLink) {
> + CurrentNotify = CR (
> + Link,
> + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
> + NotifyEntry,
> + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
> + );
> + if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
> + // We could be called at a high TPL so signal an event to call the
> registered function
> + // at a lower TPL.
> + gBS->SignalEvent (CurrentNotify->Event);
> + }
> + }
> +}
> +
> +
> +VOID
> +EFIAPI
> +GopPrivateBreakCallbackFunction (
> + IN VOID *Context,
> + IN EFI_KEY_DATA *KeyData
> + )
> +{
> + KeyMapBreak (KeyData);
> +}
> +
> +
> +
> +//
> +// Simple Text In implementation.
> +//
> +
> +/**
> + Reset the input device and optionally run diagnostics
> +
> + @param This Protocol instance pointer.
> + @param ExtendedVerification Driver may perform diagnostics on reset.
> +
> + @retval EFI_SUCCESS The device was reset.
> + @retval EFI_DEVICE_ERROR The device is not functioning properly and
> could not be reset.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimpleTextInReset (
> + IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
> + IN BOOLEAN ExtendedVerification
> + )
> +{
> + GOP_PRIVATE_DATA *Private;
> + EFI_KEY_DATA KeyData;
> + EFI_TPL OldTpl;
> +
> + Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
> + if (Private->EmuGraphicsWindow == NULL) {
> + return EFI_SUCCESS;
> + }
> +
> + //
> + // Enter critical section
> + //
> + OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> +
> + //
> + // A reset is draining the Queue
> + //
> + while (Private->EmuGraphicsWindow->GetKey (Private-
> >EmuGraphicsWindow, &KeyData) == EFI_SUCCESS)
> + ;
> +
> + //
> + // Leave critical section and return
> + //
> + gBS->RestoreTPL (OldTpl);
> + return EFI_SUCCESS;
> +}
> +
> +
> +/**
> + Reads the next keystroke from the input device. The WaitForKey Event can
> + be used to test for existence of a keystroke via WaitForEvent () call.
> +
> + @param This Protocol instance pointer.
> + @param Key A pointer to a buffer that is filled in with the keystroke
> + information for the key that was pressed.
> +
> + @retval EFI_SUCCESS The keystroke information was returned.
> + @retval EFI_NOT_READY There was no keystroke data available.
> + @retval EFI_DEVICE_ERROR The keystroke information was not returned due
> to
> + hardware errors.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimpleTextInReadKeyStroke (
> + IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This,
> + OUT EFI_INPUT_KEY *Key
> + )
> +{
> + GOP_PRIVATE_DATA *Private;
> + EFI_STATUS Status;
> + EFI_TPL OldTpl;
> + EFI_KEY_DATA KeyData;
> +
> + Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This);
> + if (Private->EmuGraphicsWindow == NULL) {
> + return EFI_NOT_READY;
> + }
> +
> + //
> + // Enter critical section
> + //
> + OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> +
> + Status = Private->EmuGraphicsWindow->GetKey (Private-
> >EmuGraphicsWindow, &KeyData);
> + if (!EFI_ERROR (Status)) {
> + if ((KeyData.Key.ScanCode == 0) && (KeyData.Key.UnicodeChar == 0)) {
> + // Modifier key was pressed
> + Status = EFI_NOT_READY;
> + } else {
> + CopyMem (Key, &KeyData.Key, sizeof (EFI_INPUT_KEY));
> + }
> + }
> +
> + //
> + // Leave critical section and return
> + //
> + gBS->RestoreTPL (OldTpl);
> +
> + return Status;
> +}
> +
> +
> +
> +/**
> + SimpleTextIn and SimpleTextInEx Notify Wait Event
> +
> + @param Event Event whose notification function is being invoked.
> + @param Context Pointer to GOP_PRIVATE_DATA.
> +
> +**/
> +VOID
> +EFIAPI
> +EmuGopSimpleTextInWaitForKey (
> + IN EFI_EVENT Event,
> + IN VOID *Context
> + )
> +{
> + GOP_PRIVATE_DATA *Private;
> + EFI_STATUS Status;
> + EFI_TPL OldTpl;
> +
> + Private = (GOP_PRIVATE_DATA *) Context;
> + if (Private->EmuGraphicsWindow == NULL) {
> + return;
> + }
> +
> + //
> + // Enter critical section
> + //
> + OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> +
> + Status = Private->EmuGraphicsWindow->CheckKey (Private-
> >EmuGraphicsWindow);
> + if (!EFI_ERROR (Status)) {
> + //
> + // If a there is a key in the queue signal our event.
> + //
> + gBS->SignalEvent (Event);
> + }
> + //
> + // Leave critical section and return
> + //
> + gBS->RestoreTPL (OldTpl);
> +}
> +
> +
> +//
> +// Simple Text Input Ex protocol functions
> +//
> +
> +
> +/**
> + The Reset() function resets the input device hardware. As part
> + of initialization process, the firmware/device will make a quick
> + but reasonable attempt to verify that the device is functioning.
> + If the ExtendedVerification flag is TRUE the firmware may take
> + an extended amount of time to verify the device is operating on
> + reset. Otherwise the reset operation is to occur as quickly as
> + possible. The hardware verification process is not defined by
> + this specification and is left up to the platform firmware or
> + driver to implement.
> +
> + @param This A pointer to the
> EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
> +
> + @param ExtendedVerification Indicates that the driver may
> + perform a more exhaustive
> + verification operation of the
> + device during reset.
> +
> +
> + @retval EFI_SUCCESS The device was reset.
> +
> + @retval EFI_DEVICE_ERROR The device is not functioning
> + correctly and could not be reset.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimpleTextInExResetEx (
> + IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
> + IN BOOLEAN ExtendedVerification
> + )
> +/*++
> +
> + Routine Description:
> + Reset the input device and optionaly run diagnostics
> +
> + Arguments:
> + This - Protocol instance pointer.
> + ExtendedVerification - Driver may perform diagnostics on reset.
> +
> + Returns:
> + EFI_SUCCESS - The device was reset.
> +
> +**/
> +{
> + return EFI_SUCCESS;
> +}
> +
> +
> +
> +/**
> + The function reads the next keystroke from the input device. If
> + there is no pending keystroke the function returns
> + EFI_NOT_READY. If there is a pending keystroke, then
> + KeyData.Key.ScanCode is the EFI scan code defined in Error!
> + Reference source not found. The KeyData.Key.UnicodeChar is the
> + actual printable character or is zero if the key does not
> + represent a printable character (control key, function key,
> + etc.). The KeyData.KeyState is shift state for the character
> + reflected in KeyData.Key.UnicodeChar or KeyData.Key.ScanCode .
> + When interpreting the data from this function, it should be
> + noted that if a class of printable characters that are
> + normally adjusted by shift modifiers (e.g. Shift Key + "f"
> + key) would be presented solely as a KeyData.Key.UnicodeChar
> + without the associated shift state. So in the previous example
> + of a Shift Key + "f" key being pressed, the only pertinent
> + data returned would be KeyData.Key.UnicodeChar with the value
> + of "F". This of course would not typically be the case for
> + non-printable characters such as the pressing of the Right
> + Shift Key + F10 key since the corresponding returned data
> + would be reflected both in the KeyData.KeyState.KeyShiftState
> + and KeyData.Key.ScanCode values. UEFI drivers which implement
> + the EFI_SIMPLE_TEXT_INPUT_EX protocol are required to return
> + KeyData.Key and KeyData.KeyState values. These drivers must
> + always return the most current state of
> + KeyData.KeyState.KeyShiftState and
> + KeyData.KeyState.KeyToggleState. It should also be noted that
> + certain input devices may not be able to produce shift or toggle
> + state information, and in those cases the high order bit in the
> + respective Toggle and Shift state fields should not be active.
> +
> +
> + @param This A pointer to the EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL
> instance.
> +
> + @param KeyData A pointer to a buffer that is filled in with
> + the keystroke state data for the key that was
> + pressed.
> +
> +
> + @retval EFI_SUCCESS The keystroke information was
> + returned.
> +
> + @retval EFI_NOT_READY There was no keystroke data available.
> + EFI_DEVICE_ERROR The keystroke
> + information was not returned due to
> + hardware errors.
> +
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimpleTextInExReadKeyStrokeEx (
> + IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
> + OUT EFI_KEY_DATA *KeyData
> + )
> +/*++
> +
> + Routine Description:
> + Reads the next keystroke from the input device. The WaitForKey Event can
> + be used to test for existance of a keystroke via WaitForEvent () call.
> +
> + Arguments:
> + This - Protocol instance pointer.
> + KeyData - A pointer to a buffer that is filled in with the keystroke
> + state data for the key that was pressed.
> +
> + Returns:
> + EFI_SUCCESS - The keystroke information was returned.
> + EFI_NOT_READY - There was no keystroke data availiable.
> + EFI_DEVICE_ERROR - The keystroke information was not returned due to
> + hardware errors.
> + EFI_INVALID_PARAMETER - KeyData is NULL.
> +
> +**/
> +{
> + EFI_STATUS Status;
> + GOP_PRIVATE_DATA *Private;
> + EFI_TPL OldTpl;
> +
> +
> + if (KeyData == NULL) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> + if (Private->EmuGraphicsWindow == NULL) {
> + return EFI_NOT_READY;
> + }
> +
> + //
> + // Enter critical section
> + //
> + OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> +
> + Status = Private->EmuGraphicsWindow->GetKey(Private-
> >EmuGraphicsWindow, KeyData);
> +
> + //
> + // Leave critical section and return
> + //
> + gBS->RestoreTPL (OldTpl);
> +
> + return Status;
> +}
> +
> +
> +
> +/**
> + The SetState() function allows the input device hardware to
> + have state settings adjusted.
> +
> + @param This A pointer to the
> EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
> +
> + @param KeyToggleState Pointer to the EFI_KEY_TOGGLE_STATE to
> + set the state for the input device.
> +
> +
> + @retval EFI_SUCCESS The device state was set appropriately.
> +
> + @retval EFI_DEVICE_ERROR The device is not functioning
> + correctly and could not have the
> + setting adjusted.
> +
> + @retval EFI_UNSUPPORTED The device does not support the
> + ability to have its state set.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimpleTextInExSetState (
> + IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
> + IN EFI_KEY_TOGGLE_STATE *KeyToggleState
> + )
> +{
> + GOP_PRIVATE_DATA *Private;
> + EFI_STATUS Status;
> + EFI_TPL OldTpl;
> +
> + Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> + if (Private->EmuGraphicsWindow == NULL) {
> + return EFI_NOT_READY;
> + }
> +
> + //
> + // Enter critical section
> + //
> + OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> +
> + Status = Private->EmuGraphicsWindow->KeySetState (Private-
> >EmuGraphicsWindow, KeyToggleState);
> + //
> + // Leave critical section and return
> + //
> + gBS->RestoreTPL (OldTpl);
> +
> + return Status;
> +}
> +
> +
> +/**
> + SimpleTextIn and SimpleTextInEx Notify Wait Event
> +
> + @param Event Event whose notification function is being invoked.
> + @param Context Pointer to GOP_PRIVATE_DATA.
> +
> +**/
> +VOID
> +EFIAPI
> +EmuGopRegisterKeyCallback (
> + IN EFI_EVENT Event,
> + IN VOID *Context
> + )
> +{
> + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *ExNotify =
> (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *)Context;
> +
> + ExNotify->KeyNotificationFn (&ExNotify->KeyData);
> +}
> +
> +
> +
> +/**
> + The RegisterKeystrokeNotify() function registers a function
> + which will be called when a specified keystroke will occur.
> +
> + @param This A pointer to the
> EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
> +
> + @param KeyData A pointer to a buffer that is filled in with
> + the keystroke information for the key that was
> + pressed.
> +
> + @param KeyNotificationFunction Points to the function to be
> + called when the key sequence
> + is typed specified by KeyData.
> +
> +
> + @param NotifyHandle Points to the unique handle assigned to
> + the registered notification.
> +
> + @retval EFI_SUCCESS The device state was set
> + appropriately.
> +
> + @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary
> + data structures.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimpleTextInExRegisterKeyNotify (
> + IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
> + IN EFI_KEY_DATA *KeyData,
> + IN EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction,
> + OUT EFI_HANDLE *NotifyHandle
> + )
> +{
> + EFI_STATUS Status;
> + GOP_PRIVATE_DATA *Private;
> + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
> + LIST_ENTRY *Link;
> + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *NewNotify;
> +
> + if (KeyData == NULL || KeyNotificationFunction == NULL || NotifyHandle ==
> NULL) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> +
> + //
> + // Return EFI_SUCCESS if the (KeyData, NotificationFunction) is already
> registered.
> + //
> + for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link
> = Link->ForwardLink) {
> + CurrentNotify = CR (
> + Link,
> + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
> + NotifyEntry,
> + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
> + );
> + if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
> + if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) {
> + *NotifyHandle = CurrentNotify->NotifyHandle;
> + return EFI_SUCCESS;
> + }
> + }
> + }
> +
> + //
> + // Allocate resource to save the notification function
> + //
> + NewNotify = (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) AllocateZeroPool
> (sizeof (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY));
> + if (NewNotify == NULL) {
> + return EFI_OUT_OF_RESOURCES;
> + }
> +
> + NewNotify->Signature =
> EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE;
> + NewNotify->KeyNotificationFn = KeyNotificationFunction;
> + NewNotify->NotifyHandle = (EFI_HANDLE) NewNotify;
> + CopyMem (&NewNotify->KeyData, KeyData, sizeof (KeyData));
> + InsertTailList (&Private->NotifyList, &NewNotify->NotifyEntry);
> +
> + Status = gBS->CreateEvent (
> + EVT_NOTIFY_SIGNAL,
> + TPL_NOTIFY,
> + EmuGopRegisterKeyCallback,
> + NewNotify,
> + &NewNotify->Event
> + );
> + ASSERT_EFI_ERROR (Status);
> +
> +
> + *NotifyHandle = NewNotify->NotifyHandle;
> +
> + return EFI_SUCCESS;
> +
> +}
> +
> +
> +/**
> + The UnregisterKeystrokeNotify() function removes the
> + notification which was previously registered.
> +
> + @param This A pointer to the
> EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL instance.
> +
> + @param NotificationHandle The handle of the notification
> + function being unregistered.
> +
> + @retval EFI_SUCCESS The device state was set appropriately.
> +
> + @retval EFI_INVALID_PARAMETER The NotificationHandle is
> + invalid.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimpleTextInExUnregisterKeyNotify (
> + IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
> + IN EFI_HANDLE NotificationHandle
> + )
> +/*++
> +
> + Routine Description:
> + Remove a registered notification function from a particular keystroke.
> +
> + Arguments:
> + This - Protocol instance pointer.
> + NotificationHandle - The handle of the notification function being
> unregistered.
> +
> + Returns:
> + EFI_SUCCESS - The notification function was unregistered
> successfully.
> + EFI_INVALID_PARAMETER - The NotificationHandle is invalid.
> +
> +**/
> +{
> + GOP_PRIVATE_DATA *Private;
> + LIST_ENTRY *Link;
> + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *CurrentNotify;
> +
> + if (NotificationHandle == NULL) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + if (((EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) NotificationHandle)-
> >Signature != EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + Private = GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This);
> +
> + for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link
> = Link->ForwardLink) {
> + CurrentNotify = CR (
> + Link,
> + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY,
> + NotifyEntry,
> + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE
> + );
> + if (CurrentNotify->NotifyHandle == NotificationHandle) {
> + //
> + // Remove the notification function from NotifyList and free resources
> + //
> + RemoveEntryList (&CurrentNotify->NotifyEntry);
> +
> + gBS->CloseEvent (CurrentNotify->Event);
> +
> + gBS->FreePool (CurrentNotify);
> + return EFI_SUCCESS;
> + }
> + }
> +
> + //
> + // Can not find the specified Notification Handle
> + //
> + return EFI_INVALID_PARAMETER;
> +}
> +
> +
> +
> +/**
> + Initialize SimplelTextIn and SimpleTextInEx protocols in the Private
> + context structure.
> +
> + @param Private Context structure to fill in.
> +
> + @return EFI_SUCCESS Initialization was a success
> +
> +**/
> +EFI_STATUS
> +EmuGopInitializeSimpleTextInForWindow (
> + IN GOP_PRIVATE_DATA *Private
> + )
> +{
> + EFI_STATUS Status;
> +
> + //
> + // Initialize Simple Text In protoocol
> + //
> + Private->SimpleTextIn.Reset = EmuGopSimpleTextInReset;
> + Private->SimpleTextIn.ReadKeyStroke = EmuGopSimpleTextInReadKeyStroke;
> +
> + Status = gBS->CreateEvent (
> + EVT_NOTIFY_WAIT,
> + TPL_NOTIFY,
> + EmuGopSimpleTextInWaitForKey,
> + Private,
> + &Private->SimpleTextIn.WaitForKey
> + );
> + ASSERT_EFI_ERROR (Status);
> +
> +
> + //
> + // Initialize Simple Text In Ex
> + //
> +
> + Private->SimpleTextInEx.Reset = EmuGopSimpleTextInExResetEx;
> + Private->SimpleTextInEx.ReadKeyStrokeEx =
> EmuGopSimpleTextInExReadKeyStrokeEx;
> + Private->SimpleTextInEx.SetState = EmuGopSimpleTextInExSetState;
> + Private->SimpleTextInEx.RegisterKeyNotify =
> EmuGopSimpleTextInExRegisterKeyNotify;
> + Private->SimpleTextInEx.UnregisterKeyNotify =
> EmuGopSimpleTextInExUnregisterKeyNotify;
> +
> + Private->SimpleTextInEx.Reset (&Private->SimpleTextInEx, FALSE);
> +
> + InitializeListHead (&Private->NotifyList);
> +
> + Status = gBS->CreateEvent (
> + EVT_NOTIFY_WAIT,
> + TPL_NOTIFY,
> + EmuGopSimpleTextInWaitForKey,
> + Private,
> + &Private->SimpleTextInEx.WaitForKeyEx
> + );
> + ASSERT_EFI_ERROR (Status);
> +
> +
> + return Status;
> +}
> +
> +
> +
> +
> +
> +
> +
> +//
> +// Simple Pointer implementation.
> +//
> +
> +
> +/**
> + Resets the pointer device hardware.
> +
> + @param This A pointer to the EFI_SIMPLE_POINTER_PROTOCOL
> + instance.
> + @param ExtendedVerification Indicates that the driver may perform a
> more exhaustive
> + verification operation of the device during reset.
> +
> + @retval EFI_SUCCESS The device was reset.
> + @retval EFI_DEVICE_ERROR The device is not functioning correctly and
> could not be reset.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimplePointerReset (
> + IN EFI_SIMPLE_POINTER_PROTOCOL *This,
> + IN BOOLEAN ExtendedVerification
> + )
> +{
> + GOP_PRIVATE_DATA *Private;
> + EFI_SIMPLE_POINTER_STATE State;
> + EFI_TPL OldTpl;
> +
> + Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);
> + if (Private->EmuGraphicsWindow == NULL) {
> + return EFI_SUCCESS;
> + }
> +
> + //
> + // Enter critical section
> + //
> + OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> +
> + //
> + // A reset is draining the Queue
> + //
> + while (Private->EmuGraphicsWindow->GetPointerState (Private-
> >EmuGraphicsWindow, &State) == EFI_SUCCESS)
> + ;
> +
> + //
> + // Leave critical section and return
> + //
> + gBS->RestoreTPL (OldTpl);
> + return EFI_SUCCESS;
> +}
> +
> +
> +/**
> + Retrieves the current state of a pointer device.
> +
> + @param This A pointer to the EFI_SIMPLE_POINTER_PROTOCOL
> + instance.
> + @param State A pointer to the state information on the pointer
> device.
> +
> + @retval EFI_SUCCESS The state of the pointer device was returned in
> State.
> + @retval EFI_NOT_READY The state of the pointer device has not
> changed since the last call to
> + GetState().
> + @retval EFI_DEVICE_ERROR A device error occurred while attempting to
> retrieve the pointer device's
> + current state.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSimplePointerGetState (
> + IN EFI_SIMPLE_POINTER_PROTOCOL *This,
> + IN OUT EFI_SIMPLE_POINTER_STATE *State
> + )
> +{
> + GOP_PRIVATE_DATA *Private;
> + EFI_STATUS Status;
> + EFI_TPL OldTpl;
> +
> + Private = GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This);
> + if (Private->EmuGraphicsWindow == NULL) {
> + return EFI_NOT_READY;
> + }
> +
> + //
> + // Enter critical section
> + //
> + OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> +
> + Status = Private->EmuGraphicsWindow->GetPointerState (Private-
> >EmuGraphicsWindow, State);
> + //
> + // Leave critical section and return
> + //
> + gBS->RestoreTPL (OldTpl);
> +
> + return Status;
> +}
> +
> +
> +/**
> + SimplePointer Notify Wait Event
> +
> + @param Event Event whose notification function is being invoked.
> + @param Context Pointer to GOP_PRIVATE_DATA.
> +
> +**/
> +VOID
> +EFIAPI
> +EmuGopSimplePointerWaitForInput (
> + IN EFI_EVENT Event,
> + IN VOID *Context
> + )
> +{
> + GOP_PRIVATE_DATA *Private;
> + EFI_STATUS Status;
> + EFI_TPL OldTpl;
> +
> + Private = (GOP_PRIVATE_DATA *) Context;
> + if (Private->EmuGraphicsWindow == NULL) {
> + return;
> + }
> +
> + //
> + // Enter critical section
> + //
> + OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
> +
> + Status = Private->EmuGraphicsWindow->CheckPointer (Private-
> >EmuGraphicsWindow);
> + if (!EFI_ERROR (Status)) {
> + //
> + // If the pointer state has changed, signal our event.
> + //
> + gBS->SignalEvent (Event);
> + }
> + //
> + // Leave critical section and return
> + //
> + gBS->RestoreTPL (OldTpl);
> +}
> +
> +
> +/**
> + SimplePointer constructor
> +
> + @param Private Context structure to fill in.
> +
> + @retval EFI_SUCCESS Constructor had success
> +
> +**/
> +EFI_STATUS
> +EmuGopInitializeSimplePointerForWindow (
> + IN GOP_PRIVATE_DATA *Private
> + )
> +{
> + EFI_STATUS Status;
> +
> + //
> + // Initialize Simple Pointer protoocol
> + //
> + Private->PointerMode.ResolutionX = 1;
> + Private->PointerMode.ResolutionY = 1;
> + Private->PointerMode.ResolutionZ = 1;
> + Private->PointerMode.LeftButton = TRUE;
> + Private->PointerMode.RightButton = TRUE;
> +
> + Private->SimplePointer.Reset = EmuGopSimplePointerReset;
> + Private->SimplePointer.GetState = EmuGopSimplePointerGetState;
> + Private->SimplePointer.Mode = &Private->PointerMode;
> +
> + Status = gBS->CreateEvent (
> + EVT_NOTIFY_WAIT,
> + TPL_NOTIFY,
> + EmuGopSimplePointerWaitForInput,
> + Private,
> + &Private->SimplePointer.WaitForInput
> + );
> +
> + return Status;
> +}
> diff --git a/EmulatorPkg/EmuGopDxe/GopScreen.c
> b/EmulatorPkg/EmuGopDxe/GopScreen.c
> index aa21fa68de..761d945c15 100644
> --- a/EmulatorPkg/EmuGopDxe/GopScreen.c
> +++ b/EmulatorPkg/EmuGopDxe/GopScreen.c
> @@ -1,416 +1,416 @@
> -/*++ @file
> -
> -Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
> -Portions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -Module Name:
> -
> - EmuGopScreen.c
> -
> -Abstract:
> -
> - This file produces the graphics abstration of UGA. It is called by
> - EmuGopDriver.c file which deals with the EFI 1.1 driver model.
> - This file just does graphics.
> -
> -**/
> -
> -#include "Gop.h"
> -
> -
> -EFI_EVENT mGopScreenExitBootServicesEvent;
> -
> -GOP_MODE_DATA mGopModeData[] = {
> - { 800, 600, 0, 0 },
> - { 640, 480, 0, 0 },
> - { 720, 400, 0, 0 },
> - {1024, 768, 0, 0 },
> - {1280, 1024, 0, 0 }
> - };
> -
> -
> -/**
> - Returns information for an available graphics mode that the graphics device
> - and the set of active video output devices supports.
> -
> - @param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
> - @param ModeNumber The mode number to return information on.
> - @param SizeOfInfo A pointer to the size, in bytes, of the Info buffer.
> - @param Info A pointer to callee allocated buffer that returns
> information about ModeNumber.
> -
> - @retval EFI_SUCCESS Mode information returned.
> - @retval EFI_BUFFER_TOO_SMALL The Info buffer was too small.
> - @retval EFI_DEVICE_ERROR A hardware error occurred trying to retrieve
> the video mode.
> - @retval EFI_NOT_STARTED Video display is not initialized. Call SetMode ()
> - @retval EFI_INVALID_PARAMETER One of the input args was NULL.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopQuerytMode (
> - IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
> - IN UINT32 ModeNumber,
> - OUT UINTN *SizeOfInfo,
> - OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info
> - )
> -{
> - GOP_PRIVATE_DATA *Private;
> -
> - Private = GOP_PRIVATE_DATA_FROM_THIS (This);
> -
> - if (Info == NULL || SizeOfInfo == NULL || (UINTN) ModeNumber >= This-
> >Mode->MaxMode) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - *Info = AllocatePool (sizeof
> (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
> - if (*Info == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
> -
> - (*Info)->Version = 0;
> - (*Info)->HorizontalResolution = Private-
> >ModeData[ModeNumber].HorizontalResolution;
> - (*Info)->VerticalResolution = Private-
> >ModeData[ModeNumber].VerticalResolution;
> - (*Info)->PixelFormat = PixelBltOnly;
> - (*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution;
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -
> -/**
> - Set the video device into the specified mode and clears the visible portions of
> - the output display to black.
> -
> - @param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
> - @param ModeNumber Abstraction that defines the current video mode.
> -
> - @retval EFI_SUCCESS The graphics mode specified by ModeNumber was
> selected.
> - @retval EFI_DEVICE_ERROR The device had an error and could not complete
> the request.
> - @retval EFI_UNSUPPORTED ModeNumber is not supported by this device.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopSetMode (
> - IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
> - IN UINT32 ModeNumber
> - )
> -{
> - EFI_STATUS Status;
> - GOP_PRIVATE_DATA *Private;
> - GOP_MODE_DATA *ModeData;
> - EFI_GRAPHICS_OUTPUT_BLT_PIXEL Fill;
> -
> - Private = GOP_PRIVATE_DATA_FROM_THIS (This);
> -
> - if (ModeNumber >= This->Mode->MaxMode) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - ModeData = &Private->ModeData[ModeNumber];
> - This->Mode->Mode = ModeNumber;
> - Private->GraphicsOutput.Mode->Info->HorizontalResolution = ModeData-
> >HorizontalResolution;
> - Private->GraphicsOutput.Mode->Info->VerticalResolution = ModeData-
> >VerticalResolution;
> - Private->GraphicsOutput.Mode->Info->PixelsPerScanLine = ModeData-
> >HorizontalResolution;
> -
> - if (Private->HardwareNeedsStarting) {
> - Status = EmuGopStartWindow (
> - Private,
> - ModeData->HorizontalResolution,
> - ModeData->VerticalResolution,
> - ModeData->ColorDepth,
> - ModeData->RefreshRate
> - );
> - if (EFI_ERROR (Status)) {
> - return EFI_DEVICE_ERROR;
> - }
> -
> - Private->HardwareNeedsStarting = FALSE;
> - }
> -
> -
> - Status = Private->EmuGraphicsWindow->Size(
> - Private->EmuGraphicsWindow,
> - ModeData->HorizontalResolution,
> - ModeData->VerticalResolution
> - );
> -
> -
> - Fill.Red = 0x7f;
> - Fill.Green = 0x7F;
> - Fill.Blue = 0x7f;
> - This->Blt (
> - This,
> - &Fill,
> - EfiBltVideoFill,
> - 0,
> - 0,
> - 0,
> - 0,
> - ModeData->HorizontalResolution,
> - ModeData->VerticalResolution,
> - ModeData->HorizontalResolution * sizeof
> (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
> - );
> - return EFI_SUCCESS;
> -}
> -
> -
> -
> -/**
> - Blt a rectangle of pixels on the graphics screen. Blt stands for BLock Transfer.
> -
> - @param This Protocol instance pointer.
> - @param BltBuffer Buffer containing data to blit into video buffer. This
> - buffer has a size of
> Width*Height*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
> - @param BltOperation Operation to perform on BlitBuffer and video
> memory
> - @param SourceX X coordinate of source for the BltBuffer.
> - @param SourceY Y coordinate of source for the BltBuffer.
> - @param DestinationX X coordinate of destination for the BltBuffer.
> - @param DestinationY Y coordinate of destination for the BltBuffer.
> - @param Width Width of rectangle in BltBuffer in pixels.
> - @param Height Hight of rectangle in BltBuffer in pixels.
> - @param Delta OPTIONAL
> -
> - @retval EFI_SUCCESS The Blt operation completed.
> - @retval EFI_INVALID_PARAMETER BltOperation is not valid.
> - @retval EFI_DEVICE_ERROR A hardware error occured writting to the
> video buffer.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -EmuGopBlt (
> - IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
> - IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL
> - IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,
> - IN UINTN SourceX,
> - IN UINTN SourceY,
> - IN UINTN DestinationX,
> - IN UINTN DestinationY,
> - IN UINTN Width,
> - IN UINTN Height,
> - IN UINTN Delta OPTIONAL
> - )
> -{
> - GOP_PRIVATE_DATA *Private;
> - EFI_TPL OriginalTPL;
> - EFI_STATUS Status;
> - EMU_GRAPHICS_WINDOWS__BLT_ARGS GopBltArgs;
> -
> - Private = GOP_PRIVATE_DATA_FROM_THIS (This);
> -
> - if ((UINT32)BltOperation >= EfiGraphicsOutputBltOperationMax) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (Width == 0 || Height == 0) {
> - return EFI_INVALID_PARAMETER;
> - }
> - //
> - // If Delta is zero, then the entire BltBuffer is being used, so Delta
> - // is the number of bytes in each row of BltBuffer. Since BltBuffer is Width
> pixels size,
> - // the number of bytes in each row can be computed.
> - //
> - if (Delta == 0) {
> - Delta = Width * sizeof (EFI_UGA_PIXEL);
> - }
> -
> - //
> - // We have to raise to TPL Notify, so we make an atomic write the frame
> buffer.
> - // We would not want a timer based event (Cursor, ...) to come in while we
> are
> - // doing this operation.
> - //
> - OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY);
> -
> - //
> - // Pack UGA Draw protocol parameters to
> EMU_GRAPHICS_WINDOWS__BLT_ARGS structure to adapt to
> - // GopBlt() API of Unix UGA IO protocol.
> - //
> - GopBltArgs.DestinationX = DestinationX;
> - GopBltArgs.DestinationY = DestinationY;
> - GopBltArgs.Height = Height;
> - GopBltArgs.Width = Width;
> - GopBltArgs.SourceX = SourceX;
> - GopBltArgs.SourceY = SourceY;
> - GopBltArgs.Delta = Delta;
> - Status = Private->EmuGraphicsWindow->Blt (
> - Private->EmuGraphicsWindow,
> - (EFI_UGA_PIXEL *)BltBuffer,
> - (EFI_UGA_BLT_OPERATION)BltOperation,
> - &GopBltArgs
> - );
> -
> - gBS->RestoreTPL (OriginalTPL);
> -
> - return Status;
> -}
> -
> -
> -//
> -// Construction and Destruction functions
> -//
> -
> -EFI_STATUS
> -EmuGopSupported (
> - IN EMU_IO_THUNK_PROTOCOL *EmuIoThunk
> - )
> -{
> - //
> - // Check to see if the IO abstraction represents a device type we support.
> - //
> - // This would be replaced a check of PCI subsystem ID, etc.
> - //
> - if (!CompareGuid (EmuIoThunk->Protocol,
> &gEmuGraphicsWindowProtocolGuid)) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -EmuGopStartWindow (
> - IN GOP_PRIVATE_DATA *Private,
> - IN UINT32 HorizontalResolution,
> - IN UINT32 VerticalResolution,
> - IN UINT32 ColorDepth,
> - IN UINT32 RefreshRate
> - )
> -{
> - EFI_STATUS Status;
> -
> - //
> - // Register to be notified on exit boot services so we can destroy the window.
> - //
> - Status = gBS->CreateEvent (
> - EVT_SIGNAL_EXIT_BOOT_SERVICES,
> - TPL_CALLBACK,
> - ShutdownGopEvent,
> - Private,
> - &mGopScreenExitBootServicesEvent
> - );
> -
> - Status = Private->EmuIoThunk->Open (Private->EmuIoThunk);
> - if (!EFI_ERROR (Status)) {
> - Private->EmuGraphicsWindow = Private->EmuIoThunk->Interface;
> -
> - // Register callback to support RegisterKeyNotify()
> - Status = Private->EmuGraphicsWindow->RegisterKeyNotify (
> - Private->EmuGraphicsWindow,
> - GopPrivateMakeCallbackFunction,
> - GopPrivateBreakCallbackFunction,
> - Private
> - );
> - ASSERT_EFI_ERROR (Status);
> - }
> - return Status;
> -}
> -
> -EFI_STATUS
> -EmuGopConstructor (
> - GOP_PRIVATE_DATA *Private
> - )
> -{
> - Private->ModeData = mGopModeData;
> -
> - Private->GraphicsOutput.QueryMode = EmuGopQuerytMode;
> - Private->GraphicsOutput.SetMode = EmuGopSetMode;
> - Private->GraphicsOutput.Blt = EmuGopBlt;
> -
> - //
> - // Allocate buffer for Graphics Output Protocol mode information
> - //
> - Private->GraphicsOutput.Mode = AllocatePool (sizeof
> (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE));
> - if (Private->GraphicsOutput.Mode == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> - Private->GraphicsOutput.Mode->Info = AllocatePool (sizeof
> (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
> - if (Private->GraphicsOutput.Mode->Info == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - Private->GraphicsOutput.Mode->MaxMode = sizeof(mGopModeData) /
> sizeof(GOP_MODE_DATA);
> - //
> - // Till now, we have no idea about the window size.
> - //
> - Private->GraphicsOutput.Mode->Mode =
> GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;
> - Private->GraphicsOutput.Mode->Info->Version = 0;
> - Private->GraphicsOutput.Mode->Info->HorizontalResolution = 0;
> - Private->GraphicsOutput.Mode->Info->VerticalResolution = 0;
> - Private->GraphicsOutput.Mode->Info->PixelFormat = PixelBltOnly;
> - Private->GraphicsOutput.Mode->SizeOfInfo = sizeof
> (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
> - Private->GraphicsOutput.Mode->FrameBufferBase =
> (EFI_PHYSICAL_ADDRESS) (UINTN) NULL;
> - Private->GraphicsOutput.Mode->FrameBufferSize = 0;
> -
> - Private->HardwareNeedsStarting = TRUE;
> - Private->EmuGraphicsWindow = NULL;
> -
> - EmuGopInitializeSimpleTextInForWindow (Private);
> -
> - EmuGopInitializeSimplePointerForWindow (Private);
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -
> -EFI_STATUS
> -EmuGopDestructor (
> - GOP_PRIVATE_DATA *Private
> - )
> -{
> - if (!Private->HardwareNeedsStarting) {
> - Private->EmuIoThunk->Close (Private->EmuIoThunk);
> - Private->EmuGraphicsWindow = NULL;
> - }
> -
> - //
> - // Free graphics output protocol occupied resource
> - //
> - if (Private->GraphicsOutput.Mode != NULL) {
> - if (Private->GraphicsOutput.Mode->Info != NULL) {
> - FreePool (Private->GraphicsOutput.Mode->Info);
> - }
> - FreePool (Private->GraphicsOutput.Mode);
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -VOID
> -EFIAPI
> -ShutdownGopEvent (
> - IN EFI_EVENT Event,
> - IN VOID *Context
> - )
> -/*++
> -
> -Routine Description:
> -
> - This is the UGA screen's callback notification function for exit-boot-services.
> - All we do here is call EmuGopDestructor().
> -
> -Arguments:
> -
> - Event - not used
> - Context - pointer to the Private structure.
> -
> -Returns:
> -
> - None.
> -
> -**/
> -{
> - EmuGopDestructor (Context);
> -}
> -
> +/*++ @file
> +
> +Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
> +Portions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +Module Name:
> +
> + EmuGopScreen.c
> +
> +Abstract:
> +
> + This file produces the graphics abstration of UGA. It is called by
> + EmuGopDriver.c file which deals with the EFI 1.1 driver model.
> + This file just does graphics.
> +
> +**/
> +
> +#include "Gop.h"
> +
> +
> +EFI_EVENT mGopScreenExitBootServicesEvent;
> +
> +GOP_MODE_DATA mGopModeData[] = {
> + { 800, 600, 0, 0 },
> + { 640, 480, 0, 0 },
> + { 720, 400, 0, 0 },
> + {1024, 768, 0, 0 },
> + {1280, 1024, 0, 0 }
> + };
> +
> +
> +/**
> + Returns information for an available graphics mode that the graphics device
> + and the set of active video output devices supports.
> +
> + @param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
> + @param ModeNumber The mode number to return information on.
> + @param SizeOfInfo A pointer to the size, in bytes, of the Info buffer.
> + @param Info A pointer to callee allocated buffer that returns
> information about ModeNumber.
> +
> + @retval EFI_SUCCESS Mode information returned.
> + @retval EFI_BUFFER_TOO_SMALL The Info buffer was too small.
> + @retval EFI_DEVICE_ERROR A hardware error occurred trying to retrieve
> the video mode.
> + @retval EFI_NOT_STARTED Video display is not initialized. Call SetMode ()
> + @retval EFI_INVALID_PARAMETER One of the input args was NULL.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopQuerytMode (
> + IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
> + IN UINT32 ModeNumber,
> + OUT UINTN *SizeOfInfo,
> + OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info
> + )
> +{
> + GOP_PRIVATE_DATA *Private;
> +
> + Private = GOP_PRIVATE_DATA_FROM_THIS (This);
> +
> + if (Info == NULL || SizeOfInfo == NULL || (UINTN) ModeNumber >= This-
> >Mode->MaxMode) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + *Info = AllocatePool (sizeof
> (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
> + if (*Info == NULL) {
> + return EFI_OUT_OF_RESOURCES;
> + }
> +
> + *SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
> +
> + (*Info)->Version = 0;
> + (*Info)->HorizontalResolution = Private-
> >ModeData[ModeNumber].HorizontalResolution;
> + (*Info)->VerticalResolution = Private-
> >ModeData[ModeNumber].VerticalResolution;
> + (*Info)->PixelFormat = PixelBltOnly;
> + (*Info)->PixelsPerScanLine = (*Info)->HorizontalResolution;
> +
> + return EFI_SUCCESS;
> +}
> +
> +
> +
> +/**
> + Set the video device into the specified mode and clears the visible portions of
> + the output display to black.
> +
> + @param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instance.
> + @param ModeNumber Abstraction that defines the current video mode.
> +
> + @retval EFI_SUCCESS The graphics mode specified by ModeNumber was
> selected.
> + @retval EFI_DEVICE_ERROR The device had an error and could not
> complete the request.
> + @retval EFI_UNSUPPORTED ModeNumber is not supported by this device.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopSetMode (
> + IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
> + IN UINT32 ModeNumber
> + )
> +{
> + EFI_STATUS Status;
> + GOP_PRIVATE_DATA *Private;
> + GOP_MODE_DATA *ModeData;
> + EFI_GRAPHICS_OUTPUT_BLT_PIXEL Fill;
> +
> + Private = GOP_PRIVATE_DATA_FROM_THIS (This);
> +
> + if (ModeNumber >= This->Mode->MaxMode) {
> + return EFI_UNSUPPORTED;
> + }
> +
> + ModeData = &Private->ModeData[ModeNumber];
> + This->Mode->Mode = ModeNumber;
> + Private->GraphicsOutput.Mode->Info->HorizontalResolution = ModeData-
> >HorizontalResolution;
> + Private->GraphicsOutput.Mode->Info->VerticalResolution = ModeData-
> >VerticalResolution;
> + Private->GraphicsOutput.Mode->Info->PixelsPerScanLine = ModeData-
> >HorizontalResolution;
> +
> + if (Private->HardwareNeedsStarting) {
> + Status = EmuGopStartWindow (
> + Private,
> + ModeData->HorizontalResolution,
> + ModeData->VerticalResolution,
> + ModeData->ColorDepth,
> + ModeData->RefreshRate
> + );
> + if (EFI_ERROR (Status)) {
> + return EFI_DEVICE_ERROR;
> + }
> +
> + Private->HardwareNeedsStarting = FALSE;
> + }
> +
> +
> + Status = Private->EmuGraphicsWindow->Size(
> + Private->EmuGraphicsWindow,
> + ModeData->HorizontalResolution,
> + ModeData->VerticalResolution
> + );
> +
> +
> + Fill.Red = 0x7f;
> + Fill.Green = 0x7F;
> + Fill.Blue = 0x7f;
> + This->Blt (
> + This,
> + &Fill,
> + EfiBltVideoFill,
> + 0,
> + 0,
> + 0,
> + 0,
> + ModeData->HorizontalResolution,
> + ModeData->VerticalResolution,
> + ModeData->HorizontalResolution * sizeof
> (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
> + );
> + return EFI_SUCCESS;
> +}
> +
> +
> +
> +/**
> + Blt a rectangle of pixels on the graphics screen. Blt stands for BLock Transfer.
> +
> + @param This Protocol instance pointer.
> + @param BltBuffer Buffer containing data to blit into video buffer. This
> + buffer has a size of
> Width*Height*sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
> + @param BltOperation Operation to perform on BlitBuffer and video
> memory
> + @param SourceX X coordinate of source for the BltBuffer.
> + @param SourceY Y coordinate of source for the BltBuffer.
> + @param DestinationX X coordinate of destination for the BltBuffer.
> + @param DestinationY Y coordinate of destination for the BltBuffer.
> + @param Width Width of rectangle in BltBuffer in pixels.
> + @param Height Hight of rectangle in BltBuffer in pixels.
> + @param Delta OPTIONAL
> +
> + @retval EFI_SUCCESS The Blt operation completed.
> + @retval EFI_INVALID_PARAMETER BltOperation is not valid.
> + @retval EFI_DEVICE_ERROR A hardware error occured writting to the
> video buffer.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +EmuGopBlt (
> + IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
> + IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer, OPTIONAL
> + IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,
> + IN UINTN SourceX,
> + IN UINTN SourceY,
> + IN UINTN DestinationX,
> + IN UINTN DestinationY,
> + IN UINTN Width,
> + IN UINTN Height,
> + IN UINTN Delta OPTIONAL
> + )
> +{
> + GOP_PRIVATE_DATA *Private;
> + EFI_TPL OriginalTPL;
> + EFI_STATUS Status;
> + EMU_GRAPHICS_WINDOWS__BLT_ARGS GopBltArgs;
> +
> + Private = GOP_PRIVATE_DATA_FROM_THIS (This);
> +
> + if ((UINT32)BltOperation >= EfiGraphicsOutputBltOperationMax) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + if (Width == 0 || Height == 0) {
> + return EFI_INVALID_PARAMETER;
> + }
> + //
> + // If Delta is zero, then the entire BltBuffer is being used, so Delta
> + // is the number of bytes in each row of BltBuffer. Since BltBuffer is Width
> pixels size,
> + // the number of bytes in each row can be computed.
> + //
> + if (Delta == 0) {
> + Delta = Width * sizeof (EFI_UGA_PIXEL);
> + }
> +
> + //
> + // We have to raise to TPL Notify, so we make an atomic write the frame
> buffer.
> + // We would not want a timer based event (Cursor, ...) to come in while we
> are
> + // doing this operation.
> + //
> + OriginalTPL = gBS->RaiseTPL (TPL_NOTIFY);
> +
> + //
> + // Pack UGA Draw protocol parameters to
> EMU_GRAPHICS_WINDOWS__BLT_ARGS structure to adapt to
> + // GopBlt() API of Unix UGA IO protocol.
> + //
> + GopBltArgs.DestinationX = DestinationX;
> + GopBltArgs.DestinationY = DestinationY;
> + GopBltArgs.Height = Height;
> + GopBltArgs.Width = Width;
> + GopBltArgs.SourceX = SourceX;
> + GopBltArgs.SourceY = SourceY;
> + GopBltArgs.Delta = Delta;
> + Status = Private->EmuGraphicsWindow->Blt (
> + Private->EmuGraphicsWindow,
> + (EFI_UGA_PIXEL *)BltBuffer,
> + (EFI_UGA_BLT_OPERATION)BltOperation,
> + &GopBltArgs
> + );
> +
> + gBS->RestoreTPL (OriginalTPL);
> +
> + return Status;
> +}
> +
> +
> +//
> +// Construction and Destruction functions
> +//
> +
> +EFI_STATUS
> +EmuGopSupported (
> + IN EMU_IO_THUNK_PROTOCOL *EmuIoThunk
> + )
> +{
> + //
> + // Check to see if the IO abstraction represents a device type we support.
> + //
> + // This would be replaced a check of PCI subsystem ID, etc.
> + //
> + if (!CompareGuid (EmuIoThunk->Protocol,
> &gEmuGraphicsWindowProtocolGuid)) {
> + return EFI_UNSUPPORTED;
> + }
> +
> + return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +EmuGopStartWindow (
> + IN GOP_PRIVATE_DATA *Private,
> + IN UINT32 HorizontalResolution,
> + IN UINT32 VerticalResolution,
> + IN UINT32 ColorDepth,
> + IN UINT32 RefreshRate
> + )
> +{
> + EFI_STATUS Status;
> +
> + //
> + // Register to be notified on exit boot services so we can destroy the window.
> + //
> + Status = gBS->CreateEvent (
> + EVT_SIGNAL_EXIT_BOOT_SERVICES,
> + TPL_CALLBACK,
> + ShutdownGopEvent,
> + Private,
> + &mGopScreenExitBootServicesEvent
> + );
> +
> + Status = Private->EmuIoThunk->Open (Private->EmuIoThunk);
> + if (!EFI_ERROR (Status)) {
> + Private->EmuGraphicsWindow = Private->EmuIoThunk->Interface;
> +
> + // Register callback to support RegisterKeyNotify()
> + Status = Private->EmuGraphicsWindow->RegisterKeyNotify (
> + Private->EmuGraphicsWindow,
> + GopPrivateMakeCallbackFunction,
> + GopPrivateBreakCallbackFunction,
> + Private
> + );
> + ASSERT_EFI_ERROR (Status);
> + }
> + return Status;
> +}
> +
> +EFI_STATUS
> +EmuGopConstructor (
> + GOP_PRIVATE_DATA *Private
> + )
> +{
> + Private->ModeData = mGopModeData;
> +
> + Private->GraphicsOutput.QueryMode = EmuGopQuerytMode;
> + Private->GraphicsOutput.SetMode = EmuGopSetMode;
> + Private->GraphicsOutput.Blt = EmuGopBlt;
> +
> + //
> + // Allocate buffer for Graphics Output Protocol mode information
> + //
> + Private->GraphicsOutput.Mode = AllocatePool (sizeof
> (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE));
> + if (Private->GraphicsOutput.Mode == NULL) {
> + return EFI_OUT_OF_RESOURCES;
> + }
> + Private->GraphicsOutput.Mode->Info = AllocatePool (sizeof
> (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));
> + if (Private->GraphicsOutput.Mode->Info == NULL) {
> + return EFI_OUT_OF_RESOURCES;
> + }
> +
> + Private->GraphicsOutput.Mode->MaxMode = sizeof(mGopModeData) /
> sizeof(GOP_MODE_DATA);
> + //
> + // Till now, we have no idea about the window size.
> + //
> + Private->GraphicsOutput.Mode->Mode =
> GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER;
> + Private->GraphicsOutput.Mode->Info->Version = 0;
> + Private->GraphicsOutput.Mode->Info->HorizontalResolution = 0;
> + Private->GraphicsOutput.Mode->Info->VerticalResolution = 0;
> + Private->GraphicsOutput.Mode->Info->PixelFormat = PixelBltOnly;
> + Private->GraphicsOutput.Mode->SizeOfInfo = sizeof
> (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);
> + Private->GraphicsOutput.Mode->FrameBufferBase =
> (EFI_PHYSICAL_ADDRESS) (UINTN) NULL;
> + Private->GraphicsOutput.Mode->FrameBufferSize = 0;
> +
> + Private->HardwareNeedsStarting = TRUE;
> + Private->EmuGraphicsWindow = NULL;
> +
> + EmuGopInitializeSimpleTextInForWindow (Private);
> +
> + EmuGopInitializeSimplePointerForWindow (Private);
> +
> + return EFI_SUCCESS;
> +}
> +
> +
> +
> +EFI_STATUS
> +EmuGopDestructor (
> + GOP_PRIVATE_DATA *Private
> + )
> +{
> + if (!Private->HardwareNeedsStarting) {
> + Private->EmuIoThunk->Close (Private->EmuIoThunk);
> + Private->EmuGraphicsWindow = NULL;
> + }
> +
> + //
> + // Free graphics output protocol occupied resource
> + //
> + if (Private->GraphicsOutput.Mode != NULL) {
> + if (Private->GraphicsOutput.Mode->Info != NULL) {
> + FreePool (Private->GraphicsOutput.Mode->Info);
> + }
> + FreePool (Private->GraphicsOutput.Mode);
> + }
> +
> + return EFI_SUCCESS;
> +}
> +
> +
> +VOID
> +EFIAPI
> +ShutdownGopEvent (
> + IN EFI_EVENT Event,
> + IN VOID *Context
> + )
> +/*++
> +
> +Routine Description:
> +
> + This is the UGA screen's callback notification function for exit-boot-services.
> + All we do here is call EmuGopDestructor().
> +
> +Arguments:
> +
> + Event - not used
> + Context - pointer to the Private structure.
> +
> +Returns:
> +
> + None.
> +
> +**/
> +{
> + EmuGopDestructor (Context);
> +}
> +
> diff --git a/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c
> b/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c
> index 09d16fd8b6..0031baea52 100644
> --- a/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c
> +++ b/EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c
> @@ -42,7 +42,7 @@ EFI_SIMPLE_NETWORK_PROTOCOL gEmuSnpTemplate =
> {
> NULL // Mode
> };
>
> -EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {
> +EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {
> EfiSimpleNetworkStopped, // State
> NET_ETHER_ADDR_LEN, // HwAddressSize
> NET_ETHER_HEADER_SIZE, // MediaHeaderSize
> diff --git a/EmulatorPkg/Include/Library/EmuMagicPageLib.h
> b/EmulatorPkg/Include/Library/EmuMagicPageLib.h
> index e0c339a3b8..edae364b06 100644
> --- a/EmulatorPkg/Include/Library/EmuMagicPageLib.h
> +++ b/EmulatorPkg/Include/Library/EmuMagicPageLib.h
> @@ -1,38 +1,38 @@
> -/*++ @file
> -The PCD, gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage, points to a
> magic page
> -of memory that is like SRAM on an embedded system. This file defines what
> goes
> -where in the magic page.
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#ifndef __EMU_MAGIC_PAGE_LIB_H__
> -#define __EMU_MAGIC_PAGE_LIB_H__
> -
> -#include <PiPei.h>
> -#include <Library/PcdLib.h>
> -#include <Protocol/EmuThunk.h>
> -
> -typedef struct {
> - // Used by PEI Core and PEIMs to store the PEI Services pointer.
> - // Privilege issues prevent using the PI mechanism in the emulator.
> - CONST EFI_PEI_SERVICES **PeiServicesTablePointer;
> -
> - // Used by SecPeiServicesLib
> - EFI_PEI_PPI_DESCRIPTOR *PpiList;
> -
> - // Needed by PEI PEI PeCoffLoaderExtraActionLib
> - EMU_THUNK_PROTOCOL *Thunk;
> -} EMU_MAGIC_PAGE_LAYOUT;
> -
> -#define EMU_MAGIC_PAGE() ((EMU_MAGIC_PAGE_LAYOUT
> *)((UINTN)PcdGet64 (PcdPeiServicesTablePage)))
> -
> -#endif
> +/*++ @file
> +The PCD, gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage, points to a
> magic page
> +of memory that is like SRAM on an embedded system. This file defines what
> goes
> +where in the magic page.
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#ifndef __EMU_MAGIC_PAGE_LIB_H__
> +#define __EMU_MAGIC_PAGE_LIB_H__
> +
> +#include <PiPei.h>
> +#include <Library/PcdLib.h>
> +#include <Protocol/EmuThunk.h>
> +
> +typedef struct {
> + // Used by PEI Core and PEIMs to store the PEI Services pointer.
> + // Privilege issues prevent using the PI mechanism in the emulator.
> + CONST EFI_PEI_SERVICES **PeiServicesTablePointer;
> +
> + // Used by SecPeiServicesLib
> + EFI_PEI_PPI_DESCRIPTOR *PpiList;
> +
> + // Needed by PEI PEI PeCoffLoaderExtraActionLib
> + EMU_THUNK_PROTOCOL *Thunk;
> +} EMU_MAGIC_PAGE_LAYOUT;
> +
> +#define EMU_MAGIC_PAGE() ((EMU_MAGIC_PAGE_LAYOUT
> *)((UINTN)PcdGet64 (PcdPeiServicesTablePage)))
> +
> +#endif
> diff --git a/EmulatorPkg/Include/Library/EmuThunkLib.h
> b/EmulatorPkg/Include/Library/EmuThunkLib.h
> index 98b22e16ee..e18a613d94 100644
> --- a/EmulatorPkg/Include/Library/EmuThunkLib.h
> +++ b/EmulatorPkg/Include/Library/EmuThunkLib.h
> @@ -1,42 +1,42 @@
> -/*++ @file
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#ifndef __EMU_THUNK_LIB_H__
> -#define __EMU_THUNK_LIB_H__
> -
> -#include <Protocol/EmuThunk.h>
> -
> -
> -extern EMU_THUNK_PROTOCOL *gEmuThunk;
> -
> -
> -/**
> - Serach the EMU IO Thunk database for a matching EMU IO Thunk
> - Protocol instance.
> -
> - @param Protocol Protocol to search for.
> - @param Instance Instance of protocol to search for.
> -
> - @retval NULL Protocol and Instance not found.
> - @retval other EMU IO Thunk protocol that matched.
> -
> -**/
> -EMU_IO_THUNK_PROTOCOL *
> -EFIAPI
> -GetIoThunkInstance (
> - IN EFI_GUID *Protocol,
> - IN UINTN Instance
> - );
> -
> -
> -#endif
> +/*++ @file
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#ifndef __EMU_THUNK_LIB_H__
> +#define __EMU_THUNK_LIB_H__
> +
> +#include <Protocol/EmuThunk.h>
> +
> +
> +extern EMU_THUNK_PROTOCOL *gEmuThunk;
> +
> +
> +/**
> + Serach the EMU IO Thunk database for a matching EMU IO Thunk
> + Protocol instance.
> +
> + @param Protocol Protocol to search for.
> + @param Instance Instance of protocol to search for.
> +
> + @retval NULL Protocol and Instance not found.
> + @retval other EMU IO Thunk protocol that matched.
> +
> +**/
> +EMU_IO_THUNK_PROTOCOL *
> +EFIAPI
> +GetIoThunkInstance (
> + IN EFI_GUID *Protocol,
> + IN UINTN Instance
> + );
> +
> +
> +#endif
> diff --git a/EmulatorPkg/Include/Library/PpiListLib.h
> b/EmulatorPkg/Include/Library/PpiListLib.h
> index c1271b23c8..fad1473a41 100644
> --- a/EmulatorPkg/Include/Library/PpiListLib.h
> +++ b/EmulatorPkg/Include/Library/PpiListLib.h
> @@ -1,21 +1,21 @@
> -/*++ @file
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#ifndef __PPI_LIST_LIB_H__
> -#define __PPI_LIST_LIB_H__
> -
> -
> -extern CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList;
> -
> -
> -#endif
> +/*++ @file
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#ifndef __PPI_LIST_LIB_H__
> +#define __PPI_LIST_LIB_H__
> +
> +
> +extern CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList;
> +
> +
> +#endif
> diff --git a/EmulatorPkg/Include/Library/SmbiosLib.h
> b/EmulatorPkg/Include/Library/SmbiosLib.h
> index 8ee14e07dd..6dcb7336d5 100644
> --- a/EmulatorPkg/Include/Library/SmbiosLib.h
> +++ b/EmulatorPkg/Include/Library/SmbiosLib.h
> @@ -1,202 +1,202 @@
> -/** @file
> - Provides library functions for common SMBIOS operations. Only available to
> DXE
> - and UEFI module types.
> -
> -
> -Copyright (c) 2012, Apple Inc. All rights reserved.
> -Portitions Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
> -This program and the accompanying materials are licensed and made
> available under
> -the terms and conditions of the BSD License that accompanies this distribution.
> -The full text of the license may be found at
> -http://opensource.org/licenses/bsd-license.php.
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#ifndef _SMBIOS_LIB_H__
> -#define _SMBIOS_LIB_H__
> -
> -#include <IndustryStandard/SmBios.h>
> -#include <Protocol/Smbios.h>
> -
> -
> -///
> -/// Cache copy of the SMBIOS Protocol pointer
> -///
> -extern EFI_SMBIOS_PROTOCOL *gSmbios;
> -
> -
> -///
> -/// Template for SMBIOS table initialization.
> -/// The SMBIOS_TABLE_STRING types in the formated area must match the
> -/// StringArray sequene.
> -///
> -typedef struct {
> - //
> - // formatted area of a given SMBIOS record
> - //
> - SMBIOS_STRUCTURE *Entry;
> - //
> - // NULL terminated array of ASCII strings to be added to the SMBIOS record.
> - //
> - CHAR8 **StringArray;
> -} SMBIOS_TEMPLATE_ENTRY;
> -
> -
> -/**
> - Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
> - entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
> -
> - @param Template Array of SMBIOS_TEMPLATE_ENTRY entries.
> -
> - @retval EFI_SUCCESS New SMBIOS tables were created.
> - @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibInitializeFromTemplate (
> - IN SMBIOS_TEMPLATE_ENTRY *Template
> - );
> -
> -
> -
> -/**
> - Create SMBIOS record.
> -
> - Converts a fixed SMBIOS structure and an array of pointers to strings into
> - an SMBIOS record where the strings are cat'ed on the end of the fixed record
> - and terminated via a double NULL and add to SMBIOS table.
> -
> - SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
> - { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof
> (SMBIOS_TABLE_TYPE12), 0 },
> - 1 // StringCount
> - };
> - CHAR8 *gSmbiosType12Strings[] = {
> - "Not Found",
> - NULL
> - };
> -
> - ...
> - AddSmbiosEntryFromTemplate (
> - (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
> - gSmbiosType12Strings
> - );
> -
> - @param SmbiosEntry Fixed SMBIOS structure
> - @param StringArray Array of strings to convert to an SMBIOS string pack.
> - NULL is OK.
> -
> - @retval EFI_SUCCESS New SmbiosEntry was added to SMBIOS table.
> - @retval EFI_OUT_OF_RESOURCES SmbiosEntry was not added.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibCreateEntry (
> - IN SMBIOS_STRUCTURE *SmbiosEntry,
> - IN CHAR8 **StringArray
> - );
> -
> -
> -/**
> - Update the string associated with an existing SMBIOS record.
> -
> - This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> - SMBIOS record is defined by how many strings were present when Add() was
> called.
> -
> - @param[in] SmbiosHandle SMBIOS Handle of structure that will have its
> string updated.
> - @param[in] StringNumber The non-zero string number of the string to
> update.
> - @param[in] String Update the StringNumber string with String.
> -
> - @retval EFI_SUCCESS SmbiosHandle had its StringNumber String
> updated.
> - @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> - @retval EFI_UNSUPPORTED String was not added because it is longer
> than the SMBIOS Table supports.
> - @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS
> record.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibUpdateString (
> - IN EFI_SMBIOS_HANDLE SmbiosHandle,
> - IN SMBIOS_TABLE_STRING StringNumber,
> - IN CHAR8 *String
> - );
> -
> -/**
> - Update the string associated with an existing SMBIOS record.
> -
> - This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> - SMBIOS record is defined by how many strings were present when Add() was
> called.
> -
> - @param[in] SmbiosHandle SMBIOS Handle of structure that will have its
> string updated.
> - @param[in] StringNumber The non-zero string number of the string to
> update.
> - @param[in] String Update the StringNumber string with String.
> -
> - @retval EFI_SUCCESS SmbiosHandle had its StringNumber String
> updated.
> - @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> - @retval EFI_UNSUPPORTED String was not added because it is longer
> than the SMBIOS Table supports.
> - @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS
> record.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibUpdateUnicodeString (
> - IN EFI_SMBIOS_HANDLE SmbiosHandle,
> - IN SMBIOS_TABLE_STRING StringNumber,
> - IN CHAR16 *String
> - );
> -
> -/**
> - Allow caller to read a specific SMBIOS string
> -
> - @param[in] Header SMBIOS record that contains the string.
> - @param[in[ StringNumber Instance of SMBIOS string 1 - N.
> -
> - @retval NULL Instance of Type SMBIOS string was not found.
> - @retval Other Pointer to matching SMBIOS string.
> -**/
> -CHAR8 *
> -EFIAPI
> -SmbiosLibReadString (
> - IN SMBIOS_STRUCTURE *Header,
> - IN EFI_SMBIOS_STRING StringNumber
> - );
> -
> -
> -/**
> - Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
> -
> - @param[in] Type Type of the next SMBIOS record to return.
> - @param[in[ Instance Instance of SMBIOS record 0 - N-1.
> - @param[out] SmbiosHandle Returns SMBIOS handle for the matching
> record.
> -
> - @retval NULL Instance of Type SMBIOS record was not found.
> - @retval Other Pointer to matching SMBIOS record.
> -**/
> -SMBIOS_STRUCTURE *
> -EFIAPI
> -SmbiosLibGetRecord (
> - IN EFI_SMBIOS_TYPE Type,
> - IN UINTN Instance,
> - OUT EFI_SMBIOS_HANDLE *SmbiosHandle
> - );
> -
> -/**
> - Remove an SMBIOS record.
> -
> - This function removes an SMBIOS record using the handle specified by
> SmbiosHandle.
> -
> - @param[in] SmbiosHandle The handle of the SMBIOS record to
> remove.
> -
> - @retval EFI_SUCCESS SMBIOS record was removed.
> - @retval EFI_INVALID_PARAMETER SmbiosHandle does not specify a valid
> SMBIOS record.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibRemove (
> - OUT EFI_SMBIOS_HANDLE SmbiosHandle
> - );
> -
> -
> -
> -
> -#endif
> +/** @file
> + Provides library functions for common SMBIOS operations. Only available to
> DXE
> + and UEFI module types.
> +
> +
> +Copyright (c) 2012, Apple Inc. All rights reserved.
> +Portitions Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
> +This program and the accompanying materials are licensed and made
> available under
> +the terms and conditions of the BSD License that accompanies this distribution.
> +The full text of the license may be found at
> +http://opensource.org/licenses/bsd-license.php.
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#ifndef _SMBIOS_LIB_H__
> +#define _SMBIOS_LIB_H__
> +
> +#include <IndustryStandard/SmBios.h>
> +#include <Protocol/Smbios.h>
> +
> +
> +///
> +/// Cache copy of the SMBIOS Protocol pointer
> +///
> +extern EFI_SMBIOS_PROTOCOL *gSmbios;
> +
> +
> +///
> +/// Template for SMBIOS table initialization.
> +/// The SMBIOS_TABLE_STRING types in the formated area must match the
> +/// StringArray sequene.
> +///
> +typedef struct {
> + //
> + // formatted area of a given SMBIOS record
> + //
> + SMBIOS_STRUCTURE *Entry;
> + //
> + // NULL terminated array of ASCII strings to be added to the SMBIOS record.
> + //
> + CHAR8 **StringArray;
> +} SMBIOS_TEMPLATE_ENTRY;
> +
> +
> +/**
> + Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
> + entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
> +
> + @param Template Array of SMBIOS_TEMPLATE_ENTRY entries.
> +
> + @retval EFI_SUCCESS New SMBIOS tables were created.
> + @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibInitializeFromTemplate (
> + IN SMBIOS_TEMPLATE_ENTRY *Template
> + );
> +
> +
> +
> +/**
> + Create SMBIOS record.
> +
> + Converts a fixed SMBIOS structure and an array of pointers to strings into
> + an SMBIOS record where the strings are cat'ed on the end of the fixed
> record
> + and terminated via a double NULL and add to SMBIOS table.
> +
> + SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
> + { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof
> (SMBIOS_TABLE_TYPE12), 0 },
> + 1 // StringCount
> + };
> + CHAR8 *gSmbiosType12Strings[] = {
> + "Not Found",
> + NULL
> + };
> +
> + ...
> + AddSmbiosEntryFromTemplate (
> + (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
> + gSmbiosType12Strings
> + );
> +
> + @param SmbiosEntry Fixed SMBIOS structure
> + @param StringArray Array of strings to convert to an SMBIOS string pack.
> + NULL is OK.
> +
> + @retval EFI_SUCCESS New SmbiosEntry was added to SMBIOS table.
> + @retval EFI_OUT_OF_RESOURCES SmbiosEntry was not added.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibCreateEntry (
> + IN SMBIOS_STRUCTURE *SmbiosEntry,
> + IN CHAR8 **StringArray
> + );
> +
> +
> +/**
> + Update the string associated with an existing SMBIOS record.
> +
> + This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> + SMBIOS record is defined by how many strings were present when Add() was
> called.
> +
> + @param[in] SmbiosHandle SMBIOS Handle of structure that will have its
> string updated.
> + @param[in] StringNumber The non-zero string number of the string to
> update.
> + @param[in] String Update the StringNumber string with String.
> +
> + @retval EFI_SUCCESS SmbiosHandle had its StringNumber String
> updated.
> + @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> + @retval EFI_UNSUPPORTED String was not added because it is longer
> than the SMBIOS Table supports.
> + @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS
> record.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibUpdateString (
> + IN EFI_SMBIOS_HANDLE SmbiosHandle,
> + IN SMBIOS_TABLE_STRING StringNumber,
> + IN CHAR8 *String
> + );
> +
> +/**
> + Update the string associated with an existing SMBIOS record.
> +
> + This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> + SMBIOS record is defined by how many strings were present when Add() was
> called.
> +
> + @param[in] SmbiosHandle SMBIOS Handle of structure that will have its
> string updated.
> + @param[in] StringNumber The non-zero string number of the string to
> update.
> + @param[in] String Update the StringNumber string with String.
> +
> + @retval EFI_SUCCESS SmbiosHandle had its StringNumber String
> updated.
> + @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> + @retval EFI_UNSUPPORTED String was not added because it is longer
> than the SMBIOS Table supports.
> + @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS
> record.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibUpdateUnicodeString (
> + IN EFI_SMBIOS_HANDLE SmbiosHandle,
> + IN SMBIOS_TABLE_STRING StringNumber,
> + IN CHAR16 *String
> + );
> +
> +/**
> + Allow caller to read a specific SMBIOS string
> +
> + @param[in] Header SMBIOS record that contains the string.
> + @param[in[ StringNumber Instance of SMBIOS string 1 - N.
> +
> + @retval NULL Instance of Type SMBIOS string was not found.
> + @retval Other Pointer to matching SMBIOS string.
> +**/
> +CHAR8 *
> +EFIAPI
> +SmbiosLibReadString (
> + IN SMBIOS_STRUCTURE *Header,
> + IN EFI_SMBIOS_STRING StringNumber
> + );
> +
> +
> +/**
> + Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
> +
> + @param[in] Type Type of the next SMBIOS record to return.
> + @param[in[ Instance Instance of SMBIOS record 0 - N-1.
> + @param[out] SmbiosHandle Returns SMBIOS handle for the matching
> record.
> +
> + @retval NULL Instance of Type SMBIOS record was not found.
> + @retval Other Pointer to matching SMBIOS record.
> +**/
> +SMBIOS_STRUCTURE *
> +EFIAPI
> +SmbiosLibGetRecord (
> + IN EFI_SMBIOS_TYPE Type,
> + IN UINTN Instance,
> + OUT EFI_SMBIOS_HANDLE *SmbiosHandle
> + );
> +
> +/**
> + Remove an SMBIOS record.
> +
> + This function removes an SMBIOS record using the handle specified by
> SmbiosHandle.
> +
> + @param[in] SmbiosHandle The handle of the SMBIOS record to
> remove.
> +
> + @retval EFI_SUCCESS SMBIOS record was removed.
> + @retval EFI_INVALID_PARAMETER SmbiosHandle does not specify a valid
> SMBIOS record.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibRemove (
> + OUT EFI_SMBIOS_HANDLE SmbiosHandle
> + );
> +
> +
> +
> +
> +#endif
> diff --git a/EmulatorPkg/Include/Protocol/EmuBlockIo.h
> b/EmulatorPkg/Include/Protocol/EmuBlockIo.h
> index 8e5463c74e..45ca5b9a7a 100644
> --- a/EmulatorPkg/Include/Protocol/EmuBlockIo.h
> +++ b/EmulatorPkg/Include/Protocol/EmuBlockIo.h
> @@ -62,7 +62,7 @@ EFI_STATUS
> @param[in] MediaId Id of the media, changes every time the media is
> replaced.
> @param[in] Lba The starting Logical Block Address to read from.
> - @param[in, out] Token A pointer to the token associated with the
> transaction.
> + @param[in, out] Token A pointer to the token associated with the
> transaction.
> @param[in] BufferSize Size of Buffer, must be a multiple of device block
> size.
> @param[out] Buffer A pointer to the destination buffer for the data.
> The
> caller is responsible for either having implicit or
> diff --git a/EmulatorPkg/Include/Protocol/EmuFileSystem.h
> b/EmulatorPkg/Include/Protocol/EmuFileSystem.h
> index 6d8717479b..d13853877e 100644
> --- a/EmulatorPkg/Include/Protocol/EmuFileSystem.h
> +++ b/EmulatorPkg/Include/Protocol/EmuFileSystem.h
> @@ -1,140 +1,140 @@
> -/** @file
> - SimpleFileSystem protocol as defined in the UEFI 2.0 specification.
> -
> - The SimpleFileSystem protocol is the programmatic access to the FAT
> (12,16,32)
> - file system specified in UEFI 2.0. It can also be used to abstract a file
> - system other than FAT.
> -
> - UEFI 2.0 can boot from any valid EFI image contained in a SimpleFileSystem.
> -
> -Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
> -Portions copyright (c) 2011, Apple Inc. All rights reserved.
> -This program and the accompanying materials are licensed and made
> available under
> -the terms and conditions of the BSD License that accompanies this distribution.
> -The full text of the license may be found at
> -http://opensource.org/licenses/bsd-license.php.
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#ifndef _EMU_UGA_IO_H_
> -#define _EMU_UGA_IO_H_
> -
> -#include <Protocol/SimplePointer.h>
> -#include <Protocol/SimpleTextIn.h>
> -#include <Protocol/SimpleTextInEx.h>
> -#include <Protocol/UgaDraw.h>
> -
> -#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
> - { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA,
> 0xC1 } }
> -
> -typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL
> EMU_GRAPHICS_WINDOW_PROTOCOL;
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
> - UINT32 Width,
> - UINT32 Height
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
> - EFI_KEY_DATA *key
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> - IN EFI_KEY_TOGGLE_STATE *KeyToggleState
> - );
> -
> -
> -typedef
> -VOID
> -(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
> - IN VOID *Context,
> - IN EFI_KEY_DATA *KeyData
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> - IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK CallBack,
> - IN VOID *Context
> - );
> -
> -
> -typedef struct {
> - UINTN SourceX;
> - UINTN SourceY;
> - UINTN DestinationX;
> - UINTN DestinationY;
> - UINTN Width;
> - UINTN Height;
> - UINTN Delta;
> -} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> - IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
> - IN EFI_UGA_BLT_OPERATION BltOperation,
> - IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args
> - );
> -
> -typedef
> -BOOLEAN
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> - IN EFI_KEY_DATA *KeyData
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> - EFI_SIMPLE_POINTER_STATE *state
> - );
> -
> -struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
> - EMU_GRAPHICS_WINDOWS_SIZE Size;
> - EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey;
> - EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState;
> - EMU_GRAPHICS_WINDOWS_GET_KEY GetKey;
> - EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify;
> - EMU_GRAPHICS_WINDOWS_BLT Blt;
> - EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed;
> - EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer;
> - EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState;
> -};
> -
> -
> -extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
> -
> -#endif
> +/** @file
> + SimpleFileSystem protocol as defined in the UEFI 2.0 specification.
> +
> + The SimpleFileSystem protocol is the programmatic access to the FAT
> (12,16,32)
> + file system specified in UEFI 2.0. It can also be used to abstract a file
> + system other than FAT.
> +
> + UEFI 2.0 can boot from any valid EFI image contained in a SimpleFileSystem.
> +
> +Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
> +Portions copyright (c) 2011, Apple Inc. All rights reserved.
> +This program and the accompanying materials are licensed and made
> available under
> +the terms and conditions of the BSD License that accompanies this distribution.
> +The full text of the license may be found at
> +http://opensource.org/licenses/bsd-license.php.
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#ifndef _EMU_UGA_IO_H_
> +#define _EMU_UGA_IO_H_
> +
> +#include <Protocol/SimplePointer.h>
> +#include <Protocol/SimpleTextIn.h>
> +#include <Protocol/SimpleTextInEx.h>
> +#include <Protocol/UgaDraw.h>
> +
> +#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
> + { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA,
> 0xC1 } }
> +
> +typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL
> EMU_GRAPHICS_WINDOW_PROTOCOL;
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
> + UINT32 Width,
> + UINT32 Height
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
> + EFI_KEY_DATA *key
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> + IN EFI_KEY_TOGGLE_STATE *KeyToggleState
> + );
> +
> +
> +typedef
> +VOID
> +(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
> + IN VOID *Context,
> + IN EFI_KEY_DATA *KeyData
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> + IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK CallBack,
> + IN VOID *Context
> + );
> +
> +
> +typedef struct {
> + UINTN SourceX;
> + UINTN SourceY;
> + UINTN DestinationX;
> + UINTN DestinationY;
> + UINTN Width;
> + UINTN Height;
> + UINTN Delta;
> +} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> + IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
> + IN EFI_UGA_BLT_OPERATION BltOperation,
> + IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args
> + );
> +
> +typedef
> +BOOLEAN
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> + IN EFI_KEY_DATA *KeyData
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> + EFI_SIMPLE_POINTER_STATE *state
> + );
> +
> +struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
> + EMU_GRAPHICS_WINDOWS_SIZE Size;
> + EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey;
> + EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState;
> + EMU_GRAPHICS_WINDOWS_GET_KEY GetKey;
> + EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify;
> + EMU_GRAPHICS_WINDOWS_BLT Blt;
> + EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed;
> + EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer;
> + EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState;
> +};
> +
> +
> +extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
> +
> +#endif
> diff --git a/EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h
> b/EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h
> index 844159a766..e502fc68da 100644
> --- a/EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h
> +++ b/EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h
> @@ -1,134 +1,134 @@
> -/*++ @file
> -
> -Copyright (c) 2006, Tristan Gingold. All rights reserved.<BR>
> -Portitions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the
> -BSD License which accompanies this distribution. The full text of the
> -license may be found at http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#ifndef _EMU_UGA_IO_H_
> -#define _EMU_UGA_IO_H_
> -
> -#include <Protocol/SimplePointer.h>
> -#include <Protocol/SimpleTextIn.h>
> -#include <Protocol/SimpleTextInEx.h>
> -#include <Protocol/UgaDraw.h>
> -
> -#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
> - { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA,
> 0xC1 } }
> -
> -typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL
> EMU_GRAPHICS_WINDOW_PROTOCOL;
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
> - UINT32 Width,
> - UINT32 Height
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
> - EFI_KEY_DATA *key
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> - IN EFI_KEY_TOGGLE_STATE *KeyToggleState
> - );
> -
> -
> -typedef
> -VOID
> -(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
> - IN VOID *Context,
> - IN EFI_KEY_DATA *KeyData
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> - IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> MakeCallBack,
> - IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> BreakCallBack,
> - IN VOID *Context
> - );
> -
> -
> -typedef struct {
> - UINTN SourceX;
> - UINTN SourceY;
> - UINTN DestinationX;
> - UINTN DestinationY;
> - UINTN Width;
> - UINTN Height;
> - UINTN Delta;
> -} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> - IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
> - IN EFI_UGA_BLT_OPERATION BltOperation,
> - IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args
> - );
> -
> -typedef
> -BOOLEAN
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> - IN EFI_KEY_DATA *KeyData
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
> - );
> -
> -typedef
> -EFI_STATUS
> -(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
> - EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> - EFI_SIMPLE_POINTER_STATE *state
> - );
> -
> -struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
> - EMU_GRAPHICS_WINDOWS_SIZE Size;
> - EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey;
> - EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState;
> - EMU_GRAPHICS_WINDOWS_GET_KEY GetKey;
> - EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify;
> - EMU_GRAPHICS_WINDOWS_BLT Blt;
> - EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed;
> - EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer;
> - EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState;
> -};
> -
> -
> -extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
> -
> -#endif
> +/*++ @file
> +
> +Copyright (c) 2006, Tristan Gingold. All rights reserved.<BR>
> +Portitions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the
> +BSD License which accompanies this distribution. The full text of the
> +license may be found at http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#ifndef _EMU_UGA_IO_H_
> +#define _EMU_UGA_IO_H_
> +
> +#include <Protocol/SimplePointer.h>
> +#include <Protocol/SimpleTextIn.h>
> +#include <Protocol/SimpleTextInEx.h>
> +#include <Protocol/UgaDraw.h>
> +
> +#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \
> + { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xCA,
> 0xC1 } }
> +
> +typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL
> EMU_GRAPHICS_WINDOW_PROTOCOL;
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
> + UINT32 Width,
> + UINT32 Height
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *Uga
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *Uga,
> + EFI_KEY_DATA *key
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> + IN EFI_KEY_TOGGLE_STATE *KeyToggleState
> + );
> +
> +
> +typedef
> +VOID
> +(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) (
> + IN VOID *Context,
> + IN EFI_KEY_DATA *KeyData
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> + IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> MakeCallBack,
> + IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> BreakCallBack,
> + IN VOID *Context
> + );
> +
> +
> +typedef struct {
> + UINTN SourceX;
> + UINTN SourceY;
> + UINTN DestinationX;
> + UINTN DestinationY;
> + UINTN Width;
> + UINTN Height;
> + UINTN Delta;
> +} EMU_GRAPHICS_WINDOWS__BLT_ARGS;
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)(
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> + IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
> + IN EFI_UGA_BLT_OPERATION BltOperation,
> + IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args
> + );
> +
> +typedef
> +BOOLEAN
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> + IN EFI_KEY_DATA *KeyData
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows
> + );
> +
> +typedef
> +EFI_STATUS
> +(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)(
> + EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows,
> + EFI_SIMPLE_POINTER_STATE *state
> + );
> +
> +struct _EMU_GRAPHICS_WINDOW_PROTOCOL {
> + EMU_GRAPHICS_WINDOWS_SIZE Size;
> + EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey;
> + EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState;
> + EMU_GRAPHICS_WINDOWS_GET_KEY GetKey;
> + EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify;
> + EMU_GRAPHICS_WINDOWS_BLT Blt;
> + EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed;
> + EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer;
> + EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState;
> +};
> +
> +
> +extern EFI_GUID gEmuGraphicsWindowProtocolGuid;
> +
> +#endif
> diff --git a/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c
> b/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c
> index 7478a5ef2a..aa2066e132 100644
> --- a/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c
> +++ b/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c
> @@ -180,4 +180,4 @@ DevicePathToTextLibConstructor (
> DevicePathFromTextAddFilter (L"EmuThread", DevPathFromTextEmuThread);
> DevicePathFromTextAddFilter (L"EmuFs", DevPathFromTextEmuFs);
> return EFI_SUCCESS;
> -}
> \ No newline at end of file
> +}
> diff --git a/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf
> b/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf
> index f5726785e1..c484f8ec16 100644
> --- a/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf
> +++ b/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf
> @@ -45,4 +45,4 @@ [Protocols]
> gEmuGraphicsWindowProtocolGuid
> gEfiSimpleFileSystemProtocolGuid
> gEmuBlockIoProtocolGuid
> - gEmuThreadThunkProtocolGuid
> \ No newline at end of file
> + gEmuThreadThunkProtocolGuid
> diff --git a/EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c
> b/EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c
> index 22f8da7b64..7dd2d49451 100644
> --- a/EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c
> +++ b/EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c
> @@ -85,4 +85,4 @@ GetIoThunkInstance (
> }
>
> return NULL;
> -}
> \ No newline at end of file
> +}
> diff --git
> a/EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActio
> nLib.inf
> b/EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActio
> nLib.inf
> index f79ebc78e2..682231b83e 100644
> ---
> a/EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActio
> nLib.inf
> +++
> b/EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActio
> nLib.inf
> @@ -1,48 +1,48 @@
> -## @file
> -# PeCoff extra action libary for DXE phase that run Emu emulator.
> -#
> -# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
> -# Portions copyright (c) 2011, Apple Inc. All rights reserved.
> -# This program and the accompanying materials
> -# are licensed and made available under the terms and conditions of the BSD
> License
> -# which accompanies this distribution. The full text of the license may be
> found at
> -# http://opensource.org/licenses/bsd-license.php
> -#
> -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> -
> -#
> -#
> -##
> -
> -[Defines]
> - INF_VERSION = 0x00010005
> - BASE_NAME = DxeEmuPeCoffExtraActionLib
> - FILE_GUID = 68FCD487-D230-6846-95B1-5E1F2EF942C4
> - MODULE_TYPE = DXE_DRIVER
> - VERSION_STRING = 1.0
> - LIBRARY_CLASS = PeCoffExtraActionLib|DXE_CORE DXE_DRIVER
> DXE_RUNTIME_DRIVER UEFI_DRIVER
> -
> - CONSTRUCTOR = DxeEmuPeCoffLibExtraActionConstructor
> -
> -#
> -# The following information is for reference only and not required by the build
> tools.
> -#
> -# VALID_ARCHITECTURES = IA32
> -#
> -
> -[Sources]
> - DxeEmuPeCoffExtraActionLib.c
> -
> -[Packages]
> - MdePkg/MdePkg.dec
> - EmulatorPkg/EmulatorPkg.dec
> -
> -[LibraryClasses]
> - DebugLib
> - HobLib
> - BaseMemoryLib
> -
> -[Protocols]
> - gEmuThunkProtocolGuid # PROTOCOL ALWAYS_CONSUMED
> -
> +## @file
> +# PeCoff extra action libary for DXE phase that run Emu emulator.
> +#
> +# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
> +# Portions copyright (c) 2011, Apple Inc. All rights reserved.
> +# This program and the accompanying materials
> +# are licensed and made available under the terms and conditions of the BSD
> License
> +# which accompanies this distribution. The full text of the license may be
> found at
> +# http://opensource.org/licenses/bsd-license.php
> +#
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +
> +#
> +#
> +##
> +
> +[Defines]
> + INF_VERSION = 0x00010005
> + BASE_NAME = DxeEmuPeCoffExtraActionLib
> + FILE_GUID = 68FCD487-D230-6846-95B1-5E1F2EF942C4
> + MODULE_TYPE = DXE_DRIVER
> + VERSION_STRING = 1.0
> + LIBRARY_CLASS = PeCoffExtraActionLib|DXE_CORE DXE_DRIVER
> DXE_RUNTIME_DRIVER UEFI_DRIVER
> +
> + CONSTRUCTOR = DxeEmuPeCoffLibExtraActionConstructor
> +
> +#
> +# The following information is for reference only and not required by the build
> tools.
> +#
> +# VALID_ARCHITECTURES = IA32
> +#
> +
> +[Sources]
> + DxeEmuPeCoffExtraActionLib.c
> +
> +[Packages]
> + MdePkg/MdePkg.dec
> + EmulatorPkg/EmulatorPkg.dec
> +
> +[LibraryClasses]
> + DebugLib
> + HobLib
> + BaseMemoryLib
> +
> +[Protocols]
> + gEmuThunkProtocolGuid # PROTOCOL ALWAYS_CONSUMED
> +
> diff --git
> a/EmulatorPkg/Library/DxeEmuStdErrSerialPortLib/DxeEmuStdErrSerialPortLib.
> c
> b/EmulatorPkg/Library/DxeEmuStdErrSerialPortLib/DxeEmuStdErrSerialPortLib.
> c
> index 00d9f19369..6bd44bfd0d 100644
> ---
> a/EmulatorPkg/Library/DxeEmuStdErrSerialPortLib/DxeEmuStdErrSerialPortLib.
> c
> +++
> b/EmulatorPkg/Library/DxeEmuStdErrSerialPortLib/DxeEmuStdErrSerialPortLib.
> c
> @@ -69,7 +69,7 @@ SerialPortWrite (
> if (gEmuThunk == NULL) {
> return NumberOfBytes;
> }
> -
> +
> return gEmuThunk->WriteStdErr (Buffer, NumberOfBytes);
> }
>
> diff --git a/EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c
> b/EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c
> index e555026601..b995266cc8 100644
> --- a/EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c
> +++ b/EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c
> @@ -47,4 +47,4 @@ KeyMapBreak (
> )
> {
> return EFI_SUCCESS;
> -}
> \ No newline at end of file
> +}
> diff --git
> a/EmulatorPkg/Library/PeiCoreServicesTablePointerLib/PeiServicesTablePointe
> r.c
> b/EmulatorPkg/Library/PeiCoreServicesTablePointerLib/PeiServicesTablePointe
> r.c
> index 06f995b0d3..72b68c283c 100644
> ---
> a/EmulatorPkg/Library/PeiCoreServicesTablePointerLib/PeiServicesTablePointe
> r.c
> +++
> b/EmulatorPkg/Library/PeiCoreServicesTablePointerLib/PeiServicesTablePointe
> r.c
> @@ -89,16 +89,16 @@ PeiServicesTablePointerLibConstructor (
> }
>
> /**
> - Perform CPU specific actions required to migrate the PEI Services Table
> + Perform CPU specific actions required to migrate the PEI Services Table
> pointer from temporary RAM to permanent RAM.
>
> - For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
> + For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
> immediately preceding the Interrupt Descriptor Table (IDT) in memory.
> - For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
> + For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
> immediately preceding the Interrupt Descriptor Table (IDT) in memory.
> For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in
> - a dedicated CPU register. This means that there is no memory storage
> - associated with storing the PEI Services Table pointer, so no additional
> + a dedicated CPU register. This means that there is no memory storage
> + associated with storing the PEI Services Table pointer, so no additional
> migration actions are required for Itanium or ARM CPUs.
>
> **/
> @@ -109,7 +109,7 @@ MigratePeiServicesTablePointer (
> )
> {
> //
> - // PEI Services Table pointer is cached in the global variable. No additional
> + // PEI Services Table pointer is cached in the global variable. No additional
> // migration actions are required.
> //
> return;
> diff --git
> a/EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraAction
> Lib.inf
> b/EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraAction
> Lib.inf
> index 9a757f7294..fdaf19ab6c 100644
> ---
> a/EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraAction
> Lib.inf
> +++
> b/EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraAction
> Lib.inf
> @@ -1,49 +1,49 @@
> -## @file
> -# PeCoff extra action libary for Pei phase that run Emu emulator.
> -#
> -# Lib to provide memory journal status code reporting Routines
> -# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
> -# Portions copyright (c) 2011, Apple Inc. All rights reserved.
> -# This program and the accompanying materials
> -# are licensed and made available under the terms and conditions of the BSD
> License
> -# which accompanies this distribution. The full text of the license may be
> found at
> -# http://opensource.org/licenses/bsd-license.php
> -#
> -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> -
> -#
> -#
> -##
> -
> -[Defines]
> - INF_VERSION = 0x00010005
> - BASE_NAME = PeiEmuPeCoffExtraActionLib
> - FILE_GUID = 79C4E72A-730B-F040-8129-95877B3A97A8
> - MODULE_TYPE = PEIM
> - VERSION_STRING = 1.0
> - LIBRARY_CLASS = PeCoffExtraActionLib|PEI_CORE PEIM
> -
> -#
> -# The following information is for reference only and not required by the build
> tools.
> -#
> -# VALID_ARCHITECTURES = IA32
> -#
> -
> -[Sources]
> - PeiEmuPeCoffExtraActionLib.c
> -
> -[Packages]
> - MdePkg/MdePkg.dec
> - EmulatorPkg/EmulatorPkg.dec
> -
> -[LibraryClasses]
> - BaseLib
> - PeiServicesLib
> - DebugLib
> -
> -[Ppis]
> - gEmuThunkPpiGuid # PPI ALWAYS_CONSUMED
> -
> -[Pcd]
> - gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage
> +## @file
> +# PeCoff extra action libary for Pei phase that run Emu emulator.
> +#
> +# Lib to provide memory journal status code reporting Routines
> +# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
> +# Portions copyright (c) 2011, Apple Inc. All rights reserved.
> +# This program and the accompanying materials
> +# are licensed and made available under the terms and conditions of the BSD
> License
> +# which accompanies this distribution. The full text of the license may be
> found at
> +# http://opensource.org/licenses/bsd-license.php
> +#
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +
> +#
> +#
> +##
> +
> +[Defines]
> + INF_VERSION = 0x00010005
> + BASE_NAME = PeiEmuPeCoffExtraActionLib
> + FILE_GUID = 79C4E72A-730B-F040-8129-95877B3A97A8
> + MODULE_TYPE = PEIM
> + VERSION_STRING = 1.0
> + LIBRARY_CLASS = PeCoffExtraActionLib|PEI_CORE PEIM
> +
> +#
> +# The following information is for reference only and not required by the build
> tools.
> +#
> +# VALID_ARCHITECTURES = IA32
> +#
> +
> +[Sources]
> + PeiEmuPeCoffExtraActionLib.c
> +
> +[Packages]
> + MdePkg/MdePkg.dec
> + EmulatorPkg/EmulatorPkg.dec
> +
> +[LibraryClasses]
> + BaseLib
> + PeiServicesLib
> + DebugLib
> +
> +[Ppis]
> + gEmuThunkPpiGuid # PPI ALWAYS_CONSUMED
> +
> +[Pcd]
> + gEmulatorPkgTokenSpaceGuid.PcdPeiServicesTablePage
> diff --git
> a/EmulatorPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c
> b/EmulatorPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c
> index 5aaf296389..d79688820b 100644
> ---
> a/EmulatorPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c
> +++
> b/EmulatorPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c
> @@ -134,16 +134,16 @@ PeiServicesTablePointerLibConstructor (
> }
>
> /**
> - Perform CPU specific actions required to migrate the PEI Services Table
> + Perform CPU specific actions required to migrate the PEI Services Table
> pointer from temporary RAM to permanent RAM.
>
> - For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
> + For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
> immediately preceding the Interrupt Descriptor Table (IDT) in memory.
> - For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
> + For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
> immediately preceding the Interrupt Descriptor Table (IDT) in memory.
> For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in
> - a dedicated CPU register. This means that there is no memory storage
> - associated with storing the PEI Services Table pointer, so no additional
> + a dedicated CPU register. This means that there is no memory storage
> + associated with storing the PEI Services Table pointer, so no additional
> migration actions are required for Itanium or ARM CPUs.
>
> **/
> @@ -154,7 +154,7 @@ MigratePeiServicesTablePointer (
> )
> {
> //
> - // PEI Services Table pointer is cached in the global variable. No additional
> + // PEI Services Table pointer is cached in the global variable. No additional
> // migration actions are required.
> //
> return;
> diff --git
> a/EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTable
> Pointer.c
> b/EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTable
> Pointer.c
> index fa04ed3e04..383460b342 100644
> ---
> a/EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTable
> Pointer.c
> +++
> b/EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTable
> Pointer.c
> @@ -72,16 +72,16 @@ GetPeiServicesTablePointer (
> }
>
> /**
> - Perform CPU specific actions required to migrate the PEI Services Table
> + Perform CPU specific actions required to migrate the PEI Services Table
> pointer from temporary RAM to permanent RAM.
>
> - For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
> + For IA32 CPUs, the PEI Services Table pointer is stored in the 4 bytes
> immediately preceding the Interrupt Descriptor Table (IDT) in memory.
> - For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
> + For X64 CPUs, the PEI Services Table pointer is stored in the 8 bytes
> immediately preceding the Interrupt Descriptor Table (IDT) in memory.
> For Itanium and ARM CPUs, a the PEI Services Table Pointer is stored in
> - a dedicated CPU register. This means that there is no memory storage
> - associated with storing the PEI Services Table pointer, so no additional
> + a dedicated CPU register. This means that there is no memory storage
> + associated with storing the PEI Services Table pointer, so no additional
> migration actions are required for Itanium or ARM CPUs.
>
> **/
> @@ -92,7 +92,7 @@ MigratePeiServicesTablePointer (
> )
> {
> //
> - // PEI Services Table pointer is cached in SRAM. No additional
> + // PEI Services Table pointer is cached in SRAM. No additional
> // migration actions are required.
> //
> return;
> diff --git a/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf
> b/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf
> index e473b52376..0f23178533 100644
> --- a/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf
> +++ b/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf
> @@ -44,4 +44,4 @@ [LibraryClasses]
> PeiServicesLib
>
> [Ppis]
> - gEmuThunkPpiGuid
> \ No newline at end of file
> + gEmuThunkPpiGuid
> diff --git a/EmulatorPkg/Library/SecPeiServicesLib/FwVol.c
> b/EmulatorPkg/Library/SecPeiServicesLib/FwVol.c
> index 7fa4ddb594..a48f2b5f53 100644
> --- a/EmulatorPkg/Library/SecPeiServicesLib/FwVol.c
> +++ b/EmulatorPkg/Library/SecPeiServicesLib/FwVol.c
> @@ -1,281 +1,281 @@
> -/*++ @file
> - A simple FV stack so the SEC can extract the SEC Core from an
> - FV.
> -
> -Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#include <PiPei.h>
> -
> -
> -#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
> - (ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment)
> - 1))
> -
> -EFI_FFS_FILE_STATE
> -GetFileState (
> - IN UINT8 ErasePolarity,
> - IN EFI_FFS_FILE_HEADER *FfsHeader
> - )
> -/*++
> -
> -Routine Description:
> - Returns the highest bit set of the State field
> -
> -Arguments:
> - ErasePolarity - Erase Polarity as defined by EFI_FVB2_ERASE_POLARITY
> - in the Attributes field.
> - FfsHeader - Pointer to FFS File Header.
> -
> -Returns:
> - Returns the highest bit in the State field
> -
> -**/
> -{
> - EFI_FFS_FILE_STATE FileState;
> - EFI_FFS_FILE_STATE HighestBit;
> -
> - FileState = FfsHeader->State;
> -
> - if (ErasePolarity != 0) {
> - FileState = (EFI_FFS_FILE_STATE)~FileState;
> - }
> -
> - HighestBit = 0x80;
> - while (HighestBit != 0 && (HighestBit & FileState) == 0) {
> - HighestBit >>= 1;
> - }
> -
> - return HighestBit;
> -}
> -
> -UINT8
> -CalculateHeaderChecksum (
> - IN EFI_FFS_FILE_HEADER *FileHeader
> - )
> -/*++
> -
> -Routine Description:
> - Calculates the checksum of the header of a file.
> -
> -Arguments:
> - FileHeader - Pointer to FFS File Header.
> -
> -Returns:
> - Checksum of the header.
> -
> -**/
> -{
> - UINT8 *ptr;
> - UINTN Index;
> - UINT8 Sum;
> -
> - Sum = 0;
> - ptr = (UINT8 *) FileHeader;
> -
> - for (Index = 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index += 4) {
> - Sum = (UINT8) (Sum + ptr[Index]);
> - Sum = (UINT8) (Sum + ptr[Index + 1]);
> - Sum = (UINT8) (Sum + ptr[Index + 2]);
> - Sum = (UINT8) (Sum + ptr[Index + 3]);
> - }
> -
> - for (; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) {
> - Sum = (UINT8) (Sum + ptr[Index]);
> - }
> - //
> - // State field (since this indicates the different state of file).
> - //
> - Sum = (UINT8) (Sum - FileHeader->State);
> - //
> - // Checksum field of the file is not part of the header checksum.
> - //
> - Sum = (UINT8) (Sum - FileHeader->IntegrityCheck.Checksum.File);
> -
> - return Sum;
> -}
> -
> -EFI_STATUS
> -SecFfsFindNextFile (
> - IN EFI_FV_FILETYPE SearchType,
> - IN EFI_PEI_FV_HANDLE FvHandle,
> - IN OUT EFI_PEI_FILE_HANDLE *FileHandle
> - )
> -/*++
> -
> -Routine Description:
> - Given the input file pointer, search for the next matching file in the
> - FFS volume as defined by SearchType. The search starts from FileHeader
> inside
> - the Firmware Volume defined by FwVolHeader.
> -
> -Arguments:
> - SearchType - Filter to find only files of this type.
> - Type EFI_FV_FILETYPE_ALL causes no filtering to be done.
> - FwVolHeader - Pointer to the FV header of the volume to search.
> - This parameter must point to a valid FFS volume.
> - FileHeader - Pointer to the current file from which to begin searching.
> - This pointer will be updated upon return to reflect the file
> - found.
> -
> -Returns:
> - EFI_NOT_FOUND - No files matching the search criteria were found
> - EFI_SUCCESS
> -
> -**/
> -{
> - EFI_FFS_FILE_HEADER *FfsFileHeader;
> - UINT32 FileLength;
> - UINT32 FileOccupiedSize;
> - UINT32 FileOffset;
> - UINT64 FvLength;
> - UINT8 ErasePolarity;
> - UINT8 FileState;
> - EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;
> - EFI_FFS_FILE_HEADER **FileHeader;
> -
> - //
> - // Convert the handle of FV to FV header for memory-mapped firmware
> volume
> - //
> - FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) FvHandle;
> - FileHeader = (EFI_FFS_FILE_HEADER **)FileHandle;
> -
> - FvLength = FwVolHeader->FvLength;
> - if (FwVolHeader->Attributes & EFI_FVB2_ERASE_POLARITY) {
> - ErasePolarity = 1;
> - } else {
> - ErasePolarity = 0;
> - }
> - //
> - // If FileHeader is not specified (NULL) start with the first file in the
> - // firmware volume. Otherwise, start from the FileHeader.
> - //
> - if (*FileHeader == NULL) {
> - FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FwVolHeader +
> FwVolHeader->HeaderLength);
> - } else {
> - //
> - // Length is 24 bits wide so mask upper 8 bits
> - // FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.
> - //
> - FileLength = *(UINT32 *) (*FileHeader)->Size & 0x00FFFFFF;
> - FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
> - FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) *FileHeader +
> FileOccupiedSize);
> - }
> -
> - FileOffset = (UINT32) ((UINT8 *) FfsFileHeader - (UINT8 *) FwVolHeader);
> -
> - while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) {
> - //
> - // Get FileState which is the highest bit of the State
> - //
> - FileState = GetFileState (ErasePolarity, FfsFileHeader);
> -
> - switch (FileState) {
> -
> - case EFI_FILE_HEADER_INVALID:
> - FileOffset += sizeof (EFI_FFS_FILE_HEADER);
> - FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + sizeof
> (EFI_FFS_FILE_HEADER));
> - break;
> -
> - case EFI_FILE_DATA_VALID:
> - case EFI_FILE_MARKED_FOR_UPDATE:
> - if (CalculateHeaderChecksum (FfsFileHeader) == 0) {
> - FileLength = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
> - FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
> -
> - if ((SearchType == FfsFileHeader->Type) || (SearchType ==
> EFI_FV_FILETYPE_ALL)) {
> -
> - *FileHeader = FfsFileHeader;
> -
> - return EFI_SUCCESS;
> - }
> -
> - FileOffset += FileOccupiedSize;
> - FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader +
> FileOccupiedSize);
> - } else {
> - return EFI_NOT_FOUND;
> - }
> - break;
> -
> - case EFI_FILE_DELETED:
> - FileLength = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
> - FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
> - FileOffset += FileOccupiedSize;
> - FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader +
> FileOccupiedSize);
> - break;
> -
> - default:
> - return EFI_NOT_FOUND;
> -
> - }
> - }
> -
> - return EFI_NOT_FOUND;
> -}
> -
> -EFI_STATUS
> -SecFfsFindSectionData (
> - IN EFI_SECTION_TYPE SectionType,
> - IN EFI_FFS_FILE_HEADER *FfsFileHeader,
> - IN OUT VOID **SectionData
> - )
> -/*++
> -
> -Routine Description:
> - Given the input file pointer, search for the next matching section in the
> - FFS volume.
> -
> -Arguments:
> - SearchType - Filter to find only sections of this type.
> - FfsFileHeader - Pointer to the current file to search.
> - SectionData - Pointer to the Section matching SectionType in FfsFileHeader.
> - NULL if section not found
> -
> -Returns:
> - EFI_NOT_FOUND - No files matching the search criteria were found
> - EFI_SUCCESS
> -
> -**/
> -{
> - UINT32 FileSize;
> - EFI_COMMON_SECTION_HEADER *Section;
> - UINT32 SectionLength;
> - UINT32 ParsedLength;
> -
> - //
> - // Size is 24 bits wide so mask upper 8 bits.
> - // Does not include FfsFileHeader header size
> - // FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
> - //
> - Section = (EFI_COMMON_SECTION_HEADER *) (FfsFileHeader + 1);
> - FileSize = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
> - FileSize -= sizeof (EFI_FFS_FILE_HEADER);
> -
> - *SectionData = NULL;
> - ParsedLength = 0;
> - while (ParsedLength < FileSize) {
> - if (Section->Type == SectionType) {
> - *SectionData = (VOID *) (Section + 1);
> - return EFI_SUCCESS;
> - }
> - //
> - // Size is 24 bits wide so mask upper 8 bits.
> - // SectionLength is adjusted it is 4 byte aligned.
> - // Go to the next section
> - //
> - SectionLength = *(UINT32 *) Section->Size & 0x00FFFFFF;
> - SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
> -
> - ParsedLength += SectionLength;
> - Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section +
> SectionLength);
> - }
> -
> - return EFI_NOT_FOUND;
> -}
> -
> +/*++ @file
> + A simple FV stack so the SEC can extract the SEC Core from an
> + FV.
> +
> +Copyright (c) 2006, Intel Corporation. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#include <PiPei.h>
> +
> +
> +#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
> + (ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) &
> ((Alignment) - 1))
> +
> +EFI_FFS_FILE_STATE
> +GetFileState (
> + IN UINT8 ErasePolarity,
> + IN EFI_FFS_FILE_HEADER *FfsHeader
> + )
> +/*++
> +
> +Routine Description:
> + Returns the highest bit set of the State field
> +
> +Arguments:
> + ErasePolarity - Erase Polarity as defined by EFI_FVB2_ERASE_POLARITY
> + in the Attributes field.
> + FfsHeader - Pointer to FFS File Header.
> +
> +Returns:
> + Returns the highest bit in the State field
> +
> +**/
> +{
> + EFI_FFS_FILE_STATE FileState;
> + EFI_FFS_FILE_STATE HighestBit;
> +
> + FileState = FfsHeader->State;
> +
> + if (ErasePolarity != 0) {
> + FileState = (EFI_FFS_FILE_STATE)~FileState;
> + }
> +
> + HighestBit = 0x80;
> + while (HighestBit != 0 && (HighestBit & FileState) == 0) {
> + HighestBit >>= 1;
> + }
> +
> + return HighestBit;
> +}
> +
> +UINT8
> +CalculateHeaderChecksum (
> + IN EFI_FFS_FILE_HEADER *FileHeader
> + )
> +/*++
> +
> +Routine Description:
> + Calculates the checksum of the header of a file.
> +
> +Arguments:
> + FileHeader - Pointer to FFS File Header.
> +
> +Returns:
> + Checksum of the header.
> +
> +**/
> +{
> + UINT8 *ptr;
> + UINTN Index;
> + UINT8 Sum;
> +
> + Sum = 0;
> + ptr = (UINT8 *) FileHeader;
> +
> + for (Index = 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index += 4) {
> + Sum = (UINT8) (Sum + ptr[Index]);
> + Sum = (UINT8) (Sum + ptr[Index + 1]);
> + Sum = (UINT8) (Sum + ptr[Index + 2]);
> + Sum = (UINT8) (Sum + ptr[Index + 3]);
> + }
> +
> + for (; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) {
> + Sum = (UINT8) (Sum + ptr[Index]);
> + }
> + //
> + // State field (since this indicates the different state of file).
> + //
> + Sum = (UINT8) (Sum - FileHeader->State);
> + //
> + // Checksum field of the file is not part of the header checksum.
> + //
> + Sum = (UINT8) (Sum - FileHeader->IntegrityCheck.Checksum.File);
> +
> + return Sum;
> +}
> +
> +EFI_STATUS
> +SecFfsFindNextFile (
> + IN EFI_FV_FILETYPE SearchType,
> + IN EFI_PEI_FV_HANDLE FvHandle,
> + IN OUT EFI_PEI_FILE_HANDLE *FileHandle
> + )
> +/*++
> +
> +Routine Description:
> + Given the input file pointer, search for the next matching file in the
> + FFS volume as defined by SearchType. The search starts from FileHeader
> inside
> + the Firmware Volume defined by FwVolHeader.
> +
> +Arguments:
> + SearchType - Filter to find only files of this type.
> + Type EFI_FV_FILETYPE_ALL causes no filtering to be done.
> + FwVolHeader - Pointer to the FV header of the volume to search.
> + This parameter must point to a valid FFS volume.
> + FileHeader - Pointer to the current file from which to begin searching.
> + This pointer will be updated upon return to reflect the file
> + found.
> +
> +Returns:
> + EFI_NOT_FOUND - No files matching the search criteria were found
> + EFI_SUCCESS
> +
> +**/
> +{
> + EFI_FFS_FILE_HEADER *FfsFileHeader;
> + UINT32 FileLength;
> + UINT32 FileOccupiedSize;
> + UINT32 FileOffset;
> + UINT64 FvLength;
> + UINT8 ErasePolarity;
> + UINT8 FileState;
> + EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader;
> + EFI_FFS_FILE_HEADER **FileHeader;
> +
> + //
> + // Convert the handle of FV to FV header for memory-mapped firmware
> volume
> + //
> + FwVolHeader = (EFI_FIRMWARE_VOLUME_HEADER *) FvHandle;
> + FileHeader = (EFI_FFS_FILE_HEADER **)FileHandle;
> +
> + FvLength = FwVolHeader->FvLength;
> + if (FwVolHeader->Attributes & EFI_FVB2_ERASE_POLARITY) {
> + ErasePolarity = 1;
> + } else {
> + ErasePolarity = 0;
> + }
> + //
> + // If FileHeader is not specified (NULL) start with the first file in the
> + // firmware volume. Otherwise, start from the FileHeader.
> + //
> + if (*FileHeader == NULL) {
> + FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FwVolHeader +
> FwVolHeader->HeaderLength);
> + } else {
> + //
> + // Length is 24 bits wide so mask upper 8 bits
> + // FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.
> + //
> + FileLength = *(UINT32 *) (*FileHeader)->Size & 0x00FFFFFF;
> + FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
> + FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) *FileHeader +
> FileOccupiedSize);
> + }
> +
> + FileOffset = (UINT32) ((UINT8 *) FfsFileHeader - (UINT8 *) FwVolHeader);
> +
> + while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) {
> + //
> + // Get FileState which is the highest bit of the State
> + //
> + FileState = GetFileState (ErasePolarity, FfsFileHeader);
> +
> + switch (FileState) {
> +
> + case EFI_FILE_HEADER_INVALID:
> + FileOffset += sizeof (EFI_FFS_FILE_HEADER);
> + FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader +
> sizeof (EFI_FFS_FILE_HEADER));
> + break;
> +
> + case EFI_FILE_DATA_VALID:
> + case EFI_FILE_MARKED_FOR_UPDATE:
> + if (CalculateHeaderChecksum (FfsFileHeader) == 0) {
> + FileLength = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
> + FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
> +
> + if ((SearchType == FfsFileHeader->Type) || (SearchType ==
> EFI_FV_FILETYPE_ALL)) {
> +
> + *FileHeader = FfsFileHeader;
> +
> + return EFI_SUCCESS;
> + }
> +
> + FileOffset += FileOccupiedSize;
> + FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader +
> FileOccupiedSize);
> + } else {
> + return EFI_NOT_FOUND;
> + }
> + break;
> +
> + case EFI_FILE_DELETED:
> + FileLength = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
> + FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
> + FileOffset += FileOccupiedSize;
> + FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader +
> FileOccupiedSize);
> + break;
> +
> + default:
> + return EFI_NOT_FOUND;
> +
> + }
> + }
> +
> + return EFI_NOT_FOUND;
> +}
> +
> +EFI_STATUS
> +SecFfsFindSectionData (
> + IN EFI_SECTION_TYPE SectionType,
> + IN EFI_FFS_FILE_HEADER *FfsFileHeader,
> + IN OUT VOID **SectionData
> + )
> +/*++
> +
> +Routine Description:
> + Given the input file pointer, search for the next matching section in the
> + FFS volume.
> +
> +Arguments:
> + SearchType - Filter to find only sections of this type.
> + FfsFileHeader - Pointer to the current file to search.
> + SectionData - Pointer to the Section matching SectionType in FfsFileHeader.
> + NULL if section not found
> +
> +Returns:
> + EFI_NOT_FOUND - No files matching the search criteria were found
> + EFI_SUCCESS
> +
> +**/
> +{
> + UINT32 FileSize;
> + EFI_COMMON_SECTION_HEADER *Section;
> + UINT32 SectionLength;
> + UINT32 ParsedLength;
> +
> + //
> + // Size is 24 bits wide so mask upper 8 bits.
> + // Does not include FfsFileHeader header size
> + // FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
> + //
> + Section = (EFI_COMMON_SECTION_HEADER *) (FfsFileHeader + 1);
> + FileSize = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
> + FileSize -= sizeof (EFI_FFS_FILE_HEADER);
> +
> + *SectionData = NULL;
> + ParsedLength = 0;
> + while (ParsedLength < FileSize) {
> + if (Section->Type == SectionType) {
> + *SectionData = (VOID *) (Section + 1);
> + return EFI_SUCCESS;
> + }
> + //
> + // Size is 24 bits wide so mask upper 8 bits.
> + // SectionLength is adjusted it is 4 byte aligned.
> + // Go to the next section
> + //
> + SectionLength = *(UINT32 *) Section->Size & 0x00FFFFFF;
> + SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
> +
> + ParsedLength += SectionLength;
> + Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section +
> SectionLength);
> + }
> +
> + return EFI_NOT_FOUND;
> +}
> +
> diff --git a/EmulatorPkg/Library/SecPpiListLib/PpiListLib.c
> b/EmulatorPkg/Library/SecPpiListLib/PpiListLib.c
> index f9c0c3d677..b8c5504b70 100644
> --- a/EmulatorPkg/Library/SecPpiListLib/PpiListLib.c
> +++ b/EmulatorPkg/Library/SecPpiListLib/PpiListLib.c
> @@ -1,17 +1,17 @@
> -/*++ @file
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#include <PiPei.h>
> -
> -CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList = NULL;
> -
> +/*++ @file
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#include <PiPei.h>
> +
> +CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList = NULL;
> +
> diff --git a/EmulatorPkg/Library/SmbiosLib/SmbiosLib.c
> b/EmulatorPkg/Library/SmbiosLib/SmbiosLib.c
> index 3382d7d2a6..7bdadb32a3 100644
> --- a/EmulatorPkg/Library/SmbiosLib/SmbiosLib.c
> +++ b/EmulatorPkg/Library/SmbiosLib/SmbiosLib.c
> @@ -1,352 +1,352 @@
> -/** @file
> - Provides library functions for common SMBIOS operations. Only available to
> DXE
> - and UEFI module types.
> -
> -
> -Copyright (c) 2012, Apple Inc. All rights reserved.
> -Portitions Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
> -This program and the accompanying materials are licensed and made
> available under
> -the terms and conditions of the BSD License that accompanies this distribution.
> -The full text of the license may be found at
> -http://opensource.org/licenses/bsd-license.php.
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#include <PiDxe.h>
> -#include <Library/BaseLib.h>
> -#include <Library/BaseMemoryLib.h>
> -#include <Library/DebugLib.h>
> -#include <Library/MemoryAllocationLib.h>
> -#include <Library/UefiBootServicesTableLib.h>
> -#include <Library/UefiLib.h>
> -#include <Library/SmbiosLib.h>
> -
> -
> -EFI_SMBIOS_PROTOCOL *gSmbios = NULL;
> -
> -
> -/**
> - Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
> - entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
> -
> - @param Template Array of SMBIOS_TEMPLATE_ENTRY entries.
> -
> - @retval EFI_SUCCESS New SMBIOS tables were created.
> - @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibInitializeFromTemplate (
> - IN SMBIOS_TEMPLATE_ENTRY *Template
> - )
> -{
> - EFI_STATUS Status;
> - UINTN Index;
> -
> - if (Template == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Status = EFI_SUCCESS;
> -
> - for (Index = 0; Template[Index].Entry != NULL; Index++) {
> - Status = SmbiosLibCreateEntry (Template[Index].Entry,
> Template[Index].StringArray);
> - }
> -
> - return Status;
> -}
> -
> -
> -
> -/**
> - Create SMBIOS record.
> -
> - Converts a fixed SMBIOS structure and an array of pointers to strings into
> - an SMBIOS record where the strings are cat'ed on the end of the fixed record
> - and terminated via a double NULL and add to SMBIOS table.
> -
> - SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
> - { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof
> (SMBIOS_TABLE_TYPE12), 0 },
> - 1 // StringCount
> - };
> - CHAR8 *gSmbiosType12Strings[] = {
> - "Not Found",
> - NULL
> - };
> -
> - ...
> - CreateSmbiosEntry (
> - (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
> - gSmbiosType12Strings
> - );
> -
> - @param SmbiosEntry Fixed SMBIOS structure
> - @param StringArray Array of strings to convert to an SMBIOS string pack.
> - NULL is OK.
> -
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibCreateEntry (
> - IN SMBIOS_STRUCTURE *SmbiosEntry,
> - IN CHAR8 **StringArray
> - )
> -{
> - EFI_STATUS Status;
> - EFI_SMBIOS_HANDLE SmbiosHandle;
> - EFI_SMBIOS_TABLE_HEADER *Record;
> - UINTN Index;
> - UINTN StringSize;
> - UINTN Size;
> - CHAR8 *Str;
> -
> - // Calculate the size of the fixed record and optional string pack
> - Size = SmbiosEntry->Length;
> - if (StringArray == NULL) {
> - Size += 2; // Min string section is double null
> - } else if (StringArray[0] == NULL) {
> - Size += 2; // Min string section is double null
> - } else {
> - for (Index = 0; StringArray[Index] != NULL; Index++) {
> - StringSize = AsciiStrSize (StringArray[Index]);
> - Size += StringSize;
> - }
> - // Don't forget the terminating double null
> - Size += 1;
> - }
> -
> - // Copy over Template
> - Record = (EFI_SMBIOS_TABLE_HEADER *)AllocateZeroPool (Size);
> - if (Record == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> - CopyMem (Record, SmbiosEntry, SmbiosEntry->Length);
> -
> - if (StringArray != NULL) {
> - // Append string pack
> - Str = ((CHAR8 *)Record) + Record->Length;
> - for (Index = 0; StringArray[Index] != NULL; Index++) {
> - StringSize = AsciiStrSize (StringArray[Index]);
> - CopyMem (Str, StringArray[Index], StringSize);
> - Str += StringSize;
> - }
> - *Str = 0;
> - }
> -
> - SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
> - Status = gSmbios->Add (
> - gSmbios,
> - gImageHandle,
> - &SmbiosHandle,
> - Record
> - );
> -
> - FreePool (Record);
> - return Status;
> -}
> -
> -
> -
> -/**
> - Update the string associated with an existing SMBIOS record.
> -
> - This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> - SMBIOS record is defined by how many strings were present when Add() was
> called.
> -
> - @param[in] SmbiosHandle SMBIOS Handle of structure that will have its
> string updated.
> - @param[in] StringNumber The non-zero string number of the string to
> update.
> - @param[in] String Update the StringNumber string with String.
> -
> - @retval EFI_SUCCESS SmbiosHandle had its StringNumber String
> updated.
> - @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> - @retval EFI_UNSUPPORTED String was not added because it is longer
> than the SMBIOS Table supports.
> - @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS
> record.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibUpdateString (
> - IN EFI_SMBIOS_HANDLE SmbiosHandle,
> - IN SMBIOS_TABLE_STRING StringNumber,
> - IN CHAR8 *String
> - )
> -{
> - UINTN StringIndex;
> -
> - if (String == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (*String == '\0') {
> - // A string with no data is not legal in SMBIOS
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - StringIndex = StringNumber;
> - return gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex,
> String);
> -}
> -
> -
> -/**
> - Update the string associated with an existing SMBIOS record.
> -
> - This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> - SMBIOS record is defined by how many strings were present when Add() was
> called.
> -
> - @param[in] SmbiosHandle SMBIOS Handle of structure that will have its
> string updated.
> - @param[in] StringNumber The non-zero string number of the string to
> update.
> - @param[in] String Update the StringNumber string with String.
> -
> - @retval EFI_SUCCESS SmbiosHandle had its StringNumber String
> updated.
> - @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> - @retval EFI_UNSUPPORTED String was not added because it is longer
> than the SMBIOS Table supports.
> - @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS
> record.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibUpdateUnicodeString (
> - IN EFI_SMBIOS_HANDLE SmbiosHandle,
> - IN SMBIOS_TABLE_STRING StringNumber,
> - IN CHAR16 *String
> - )
> -{
> - EFI_STATUS Status;
> - UINTN StringIndex;
> - CHAR8 *Ascii;
> -
> - if (String == NULL) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (*String == '\0') {
> - // A string with no data is not legal in SMBIOS
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - Ascii = AllocateZeroPool (StrSize (String));
> - if (Ascii == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> - UnicodeStrToAsciiStr (String, Ascii);
> -
> - StringIndex = StringNumber;
> - Status = gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex,
> Ascii);
> -
> - FreePool (Ascii);
> - return Status;
> -}
> -
> -
> -/**
> - Allow caller to read a specific SMBIOS string
> -
> - @param[in] Header SMBIOS record that contains the string.
> - @param[in[ StringNumber Instance of SMBIOS string 1 - N.
> -
> - @retval NULL Instance of Type SMBIOS string was not found.
> - @retval Other Pointer to matching SMBIOS string.
> -**/
> -CHAR8 *
> -EFIAPI
> -SmbiosLibReadString (
> - IN SMBIOS_STRUCTURE *Header,
> - IN EFI_SMBIOS_STRING StringNumber
> - )
> -{
> - CHAR8 *Data;
> - UINTN Match;
> -
> - Data = (CHAR8 *)Header + Header->Length;
> - for (Match = 1;!(*Data == 0 && *(Data+1) == 0); ) {
> - if (StringNumber == Match) {
> - return Data;
> - }
> - Data++;
> - if (*(Data - 1) == '\0') {
> - Match++;
> - }
> - }
> -
> - return NULL;
> -}
> -
> -
> -/**
> - Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
> -
> - @param[in] Type Type of the next SMBIOS record to return.
> - @param[in[ Instance Instance of SMBIOS record 0 - N-1.
> - @param[out] SmbiosHandle Returns SMBIOS handle for the matching
> record.
> -
> - @retval NULL Instance of Type SMBIOS record was not found.
> - @retval Other Pointer to matching SMBIOS record.
> -**/
> -SMBIOS_STRUCTURE *
> -EFIAPI
> -SmbiosLibGetRecord (
> - IN EFI_SMBIOS_TYPE Type,
> - IN UINTN Instance,
> - OUT EFI_SMBIOS_HANDLE *SmbiosHandle
> - )
> -{
> - EFI_STATUS Status;
> - EFI_SMBIOS_TABLE_HEADER *Record;
> - UINTN Match;
> -
> - Match = 0;
> - *SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
> - do {
> - Status = gSmbios->GetNext (gSmbios, SmbiosHandle, &Type, &Record,
> NULL);
> - if (!EFI_ERROR (Status)) {
> - if (Match == Instance) {
> - return (SMBIOS_STRUCTURE *)Record;
> - }
> - Match++;
> - }
> - } while (!EFI_ERROR (Status));
> -
> - return NULL;
> -}
> -
> -
> -/**
> - Remove an SMBIOS record.
> -
> - This function removes an SMBIOS record using the handle specified by
> SmbiosHandle.
> -
> - @param[in] SmbiosHandle The handle of the SMBIOS record to
> remove.
> -
> - @retval EFI_SUCCESS SMBIOS record was removed.
> - @retval EFI_INVALID_PARAMETER SmbiosHandle does not specify a valid
> SMBIOS record.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibRemove (
> - OUT EFI_SMBIOS_HANDLE SmbiosHandle
> - )
> -{
> - return gSmbios->Remove (gSmbios, SmbiosHandle);
> -}
> -
> -
> -
> -/**
> -
> - @param ImageHandle ImageHandle of the loaded driver.
> - @param SystemTable Pointer to the EFI System Table.
> -
> - @retval EFI_SUCCESS Register successfully.
> - @retval EFI_OUT_OF_RESOURCES No enough memory to register this
> handler.
> -**/
> -EFI_STATUS
> -EFIAPI
> -SmbiosLibConstructor (
> - IN EFI_HANDLE ImageHandle,
> - IN EFI_SYSTEM_TABLE *SystemTable
> - )
> -{
> - return gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID
> **)&gSmbios);
> -}
> -
> +/** @file
> + Provides library functions for common SMBIOS operations. Only available to
> DXE
> + and UEFI module types.
> +
> +
> +Copyright (c) 2012, Apple Inc. All rights reserved.
> +Portitions Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
> +This program and the accompanying materials are licensed and made
> available under
> +the terms and conditions of the BSD License that accompanies this distribution.
> +The full text of the license may be found at
> +http://opensource.org/licenses/bsd-license.php.
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#include <PiDxe.h>
> +#include <Library/BaseLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/MemoryAllocationLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/UefiLib.h>
> +#include <Library/SmbiosLib.h>
> +
> +
> +EFI_SMBIOS_PROTOCOL *gSmbios = NULL;
> +
> +
> +/**
> + Create an initial SMBIOS Table from an array of SMBIOS_TEMPLATE_ENTRY
> + entries. SMBIOS_TEMPLATE_ENTRY.NULL indicates the end of the table.
> +
> + @param Template Array of SMBIOS_TEMPLATE_ENTRY entries.
> +
> + @retval EFI_SUCCESS New SMBIOS tables were created.
> + @retval EFI_OUT_OF_RESOURCES New SMBIOS tables were not created.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibInitializeFromTemplate (
> + IN SMBIOS_TEMPLATE_ENTRY *Template
> + )
> +{
> + EFI_STATUS Status;
> + UINTN Index;
> +
> + if (Template == NULL) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + Status = EFI_SUCCESS;
> +
> + for (Index = 0; Template[Index].Entry != NULL; Index++) {
> + Status = SmbiosLibCreateEntry (Template[Index].Entry,
> Template[Index].StringArray);
> + }
> +
> + return Status;
> +}
> +
> +
> +
> +/**
> + Create SMBIOS record.
> +
> + Converts a fixed SMBIOS structure and an array of pointers to strings into
> + an SMBIOS record where the strings are cat'ed on the end of the fixed
> record
> + and terminated via a double NULL and add to SMBIOS table.
> +
> + SMBIOS_TABLE_TYPE32 gSmbiosType12 = {
> + { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof
> (SMBIOS_TABLE_TYPE12), 0 },
> + 1 // StringCount
> + };
> + CHAR8 *gSmbiosType12Strings[] = {
> + "Not Found",
> + NULL
> + };
> +
> + ...
> + CreateSmbiosEntry (
> + (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12,
> + gSmbiosType12Strings
> + );
> +
> + @param SmbiosEntry Fixed SMBIOS structure
> + @param StringArray Array of strings to convert to an SMBIOS string pack.
> + NULL is OK.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibCreateEntry (
> + IN SMBIOS_STRUCTURE *SmbiosEntry,
> + IN CHAR8 **StringArray
> + )
> +{
> + EFI_STATUS Status;
> + EFI_SMBIOS_HANDLE SmbiosHandle;
> + EFI_SMBIOS_TABLE_HEADER *Record;
> + UINTN Index;
> + UINTN StringSize;
> + UINTN Size;
> + CHAR8 *Str;
> +
> + // Calculate the size of the fixed record and optional string pack
> + Size = SmbiosEntry->Length;
> + if (StringArray == NULL) {
> + Size += 2; // Min string section is double null
> + } else if (StringArray[0] == NULL) {
> + Size += 2; // Min string section is double null
> + } else {
> + for (Index = 0; StringArray[Index] != NULL; Index++) {
> + StringSize = AsciiStrSize (StringArray[Index]);
> + Size += StringSize;
> + }
> + // Don't forget the terminating double null
> + Size += 1;
> + }
> +
> + // Copy over Template
> + Record = (EFI_SMBIOS_TABLE_HEADER *)AllocateZeroPool (Size);
> + if (Record == NULL) {
> + return EFI_OUT_OF_RESOURCES;
> + }
> + CopyMem (Record, SmbiosEntry, SmbiosEntry->Length);
> +
> + if (StringArray != NULL) {
> + // Append string pack
> + Str = ((CHAR8 *)Record) + Record->Length;
> + for (Index = 0; StringArray[Index] != NULL; Index++) {
> + StringSize = AsciiStrSize (StringArray[Index]);
> + CopyMem (Str, StringArray[Index], StringSize);
> + Str += StringSize;
> + }
> + *Str = 0;
> + }
> +
> + SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
> + Status = gSmbios->Add (
> + gSmbios,
> + gImageHandle,
> + &SmbiosHandle,
> + Record
> + );
> +
> + FreePool (Record);
> + return Status;
> +}
> +
> +
> +
> +/**
> + Update the string associated with an existing SMBIOS record.
> +
> + This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> + SMBIOS record is defined by how many strings were present when Add() was
> called.
> +
> + @param[in] SmbiosHandle SMBIOS Handle of structure that will have its
> string updated.
> + @param[in] StringNumber The non-zero string number of the string to
> update.
> + @param[in] String Update the StringNumber string with String.
> +
> + @retval EFI_SUCCESS SmbiosHandle had its StringNumber String
> updated.
> + @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> + @retval EFI_UNSUPPORTED String was not added because it is longer
> than the SMBIOS Table supports.
> + @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS
> record.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibUpdateString (
> + IN EFI_SMBIOS_HANDLE SmbiosHandle,
> + IN SMBIOS_TABLE_STRING StringNumber,
> + IN CHAR8 *String
> + )
> +{
> + UINTN StringIndex;
> +
> + if (String == NULL) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + if (*String == '\0') {
> + // A string with no data is not legal in SMBIOS
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + StringIndex = StringNumber;
> + return gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex,
> String);
> +}
> +
> +
> +/**
> + Update the string associated with an existing SMBIOS record.
> +
> + This function allows the update of specific SMBIOS strings. The number of
> valid strings for any
> + SMBIOS record is defined by how many strings were present when Add() was
> called.
> +
> + @param[in] SmbiosHandle SMBIOS Handle of structure that will have its
> string updated.
> + @param[in] StringNumber The non-zero string number of the string to
> update.
> + @param[in] String Update the StringNumber string with String.
> +
> + @retval EFI_SUCCESS SmbiosHandle had its StringNumber String
> updated.
> + @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String is
> invalid.
> + @retval EFI_UNSUPPORTED String was not added because it is longer
> than the SMBIOS Table supports.
> + @retval EFI_NOT_FOUND The StringNumber.is not valid for this SMBIOS
> record.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibUpdateUnicodeString (
> + IN EFI_SMBIOS_HANDLE SmbiosHandle,
> + IN SMBIOS_TABLE_STRING StringNumber,
> + IN CHAR16 *String
> + )
> +{
> + EFI_STATUS Status;
> + UINTN StringIndex;
> + CHAR8 *Ascii;
> +
> + if (String == NULL) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + if (*String == '\0') {
> + // A string with no data is not legal in SMBIOS
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + Ascii = AllocateZeroPool (StrSize (String));
> + if (Ascii == NULL) {
> + return EFI_OUT_OF_RESOURCES;
> + }
> + UnicodeStrToAsciiStr (String, Ascii);
> +
> + StringIndex = StringNumber;
> + Status = gSmbios->UpdateString (gSmbios, &SmbiosHandle, &StringIndex,
> Ascii);
> +
> + FreePool (Ascii);
> + return Status;
> +}
> +
> +
> +/**
> + Allow caller to read a specific SMBIOS string
> +
> + @param[in] Header SMBIOS record that contains the string.
> + @param[in[ StringNumber Instance of SMBIOS string 1 - N.
> +
> + @retval NULL Instance of Type SMBIOS string was not found.
> + @retval Other Pointer to matching SMBIOS string.
> +**/
> +CHAR8 *
> +EFIAPI
> +SmbiosLibReadString (
> + IN SMBIOS_STRUCTURE *Header,
> + IN EFI_SMBIOS_STRING StringNumber
> + )
> +{
> + CHAR8 *Data;
> + UINTN Match;
> +
> + Data = (CHAR8 *)Header + Header->Length;
> + for (Match = 1;!(*Data == 0 && *(Data+1) == 0); ) {
> + if (StringNumber == Match) {
> + return Data;
> + }
> + Data++;
> + if (*(Data - 1) == '\0') {
> + Match++;
> + }
> + }
> +
> + return NULL;
> +}
> +
> +
> +/**
> + Allow the caller to discover a specific SMBIOS entry, and patch it if necissary.
> +
> + @param[in] Type Type of the next SMBIOS record to return.
> + @param[in[ Instance Instance of SMBIOS record 0 - N-1.
> + @param[out] SmbiosHandle Returns SMBIOS handle for the matching
> record.
> +
> + @retval NULL Instance of Type SMBIOS record was not found.
> + @retval Other Pointer to matching SMBIOS record.
> +**/
> +SMBIOS_STRUCTURE *
> +EFIAPI
> +SmbiosLibGetRecord (
> + IN EFI_SMBIOS_TYPE Type,
> + IN UINTN Instance,
> + OUT EFI_SMBIOS_HANDLE *SmbiosHandle
> + )
> +{
> + EFI_STATUS Status;
> + EFI_SMBIOS_TABLE_HEADER *Record;
> + UINTN Match;
> +
> + Match = 0;
> + *SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
> + do {
> + Status = gSmbios->GetNext (gSmbios, SmbiosHandle, &Type, &Record,
> NULL);
> + if (!EFI_ERROR (Status)) {
> + if (Match == Instance) {
> + return (SMBIOS_STRUCTURE *)Record;
> + }
> + Match++;
> + }
> + } while (!EFI_ERROR (Status));
> +
> + return NULL;
> +}
> +
> +
> +/**
> + Remove an SMBIOS record.
> +
> + This function removes an SMBIOS record using the handle specified by
> SmbiosHandle.
> +
> + @param[in] SmbiosHandle The handle of the SMBIOS record to
> remove.
> +
> + @retval EFI_SUCCESS SMBIOS record was removed.
> + @retval EFI_INVALID_PARAMETER SmbiosHandle does not specify a valid
> SMBIOS record.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibRemove (
> + OUT EFI_SMBIOS_HANDLE SmbiosHandle
> + )
> +{
> + return gSmbios->Remove (gSmbios, SmbiosHandle);
> +}
> +
> +
> +
> +/**
> +
> + @param ImageHandle ImageHandle of the loaded driver.
> + @param SystemTable Pointer to the EFI System Table.
> +
> + @retval EFI_SUCCESS Register successfully.
> + @retval EFI_OUT_OF_RESOURCES No enough memory to register this
> handler.
> +**/
> +EFI_STATUS
> +EFIAPI
> +SmbiosLibConstructor (
> + IN EFI_HANDLE ImageHandle,
> + IN EFI_SYSTEM_TABLE *SystemTable
> + )
> +{
> + return gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID
> **)&gSmbios);
> +}
> +
> diff --git a/EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf
> b/EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf
> index 0593c47d48..8f4d4c6307 100644
> --- a/EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf
> +++ b/EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf
> @@ -1,47 +1,47 @@
> -## @file
> -# SMBIOS Library
> -#
> -# Copyright (c) 2012, Apple Inc. All rights reserved.
> -# Portions copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
> -#
> -# This program and the accompanying materials
> -# are licensed and made available under the terms and conditions of the BSD
> License
> -# which accompanies this distribution. The full text of the license may be
> found at
> -# http://opensource.org/licenses/bsd-license.php
> -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> -#
> -#
> -##
> -
> -[Defines]
> - INF_VERSION = 0x00010005
> - BASE_NAME = SmbiosLib
> - FILE_GUID = 881863A2-09FD-3E44-8D62-7AE038D03747
> - MODULE_TYPE = DXE_DRIVER
> - VERSION_STRING = 1.0
> - LIBRARY_CLASS = SmbiosLib|DXE_CORE DXE_DRIVER
> DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER SMM_CORE
> UEFI_APPLICATION UEFI_DRIVER
> -
> - CONSTRUCTOR = SmbiosLibConstructor
> -
> -
> -[Sources]
> - SmbiosLib.c
> -
> -[Packages]
> - MdePkg/MdePkg.dec
> - EmulatorPkg/EmulatorPkg.dec
> -
> -[LibraryClasses]
> - BaseLib
> - BaseMemoryLib
> - DebugLib
> - MemoryAllocationLib
> - UefiBootServicesTableLib
> - UefiLib
> -
> -[Protocols]
> - gEfiSmbiosProtocolGuid
> -
> -[Depex]
> - gEfiSmbiosProtocolGuid
> \ No newline at end of file
> +## @file
> +# SMBIOS Library
> +#
> +# Copyright (c) 2012, Apple Inc. All rights reserved.
> +# Portions copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
> +#
> +# This program and the accompanying materials
> +# are licensed and made available under the terms and conditions of the BSD
> License
> +# which accompanies this distribution. The full text of the license may be
> found at
> +# http://opensource.org/licenses/bsd-license.php
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +#
> +#
> +##
> +
> +[Defines]
> + INF_VERSION = 0x00010005
> + BASE_NAME = SmbiosLib
> + FILE_GUID = 881863A2-09FD-3E44-8D62-7AE038D03747
> + MODULE_TYPE = DXE_DRIVER
> + VERSION_STRING = 1.0
> + LIBRARY_CLASS = SmbiosLib|DXE_CORE DXE_DRIVER
> DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER SMM_CORE
> UEFI_APPLICATION UEFI_DRIVER
> +
> + CONSTRUCTOR = SmbiosLibConstructor
> +
> +
> +[Sources]
> + SmbiosLib.c
> +
> +[Packages]
> + MdePkg/MdePkg.dec
> + EmulatorPkg/EmulatorPkg.dec
> +
> +[LibraryClasses]
> + BaseLib
> + BaseMemoryLib
> + DebugLib
> + MemoryAllocationLib
> + UefiBootServicesTableLib
> + UefiLib
> +
> +[Protocols]
> + gEfiSmbiosProtocolGuid
> +
> +[Depex]
> + gEfiSmbiosProtocolGuid
> diff --git a/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubClassDriver.h
> b/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubClassDriver.h
> index c7749f3f17..e4d7cb67c8 100644
> --- a/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubClassDriver.h
> +++ b/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubClassDriver.h
> @@ -112,8 +112,8 @@ extern EFI_HII_HANDLE mHiiHandle;
> @param Smbios The EFI_SMBIOS_PROTOCOL instance.
> @param SmbiosHandle A unique handle will be assigned to the SMBIOS
> record.
> @param Record The data for the fixed portion of the SMBIOS
> record. The format of the record is
> - determined by EFI_SMBIOS_TABLE_HEADER.Type. The size
> of the formatted area is defined
> - by EFI_SMBIOS_TABLE_HEADER.Length and either
> followed by a double-null (0x0000) or
> + determined by EFI_SMBIOS_TABLE_HEADER.Type. The
> size of the formatted area is defined
> + by EFI_SMBIOS_TABLE_HEADER.Length and either
> followed by a double-null (0x0000) or
> a set of null terminated strings and a null.
>
> @retval EFI_SUCCESS Record was added.
> diff --git
> a/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c
> b/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c
> index 65fec01158..ab8ee258c8 100644
> --- a/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c
> +++ b/EmulatorPkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c
> @@ -174,8 +174,8 @@ Returns:
> @param Smbios The EFI_SMBIOS_PROTOCOL instance.
> @param SmbiosHandle A unique handle will be assigned to the SMBIOS
> record.
> @param Record The data for the fixed portion of the SMBIOS
> record. The format of the record is
> - determined by EFI_SMBIOS_TABLE_HEADER.Type. The size
> of the formatted area is defined
> - by EFI_SMBIOS_TABLE_HEADER.Length and either
> followed by a double-null (0x0000) or
> + determined by EFI_SMBIOS_TABLE_HEADER.Type. The
> size of the formatted area is defined
> + by EFI_SMBIOS_TABLE_HEADER.Length and either
> followed by a double-null (0x0000) or
> a set of null terminated strings and a null.
>
> @retval EFI_SUCCESS Record was added.
> diff --git a/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c
> b/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c
> index 123e090ed0..676d324e6b 100644
> --- a/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c
> +++ b/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c
> @@ -66,10 +66,10 @@ CreatePlatformSmbiosMemoryRecords (
> while ((HobPtr.Raw = GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR,
> HobPtr.Raw)) != NULL) {
> if (HobPtr.ResourceDescriptor->ResourceType ==
> EFI_RESOURCE_SYSTEM_MEMORY) {
> gSmbiosType19Template.ExtendedStartingAddress =
> HobPtr.ResourceDescriptor->PhysicalStart;
> - gSmbiosType19Template.ExtendedEndingAddress =
> - HobPtr.ResourceDescriptor->PhysicalStart +
> + gSmbiosType19Template.ExtendedEndingAddress =
> + HobPtr.ResourceDescriptor->PhysicalStart +
> HobPtr.ResourceDescriptor->ResourceLength - 1;
> -
> +
> SmbiosLibCreateEntry ((SMBIOS_STRUCTURE *)&gSmbiosType19Template,
> NULL);
> }
> HobPtr.Raw = GET_NEXT_HOB (HobPtr);
> @@ -97,7 +97,7 @@ PlatfomrSmbiosDriverEntryPoint (
> EFI_SMBIOS_HANDLE SmbiosHandle;
> SMBIOS_STRUCTURE_POINTER Smbios;
>
> - // Phase 0 - Patch table to make SMBIOS 2.7 structures smaller to conform
> + // Phase 0 - Patch table to make SMBIOS 2.7 structures smaller to conform
> // to an early version of the specification.
>
> // Phase 1 - Initialize SMBIOS tables from template
> @@ -112,18 +112,18 @@ PlatfomrSmbiosDriverEntryPoint (
> Smbios.Type0->BiosSize = (UINT8)DivU64x32 (FixedPcdGet64
> (PcdEmuFirmwareFdSize), 64*1024) - 1;
>
> SmbiosLibUpdateUnicodeString (
> - SmbiosHandle,
> - Smbios.Type0->BiosVersion,
> + SmbiosHandle,
> + Smbios.Type0->BiosVersion,
> (CHAR16 *) PcdGetPtr (PcdFirmwareVersionString)
> );
> SmbiosLibUpdateUnicodeString (
> - SmbiosHandle,
> - Smbios.Type0->BiosReleaseDate,
> + SmbiosHandle,
> + Smbios.Type0->BiosReleaseDate,
> (CHAR16 *) PcdGetPtr (PcdFirmwareReleaseDateString)
> );
> }
>
> - // Phase 3 - Create tables from scratch
> + // Phase 3 - Create tables from scratch
>
> // Create Type 13 record from EFI Variables
> // Do we need this record for EFI as the info is available from EFI varaibles
> diff --git a/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.inf
> b/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.inf
> index 737310f470..bee1abb3eb 100644
> --- a/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.inf
> +++ b/EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.inf
> @@ -1,7 +1,7 @@
> ## @file
> # Platform SMBIOS driver that fills in SMBIOS table entries.
> #
> -# Copyright (c) 2012, Apple Inc. All rights reserved.
> +# Copyright (c) 2012, Apple Inc. All rights reserved.
> # Portions copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
> #
> # This program and the accompanying materials
> @@ -52,4 +52,4 @@ [Pcd]
> gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareFdSize
>
> [Depex]
> - TRUE
> \ No newline at end of file
> + TRUE
> diff --git a/EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c
> b/EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c
> index c79e57b304..27679518ef 100644
> --- a/EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c
> +++ b/EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c
> @@ -8,7 +8,7 @@
> Processor Information (Type 4) - CPU Driver
> Cache Information (Type 7) - For cache that is external to processor
> System Slots (Type 9) - If system has slots
> - Physical Memory Array (Type 16)
> + Physical Memory Array (Type 16)
> Memory Device (Type 17) - For each socketed system-memory Device
> Memory Array Mapped Address (Type 19) - One per contiguous block per
> Physical Memroy Array
> System Boot Information (Type 32)
> @@ -69,9 +69,9 @@ SMBIOS_TABLE_TYPE0 gSmbiosType0Template = {
> 0, // PrinterIsSupported :1;
> 0, // CgaMonoIsSupported :1;
> 0, // NecPc98 :1;
> - 0 // ReservedForVendor :32; ///< Bits 32-63. Bits 32-47
> reserved for BIOS vendor
> - ///< and bits 48-63 reserved for System Vendor.
> - },
> + 0 // ReservedForVendor :32; ///< Bits 32-63. Bits 32-47
> reserved for BIOS vendor
> + ///< and bits 48-63 reserved for System Vendor.
> + },
> { // BIOSCharacteristicsExtensionBytes[]
> 0x81, // AcpiIsSupported :1;
> // UsbLegacyIsSupported :1;
> @@ -108,7 +108,7 @@ SMBIOS_TABLE_TYPE1 gSmbiosType1Template = {
> 3, // Version String
> 4, // SerialNumber String
> { 0x25EF0280, 0xEC82, 0x42B0, { 0x8F, 0xB6, 0x10, 0xAD, 0xCC, 0xC6, 0x7C,
> 0x02 } },
> - SystemWakeupTypePowerSwitch,
> + SystemWakeupTypePowerSwitch,
> 5, // SKUNumber String
> 6, // Family String
> };
> @@ -119,7 +119,7 @@ CHAR8 *gSmbiosType1Strings[] = {
> "System Serial#",
> "System SKU#",
> "edk2",
> - NULL
> + NULL
> };
>
> SMBIOS_TABLE_TYPE2 gSmbiosType2Template = {
> @@ -139,7 +139,7 @@ SMBIOS_TABLE_TYPE2 gSmbiosType2Template = {
> },
> 6, // LocationInChassis String
> 0, // ChassisHandle;
> - BaseBoardTypeMotherBoard, // BoardType;
> + BaseBoardTypeMotherBoard, // BoardType;
> 0, // NumberOfContainedObjectHandles;
> { 0 } // ContainedObjectHandles[1];
> };
> @@ -150,7 +150,7 @@ CHAR8 *gSmbiosType2Strings[] = {
> "Base Board Serial#",
> "Base Board Asset Tag#",
> "Part Component",
> - NULL
> + NULL
> };
>
> SMBIOS_TABLE_TYPE3 gSmbiosType3Template = {
> @@ -160,10 +160,10 @@ SMBIOS_TABLE_TYPE3 gSmbiosType3Template = {
> 2, // Version String
> 3, // SerialNumber String
> 4, // AssetTag String
> - ChassisStateSafe, // BootupState;
> - ChassisStateSafe, // PowerSupplyState;
> - ChassisStateSafe, // ThermalState;
> - ChassisSecurityStatusNone,// SecurityStatus;
> + ChassisStateSafe, // BootupState;
> + ChassisStateSafe, // PowerSupplyState;
> + ChassisStateSafe, // ThermalState;
> + ChassisSecurityStatusNone,// SecurityStatus;
> { 0, 0, 0, 0 }, // OemDefined[4];
> 0, // Height;
> 0, // NumberofPowerCords;
> @@ -176,7 +176,7 @@ CHAR8 *gSmbiosType3Strings[] = {
> "EmulatorPkg",
> "Chassis Board Serial#",
> "Chassis Board Asset Tag#",
> - NULL
> + NULL
> };
>
> SMBIOS_TABLE_TYPE8 gSmbiosType8Template1 = {
> diff --git a/EmulatorPkg/Sec/Ia32/SwitchRam.asm
> b/EmulatorPkg/Sec/Ia32/SwitchRam.asm
> index a2e1f3e910..731ee0ffdb 100644
> --- a/EmulatorPkg/Sec/Ia32/SwitchRam.asm
> +++ b/EmulatorPkg/Sec/Ia32/SwitchRam.asm
> @@ -22,7 +22,7 @@
> .586p
> .model flat,C
> .code
> -
> +
> ;------------------------------------------------------------------------------
> ; VOID
> ; EFIAPI
> @@ -30,7 +30,7 @@
> ; UINT32 TemporaryMemoryBase,
> ; UINT32 PermenentMemoryBase
> ; );
> -;------------------------------------------------------------------------------
> +;------------------------------------------------------------------------------
> SecSwitchStack PROC
> ;
> ; Save three register: eax, ebx, ecx
> @@ -39,16 +39,16 @@ SecSwitchStack PROC
> push ebx
> push ecx
> push edx
> -
> +
> ;
> ; !!CAUTION!! this function address's is pushed into stack after
> ; migration of whole temporary memory, so need save it to permenent
> ; memory at first!
> ;
> -
> +
> mov ebx, [esp + 20] ; Save the first parameter
> mov ecx, [esp + 24] ; Save the second parameter
> -
> +
> ;
> ; Save this function's return address into permenent memory at first.
> ; Then, Fixup the esp point to permenent memory
> @@ -57,17 +57,17 @@ SecSwitchStack PROC
> sub eax, ebx
> add eax, ecx
> mov edx, dword ptr [esp] ; copy pushed register's value to permenent
> memory
> - mov dword ptr [eax], edx
> + mov dword ptr [eax], edx
> mov edx, dword ptr [esp + 4]
> - mov dword ptr [eax + 4], edx
> + mov dword ptr [eax + 4], edx
> mov edx, dword ptr [esp + 8]
> - mov dword ptr [eax + 8], edx
> + mov dword ptr [eax + 8], edx
> mov edx, dword ptr [esp + 12]
> - mov dword ptr [eax + 12], edx
> + mov dword ptr [eax + 12], edx
> mov edx, dword ptr [esp + 16] ; Update this function's return address into
> permenent memory
> - mov dword ptr [eax + 16], edx
> + mov dword ptr [eax + 16], edx
> mov esp, eax ; From now, esp is pointed to permenent memory
> -
> +
> ;
> ; Fixup the ebp point to permenent memory
> ;
> @@ -75,7 +75,7 @@ SecSwitchStack PROC
> sub eax, ebx
> add eax, ecx
> mov ebp, eax ; From now, ebp is pointed to permenent memory
> -
> +
> ;
> ; Fixup callee's ebp point for PeiDispatch
> ;
> @@ -83,7 +83,7 @@ SecSwitchStack PROC
> sub eax, ebx
> add eax, ecx
> mov dword ptr [ebp], eax ; From now, Temporary's PPI caller's stack is in
> permenent memory
> -
> +
> pop edx
> pop ecx
> pop ebx
> diff --git a/EmulatorPkg/Sec/Sec.c b/EmulatorPkg/Sec/Sec.c
> index 8a015682dd..4132e9d9b7 100644
> --- a/EmulatorPkg/Sec/Sec.c
> +++ b/EmulatorPkg/Sec/Sec.c
> @@ -1,149 +1,149 @@
> -/*++ @file
> - Stub SEC that is called from the OS appliation that is the root of the emulator.
> -
> - The OS application will call the SEC with the PEI Entry Point API.
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#include "Sec.h"
> -
> -
> -
> -EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {
> - SecTemporaryRamSupport
> -};
> -
> -
> -EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = {
> - {
> - EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
> - &gEfiTemporaryRamSupportPpiGuid,
> - &mSecTemporaryRamSupportPpi
> - }
> -};
> -
> -
> -
> -/**
> - The entry point of PE/COFF Image for the PEI Core, that has been hijacked by
> this
> - SEC that sits on top of an OS application. So the entry and exit of this module
> - has the same API.
> -
> - This function is the entry point for the PEI Foundation, which allows the SEC
> phase
> - to pass information about the stack, temporary RAM and the Boot Firmware
> Volume.
> - In addition, it also allows the SEC phase to pass services and data forward for
> use
> - during the PEI phase in the form of one or more PPIs.
> - There is no limit to the number of additional PPIs that can be passed from
> SEC into
> - the PEI Foundation. As part of its initialization phase, the PEI Foundation will
> add
> - these SEC-hosted PPIs to its PPI database such that both the PEI Foundation
> and any
> - modules can leverage the associated service calls and/or code in these early
> PPIs.
> - This function is required to call ProcessModuleEntryPointList() with the
> Context
> - parameter set to NULL. ProcessModuleEntryPoint() is never expected to
> return.
> - The PEI Core is responsible for calling ProcessLibraryConstructorList() as soon
> as
> - the PEI Services Table and the file handle for the PEI Core itself have been
> established.
> - If ProcessModuleEntryPointList() returns, then ASSERT() and halt the system.
> -
> - @param SecCoreData Points to a data structure containing information
> about the PEI
> - core's operating environment, such as the size and location of
> - temporary RAM, the stack location and the BFV location.
> -
> - @param PpiList Points to a list of one or more PPI descriptors to be
> installed
> - initially by the PEI core. An empty PPI list consists of a single
> - descriptor with the end-tag
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST.
> - As part of its initialization phase, the PEI Foundation will add
> - these SEC-hosted PPIs to its PPI database such that both the PEI
> - Foundation and any modules can leverage the associated service
> calls
> - and/or code in these early PPIs.
> -
> -**/
> -VOID
> -EFIAPI
> -_ModuleEntryPoint (
> - IN EFI_SEC_PEI_HAND_OFF *SecCoreData,
> - IN EFI_PEI_PPI_DESCRIPTOR *PpiList
> - )
> -{
> - EFI_STATUS Status;
> - EFI_PEI_FV_HANDLE VolumeHandle;
> - EFI_PEI_FILE_HANDLE FileHandle;
> - VOID *PeCoffImage;
> - EFI_PEI_CORE_ENTRY_POINT EntryPoint;
> - EFI_PEI_PPI_DESCRIPTOR *Ppi;
> - EFI_PEI_PPI_DESCRIPTOR *SecPpiList;
> - UINTN SecReseveredMemorySize;
> - UINTN Index;
> -
> - EMU_MAGIC_PAGE()->PpiList = PpiList;
> - ProcessLibraryConstructorList ();
> -
> - DEBUG ((EFI_D_ERROR, "SEC Has Started\n"));
> -
> - //
> - // Add Our PPIs to the list
> - //
> - SecReseveredMemorySize = sizeof (gPrivateDispatchTable);
> - for (Ppi = PpiList, Index = 1; ; Ppi++, Index++) {
> - SecReseveredMemorySize += sizeof (EFI_PEI_PPI_DESCRIPTOR);
> -
> - if ((Ppi->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) ==
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) {
> - // Since we are appending, need to clear out privious list terminator.
> - Ppi->Flags &= ~EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
> - break;
> - }
> - }
> -
> - // Keep everything on a good alignment
> - SecReseveredMemorySize = ALIGN_VALUE (SecReseveredMemorySize,
> CPU_STACK_ALIGNMENT);
> -
> -#if 0
> - // Tell the PEI Core to not use our buffer in temp RAM
> - SecPpiList = (EFI_PEI_PPI_DESCRIPTOR *)SecCoreData-
> >PeiTemporaryRamBase;
> - SecCoreData->PeiTemporaryRamBase = (VOID *)((UINTN)SecCoreData-
> >PeiTemporaryRamBase + SecReseveredMemorySize);
> - SecCoreData->PeiTemporaryRamSize -= SecReseveredMemorySize;
> -#else
> - {
> - //
> - // When I subtrack from SecCoreData->PeiTemporaryRamBase PEI Core
> crashes? Either there is a bug
> - // or I don't understand temp RAM correctly?
> - //
> - EFI_PEI_PPI_DESCRIPTOR PpiArray[10];
> -
> - SecPpiList = &PpiArray[0];
> - ASSERT (sizeof (PpiArray) >= SecReseveredMemorySize);
> - }
> -#endif
> - // Copy existing list, and append our entries.
> - CopyMem (SecPpiList, PpiList, sizeof (EFI_PEI_PPI_DESCRIPTOR) * Index);
> - CopyMem (&SecPpiList[Index], gPrivateDispatchTable, sizeof
> (gPrivateDispatchTable));
> -
> - // Find PEI Core and transfer control
> - VolumeHandle = (EFI_PEI_FV_HANDLE)(UINTN)SecCoreData-
> >BootFirmwareVolumeBase;
> - FileHandle = NULL;
> - Status = PeiServicesFfsFindNextFile (EFI_FV_FILETYPE_PEI_CORE,
> VolumeHandle, &FileHandle);
> - ASSERT_EFI_ERROR (Status);
> -
> - Status = PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle,
> &PeCoffImage);
> - ASSERT_EFI_ERROR (Status);
> -
> - Status = PeCoffLoaderGetEntryPoint (PeCoffImage, (VOID **)&EntryPoint);
> - ASSERT_EFI_ERROR (Status);
> -
> - // Transfer control to PEI Core
> - EntryPoint (SecCoreData, SecPpiList);
> -
> - // PEI Core never returns
> - ASSERT (FALSE);
> - return;
> -}
> -
> -
> -
> +/*++ @file
> + Stub SEC that is called from the OS appliation that is the root of the emulator.
> +
> + The OS application will call the SEC with the PEI Entry Point API.
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#include "Sec.h"
> +
> +
> +
> +EFI_PEI_TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {
> + SecTemporaryRamSupport
> +};
> +
> +
> +EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = {
> + {
> + EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST,
> + &gEfiTemporaryRamSupportPpiGuid,
> + &mSecTemporaryRamSupportPpi
> + }
> +};
> +
> +
> +
> +/**
> + The entry point of PE/COFF Image for the PEI Core, that has been hijacked by
> this
> + SEC that sits on top of an OS application. So the entry and exit of this module
> + has the same API.
> +
> + This function is the entry point for the PEI Foundation, which allows the SEC
> phase
> + to pass information about the stack, temporary RAM and the Boot Firmware
> Volume.
> + In addition, it also allows the SEC phase to pass services and data forward for
> use
> + during the PEI phase in the form of one or more PPIs.
> + There is no limit to the number of additional PPIs that can be passed from
> SEC into
> + the PEI Foundation. As part of its initialization phase, the PEI Foundation will
> add
> + these SEC-hosted PPIs to its PPI database such that both the PEI Foundation
> and any
> + modules can leverage the associated service calls and/or code in these early
> PPIs.
> + This function is required to call ProcessModuleEntryPointList() with the
> Context
> + parameter set to NULL. ProcessModuleEntryPoint() is never expected to
> return.
> + The PEI Core is responsible for calling ProcessLibraryConstructorList() as
> soon as
> + the PEI Services Table and the file handle for the PEI Core itself have been
> established.
> + If ProcessModuleEntryPointList() returns, then ASSERT() and halt the system.
> +
> + @param SecCoreData Points to a data structure containing information
> about the PEI
> + core's operating environment, such as the size and location of
> + temporary RAM, the stack location and the BFV location.
> +
> + @param PpiList Points to a list of one or more PPI descriptors to be
> installed
> + initially by the PEI core. An empty PPI list consists of a single
> + descriptor with the end-tag
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST.
> + As part of its initialization phase, the PEI Foundation will add
> + these SEC-hosted PPIs to its PPI database such that both the PEI
> + Foundation and any modules can leverage the associated service
> calls
> + and/or code in these early PPIs.
> +
> +**/
> +VOID
> +EFIAPI
> +_ModuleEntryPoint (
> + IN EFI_SEC_PEI_HAND_OFF *SecCoreData,
> + IN EFI_PEI_PPI_DESCRIPTOR *PpiList
> + )
> +{
> + EFI_STATUS Status;
> + EFI_PEI_FV_HANDLE VolumeHandle;
> + EFI_PEI_FILE_HANDLE FileHandle;
> + VOID *PeCoffImage;
> + EFI_PEI_CORE_ENTRY_POINT EntryPoint;
> + EFI_PEI_PPI_DESCRIPTOR *Ppi;
> + EFI_PEI_PPI_DESCRIPTOR *SecPpiList;
> + UINTN SecReseveredMemorySize;
> + UINTN Index;
> +
> + EMU_MAGIC_PAGE()->PpiList = PpiList;
> + ProcessLibraryConstructorList ();
> +
> + DEBUG ((EFI_D_ERROR, "SEC Has Started\n"));
> +
> + //
> + // Add Our PPIs to the list
> + //
> + SecReseveredMemorySize = sizeof (gPrivateDispatchTable);
> + for (Ppi = PpiList, Index = 1; ; Ppi++, Index++) {
> + SecReseveredMemorySize += sizeof (EFI_PEI_PPI_DESCRIPTOR);
> +
> + if ((Ppi->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) ==
> EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) {
> + // Since we are appending, need to clear out privious list terminator.
> + Ppi->Flags &= ~EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST;
> + break;
> + }
> + }
> +
> + // Keep everything on a good alignment
> + SecReseveredMemorySize = ALIGN_VALUE (SecReseveredMemorySize,
> CPU_STACK_ALIGNMENT);
> +
> +#if 0
> + // Tell the PEI Core to not use our buffer in temp RAM
> + SecPpiList = (EFI_PEI_PPI_DESCRIPTOR *)SecCoreData-
> >PeiTemporaryRamBase;
> + SecCoreData->PeiTemporaryRamBase = (VOID *)((UINTN)SecCoreData-
> >PeiTemporaryRamBase + SecReseveredMemorySize);
> + SecCoreData->PeiTemporaryRamSize -= SecReseveredMemorySize;
> +#else
> + {
> + //
> + // When I subtrack from SecCoreData->PeiTemporaryRamBase PEI Core
> crashes? Either there is a bug
> + // or I don't understand temp RAM correctly?
> + //
> + EFI_PEI_PPI_DESCRIPTOR PpiArray[10];
> +
> + SecPpiList = &PpiArray[0];
> + ASSERT (sizeof (PpiArray) >= SecReseveredMemorySize);
> + }
> +#endif
> + // Copy existing list, and append our entries.
> + CopyMem (SecPpiList, PpiList, sizeof (EFI_PEI_PPI_DESCRIPTOR) * Index);
> + CopyMem (&SecPpiList[Index], gPrivateDispatchTable, sizeof
> (gPrivateDispatchTable));
> +
> + // Find PEI Core and transfer control
> + VolumeHandle = (EFI_PEI_FV_HANDLE)(UINTN)SecCoreData-
> >BootFirmwareVolumeBase;
> + FileHandle = NULL;
> + Status = PeiServicesFfsFindNextFile (EFI_FV_FILETYPE_PEI_CORE,
> VolumeHandle, &FileHandle);
> + ASSERT_EFI_ERROR (Status);
> +
> + Status = PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle,
> &PeCoffImage);
> + ASSERT_EFI_ERROR (Status);
> +
> + Status = PeCoffLoaderGetEntryPoint (PeCoffImage, (VOID **)&EntryPoint);
> + ASSERT_EFI_ERROR (Status);
> +
> + // Transfer control to PEI Core
> + EntryPoint (SecCoreData, SecPpiList);
> +
> + // PEI Core never returns
> + ASSERT (FALSE);
> + return;
> +}
> +
> +
> +
> diff --git a/EmulatorPkg/Sec/Sec.h b/EmulatorPkg/Sec/Sec.h
> index 4782578efa..c5781201eb 100644
> --- a/EmulatorPkg/Sec/Sec.h
> +++ b/EmulatorPkg/Sec/Sec.h
> @@ -1,51 +1,51 @@
> -/*++ @file
> - Stub SEC that is called from the OS appliation that is the root of the emulator.
> -
> - The OS application will call the SEC with the PEI Entry Point API.
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#ifndef __SEC_H___
> -#define __SEC_H___
> -
> -
> -#include <PiPei.h>
> -#include <Library/EmuMagicPageLib.h>
> -#include <Library/DebugLib.h>
> -#include <Library/PeiServicesLib.h>
> -#include <Library/PeCoffGetEntryPointLib.h>
> -#include <Library/BaseMemoryLib.h>
> -
> -#include <Ppi/TemporaryRamSupport.h>
> -
> -
> -//
> -// I think this shold be defined in a MdePkg include file?
> -//
> -VOID
> -EFIAPI
> -ProcessLibraryConstructorList (
> - VOID
> - );
> -
> -EFI_STATUS
> -EFIAPI
> -SecTemporaryRamSupport (
> - IN CONST EFI_PEI_SERVICES **PeiServices,
> - IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
> - IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
> - IN UINTN CopySize
> - );
> -
> -
> -#endif
> -
> +/*++ @file
> + Stub SEC that is called from the OS appliation that is the root of the emulator.
> +
> + The OS application will call the SEC with the PEI Entry Point API.
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#ifndef __SEC_H___
> +#define __SEC_H___
> +
> +
> +#include <PiPei.h>
> +#include <Library/EmuMagicPageLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/PeiServicesLib.h>
> +#include <Library/PeCoffGetEntryPointLib.h>
> +#include <Library/BaseMemoryLib.h>
> +
> +#include <Ppi/TemporaryRamSupport.h>
> +
> +
> +//
> +// I think this shold be defined in a MdePkg include file?
> +//
> +VOID
> +EFIAPI
> +ProcessLibraryConstructorList (
> + VOID
> + );
> +
> +EFI_STATUS
> +EFIAPI
> +SecTemporaryRamSupport (
> + IN CONST EFI_PEI_SERVICES **PeiServices,
> + IN EFI_PHYSICAL_ADDRESS TemporaryMemoryBase,
> + IN EFI_PHYSICAL_ADDRESS PermanentMemoryBase,
> + IN UINTN CopySize
> + );
> +
> +
> +#endif
> +
> diff --git a/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c
> b/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c
> index 4ba27c2a6a..42103e100a 100644
> --- a/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c
> +++ b/EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c
> @@ -47,8 +47,8 @@ typedef struct {
> VOID *CurrentReadPointer;
> VOID *EndReadPointer;
>
> - UINT32
> ReceivedPackets;
> - UINT32
> DroppedPackets;
> + UINT32 ReceivedPackets;
> + UINT32 DroppedPackets;
>
> } EMU_SNP_PRIVATE;
>
> @@ -200,8 +200,8 @@ EmuSnpStart (
> struct ifreq BoundIf;
> struct bpf_program BpfProgram;
> struct bpf_insn *FilterProgram;
> - u_int Value;
> - u_int ReadBufferSize;
> + u_int Value;
> + u_int ReadBufferSize;
> UINT16 Temp16;
> UINT32 Temp32;
>
> @@ -229,23 +229,23 @@ EmuSnpStart (
> }
>
> //
> - // Get the read buffer size.
> - //
> - if (ioctl (Private->BpfFd, BIOCGBLEN, &ReadBufferSize) < 0) {
> - goto DeviceErrorExit;
> - }
> -
> - //
> - // Default value from BIOCGBLEN is usually too small, so use a
> much larger size, if necessary.
> - //
> - if (ReadBufferSize < FixedPcdGet32
> (PcdNetworkPacketFilterSize)) {
> - ReadBufferSize = FixedPcdGet32
> (PcdNetworkPacketFilterSize);
> - if (ioctl (Private->BpfFd, BIOCSBLEN, &ReadBufferSize)
> < 0) {
> - goto DeviceErrorExit;
> - }
> - }
> -
> - //
> + // Get the read buffer size.
> + //
> + if (ioctl (Private->BpfFd, BIOCGBLEN, &ReadBufferSize) < 0) {
> + goto DeviceErrorExit;
> + }
> +
> + //
> + // Default value from BIOCGBLEN is usually too small, so use a much larger
> size, if necessary.
> + //
> + if (ReadBufferSize < FixedPcdGet32 (PcdNetworkPacketFilterSize)) {
> + ReadBufferSize = FixedPcdGet32 (PcdNetworkPacketFilterSize);
> + if (ioctl (Private->BpfFd, BIOCSBLEN, &ReadBufferSize) < 0) {
> + goto DeviceErrorExit;
> + }
> + }
> +
> + //
> // Associate our interface with this BPF file descriptor.
> //
> AsciiStrCpy (BoundIf.ifr_name, Private->InterfaceName);
> @@ -254,7 +254,7 @@ EmuSnpStart (
> }
>
> //
> - // Enable immediate mode.
> + // Enable immediate mode.
> //
> Value = 1;
> if (ioctl (Private->BpfFd, BIOCIMMEDIATE, &Value) < 0) {
> @@ -286,8 +286,8 @@ EmuSnpStart (
> //
> // Allocate read buffer.
> //
> - Private->ReadBufferSize = ReadBufferSize;
> - Private->ReadBuffer = malloc (Private->ReadBufferSize);
> + Private->ReadBufferSize = ReadBufferSize;
> + Private->ReadBuffer = malloc (Private->ReadBufferSize);
> if (Private->ReadBuffer == NULL) {
> goto ErrorExit;
> }
> @@ -295,7 +295,7 @@ EmuSnpStart (
> Private->CurrentReadPointer = Private->EndReadPointer = Private-
> >ReadBuffer;
>
> //
> - // Install our packet filter: successful reads should only produce
> broadcast or unicast
> + // Install our packet filter: successful reads should only produce broadcast
> or unicast
> // packets directed to our fake MAC address.
> //
> FilterProgram = malloc (sizeof (mFilterInstructionTemplate)) ;
> @@ -906,7 +906,7 @@ EmuSnpReceive (
> {
> EMU_SNP_PRIVATE *Private;
> struct bpf_hdr *BpfHeader;
> - struct bpf_stat BpfStats;
> + struct bpf_stat BpfStats;
> ETHERNET_HEADER *EnetHeader;
> ssize_t Result;
>
> @@ -916,19 +916,19 @@ EmuSnpReceive (
> return EFI_NOT_STARTED;
> }
>
> - ZeroMem (&BpfStats, sizeof( BpfStats));
> + ZeroMem (&BpfStats, sizeof( BpfStats));
>
> - if (ioctl (Private->BpfFd, BIOCGSTATS, &BpfStats) == 0) {
> - Private->ReceivedPackets += BpfStats.bs_recv;
> - if (BpfStats.bs_drop > Private->DroppedPackets) {
> - printf (
> - "SNP: STATS: RCVD = %d DROPPED = %d. Probably
> need to increase BPF PcdNetworkPacketFilterSize?\n",
> - BpfStats.bs_recv,
> - BpfStats.bs_drop - Private->DroppedPackets
> - );
> - Private->DroppedPackets = BpfStats.bs_drop;
> - }
> - }
> + if (ioctl (Private->BpfFd, BIOCGSTATS, &BpfStats) == 0) {
> + Private->ReceivedPackets += BpfStats.bs_recv;
> + if (BpfStats.bs_drop > Private->DroppedPackets) {
> + printf (
> + "SNP: STATS: RCVD = %d DROPPED = %d. Probably need to increase BPF
> PcdNetworkPacketFilterSize?\n",
> + BpfStats.bs_recv,
> + BpfStats.bs_drop - Private->DroppedPackets
> + );
> + Private->DroppedPackets = BpfStats.bs_drop;
> + }
> + }
>
> //
> // Do we have any remaining packets from the previous read?
> @@ -1004,7 +1004,7 @@ GetInterfaceMacAddr (
> EMU_SNP_PRIVATE *Private
> )
> {
> - EFI_STATUS Status;
> + EFI_STATUS Status;
> struct ifaddrs *IfAddrs;
> struct ifaddrs *If;
> struct sockaddr_dl *IfSdl;
> diff --git a/EmulatorPkg/Unix/Host/BlockIo.c
> b/EmulatorPkg/Unix/Host/BlockIo.c
> index fa05fbc107..3b87a9e5b1 100644
> --- a/EmulatorPkg/Unix/Host/BlockIo.c
> +++ b/EmulatorPkg/Unix/Host/BlockIo.c
> @@ -347,7 +347,7 @@ EmuBlockIoReadWriteCommon (
> @param[in] MediaId Id of the media, changes every time the media is
> replaced.
> @param[in] Lba The starting Logical Block Address to read from.
> - @param[in, out] Token A pointer to the token associated with the
> transaction.
> + @param[in, out] Token A pointer to the token associated with the
> transaction.
> @param[in] BufferSize Size of Buffer, must be a multiple of device block
> size.
> @param[out] Buffer A pointer to the destination buffer for the data.
> The
> caller is responsible for either having implicit or
> diff --git a/EmulatorPkg/Unix/Host/EmuThunk.c
> b/EmulatorPkg/Unix/Host/EmuThunk.c
> index a7b12b14e5..1a2037f931 100644
> --- a/EmulatorPkg/Unix/Host/EmuThunk.c
> +++ b/EmulatorPkg/Unix/Host/EmuThunk.c
> @@ -1,440 +1,440 @@
> -/*++ @file
> - Since the SEC is the only program in our emulation we
> - must use a UEFI/PI mechanism to export APIs to other modules.
> - This is the role of the EFI_EMU_THUNK_PROTOCOL.
> -
> - The mUnixThunkTable exists so that a change to
> EFI_EMU_THUNK_PROTOCOL
> - will cause an error in initializing the array if all the member functions
> - are not added. It looks like adding a element to end and not initializing
> - it may cause the table to be initaliized with the members at the end being
> - set to zero. This is bad as jumping to zero will crash.
> -
> -Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR>
> -Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#include "Host.h"
> -
> -#ifdef __APPLE__
> -#define DebugAssert _Mangle__DebugAssert
> -
> -#include <assert.h>
> -#include <CoreServices/CoreServices.h>
> -#include <mach/mach.h>
> -#include <mach/mach_time.h>
> -
> -#undef DebugAssert
> -#endif
> -
> -int settimer_initialized;
> -struct timeval settimer_timeval;
> -void (*settimer_callback)(UINT64 delta);
> -
> -BOOLEAN gEmulatorInterruptEnabled = FALSE;
> -
> -
> -UINTN
> -SecWriteStdErr (
> - IN UINT8 *Buffer,
> - IN UINTN NumberOfBytes
> - )
> -{
> - ssize_t Return;
> -
> - Return = write (STDERR_FILENO, (const void *)Buffer,
> (size_t)NumberOfBytes);
> -
> - return (Return == -1) ? 0 : Return;
> -}
> -
> -
> -EFI_STATUS
> -SecConfigStdIn (
> - VOID
> - )
> -{
> - struct termios tty;
> -
> - //
> - // Need to turn off line buffering, ECHO, and make it unbuffered.
> - //
> - tcgetattr (STDIN_FILENO, &tty);
> - tty.c_lflag &= ~(ICANON | ECHO);
> - tcsetattr (STDIN_FILENO, TCSANOW, &tty);
> -
> -// setvbuf (STDIN_FILENO, NULL, _IONBF, 0);
> -
> - // now ioctl FIONREAD will do what we need
> - return EFI_SUCCESS;
> -}
> -
> -UINTN
> -SecWriteStdOut (
> - IN UINT8 *Buffer,
> - IN UINTN NumberOfBytes
> - )
> -{
> - ssize_t Return;
> -
> - Return = write (STDOUT_FILENO, (const void *)Buffer,
> (size_t)NumberOfBytes);
> -
> - return (Return == -1) ? 0 : Return;
> -}
> -
> -UINTN
> -SecReadStdIn (
> - IN UINT8 *Buffer,
> - IN UINTN NumberOfBytes
> - )
> -{
> - ssize_t Return;
> -
> - Return = read (STDIN_FILENO, Buffer, (size_t)NumberOfBytes);
> -
> - return (Return == -1) ? 0 : Return;
> -}
> -
> -BOOLEAN
> -SecPollStdIn (
> - VOID
> - )
> -{
> - int Result;
> - int Bytes;
> -
> - Result = ioctl (STDIN_FILENO, FIONREAD, &Bytes);
> - if (Result == -1) {
> - return FALSE;
> - }
> -
> - return (BOOLEAN)(Bytes > 0);
> -}
> -
> -
> -VOID *
> -SecMalloc (
> - IN UINTN Size
> - )
> -{
> - return malloc ((size_t)Size);
> -}
> -
> -VOID *
> -SecValloc (
> - IN UINTN Size
> - )
> -{
> - return valloc ((size_t)Size);
> -}
> -
> -BOOLEAN
> -SecFree (
> - IN VOID *Ptr
> - )
> -{
> - if (EfiSystemMemoryRange (Ptr)) {
> - // If an address range is in the EFI memory map it was alloced via EFI.
> - // So don't free those ranges and let the caller know.
> - return FALSE;
> - }
> -
> - free (Ptr);
> - return TRUE;
> -}
> -
> -
> -void
> -settimer_handler (int sig)
> -{
> - struct timeval timeval;
> - UINT64 delta;
> -
> - gettimeofday (&timeval, NULL);
> - delta = ((UINT64)timeval.tv_sec * 1000) + (timeval.tv_usec / 1000)
> - - ((UINT64)settimer_timeval.tv_sec * 1000)
> - - (settimer_timeval.tv_usec / 1000);
> - settimer_timeval = timeval;
> -
> - if (settimer_callback) {
> - ReverseGasketUint64 (settimer_callback, delta);
> - }
> -}
> -
> -VOID
> -SecSetTimer (
> - IN UINT64 PeriodMs,
> - IN EMU_SET_TIMER_CALLBACK CallBack
> - )
> -{
> - struct itimerval timerval;
> - UINT32 remainder;
> -
> - if (!settimer_initialized) {
> - struct sigaction act;
> -
> - settimer_initialized = 1;
> - act.sa_handler = settimer_handler;
> - act.sa_flags = 0;
> - sigemptyset (&act.sa_mask);
> - gEmulatorInterruptEnabled = TRUE;
> - if (sigaction (SIGALRM, &act, NULL) != 0) {
> - printf ("SetTimer: sigaction error %s\n", strerror (errno));
> - }
> - if (gettimeofday (&settimer_timeval, NULL) != 0) {
> - printf ("SetTimer: gettimeofday error %s\n", strerror (errno));
> - }
> - }
> - timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);
> - DivU64x32Remainder(PeriodMs, 1000, &remainder);
> - timerval.it_value.tv_usec = remainder * 1000;
> - timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);
> - timerval.it_interval = timerval.it_value;
> -
> - if (setitimer (ITIMER_REAL, &timerval, NULL) != 0) {
> - printf ("SetTimer: setitimer error %s\n", strerror (errno));
> - }
> - settimer_callback = CallBack;
> -}
> -
> -
> -VOID
> -SecEnableInterrupt (
> - VOID
> - )
> -{
> - sigset_t sigset;
> -
> - gEmulatorInterruptEnabled = TRUE;
> - // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
> - // by enabling/disabling SIGALRM.
> - sigemptyset (&sigset);
> - sigaddset (&sigset, SIGALRM);
> - pthread_sigmask (SIG_UNBLOCK, &sigset, NULL);
> -}
> -
> -
> -VOID
> -SecDisableInterrupt (
> - VOID
> - )
> -{
> - sigset_t sigset;
> -
> - // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
> - // by enabling/disabling SIGALRM.
> - sigemptyset (&sigset);
> - sigaddset (&sigset, SIGALRM);
> - pthread_sigmask (SIG_BLOCK, &sigset, NULL);
> - gEmulatorInterruptEnabled = FALSE;
> -}
> -
> -
> -BOOLEAN
> -SecInterruptEanbled (void)
> -{
> - return gEmulatorInterruptEnabled;
> -}
> -
> -
> -UINT64
> -QueryPerformanceFrequency (
> - VOID
> - )
> -{
> - // Hard code to nanoseconds
> - return 1000000000ULL;
> -}
> -
> -UINT64
> -QueryPerformanceCounter (
> - VOID
> - )
> -{
> -#if __APPLE__
> - UINT64 Start;
> - static mach_timebase_info_data_t sTimebaseInfo;
> -
> -
> - Start = mach_absolute_time ();
> -
> - // Convert to nanoseconds.
> -
> - // If this is the first time we've run, get the timebase.
> - // We can use denom == 0 to indicate that sTimebaseInfo is
> - // uninitialised because it makes no sense to have a zero
> - // denominator is a fraction.
> -
> - if ( sTimebaseInfo.denom == 0 ) {
> - (void) mach_timebase_info(&sTimebaseInfo);
> - }
> -
> - // Do the maths. We hope that the multiplication doesn't
> - // overflow; the price you pay for working in fixed point.
> -
> - return (Start * sTimebaseInfo.numer) / sTimebaseInfo.denom;
> -#else
> - // Need to figure out what to do for Linux?
> - return 0;
> -#endif
> -}
> -
> -
> -
> -VOID
> -SecSleep (
> - IN UINT64 Nanoseconds
> - )
> -{
> - struct timespec rq, rm;
> - struct timeval start, end;
> - unsigned long MicroSec;
> -
> - rq.tv_sec = DivU64x32 (Nanoseconds, 1000000000);
> - rq.tv_nsec = ModU64x32 (Nanoseconds, 1000000000);
> -
> - //
> - // nanosleep gets interrupted by our timer tic.
> - // we need to track wall clock time or we will stall for way too long
> - //
> - gettimeofday (&start, NULL);
> - end.tv_sec = start.tv_sec + rq.tv_sec;
> - MicroSec = (start.tv_usec + rq.tv_nsec/1000);
> - end.tv_usec = MicroSec % 1000000;
> - if (MicroSec > 1000000) {
> - end.tv_sec++;
> - }
> -
> - while (nanosleep (&rq, &rm) == -1) {
> - if (errno != EINTR) {
> - break;
> - }
> - gettimeofday (&start, NULL);
> - if (start.tv_sec > end.tv_sec) {
> - break;
> - } if ((start.tv_sec == end.tv_sec) && (start.tv_usec > end.tv_usec)) {
> - break;
> - }
> - rq = rm;
> - }
> -}
> -
> -
> -VOID
> -SecCpuSleep (
> - VOID
> - )
> -{
> - struct timespec rq, rm;
> -
> - // nanosleep gets interrupted by the timer tic
> - rq.tv_sec = 1;
> - rq.tv_nsec = 0;
> -
> - nanosleep (&rq, &rm);
> -}
> -
> -
> -VOID
> -SecExit (
> - UINTN Status
> - )
> -{
> - exit (Status);
> -}
> -
> -
> -VOID
> -SecGetTime (
> - OUT EFI_TIME *Time,
> - OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
> - )
> -{
> - struct tm *tm;
> - time_t t;
> -
> - t = time (NULL);
> - tm = localtime (&t);
> -
> - Time->Year = 1900 + tm->tm_year;
> - Time->Month = tm->tm_mon + 1;
> - Time->Day = tm->tm_mday;
> - Time->Hour = tm->tm_hour;
> - Time->Minute = tm->tm_min;
> - Time->Second = tm->tm_sec;
> - Time->Nanosecond = 0;
> - Time->TimeZone = timezone;
> - Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0)
> - | (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
> -
> - if (Capabilities != NULL) {
> - Capabilities->Resolution = 1;
> - Capabilities->Accuracy = 50000000;
> - Capabilities->SetsToZero = FALSE;
> - }
> -}
> -
> -
> -
> -VOID
> -SecSetTime (
> - IN EFI_TIME *Time
> - )
> -{
> - // Don't change the time on the system
> - // We could save delta to localtime() and have SecGetTime adjust return
> values?
> - return;
> -}
> -
> -
> -EFI_STATUS
> -SecGetNextProtocol (
> - IN BOOLEAN EmuBusDriver,
> - OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL
> - )
> -{
> - return GetNextThunkProtocol (EmuBusDriver, Instance);
> -}
> -
> -
> -EMU_THUNK_PROTOCOL gEmuThunkProtocol = {
> - GasketSecWriteStdErr,
> - GasketSecConfigStdIn,
> - GasketSecWriteStdOut,
> - GasketSecReadStdIn,
> - GasketSecPollStdIn,
> - GasketSecMalloc,
> - GasketSecValloc,
> - GasketSecFree,
> - GasketSecPeCoffGetEntryPoint,
> - GasketSecPeCoffRelocateImageExtraAction,
> - GasketSecPeCoffUnloadImageExtraAction,
> - GasketSecEnableInterrupt,
> - GasketSecDisableInterrupt,
> - GasketQueryPerformanceFrequency,
> - GasketQueryPerformanceCounter,
> - GasketSecSleep,
> - GasketSecCpuSleep,
> - GasketSecExit,
> - GasketSecGetTime,
> - GasketSecSetTime,
> - GasketSecSetTimer,
> - GasketSecGetNextProtocol
> -};
> -
> -
> -VOID
> -SecInitThunkProtocol (
> - VOID
> - )
> -{
> - // timezone and daylight lib globals depend on tzset be called 1st.
> - tzset ();
> -}
> -
> +/*++ @file
> + Since the SEC is the only program in our emulation we
> + must use a UEFI/PI mechanism to export APIs to other modules.
> + This is the role of the EFI_EMU_THUNK_PROTOCOL.
> +
> + The mUnixThunkTable exists so that a change to
> EFI_EMU_THUNK_PROTOCOL
> + will cause an error in initializing the array if all the member functions
> + are not added. It looks like adding a element to end and not initializing
> + it may cause the table to be initaliized with the members at the end being
> + set to zero. This is bad as jumping to zero will crash.
> +
> +Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR>
> +Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#include "Host.h"
> +
> +#ifdef __APPLE__
> +#define DebugAssert _Mangle__DebugAssert
> +
> +#include <assert.h>
> +#include <CoreServices/CoreServices.h>
> +#include <mach/mach.h>
> +#include <mach/mach_time.h>
> +
> +#undef DebugAssert
> +#endif
> +
> +int settimer_initialized;
> +struct timeval settimer_timeval;
> +void (*settimer_callback)(UINT64 delta);
> +
> +BOOLEAN gEmulatorInterruptEnabled = FALSE;
> +
> +
> +UINTN
> +SecWriteStdErr (
> + IN UINT8 *Buffer,
> + IN UINTN NumberOfBytes
> + )
> +{
> + ssize_t Return;
> +
> + Return = write (STDERR_FILENO, (const void *)Buffer,
> (size_t)NumberOfBytes);
> +
> + return (Return == -1) ? 0 : Return;
> +}
> +
> +
> +EFI_STATUS
> +SecConfigStdIn (
> + VOID
> + )
> +{
> + struct termios tty;
> +
> + //
> + // Need to turn off line buffering, ECHO, and make it unbuffered.
> + //
> + tcgetattr (STDIN_FILENO, &tty);
> + tty.c_lflag &= ~(ICANON | ECHO);
> + tcsetattr (STDIN_FILENO, TCSANOW, &tty);
> +
> +// setvbuf (STDIN_FILENO, NULL, _IONBF, 0);
> +
> + // now ioctl FIONREAD will do what we need
> + return EFI_SUCCESS;
> +}
> +
> +UINTN
> +SecWriteStdOut (
> + IN UINT8 *Buffer,
> + IN UINTN NumberOfBytes
> + )
> +{
> + ssize_t Return;
> +
> + Return = write (STDOUT_FILENO, (const void *)Buffer,
> (size_t)NumberOfBytes);
> +
> + return (Return == -1) ? 0 : Return;
> +}
> +
> +UINTN
> +SecReadStdIn (
> + IN UINT8 *Buffer,
> + IN UINTN NumberOfBytes
> + )
> +{
> + ssize_t Return;
> +
> + Return = read (STDIN_FILENO, Buffer, (size_t)NumberOfBytes);
> +
> + return (Return == -1) ? 0 : Return;
> +}
> +
> +BOOLEAN
> +SecPollStdIn (
> + VOID
> + )
> +{
> + int Result;
> + int Bytes;
> +
> + Result = ioctl (STDIN_FILENO, FIONREAD, &Bytes);
> + if (Result == -1) {
> + return FALSE;
> + }
> +
> + return (BOOLEAN)(Bytes > 0);
> +}
> +
> +
> +VOID *
> +SecMalloc (
> + IN UINTN Size
> + )
> +{
> + return malloc ((size_t)Size);
> +}
> +
> +VOID *
> +SecValloc (
> + IN UINTN Size
> + )
> +{
> + return valloc ((size_t)Size);
> +}
> +
> +BOOLEAN
> +SecFree (
> + IN VOID *Ptr
> + )
> +{
> + if (EfiSystemMemoryRange (Ptr)) {
> + // If an address range is in the EFI memory map it was alloced via EFI.
> + // So don't free those ranges and let the caller know.
> + return FALSE;
> + }
> +
> + free (Ptr);
> + return TRUE;
> +}
> +
> +
> +void
> +settimer_handler (int sig)
> +{
> + struct timeval timeval;
> + UINT64 delta;
> +
> + gettimeofday (&timeval, NULL);
> + delta = ((UINT64)timeval.tv_sec * 1000) + (timeval.tv_usec / 1000)
> + - ((UINT64)settimer_timeval.tv_sec * 1000)
> + - (settimer_timeval.tv_usec / 1000);
> + settimer_timeval = timeval;
> +
> + if (settimer_callback) {
> + ReverseGasketUint64 (settimer_callback, delta);
> + }
> +}
> +
> +VOID
> +SecSetTimer (
> + IN UINT64 PeriodMs,
> + IN EMU_SET_TIMER_CALLBACK CallBack
> + )
> +{
> + struct itimerval timerval;
> + UINT32 remainder;
> +
> + if (!settimer_initialized) {
> + struct sigaction act;
> +
> + settimer_initialized = 1;
> + act.sa_handler = settimer_handler;
> + act.sa_flags = 0;
> + sigemptyset (&act.sa_mask);
> + gEmulatorInterruptEnabled = TRUE;
> + if (sigaction (SIGALRM, &act, NULL) != 0) {
> + printf ("SetTimer: sigaction error %s\n", strerror (errno));
> + }
> + if (gettimeofday (&settimer_timeval, NULL) != 0) {
> + printf ("SetTimer: gettimeofday error %s\n", strerror (errno));
> + }
> + }
> + timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);
> + DivU64x32Remainder(PeriodMs, 1000, &remainder);
> + timerval.it_value.tv_usec = remainder * 1000;
> + timerval.it_value.tv_sec = DivU64x32(PeriodMs, 1000);
> + timerval.it_interval = timerval.it_value;
> +
> + if (setitimer (ITIMER_REAL, &timerval, NULL) != 0) {
> + printf ("SetTimer: setitimer error %s\n", strerror (errno));
> + }
> + settimer_callback = CallBack;
> +}
> +
> +
> +VOID
> +SecEnableInterrupt (
> + VOID
> + )
> +{
> + sigset_t sigset;
> +
> + gEmulatorInterruptEnabled = TRUE;
> + // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
> + // by enabling/disabling SIGALRM.
> + sigemptyset (&sigset);
> + sigaddset (&sigset, SIGALRM);
> + pthread_sigmask (SIG_UNBLOCK, &sigset, NULL);
> +}
> +
> +
> +VOID
> +SecDisableInterrupt (
> + VOID
> + )
> +{
> + sigset_t sigset;
> +
> + // Since SetTimer() uses SIGALRM we emulate turning on and off interrupts
> + // by enabling/disabling SIGALRM.
> + sigemptyset (&sigset);
> + sigaddset (&sigset, SIGALRM);
> + pthread_sigmask (SIG_BLOCK, &sigset, NULL);
> + gEmulatorInterruptEnabled = FALSE;
> +}
> +
> +
> +BOOLEAN
> +SecInterruptEanbled (void)
> +{
> + return gEmulatorInterruptEnabled;
> +}
> +
> +
> +UINT64
> +QueryPerformanceFrequency (
> + VOID
> + )
> +{
> + // Hard code to nanoseconds
> + return 1000000000ULL;
> +}
> +
> +UINT64
> +QueryPerformanceCounter (
> + VOID
> + )
> +{
> +#if __APPLE__
> + UINT64 Start;
> + static mach_timebase_info_data_t sTimebaseInfo;
> +
> +
> + Start = mach_absolute_time ();
> +
> + // Convert to nanoseconds.
> +
> + // If this is the first time we've run, get the timebase.
> + // We can use denom == 0 to indicate that sTimebaseInfo is
> + // uninitialised because it makes no sense to have a zero
> + // denominator is a fraction.
> +
> + if ( sTimebaseInfo.denom == 0 ) {
> + (void) mach_timebase_info(&sTimebaseInfo);
> + }
> +
> + // Do the maths. We hope that the multiplication doesn't
> + // overflow; the price you pay for working in fixed point.
> +
> + return (Start * sTimebaseInfo.numer) / sTimebaseInfo.denom;
> +#else
> + // Need to figure out what to do for Linux?
> + return 0;
> +#endif
> +}
> +
> +
> +
> +VOID
> +SecSleep (
> + IN UINT64 Nanoseconds
> + )
> +{
> + struct timespec rq, rm;
> + struct timeval start, end;
> + unsigned long MicroSec;
> +
> + rq.tv_sec = DivU64x32 (Nanoseconds, 1000000000);
> + rq.tv_nsec = ModU64x32 (Nanoseconds, 1000000000);
> +
> + //
> + // nanosleep gets interrupted by our timer tic.
> + // we need to track wall clock time or we will stall for way too long
> + //
> + gettimeofday (&start, NULL);
> + end.tv_sec = start.tv_sec + rq.tv_sec;
> + MicroSec = (start.tv_usec + rq.tv_nsec/1000);
> + end.tv_usec = MicroSec % 1000000;
> + if (MicroSec > 1000000) {
> + end.tv_sec++;
> + }
> +
> + while (nanosleep (&rq, &rm) == -1) {
> + if (errno != EINTR) {
> + break;
> + }
> + gettimeofday (&start, NULL);
> + if (start.tv_sec > end.tv_sec) {
> + break;
> + } if ((start.tv_sec == end.tv_sec) && (start.tv_usec > end.tv_usec)) {
> + break;
> + }
> + rq = rm;
> + }
> +}
> +
> +
> +VOID
> +SecCpuSleep (
> + VOID
> + )
> +{
> + struct timespec rq, rm;
> +
> + // nanosleep gets interrupted by the timer tic
> + rq.tv_sec = 1;
> + rq.tv_nsec = 0;
> +
> + nanosleep (&rq, &rm);
> +}
> +
> +
> +VOID
> +SecExit (
> + UINTN Status
> + )
> +{
> + exit (Status);
> +}
> +
> +
> +VOID
> +SecGetTime (
> + OUT EFI_TIME *Time,
> + OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL
> + )
> +{
> + struct tm *tm;
> + time_t t;
> +
> + t = time (NULL);
> + tm = localtime (&t);
> +
> + Time->Year = 1900 + tm->tm_year;
> + Time->Month = tm->tm_mon + 1;
> + Time->Day = tm->tm_mday;
> + Time->Hour = tm->tm_hour;
> + Time->Minute = tm->tm_min;
> + Time->Second = tm->tm_sec;
> + Time->Nanosecond = 0;
> + Time->TimeZone = timezone;
> + Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0)
> + | (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
> +
> + if (Capabilities != NULL) {
> + Capabilities->Resolution = 1;
> + Capabilities->Accuracy = 50000000;
> + Capabilities->SetsToZero = FALSE;
> + }
> +}
> +
> +
> +
> +VOID
> +SecSetTime (
> + IN EFI_TIME *Time
> + )
> +{
> + // Don't change the time on the system
> + // We could save delta to localtime() and have SecGetTime adjust return
> values?
> + return;
> +}
> +
> +
> +EFI_STATUS
> +SecGetNextProtocol (
> + IN BOOLEAN EmuBusDriver,
> + OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL
> + )
> +{
> + return GetNextThunkProtocol (EmuBusDriver, Instance);
> +}
> +
> +
> +EMU_THUNK_PROTOCOL gEmuThunkProtocol = {
> + GasketSecWriteStdErr,
> + GasketSecConfigStdIn,
> + GasketSecWriteStdOut,
> + GasketSecReadStdIn,
> + GasketSecPollStdIn,
> + GasketSecMalloc,
> + GasketSecValloc,
> + GasketSecFree,
> + GasketSecPeCoffGetEntryPoint,
> + GasketSecPeCoffRelocateImageExtraAction,
> + GasketSecPeCoffUnloadImageExtraAction,
> + GasketSecEnableInterrupt,
> + GasketSecDisableInterrupt,
> + GasketQueryPerformanceFrequency,
> + GasketQueryPerformanceCounter,
> + GasketSecSleep,
> + GasketSecCpuSleep,
> + GasketSecExit,
> + GasketSecGetTime,
> + GasketSecSetTime,
> + GasketSecSetTimer,
> + GasketSecGetNextProtocol
> +};
> +
> +
> +VOID
> +SecInitThunkProtocol (
> + VOID
> + )
> +{
> + // timezone and daylight lib globals depend on tzset be called 1st.
> + tzset ();
> +}
> +
> diff --git a/EmulatorPkg/Unix/Host/Host.c b/EmulatorPkg/Unix/Host/Host.c
> index f84b22f576..9aba7c854d 100644
> --- a/EmulatorPkg/Unix/Host/Host.c
> +++ b/EmulatorPkg/Unix/Host/Host.c
> @@ -1148,7 +1148,7 @@ GdbScriptAddImage (
>
> if (ImageContext->PdbPointer != NULL && !IsPdbFile (ImageContext-
> >PdbPointer)) {
> FILE *GdbTempFile;
> - if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
> + if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
> GdbTempFile = fopen (gGdbWorkingFileName, "a");
> if (GdbTempFile != NULL) {
> long unsigned int SymbolsAddr = (long unsigned int)(ImageContext-
> >ImageAddress + ImageContext->SizeOfHeaders);
> @@ -1170,13 +1170,13 @@ GdbScriptAddImage (
> GdbTempFile = fopen (gGdbWorkingFileName, "w");
> if (GdbTempFile != NULL) {
> fprintf (
> - GdbTempFile,
> - "add-symbol-file %s 0x%08lx\n",
> - ImageContext->PdbPointer,
> + GdbTempFile,
> + "add-symbol-file %s 0x%08lx\n",
> + ImageContext->PdbPointer,
> (long unsigned int)(ImageContext->ImageAddress + ImageContext-
> >SizeOfHeaders)
> );
> fclose (GdbTempFile);
> -
> +
> //
> // Target for gdb breakpoint in a script that uses gGdbWorkingFileName
> to set a breakpoint.
> // Hey what can you say scripting in gdb is not that great....
> @@ -1225,7 +1225,7 @@ GdbScriptRemoveImage (
> return;
> }
>
> - if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
> + if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) {
> //
> // Write the file we need for the gdb script
> //
> @@ -1256,7 +1256,7 @@ GdbScriptRemoveImage (
> SecGdbScriptBreak (ImageContext->PdbPointer, strlen (ImageContext-
> >PdbPointer) + 1, 0, 0);
> } else {
> ASSERT (FALSE);
> - }
> + }
> }
> }
>
> diff --git a/EmulatorPkg/Unix/Host/Host.h b/EmulatorPkg/Unix/Host/Host.h
> index 66c7c8df12..f7db46cdcd 100644
> --- a/EmulatorPkg/Unix/Host/Host.h
> +++ b/EmulatorPkg/Unix/Host/Host.h
> @@ -82,7 +82,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY
> KIND, EITHER EXPRESS OR IMPLIED.
> #undef NTOHS
> #undef HTONS
> #undef B0
> -#undef CR3
> +#undef CR3
>
> #include <PiPei.h>
> #include <Uefi.h>
> diff --git a/EmulatorPkg/Unix/Host/Ia32/Gasket.S
> b/EmulatorPkg/Unix/Host/Ia32/Gasket.S
> index aa90ea8095..5664cc54b4 100644
> --- a/EmulatorPkg/Unix/Host/Ia32/Gasket.S
> +++ b/EmulatorPkg/Unix/Host/Ia32/Gasket.S
> @@ -1,1492 +1,1492 @@
> -#------------------------------------------------------------------------------
> -#
> -# Manage differenced between UNIX ABI and EFI/Windows ABI
> -#
> -# For IA-32 the only difference is Mac OS X requires a 16-byte aligned stack.
> -# For Linux this stack adjustment is a no-op, but we may as well make the
> -# the code common.
> -#
> -# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> -# This program and the accompanying materials
> -# are licensed and made available under the terms and conditions of the BSD
> License
> -# which accompanies this distribution. The full text of the license may be
> found at
> -# http://opensource.org/licenses/bsd-license.php
> -#
> -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> -#
> -#------------------------------------------------------------------------------
> -
> -
> -
> - .text
> -
> -//
> -// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)
> -//
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)
> -ASM_PFX(GasketSecWriteStdErr):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecWriteStdErr)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)
> -ASM_PFX(GasketSecConfigStdIn):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecConfigStdIn)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)
> -ASM_PFX(GasketSecWriteStdOut):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecWriteStdOut)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)
> -ASM_PFX(GasketSecReadStdIn):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecReadStdIn)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)
> -ASM_PFX(GasketSecPollStdIn):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecPollStdIn)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecMalloc)
> -ASM_PFX(GasketSecMalloc):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecMalloc)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecValloc)
> -ASM_PFX(GasketSecValloc):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecValloc)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecFree)
> -ASM_PFX(GasketSecFree):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecFree)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecSetTimer)
> -ASM_PFX(GasketSecSetTimer):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 8(%ebp), %eax
> - movl 12(%ebp), %edx
> - movl %edx, 4(%esp)
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecSetTimer)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)
> -ASM_PFX(GasketSecEnableInterrupt):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> -
> - call ASM_PFX(SecEnableInterrupt)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)
> -ASM_PFX(GasketSecDisableInterrupt):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> -
> - call ASM_PFX(SecDisableInterrupt)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)
> -ASM_PFX(GasketQueryPerformanceFrequency):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> -
> - call ASM_PFX(QueryPerformanceFrequency)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)
> -ASM_PFX(GasketQueryPerformanceCounter):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> -
> - call ASM_PFX(QueryPerformanceCounter)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecSleep)
> -ASM_PFX(GasketSecSleep):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl 12(%ebp), %ecx
> - movl %ecx, 4(%esp)
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecSleep)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)
> -ASM_PFX(GasketSecCpuSleep):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> -
> - call ASM_PFX(SecCpuSleep)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecExit)
> -ASM_PFX(GasketSecExit):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecExit) // Less to do as we will never return to EFI ABI
> world
> -LDEAD_LOOP:
> - jmp LDEAD_LOOP // _exit should never return
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecGetTime)
> -ASM_PFX(GasketSecGetTime):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecGetTime)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecSetTime)
> -ASM_PFX(GasketSecSetTime):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecSetTime)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)
> -ASM_PFX(GasketSecGetNextProtocol):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecGetNextProtocol)
> -
> - leave
> - ret
> -
> -// PPIs produced by SEC
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)
> -ASM_PFX(GasketSecPeCoffGetEntryPoint):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecPeCoffGetEntryPoint)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)
> -ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecPeCoffRelocateImageExtraAction)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)
> -ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecPeCoffUnloadImageExtraAction)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)
> -ASM_PFX(GasketSecEmuThunkAddress):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> -
> - call ASM_PFX(SecEmuThunkAddress)
> -
> - leave
> - ret
> -
> -//
> -// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
> -//
> -
> -ASM_GLOBAL ASM_PFX(GasketX11Size)
> -ASM_PFX(GasketX11Size):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(X11Size)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11CheckKey)
> -ASM_PFX(GasketX11CheckKey):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(X11CheckKey)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GetKey)
> -ASM_PFX(GasketX11GetKey):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(X11GetKey)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11KeySetState)
> -ASM_PFX(GasketX11KeySetState):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(X11KeySetState)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)
> -ASM_PFX(GasketX11RegisterKeyNotify):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(X11RegisterKeyNotify)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11Blt)
> -ASM_PFX(GasketX11Blt):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(X11Blt)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)
> -ASM_PFX(GasketX11CheckPointer):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(X11CheckPointer)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)
> -ASM_PFX(GasketX11GetPointerState):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(X11GetPointerState)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)
> -ASM_PFX(GasketX11GraphicsWindowOpen):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(X11GraphicsWindowOpen)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)
> -ASM_PFX(GasketX11GraphicsWindowClose):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(X11GraphicsWindowClose)
> -
> - leave
> - ret
> -
> -
> -// Pthreads
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)
> -ASM_PFX(GasketPthreadMutexLock):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PthreadMutexLock)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)
> -ASM_PFX(GasketPthreadMutexUnLock):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PthreadMutexUnLock)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)
> -ASM_PFX(GasketPthreadMutexTryLock):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PthreadMutexTryLock)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)
> -ASM_PFX(GasketPthreadMutexInit):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> -
> - call ASM_PFX(PthreadMutexInit)
> -
> - leave
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)
> -ASM_PFX(GasketPthreadMutexDestroy):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PthreadMutexDestroy)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadCreate)
> -ASM_PFX(GasketPthreadCreate):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PthreadCreate)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadExit)
> -ASM_PFX(GasketPthreadExit):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PthreadExit)
> -
> - leave
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadSelf)
> -ASM_PFX(GasketPthreadSelf):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> -
> - call ASM_PFX(PthreadSelf)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadOpen)
> -ASM_PFX(GasketPthreadOpen):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PthreadOpen)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadClose)
> -ASM_PFX(GasketPthreadClose):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PthreadClose)
> -
> - leave
> - ret
> -
> -
> -
> -
> -//
> -// UNIX ABI to EFI ABI call
> -//
> -// UINTN
> -// ReverseGasketUint64 (
> -// void *Api,
> -// UINTN Arg1
> -// );
> -ASM_GLOBAL ASM_PFX(ReverseGasketUint64)
> -ASM_PFX(ReverseGasketUint64):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $8, %esp
> - movl 16(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, (%esp)
> - calll *8(%ebp)
> - addl $8, %esp
> - popl %ebp
> - ret
> -
> -
> -
> -//
> -// UNIX ABI to EFI ABI call
> -//
> -// UINTN
> -// ReverseGasketUint64Uint64 (
> -// void *Api,
> -// UINTN Arg1
> -// UINTN Arg2
> -// );
> -ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)
> -ASM_PFX(ReverseGasketUint64Uint64):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp
> - movl 24(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 20(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, (%esp)
> - calll *8(%ebp)
> - addl $24, %esp
> - popl %ebp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)
> -ASM_PFX(GasketSecUnixPeiAutoScan):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecUnixPeiAutoScan)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)
> -ASM_PFX(GasketSecUnixFdAddress):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(SecUnixFdAddress)
> -
> - leave
> - ret
> -
> -
> -// EmuIoThunk SimpleFileSystem
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)
> -ASM_PFX(GasketPosixOpenVolume):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixOpenVolume)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)
> -ASM_PFX(GasketPosixFileOpen):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $56, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 28(%ebp), %eax
> - movl 32(%ebp), %ecx
> - movl %ecx, 24(%esp)
> - movl %eax, 20(%esp)
> - movl 20(%ebp), %eax
> - movl 24(%ebp), %ecx
> - movl %ecx, 16(%esp)
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileOpen)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)
> -ASM_PFX(GasketPosixFileCLose):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileCLose)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)
> -ASM_PFX(GasketPosixFileDelete):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileDelete)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileRead)
> -ASM_PFX(GasketPosixFileRead):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileRead)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)
> -ASM_PFX(GasketPosixFileWrite):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileWrite)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)
> -ASM_PFX(GasketPosixFileSetPossition):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl 16(%ebp), %ecx
> - movl %ecx, 8(%esp)
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileSetPossition)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)
> -ASM_PFX(GasketPosixFileGetPossition):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileGetPossition)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)
> -ASM_PFX(GasketPosixFileGetInfo):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileGetInfo)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)
> -ASM_PFX(GasketPosixFileSetInfo):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileSetInfo)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)
> -ASM_PFX(GasketPosixFileFlush):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileFlush)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)
> -ASM_PFX(GasketPosixFileSystmeThunkOpen):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileSystmeThunkOpen)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)
> -ASM_PFX(GasketPosixFileSystmeThunkClose):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(PosixFileSystmeThunkClose)
> -
> - leave
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)
> -ASM_PFX(GasketEmuBlockIoReset):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuBlockIoReset)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)
> -ASM_PFX(GasketEmuBlockIoReadBlocks):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $56, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 32(%ebp), %eax
> - movl %eax, 24(%esp)
> - movl 28(%ebp), %eax
> - movl %eax, 20(%esp)
> - movl 24(%ebp), %eax
> - movl %eax, 16(%esp)
> - movl 16(%ebp), %eax
> - movl 20(%ebp), %edx
> - movl %edx, 12(%esp)
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuBlockIoReadBlocks)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)
> -ASM_PFX(GasketEmuBlockIoWriteBlocks):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $56, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 32(%ebp), %eax
> - movl %eax, 24(%esp)
> - movl 28(%ebp), %eax
> - movl %eax, 20(%esp)
> - movl 24(%ebp), %eax
> - movl %eax, 16(%esp)
> - movl 16(%ebp), %eax
> - movl 20(%ebp), %edx
> - movl %edx, 12(%esp)
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuBlockIoWriteBlocks)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)
> -ASM_PFX(GasketEmuBlockIoFlushBlocks): pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> -
> - call ASM_PFX(EmuBlockIoFlushBlocks)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)
> -ASM_PFX(GasketEmuBlockIoCreateMapping):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuBlockIoCreateMapping)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)
> -ASM_PFX(GasketBlockIoThunkOpen):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuBlockIoThunkOpen)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)
> -ASM_PFX(GasketBlockIoThunkClose):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuBlockIoThunkClose)
> -
> - leave
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)
> -ASM_PFX(GasketSnpCreateMapping):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpCreateMapping)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStart)
> -ASM_PFX(GasketSnpStart):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpStart)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStop)
> -ASM_PFX(GasketSnpStop):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpStop)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpInitialize)
> -ASM_PFX(GasketSnpInitialize):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpInitialize)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpReset)
> -ASM_PFX(GasketSnpReset):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpReset)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpShutdown)
> -ASM_PFX(GasketSnpShutdown):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpShutdown)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)
> -ASM_PFX(GasketSnpReceiveFilters):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 28(%ebp), %eax
> - movl %eax, 20(%esp)
> - movl 24(%ebp), %eax
> - movl %eax, 16(%esp)
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpReceiveFilters)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)
> -ASM_PFX(GasketSnpStationAddress):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - leave
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStatistics)
> -ASM_PFX(GasketSnpStatistics):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpStatistics)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)
> -ASM_PFX(GasketSnpMCastIpToMac):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpMCastIpToMac)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpNvData)
> -ASM_PFX(GasketSnpNvData):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 24(%ebp), %eax
> - movl %eax, 16(%esp)
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpNvData)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)
> -ASM_PFX(GasketSnpGetStatus):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $40, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpGetStatus)
> -
> - leave
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpTransmit)
> -ASM_PFX(GasketSnpTransmit):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $56, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 32(%ebp), %eax
> - movl %eax, 24(%esp)
> - movl 28(%ebp), %eax
> - movl %eax, 20(%esp)
> - movl 24(%ebp), %eax
> - movl %eax, 16(%esp)
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpTransmit)
> -
> - leave
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpReceive)
> -ASM_PFX(GasketSnpReceive):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $56, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 32(%ebp), %eax
> - movl %eax, 24(%esp)
> - movl 28(%ebp), %eax
> - movl %eax, 20(%esp)
> - movl 24(%ebp), %eax
> - movl %eax, 16(%esp)
> - movl 20(%ebp), %eax
> - movl %eax, 12(%esp)
> - movl 16(%ebp), %eax
> - movl %eax, 8(%esp)
> - movl 12(%ebp), %eax
> - movl %eax, 4(%esp)
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpReceive)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)
> -ASM_PFX(GasketSnpThunkOpen):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpThunkOpen)
> -
> - leave
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)
> -ASM_PFX(GasketSnpThunkClose):
> - pushl %ebp
> - movl %esp, %ebp
> - subl $24, %esp // sub extra 16 from the stack for alignment
> - and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> - movl 8(%ebp), %eax
> - movl %eax, (%esp)
> -
> - call ASM_PFX(EmuSnpThunkClose)
> -
> - leave
> - ret
> -
> -
> +#------------------------------------------------------------------------------
> +#
> +# Manage differenced between UNIX ABI and EFI/Windows ABI
> +#
> +# For IA-32 the only difference is Mac OS X requires a 16-byte aligned stack.
> +# For Linux this stack adjustment is a no-op, but we may as well make the
> +# the code common.
> +#
> +# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> +# This program and the accompanying materials
> +# are licensed and made available under the terms and conditions of the BSD
> License
> +# which accompanies this distribution. The full text of the license may be
> found at
> +# http://opensource.org/licenses/bsd-license.php
> +#
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +#
> +#------------------------------------------------------------------------------
> +
> +
> +
> + .text
> +
> +//
> +// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)
> +//
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)
> +ASM_PFX(GasketSecWriteStdErr):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecWriteStdErr)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)
> +ASM_PFX(GasketSecConfigStdIn):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecConfigStdIn)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)
> +ASM_PFX(GasketSecWriteStdOut):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecWriteStdOut)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)
> +ASM_PFX(GasketSecReadStdIn):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecReadStdIn)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)
> +ASM_PFX(GasketSecPollStdIn):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecPollStdIn)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecMalloc)
> +ASM_PFX(GasketSecMalloc):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecMalloc)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecValloc)
> +ASM_PFX(GasketSecValloc):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecValloc)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecFree)
> +ASM_PFX(GasketSecFree):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecFree)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecSetTimer)
> +ASM_PFX(GasketSecSetTimer):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 8(%ebp), %eax
> + movl 12(%ebp), %edx
> + movl %edx, 4(%esp)
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecSetTimer)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)
> +ASM_PFX(GasketSecEnableInterrupt):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> +
> + call ASM_PFX(SecEnableInterrupt)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)
> +ASM_PFX(GasketSecDisableInterrupt):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> +
> + call ASM_PFX(SecDisableInterrupt)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)
> +ASM_PFX(GasketQueryPerformanceFrequency):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> +
> + call ASM_PFX(QueryPerformanceFrequency)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)
> +ASM_PFX(GasketQueryPerformanceCounter):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> +
> + call ASM_PFX(QueryPerformanceCounter)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecSleep)
> +ASM_PFX(GasketSecSleep):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl 12(%ebp), %ecx
> + movl %ecx, 4(%esp)
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecSleep)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)
> +ASM_PFX(GasketSecCpuSleep):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> +
> + call ASM_PFX(SecCpuSleep)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecExit)
> +ASM_PFX(GasketSecExit):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecExit) // Less to do as we will never return to EFI ABI
> world
> +LDEAD_LOOP:
> + jmp LDEAD_LOOP // _exit should never return
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecGetTime)
> +ASM_PFX(GasketSecGetTime):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecGetTime)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecSetTime)
> +ASM_PFX(GasketSecSetTime):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecSetTime)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)
> +ASM_PFX(GasketSecGetNextProtocol):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecGetNextProtocol)
> +
> + leave
> + ret
> +
> +// PPIs produced by SEC
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)
> +ASM_PFX(GasketSecPeCoffGetEntryPoint):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecPeCoffGetEntryPoint)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)
> +ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecPeCoffRelocateImageExtraAction)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)
> +ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecPeCoffUnloadImageExtraAction)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)
> +ASM_PFX(GasketSecEmuThunkAddress):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> +
> + call ASM_PFX(SecEmuThunkAddress)
> +
> + leave
> + ret
> +
> +//
> +// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
> +//
> +
> +ASM_GLOBAL ASM_PFX(GasketX11Size)
> +ASM_PFX(GasketX11Size):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(X11Size)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11CheckKey)
> +ASM_PFX(GasketX11CheckKey):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(X11CheckKey)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GetKey)
> +ASM_PFX(GasketX11GetKey):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(X11GetKey)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11KeySetState)
> +ASM_PFX(GasketX11KeySetState):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(X11KeySetState)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)
> +ASM_PFX(GasketX11RegisterKeyNotify):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(X11RegisterKeyNotify)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11Blt)
> +ASM_PFX(GasketX11Blt):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(X11Blt)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)
> +ASM_PFX(GasketX11CheckPointer):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(X11CheckPointer)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)
> +ASM_PFX(GasketX11GetPointerState):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(X11GetPointerState)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)
> +ASM_PFX(GasketX11GraphicsWindowOpen):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(X11GraphicsWindowOpen)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)
> +ASM_PFX(GasketX11GraphicsWindowClose):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(X11GraphicsWindowClose)
> +
> + leave
> + ret
> +
> +
> +// Pthreads
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)
> +ASM_PFX(GasketPthreadMutexLock):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PthreadMutexLock)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)
> +ASM_PFX(GasketPthreadMutexUnLock):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PthreadMutexUnLock)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)
> +ASM_PFX(GasketPthreadMutexTryLock):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PthreadMutexTryLock)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)
> +ASM_PFX(GasketPthreadMutexInit):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> +
> + call ASM_PFX(PthreadMutexInit)
> +
> + leave
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)
> +ASM_PFX(GasketPthreadMutexDestroy):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PthreadMutexDestroy)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadCreate)
> +ASM_PFX(GasketPthreadCreate):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PthreadCreate)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadExit)
> +ASM_PFX(GasketPthreadExit):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PthreadExit)
> +
> + leave
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadSelf)
> +ASM_PFX(GasketPthreadSelf):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> +
> + call ASM_PFX(PthreadSelf)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadOpen)
> +ASM_PFX(GasketPthreadOpen):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PthreadOpen)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadClose)
> +ASM_PFX(GasketPthreadClose):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PthreadClose)
> +
> + leave
> + ret
> +
> +
> +
> +
> +//
> +// UNIX ABI to EFI ABI call
> +//
> +// UINTN
> +// ReverseGasketUint64 (
> +// void *Api,
> +// UINTN Arg1
> +// );
> +ASM_GLOBAL ASM_PFX(ReverseGasketUint64)
> +ASM_PFX(ReverseGasketUint64):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $8, %esp
> + movl 16(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, (%esp)
> + calll *8(%ebp)
> + addl $8, %esp
> + popl %ebp
> + ret
> +
> +
> +
> +//
> +// UNIX ABI to EFI ABI call
> +//
> +// UINTN
> +// ReverseGasketUint64Uint64 (
> +// void *Api,
> +// UINTN Arg1
> +// UINTN Arg2
> +// );
> +ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)
> +ASM_PFX(ReverseGasketUint64Uint64):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp
> + movl 24(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 20(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, (%esp)
> + calll *8(%ebp)
> + addl $24, %esp
> + popl %ebp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)
> +ASM_PFX(GasketSecUnixPeiAutoScan):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecUnixPeiAutoScan)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)
> +ASM_PFX(GasketSecUnixFdAddress):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(SecUnixFdAddress)
> +
> + leave
> + ret
> +
> +
> +// EmuIoThunk SimpleFileSystem
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)
> +ASM_PFX(GasketPosixOpenVolume):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixOpenVolume)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)
> +ASM_PFX(GasketPosixFileOpen):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $56, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 28(%ebp), %eax
> + movl 32(%ebp), %ecx
> + movl %ecx, 24(%esp)
> + movl %eax, 20(%esp)
> + movl 20(%ebp), %eax
> + movl 24(%ebp), %ecx
> + movl %ecx, 16(%esp)
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileOpen)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)
> +ASM_PFX(GasketPosixFileCLose):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileCLose)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)
> +ASM_PFX(GasketPosixFileDelete):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileDelete)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileRead)
> +ASM_PFX(GasketPosixFileRead):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileRead)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)
> +ASM_PFX(GasketPosixFileWrite):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileWrite)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)
> +ASM_PFX(GasketPosixFileSetPossition):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl 16(%ebp), %ecx
> + movl %ecx, 8(%esp)
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileSetPossition)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)
> +ASM_PFX(GasketPosixFileGetPossition):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileGetPossition)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)
> +ASM_PFX(GasketPosixFileGetInfo):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileGetInfo)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)
> +ASM_PFX(GasketPosixFileSetInfo):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileSetInfo)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)
> +ASM_PFX(GasketPosixFileFlush):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileFlush)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)
> +ASM_PFX(GasketPosixFileSystmeThunkOpen):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileSystmeThunkOpen)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)
> +ASM_PFX(GasketPosixFileSystmeThunkClose):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(PosixFileSystmeThunkClose)
> +
> + leave
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)
> +ASM_PFX(GasketEmuBlockIoReset):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuBlockIoReset)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)
> +ASM_PFX(GasketEmuBlockIoReadBlocks):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $56, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 32(%ebp), %eax
> + movl %eax, 24(%esp)
> + movl 28(%ebp), %eax
> + movl %eax, 20(%esp)
> + movl 24(%ebp), %eax
> + movl %eax, 16(%esp)
> + movl 16(%ebp), %eax
> + movl 20(%ebp), %edx
> + movl %edx, 12(%esp)
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuBlockIoReadBlocks)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)
> +ASM_PFX(GasketEmuBlockIoWriteBlocks):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $56, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 32(%ebp), %eax
> + movl %eax, 24(%esp)
> + movl 28(%ebp), %eax
> + movl %eax, 20(%esp)
> + movl 24(%ebp), %eax
> + movl %eax, 16(%esp)
> + movl 16(%ebp), %eax
> + movl 20(%ebp), %edx
> + movl %edx, 12(%esp)
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuBlockIoWriteBlocks)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)
> +ASM_PFX(GasketEmuBlockIoFlushBlocks): pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> +
> + call ASM_PFX(EmuBlockIoFlushBlocks)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)
> +ASM_PFX(GasketEmuBlockIoCreateMapping):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuBlockIoCreateMapping)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)
> +ASM_PFX(GasketBlockIoThunkOpen):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuBlockIoThunkOpen)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)
> +ASM_PFX(GasketBlockIoThunkClose):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuBlockIoThunkClose)
> +
> + leave
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)
> +ASM_PFX(GasketSnpCreateMapping):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpCreateMapping)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStart)
> +ASM_PFX(GasketSnpStart):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpStart)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStop)
> +ASM_PFX(GasketSnpStop):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpStop)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpInitialize)
> +ASM_PFX(GasketSnpInitialize):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpInitialize)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpReset)
> +ASM_PFX(GasketSnpReset):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpReset)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpShutdown)
> +ASM_PFX(GasketSnpShutdown):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpShutdown)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)
> +ASM_PFX(GasketSnpReceiveFilters):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 28(%ebp), %eax
> + movl %eax, 20(%esp)
> + movl 24(%ebp), %eax
> + movl %eax, 16(%esp)
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpReceiveFilters)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)
> +ASM_PFX(GasketSnpStationAddress):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + leave
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStatistics)
> +ASM_PFX(GasketSnpStatistics):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpStatistics)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)
> +ASM_PFX(GasketSnpMCastIpToMac):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpMCastIpToMac)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpNvData)
> +ASM_PFX(GasketSnpNvData):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 24(%ebp), %eax
> + movl %eax, 16(%esp)
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpNvData)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)
> +ASM_PFX(GasketSnpGetStatus):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $40, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpGetStatus)
> +
> + leave
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpTransmit)
> +ASM_PFX(GasketSnpTransmit):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $56, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 32(%ebp), %eax
> + movl %eax, 24(%esp)
> + movl 28(%ebp), %eax
> + movl %eax, 20(%esp)
> + movl 24(%ebp), %eax
> + movl %eax, 16(%esp)
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpTransmit)
> +
> + leave
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpReceive)
> +ASM_PFX(GasketSnpReceive):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $56, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 32(%ebp), %eax
> + movl %eax, 24(%esp)
> + movl 28(%ebp), %eax
> + movl %eax, 20(%esp)
> + movl 24(%ebp), %eax
> + movl %eax, 16(%esp)
> + movl 20(%ebp), %eax
> + movl %eax, 12(%esp)
> + movl 16(%ebp), %eax
> + movl %eax, 8(%esp)
> + movl 12(%ebp), %eax
> + movl %eax, 4(%esp)
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpReceive)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)
> +ASM_PFX(GasketSnpThunkOpen):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpThunkOpen)
> +
> + leave
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)
> +ASM_PFX(GasketSnpThunkClose):
> + pushl %ebp
> + movl %esp, %ebp
> + subl $24, %esp // sub extra 16 from the stack for alignment
> + and $-16, %esp // stack needs to end in 0xFFFFFFF0 before call
> + movl 8(%ebp), %eax
> + movl %eax, (%esp)
> +
> + call ASM_PFX(EmuSnpThunkClose)
> +
> + leave
> + ret
> +
> +
> diff --git a/EmulatorPkg/Unix/Host/Ia32/SwitchStack.c
> b/EmulatorPkg/Unix/Host/Ia32/SwitchStack.c
> index 118083f4b5..79baeaf1f2 100644
> --- a/EmulatorPkg/Unix/Host/Ia32/SwitchStack.c
> +++ b/EmulatorPkg/Unix/Host/Ia32/SwitchStack.c
> @@ -1,74 +1,74 @@
> -/*++
> -
> -Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
> -Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -
> ---*/
> -
> -#include "Host.h"
> -
> -
> -/**
> - Transfers control to a function starting with a new stack.
> -
> - Transfers control to the function specified by EntryPoint using the new stack
> - specified by NewStack and passing in the parameters specified by Context1
> and
> - Context2. Context1 and Context2 are optional and may be NULL. The function
> - EntryPoint must never return.
> -
> - If EntryPoint is NULL, then ASSERT().
> - If NewStack is NULL, then ASSERT().
> -
> - @param EntryPoint A pointer to function to call with the new stack.
> - @param Context1 A pointer to the context to pass into the EntryPoint
> - function.
> - @param Context2 A pointer to the context to pass into the EntryPoint
> - function.
> - @param NewStack A pointer to the new stack to use for the EntryPoint
> - function.
> -
> -**/
> -VOID
> -EFIAPI
> -PeiSwitchStacks (
> - IN SWITCH_STACK_ENTRY_POINT EntryPoint,
> - IN VOID *Context1, OPTIONAL
> - IN VOID *Context2, OPTIONAL
> - IN VOID *NewStack
> - )
> -{
> - BASE_LIBRARY_JUMP_BUFFER JumpBuffer;
> -
> - ASSERT (EntryPoint != NULL);
> - ASSERT (NewStack != NULL);
> -
> - //
> - // Stack should be aligned with CPU_STACK_ALIGNMENT
> - //
> - ASSERT (((UINTN)NewStack & (CPU_STACK_ALIGNMENT - 1)) == 0);
> -
> - JumpBuffer.Eip = (UINTN)EntryPoint;
> - JumpBuffer.Esp = (UINTN)NewStack - sizeof (VOID*);
> - JumpBuffer.Esp -= sizeof (Context1) + sizeof (Context2);
> - ((VOID**)JumpBuffer.Esp)[1] = Context1;
> - ((VOID**)JumpBuffer.Esp)[2] = Context2;
> -
> - LongJump (&JumpBuffer, (UINTN)-1);
> -
> -
> - //
> - // PeiSwitchStacks () will never return
> - //
> - ASSERT (FALSE);
> -}
> -
> -
> -
> +/*++
> +
> +Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
> +Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +
> +--*/
> +
> +#include "Host.h"
> +
> +
> +/**
> + Transfers control to a function starting with a new stack.
> +
> + Transfers control to the function specified by EntryPoint using the new stack
> + specified by NewStack and passing in the parameters specified by Context1
> and
> + Context2. Context1 and Context2 are optional and may be NULL. The
> function
> + EntryPoint must never return.
> +
> + If EntryPoint is NULL, then ASSERT().
> + If NewStack is NULL, then ASSERT().
> +
> + @param EntryPoint A pointer to function to call with the new stack.
> + @param Context1 A pointer to the context to pass into the EntryPoint
> + function.
> + @param Context2 A pointer to the context to pass into the EntryPoint
> + function.
> + @param NewStack A pointer to the new stack to use for the EntryPoint
> + function.
> +
> +**/
> +VOID
> +EFIAPI
> +PeiSwitchStacks (
> + IN SWITCH_STACK_ENTRY_POINT EntryPoint,
> + IN VOID *Context1, OPTIONAL
> + IN VOID *Context2, OPTIONAL
> + IN VOID *NewStack
> + )
> +{
> + BASE_LIBRARY_JUMP_BUFFER JumpBuffer;
> +
> + ASSERT (EntryPoint != NULL);
> + ASSERT (NewStack != NULL);
> +
> + //
> + // Stack should be aligned with CPU_STACK_ALIGNMENT
> + //
> + ASSERT (((UINTN)NewStack & (CPU_STACK_ALIGNMENT - 1)) == 0);
> +
> + JumpBuffer.Eip = (UINTN)EntryPoint;
> + JumpBuffer.Esp = (UINTN)NewStack - sizeof (VOID*);
> + JumpBuffer.Esp -= sizeof (Context1) + sizeof (Context2);
> + ((VOID**)JumpBuffer.Esp)[1] = Context1;
> + ((VOID**)JumpBuffer.Esp)[2] = Context2;
> +
> + LongJump (&JumpBuffer, (UINTN)-1);
> +
> +
> + //
> + // PeiSwitchStacks () will never return
> + //
> + ASSERT (FALSE);
> +}
> +
> +
> +
> diff --git a/EmulatorPkg/Unix/Host/MemoryAllocationLib.c
> b/EmulatorPkg/Unix/Host/MemoryAllocationLib.c
> index 9db91b83d9..df39358e2a 100644
> --- a/EmulatorPkg/Unix/Host/MemoryAllocationLib.c
> +++ b/EmulatorPkg/Unix/Host/MemoryAllocationLib.c
> @@ -1,145 +1,145 @@
> -/*++ @file
> -
> - Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
> -
> - This program and the accompanying materials
> - are licensed and made available under the terms and conditions of the BSD
> License
> - which accompanies this distribution. The full text of the license may be found
> at
> - http://opensource.org/licenses/bsd-license.php
> -
> - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> -
> -**/
> -
> -#include "Base.h"
> -#include "Library/BaseMemoryLib.h"
> -#include "Library/MemoryAllocationLib.h"
> -
> -#include <stdlib.h>
> -
> -/**
> - Allocates a buffer of type EfiBootServicesData.
> -
> - Allocates the number bytes specified by AllocationSize of type
> EfiBootServicesData and returns a
> - pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0
> size is
> - returned. If there is not enough memory remaining to satisfy the request,
> then NULL is returned.
> -
> - @param AllocationSize The number of bytes to allocate.
> -
> - @return A pointer to the allocated buffer or NULL if allocation fails.
> -
> -**/
> -VOID *
> -EFIAPI
> -AllocatePool (
> - IN UINTN AllocationSize
> - )
> -{
> - return (VOID*) malloc (AllocationSize);
> -}
> -
> -
> -/**
> - Allocates and zeros a buffer of type EfiBootServicesData.
> -
> - Allocates the number bytes specified by AllocationSize of type
> EfiBootServicesData, clears the
> - buffer with zeros, and returns a pointer to the allocated buffer. If
> AllocationSize is 0, then a
> - valid buffer of 0 size is returned. If there is not enough memory remaining to
> satisfy the
> - request, then NULL is returned.
> -
> - @param AllocationSize The number of bytes to allocate and zero.
> -
> - @return A pointer to the allocated buffer or NULL if allocation fails.
> -
> -**/
> -VOID *
> -EFIAPI
> -AllocateZeroPool (
> - IN UINTN AllocationSize
> - )
> -{
> - VOID *Buffer;
> -
> - Buffer = AllocatePool (AllocationSize);
> - if (Buffer == NULL) {
> - return NULL;
> - }
> -
> - ZeroMem (Buffer, AllocationSize);
> -
> - return Buffer;
> -}
> -
> -
> -/**
> - Reallocates a buffer of type EfiBootServicesData.
> -
> - Allocates and zeros the number bytes specified by NewSize from memory of
> type
> - EfiBootServicesData. If OldBuffer is not NULL, then the smaller of OldSize
> and
> - NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
> - OldBuffer is freed. A pointer to the newly allocated buffer is returned.
> - If NewSize is 0, then a valid buffer of 0 size is returned. If there is not
> - enough memory remaining to satisfy the request, then NULL is returned.
> -
> - If the allocation of the new buffer is successful and the smaller of NewSize
> and OldSize
> - is greater than (MAX_ADDRESS - OldBuffer + 1), then ASSERT().
> -
> - @param OldSize The size, in bytes, of OldBuffer.
> - @param NewSize The size, in bytes, of the buffer to reallocate.
> - @param OldBuffer The buffer to copy to the allocated buffer. This is an
> optional
> - parameter that may be NULL.
> -
> - @return A pointer to the allocated buffer or NULL if allocation fails.
> -
> -**/
> -VOID *
> -EFIAPI
> -ReallocatePool (
> - IN UINTN OldSize,
> - IN UINTN NewSize,
> - IN VOID *OldBuffer OPTIONAL
> - )
> -{
> - VOID *NewBuffer;
> -
> - NewBuffer = AllocatePool (NewSize);
> - if (NewBuffer == NULL) {
> - return NULL;
> - }
> -
> - if (OldBuffer != NULL) {
> - if (OldSize > 0) {
> - CopyMem (NewBuffer, OldBuffer, OldSize);
> - }
> -
> - FreePool (OldBuffer);
> - }
> -
> - return NewBuffer;
> -}
> -
> -
> -/**
> - Frees a buffer that was previously allocated with one of the pool allocation
> functions in the
> - Memory Allocation Library.
> -
> - Frees the buffer specified by Buffer. Buffer must have been allocated on a
> previous call to the
> - pool allocation services of the Memory Allocation Library. If it is not possible
> to free pool
> - resources, then this function will perform no actions.
> -
> - If Buffer was not allocated with a pool allocation function in the Memory
> Allocation Library,
> - then ASSERT().
> -
> - @param Buffer Pointer to the buffer to free.
> -
> -**/
> -VOID
> -EFIAPI
> -FreePool (
> - IN VOID *Buffer
> - )
> -{
> - free ((void *) Buffer);
> -}
> -
> +/*++ @file
> +
> + Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
> +
> + This program and the accompanying materials
> + are licensed and made available under the terms and conditions of the BSD
> License
> + which accompanies this distribution. The full text of the license may be
> found at
> + http://opensource.org/licenses/bsd-license.php
> +
> + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +
> +**/
> +
> +#include "Base.h"
> +#include "Library/BaseMemoryLib.h"
> +#include "Library/MemoryAllocationLib.h"
> +
> +#include <stdlib.h>
> +
> +/**
> + Allocates a buffer of type EfiBootServicesData.
> +
> + Allocates the number bytes specified by AllocationSize of type
> EfiBootServicesData and returns a
> + pointer to the allocated buffer. If AllocationSize is 0, then a valid buffer of 0
> size is
> + returned. If there is not enough memory remaining to satisfy the request,
> then NULL is returned.
> +
> + @param AllocationSize The number of bytes to allocate.
> +
> + @return A pointer to the allocated buffer or NULL if allocation fails.
> +
> +**/
> +VOID *
> +EFIAPI
> +AllocatePool (
> + IN UINTN AllocationSize
> + )
> +{
> + return (VOID*) malloc (AllocationSize);
> +}
> +
> +
> +/**
> + Allocates and zeros a buffer of type EfiBootServicesData.
> +
> + Allocates the number bytes specified by AllocationSize of type
> EfiBootServicesData, clears the
> + buffer with zeros, and returns a pointer to the allocated buffer. If
> AllocationSize is 0, then a
> + valid buffer of 0 size is returned. If there is not enough memory remaining
> to satisfy the
> + request, then NULL is returned.
> +
> + @param AllocationSize The number of bytes to allocate and zero.
> +
> + @return A pointer to the allocated buffer or NULL if allocation fails.
> +
> +**/
> +VOID *
> +EFIAPI
> +AllocateZeroPool (
> + IN UINTN AllocationSize
> + )
> +{
> + VOID *Buffer;
> +
> + Buffer = AllocatePool (AllocationSize);
> + if (Buffer == NULL) {
> + return NULL;
> + }
> +
> + ZeroMem (Buffer, AllocationSize);
> +
> + return Buffer;
> +}
> +
> +
> +/**
> + Reallocates a buffer of type EfiBootServicesData.
> +
> + Allocates and zeros the number bytes specified by NewSize from memory of
> type
> + EfiBootServicesData. If OldBuffer is not NULL, then the smaller of OldSize
> and
> + NewSize bytes are copied from OldBuffer to the newly allocated buffer, and
> + OldBuffer is freed. A pointer to the newly allocated buffer is returned.
> + If NewSize is 0, then a valid buffer of 0 size is returned. If there is not
> + enough memory remaining to satisfy the request, then NULL is returned.
> +
> + If the allocation of the new buffer is successful and the smaller of NewSize
> and OldSize
> + is greater than (MAX_ADDRESS - OldBuffer + 1), then ASSERT().
> +
> + @param OldSize The size, in bytes, of OldBuffer.
> + @param NewSize The size, in bytes, of the buffer to reallocate.
> + @param OldBuffer The buffer to copy to the allocated buffer. This is an
> optional
> + parameter that may be NULL.
> +
> + @return A pointer to the allocated buffer or NULL if allocation fails.
> +
> +**/
> +VOID *
> +EFIAPI
> +ReallocatePool (
> + IN UINTN OldSize,
> + IN UINTN NewSize,
> + IN VOID *OldBuffer OPTIONAL
> + )
> +{
> + VOID *NewBuffer;
> +
> + NewBuffer = AllocatePool (NewSize);
> + if (NewBuffer == NULL) {
> + return NULL;
> + }
> +
> + if (OldBuffer != NULL) {
> + if (OldSize > 0) {
> + CopyMem (NewBuffer, OldBuffer, OldSize);
> + }
> +
> + FreePool (OldBuffer);
> + }
> +
> + return NewBuffer;
> +}
> +
> +
> +/**
> + Frees a buffer that was previously allocated with one of the pool allocation
> functions in the
> + Memory Allocation Library.
> +
> + Frees the buffer specified by Buffer. Buffer must have been allocated on a
> previous call to the
> + pool allocation services of the Memory Allocation Library. If it is not possible
> to free pool
> + resources, then this function will perform no actions.
> +
> + If Buffer was not allocated with a pool allocation function in the Memory
> Allocation Library,
> + then ASSERT().
> +
> + @param Buffer Pointer to the buffer to free.
> +
> +**/
> +VOID
> +EFIAPI
> +FreePool (
> + IN VOID *Buffer
> + )
> +{
> + free ((void *) Buffer);
> +}
> +
> diff --git a/EmulatorPkg/Unix/Host/PosixFileSystem.c
> b/EmulatorPkg/Unix/Host/PosixFileSystem.c
> index 98e8c894eb..529543d6eb 100644
> --- a/EmulatorPkg/Unix/Host/PosixFileSystem.c
> +++ b/EmulatorPkg/Unix/Host/PosixFileSystem.c
> @@ -1,1556 +1,1556 @@
> -/*++ @file
> - POSIX Pthreads to emulate APs and implement threads
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -
> -**/
> -
> -#include "Host.h"
> -
> -
> -#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE SIGNATURE_32 ('E',
> 'P', 'f', 's')
> -
> -typedef struct {
> - UINTN Signature;
> - EMU_IO_THUNK_PROTOCOL *Thunk;
> - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL SimpleFileSystem;
> - CHAR8 *FilePath;
> - CHAR16 *VolumeLabel;
> - BOOLEAN FileHandlesOpen;
> -} EMU_SIMPLE_FILE_SYSTEM_PRIVATE;
> -
> -#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS(a) \
> - CR (a, \
> - EMU_SIMPLE_FILE_SYSTEM_PRIVATE, \
> - SimpleFileSystem, \
> - EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE \
> - )
> -
> -
> -#define EMU_EFI_FILE_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'P', 'f', 'i')
> -
> -typedef struct {
> - UINTN Signature;
> - EMU_IO_THUNK_PROTOCOL *Thunk;
> - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;
> - EFI_FILE_PROTOCOL EfiFile;
> - int fd;
> - DIR *Dir;
> - BOOLEAN IsRootDirectory;
> - BOOLEAN IsDirectoryPath;
> - BOOLEAN IsOpenedByRead;
> - char *FileName;
> - struct dirent *Dirent;
> -} EMU_EFI_FILE_PRIVATE;
> -
> -#define EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS(a) \
> - CR (a, \
> - EMU_EFI_FILE_PRIVATE, \
> - EfiFile, \
> - EMU_EFI_FILE_PRIVATE_SIGNATURE \
> - )
> -
> -EFI_STATUS
> -PosixFileGetInfo (
> - IN EFI_FILE_PROTOCOL *This,
> - IN EFI_GUID *InformationType,
> - IN OUT UINTN *BufferSize,
> - OUT VOID *Buffer
> - );
> -
> -EFI_STATUS
> -PosixFileSetInfo (
> - IN EFI_FILE_PROTOCOL *This,
> - IN EFI_GUID *InformationType,
> - IN UINTN BufferSize,
> - IN VOID *Buffer
> - );
> -
> -
> -EFI_FILE_PROTOCOL gPosixFileProtocol = {
> - EFI_FILE_REVISION,
> - GasketPosixFileOpen,
> - GasketPosixFileCLose,
> - GasketPosixFileDelete,
> - GasketPosixFileRead,
> - GasketPosixFileWrite,
> - GasketPosixFileGetPossition,
> - GasketPosixFileSetPossition,
> - GasketPosixFileGetInfo,
> - GasketPosixFileSetInfo,
> - GasketPosixFileFlush
> -};
> -
> -EFI_SIMPLE_FILE_SYSTEM_PROTOCOL gPosixFileSystemProtocol = {
> - EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION,
> - GasketPosixOpenVolume,
> -};
> -
> -
> -/**
> - Open the root directory on a volume.
> -
> - @param This Protocol instance pointer.
> - @param Root Returns an Open file handle for the root directory
> -
> - @retval EFI_SUCCESS The device was opened.
> - @retval EFI_UNSUPPORTED This volume does not support the file system.
> - @retval EFI_NO_MEDIA The device has no media.
> - @retval EFI_DEVICE_ERROR The device reported an error.
> - @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> - @retval EFI_ACCESS_DENIED The service denied access to the file.
> - @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of
> resources.
> -
> -**/
> -EFI_STATUS
> -PosixOpenVolume (
> - IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
> - OUT EFI_FILE_PROTOCOL **Root
> - )
> -{
> - EFI_STATUS Status;
> - EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
> - EMU_EFI_FILE_PRIVATE *PrivateFile;
> -
> - Private = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (This);
> -
> - Status = EFI_OUT_OF_RESOURCES;
> - PrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));
> - if (PrivateFile == NULL) {
> - goto Done;
> - }
> -
> - PrivateFile->FileName = malloc (AsciiStrSize (Private->FilePath));
> - if (PrivateFile->FileName == NULL) {
> - goto Done;
> - }
> - AsciiStrCpy (PrivateFile->FileName, Private->FilePath);
> -
> - PrivateFile->Signature = EMU_EFI_FILE_PRIVATE_SIGNATURE;
> - PrivateFile->Thunk = Private->Thunk;
> - PrivateFile->SimpleFileSystem = This;
> - PrivateFile->IsRootDirectory = TRUE;
> - PrivateFile->IsDirectoryPath = TRUE;
> - PrivateFile->IsOpenedByRead = TRUE;
> -
> - CopyMem (&PrivateFile->EfiFile, &gPosixFileProtocol, sizeof
> (EFI_FILE_PROTOCOL));
> -
> - PrivateFile->fd = -1;
> - PrivateFile->Dir = NULL;
> - PrivateFile->Dirent = NULL;
> -
> - *Root = &PrivateFile->EfiFile;
> -
> - PrivateFile->Dir = opendir (PrivateFile->FileName);
> - if (PrivateFile->Dir == NULL) {
> - Status = EFI_ACCESS_DENIED;
> - } else {
> - Status = EFI_SUCCESS;
> - }
> -
> -Done:
> - if (EFI_ERROR (Status)) {
> - if (PrivateFile != NULL) {
> - if (PrivateFile->FileName != NULL) {
> - free (PrivateFile->FileName);
> - }
> -
> - free (PrivateFile);
> - }
> -
> - *Root = NULL;
> - }
> -
> - return Status;
> -}
> -
> -
> -EFI_STATUS
> -ErrnoToEfiStatus ()
> -{
> - switch (errno) {
> - case EACCES:
> - return EFI_ACCESS_DENIED;
> -
> - case EDQUOT:
> - case ENOSPC:
> - return EFI_VOLUME_FULL;
> -
> - default:
> - return EFI_DEVICE_ERROR;
> - }
> -}
> -
> -VOID
> -CutPrefix (
> - IN CHAR8 *Str,
> - IN UINTN Count
> - )
> -{
> - CHAR8 *Pointer;
> -
> - if (AsciiStrLen (Str) < Count) {
> - ASSERT (0);
> - }
> -
> - for (Pointer = Str; *(Pointer + Count); Pointer++) {
> - *Pointer = *(Pointer + Count);
> - }
> -
> - *Pointer = *(Pointer + Count);
> -}
> -
> -
> -VOID
> -PosixSystemTimeToEfiTime (
> - IN time_t SystemTime,
> - OUT EFI_TIME *Time
> - )
> -{
> - struct tm *tm;
> -
> - tm = gmtime (&SystemTime);
> - Time->Year = tm->tm_year;
> - Time->Month = tm->tm_mon + 1;
> - Time->Day = tm->tm_mday;
> - Time->Hour = tm->tm_hour;
> - Time->Minute = tm->tm_min;
> - Time->Second = tm->tm_sec;
> - Time->Nanosecond = 0;
> -
> - Time->TimeZone = timezone;
> - Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0) | (tm-
> >tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
> -}
> -
> -
> -EFI_STATUS
> -UnixSimpleFileSystemFileInfo (
> - EMU_EFI_FILE_PRIVATE *PrivateFile,
> - IN CHAR8 *FileName,
> - IN OUT UINTN *BufferSize,
> - OUT VOID *Buffer
> - )
> -{
> - EFI_STATUS Status;
> - UINTN Size;
> - UINTN NameSize;
> - UINTN ResultSize;
> - EFI_FILE_INFO *Info;
> - CHAR8 *RealFileName;
> - CHAR8 *TempPointer;
> - CHAR16 *BufferFileName;
> - struct stat buf;
> -
> - if (FileName != NULL) {
> - RealFileName = FileName;
> - } else if (PrivateFile->IsRootDirectory) {
> - RealFileName = "";
> - } else {
> - RealFileName = PrivateFile->FileName;
> - }
> -
> - TempPointer = RealFileName;
> - while (*TempPointer) {
> - if (*TempPointer == '/') {
> - RealFileName = TempPointer + 1;
> - }
> -
> - TempPointer++;
> - }
> -
> - Size = SIZE_OF_EFI_FILE_INFO;
> - NameSize = AsciiStrSize (RealFileName) * 2;
> - ResultSize = Size + NameSize;
> -
> - if (*BufferSize < ResultSize) {
> - *BufferSize = ResultSize;
> - return EFI_BUFFER_TOO_SMALL;
> - }
> - if (stat (FileName == NULL ? PrivateFile->FileName : FileName, &buf) < 0) {
> - return EFI_DEVICE_ERROR;
> - }
> -
> - Status = EFI_SUCCESS;
> -
> - Info = Buffer;
> - ZeroMem (Info, ResultSize);
> -
> - Info->Size = ResultSize;
> - Info->FileSize = buf.st_size;
> - Info->PhysicalSize = MultU64x32 (buf.st_blocks, buf.st_blksize);
> -
> - PosixSystemTimeToEfiTime (buf.st_ctime, &Info->CreateTime);
> - PosixSystemTimeToEfiTime (buf.st_atime, &Info->LastAccessTime);
> - PosixSystemTimeToEfiTime (buf.st_mtime, &Info->ModificationTime);
> -
> - if (!(buf.st_mode & S_IWUSR)) {
> - Info->Attribute |= EFI_FILE_READ_ONLY;
> - }
> -
> - if (S_ISDIR(buf.st_mode)) {
> - Info->Attribute |= EFI_FILE_DIRECTORY;
> - }
> -
> -
> - BufferFileName = (CHAR16 *)((CHAR8 *) Buffer + Size);
> - while (*RealFileName) {
> - *BufferFileName++ = *RealFileName++;
> - }
> - *BufferFileName = 0;
> -
> - *BufferSize = ResultSize;
> - return Status;
> -}
> -
> -BOOLEAN
> -IsZero (
> - IN VOID *Buffer,
> - IN UINTN Length
> - )
> -{
> - if (Buffer == NULL || Length == 0) {
> - return FALSE;
> - }
> -
> - if (*(UINT8 *) Buffer != 0) {
> - return FALSE;
> - }
> -
> - if (Length > 1) {
> - if (!CompareMem (Buffer, (UINT8 *) Buffer + 1, Length - 1)) {
> - return FALSE;
> - }
> - }
> -
> - return TRUE;
> -}
> -
> -
> -
> -/**
> - Opens a new file relative to the source file's location.
> -
> - @param This The protocol instance pointer.
> - @param NewHandle Returns File Handle for FileName.
> - @param FileName Null terminated string. "\", ".", and ".." are supported.
> - @param OpenMode Open mode for file.
> - @param Attributes Only used for EFI_FILE_MODE_CREATE.
> -
> - @retval EFI_SUCCESS The device was opened.
> - @retval EFI_NOT_FOUND The specified file could not be found on the
> device.
> - @retval EFI_NO_MEDIA The device has no media.
> - @retval EFI_MEDIA_CHANGED The media has changed.
> - @retval EFI_DEVICE_ERROR The device reported an error.
> - @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> - @retval EFI_ACCESS_DENIED The service denied access to the file.
> - @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of
> resources.
> - @retval EFI_VOLUME_FULL The volume is full.
> -
> -**/
> -EFI_STATUS
> -PosixFileOpen (
> - IN EFI_FILE_PROTOCOL *This,
> - OUT EFI_FILE_PROTOCOL **NewHandle,
> - IN CHAR16 *FileName,
> - IN UINT64 OpenMode,
> - IN UINT64 Attributes
> - )
> -{
> - EFI_FILE_PROTOCOL *Root;
> - EMU_EFI_FILE_PRIVATE *PrivateFile;
> - EMU_EFI_FILE_PRIVATE *NewPrivateFile;
> - EMU_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;
> - EFI_STATUS Status;
> - CHAR16 *Src;
> - char *Dst;
> - CHAR8 *RealFileName;
> - char *ParseFileName;
> - char *GuardPointer;
> - CHAR8 TempChar;
> - UINTN Count;
> - BOOLEAN TrailingDash;
> - BOOLEAN LoopFinish;
> - UINTN InfoSize;
> - EFI_FILE_INFO *Info;
> - struct stat finfo;
> - int res;
> -
> -
> - PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> - PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS
> (PrivateFile->SimpleFileSystem);
> - NewPrivateFile = NULL;
> - Status = EFI_OUT_OF_RESOURCES;
> -
> - //
> - // BUGBUG: assume an open of root
> - // if current location, return current data
> - //
> - TrailingDash = FALSE;
> - if ((StrCmp (FileName, L"\\") == 0) ||
> - (StrCmp (FileName, L".") == 0 && PrivateFile->IsRootDirectory)) {
> -OpenRoot:
> - Status = PosixOpenVolume (PrivateFile->SimpleFileSystem, &Root);
> - NewPrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (Root);
> - goto Done;
> - }
> -
> - if (FileName[StrLen (FileName) - 1] == L'\\') {
> - TrailingDash = TRUE;
> - FileName[StrLen (FileName) - 1] = 0;
> - }
> -
> - //
> - // Attempt to open the file
> - //
> - NewPrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));
> - if (NewPrivateFile == NULL) {
> - goto Done;
> - }
> -
> - CopyMem (NewPrivateFile, PrivateFile, sizeof (EMU_EFI_FILE_PRIVATE));
> -
> - NewPrivateFile->FileName = malloc (AsciiStrSize (PrivateFile->FileName) + 1
> + StrLen (FileName) + 1);
> - if (NewPrivateFile->FileName == NULL) {
> - goto Done;
> - }
> -
> - if (*FileName == L'\\') {
> - AsciiStrCpy (NewPrivateFile->FileName, PrivateRoot->FilePath);
> - // Skip first '\'.
> - Src = FileName + 1;
> - } else {
> - AsciiStrCpy (NewPrivateFile->FileName, PrivateFile->FileName);
> - Src = FileName;
> - }
> - Dst = NewPrivateFile->FileName + AsciiStrLen (NewPrivateFile->FileName);
> - GuardPointer = NewPrivateFile->FileName + AsciiStrLen (PrivateRoot-
> >FilePath);
> - *Dst++ = '/';
> - // Convert unicode to ascii and '\' to '/'
> - while (*Src) {
> - if (*Src == '\\') {
> - *Dst++ = '/';
> - } else {
> - *Dst++ = *Src;
> - }
> - Src++;
> - }
> - *Dst = 0;
> -
> -
> - //
> - // Get rid of . and .., except leading . or ..
> - //
> -
> - //
> - // GuardPointer protect simplefilesystem root path not be destroyed
> - //
> -
> - LoopFinish = FALSE;
> - while (!LoopFinish) {
> - LoopFinish = TRUE;
> -
> - for (ParseFileName = GuardPointer; *ParseFileName; ParseFileName++) {
> - if (*ParseFileName == '.' &&
> - (*(ParseFileName + 1) == 0 || *(ParseFileName + 1) == '/') &&
> - *(ParseFileName - 1) == '/'
> - ) {
> -
> - //
> - // cut /.
> - //
> - CutPrefix (ParseFileName - 1, 2);
> - LoopFinish = FALSE;
> - break;
> - }
> -
> - if (*ParseFileName == '.' &&
> - *(ParseFileName + 1) == '.' &&
> - (*(ParseFileName + 2) == 0 || *(ParseFileName + 2) == '/') &&
> - *(ParseFileName - 1) == '/'
> - ) {
> -
> - ParseFileName--;
> - Count = 3;
> -
> - while (ParseFileName != GuardPointer) {
> - ParseFileName--;
> - Count++;
> - if (*ParseFileName == '/') {
> - break;
> - }
> - }
> -
> - //
> - // cut /.. and its left directory
> - //
> - CutPrefix (ParseFileName, Count);
> - LoopFinish = FALSE;
> - break;
> - }
> - }
> - }
> -
> - if (AsciiStrCmp (NewPrivateFile->FileName, PrivateRoot->FilePath) == 0) {
> - NewPrivateFile->IsRootDirectory = TRUE;
> - free (NewPrivateFile->FileName);
> - free (NewPrivateFile);
> - goto OpenRoot;
> - }
> -
> - RealFileName = NewPrivateFile->FileName + AsciiStrLen(NewPrivateFile-
> >FileName) - 1;
> - while (RealFileName > NewPrivateFile->FileName && *RealFileName != '/') {
> - RealFileName--;
> - }
> -
> - TempChar = *(RealFileName - 1);
> - *(RealFileName - 1) = 0;
> - *(RealFileName - 1) = TempChar;
> -
> -
> - //
> - // Test whether file or directory
> - //
> - NewPrivateFile->IsRootDirectory = FALSE;
> - NewPrivateFile->fd = -1;
> - NewPrivateFile->Dir = NULL;
> - if (OpenMode & EFI_FILE_MODE_CREATE) {
> - if (Attributes & EFI_FILE_DIRECTORY) {
> - NewPrivateFile->IsDirectoryPath = TRUE;
> - } else {
> - NewPrivateFile->IsDirectoryPath = FALSE;
> - }
> - } else {
> - res = stat (NewPrivateFile->FileName, &finfo);
> - if (res == 0 && S_ISDIR(finfo.st_mode)) {
> - NewPrivateFile->IsDirectoryPath = TRUE;
> - } else {
> - NewPrivateFile->IsDirectoryPath = FALSE;
> - }
> - }
> -
> - if (OpenMode & EFI_FILE_MODE_WRITE) {
> - NewPrivateFile->IsOpenedByRead = FALSE;
> - } else {
> - NewPrivateFile->IsOpenedByRead = TRUE;
> - }
> -
> - Status = EFI_SUCCESS;
> -
> - //
> - // deal with directory
> - //
> - if (NewPrivateFile->IsDirectoryPath) {
> - if ((OpenMode & EFI_FILE_MODE_CREATE)) {
> - //
> - // Create a directory
> - //
> - if (mkdir (NewPrivateFile->FileName, 0777) != 0) {
> - if (errno != EEXIST) {
> - //free (TempFileName);
> - Status = EFI_ACCESS_DENIED;
> - goto Done;
> - }
> - }
> - }
> -
> - NewPrivateFile->Dir = opendir (NewPrivateFile->FileName);
> - if (NewPrivateFile->Dir == NULL) {
> - if (errno == EACCES) {
> - Status = EFI_ACCESS_DENIED;
> - } else {
> - Status = EFI_NOT_FOUND;
> - }
> -
> - goto Done;
> - }
> -
> - } else {
> - //
> - // deal with file
> - //
> - NewPrivateFile->fd = open (
> - NewPrivateFile->FileName,
> - ((OpenMode & EFI_FILE_MODE_CREATE) ? O_CREAT : 0) |
> (NewPrivateFile->IsOpenedByRead ? O_RDONLY : O_RDWR),
> - 0666
> - );
> - if (NewPrivateFile->fd < 0) {
> - if (errno == ENOENT) {
> - Status = EFI_NOT_FOUND;
> - } else {
> - Status = EFI_ACCESS_DENIED;
> - }
> - }
> - }
> -
> - if ((OpenMode & EFI_FILE_MODE_CREATE) && Status == EFI_SUCCESS) {
> - //
> - // Set the attribute
> - //
> - InfoSize = 0;
> - Info = NULL;
> - Status = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid,
> &InfoSize, Info);
> - if (Status != EFI_BUFFER_TOO_SMALL) {
> - Status = EFI_DEVICE_ERROR;
> - goto Done;
> - }
> -
> - Info = malloc (InfoSize);
> - if (Info == NULL) {
> - goto Done;
> - }
> -
> - Status = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid,
> &InfoSize, Info);
> - if (EFI_ERROR (Status)) {
> - goto Done;
> - }
> -
> - Info->Attribute = Attributes;
> - PosixFileSetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, InfoSize, Info);
> -
> - free (Info);
> - }
> -
> -Done: ;
> - if (TrailingDash) {
> - FileName[StrLen (FileName) + 1] = 0;
> - FileName[StrLen (FileName)] = L'\\';
> - }
> -
> - if (EFI_ERROR (Status)) {
> - if (NewPrivateFile) {
> - if (NewPrivateFile->FileName) {
> - free (NewPrivateFile->FileName);
> - }
> -
> - free (NewPrivateFile);
> - }
> - } else {
> - *NewHandle = &NewPrivateFile->EfiFile;
> - }
> -
> - return Status;
> -}
> -
> -
> -
> -/**
> - Close the file handle
> -
> - @param This Protocol instance pointer.
> -
> - @retval EFI_SUCCESS The device was opened.
> -
> -**/
> -EFI_STATUS
> -PosixFileCLose (
> - IN EFI_FILE_PROTOCOL *This
> - )
> -{
> - EMU_EFI_FILE_PRIVATE *PrivateFile;
> -
> - PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> -
> - if (PrivateFile->fd >= 0) {
> - close (PrivateFile->fd);
> - }
> - if (PrivateFile->Dir != NULL) {
> - closedir (PrivateFile->Dir);
> - }
> -
> - PrivateFile->fd = -1;
> - PrivateFile->Dir = NULL;
> -
> - if (PrivateFile->FileName) {
> - free (PrivateFile->FileName);
> - }
> -
> - free (PrivateFile);
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -/**
> - Close and delete the file handle.
> -
> - @param This Protocol instance pointer.
> -
> - @retval EFI_SUCCESS The device was opened.
> - @retval EFI_WARN_DELETE_FAILURE The handle was closed but the file was
> not deleted.
> -
> -**/
> -EFI_STATUS
> -PosixFileDelete (
> - IN EFI_FILE_PROTOCOL *This
> - )
> -{
> - EFI_STATUS Status;
> - EMU_EFI_FILE_PRIVATE *PrivateFile;
> -
> - PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> - Status = EFI_WARN_DELETE_FAILURE;
> -
> - if (PrivateFile->IsDirectoryPath) {
> - if (PrivateFile->Dir != NULL) {
> - closedir (PrivateFile->Dir);
> - PrivateFile->Dir = NULL;
> - }
> -
> - if (rmdir (PrivateFile->FileName) == 0) {
> - Status = EFI_SUCCESS;
> - }
> - } else {
> - close (PrivateFile->fd);
> - PrivateFile->fd = -1;
> -
> - if (!PrivateFile->IsOpenedByRead) {
> - if (!unlink (PrivateFile->FileName)) {
> - Status = EFI_SUCCESS;
> - }
> - }
> - }
> -
> - free (PrivateFile->FileName);
> - free (PrivateFile);
> -
> - return Status;
> -}
> -
> -
> -/**
> - Read data from the file.
> -
> - @param This Protocol instance pointer.
> - @param BufferSize On input size of buffer, on output amount of data in
> buffer.
> - @param Buffer The buffer in which data is read.
> -
> - @retval EFI_SUCCESS Data was read.
> - @retval EFI_NO_MEDIA The device has no media.
> - @retval EFI_DEVICE_ERROR The device reported an error.
> - @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> - @retval EFI_BUFFER_TO_SMALL BufferSize is too small. BufferSize contains
> required size.
> -
> -**/
> -EFI_STATUS
> -PosixFileRead (
> - IN EFI_FILE_PROTOCOL *This,
> - IN OUT UINTN *BufferSize,
> - OUT VOID *Buffer
> - )
> -{
> - EMU_EFI_FILE_PRIVATE *PrivateFile;
> - EFI_STATUS Status;
> - int Res;
> - UINTN Size;
> - UINTN NameSize;
> - UINTN ResultSize;
> - CHAR8 *FullFileName;
> -
> -
> - PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> -
> - if (!PrivateFile->IsDirectoryPath) {
> - if (PrivateFile->fd < 0) {
> - Status = EFI_DEVICE_ERROR;
> - goto Done;
> - }
> -
> - Res = read (PrivateFile->fd, Buffer, *BufferSize);
> - if (Res < 0) {
> - Status = EFI_DEVICE_ERROR;
> - goto Done;
> - }
> - *BufferSize = Res;
> - Status = EFI_SUCCESS;
> - goto Done;
> - }
> -
> - //
> - // Read on a directory.
> - //
> - if (PrivateFile->Dir == NULL) {
> - Status = EFI_DEVICE_ERROR;
> - goto Done;
> - }
> -
> - if (PrivateFile->Dirent == NULL) {
> - PrivateFile->Dirent = readdir (PrivateFile->Dir);
> - if (PrivateFile->Dirent == NULL) {
> - *BufferSize = 0;
> - Status = EFI_SUCCESS;
> - goto Done;
> - }
> - }
> -
> - Size = SIZE_OF_EFI_FILE_INFO;
> - NameSize = AsciiStrLen (PrivateFile->Dirent->d_name) + 1;
> - ResultSize = Size + 2 * NameSize;
> -
> - if (*BufferSize < ResultSize) {
> - *BufferSize = ResultSize;
> - Status = EFI_BUFFER_TOO_SMALL;
> - goto Done;
> - }
> - Status = EFI_SUCCESS;
> -
> - *BufferSize = ResultSize;
> -
> - FullFileName = malloc (AsciiStrLen(PrivateFile->FileName) + 1 + NameSize);
> - if (FullFileName == NULL) {
> - Status = EFI_OUT_OF_RESOURCES;
> - goto Done;
> - }
> -
> - AsciiStrCpy (FullFileName, PrivateFile->FileName);
> - AsciiStrCat (FullFileName, "/");
> - AsciiStrCat (FullFileName, PrivateFile->Dirent->d_name);
> - Status = UnixSimpleFileSystemFileInfo (
> - PrivateFile,
> - FullFileName,
> - BufferSize,
> - Buffer
> - );
> - free (FullFileName);
> -
> - PrivateFile->Dirent = NULL;
> -
> -Done:
> - return Status;
> -}
> -
> -
> -
> -/**
> - Write data to a file.
> -
> - @param This Protocol instance pointer.
> - @param BufferSize On input size of buffer, on output amount of data in
> buffer.
> - @param Buffer The buffer in which data to write.
> -
> - @retval EFI_SUCCESS Data was written.
> - @retval EFI_UNSUPPORTED Writes to Open directory are not supported.
> - @retval EFI_NO_MEDIA The device has no media.
> - @retval EFI_DEVICE_ERROR The device reported an error.
> - @retval EFI_DEVICE_ERROR An attempt was made to write to a deleted
> file.
> - @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> - @retval EFI_WRITE_PROTECTED The device is write protected.
> - @retval EFI_ACCESS_DENIED The file was open for read only.
> - @retval EFI_VOLUME_FULL The volume is full.
> -
> -**/
> -EFI_STATUS
> -PosixFileWrite (
> - IN EFI_FILE_PROTOCOL *This,
> - IN OUT UINTN *BufferSize,
> - IN VOID *Buffer
> - )
> -{
> - EMU_EFI_FILE_PRIVATE *PrivateFile;
> - int Res;
> -
> -
> - PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> -
> - if (PrivateFile->fd < 0) {
> - return EFI_DEVICE_ERROR;
> - }
> -
> - if (PrivateFile->IsDirectoryPath) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - if (PrivateFile->IsOpenedByRead) {
> - return EFI_ACCESS_DENIED;
> - }
> -
> - Res = write (PrivateFile->fd, Buffer, *BufferSize);
> - if (Res == (UINTN)-1) {
> - return ErrnoToEfiStatus ();
> - }
> -
> - *BufferSize = Res;
> - return EFI_SUCCESS;
> -}
> -
> -
> -
> -/**
> - Set a files current position
> -
> - @param This Protocol instance pointer.
> - @param Position Byte position from the start of the file.
> -
> - @retval EFI_SUCCESS Data was written.
> - @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open.
> -
> -**/
> -EFI_STATUS
> -PosixFileSetPossition (
> - IN EFI_FILE_PROTOCOL *This,
> - IN UINT64 Position
> - )
> -{
> - EMU_EFI_FILE_PRIVATE *PrivateFile;
> - off_t Pos;
> -
> - PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> -
> - if (PrivateFile->IsDirectoryPath) {
> - if (Position != 0) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - if (PrivateFile->Dir == NULL) {
> - return EFI_DEVICE_ERROR;
> - }
> - rewinddir (PrivateFile->Dir);
> - return EFI_SUCCESS;
> - } else {
> - if (Position == (UINT64) -1) {
> - Pos = lseek (PrivateFile->fd, 0, SEEK_END);
> - } else {
> - Pos = lseek (PrivateFile->fd, Position, SEEK_SET);
> - }
> - if (Pos == (off_t)-1) {
> - return ErrnoToEfiStatus ();
> - }
> - return EFI_SUCCESS;
> - }
> -}
> -
> -
> -
> -/**
> - Get a file's current position
> -
> - @param This Protocol instance pointer.
> - @param Position Byte position from the start of the file.
> -
> - @retval EFI_SUCCESS Data was written.
> - @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open..
> -
> -**/
> -EFI_STATUS
> -PosixFileGetPossition (
> - IN EFI_FILE_PROTOCOL *This,
> - OUT UINT64 *Position
> - )
> -{
> - EFI_STATUS Status;
> - EMU_EFI_FILE_PRIVATE *PrivateFile;
> -
> - PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> -
> - if (PrivateFile->IsDirectoryPath) {
> - Status = EFI_UNSUPPORTED;
> - } else {
> - *Position = (UINT64)lseek (PrivateFile->fd, 0, SEEK_CUR);
> - Status = (*Position == (UINT64) -1) ? ErrnoToEfiStatus () : EFI_SUCCESS;
> - }
> -
> - return Status;
> -}
> -
> -
> -/**
> - Get information about a file.
> -
> - @param This Protocol instance pointer.
> - @param InformationType Type of information to return in Buffer.
> - @param BufferSize On input size of buffer, on output amount of data in
> buffer.
> - @param Buffer The buffer to return data.
> -
> - @retval EFI_SUCCESS Data was returned.
> - @retval EFI_UNSUPPORTED InformationType is not supported.
> - @retval EFI_NO_MEDIA The device has no media.
> - @retval EFI_DEVICE_ERROR The device reported an error.
> - @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> - @retval EFI_WRITE_PROTECTED The device is write protected.
> - @retval EFI_ACCESS_DENIED The file was open for read only.
> - @retval EFI_BUFFER_TOO_SMALL Buffer was too small; required size
> returned in BufferSize.
> -
> -**/
> -EFI_STATUS
> -PosixFileGetInfo (
> - IN EFI_FILE_PROTOCOL *This,
> - IN EFI_GUID *InformationType,
> - IN OUT UINTN *BufferSize,
> - OUT VOID *Buffer
> - )
> -{
> - EFI_STATUS Status;
> - EMU_EFI_FILE_PRIVATE *PrivateFile;
> - EFI_FILE_SYSTEM_INFO *FileSystemInfoBuffer;
> - int UnixStatus;
> - EMU_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;
> - struct statfs buf;
> -
> - PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> - PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS
> (PrivateFile->SimpleFileSystem);
> -
> - Status = EFI_SUCCESS;
> - if (CompareGuid (InformationType, &gEfiFileInfoGuid)) {
> - Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, BufferSize, Buffer);
> - } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
> - if (*BufferSize < SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel)) {
> - *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel);
> - return EFI_BUFFER_TOO_SMALL;
> - }
> -
> - UnixStatus = statfs (PrivateFile->FileName, &buf);
> - if (UnixStatus < 0) {
> - return EFI_DEVICE_ERROR;
> - }
> -
> - FileSystemInfoBuffer = (EFI_FILE_SYSTEM_INFO *) Buffer;
> - FileSystemInfoBuffer->Size = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize
> (PrivateRoot->VolumeLabel);
> - FileSystemInfoBuffer->ReadOnly = FALSE;
> -
> - //
> - // Succeeded
> - //
> - FileSystemInfoBuffer->VolumeSize = MultU64x32 (buf.f_blocks, buf.f_bsize);
> - FileSystemInfoBuffer->FreeSpace = MultU64x32 (buf.f_bavail, buf.f_bsize);
> - FileSystemInfoBuffer->BlockSize = buf.f_bsize;
> -
> -
> - StrCpy ((CHAR16 *) FileSystemInfoBuffer->VolumeLabel, PrivateRoot-
> >VolumeLabel);
> - *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel);
> -
> - } else if (CompareGuid (InformationType,
> &gEfiFileSystemVolumeLabelInfoIdGuid)) {
> - if (*BufferSize < StrSize (PrivateRoot->VolumeLabel)) {
> - *BufferSize = StrSize (PrivateRoot->VolumeLabel);
> - return EFI_BUFFER_TOO_SMALL;
> - }
> -
> - StrCpy ((CHAR16 *) Buffer, PrivateRoot->VolumeLabel);
> - *BufferSize = StrSize (PrivateRoot->VolumeLabel);
> -
> - }
> -
> - return Status;
> -}
> -
> -
> -/**
> - Set information about a file
> -
> - @param File Protocol instance pointer.
> - @param InformationType Type of information in Buffer.
> - @param BufferSize Size of buffer.
> - @param Buffer The data to write.
> -
> - @retval EFI_SUCCESS Data was returned.
> - @retval EFI_UNSUPPORTED InformationType is not supported.
> - @retval EFI_NO_MEDIA The device has no media.
> - @retval EFI_DEVICE_ERROR The device reported an error.
> - @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> - @retval EFI_WRITE_PROTECTED The device is write protected.
> - @retval EFI_ACCESS_DENIED The file was open for read only.
> -
> -**/
> -EFI_STATUS
> -PosixFileSetInfo (
> - IN EFI_FILE_PROTOCOL *This,
> - IN EFI_GUID *InformationType,
> - IN UINTN BufferSize,
> - IN VOID *Buffer
> - )
> -{
> - EMU_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;
> - EMU_EFI_FILE_PRIVATE *PrivateFile;
> - EFI_FILE_INFO *OldFileInfo;
> - EFI_FILE_INFO *NewFileInfo;
> - EFI_STATUS Status;
> - UINTN OldInfoSize;
> - mode_t NewAttr;
> - struct stat OldAttr;
> - CHAR8 *OldFileName;
> - CHAR8 *NewFileName;
> - CHAR8 *CharPointer;
> - BOOLEAN AttrChangeFlag;
> - BOOLEAN NameChangeFlag;
> - BOOLEAN SizeChangeFlag;
> - BOOLEAN TimeChangeFlag;
> - struct tm NewLastAccessSystemTime;
> - struct tm NewLastWriteSystemTime;
> - EFI_FILE_SYSTEM_INFO *NewFileSystemInfo;
> - CHAR8 *AsciiFilePtr;
> - CHAR16 *UnicodeFilePtr;
> - int UnixStatus;
> - struct utimbuf Utime;
> -
> -
> - PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> - PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS
> (PrivateFile->SimpleFileSystem);
> - errno = 0;
> - Status = EFI_UNSUPPORTED;
> - OldFileInfo = NewFileInfo = NULL;
> - OldFileName = NewFileName = NULL;
> - AttrChangeFlag = NameChangeFlag = SizeChangeFlag = TimeChangeFlag =
> FALSE;
> -
> - //
> - // Set file system information.
> - //
> - if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
> - if (BufferSize < (SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel))) {
> - Status = EFI_BAD_BUFFER_SIZE;
> - goto Done;
> - }
> -
> - NewFileSystemInfo = (EFI_FILE_SYSTEM_INFO *) Buffer;
> -
> - free (PrivateRoot->VolumeLabel);
> -
> - PrivateRoot->VolumeLabel = malloc (StrSize (NewFileSystemInfo-
> >VolumeLabel));
> - if (PrivateRoot->VolumeLabel == NULL) {
> - goto Done;
> - }
> -
> - StrCpy (PrivateRoot->VolumeLabel, NewFileSystemInfo->VolumeLabel);
> -
> - Status = EFI_SUCCESS;
> - goto Done;
> - }
> -
> - //
> - // Set volume label information.
> - //
> - if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid))
> {
> - if (BufferSize < StrSize (PrivateRoot->VolumeLabel)) {
> - Status = EFI_BAD_BUFFER_SIZE;
> - goto Done;
> - }
> -
> - StrCpy (PrivateRoot->VolumeLabel, (CHAR16 *) Buffer);
> -
> - Status = EFI_SUCCESS;
> - goto Done;
> - }
> -
> - if (!CompareGuid (InformationType, &gEfiFileInfoGuid)) {
> - Status = EFI_UNSUPPORTED;
> - goto Done;
> - }
> -
> - if (BufferSize < SIZE_OF_EFI_FILE_INFO) {
> - Status = EFI_BAD_BUFFER_SIZE;
> - goto Done;
> - }
> -
> - //
> - // Set file/directory information.
> - //
> -
> - //
> - // Check for invalid set file information parameters.
> - //
> - NewFileInfo = (EFI_FILE_INFO *) Buffer;
> - if (NewFileInfo->Size <= sizeof (EFI_FILE_INFO) ||
> - (NewFileInfo->Attribute &~(EFI_FILE_VALID_ATTR)) ||
> - (sizeof (UINTN) == 4 && NewFileInfo->Size > 0xFFFFFFFF)
> - ) {
> - Status = EFI_INVALID_PARAMETER;
> - goto Done;
> - }
> -
> - //
> - // Get current file information so we can determine what kind
> - // of change request this is.
> - //
> - OldInfoSize = 0;
> - Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize, NULL);
> - if (Status != EFI_BUFFER_TOO_SMALL) {
> - Status = EFI_DEVICE_ERROR;
> - goto Done;
> - }
> -
> - OldFileInfo = malloc (OldInfoSize);
> - if (OldFileInfo == NULL) {
> - goto Done;
> - }
> -
> - Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize,
> OldFileInfo);
> - if (EFI_ERROR (Status)) {
> - goto Done;
> - }
> -
> - OldFileName = malloc (AsciiStrSize (PrivateFile->FileName));
> - if (OldFileInfo == NULL) {
> - goto Done;
> - }
> -
> - AsciiStrCpy (OldFileName, PrivateFile->FileName);
> -
> - //
> - // Make full pathname from new filename and rootpath.
> - //
> - if (NewFileInfo->FileName[0] == '\\') {
> - NewFileName = malloc (AsciiStrLen (PrivateRoot->FilePath) + 1 + StrLen
> (NewFileInfo->FileName) + 1);
> - if (NewFileName == NULL) {
> - goto Done;
> - }
> -
> - AsciiStrCpy (NewFileName, PrivateRoot->FilePath);
> - AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);
> - UnicodeFilePtr = NewFileInfo->FileName + 1;
> - *AsciiFilePtr++ ='/';
> - } else {
> - NewFileName = malloc (AsciiStrLen (PrivateFile->FileName) + 2 + StrLen
> (NewFileInfo->FileName) + 1);
> - if (NewFileName == NULL) {
> - goto Done;
> - }
> -
> - AsciiStrCpy (NewFileName, PrivateRoot->FilePath);
> - AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);
> - if ((AsciiFilePtr[-1] != '/') && (NewFileInfo->FileName[0] != '/')) {
> - // make sure there is a / between Root FilePath and NewFileInfo Filename
> - AsciiFilePtr[0] = '/';
> - AsciiFilePtr[1] = '\0';
> - AsciiFilePtr++;
> - }
> - UnicodeFilePtr = NewFileInfo->FileName;
> - }
> - // Convert to ascii.
> - while (*UnicodeFilePtr) {
> - *AsciiFilePtr++ = *UnicodeFilePtr++;
> - }
> - *AsciiFilePtr = 0;
> -
> - //
> - // Is there an attribute change request?
> - //
> - if (NewFileInfo->Attribute != OldFileInfo->Attribute) {
> - if ((NewFileInfo->Attribute & EFI_FILE_DIRECTORY) != (OldFileInfo-
> >Attribute & EFI_FILE_DIRECTORY)) {
> - Status = EFI_INVALID_PARAMETER;
> - goto Done;
> - }
> -
> - AttrChangeFlag = TRUE;
> - }
> -
> - //
> - // Is there a name change request?
> - // bugbug: - Should really use EFI_UNICODE_COLLATION_PROTOCOL
> - //
> - if (StrCmp (NewFileInfo->FileName, OldFileInfo->FileName)) {
> - NameChangeFlag = TRUE;
> - }
> -
> - //
> - // Is there a size change request?
> - //
> - if (NewFileInfo->FileSize != OldFileInfo->FileSize) {
> - SizeChangeFlag = TRUE;
> - }
> -
> - //
> - // Is there a time stamp change request?
> - //
> - if (!IsZero (&NewFileInfo->CreateTime, sizeof (EFI_TIME)) &&
> - CompareMem (&NewFileInfo->CreateTime, &OldFileInfo->CreateTime,
> sizeof (EFI_TIME))
> - ) {
> - TimeChangeFlag = TRUE;
> - } else if (!IsZero (&NewFileInfo->LastAccessTime, sizeof (EFI_TIME)) &&
> - CompareMem (&NewFileInfo->LastAccessTime, &OldFileInfo-
> >LastAccessTime, sizeof (EFI_TIME))
> - ) {
> - TimeChangeFlag = TRUE;
> - } else if (!IsZero (&NewFileInfo->ModificationTime, sizeof (EFI_TIME)) &&
> - CompareMem (&NewFileInfo->ModificationTime, &OldFileInfo-
> >ModificationTime, sizeof (EFI_TIME))
> - ) {
> - TimeChangeFlag = TRUE;
> - }
> -
> - //
> - // All done if there are no change requests being made.
> - //
> - if (!(AttrChangeFlag || NameChangeFlag || SizeChangeFlag ||
> TimeChangeFlag)) {
> - Status = EFI_SUCCESS;
> - goto Done;
> - }
> -
> - //
> - // Set file or directory information.
> - //
> - if (stat (OldFileName, &OldAttr) != 0) {
> - Status = ErrnoToEfiStatus ();
> - goto Done;
> - }
> -
> - //
> - // Name change.
> - //
> - if (NameChangeFlag) {
> - //
> - // Close the handles first
> - //
> - if (PrivateFile->IsOpenedByRead) {
> - Status = EFI_ACCESS_DENIED;
> - goto Done;
> - }
> -
> - for (CharPointer = NewFileName; *CharPointer != 0 && *CharPointer != L'/';
> CharPointer++) {
> - }
> -
> - if (*CharPointer != 0) {
> - Status = EFI_ACCESS_DENIED;
> - goto Done;
> - }
> -
> - UnixStatus = rename (OldFileName, NewFileName);
> - if (UnixStatus == 0) {
> - //
> - // modify file name
> - //
> - free (PrivateFile->FileName);
> -
> - PrivateFile->FileName = malloc (AsciiStrSize (NewFileName));
> - if (PrivateFile->FileName == NULL) {
> - goto Done;
> - }
> -
> - AsciiStrCpy (PrivateFile->FileName, NewFileName);
> - } else {
> - Status = EFI_DEVICE_ERROR;
> - goto Done;
> - }
> - }
> -
> - //
> - // Size change
> - //
> - if (SizeChangeFlag) {
> - if (PrivateFile->IsDirectoryPath) {
> - Status = EFI_UNSUPPORTED;
> - goto Done;
> - }
> -
> - if (PrivateFile->IsOpenedByRead || OldFileInfo->Attribute &
> EFI_FILE_READ_ONLY) {
> - Status = EFI_ACCESS_DENIED;
> - goto Done;
> - }
> -
> - if (ftruncate (PrivateFile->fd, NewFileInfo->FileSize) != 0) {
> - Status = ErrnoToEfiStatus ();
> - goto Done;
> - }
> -
> - }
> -
> - //
> - // Time change
> - //
> - if (TimeChangeFlag) {
> - NewLastAccessSystemTime.tm_year = NewFileInfo->LastAccessTime.Year;
> - NewLastAccessSystemTime.tm_mon = NewFileInfo-
> >LastAccessTime.Month;
> - NewLastAccessSystemTime.tm_mday = NewFileInfo->LastAccessTime.Day;
> - NewLastAccessSystemTime.tm_hour = NewFileInfo->LastAccessTime.Hour;
> - NewLastAccessSystemTime.tm_min = NewFileInfo-
> >LastAccessTime.Minute;
> - NewLastAccessSystemTime.tm_sec = NewFileInfo-
> >LastAccessTime.Second;
> - NewLastAccessSystemTime.tm_isdst = 0;
> -
> - Utime.actime = mktime (&NewLastAccessSystemTime);
> -
> - NewLastWriteSystemTime.tm_year = NewFileInfo->ModificationTime.Year;
> - NewLastWriteSystemTime.tm_mon = NewFileInfo-
> >ModificationTime.Month;
> - NewLastWriteSystemTime.tm_mday = NewFileInfo-
> >ModificationTime.Day;
> - NewLastWriteSystemTime.tm_hour = NewFileInfo-
> >ModificationTime.Hour;
> - NewLastWriteSystemTime.tm_min = NewFileInfo-
> >ModificationTime.Minute;
> - NewLastWriteSystemTime.tm_sec = NewFileInfo-
> >ModificationTime.Second;
> - NewLastWriteSystemTime.tm_isdst = 0;
> -
> - Utime.modtime = mktime (&NewLastWriteSystemTime);
> -
> - if (Utime.actime == (time_t)-1 || Utime.modtime == (time_t)-1) {
> - goto Done;
> - }
> -
> - if (utime (PrivateFile->FileName, &Utime) == -1) {
> - Status = ErrnoToEfiStatus ();
> - goto Done;
> - }
> - }
> -
> - //
> - // No matter about AttrChangeFlag, Attribute must be set.
> - // Because operation before may cause attribute change.
> - //
> - NewAttr = OldAttr.st_mode;
> -
> - if (NewFileInfo->Attribute & EFI_FILE_READ_ONLY) {
> - NewAttr &= ~(S_IRUSR | S_IRGRP | S_IROTH);
> - } else {
> - NewAttr |= S_IRUSR;
> - }
> -
> - if (chmod (NewFileName, NewAttr) != 0) {
> - Status = ErrnoToEfiStatus ();
> - }
> -
> -Done:
> - if (OldFileInfo != NULL) {
> - free (OldFileInfo);
> - }
> -
> - if (OldFileName != NULL) {
> - free (OldFileName);
> - }
> -
> - if (NewFileName != NULL) {
> - free (NewFileName);
> - }
> -
> - return Status;
> -}
> -
> -
> -/**
> - Flush data back for the file handle.
> -
> - @param This Protocol instance pointer.
> -
> - @retval EFI_SUCCESS Data was written.
> - @retval EFI_UNSUPPORTED Writes to Open directory are not supported.
> - @retval EFI_NO_MEDIA The device has no media.
> - @retval EFI_DEVICE_ERROR The device reported an error.
> - @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> - @retval EFI_WRITE_PROTECTED The device is write protected.
> - @retval EFI_ACCESS_DENIED The file was open for read only.
> - @retval EFI_VOLUME_FULL The volume is full.
> -
> -**/
> -EFI_STATUS
> -PosixFileFlush (
> - IN EFI_FILE_PROTOCOL *This
> - )
> -{
> - EMU_EFI_FILE_PRIVATE *PrivateFile;
> -
> -
> - PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> -
> - if (PrivateFile->IsDirectoryPath) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - if (PrivateFile->IsOpenedByRead) {
> - return EFI_ACCESS_DENIED;
> - }
> -
> - if (PrivateFile->fd < 0) {
> - return EFI_DEVICE_ERROR;
> - }
> -
> - if (fsync (PrivateFile->fd) != 0) {
> - return ErrnoToEfiStatus ();
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -
> -EFI_STATUS
> -PosixFileSystmeThunkOpen (
> - IN EMU_IO_THUNK_PROTOCOL *This
> - )
> -{
> - EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
> - UINTN i;
> -
> - if (This->Private != NULL) {
> - return EFI_ALREADY_STARTED;
> - }
> -
> - if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - Private = malloc (sizeof (EMU_SIMPLE_FILE_SYSTEM_PRIVATE));
> - if (Private == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - Private->FilePath = malloc (StrLen (This->ConfigString) + 1);
> - if (Private->FilePath == NULL) {
> - free (Private);
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - // Convert Unicode to Ascii
> - for (i = 0; This->ConfigString[i] != 0; i++) {
> - Private->FilePath[i] = This->ConfigString[i];
> - }
> - Private->FilePath[i] = 0;
> -
> -
> - Private->VolumeLabel = malloc (StrSize (L"EFI_EMULATED"));
> - if (Private->VolumeLabel == NULL) {
> - free (Private->FilePath);
> - free (Private);
> - return EFI_OUT_OF_RESOURCES;
> - }
> - StrCpy (Private->VolumeLabel, L"EFI_EMULATED");
> -
> - Private->Signature = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE;
> - Private->Thunk = This;
> - CopyMem (&Private->SimpleFileSystem, &gPosixFileSystemProtocol, sizeof
> (Private->SimpleFileSystem));
> - Private->FileHandlesOpen = FALSE;
> -
> - This->Interface = &Private->SimpleFileSystem;
> - This->Private = Private;
> - return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -PosixFileSystmeThunkClose (
> - IN EMU_IO_THUNK_PROTOCOL *This
> - )
> -{
> - EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
> -
> - if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {
> - return EFI_UNSUPPORTED;
> - }
> -
> - Private = This->Private;
> -
> - if (Private->FileHandlesOpen) {
> - //
> - // Close only supported if all the EFI_FILE_HANDLEs have been closed.
> - //
> - return EFI_NOT_READY;
> - }
> -
> - if (This->Private != NULL) {
> - if (Private->VolumeLabel != NULL) {
> - free (Private->VolumeLabel);
> - }
> - free (This->Private);
> - This->Private = NULL;
> - }
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo = {
> - &gEfiSimpleFileSystemProtocolGuid,
> - NULL,
> - NULL,
> - 0,
> - GasketPosixFileSystmeThunkOpen,
> - GasketPosixFileSystmeThunkClose,
> - NULL
> -};
> -
> -
> +/*++ @file
> + POSIX Pthreads to emulate APs and implement threads
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +
> +**/
> +
> +#include "Host.h"
> +
> +
> +#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE SIGNATURE_32 ('E',
> 'P', 'f', 's')
> +
> +typedef struct {
> + UINTN Signature;
> + EMU_IO_THUNK_PROTOCOL *Thunk;
> + EFI_SIMPLE_FILE_SYSTEM_PROTOCOL SimpleFileSystem;
> + CHAR8 *FilePath;
> + CHAR16 *VolumeLabel;
> + BOOLEAN FileHandlesOpen;
> +} EMU_SIMPLE_FILE_SYSTEM_PRIVATE;
> +
> +#define EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS(a) \
> + CR (a, \
> + EMU_SIMPLE_FILE_SYSTEM_PRIVATE, \
> + SimpleFileSystem, \
> + EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE \
> + )
> +
> +
> +#define EMU_EFI_FILE_PRIVATE_SIGNATURE SIGNATURE_32 ('E', 'P', 'f', 'i')
> +
> +typedef struct {
> + UINTN Signature;
> + EMU_IO_THUNK_PROTOCOL *Thunk;
> + EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;
> + EFI_FILE_PROTOCOL EfiFile;
> + int fd;
> + DIR *Dir;
> + BOOLEAN IsRootDirectory;
> + BOOLEAN IsDirectoryPath;
> + BOOLEAN IsOpenedByRead;
> + char *FileName;
> + struct dirent *Dirent;
> +} EMU_EFI_FILE_PRIVATE;
> +
> +#define EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS(a) \
> + CR (a, \
> + EMU_EFI_FILE_PRIVATE, \
> + EfiFile, \
> + EMU_EFI_FILE_PRIVATE_SIGNATURE \
> + )
> +
> +EFI_STATUS
> +PosixFileGetInfo (
> + IN EFI_FILE_PROTOCOL *This,
> + IN EFI_GUID *InformationType,
> + IN OUT UINTN *BufferSize,
> + OUT VOID *Buffer
> + );
> +
> +EFI_STATUS
> +PosixFileSetInfo (
> + IN EFI_FILE_PROTOCOL *This,
> + IN EFI_GUID *InformationType,
> + IN UINTN BufferSize,
> + IN VOID *Buffer
> + );
> +
> +
> +EFI_FILE_PROTOCOL gPosixFileProtocol = {
> + EFI_FILE_REVISION,
> + GasketPosixFileOpen,
> + GasketPosixFileCLose,
> + GasketPosixFileDelete,
> + GasketPosixFileRead,
> + GasketPosixFileWrite,
> + GasketPosixFileGetPossition,
> + GasketPosixFileSetPossition,
> + GasketPosixFileGetInfo,
> + GasketPosixFileSetInfo,
> + GasketPosixFileFlush
> +};
> +
> +EFI_SIMPLE_FILE_SYSTEM_PROTOCOL gPosixFileSystemProtocol = {
> + EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_REVISION,
> + GasketPosixOpenVolume,
> +};
> +
> +
> +/**
> + Open the root directory on a volume.
> +
> + @param This Protocol instance pointer.
> + @param Root Returns an Open file handle for the root directory
> +
> + @retval EFI_SUCCESS The device was opened.
> + @retval EFI_UNSUPPORTED This volume does not support the file system.
> + @retval EFI_NO_MEDIA The device has no media.
> + @retval EFI_DEVICE_ERROR The device reported an error.
> + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> + @retval EFI_ACCESS_DENIED The service denied access to the file.
> + @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of
> resources.
> +
> +**/
> +EFI_STATUS
> +PosixOpenVolume (
> + IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
> + OUT EFI_FILE_PROTOCOL **Root
> + )
> +{
> + EFI_STATUS Status;
> + EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
> + EMU_EFI_FILE_PRIVATE *PrivateFile;
> +
> + Private = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (This);
> +
> + Status = EFI_OUT_OF_RESOURCES;
> + PrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));
> + if (PrivateFile == NULL) {
> + goto Done;
> + }
> +
> + PrivateFile->FileName = malloc (AsciiStrSize (Private->FilePath));
> + if (PrivateFile->FileName == NULL) {
> + goto Done;
> + }
> + AsciiStrCpy (PrivateFile->FileName, Private->FilePath);
> +
> + PrivateFile->Signature = EMU_EFI_FILE_PRIVATE_SIGNATURE;
> + PrivateFile->Thunk = Private->Thunk;
> + PrivateFile->SimpleFileSystem = This;
> + PrivateFile->IsRootDirectory = TRUE;
> + PrivateFile->IsDirectoryPath = TRUE;
> + PrivateFile->IsOpenedByRead = TRUE;
> +
> + CopyMem (&PrivateFile->EfiFile, &gPosixFileProtocol, sizeof
> (EFI_FILE_PROTOCOL));
> +
> + PrivateFile->fd = -1;
> + PrivateFile->Dir = NULL;
> + PrivateFile->Dirent = NULL;
> +
> + *Root = &PrivateFile->EfiFile;
> +
> + PrivateFile->Dir = opendir (PrivateFile->FileName);
> + if (PrivateFile->Dir == NULL) {
> + Status = EFI_ACCESS_DENIED;
> + } else {
> + Status = EFI_SUCCESS;
> + }
> +
> +Done:
> + if (EFI_ERROR (Status)) {
> + if (PrivateFile != NULL) {
> + if (PrivateFile->FileName != NULL) {
> + free (PrivateFile->FileName);
> + }
> +
> + free (PrivateFile);
> + }
> +
> + *Root = NULL;
> + }
> +
> + return Status;
> +}
> +
> +
> +EFI_STATUS
> +ErrnoToEfiStatus ()
> +{
> + switch (errno) {
> + case EACCES:
> + return EFI_ACCESS_DENIED;
> +
> + case EDQUOT:
> + case ENOSPC:
> + return EFI_VOLUME_FULL;
> +
> + default:
> + return EFI_DEVICE_ERROR;
> + }
> +}
> +
> +VOID
> +CutPrefix (
> + IN CHAR8 *Str,
> + IN UINTN Count
> + )
> +{
> + CHAR8 *Pointer;
> +
> + if (AsciiStrLen (Str) < Count) {
> + ASSERT (0);
> + }
> +
> + for (Pointer = Str; *(Pointer + Count); Pointer++) {
> + *Pointer = *(Pointer + Count);
> + }
> +
> + *Pointer = *(Pointer + Count);
> +}
> +
> +
> +VOID
> +PosixSystemTimeToEfiTime (
> + IN time_t SystemTime,
> + OUT EFI_TIME *Time
> + )
> +{
> + struct tm *tm;
> +
> + tm = gmtime (&SystemTime);
> + Time->Year = tm->tm_year;
> + Time->Month = tm->tm_mon + 1;
> + Time->Day = tm->tm_mday;
> + Time->Hour = tm->tm_hour;
> + Time->Minute = tm->tm_min;
> + Time->Second = tm->tm_sec;
> + Time->Nanosecond = 0;
> +
> + Time->TimeZone = timezone;
> + Time->Daylight = (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0) | (tm-
> >tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0);
> +}
> +
> +
> +EFI_STATUS
> +UnixSimpleFileSystemFileInfo (
> + EMU_EFI_FILE_PRIVATE *PrivateFile,
> + IN CHAR8 *FileName,
> + IN OUT UINTN *BufferSize,
> + OUT VOID *Buffer
> + )
> +{
> + EFI_STATUS Status;
> + UINTN Size;
> + UINTN NameSize;
> + UINTN ResultSize;
> + EFI_FILE_INFO *Info;
> + CHAR8 *RealFileName;
> + CHAR8 *TempPointer;
> + CHAR16 *BufferFileName;
> + struct stat buf;
> +
> + if (FileName != NULL) {
> + RealFileName = FileName;
> + } else if (PrivateFile->IsRootDirectory) {
> + RealFileName = "";
> + } else {
> + RealFileName = PrivateFile->FileName;
> + }
> +
> + TempPointer = RealFileName;
> + while (*TempPointer) {
> + if (*TempPointer == '/') {
> + RealFileName = TempPointer + 1;
> + }
> +
> + TempPointer++;
> + }
> +
> + Size = SIZE_OF_EFI_FILE_INFO;
> + NameSize = AsciiStrSize (RealFileName) * 2;
> + ResultSize = Size + NameSize;
> +
> + if (*BufferSize < ResultSize) {
> + *BufferSize = ResultSize;
> + return EFI_BUFFER_TOO_SMALL;
> + }
> + if (stat (FileName == NULL ? PrivateFile->FileName : FileName, &buf) < 0) {
> + return EFI_DEVICE_ERROR;
> + }
> +
> + Status = EFI_SUCCESS;
> +
> + Info = Buffer;
> + ZeroMem (Info, ResultSize);
> +
> + Info->Size = ResultSize;
> + Info->FileSize = buf.st_size;
> + Info->PhysicalSize = MultU64x32 (buf.st_blocks, buf.st_blksize);
> +
> + PosixSystemTimeToEfiTime (buf.st_ctime, &Info->CreateTime);
> + PosixSystemTimeToEfiTime (buf.st_atime, &Info->LastAccessTime);
> + PosixSystemTimeToEfiTime (buf.st_mtime, &Info->ModificationTime);
> +
> + if (!(buf.st_mode & S_IWUSR)) {
> + Info->Attribute |= EFI_FILE_READ_ONLY;
> + }
> +
> + if (S_ISDIR(buf.st_mode)) {
> + Info->Attribute |= EFI_FILE_DIRECTORY;
> + }
> +
> +
> + BufferFileName = (CHAR16 *)((CHAR8 *) Buffer + Size);
> + while (*RealFileName) {
> + *BufferFileName++ = *RealFileName++;
> + }
> + *BufferFileName = 0;
> +
> + *BufferSize = ResultSize;
> + return Status;
> +}
> +
> +BOOLEAN
> +IsZero (
> + IN VOID *Buffer,
> + IN UINTN Length
> + )
> +{
> + if (Buffer == NULL || Length == 0) {
> + return FALSE;
> + }
> +
> + if (*(UINT8 *) Buffer != 0) {
> + return FALSE;
> + }
> +
> + if (Length > 1) {
> + if (!CompareMem (Buffer, (UINT8 *) Buffer + 1, Length - 1)) {
> + return FALSE;
> + }
> + }
> +
> + return TRUE;
> +}
> +
> +
> +
> +/**
> + Opens a new file relative to the source file's location.
> +
> + @param This The protocol instance pointer.
> + @param NewHandle Returns File Handle for FileName.
> + @param FileName Null terminated string. "\", ".", and ".." are supported.
> + @param OpenMode Open mode for file.
> + @param Attributes Only used for EFI_FILE_MODE_CREATE.
> +
> + @retval EFI_SUCCESS The device was opened.
> + @retval EFI_NOT_FOUND The specified file could not be found on the
> device.
> + @retval EFI_NO_MEDIA The device has no media.
> + @retval EFI_MEDIA_CHANGED The media has changed.
> + @retval EFI_DEVICE_ERROR The device reported an error.
> + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> + @retval EFI_ACCESS_DENIED The service denied access to the file.
> + @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of
> resources.
> + @retval EFI_VOLUME_FULL The volume is full.
> +
> +**/
> +EFI_STATUS
> +PosixFileOpen (
> + IN EFI_FILE_PROTOCOL *This,
> + OUT EFI_FILE_PROTOCOL **NewHandle,
> + IN CHAR16 *FileName,
> + IN UINT64 OpenMode,
> + IN UINT64 Attributes
> + )
> +{
> + EFI_FILE_PROTOCOL *Root;
> + EMU_EFI_FILE_PRIVATE *PrivateFile;
> + EMU_EFI_FILE_PRIVATE *NewPrivateFile;
> + EMU_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;
> + EFI_STATUS Status;
> + CHAR16 *Src;
> + char *Dst;
> + CHAR8 *RealFileName;
> + char *ParseFileName;
> + char *GuardPointer;
> + CHAR8 TempChar;
> + UINTN Count;
> + BOOLEAN TrailingDash;
> + BOOLEAN LoopFinish;
> + UINTN InfoSize;
> + EFI_FILE_INFO *Info;
> + struct stat finfo;
> + int res;
> +
> +
> + PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> + PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS
> (PrivateFile->SimpleFileSystem);
> + NewPrivateFile = NULL;
> + Status = EFI_OUT_OF_RESOURCES;
> +
> + //
> + // BUGBUG: assume an open of root
> + // if current location, return current data
> + //
> + TrailingDash = FALSE;
> + if ((StrCmp (FileName, L"\\") == 0) ||
> + (StrCmp (FileName, L".") == 0 && PrivateFile->IsRootDirectory)) {
> +OpenRoot:
> + Status = PosixOpenVolume (PrivateFile->SimpleFileSystem, &Root);
> + NewPrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (Root);
> + goto Done;
> + }
> +
> + if (FileName[StrLen (FileName) - 1] == L'\\') {
> + TrailingDash = TRUE;
> + FileName[StrLen (FileName) - 1] = 0;
> + }
> +
> + //
> + // Attempt to open the file
> + //
> + NewPrivateFile = malloc (sizeof (EMU_EFI_FILE_PRIVATE));
> + if (NewPrivateFile == NULL) {
> + goto Done;
> + }
> +
> + CopyMem (NewPrivateFile, PrivateFile, sizeof (EMU_EFI_FILE_PRIVATE));
> +
> + NewPrivateFile->FileName = malloc (AsciiStrSize (PrivateFile->FileName) + 1
> + StrLen (FileName) + 1);
> + if (NewPrivateFile->FileName == NULL) {
> + goto Done;
> + }
> +
> + if (*FileName == L'\\') {
> + AsciiStrCpy (NewPrivateFile->FileName, PrivateRoot->FilePath);
> + // Skip first '\'.
> + Src = FileName + 1;
> + } else {
> + AsciiStrCpy (NewPrivateFile->FileName, PrivateFile->FileName);
> + Src = FileName;
> + }
> + Dst = NewPrivateFile->FileName + AsciiStrLen (NewPrivateFile->FileName);
> + GuardPointer = NewPrivateFile->FileName + AsciiStrLen (PrivateRoot-
> >FilePath);
> + *Dst++ = '/';
> + // Convert unicode to ascii and '\' to '/'
> + while (*Src) {
> + if (*Src == '\\') {
> + *Dst++ = '/';
> + } else {
> + *Dst++ = *Src;
> + }
> + Src++;
> + }
> + *Dst = 0;
> +
> +
> + //
> + // Get rid of . and .., except leading . or ..
> + //
> +
> + //
> + // GuardPointer protect simplefilesystem root path not be destroyed
> + //
> +
> + LoopFinish = FALSE;
> + while (!LoopFinish) {
> + LoopFinish = TRUE;
> +
> + for (ParseFileName = GuardPointer; *ParseFileName; ParseFileName++) {
> + if (*ParseFileName == '.' &&
> + (*(ParseFileName + 1) == 0 || *(ParseFileName + 1) == '/') &&
> + *(ParseFileName - 1) == '/'
> + ) {
> +
> + //
> + // cut /.
> + //
> + CutPrefix (ParseFileName - 1, 2);
> + LoopFinish = FALSE;
> + break;
> + }
> +
> + if (*ParseFileName == '.' &&
> + *(ParseFileName + 1) == '.' &&
> + (*(ParseFileName + 2) == 0 || *(ParseFileName + 2) == '/') &&
> + *(ParseFileName - 1) == '/'
> + ) {
> +
> + ParseFileName--;
> + Count = 3;
> +
> + while (ParseFileName != GuardPointer) {
> + ParseFileName--;
> + Count++;
> + if (*ParseFileName == '/') {
> + break;
> + }
> + }
> +
> + //
> + // cut /.. and its left directory
> + //
> + CutPrefix (ParseFileName, Count);
> + LoopFinish = FALSE;
> + break;
> + }
> + }
> + }
> +
> + if (AsciiStrCmp (NewPrivateFile->FileName, PrivateRoot->FilePath) == 0) {
> + NewPrivateFile->IsRootDirectory = TRUE;
> + free (NewPrivateFile->FileName);
> + free (NewPrivateFile);
> + goto OpenRoot;
> + }
> +
> + RealFileName = NewPrivateFile->FileName + AsciiStrLen(NewPrivateFile-
> >FileName) - 1;
> + while (RealFileName > NewPrivateFile->FileName && *RealFileName != '/') {
> + RealFileName--;
> + }
> +
> + TempChar = *(RealFileName - 1);
> + *(RealFileName - 1) = 0;
> + *(RealFileName - 1) = TempChar;
> +
> +
> + //
> + // Test whether file or directory
> + //
> + NewPrivateFile->IsRootDirectory = FALSE;
> + NewPrivateFile->fd = -1;
> + NewPrivateFile->Dir = NULL;
> + if (OpenMode & EFI_FILE_MODE_CREATE) {
> + if (Attributes & EFI_FILE_DIRECTORY) {
> + NewPrivateFile->IsDirectoryPath = TRUE;
> + } else {
> + NewPrivateFile->IsDirectoryPath = FALSE;
> + }
> + } else {
> + res = stat (NewPrivateFile->FileName, &finfo);
> + if (res == 0 && S_ISDIR(finfo.st_mode)) {
> + NewPrivateFile->IsDirectoryPath = TRUE;
> + } else {
> + NewPrivateFile->IsDirectoryPath = FALSE;
> + }
> + }
> +
> + if (OpenMode & EFI_FILE_MODE_WRITE) {
> + NewPrivateFile->IsOpenedByRead = FALSE;
> + } else {
> + NewPrivateFile->IsOpenedByRead = TRUE;
> + }
> +
> + Status = EFI_SUCCESS;
> +
> + //
> + // deal with directory
> + //
> + if (NewPrivateFile->IsDirectoryPath) {
> + if ((OpenMode & EFI_FILE_MODE_CREATE)) {
> + //
> + // Create a directory
> + //
> + if (mkdir (NewPrivateFile->FileName, 0777) != 0) {
> + if (errno != EEXIST) {
> + //free (TempFileName);
> + Status = EFI_ACCESS_DENIED;
> + goto Done;
> + }
> + }
> + }
> +
> + NewPrivateFile->Dir = opendir (NewPrivateFile->FileName);
> + if (NewPrivateFile->Dir == NULL) {
> + if (errno == EACCES) {
> + Status = EFI_ACCESS_DENIED;
> + } else {
> + Status = EFI_NOT_FOUND;
> + }
> +
> + goto Done;
> + }
> +
> + } else {
> + //
> + // deal with file
> + //
> + NewPrivateFile->fd = open (
> + NewPrivateFile->FileName,
> + ((OpenMode & EFI_FILE_MODE_CREATE) ? O_CREAT : 0) |
> (NewPrivateFile->IsOpenedByRead ? O_RDONLY : O_RDWR),
> + 0666
> + );
> + if (NewPrivateFile->fd < 0) {
> + if (errno == ENOENT) {
> + Status = EFI_NOT_FOUND;
> + } else {
> + Status = EFI_ACCESS_DENIED;
> + }
> + }
> + }
> +
> + if ((OpenMode & EFI_FILE_MODE_CREATE) && Status == EFI_SUCCESS) {
> + //
> + // Set the attribute
> + //
> + InfoSize = 0;
> + Info = NULL;
> + Status = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid,
> &InfoSize, Info);
> + if (Status != EFI_BUFFER_TOO_SMALL) {
> + Status = EFI_DEVICE_ERROR;
> + goto Done;
> + }
> +
> + Info = malloc (InfoSize);
> + if (Info == NULL) {
> + goto Done;
> + }
> +
> + Status = PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid,
> &InfoSize, Info);
> + if (EFI_ERROR (Status)) {
> + goto Done;
> + }
> +
> + Info->Attribute = Attributes;
> + PosixFileSetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, InfoSize, Info);
> +
> + free (Info);
> + }
> +
> +Done: ;
> + if (TrailingDash) {
> + FileName[StrLen (FileName) + 1] = 0;
> + FileName[StrLen (FileName)] = L'\\';
> + }
> +
> + if (EFI_ERROR (Status)) {
> + if (NewPrivateFile) {
> + if (NewPrivateFile->FileName) {
> + free (NewPrivateFile->FileName);
> + }
> +
> + free (NewPrivateFile);
> + }
> + } else {
> + *NewHandle = &NewPrivateFile->EfiFile;
> + }
> +
> + return Status;
> +}
> +
> +
> +
> +/**
> + Close the file handle
> +
> + @param This Protocol instance pointer.
> +
> + @retval EFI_SUCCESS The device was opened.
> +
> +**/
> +EFI_STATUS
> +PosixFileCLose (
> + IN EFI_FILE_PROTOCOL *This
> + )
> +{
> + EMU_EFI_FILE_PRIVATE *PrivateFile;
> +
> + PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> +
> + if (PrivateFile->fd >= 0) {
> + close (PrivateFile->fd);
> + }
> + if (PrivateFile->Dir != NULL) {
> + closedir (PrivateFile->Dir);
> + }
> +
> + PrivateFile->fd = -1;
> + PrivateFile->Dir = NULL;
> +
> + if (PrivateFile->FileName) {
> + free (PrivateFile->FileName);
> + }
> +
> + free (PrivateFile);
> +
> + return EFI_SUCCESS;
> +}
> +
> +
> +/**
> + Close and delete the file handle.
> +
> + @param This Protocol instance pointer.
> +
> + @retval EFI_SUCCESS The device was opened.
> + @retval EFI_WARN_DELETE_FAILURE The handle was closed but the file was
> not deleted.
> +
> +**/
> +EFI_STATUS
> +PosixFileDelete (
> + IN EFI_FILE_PROTOCOL *This
> + )
> +{
> + EFI_STATUS Status;
> + EMU_EFI_FILE_PRIVATE *PrivateFile;
> +
> + PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> + Status = EFI_WARN_DELETE_FAILURE;
> +
> + if (PrivateFile->IsDirectoryPath) {
> + if (PrivateFile->Dir != NULL) {
> + closedir (PrivateFile->Dir);
> + PrivateFile->Dir = NULL;
> + }
> +
> + if (rmdir (PrivateFile->FileName) == 0) {
> + Status = EFI_SUCCESS;
> + }
> + } else {
> + close (PrivateFile->fd);
> + PrivateFile->fd = -1;
> +
> + if (!PrivateFile->IsOpenedByRead) {
> + if (!unlink (PrivateFile->FileName)) {
> + Status = EFI_SUCCESS;
> + }
> + }
> + }
> +
> + free (PrivateFile->FileName);
> + free (PrivateFile);
> +
> + return Status;
> +}
> +
> +
> +/**
> + Read data from the file.
> +
> + @param This Protocol instance pointer.
> + @param BufferSize On input size of buffer, on output amount of data in
> buffer.
> + @param Buffer The buffer in which data is read.
> +
> + @retval EFI_SUCCESS Data was read.
> + @retval EFI_NO_MEDIA The device has no media.
> + @retval EFI_DEVICE_ERROR The device reported an error.
> + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> + @retval EFI_BUFFER_TO_SMALL BufferSize is too small. BufferSize contains
> required size.
> +
> +**/
> +EFI_STATUS
> +PosixFileRead (
> + IN EFI_FILE_PROTOCOL *This,
> + IN OUT UINTN *BufferSize,
> + OUT VOID *Buffer
> + )
> +{
> + EMU_EFI_FILE_PRIVATE *PrivateFile;
> + EFI_STATUS Status;
> + int Res;
> + UINTN Size;
> + UINTN NameSize;
> + UINTN ResultSize;
> + CHAR8 *FullFileName;
> +
> +
> + PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> +
> + if (!PrivateFile->IsDirectoryPath) {
> + if (PrivateFile->fd < 0) {
> + Status = EFI_DEVICE_ERROR;
> + goto Done;
> + }
> +
> + Res = read (PrivateFile->fd, Buffer, *BufferSize);
> + if (Res < 0) {
> + Status = EFI_DEVICE_ERROR;
> + goto Done;
> + }
> + *BufferSize = Res;
> + Status = EFI_SUCCESS;
> + goto Done;
> + }
> +
> + //
> + // Read on a directory.
> + //
> + if (PrivateFile->Dir == NULL) {
> + Status = EFI_DEVICE_ERROR;
> + goto Done;
> + }
> +
> + if (PrivateFile->Dirent == NULL) {
> + PrivateFile->Dirent = readdir (PrivateFile->Dir);
> + if (PrivateFile->Dirent == NULL) {
> + *BufferSize = 0;
> + Status = EFI_SUCCESS;
> + goto Done;
> + }
> + }
> +
> + Size = SIZE_OF_EFI_FILE_INFO;
> + NameSize = AsciiStrLen (PrivateFile->Dirent->d_name) + 1;
> + ResultSize = Size + 2 * NameSize;
> +
> + if (*BufferSize < ResultSize) {
> + *BufferSize = ResultSize;
> + Status = EFI_BUFFER_TOO_SMALL;
> + goto Done;
> + }
> + Status = EFI_SUCCESS;
> +
> + *BufferSize = ResultSize;
> +
> + FullFileName = malloc (AsciiStrLen(PrivateFile->FileName) + 1 + NameSize);
> + if (FullFileName == NULL) {
> + Status = EFI_OUT_OF_RESOURCES;
> + goto Done;
> + }
> +
> + AsciiStrCpy (FullFileName, PrivateFile->FileName);
> + AsciiStrCat (FullFileName, "/");
> + AsciiStrCat (FullFileName, PrivateFile->Dirent->d_name);
> + Status = UnixSimpleFileSystemFileInfo (
> + PrivateFile,
> + FullFileName,
> + BufferSize,
> + Buffer
> + );
> + free (FullFileName);
> +
> + PrivateFile->Dirent = NULL;
> +
> +Done:
> + return Status;
> +}
> +
> +
> +
> +/**
> + Write data to a file.
> +
> + @param This Protocol instance pointer.
> + @param BufferSize On input size of buffer, on output amount of data in
> buffer.
> + @param Buffer The buffer in which data to write.
> +
> + @retval EFI_SUCCESS Data was written.
> + @retval EFI_UNSUPPORTED Writes to Open directory are not supported.
> + @retval EFI_NO_MEDIA The device has no media.
> + @retval EFI_DEVICE_ERROR The device reported an error.
> + @retval EFI_DEVICE_ERROR An attempt was made to write to a deleted
> file.
> + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> + @retval EFI_WRITE_PROTECTED The device is write protected.
> + @retval EFI_ACCESS_DENIED The file was open for read only.
> + @retval EFI_VOLUME_FULL The volume is full.
> +
> +**/
> +EFI_STATUS
> +PosixFileWrite (
> + IN EFI_FILE_PROTOCOL *This,
> + IN OUT UINTN *BufferSize,
> + IN VOID *Buffer
> + )
> +{
> + EMU_EFI_FILE_PRIVATE *PrivateFile;
> + int Res;
> +
> +
> + PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> +
> + if (PrivateFile->fd < 0) {
> + return EFI_DEVICE_ERROR;
> + }
> +
> + if (PrivateFile->IsDirectoryPath) {
> + return EFI_UNSUPPORTED;
> + }
> +
> + if (PrivateFile->IsOpenedByRead) {
> + return EFI_ACCESS_DENIED;
> + }
> +
> + Res = write (PrivateFile->fd, Buffer, *BufferSize);
> + if (Res == (UINTN)-1) {
> + return ErrnoToEfiStatus ();
> + }
> +
> + *BufferSize = Res;
> + return EFI_SUCCESS;
> +}
> +
> +
> +
> +/**
> + Set a files current position
> +
> + @param This Protocol instance pointer.
> + @param Position Byte position from the start of the file.
> +
> + @retval EFI_SUCCESS Data was written.
> + @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open.
> +
> +**/
> +EFI_STATUS
> +PosixFileSetPossition (
> + IN EFI_FILE_PROTOCOL *This,
> + IN UINT64 Position
> + )
> +{
> + EMU_EFI_FILE_PRIVATE *PrivateFile;
> + off_t Pos;
> +
> + PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> +
> + if (PrivateFile->IsDirectoryPath) {
> + if (Position != 0) {
> + return EFI_UNSUPPORTED;
> + }
> +
> + if (PrivateFile->Dir == NULL) {
> + return EFI_DEVICE_ERROR;
> + }
> + rewinddir (PrivateFile->Dir);
> + return EFI_SUCCESS;
> + } else {
> + if (Position == (UINT64) -1) {
> + Pos = lseek (PrivateFile->fd, 0, SEEK_END);
> + } else {
> + Pos = lseek (PrivateFile->fd, Position, SEEK_SET);
> + }
> + if (Pos == (off_t)-1) {
> + return ErrnoToEfiStatus ();
> + }
> + return EFI_SUCCESS;
> + }
> +}
> +
> +
> +
> +/**
> + Get a file's current position
> +
> + @param This Protocol instance pointer.
> + @param Position Byte position from the start of the file.
> +
> + @retval EFI_SUCCESS Data was written.
> + @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open..
> +
> +**/
> +EFI_STATUS
> +PosixFileGetPossition (
> + IN EFI_FILE_PROTOCOL *This,
> + OUT UINT64 *Position
> + )
> +{
> + EFI_STATUS Status;
> + EMU_EFI_FILE_PRIVATE *PrivateFile;
> +
> + PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> +
> + if (PrivateFile->IsDirectoryPath) {
> + Status = EFI_UNSUPPORTED;
> + } else {
> + *Position = (UINT64)lseek (PrivateFile->fd, 0, SEEK_CUR);
> + Status = (*Position == (UINT64) -1) ? ErrnoToEfiStatus () : EFI_SUCCESS;
> + }
> +
> + return Status;
> +}
> +
> +
> +/**
> + Get information about a file.
> +
> + @param This Protocol instance pointer.
> + @param InformationType Type of information to return in Buffer.
> + @param BufferSize On input size of buffer, on output amount of data in
> buffer.
> + @param Buffer The buffer to return data.
> +
> + @retval EFI_SUCCESS Data was returned.
> + @retval EFI_UNSUPPORTED InformationType is not supported.
> + @retval EFI_NO_MEDIA The device has no media.
> + @retval EFI_DEVICE_ERROR The device reported an error.
> + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> + @retval EFI_WRITE_PROTECTED The device is write protected.
> + @retval EFI_ACCESS_DENIED The file was open for read only.
> + @retval EFI_BUFFER_TOO_SMALL Buffer was too small; required size
> returned in BufferSize.
> +
> +**/
> +EFI_STATUS
> +PosixFileGetInfo (
> + IN EFI_FILE_PROTOCOL *This,
> + IN EFI_GUID *InformationType,
> + IN OUT UINTN *BufferSize,
> + OUT VOID *Buffer
> + )
> +{
> + EFI_STATUS Status;
> + EMU_EFI_FILE_PRIVATE *PrivateFile;
> + EFI_FILE_SYSTEM_INFO *FileSystemInfoBuffer;
> + int UnixStatus;
> + EMU_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;
> + struct statfs buf;
> +
> + PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> + PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS
> (PrivateFile->SimpleFileSystem);
> +
> + Status = EFI_SUCCESS;
> + if (CompareGuid (InformationType, &gEfiFileInfoGuid)) {
> + Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, BufferSize, Buffer);
> + } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
> + if (*BufferSize < SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel)) {
> + *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel);
> + return EFI_BUFFER_TOO_SMALL;
> + }
> +
> + UnixStatus = statfs (PrivateFile->FileName, &buf);
> + if (UnixStatus < 0) {
> + return EFI_DEVICE_ERROR;
> + }
> +
> + FileSystemInfoBuffer = (EFI_FILE_SYSTEM_INFO *) Buffer;
> + FileSystemInfoBuffer->Size = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize
> (PrivateRoot->VolumeLabel);
> + FileSystemInfoBuffer->ReadOnly = FALSE;
> +
> + //
> + // Succeeded
> + //
> + FileSystemInfoBuffer->VolumeSize = MultU64x32 (buf.f_blocks, buf.f_bsize);
> + FileSystemInfoBuffer->FreeSpace = MultU64x32 (buf.f_bavail, buf.f_bsize);
> + FileSystemInfoBuffer->BlockSize = buf.f_bsize;
> +
> +
> + StrCpy ((CHAR16 *) FileSystemInfoBuffer->VolumeLabel, PrivateRoot-
> >VolumeLabel);
> + *BufferSize = SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel);
> +
> + } else if (CompareGuid (InformationType,
> &gEfiFileSystemVolumeLabelInfoIdGuid)) {
> + if (*BufferSize < StrSize (PrivateRoot->VolumeLabel)) {
> + *BufferSize = StrSize (PrivateRoot->VolumeLabel);
> + return EFI_BUFFER_TOO_SMALL;
> + }
> +
> + StrCpy ((CHAR16 *) Buffer, PrivateRoot->VolumeLabel);
> + *BufferSize = StrSize (PrivateRoot->VolumeLabel);
> +
> + }
> +
> + return Status;
> +}
> +
> +
> +/**
> + Set information about a file
> +
> + @param File Protocol instance pointer.
> + @param InformationType Type of information in Buffer.
> + @param BufferSize Size of buffer.
> + @param Buffer The data to write.
> +
> + @retval EFI_SUCCESS Data was returned.
> + @retval EFI_UNSUPPORTED InformationType is not supported.
> + @retval EFI_NO_MEDIA The device has no media.
> + @retval EFI_DEVICE_ERROR The device reported an error.
> + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> + @retval EFI_WRITE_PROTECTED The device is write protected.
> + @retval EFI_ACCESS_DENIED The file was open for read only.
> +
> +**/
> +EFI_STATUS
> +PosixFileSetInfo (
> + IN EFI_FILE_PROTOCOL *This,
> + IN EFI_GUID *InformationType,
> + IN UINTN BufferSize,
> + IN VOID *Buffer
> + )
> +{
> + EMU_SIMPLE_FILE_SYSTEM_PRIVATE *PrivateRoot;
> + EMU_EFI_FILE_PRIVATE *PrivateFile;
> + EFI_FILE_INFO *OldFileInfo;
> + EFI_FILE_INFO *NewFileInfo;
> + EFI_STATUS Status;
> + UINTN OldInfoSize;
> + mode_t NewAttr;
> + struct stat OldAttr;
> + CHAR8 *OldFileName;
> + CHAR8 *NewFileName;
> + CHAR8 *CharPointer;
> + BOOLEAN AttrChangeFlag;
> + BOOLEAN NameChangeFlag;
> + BOOLEAN SizeChangeFlag;
> + BOOLEAN TimeChangeFlag;
> + struct tm NewLastAccessSystemTime;
> + struct tm NewLastWriteSystemTime;
> + EFI_FILE_SYSTEM_INFO *NewFileSystemInfo;
> + CHAR8 *AsciiFilePtr;
> + CHAR16 *UnicodeFilePtr;
> + int UnixStatus;
> + struct utimbuf Utime;
> +
> +
> + PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> + PrivateRoot = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS
> (PrivateFile->SimpleFileSystem);
> + errno = 0;
> + Status = EFI_UNSUPPORTED;
> + OldFileInfo = NewFileInfo = NULL;
> + OldFileName = NewFileName = NULL;
> + AttrChangeFlag = NameChangeFlag = SizeChangeFlag = TimeChangeFlag =
> FALSE;
> +
> + //
> + // Set file system information.
> + //
> + if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) {
> + if (BufferSize < (SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot-
> >VolumeLabel))) {
> + Status = EFI_BAD_BUFFER_SIZE;
> + goto Done;
> + }
> +
> + NewFileSystemInfo = (EFI_FILE_SYSTEM_INFO *) Buffer;
> +
> + free (PrivateRoot->VolumeLabel);
> +
> + PrivateRoot->VolumeLabel = malloc (StrSize (NewFileSystemInfo-
> >VolumeLabel));
> + if (PrivateRoot->VolumeLabel == NULL) {
> + goto Done;
> + }
> +
> + StrCpy (PrivateRoot->VolumeLabel, NewFileSystemInfo->VolumeLabel);
> +
> + Status = EFI_SUCCESS;
> + goto Done;
> + }
> +
> + //
> + // Set volume label information.
> + //
> + if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid))
> {
> + if (BufferSize < StrSize (PrivateRoot->VolumeLabel)) {
> + Status = EFI_BAD_BUFFER_SIZE;
> + goto Done;
> + }
> +
> + StrCpy (PrivateRoot->VolumeLabel, (CHAR16 *) Buffer);
> +
> + Status = EFI_SUCCESS;
> + goto Done;
> + }
> +
> + if (!CompareGuid (InformationType, &gEfiFileInfoGuid)) {
> + Status = EFI_UNSUPPORTED;
> + goto Done;
> + }
> +
> + if (BufferSize < SIZE_OF_EFI_FILE_INFO) {
> + Status = EFI_BAD_BUFFER_SIZE;
> + goto Done;
> + }
> +
> + //
> + // Set file/directory information.
> + //
> +
> + //
> + // Check for invalid set file information parameters.
> + //
> + NewFileInfo = (EFI_FILE_INFO *) Buffer;
> + if (NewFileInfo->Size <= sizeof (EFI_FILE_INFO) ||
> + (NewFileInfo->Attribute &~(EFI_FILE_VALID_ATTR)) ||
> + (sizeof (UINTN) == 4 && NewFileInfo->Size > 0xFFFFFFFF)
> + ) {
> + Status = EFI_INVALID_PARAMETER;
> + goto Done;
> + }
> +
> + //
> + // Get current file information so we can determine what kind
> + // of change request this is.
> + //
> + OldInfoSize = 0;
> + Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize,
> NULL);
> + if (Status != EFI_BUFFER_TOO_SMALL) {
> + Status = EFI_DEVICE_ERROR;
> + goto Done;
> + }
> +
> + OldFileInfo = malloc (OldInfoSize);
> + if (OldFileInfo == NULL) {
> + goto Done;
> + }
> +
> + Status = UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSize,
> OldFileInfo);
> + if (EFI_ERROR (Status)) {
> + goto Done;
> + }
> +
> + OldFileName = malloc (AsciiStrSize (PrivateFile->FileName));
> + if (OldFileInfo == NULL) {
> + goto Done;
> + }
> +
> + AsciiStrCpy (OldFileName, PrivateFile->FileName);
> +
> + //
> + // Make full pathname from new filename and rootpath.
> + //
> + if (NewFileInfo->FileName[0] == '\\') {
> + NewFileName = malloc (AsciiStrLen (PrivateRoot->FilePath) + 1 + StrLen
> (NewFileInfo->FileName) + 1);
> + if (NewFileName == NULL) {
> + goto Done;
> + }
> +
> + AsciiStrCpy (NewFileName, PrivateRoot->FilePath);
> + AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);
> + UnicodeFilePtr = NewFileInfo->FileName + 1;
> + *AsciiFilePtr++ ='/';
> + } else {
> + NewFileName = malloc (AsciiStrLen (PrivateFile->FileName) + 2 + StrLen
> (NewFileInfo->FileName) + 1);
> + if (NewFileName == NULL) {
> + goto Done;
> + }
> +
> + AsciiStrCpy (NewFileName, PrivateRoot->FilePath);
> + AsciiFilePtr = NewFileName + AsciiStrLen(NewFileName);
> + if ((AsciiFilePtr[-1] != '/') && (NewFileInfo->FileName[0] != '/')) {
> + // make sure there is a / between Root FilePath and NewFileInfo Filename
> + AsciiFilePtr[0] = '/';
> + AsciiFilePtr[1] = '\0';
> + AsciiFilePtr++;
> + }
> + UnicodeFilePtr = NewFileInfo->FileName;
> + }
> + // Convert to ascii.
> + while (*UnicodeFilePtr) {
> + *AsciiFilePtr++ = *UnicodeFilePtr++;
> + }
> + *AsciiFilePtr = 0;
> +
> + //
> + // Is there an attribute change request?
> + //
> + if (NewFileInfo->Attribute != OldFileInfo->Attribute) {
> + if ((NewFileInfo->Attribute & EFI_FILE_DIRECTORY) != (OldFileInfo-
> >Attribute & EFI_FILE_DIRECTORY)) {
> + Status = EFI_INVALID_PARAMETER;
> + goto Done;
> + }
> +
> + AttrChangeFlag = TRUE;
> + }
> +
> + //
> + // Is there a name change request?
> + // bugbug: - Should really use EFI_UNICODE_COLLATION_PROTOCOL
> + //
> + if (StrCmp (NewFileInfo->FileName, OldFileInfo->FileName)) {
> + NameChangeFlag = TRUE;
> + }
> +
> + //
> + // Is there a size change request?
> + //
> + if (NewFileInfo->FileSize != OldFileInfo->FileSize) {
> + SizeChangeFlag = TRUE;
> + }
> +
> + //
> + // Is there a time stamp change request?
> + //
> + if (!IsZero (&NewFileInfo->CreateTime, sizeof (EFI_TIME)) &&
> + CompareMem (&NewFileInfo->CreateTime, &OldFileInfo->CreateTime,
> sizeof (EFI_TIME))
> + ) {
> + TimeChangeFlag = TRUE;
> + } else if (!IsZero (&NewFileInfo->LastAccessTime, sizeof (EFI_TIME)) &&
> + CompareMem (&NewFileInfo->LastAccessTime, &OldFileInfo-
> >LastAccessTime, sizeof (EFI_TIME))
> + ) {
> + TimeChangeFlag = TRUE;
> + } else if (!IsZero (&NewFileInfo->ModificationTime, sizeof (EFI_TIME)) &&
> + CompareMem (&NewFileInfo->ModificationTime, &OldFileInfo-
> >ModificationTime, sizeof (EFI_TIME))
> + ) {
> + TimeChangeFlag = TRUE;
> + }
> +
> + //
> + // All done if there are no change requests being made.
> + //
> + if (!(AttrChangeFlag || NameChangeFlag || SizeChangeFlag ||
> TimeChangeFlag)) {
> + Status = EFI_SUCCESS;
> + goto Done;
> + }
> +
> + //
> + // Set file or directory information.
> + //
> + if (stat (OldFileName, &OldAttr) != 0) {
> + Status = ErrnoToEfiStatus ();
> + goto Done;
> + }
> +
> + //
> + // Name change.
> + //
> + if (NameChangeFlag) {
> + //
> + // Close the handles first
> + //
> + if (PrivateFile->IsOpenedByRead) {
> + Status = EFI_ACCESS_DENIED;
> + goto Done;
> + }
> +
> + for (CharPointer = NewFileName; *CharPointer != 0 && *CharPointer != L'/';
> CharPointer++) {
> + }
> +
> + if (*CharPointer != 0) {
> + Status = EFI_ACCESS_DENIED;
> + goto Done;
> + }
> +
> + UnixStatus = rename (OldFileName, NewFileName);
> + if (UnixStatus == 0) {
> + //
> + // modify file name
> + //
> + free (PrivateFile->FileName);
> +
> + PrivateFile->FileName = malloc (AsciiStrSize (NewFileName));
> + if (PrivateFile->FileName == NULL) {
> + goto Done;
> + }
> +
> + AsciiStrCpy (PrivateFile->FileName, NewFileName);
> + } else {
> + Status = EFI_DEVICE_ERROR;
> + goto Done;
> + }
> + }
> +
> + //
> + // Size change
> + //
> + if (SizeChangeFlag) {
> + if (PrivateFile->IsDirectoryPath) {
> + Status = EFI_UNSUPPORTED;
> + goto Done;
> + }
> +
> + if (PrivateFile->IsOpenedByRead || OldFileInfo->Attribute &
> EFI_FILE_READ_ONLY) {
> + Status = EFI_ACCESS_DENIED;
> + goto Done;
> + }
> +
> + if (ftruncate (PrivateFile->fd, NewFileInfo->FileSize) != 0) {
> + Status = ErrnoToEfiStatus ();
> + goto Done;
> + }
> +
> + }
> +
> + //
> + // Time change
> + //
> + if (TimeChangeFlag) {
> + NewLastAccessSystemTime.tm_year = NewFileInfo->LastAccessTime.Year;
> + NewLastAccessSystemTime.tm_mon = NewFileInfo-
> >LastAccessTime.Month;
> + NewLastAccessSystemTime.tm_mday = NewFileInfo->LastAccessTime.Day;
> + NewLastAccessSystemTime.tm_hour = NewFileInfo->LastAccessTime.Hour;
> + NewLastAccessSystemTime.tm_min = NewFileInfo-
> >LastAccessTime.Minute;
> + NewLastAccessSystemTime.tm_sec = NewFileInfo-
> >LastAccessTime.Second;
> + NewLastAccessSystemTime.tm_isdst = 0;
> +
> + Utime.actime = mktime (&NewLastAccessSystemTime);
> +
> + NewLastWriteSystemTime.tm_year = NewFileInfo-
> >ModificationTime.Year;
> + NewLastWriteSystemTime.tm_mon = NewFileInfo-
> >ModificationTime.Month;
> + NewLastWriteSystemTime.tm_mday = NewFileInfo-
> >ModificationTime.Day;
> + NewLastWriteSystemTime.tm_hour = NewFileInfo-
> >ModificationTime.Hour;
> + NewLastWriteSystemTime.tm_min = NewFileInfo-
> >ModificationTime.Minute;
> + NewLastWriteSystemTime.tm_sec = NewFileInfo-
> >ModificationTime.Second;
> + NewLastWriteSystemTime.tm_isdst = 0;
> +
> + Utime.modtime = mktime (&NewLastWriteSystemTime);
> +
> + if (Utime.actime == (time_t)-1 || Utime.modtime == (time_t)-1) {
> + goto Done;
> + }
> +
> + if (utime (PrivateFile->FileName, &Utime) == -1) {
> + Status = ErrnoToEfiStatus ();
> + goto Done;
> + }
> + }
> +
> + //
> + // No matter about AttrChangeFlag, Attribute must be set.
> + // Because operation before may cause attribute change.
> + //
> + NewAttr = OldAttr.st_mode;
> +
> + if (NewFileInfo->Attribute & EFI_FILE_READ_ONLY) {
> + NewAttr &= ~(S_IRUSR | S_IRGRP | S_IROTH);
> + } else {
> + NewAttr |= S_IRUSR;
> + }
> +
> + if (chmod (NewFileName, NewAttr) != 0) {
> + Status = ErrnoToEfiStatus ();
> + }
> +
> +Done:
> + if (OldFileInfo != NULL) {
> + free (OldFileInfo);
> + }
> +
> + if (OldFileName != NULL) {
> + free (OldFileName);
> + }
> +
> + if (NewFileName != NULL) {
> + free (NewFileName);
> + }
> +
> + return Status;
> +}
> +
> +
> +/**
> + Flush data back for the file handle.
> +
> + @param This Protocol instance pointer.
> +
> + @retval EFI_SUCCESS Data was written.
> + @retval EFI_UNSUPPORTED Writes to Open directory are not supported.
> + @retval EFI_NO_MEDIA The device has no media.
> + @retval EFI_DEVICE_ERROR The device reported an error.
> + @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
> + @retval EFI_WRITE_PROTECTED The device is write protected.
> + @retval EFI_ACCESS_DENIED The file was open for read only.
> + @retval EFI_VOLUME_FULL The volume is full.
> +
> +**/
> +EFI_STATUS
> +PosixFileFlush (
> + IN EFI_FILE_PROTOCOL *This
> + )
> +{
> + EMU_EFI_FILE_PRIVATE *PrivateFile;
> +
> +
> + PrivateFile = EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This);
> +
> + if (PrivateFile->IsDirectoryPath) {
> + return EFI_UNSUPPORTED;
> + }
> +
> + if (PrivateFile->IsOpenedByRead) {
> + return EFI_ACCESS_DENIED;
> + }
> +
> + if (PrivateFile->fd < 0) {
> + return EFI_DEVICE_ERROR;
> + }
> +
> + if (fsync (PrivateFile->fd) != 0) {
> + return ErrnoToEfiStatus ();
> + }
> +
> + return EFI_SUCCESS;
> +}
> +
> +
> +
> +EFI_STATUS
> +PosixFileSystmeThunkOpen (
> + IN EMU_IO_THUNK_PROTOCOL *This
> + )
> +{
> + EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
> + UINTN i;
> +
> + if (This->Private != NULL) {
> + return EFI_ALREADY_STARTED;
> + }
> +
> + if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {
> + return EFI_UNSUPPORTED;
> + }
> +
> + Private = malloc (sizeof (EMU_SIMPLE_FILE_SYSTEM_PRIVATE));
> + if (Private == NULL) {
> + return EFI_OUT_OF_RESOURCES;
> + }
> +
> + Private->FilePath = malloc (StrLen (This->ConfigString) + 1);
> + if (Private->FilePath == NULL) {
> + free (Private);
> + return EFI_OUT_OF_RESOURCES;
> + }
> +
> + // Convert Unicode to Ascii
> + for (i = 0; This->ConfigString[i] != 0; i++) {
> + Private->FilePath[i] = This->ConfigString[i];
> + }
> + Private->FilePath[i] = 0;
> +
> +
> + Private->VolumeLabel = malloc (StrSize (L"EFI_EMULATED"));
> + if (Private->VolumeLabel == NULL) {
> + free (Private->FilePath);
> + free (Private);
> + return EFI_OUT_OF_RESOURCES;
> + }
> + StrCpy (Private->VolumeLabel, L"EFI_EMULATED");
> +
> + Private->Signature = EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE;
> + Private->Thunk = This;
> + CopyMem (&Private->SimpleFileSystem, &gPosixFileSystemProtocol, sizeof
> (Private->SimpleFileSystem));
> + Private->FileHandlesOpen = FALSE;
> +
> + This->Interface = &Private->SimpleFileSystem;
> + This->Private = Private;
> + return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +PosixFileSystmeThunkClose (
> + IN EMU_IO_THUNK_PROTOCOL *This
> + )
> +{
> + EMU_SIMPLE_FILE_SYSTEM_PRIVATE *Private;
> +
> + if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) {
> + return EFI_UNSUPPORTED;
> + }
> +
> + Private = This->Private;
> +
> + if (Private->FileHandlesOpen) {
> + //
> + // Close only supported if all the EFI_FILE_HANDLEs have been closed.
> + //
> + return EFI_NOT_READY;
> + }
> +
> + if (This->Private != NULL) {
> + if (Private->VolumeLabel != NULL) {
> + free (Private->VolumeLabel);
> + }
> + free (This->Private);
> + This->Private = NULL;
> + }
> +
> + return EFI_SUCCESS;
> +}
> +
> +
> +EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo = {
> + &gEfiSimpleFileSystemProtocolGuid,
> + NULL,
> + NULL,
> + 0,
> + GasketPosixFileSystmeThunkOpen,
> + GasketPosixFileSystmeThunkClose,
> + NULL
> +};
> +
> +
> diff --git a/EmulatorPkg/Unix/Host/Pthreads.c
> b/EmulatorPkg/Unix/Host/Pthreads.c
> index c60c298099..cb9ffeea84 100644
> --- a/EmulatorPkg/Unix/Host/Pthreads.c
> +++ b/EmulatorPkg/Unix/Host/Pthreads.c
> @@ -1,235 +1,235 @@
> -/*++ @file
> - POSIX Pthreads to emulate APs and implement threads
> -
> -Copyright (c) 2011, Apple Inc. All rights reserved.
> -Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
> -
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -
> -**/
> -
> -#include "Host.h"
> -#include <pthread.h>
> -
> -
> -UINTN
> -EFIAPI
> -PthreadMutexLock (
> - IN VOID *Mutex
> - )
> -{
> - return (UINTN)pthread_mutex_lock ((pthread_mutex_t *)Mutex);
> -}
> -
> -
> -
> -UINTN
> -EFIAPI
> -PthreadMutexUnLock (
> - IN VOID *Mutex
> - )
> -{
> - return (UINTN)pthread_mutex_unlock ((pthread_mutex_t *)Mutex);
> -}
> -
> -
> -UINTN
> -EFIAPI
> -PthreadMutexTryLock (
> - IN VOID *Mutex
> - )
> -{
> - return (UINTN)pthread_mutex_trylock ((pthread_mutex_t *)Mutex);
> -}
> -
> -
> -VOID *
> -PthreadMutexInit (
> - IN VOID
> - )
> -{
> - pthread_mutex_t *Mutex;
> - int err;
> -
> - Mutex = malloc (sizeof (pthread_mutex_t));
> - err = pthread_mutex_init (Mutex, NULL);
> - if (err == 0) {
> - return Mutex;
> - }
> -
> - return NULL;
> -}
> -
> -
> -UINTN
> -PthreadMutexDestroy (
> - IN VOID *Mutex
> - )
> -{
> - if (Mutex != NULL) {
> - return pthread_mutex_destroy ((pthread_mutex_t *)Mutex);
> - }
> -
> - return -1;
> -}
> -
> -// Can't store this data on PthreadCreate stack so we need a global
> -typedef struct {
> - pthread_mutex_t Mutex;
> - THREAD_THUNK_THREAD_ENTRY Start;
> -} THREAD_MANGLE;
> -
> -THREAD_MANGLE mThreadMangle = {
> - PTHREAD_MUTEX_INITIALIZER,
> - NULL
> -};
> -
> -VOID *
> -SecFakePthreadStart (
> - VOID *Context
> - )
> -{
> - THREAD_THUNK_THREAD_ENTRY Start;
> - sigset_t SigMask;
> -
> - // Save global on the stack before we unlock
> - Start = mThreadMangle.Start;
> - pthread_mutex_unlock (&mThreadMangle.Mutex);
> -
> - // Mask all signals to the APs
> - sigfillset (&SigMask);
> - pthread_sigmask (SIG_BLOCK, &SigMask, NULL);
> -
> - //
> - // We have to start the thread in SEC as we need to follow
> - // OS X calling conventions. We can then call back into
> - // to the callers Start.
> - //
> - // This is a great example of how all problems in computer
> - // science can be solved by adding another level of indirection
> - //
> - return (VOID *)ReverseGasketUint64 ((CALL_BACK)Start, (UINTN)Context);
> -}
> -
> -UINTN
> -PthreadCreate (
> - IN VOID *Thread,
> - IN VOID *Attribute,
> - IN THREAD_THUNK_THREAD_ENTRY Start,
> - IN VOID *Context
> - )
> -{
> - int err;
> - BOOLEAN EnabledOnEntry;
> -
> - //
> - // Threads inherit interrupt state so disable interrupts before we start thread
> - //
> - if (SecInterruptEanbled ()) {
> - SecDisableInterrupt ();
> - EnabledOnEntry = TRUE;
> - } else {
> - EnabledOnEntry = FALSE;
> - }
> -
> - // Aquire lock for global, SecFakePthreadStart runs in a different thread.
> - pthread_mutex_lock (&mThreadMangle.Mutex);
> - mThreadMangle.Start = Start;
> -
> - err = pthread_create (Thread, Attribute, SecFakePthreadStart, Context);
> - if (err != 0) {
> - // Thread failed to launch so release the lock;
> - pthread_mutex_unlock (&mThreadMangle.Mutex);
> - }
> -
> - if (EnabledOnEntry) {
> - // Restore interrupt state
> - SecEnableInterrupt ();
> - }
> -
> - return err;
> -}
> -
> -
> -VOID
> -PthreadExit (
> - IN VOID *ValuePtr
> - )
> -{
> - pthread_exit (ValuePtr);
> - return;
> -}
> -
> -
> -UINTN
> -PthreadSelf (
> - VOID
> - )
> -{
> - // POSIX currently allows pthread_t to be a structure or arithmetic type.
> - // Check out sys/types.h to make sure this will work if you are porting.
> - // On OS X (Darwin) pthread_t is a pointer to a structure so this code works.
> - return (UINTN)pthread_self ();
> -}
> -
> -
> -EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {
> - GasketPthreadMutexLock,
> - GasketPthreadMutexUnLock,
> - GasketPthreadMutexTryLock,
> - GasketPthreadMutexInit,
> - GasketPthreadMutexDestroy,
> - GasketPthreadCreate,
> - GasketPthreadExit,
> - GasketPthreadSelf
> -};
> -
> -
> -EFI_STATUS
> -PthreadOpen (
> - IN EMU_IO_THUNK_PROTOCOL *This
> - )
> -{
> - if (This->Instance != 0) {
> - // Only single instance is supported
> - return EFI_NOT_FOUND;
> - }
> -
> - if (This->ConfigString[0] == L'0') {
> - // If AP count is zero no need for threads
> - return EFI_NOT_FOUND;
> - }
> -
> - This->Interface = &gPthreadThunk;
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -PthreadClose (
> - IN EMU_IO_THUNK_PROTOCOL *This
> - )
> -{
> - return EFI_SUCCESS;
> -}
> -
> -
> -EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {
> - &gEmuThreadThunkProtocolGuid,
> - NULL,
> - NULL,
> - 0,
> - GasketPthreadOpen,
> - GasketPthreadClose,
> - NULL
> -};
> -
> -
> +/*++ @file
> + POSIX Pthreads to emulate APs and implement threads
> +
> +Copyright (c) 2011, Apple Inc. All rights reserved.
> +Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
> +
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +
> +**/
> +
> +#include "Host.h"
> +#include <pthread.h>
> +
> +
> +UINTN
> +EFIAPI
> +PthreadMutexLock (
> + IN VOID *Mutex
> + )
> +{
> + return (UINTN)pthread_mutex_lock ((pthread_mutex_t *)Mutex);
> +}
> +
> +
> +
> +UINTN
> +EFIAPI
> +PthreadMutexUnLock (
> + IN VOID *Mutex
> + )
> +{
> + return (UINTN)pthread_mutex_unlock ((pthread_mutex_t *)Mutex);
> +}
> +
> +
> +UINTN
> +EFIAPI
> +PthreadMutexTryLock (
> + IN VOID *Mutex
> + )
> +{
> + return (UINTN)pthread_mutex_trylock ((pthread_mutex_t *)Mutex);
> +}
> +
> +
> +VOID *
> +PthreadMutexInit (
> + IN VOID
> + )
> +{
> + pthread_mutex_t *Mutex;
> + int err;
> +
> + Mutex = malloc (sizeof (pthread_mutex_t));
> + err = pthread_mutex_init (Mutex, NULL);
> + if (err == 0) {
> + return Mutex;
> + }
> +
> + return NULL;
> +}
> +
> +
> +UINTN
> +PthreadMutexDestroy (
> + IN VOID *Mutex
> + )
> +{
> + if (Mutex != NULL) {
> + return pthread_mutex_destroy ((pthread_mutex_t *)Mutex);
> + }
> +
> + return -1;
> +}
> +
> +// Can't store this data on PthreadCreate stack so we need a global
> +typedef struct {
> + pthread_mutex_t Mutex;
> + THREAD_THUNK_THREAD_ENTRY Start;
> +} THREAD_MANGLE;
> +
> +THREAD_MANGLE mThreadMangle = {
> + PTHREAD_MUTEX_INITIALIZER,
> + NULL
> +};
> +
> +VOID *
> +SecFakePthreadStart (
> + VOID *Context
> + )
> +{
> + THREAD_THUNK_THREAD_ENTRY Start;
> + sigset_t SigMask;
> +
> + // Save global on the stack before we unlock
> + Start = mThreadMangle.Start;
> + pthread_mutex_unlock (&mThreadMangle.Mutex);
> +
> + // Mask all signals to the APs
> + sigfillset (&SigMask);
> + pthread_sigmask (SIG_BLOCK, &SigMask, NULL);
> +
> + //
> + // We have to start the thread in SEC as we need to follow
> + // OS X calling conventions. We can then call back into
> + // to the callers Start.
> + //
> + // This is a great example of how all problems in computer
> + // science can be solved by adding another level of indirection
> + //
> + return (VOID *)ReverseGasketUint64 ((CALL_BACK)Start, (UINTN)Context);
> +}
> +
> +UINTN
> +PthreadCreate (
> + IN VOID *Thread,
> + IN VOID *Attribute,
> + IN THREAD_THUNK_THREAD_ENTRY Start,
> + IN VOID *Context
> + )
> +{
> + int err;
> + BOOLEAN EnabledOnEntry;
> +
> + //
> + // Threads inherit interrupt state so disable interrupts before we start thread
> + //
> + if (SecInterruptEanbled ()) {
> + SecDisableInterrupt ();
> + EnabledOnEntry = TRUE;
> + } else {
> + EnabledOnEntry = FALSE;
> + }
> +
> + // Aquire lock for global, SecFakePthreadStart runs in a different thread.
> + pthread_mutex_lock (&mThreadMangle.Mutex);
> + mThreadMangle.Start = Start;
> +
> + err = pthread_create (Thread, Attribute, SecFakePthreadStart, Context);
> + if (err != 0) {
> + // Thread failed to launch so release the lock;
> + pthread_mutex_unlock (&mThreadMangle.Mutex);
> + }
> +
> + if (EnabledOnEntry) {
> + // Restore interrupt state
> + SecEnableInterrupt ();
> + }
> +
> + return err;
> +}
> +
> +
> +VOID
> +PthreadExit (
> + IN VOID *ValuePtr
> + )
> +{
> + pthread_exit (ValuePtr);
> + return;
> +}
> +
> +
> +UINTN
> +PthreadSelf (
> + VOID
> + )
> +{
> + // POSIX currently allows pthread_t to be a structure or arithmetic type.
> + // Check out sys/types.h to make sure this will work if you are porting.
> + // On OS X (Darwin) pthread_t is a pointer to a structure so this code works.
> + return (UINTN)pthread_self ();
> +}
> +
> +
> +EMU_THREAD_THUNK_PROTOCOL gPthreadThunk = {
> + GasketPthreadMutexLock,
> + GasketPthreadMutexUnLock,
> + GasketPthreadMutexTryLock,
> + GasketPthreadMutexInit,
> + GasketPthreadMutexDestroy,
> + GasketPthreadCreate,
> + GasketPthreadExit,
> + GasketPthreadSelf
> +};
> +
> +
> +EFI_STATUS
> +PthreadOpen (
> + IN EMU_IO_THUNK_PROTOCOL *This
> + )
> +{
> + if (This->Instance != 0) {
> + // Only single instance is supported
> + return EFI_NOT_FOUND;
> + }
> +
> + if (This->ConfigString[0] == L'0') {
> + // If AP count is zero no need for threads
> + return EFI_NOT_FOUND;
> + }
> +
> + This->Interface = &gPthreadThunk;
> +
> + return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +PthreadClose (
> + IN EMU_IO_THUNK_PROTOCOL *This
> + )
> +{
> + return EFI_SUCCESS;
> +}
> +
> +
> +EMU_IO_THUNK_PROTOCOL gPthreadThunkIo = {
> + &gEmuThreadThunkProtocolGuid,
> + NULL,
> + NULL,
> + 0,
> + GasketPthreadOpen,
> + GasketPthreadClose,
> + NULL
> +};
> +
> +
> diff --git a/EmulatorPkg/Unix/Host/X11GraphicsWindow.c
> b/EmulatorPkg/Unix/Host/X11GraphicsWindow.c
> index adb9b2b830..a3cc28c223 100644
> --- a/EmulatorPkg/Unix/Host/X11GraphicsWindow.c
> +++ b/EmulatorPkg/Unix/Host/X11GraphicsWindow.c
> @@ -1,1028 +1,1028 @@
> -/*++ @file
> -
> -Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
> -Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> -
> -This program and the accompanying materials
> -are licensed and made available under the terms and conditions of the BSD
> License
> -which accompanies this distribution. The full text of the license may be found
> at
> -http://opensource.org/licenses/bsd-license.php
> -
> -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> -
> -**/
> -
> -#include "Host.h"
> -
> -#include <sys/ipc.h>
> -#include <sys/shm.h>
> -
> -#include <X11/Xlib.h>
> -#include <X11/Xutil.h>
> -#include <X11/Xos.h>
> -#include <X11/extensions/XShm.h>
> -#include <X11/keysym.h>
> -#include <X11/cursorfont.h>
> -
> -#define KEYSYM_LOWER 0
> -#define KEYSYM_UPPER 1
> -
> -
> -struct uga_drv_shift_mask {
> - unsigned char shift;
> - unsigned char size;
> - unsigned char csize;
> -};
> -
> -#define NBR_KEYS 32
> -typedef struct {
> - EMU_GRAPHICS_WINDOW_PROTOCOL GraphicsIo;
> -
> - Display *display;
> - int screen; // values for window_size in main
> - Window win;
> - GC gc;
> - Visual *visual;
> -
> - int depth;
> - unsigned int width;
> - unsigned int height;
> - unsigned int line_bytes;
> - unsigned int pixel_shift;
> - unsigned char *image_data;
> -
> - struct uga_drv_shift_mask r, g, b;
> -
> - int use_shm;
> - XShmSegmentInfo xshm_info;
> - XImage *image;
> - char *Title;
> -
> - unsigned int key_rd;
> - unsigned int key_wr;
> - unsigned int key_count;
> - EFI_KEY_DATA keys[NBR_KEYS];
> -
> - EFI_KEY_STATE KeyState;
> -
> - EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> MakeRegisterdKeyCallback;
> - EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> BreakRegisterdKeyCallback;
> - VOID *RegisterdKeyCallbackContext;
> -
> - int previous_x;
> - int previous_y;
> - EFI_SIMPLE_POINTER_STATE pointer_state;
> - int pointer_state_changed;
> -} GRAPHICS_IO_PRIVATE;
> -
> -void
> -HandleEvents(
> - IN GRAPHICS_IO_PRIVATE *Drv
> - );
> -
> -void
> -fill_shift_mask (
> - IN struct uga_drv_shift_mask *sm,
> - IN unsigned long mask
> - )
> -{
> - sm->shift = 0;
> - sm->size = 0;
> - while ((mask & 1) == 0) {
> - mask >>= 1;
> - sm->shift++;
> - }
> - while (mask & 1) {
> - sm->size++;
> - mask >>= 1;
> - }
> - sm->csize = 8 - sm->size;
> -}
> -
> -int
> -TryCreateShmImage (
> - IN GRAPHICS_IO_PRIVATE *Drv
> - )
> -{
> - Drv->image = XShmCreateImage (
> - Drv->display, Drv->visual,
> - Drv->depth, ZPixmap, NULL, &Drv->xshm_info,
> - Drv->width, Drv->height
> - );
> - if (Drv->image == NULL) {
> - return 0;
> - }
> -
> - switch (Drv->image->bitmap_unit) {
> - case 32:
> - Drv->pixel_shift = 2;
> - break;
> - case 16:
> - Drv->pixel_shift = 1;
> - break;
> - case 8:
> - Drv->pixel_shift = 0;
> - break;
> - }
> -
> - Drv->xshm_info.shmid = shmget (
> - IPC_PRIVATE, Drv->image->bytes_per_line * Drv->image-
> >height,
> - IPC_CREAT | 0777
> - );
> - if (Drv->xshm_info.shmid < 0) {
> - XDestroyImage(Drv->image);
> - return 0;
> - }
> -
> - Drv->image_data = shmat (Drv->xshm_info.shmid, NULL, 0);
> - if(!Drv->image_data) {
> - shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
> - XDestroyImage(Drv->image);
> - return 0;
> - }
> -
> -#ifndef __APPLE__
> - //
> - // This closes shared memory in real time on OS X. Only closes after folks quit
> using
> - // it on Linux.
> - //
> - shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
> -#endif
> -
> - Drv->xshm_info.shmaddr = (char*)Drv->image_data;
> - Drv->image->data = (char*)Drv->image_data;
> -
> - if (!XShmAttach (Drv->display, &Drv->xshm_info)) {
> - shmdt (Drv->image_data);
> - XDestroyImage(Drv->image);
> - return 0;
> - }
> - return 1;
> -}
> -
> -
> -EFI_STATUS
> -X11Size (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> - IN UINT32 Width,
> - IN UINT32 Height
> - )
> -{
> - GRAPHICS_IO_PRIVATE *Drv;
> - XSizeHints size_hints;
> -
> - // Destroy current buffer if created.
> - Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> - if (Drv->image != NULL) {
> - // Before destroy buffer, need to make sure the buffer available for access.
> - XDestroyImage (Drv->image);
> -
> - if (Drv->use_shm) {
> - shmdt (Drv->image_data);
> - }
> -
> - Drv->image_data = NULL;
> - Drv->image = NULL;
> - }
> -
> - Drv->width = Width;
> - Drv->height = Height;
> - XResizeWindow (Drv->display, Drv->win, Width, Height);
> -
> - // Allocate image.
> - if (XShmQueryExtension(Drv->display) && TryCreateShmImage(Drv)) {
> - Drv->use_shm = 1;
> - } else {
> - Drv->use_shm = 0;
> - if (Drv->depth > 16) {
> - Drv->pixel_shift = 2;
> - } else if (Drv->depth > 8) {
> - Drv->pixel_shift = 1;
> - } else {
> - Drv->pixel_shift = 0;
> - }
> -
> - Drv->image_data = malloc ((Drv->width * Drv->height) << Drv->pixel_shift);
> - Drv->image = XCreateImage (
> - Drv->display, Drv->visual, Drv->depth,
> - ZPixmap, 0, (char *)Drv->image_data,
> - Drv->width, Drv->height,
> - 8 << Drv->pixel_shift, 0
> - );
> - }
> -
> - Drv->line_bytes = Drv->image->bytes_per_line;
> -
> - fill_shift_mask (&Drv->r, Drv->image->red_mask);
> - fill_shift_mask (&Drv->g, Drv->image->green_mask);
> - fill_shift_mask (&Drv->b, Drv->image->blue_mask);
> -
> - // Set WM hints.
> - size_hints.flags = PSize | PMinSize | PMaxSize;
> - size_hints.min_width = size_hints.max_width = size_hints.base_width = Width;
> - size_hints.min_height = size_hints.max_height = size_hints.base_height =
> Height;
> - XSetWMNormalHints (Drv->display, Drv->win, &size_hints);
> -
> - XMapWindow (Drv->display, Drv->win);
> - HandleEvents (Drv);
> - return EFI_SUCCESS;
> -}
> -
> -void
> -handleKeyEvent (
> - IN GRAPHICS_IO_PRIVATE *Drv,
> - IN XEvent *ev,
> - IN BOOLEAN Make
> - )
> -{
> - KeySym *KeySym;
> - EFI_KEY_DATA KeyData;
> - int KeySymArraySize;
> -
> - if (Make) {
> - if (Drv->key_count == NBR_KEYS) {
> - return;
> - }
> - }
> -
> - // keycode is a physical key on the keyboard
> - // KeySym is a mapping of a physical key
> - // KeyboardMapping is the array of KeySym for a given keycode. key, shifted
> key, option key, command key, ...
> - //
> - // Returns an array of KeySymArraySize of KeySym for the keycode. [0] is
> lower case, [1] is upper case,
> - // [2] and [3] are based on option and command modifiers. The problem we
> have is command V
> - // could be mapped to a crazy Unicode character so the old scheme of
> returning a string.
> - //
> - KeySym = XGetKeyboardMapping (Drv->display, ev->xkey.keycode, 1,
> &KeySymArraySize);
> -
> - KeyData.Key.ScanCode = 0;
> - KeyData.Key.UnicodeChar = 0;
> - KeyData.KeyState.KeyShiftState = 0;
> -
> - //
> - // Skipping EFI_SCROLL_LOCK_ACTIVE & EFI_NUM_LOCK_ACTIVE since they
> are not on Macs
> - //
> - if ((ev->xkey.state & LockMask) == 0) {
> - Drv->KeyState.KeyToggleState &= ~EFI_CAPS_LOCK_ACTIVE;
> - } else {
> - if (Make) {
> - Drv->KeyState.KeyToggleState |= EFI_CAPS_LOCK_ACTIVE;
> - }
> - }
> -
> - // Skipping EFI_MENU_KEY_PRESSED and EFI_SYS_REQ_PRESSED
> -
> - switch (*KeySym) {
> - case XK_Control_R:
> - if (Make) {
> - Drv->KeyState.KeyShiftState |= EFI_RIGHT_CONTROL_PRESSED;
> - } else {
> - Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_CONTROL_PRESSED;
> - }
> - break;
> - case XK_Control_L:
> - if (Make) {
> - Drv->KeyState.KeyShiftState |= EFI_LEFT_CONTROL_PRESSED;
> - } else {
> - Drv->KeyState.KeyShiftState &= ~EFI_LEFT_CONTROL_PRESSED;
> - }
> - break;
> -
> - case XK_Shift_R:
> - if (Make) {
> - Drv->KeyState.KeyShiftState |= EFI_RIGHT_SHIFT_PRESSED;
> - } else {
> - Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_SHIFT_PRESSED;
> - }
> - break;
> - case XK_Shift_L:
> - if (Make) {
> - Drv->KeyState.KeyShiftState |= EFI_LEFT_SHIFT_PRESSED;
> - } else {
> - Drv->KeyState.KeyShiftState &= ~EFI_LEFT_SHIFT_PRESSED;
> - }
> - break;
> -
> - case XK_Mode_switch:
> - if (Make) {
> - Drv->KeyState.KeyShiftState |= EFI_LEFT_ALT_PRESSED;
> - } else {
> - Drv->KeyState.KeyShiftState &= ~EFI_LEFT_ALT_PRESSED;
> - }
> - break;
> -
> - case XK_Meta_R:
> - if (Make) {
> - Drv->KeyState.KeyShiftState |= EFI_RIGHT_LOGO_PRESSED;
> - } else {
> - Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_LOGO_PRESSED;
> - }
> - break;
> - case XK_Meta_L:
> - if (Make) {
> - Drv->KeyState.KeyShiftState |= EFI_LEFT_LOGO_PRESSED;
> - } else {
> - Drv->KeyState.KeyShiftState &= ~EFI_LEFT_LOGO_PRESSED;
> - }
> - break;
> -
> - case XK_KP_Home:
> - case XK_Home: KeyData.Key.ScanCode = SCAN_HOME; break;
> -
> - case XK_KP_End:
> - case XK_End: KeyData.Key.ScanCode = SCAN_END; break;
> -
> - case XK_KP_Left:
> - case XK_Left: KeyData.Key.ScanCode = SCAN_LEFT; break;
> -
> - case XK_KP_Right:
> - case XK_Right: KeyData.Key.ScanCode = SCAN_RIGHT; break;
> -
> - case XK_KP_Up:
> - case XK_Up: KeyData.Key.ScanCode = SCAN_UP; break;
> -
> - case XK_KP_Down:
> - case XK_Down: KeyData.Key.ScanCode = SCAN_DOWN; break;
> -
> - case XK_KP_Delete:
> - case XK_Delete: KeyData.Key.ScanCode = SCAN_DELETE; break;
> -
> - case XK_KP_Insert:
> - case XK_Insert: KeyData.Key.ScanCode = SCAN_INSERT; break;
> -
> - case XK_KP_Page_Up:
> - case XK_Page_Up: KeyData.Key.ScanCode = SCAN_PAGE_UP; break;
> -
> - case XK_KP_Page_Down:
> - case XK_Page_Down: KeyData.Key.ScanCode = SCAN_PAGE_DOWN; break;
> -
> - case XK_Escape: KeyData.Key.ScanCode = SCAN_ESC; break;
> -
> - case XK_Pause: KeyData.Key.ScanCode = SCAN_PAUSE; break;
> -
> - case XK_KP_F1:
> - case XK_F1: KeyData.Key.ScanCode = SCAN_F1; break;
> -
> - case XK_KP_F2:
> - case XK_F2: KeyData.Key.ScanCode = SCAN_F2; break;
> -
> - case XK_KP_F3:
> - case XK_F3: KeyData.Key.ScanCode = SCAN_F3; break;
> -
> - case XK_KP_F4:
> - case XK_F4: KeyData.Key.ScanCode = SCAN_F4; break;
> -
> - case XK_F5: KeyData.Key.ScanCode = SCAN_F5; break;
> - case XK_F6: KeyData.Key.ScanCode = SCAN_F6; break;
> - case XK_F7: KeyData.Key.ScanCode = SCAN_F7; break;
> -
> - // Don't map into X11 by default on a Mac
> - // System Preferences->Keyboard->Keyboard Shortcuts can be configured
> - // to not use higher function keys as shortcuts and the will show up
> - // in X11.
> - case XK_F8: KeyData.Key.ScanCode = SCAN_F8; break;
> - case XK_F9: KeyData.Key.ScanCode = SCAN_F9; break;
> - case XK_F10: KeyData.Key.ScanCode = SCAN_F10; break;
> -
> - case XK_F11: KeyData.Key.ScanCode = SCAN_F11; break;
> - case XK_F12: KeyData.Key.ScanCode = SCAN_F12; break;
> -
> - case XK_F13: KeyData.Key.ScanCode = SCAN_F13; break;
> - case XK_F14: KeyData.Key.ScanCode = SCAN_F14; break;
> - case XK_F15: KeyData.Key.ScanCode = SCAN_F15; break;
> - case XK_F16: KeyData.Key.ScanCode = SCAN_F16; break;
> - case XK_F17: KeyData.Key.ScanCode = SCAN_F17; break;
> - case XK_F18: KeyData.Key.ScanCode = SCAN_F18; break;
> - case XK_F19: KeyData.Key.ScanCode = SCAN_F19; break;
> - case XK_F20: KeyData.Key.ScanCode = SCAN_F20; break;
> - case XK_F21: KeyData.Key.ScanCode = SCAN_F21; break;
> - case XK_F22: KeyData.Key.ScanCode = SCAN_F22; break;
> - case XK_F23: KeyData.Key.ScanCode = SCAN_F23; break;
> - case XK_F24: KeyData.Key.ScanCode = SCAN_F24; break;
> -
> - // No mapping in X11
> - //case XK_: KeyData.Key.ScanCode = SCAN_MUTE; break;
> - //case XK_: KeyData.Key.ScanCode = SCAN_VOLUME_UP; break;
> - //case XK_: KeyData.Key.ScanCode = SCAN_VOLUME_DOWN; break;
> - //case XK_: KeyData.Key.ScanCode = SCAN_BRIGHTNESS_UP; break;
> - //case XK_: KeyData.Key.ScanCode = SCAN_BRIGHTNESS_DOWN; break;
> - //case XK_: KeyData.Key.ScanCode = SCAN_SUSPEND; break;
> - //case XK_: KeyData.Key.ScanCode = SCAN_HIBERNATE; break;
> - //case XK_: KeyData.Key.ScanCode = SCAN_TOGGLE_DISPLAY; break;
> - //case XK_: KeyData.Key.ScanCode = SCAN_RECOVERY; break;
> - //case XK_: KeyData.Key.ScanCode = SCAN_EJECT; break;
> -
> - case XK_BackSpace: KeyData.Key.UnicodeChar = 0x0008; break;
> -
> - case XK_KP_Tab:
> - case XK_Tab: KeyData.Key.UnicodeChar = 0x0009; break;
> -
> - case XK_Linefeed: KeyData.Key.UnicodeChar = 0x000a; break;
> -
> - case XK_KP_Enter:
> - case XK_Return: KeyData.Key.UnicodeChar = 0x000d; break;
> -
> - case XK_KP_Equal : KeyData.Key.UnicodeChar = L'='; break;
> - case XK_KP_Multiply : KeyData.Key.UnicodeChar = L'*'; break;
> - case XK_KP_Add : KeyData.Key.UnicodeChar = L'+'; break;
> - case XK_KP_Separator : KeyData.Key.UnicodeChar = L'~'; break;
> - case XK_KP_Subtract : KeyData.Key.UnicodeChar = L'-'; break;
> - case XK_KP_Decimal : KeyData.Key.UnicodeChar = L'.'; break;
> - case XK_KP_Divide : KeyData.Key.UnicodeChar = L'/'; break;
> -
> - case XK_KP_0 : KeyData.Key.UnicodeChar = L'0'; break;
> - case XK_KP_1 : KeyData.Key.UnicodeChar = L'1'; break;
> - case XK_KP_2 : KeyData.Key.UnicodeChar = L'2'; break;
> - case XK_KP_3 : KeyData.Key.UnicodeChar = L'3'; break;
> - case XK_KP_4 : KeyData.Key.UnicodeChar = L'4'; break;
> - case XK_KP_5 : KeyData.Key.UnicodeChar = L'5'; break;
> - case XK_KP_6 : KeyData.Key.UnicodeChar = L'6'; break;
> - case XK_KP_7 : KeyData.Key.UnicodeChar = L'7'; break;
> - case XK_KP_8 : KeyData.Key.UnicodeChar = L'8'; break;
> - case XK_KP_9 : KeyData.Key.UnicodeChar = L'9'; break;
> -
> - default:
> - ;
> - }
> -
> - // The global state is our state
> - KeyData.KeyState.KeyShiftState = Drv->KeyState.KeyShiftState;
> - KeyData.KeyState.KeyToggleState = Drv->KeyState.KeyToggleState;
> -
> - if (*KeySym < XK_BackSpace) {
> - if (((Drv->KeyState.KeyShiftState & (EFI_LEFT_SHIFT_PRESSED |
> EFI_RIGHT_SHIFT_PRESSED)) != 0) ||
> - ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) != 0) ) {
> -
> - KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_UPPER];
> -
> - // Per UEFI spec since we converted the Unicode clear the shift bits we
> pass up
> - KeyData.KeyState.KeyShiftState &= ~(EFI_LEFT_SHIFT_PRESSED |
> EFI_RIGHT_SHIFT_PRESSED);
> - } else {
> - KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_LOWER];
> - }
> - } else {
> - // XK_BackSpace is the start of XK_MISCELLANY. These are the XK_? keys we
> process in this file
> - ;
> - }
> -
> - if (Make) {
> - memcpy (&Drv->keys[Drv->key_wr], &KeyData, sizeof (EFI_KEY_DATA));
> - Drv->key_wr = (Drv->key_wr + 1) % NBR_KEYS;
> - Drv->key_count++;
> - if (Drv->MakeRegisterdKeyCallback != NULL) {
> - ReverseGasketUint64Uint64 (Drv->MakeRegisterdKeyCallback ,Drv-
> >RegisterdKeyCallbackContext, &KeyData);
> - }
> - } else {
> - if (Drv->BreakRegisterdKeyCallback != NULL) {
> - ReverseGasketUint64Uint64 (Drv->BreakRegisterdKeyCallback ,Drv-
> >RegisterdKeyCallbackContext, &KeyData);
> - }
> - }
> -}
> -
> -
> -void
> -handleMouseMoved(
> - IN GRAPHICS_IO_PRIVATE *Drv,
> - IN XEvent *ev
> - )
> -{
> - if (ev->xmotion.x != Drv->previous_x) {
> - Drv->pointer_state.RelativeMovementX += ( ev->xmotion.x - Drv-
> >previous_x );
> - Drv->previous_x = ev->xmotion.x;
> - Drv->pointer_state_changed = 1;
> - }
> -
> - if (ev->xmotion.y != Drv->previous_y) {
> - Drv->pointer_state.RelativeMovementY += ( ev->xmotion.y - Drv-
> >previous_y );
> - Drv->previous_y = ev->xmotion.y;
> - Drv->pointer_state_changed = 1;
> - }
> -
> - Drv->pointer_state.RelativeMovementZ = 0;
> -}
> -
> -void
> -handleMouseDown (
> - IN GRAPHICS_IO_PRIVATE *Drv,
> - IN XEvent *ev,
> - IN BOOLEAN Pressed
> - )
> -{
> - if (ev->xbutton.button == Button1) {
> - Drv->pointer_state_changed = (Drv->pointer_state.LeftButton != Pressed);
> - Drv->pointer_state.LeftButton = Pressed;
> - }
> - if ( ev->xbutton.button == Button2 ) {
> - Drv->pointer_state_changed = (Drv->pointer_state.RightButton != Pressed);
> - Drv->pointer_state.RightButton = Pressed;
> - }
> -}
> -
> -void
> -Redraw (
> - IN GRAPHICS_IO_PRIVATE *Drv,
> - IN UINTN X,
> - IN UINTN Y,
> - IN UINTN Width,
> - IN UINTN Height
> - )
> -{
> - if (Drv->use_shm) {
> - XShmPutImage (
> - Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height,
> False
> - );
> - } else {
> - XPutImage (
> - Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height
> - );
> - }
> - XFlush(Drv->display);
> -}
> -
> -void
> -HandleEvent(GRAPHICS_IO_PRIVATE *Drv, XEvent *ev)
> -{
> - switch (ev->type) {
> - case Expose:
> - Redraw (Drv, ev->xexpose.x, ev->xexpose.y,
> - ev->xexpose.width, ev->xexpose.height);
> - break;
> - case GraphicsExpose:
> - Redraw (Drv, ev->xgraphicsexpose.x, ev->xgraphicsexpose.y,
> - ev->xgraphicsexpose.width, ev->xgraphicsexpose.height);
> - break;
> - case KeyPress:
> - handleKeyEvent (Drv, ev, TRUE);
> - break;
> - case KeyRelease:
> - handleKeyEvent (Drv, ev, FALSE);
> - break;
> - case MappingNotify:
> - XRefreshKeyboardMapping (&ev->xmapping);
> - break;
> - case MotionNotify:
> - handleMouseMoved (Drv, ev);
> - break;
> - case ButtonPress:
> - handleMouseDown (Drv, ev, TRUE);
> - break;
> - case ButtonRelease:
> - handleMouseDown (Drv, ev, FALSE);
> - break;
> -#if 0
> - case DestroyNotify:
> - XCloseDisplay (Drv->display);
> - exit (1);
> - break;
> -#endif
> - case NoExpose:
> - default:
> - break;
> - }
> -}
> -
> -void
> -HandleEvents (
> - IN GRAPHICS_IO_PRIVATE *Drv
> - )
> -{
> - XEvent ev;
> -
> - while (XPending (Drv->display) != 0) {
> - XNextEvent (Drv->display, &ev);
> - HandleEvent (Drv, &ev);
> - }
> -}
> -
> -unsigned long
> -X11PixelToColor (
> - IN GRAPHICS_IO_PRIVATE *Drv,
> - IN EFI_UGA_PIXEL pixel
> - )
> -{
> - return ((pixel.Red >> Drv->r.csize) << Drv->r.shift)
> - | ((pixel.Green >> Drv->g.csize) << Drv->g.shift)
> - | ((pixel.Blue >> Drv->b.csize) << Drv->b.shift);
> -}
> -
> -EFI_UGA_PIXEL
> -X11ColorToPixel (
> - IN GRAPHICS_IO_PRIVATE *Drv,
> - IN unsigned long val
> - )
> -{
> - EFI_UGA_PIXEL Pixel;
> -
> - memset (&Pixel, 0, sizeof (EFI_UGA_PIXEL));
> -
> - // Truncation not an issue since X11 and EFI are both using 8 bits per color
> - Pixel.Red = (val >> Drv->r.shift) << Drv->r.csize;
> - Pixel.Green = (val >> Drv->g.shift) << Drv->g.csize;
> - Pixel.Blue = (val >> Drv->b.shift) << Drv->b.csize;
> -
> - return Pixel;
> -}
> -
> -
> -EFI_STATUS
> -X11CheckKey (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo
> - )
> -{
> - GRAPHICS_IO_PRIVATE *Drv;
> -
> - Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> -
> - HandleEvents (Drv);
> -
> - if (Drv->key_count != 0) {
> - return EFI_SUCCESS;
> - }
> -
> - return EFI_NOT_READY;
> -}
> -
> -EFI_STATUS
> -X11GetKey (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> - IN EFI_KEY_DATA *KeyData
> - )
> -{
> - EFI_STATUS EfiStatus;
> - GRAPHICS_IO_PRIVATE *Drv;
> -
> - Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> -
> - EfiStatus = X11CheckKey (GraphicsIo);
> - if (EFI_ERROR (EfiStatus)) {
> - return EfiStatus;
> - }
> -
> - CopyMem (KeyData, &Drv->keys[Drv->key_rd], sizeof (EFI_KEY_DATA));
> - Drv->key_rd = (Drv->key_rd + 1) % NBR_KEYS;
> - Drv->key_count--;
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -X11KeySetState (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> - IN EFI_KEY_TOGGLE_STATE *KeyToggleState
> - )
> -{
> - GRAPHICS_IO_PRIVATE *Drv;
> -
> - Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> -
> - if (*KeyToggleState & EFI_CAPS_LOCK_ACTIVE) {
> - if ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) == 0) {
> - //
> - // We could create an XKeyEvent and send a XK_Caps_Lock to
> - // the UGA/GOP Window
> - //
> - }
> - }
> -
> - Drv->KeyState.KeyToggleState = *KeyToggleState;
> - return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -X11RegisterKeyNotify (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> - IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> MakeCallBack,
> - IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> BreakCallBack,
> - IN VOID *Context
> - )
> -{
> - GRAPHICS_IO_PRIVATE *Drv;
> -
> - Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> -
> - Drv->MakeRegisterdKeyCallback = MakeCallBack;
> - Drv->BreakRegisterdKeyCallback = BreakCallBack;
> - Drv->RegisterdKeyCallbackContext = Context;
> -
> - return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -X11Blt (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> - IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
> - IN EFI_UGA_BLT_OPERATION BltOperation,
> - IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args
> - )
> -{
> - GRAPHICS_IO_PRIVATE *Private;
> - UINTN DstY;
> - UINTN SrcY;
> - UINTN DstX;
> - UINTN SrcX;
> - UINTN Index;
> - EFI_UGA_PIXEL *Blt;
> - UINT8 *Dst;
> - UINT8 *Src;
> - UINTN Nbr;
> - unsigned long Color;
> - XEvent ev;
> -
> - Private = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> -
> -
> - //
> - // Check bounds
> - //
> - if (BltOperation == EfiUgaVideoToBltBuffer
> - || BltOperation == EfiUgaVideoToVideo) {
> - //
> - // Source is Video.
> - //
> - if (Args->SourceY + Args->Height > Private->height) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (Args->SourceX + Args->Width > Private->width) {
> - return EFI_INVALID_PARAMETER;
> - }
> - }
> -
> - if (BltOperation == EfiUgaBltBufferToVideo
> - || BltOperation == EfiUgaVideoToVideo
> - || BltOperation == EfiUgaVideoFill) {
> - //
> - // Destination is Video
> - //
> - if (Args->DestinationY + Args->Height > Private->height) {
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - if (Args->DestinationX + Args->Width > Private->width) {
> - return EFI_INVALID_PARAMETER;
> - }
> - }
> -
> - switch (BltOperation) {
> - case EfiUgaVideoToBltBuffer:
> - Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->DestinationY * Args-
> >Delta) + Args->DestinationX * sizeof (EFI_UGA_PIXEL));
> - Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);
> - for (SrcY = Args->SourceY; SrcY < (Args->Height + Args->SourceY); SrcY++) {
> - for (SrcX = Args->SourceX; SrcX < (Args->Width + Args->SourceX); SrcX++) {
> - *Blt++ = X11ColorToPixel (Private, XGetPixel (Private->image, SrcX, SrcY));
> - }
> - Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);
> - }
> - break;
> - case EfiUgaBltBufferToVideo:
> - Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->SourceY * Args->Delta)
> + Args->SourceX * sizeof (EFI_UGA_PIXEL));
> - Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);
> - for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY);
> DstY++) {
> - for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX);
> DstX++) {
> - XPutPixel(Private->image, DstX, DstY, X11PixelToColor(Private, *Blt));
> - Blt++;
> - }
> - Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);
> - }
> - break;
> - case EfiUgaVideoToVideo:
> - Dst = Private->image_data + (Args->DestinationX << Private->pixel_shift)
> - + Args->DestinationY * Private->line_bytes;
> - Src = Private->image_data + (Args->SourceX << Private->pixel_shift)
> - + Args->SourceY * Private->line_bytes;
> - Nbr = Args->Width << Private->pixel_shift;
> - if (Args->DestinationY < Args->SourceY) {
> - for (Index = 0; Index < Args->Height; Index++) {
> - memcpy (Dst, Src, Nbr);
> - Dst += Private->line_bytes;
> - Src += Private->line_bytes;
> - }
> - } else {
> - Dst += (Args->Height - 1) * Private->line_bytes;
> - Src += (Args->Height - 1) * Private->line_bytes;
> - for (Index = 0; Index < Args->Height; Index++) {
> - //
> - // Source and Destination Y may be equal, therefore Dst and Src may
> - // overlap.
> - //
> - memmove (Dst, Src, Nbr);
> - Dst -= Private->line_bytes;
> - Src -= Private->line_bytes;
> - }
> - }
> - break;
> - case EfiUgaVideoFill:
> - Color = X11PixelToColor(Private, *BltBuffer);
> - for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY);
> DstY++) {
> - for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX);
> DstX++) {
> - XPutPixel(Private->image, DstX, DstY, Color);
> - }
> - }
> - break;
> - default:
> - return EFI_INVALID_PARAMETER;
> - }
> -
> - //
> - // Refresh screen.
> - //
> - switch (BltOperation) {
> - case EfiUgaVideoToVideo:
> - XCopyArea(
> - Private->display, Private->win, Private->win, Private->gc,
> - Args->SourceX, Args->SourceY, Args->Width, Args->Height,
> - Args->DestinationX, Args->DestinationY
> - );
> -
> - while (1) {
> - XNextEvent (Private->display, &ev);
> - HandleEvent (Private, &ev);
> - if (ev.type == NoExpose || ev.type == GraphicsExpose) {
> - break;
> - }
> - }
> - break;
> - case EfiUgaVideoFill:
> - Color = X11PixelToColor (Private, *BltBuffer);
> - XSetForeground (Private->display, Private->gc, Color);
> - XFillRectangle (
> - Private->display, Private->win, Private->gc,
> - Args->DestinationX, Args->DestinationY, Args->Width, Args->Height
> - );
> - XFlush (Private->display);
> - break;
> - case EfiUgaBltBufferToVideo:
> - Redraw (Private, Args->DestinationX, Args->DestinationY, Args->Width,
> Args->Height);
> - break;
> - default:
> - break;
> - }
> - return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -X11CheckPointer (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo
> - )
> -{
> - GRAPHICS_IO_PRIVATE *Drv;
> -
> - Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> -
> - HandleEvents (Drv);
> - if (Drv->pointer_state_changed != 0) {
> - return EFI_SUCCESS;
> - }
> -
> - return EFI_NOT_READY;
> -}
> -
> -
> -EFI_STATUS
> -X11GetPointerState (
> - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> - IN EFI_SIMPLE_POINTER_STATE *State
> - )
> -{
> - EFI_STATUS EfiStatus;
> - GRAPHICS_IO_PRIVATE *Drv;
> -
> - Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> -
> - EfiStatus = X11CheckPointer (GraphicsIo);
> - if (EfiStatus != EFI_SUCCESS) {
> - return EfiStatus;
> - }
> -
> - memcpy (State, &Drv->pointer_state, sizeof (EFI_SIMPLE_POINTER_STATE));
> -
> - Drv->pointer_state.RelativeMovementX = 0;
> - Drv->pointer_state.RelativeMovementY = 0;
> - Drv->pointer_state.RelativeMovementZ = 0;
> - Drv->pointer_state_changed = 0;
> - return EFI_SUCCESS;
> -}
> -
> -
> -
> -EFI_STATUS
> -X11GraphicsWindowOpen (
> - IN EMU_IO_THUNK_PROTOCOL *This
> - )
> -{
> - GRAPHICS_IO_PRIVATE *Drv;
> - unsigned int border_width = 0;
> - char *display_name = NULL;
> -
> - Drv = (GRAPHICS_IO_PRIVATE *)calloc (1, sizeof (GRAPHICS_IO_PRIVATE));
> - if (Drv == NULL) {
> - return EFI_OUT_OF_RESOURCES;
> - }
> -
> - Drv->GraphicsIo.Size = GasketX11Size;
> - Drv->GraphicsIo.CheckKey = GasketX11CheckKey;
> - Drv->GraphicsIo.GetKey = GasketX11GetKey;
> - Drv->GraphicsIo.KeySetState = GasketX11KeySetState;
> - Drv->GraphicsIo.RegisterKeyNotify = GasketX11RegisterKeyNotify;
> - Drv->GraphicsIo.Blt = GasketX11Blt;
> - Drv->GraphicsIo.CheckPointer = GasketX11CheckPointer;
> - Drv->GraphicsIo.GetPointerState = GasketX11GetPointerState;
> -
> -
> - Drv->key_count = 0;
> - Drv->key_rd = 0;
> - Drv->key_wr = 0;
> - Drv->KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID;
> - Drv->KeyState.KeyToggleState = EFI_TOGGLE_STATE_VALID;
> - Drv->MakeRegisterdKeyCallback = NULL;
> - Drv->BreakRegisterdKeyCallback = NULL;
> - Drv->RegisterdKeyCallbackContext = NULL;
> -
> -
> - Drv->display = XOpenDisplay (display_name);
> - if (Drv->display == NULL) {
> - fprintf (stderr, "uga: cannot connect to X server %s\n", XDisplayName
> (display_name));
> - free (Drv);
> - return EFI_DEVICE_ERROR;
> - }
> - Drv->screen = DefaultScreen (Drv->display);
> - Drv->visual = DefaultVisual (Drv->display, Drv->screen);
> - Drv->win = XCreateSimpleWindow (
> - Drv->display, RootWindow (Drv->display, Drv->screen),
> - 0, 0, 4, 4, border_width,
> - WhitePixel (Drv->display, Drv->screen),
> - BlackPixel (Drv->display, Drv->screen)
> - );
> -
> - Drv->depth = DefaultDepth (Drv->display, Drv->screen);
> - XDefineCursor (Drv->display, Drv->win, XCreateFontCursor (Drv->display,
> XC_pirate));
> -
> - Drv->Title = malloc (StrSize (This->ConfigString));
> - UnicodeStrToAsciiStr (This->ConfigString, Drv->Title);
> - XStoreName (Drv->display, Drv->win, Drv->Title);
> -
> -// XAutoRepeatOff (Drv->display);
> - XSelectInput (
> - Drv->display, Drv->win,
> - ExposureMask | KeyPressMask | KeyReleaseMask | PointerMotionMask |
> ButtonPressMask | ButtonReleaseMask
> - );
> - Drv->gc = DefaultGC (Drv->display, Drv->screen);
> -
> - This->Private = (VOID *)Drv;
> - This->Interface = (VOID *)Drv;
> - return EFI_SUCCESS;
> -}
> -
> -
> -EFI_STATUS
> -X11GraphicsWindowClose (
> - IN EMU_IO_THUNK_PROTOCOL *This
> - )
> -{
> - GRAPHICS_IO_PRIVATE *Drv;
> -
> - Drv = (GRAPHICS_IO_PRIVATE *)This->Private;
> -
> - if (Drv == NULL) {
> - return EFI_SUCCESS;
> - }
> -
> - if (Drv->image != NULL) {
> - XDestroyImage(Drv->image);
> -
> - if (Drv->use_shm) {
> - shmdt (Drv->image_data);
> - }
> -
> - Drv->image_data = NULL;
> - Drv->image = NULL;
> - }
> - XDestroyWindow (Drv->display, Drv->win);
> - XCloseDisplay (Drv->display);
> -
> -#ifdef __APPLE__
> - // Free up the shared memory
> - shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
> -#endif
> -
> - free (Drv);
> - return EFI_SUCCESS;
> -}
> -
> -
> -EMU_IO_THUNK_PROTOCOL gX11ThunkIo = {
> - &gEmuGraphicsWindowProtocolGuid,
> - NULL,
> - NULL,
> - 0,
> - GasketX11GraphicsWindowOpen,
> - GasketX11GraphicsWindowClose,
> - NULL
> -};
> -
> -
> +/*++ @file
> +
> +Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>
> +Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> +
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution. The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/
> +
> +#include "Host.h"
> +
> +#include <sys/ipc.h>
> +#include <sys/shm.h>
> +
> +#include <X11/Xlib.h>
> +#include <X11/Xutil.h>
> +#include <X11/Xos.h>
> +#include <X11/extensions/XShm.h>
> +#include <X11/keysym.h>
> +#include <X11/cursorfont.h>
> +
> +#define KEYSYM_LOWER 0
> +#define KEYSYM_UPPER 1
> +
> +
> +struct uga_drv_shift_mask {
> + unsigned char shift;
> + unsigned char size;
> + unsigned char csize;
> +};
> +
> +#define NBR_KEYS 32
> +typedef struct {
> + EMU_GRAPHICS_WINDOW_PROTOCOL GraphicsIo;
> +
> + Display *display;
> + int screen; // values for window_size in main
> + Window win;
> + GC gc;
> + Visual *visual;
> +
> + int depth;
> + unsigned int width;
> + unsigned int height;
> + unsigned int line_bytes;
> + unsigned int pixel_shift;
> + unsigned char *image_data;
> +
> + struct uga_drv_shift_mask r, g, b;
> +
> + int use_shm;
> + XShmSegmentInfo xshm_info;
> + XImage *image;
> + char *Title;
> +
> + unsigned int key_rd;
> + unsigned int key_wr;
> + unsigned int key_count;
> + EFI_KEY_DATA keys[NBR_KEYS];
> +
> + EFI_KEY_STATE KeyState;
> +
> + EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> MakeRegisterdKeyCallback;
> + EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> BreakRegisterdKeyCallback;
> + VOID *RegisterdKeyCallbackContext;
> +
> + int previous_x;
> + int previous_y;
> + EFI_SIMPLE_POINTER_STATE pointer_state;
> + int pointer_state_changed;
> +} GRAPHICS_IO_PRIVATE;
> +
> +void
> +HandleEvents(
> + IN GRAPHICS_IO_PRIVATE *Drv
> + );
> +
> +void
> +fill_shift_mask (
> + IN struct uga_drv_shift_mask *sm,
> + IN unsigned long mask
> + )
> +{
> + sm->shift = 0;
> + sm->size = 0;
> + while ((mask & 1) == 0) {
> + mask >>= 1;
> + sm->shift++;
> + }
> + while (mask & 1) {
> + sm->size++;
> + mask >>= 1;
> + }
> + sm->csize = 8 - sm->size;
> +}
> +
> +int
> +TryCreateShmImage (
> + IN GRAPHICS_IO_PRIVATE *Drv
> + )
> +{
> + Drv->image = XShmCreateImage (
> + Drv->display, Drv->visual,
> + Drv->depth, ZPixmap, NULL, &Drv->xshm_info,
> + Drv->width, Drv->height
> + );
> + if (Drv->image == NULL) {
> + return 0;
> + }
> +
> + switch (Drv->image->bitmap_unit) {
> + case 32:
> + Drv->pixel_shift = 2;
> + break;
> + case 16:
> + Drv->pixel_shift = 1;
> + break;
> + case 8:
> + Drv->pixel_shift = 0;
> + break;
> + }
> +
> + Drv->xshm_info.shmid = shmget (
> + IPC_PRIVATE, Drv->image->bytes_per_line * Drv->image-
> >height,
> + IPC_CREAT | 0777
> + );
> + if (Drv->xshm_info.shmid < 0) {
> + XDestroyImage(Drv->image);
> + return 0;
> + }
> +
> + Drv->image_data = shmat (Drv->xshm_info.shmid, NULL, 0);
> + if(!Drv->image_data) {
> + shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
> + XDestroyImage(Drv->image);
> + return 0;
> + }
> +
> +#ifndef __APPLE__
> + //
> + // This closes shared memory in real time on OS X. Only closes after folks
> quit using
> + // it on Linux.
> + //
> + shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
> +#endif
> +
> + Drv->xshm_info.shmaddr = (char*)Drv->image_data;
> + Drv->image->data = (char*)Drv->image_data;
> +
> + if (!XShmAttach (Drv->display, &Drv->xshm_info)) {
> + shmdt (Drv->image_data);
> + XDestroyImage(Drv->image);
> + return 0;
> + }
> + return 1;
> +}
> +
> +
> +EFI_STATUS
> +X11Size (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> + IN UINT32 Width,
> + IN UINT32 Height
> + )
> +{
> + GRAPHICS_IO_PRIVATE *Drv;
> + XSizeHints size_hints;
> +
> + // Destroy current buffer if created.
> + Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> + if (Drv->image != NULL) {
> + // Before destroy buffer, need to make sure the buffer available for access.
> + XDestroyImage (Drv->image);
> +
> + if (Drv->use_shm) {
> + shmdt (Drv->image_data);
> + }
> +
> + Drv->image_data = NULL;
> + Drv->image = NULL;
> + }
> +
> + Drv->width = Width;
> + Drv->height = Height;
> + XResizeWindow (Drv->display, Drv->win, Width, Height);
> +
> + // Allocate image.
> + if (XShmQueryExtension(Drv->display) && TryCreateShmImage(Drv)) {
> + Drv->use_shm = 1;
> + } else {
> + Drv->use_shm = 0;
> + if (Drv->depth > 16) {
> + Drv->pixel_shift = 2;
> + } else if (Drv->depth > 8) {
> + Drv->pixel_shift = 1;
> + } else {
> + Drv->pixel_shift = 0;
> + }
> +
> + Drv->image_data = malloc ((Drv->width * Drv->height) << Drv->pixel_shift);
> + Drv->image = XCreateImage (
> + Drv->display, Drv->visual, Drv->depth,
> + ZPixmap, 0, (char *)Drv->image_data,
> + Drv->width, Drv->height,
> + 8 << Drv->pixel_shift, 0
> + );
> + }
> +
> + Drv->line_bytes = Drv->image->bytes_per_line;
> +
> + fill_shift_mask (&Drv->r, Drv->image->red_mask);
> + fill_shift_mask (&Drv->g, Drv->image->green_mask);
> + fill_shift_mask (&Drv->b, Drv->image->blue_mask);
> +
> + // Set WM hints.
> + size_hints.flags = PSize | PMinSize | PMaxSize;
> + size_hints.min_width = size_hints.max_width = size_hints.base_width = Width;
> + size_hints.min_height = size_hints.max_height = size_hints.base_height =
> Height;
> + XSetWMNormalHints (Drv->display, Drv->win, &size_hints);
> +
> + XMapWindow (Drv->display, Drv->win);
> + HandleEvents (Drv);
> + return EFI_SUCCESS;
> +}
> +
> +void
> +handleKeyEvent (
> + IN GRAPHICS_IO_PRIVATE *Drv,
> + IN XEvent *ev,
> + IN BOOLEAN Make
> + )
> +{
> + KeySym *KeySym;
> + EFI_KEY_DATA KeyData;
> + int KeySymArraySize;
> +
> + if (Make) {
> + if (Drv->key_count == NBR_KEYS) {
> + return;
> + }
> + }
> +
> + // keycode is a physical key on the keyboard
> + // KeySym is a mapping of a physical key
> + // KeyboardMapping is the array of KeySym for a given keycode. key, shifted
> key, option key, command key, ...
> + //
> + // Returns an array of KeySymArraySize of KeySym for the keycode. [0] is
> lower case, [1] is upper case,
> + // [2] and [3] are based on option and command modifiers. The problem we
> have is command V
> + // could be mapped to a crazy Unicode character so the old scheme of
> returning a string.
> + //
> + KeySym = XGetKeyboardMapping (Drv->display, ev->xkey.keycode, 1,
> &KeySymArraySize);
> +
> + KeyData.Key.ScanCode = 0;
> + KeyData.Key.UnicodeChar = 0;
> + KeyData.KeyState.KeyShiftState = 0;
> +
> + //
> + // Skipping EFI_SCROLL_LOCK_ACTIVE & EFI_NUM_LOCK_ACTIVE since they
> are not on Macs
> + //
> + if ((ev->xkey.state & LockMask) == 0) {
> + Drv->KeyState.KeyToggleState &= ~EFI_CAPS_LOCK_ACTIVE;
> + } else {
> + if (Make) {
> + Drv->KeyState.KeyToggleState |= EFI_CAPS_LOCK_ACTIVE;
> + }
> + }
> +
> + // Skipping EFI_MENU_KEY_PRESSED and EFI_SYS_REQ_PRESSED
> +
> + switch (*KeySym) {
> + case XK_Control_R:
> + if (Make) {
> + Drv->KeyState.KeyShiftState |= EFI_RIGHT_CONTROL_PRESSED;
> + } else {
> + Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_CONTROL_PRESSED;
> + }
> + break;
> + case XK_Control_L:
> + if (Make) {
> + Drv->KeyState.KeyShiftState |= EFI_LEFT_CONTROL_PRESSED;
> + } else {
> + Drv->KeyState.KeyShiftState &= ~EFI_LEFT_CONTROL_PRESSED;
> + }
> + break;
> +
> + case XK_Shift_R:
> + if (Make) {
> + Drv->KeyState.KeyShiftState |= EFI_RIGHT_SHIFT_PRESSED;
> + } else {
> + Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_SHIFT_PRESSED;
> + }
> + break;
> + case XK_Shift_L:
> + if (Make) {
> + Drv->KeyState.KeyShiftState |= EFI_LEFT_SHIFT_PRESSED;
> + } else {
> + Drv->KeyState.KeyShiftState &= ~EFI_LEFT_SHIFT_PRESSED;
> + }
> + break;
> +
> + case XK_Mode_switch:
> + if (Make) {
> + Drv->KeyState.KeyShiftState |= EFI_LEFT_ALT_PRESSED;
> + } else {
> + Drv->KeyState.KeyShiftState &= ~EFI_LEFT_ALT_PRESSED;
> + }
> + break;
> +
> + case XK_Meta_R:
> + if (Make) {
> + Drv->KeyState.KeyShiftState |= EFI_RIGHT_LOGO_PRESSED;
> + } else {
> + Drv->KeyState.KeyShiftState &= ~EFI_RIGHT_LOGO_PRESSED;
> + }
> + break;
> + case XK_Meta_L:
> + if (Make) {
> + Drv->KeyState.KeyShiftState |= EFI_LEFT_LOGO_PRESSED;
> + } else {
> + Drv->KeyState.KeyShiftState &= ~EFI_LEFT_LOGO_PRESSED;
> + }
> + break;
> +
> + case XK_KP_Home:
> + case XK_Home: KeyData.Key.ScanCode = SCAN_HOME; break;
> +
> + case XK_KP_End:
> + case XK_End: KeyData.Key.ScanCode = SCAN_END; break;
> +
> + case XK_KP_Left:
> + case XK_Left: KeyData.Key.ScanCode = SCAN_LEFT; break;
> +
> + case XK_KP_Right:
> + case XK_Right: KeyData.Key.ScanCode = SCAN_RIGHT; break;
> +
> + case XK_KP_Up:
> + case XK_Up: KeyData.Key.ScanCode = SCAN_UP; break;
> +
> + case XK_KP_Down:
> + case XK_Down: KeyData.Key.ScanCode = SCAN_DOWN; break;
> +
> + case XK_KP_Delete:
> + case XK_Delete: KeyData.Key.ScanCode = SCAN_DELETE; break;
> +
> + case XK_KP_Insert:
> + case XK_Insert: KeyData.Key.ScanCode = SCAN_INSERT; break;
> +
> + case XK_KP_Page_Up:
> + case XK_Page_Up: KeyData.Key.ScanCode = SCAN_PAGE_UP; break;
> +
> + case XK_KP_Page_Down:
> + case XK_Page_Down: KeyData.Key.ScanCode = SCAN_PAGE_DOWN; break;
> +
> + case XK_Escape: KeyData.Key.ScanCode = SCAN_ESC; break;
> +
> + case XK_Pause: KeyData.Key.ScanCode = SCAN_PAUSE; break;
> +
> + case XK_KP_F1:
> + case XK_F1: KeyData.Key.ScanCode = SCAN_F1; break;
> +
> + case XK_KP_F2:
> + case XK_F2: KeyData.Key.ScanCode = SCAN_F2; break;
> +
> + case XK_KP_F3:
> + case XK_F3: KeyData.Key.ScanCode = SCAN_F3; break;
> +
> + case XK_KP_F4:
> + case XK_F4: KeyData.Key.ScanCode = SCAN_F4; break;
> +
> + case XK_F5: KeyData.Key.ScanCode = SCAN_F5; break;
> + case XK_F6: KeyData.Key.ScanCode = SCAN_F6; break;
> + case XK_F7: KeyData.Key.ScanCode = SCAN_F7; break;
> +
> + // Don't map into X11 by default on a Mac
> + // System Preferences->Keyboard->Keyboard Shortcuts can be configured
> + // to not use higher function keys as shortcuts and the will show up
> + // in X11.
> + case XK_F8: KeyData.Key.ScanCode = SCAN_F8; break;
> + case XK_F9: KeyData.Key.ScanCode = SCAN_F9; break;
> + case XK_F10: KeyData.Key.ScanCode = SCAN_F10; break;
> +
> + case XK_F11: KeyData.Key.ScanCode = SCAN_F11; break;
> + case XK_F12: KeyData.Key.ScanCode = SCAN_F12; break;
> +
> + case XK_F13: KeyData.Key.ScanCode = SCAN_F13; break;
> + case XK_F14: KeyData.Key.ScanCode = SCAN_F14; break;
> + case XK_F15: KeyData.Key.ScanCode = SCAN_F15; break;
> + case XK_F16: KeyData.Key.ScanCode = SCAN_F16; break;
> + case XK_F17: KeyData.Key.ScanCode = SCAN_F17; break;
> + case XK_F18: KeyData.Key.ScanCode = SCAN_F18; break;
> + case XK_F19: KeyData.Key.ScanCode = SCAN_F19; break;
> + case XK_F20: KeyData.Key.ScanCode = SCAN_F20; break;
> + case XK_F21: KeyData.Key.ScanCode = SCAN_F21; break;
> + case XK_F22: KeyData.Key.ScanCode = SCAN_F22; break;
> + case XK_F23: KeyData.Key.ScanCode = SCAN_F23; break;
> + case XK_F24: KeyData.Key.ScanCode = SCAN_F24; break;
> +
> + // No mapping in X11
> + //case XK_: KeyData.Key.ScanCode = SCAN_MUTE; break;
> + //case XK_: KeyData.Key.ScanCode = SCAN_VOLUME_UP; break;
> + //case XK_: KeyData.Key.ScanCode = SCAN_VOLUME_DOWN; break;
> + //case XK_: KeyData.Key.ScanCode = SCAN_BRIGHTNESS_UP; break;
> + //case XK_: KeyData.Key.ScanCode = SCAN_BRIGHTNESS_DOWN; break;
> + //case XK_: KeyData.Key.ScanCode = SCAN_SUSPEND; break;
> + //case XK_: KeyData.Key.ScanCode = SCAN_HIBERNATE; break;
> + //case XK_: KeyData.Key.ScanCode = SCAN_TOGGLE_DISPLAY; break;
> + //case XK_: KeyData.Key.ScanCode = SCAN_RECOVERY; break;
> + //case XK_: KeyData.Key.ScanCode = SCAN_EJECT; break;
> +
> + case XK_BackSpace: KeyData.Key.UnicodeChar = 0x0008; break;
> +
> + case XK_KP_Tab:
> + case XK_Tab: KeyData.Key.UnicodeChar = 0x0009; break;
> +
> + case XK_Linefeed: KeyData.Key.UnicodeChar = 0x000a; break;
> +
> + case XK_KP_Enter:
> + case XK_Return: KeyData.Key.UnicodeChar = 0x000d; break;
> +
> + case XK_KP_Equal : KeyData.Key.UnicodeChar = L'='; break;
> + case XK_KP_Multiply : KeyData.Key.UnicodeChar = L'*'; break;
> + case XK_KP_Add : KeyData.Key.UnicodeChar = L'+'; break;
> + case XK_KP_Separator : KeyData.Key.UnicodeChar = L'~'; break;
> + case XK_KP_Subtract : KeyData.Key.UnicodeChar = L'-'; break;
> + case XK_KP_Decimal : KeyData.Key.UnicodeChar = L'.'; break;
> + case XK_KP_Divide : KeyData.Key.UnicodeChar = L'/'; break;
> +
> + case XK_KP_0 : KeyData.Key.UnicodeChar = L'0'; break;
> + case XK_KP_1 : KeyData.Key.UnicodeChar = L'1'; break;
> + case XK_KP_2 : KeyData.Key.UnicodeChar = L'2'; break;
> + case XK_KP_3 : KeyData.Key.UnicodeChar = L'3'; break;
> + case XK_KP_4 : KeyData.Key.UnicodeChar = L'4'; break;
> + case XK_KP_5 : KeyData.Key.UnicodeChar = L'5'; break;
> + case XK_KP_6 : KeyData.Key.UnicodeChar = L'6'; break;
> + case XK_KP_7 : KeyData.Key.UnicodeChar = L'7'; break;
> + case XK_KP_8 : KeyData.Key.UnicodeChar = L'8'; break;
> + case XK_KP_9 : KeyData.Key.UnicodeChar = L'9'; break;
> +
> + default:
> + ;
> + }
> +
> + // The global state is our state
> + KeyData.KeyState.KeyShiftState = Drv->KeyState.KeyShiftState;
> + KeyData.KeyState.KeyToggleState = Drv->KeyState.KeyToggleState;
> +
> + if (*KeySym < XK_BackSpace) {
> + if (((Drv->KeyState.KeyShiftState & (EFI_LEFT_SHIFT_PRESSED |
> EFI_RIGHT_SHIFT_PRESSED)) != 0) ||
> + ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) != 0) ) {
> +
> + KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_UPPER];
> +
> + // Per UEFI spec since we converted the Unicode clear the shift bits we
> pass up
> + KeyData.KeyState.KeyShiftState &= ~(EFI_LEFT_SHIFT_PRESSED |
> EFI_RIGHT_SHIFT_PRESSED);
> + } else {
> + KeyData.Key.UnicodeChar = (CHAR16)KeySym[KEYSYM_LOWER];
> + }
> + } else {
> + // XK_BackSpace is the start of XK_MISCELLANY. These are the XK_? keys
> we process in this file
> + ;
> + }
> +
> + if (Make) {
> + memcpy (&Drv->keys[Drv->key_wr], &KeyData, sizeof (EFI_KEY_DATA));
> + Drv->key_wr = (Drv->key_wr + 1) % NBR_KEYS;
> + Drv->key_count++;
> + if (Drv->MakeRegisterdKeyCallback != NULL) {
> + ReverseGasketUint64Uint64 (Drv->MakeRegisterdKeyCallback ,Drv-
> >RegisterdKeyCallbackContext, &KeyData);
> + }
> + } else {
> + if (Drv->BreakRegisterdKeyCallback != NULL) {
> + ReverseGasketUint64Uint64 (Drv->BreakRegisterdKeyCallback ,Drv-
> >RegisterdKeyCallbackContext, &KeyData);
> + }
> + }
> +}
> +
> +
> +void
> +handleMouseMoved(
> + IN GRAPHICS_IO_PRIVATE *Drv,
> + IN XEvent *ev
> + )
> +{
> + if (ev->xmotion.x != Drv->previous_x) {
> + Drv->pointer_state.RelativeMovementX += ( ev->xmotion.x - Drv-
> >previous_x );
> + Drv->previous_x = ev->xmotion.x;
> + Drv->pointer_state_changed = 1;
> + }
> +
> + if (ev->xmotion.y != Drv->previous_y) {
> + Drv->pointer_state.RelativeMovementY += ( ev->xmotion.y - Drv-
> >previous_y );
> + Drv->previous_y = ev->xmotion.y;
> + Drv->pointer_state_changed = 1;
> + }
> +
> + Drv->pointer_state.RelativeMovementZ = 0;
> +}
> +
> +void
> +handleMouseDown (
> + IN GRAPHICS_IO_PRIVATE *Drv,
> + IN XEvent *ev,
> + IN BOOLEAN Pressed
> + )
> +{
> + if (ev->xbutton.button == Button1) {
> + Drv->pointer_state_changed = (Drv->pointer_state.LeftButton != Pressed);
> + Drv->pointer_state.LeftButton = Pressed;
> + }
> + if ( ev->xbutton.button == Button2 ) {
> + Drv->pointer_state_changed = (Drv->pointer_state.RightButton != Pressed);
> + Drv->pointer_state.RightButton = Pressed;
> + }
> +}
> +
> +void
> +Redraw (
> + IN GRAPHICS_IO_PRIVATE *Drv,
> + IN UINTN X,
> + IN UINTN Y,
> + IN UINTN Width,
> + IN UINTN Height
> + )
> +{
> + if (Drv->use_shm) {
> + XShmPutImage (
> + Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height,
> False
> + );
> + } else {
> + XPutImage (
> + Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, Height
> + );
> + }
> + XFlush(Drv->display);
> +}
> +
> +void
> +HandleEvent(GRAPHICS_IO_PRIVATE *Drv, XEvent *ev)
> +{
> + switch (ev->type) {
> + case Expose:
> + Redraw (Drv, ev->xexpose.x, ev->xexpose.y,
> + ev->xexpose.width, ev->xexpose.height);
> + break;
> + case GraphicsExpose:
> + Redraw (Drv, ev->xgraphicsexpose.x, ev->xgraphicsexpose.y,
> + ev->xgraphicsexpose.width, ev->xgraphicsexpose.height);
> + break;
> + case KeyPress:
> + handleKeyEvent (Drv, ev, TRUE);
> + break;
> + case KeyRelease:
> + handleKeyEvent (Drv, ev, FALSE);
> + break;
> + case MappingNotify:
> + XRefreshKeyboardMapping (&ev->xmapping);
> + break;
> + case MotionNotify:
> + handleMouseMoved (Drv, ev);
> + break;
> + case ButtonPress:
> + handleMouseDown (Drv, ev, TRUE);
> + break;
> + case ButtonRelease:
> + handleMouseDown (Drv, ev, FALSE);
> + break;
> +#if 0
> + case DestroyNotify:
> + XCloseDisplay (Drv->display);
> + exit (1);
> + break;
> +#endif
> + case NoExpose:
> + default:
> + break;
> + }
> +}
> +
> +void
> +HandleEvents (
> + IN GRAPHICS_IO_PRIVATE *Drv
> + )
> +{
> + XEvent ev;
> +
> + while (XPending (Drv->display) != 0) {
> + XNextEvent (Drv->display, &ev);
> + HandleEvent (Drv, &ev);
> + }
> +}
> +
> +unsigned long
> +X11PixelToColor (
> + IN GRAPHICS_IO_PRIVATE *Drv,
> + IN EFI_UGA_PIXEL pixel
> + )
> +{
> + return ((pixel.Red >> Drv->r.csize) << Drv->r.shift)
> + | ((pixel.Green >> Drv->g.csize) << Drv->g.shift)
> + | ((pixel.Blue >> Drv->b.csize) << Drv->b.shift);
> +}
> +
> +EFI_UGA_PIXEL
> +X11ColorToPixel (
> + IN GRAPHICS_IO_PRIVATE *Drv,
> + IN unsigned long val
> + )
> +{
> + EFI_UGA_PIXEL Pixel;
> +
> + memset (&Pixel, 0, sizeof (EFI_UGA_PIXEL));
> +
> + // Truncation not an issue since X11 and EFI are both using 8 bits per color
> + Pixel.Red = (val >> Drv->r.shift) << Drv->r.csize;
> + Pixel.Green = (val >> Drv->g.shift) << Drv->g.csize;
> + Pixel.Blue = (val >> Drv->b.shift) << Drv->b.csize;
> +
> + return Pixel;
> +}
> +
> +
> +EFI_STATUS
> +X11CheckKey (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo
> + )
> +{
> + GRAPHICS_IO_PRIVATE *Drv;
> +
> + Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> +
> + HandleEvents (Drv);
> +
> + if (Drv->key_count != 0) {
> + return EFI_SUCCESS;
> + }
> +
> + return EFI_NOT_READY;
> +}
> +
> +EFI_STATUS
> +X11GetKey (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> + IN EFI_KEY_DATA *KeyData
> + )
> +{
> + EFI_STATUS EfiStatus;
> + GRAPHICS_IO_PRIVATE *Drv;
> +
> + Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> +
> + EfiStatus = X11CheckKey (GraphicsIo);
> + if (EFI_ERROR (EfiStatus)) {
> + return EfiStatus;
> + }
> +
> + CopyMem (KeyData, &Drv->keys[Drv->key_rd], sizeof (EFI_KEY_DATA));
> + Drv->key_rd = (Drv->key_rd + 1) % NBR_KEYS;
> + Drv->key_count--;
> +
> + return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +X11KeySetState (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> + IN EFI_KEY_TOGGLE_STATE *KeyToggleState
> + )
> +{
> + GRAPHICS_IO_PRIVATE *Drv;
> +
> + Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> +
> + if (*KeyToggleState & EFI_CAPS_LOCK_ACTIVE) {
> + if ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) == 0) {
> + //
> + // We could create an XKeyEvent and send a XK_Caps_Lock to
> + // the UGA/GOP Window
> + //
> + }
> + }
> +
> + Drv->KeyState.KeyToggleState = *KeyToggleState;
> + return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +X11RegisterKeyNotify (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> + IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> MakeCallBack,
> + IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK
> BreakCallBack,
> + IN VOID *Context
> + )
> +{
> + GRAPHICS_IO_PRIVATE *Drv;
> +
> + Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> +
> + Drv->MakeRegisterdKeyCallback = MakeCallBack;
> + Drv->BreakRegisterdKeyCallback = BreakCallBack;
> + Drv->RegisterdKeyCallbackContext = Context;
> +
> + return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +X11Blt (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> + IN EFI_UGA_PIXEL *BltBuffer OPTIONAL,
> + IN EFI_UGA_BLT_OPERATION BltOperation,
> + IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args
> + )
> +{
> + GRAPHICS_IO_PRIVATE *Private;
> + UINTN DstY;
> + UINTN SrcY;
> + UINTN DstX;
> + UINTN SrcX;
> + UINTN Index;
> + EFI_UGA_PIXEL *Blt;
> + UINT8 *Dst;
> + UINT8 *Src;
> + UINTN Nbr;
> + unsigned long Color;
> + XEvent ev;
> +
> + Private = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> +
> +
> + //
> + // Check bounds
> + //
> + if (BltOperation == EfiUgaVideoToBltBuffer
> + || BltOperation == EfiUgaVideoToVideo) {
> + //
> + // Source is Video.
> + //
> + if (Args->SourceY + Args->Height > Private->height) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + if (Args->SourceX + Args->Width > Private->width) {
> + return EFI_INVALID_PARAMETER;
> + }
> + }
> +
> + if (BltOperation == EfiUgaBltBufferToVideo
> + || BltOperation == EfiUgaVideoToVideo
> + || BltOperation == EfiUgaVideoFill) {
> + //
> + // Destination is Video
> + //
> + if (Args->DestinationY + Args->Height > Private->height) {
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + if (Args->DestinationX + Args->Width > Private->width) {
> + return EFI_INVALID_PARAMETER;
> + }
> + }
> +
> + switch (BltOperation) {
> + case EfiUgaVideoToBltBuffer:
> + Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->DestinationY * Args-
> >Delta) + Args->DestinationX * sizeof (EFI_UGA_PIXEL));
> + Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);
> + for (SrcY = Args->SourceY; SrcY < (Args->Height + Args->SourceY); SrcY++) {
> + for (SrcX = Args->SourceX; SrcX < (Args->Width + Args->SourceX); SrcX++) {
> + *Blt++ = X11ColorToPixel (Private, XGetPixel (Private->image, SrcX,
> SrcY));
> + }
> + Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);
> + }
> + break;
> + case EfiUgaBltBufferToVideo:
> + Blt = (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->SourceY * Args->Delta)
> + Args->SourceX * sizeof (EFI_UGA_PIXEL));
> + Args->Delta -= Args->Width * sizeof (EFI_UGA_PIXEL);
> + for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY);
> DstY++) {
> + for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX);
> DstX++) {
> + XPutPixel(Private->image, DstX, DstY, X11PixelToColor(Private, *Blt));
> + Blt++;
> + }
> + Blt = (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta);
> + }
> + break;
> + case EfiUgaVideoToVideo:
> + Dst = Private->image_data + (Args->DestinationX << Private->pixel_shift)
> + + Args->DestinationY * Private->line_bytes;
> + Src = Private->image_data + (Args->SourceX << Private->pixel_shift)
> + + Args->SourceY * Private->line_bytes;
> + Nbr = Args->Width << Private->pixel_shift;
> + if (Args->DestinationY < Args->SourceY) {
> + for (Index = 0; Index < Args->Height; Index++) {
> + memcpy (Dst, Src, Nbr);
> + Dst += Private->line_bytes;
> + Src += Private->line_bytes;
> + }
> + } else {
> + Dst += (Args->Height - 1) * Private->line_bytes;
> + Src += (Args->Height - 1) * Private->line_bytes;
> + for (Index = 0; Index < Args->Height; Index++) {
> + //
> + // Source and Destination Y may be equal, therefore Dst and Src may
> + // overlap.
> + //
> + memmove (Dst, Src, Nbr);
> + Dst -= Private->line_bytes;
> + Src -= Private->line_bytes;
> + }
> + }
> + break;
> + case EfiUgaVideoFill:
> + Color = X11PixelToColor(Private, *BltBuffer);
> + for (DstY = Args->DestinationY; DstY < (Args->Height + Args->DestinationY);
> DstY++) {
> + for (DstX = Args->DestinationX; DstX < (Args->Width + Args->DestinationX);
> DstX++) {
> + XPutPixel(Private->image, DstX, DstY, Color);
> + }
> + }
> + break;
> + default:
> + return EFI_INVALID_PARAMETER;
> + }
> +
> + //
> + // Refresh screen.
> + //
> + switch (BltOperation) {
> + case EfiUgaVideoToVideo:
> + XCopyArea(
> + Private->display, Private->win, Private->win, Private->gc,
> + Args->SourceX, Args->SourceY, Args->Width, Args->Height,
> + Args->DestinationX, Args->DestinationY
> + );
> +
> + while (1) {
> + XNextEvent (Private->display, &ev);
> + HandleEvent (Private, &ev);
> + if (ev.type == NoExpose || ev.type == GraphicsExpose) {
> + break;
> + }
> + }
> + break;
> + case EfiUgaVideoFill:
> + Color = X11PixelToColor (Private, *BltBuffer);
> + XSetForeground (Private->display, Private->gc, Color);
> + XFillRectangle (
> + Private->display, Private->win, Private->gc,
> + Args->DestinationX, Args->DestinationY, Args->Width, Args->Height
> + );
> + XFlush (Private->display);
> + break;
> + case EfiUgaBltBufferToVideo:
> + Redraw (Private, Args->DestinationX, Args->DestinationY, Args->Width,
> Args->Height);
> + break;
> + default:
> + break;
> + }
> + return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +X11CheckPointer (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo
> + )
> +{
> + GRAPHICS_IO_PRIVATE *Drv;
> +
> + Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> +
> + HandleEvents (Drv);
> + if (Drv->pointer_state_changed != 0) {
> + return EFI_SUCCESS;
> + }
> +
> + return EFI_NOT_READY;
> +}
> +
> +
> +EFI_STATUS
> +X11GetPointerState (
> + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo,
> + IN EFI_SIMPLE_POINTER_STATE *State
> + )
> +{
> + EFI_STATUS EfiStatus;
> + GRAPHICS_IO_PRIVATE *Drv;
> +
> + Drv = (GRAPHICS_IO_PRIVATE *)GraphicsIo;
> +
> + EfiStatus = X11CheckPointer (GraphicsIo);
> + if (EfiStatus != EFI_SUCCESS) {
> + return EfiStatus;
> + }
> +
> + memcpy (State, &Drv->pointer_state, sizeof (EFI_SIMPLE_POINTER_STATE));
> +
> + Drv->pointer_state.RelativeMovementX = 0;
> + Drv->pointer_state.RelativeMovementY = 0;
> + Drv->pointer_state.RelativeMovementZ = 0;
> + Drv->pointer_state_changed = 0;
> + return EFI_SUCCESS;
> +}
> +
> +
> +
> +EFI_STATUS
> +X11GraphicsWindowOpen (
> + IN EMU_IO_THUNK_PROTOCOL *This
> + )
> +{
> + GRAPHICS_IO_PRIVATE *Drv;
> + unsigned int border_width = 0;
> + char *display_name = NULL;
> +
> + Drv = (GRAPHICS_IO_PRIVATE *)calloc (1, sizeof (GRAPHICS_IO_PRIVATE));
> + if (Drv == NULL) {
> + return EFI_OUT_OF_RESOURCES;
> + }
> +
> + Drv->GraphicsIo.Size = GasketX11Size;
> + Drv->GraphicsIo.CheckKey = GasketX11CheckKey;
> + Drv->GraphicsIo.GetKey = GasketX11GetKey;
> + Drv->GraphicsIo.KeySetState = GasketX11KeySetState;
> + Drv->GraphicsIo.RegisterKeyNotify = GasketX11RegisterKeyNotify;
> + Drv->GraphicsIo.Blt = GasketX11Blt;
> + Drv->GraphicsIo.CheckPointer = GasketX11CheckPointer;
> + Drv->GraphicsIo.GetPointerState = GasketX11GetPointerState;
> +
> +
> + Drv->key_count = 0;
> + Drv->key_rd = 0;
> + Drv->key_wr = 0;
> + Drv->KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID;
> + Drv->KeyState.KeyToggleState = EFI_TOGGLE_STATE_VALID;
> + Drv->MakeRegisterdKeyCallback = NULL;
> + Drv->BreakRegisterdKeyCallback = NULL;
> + Drv->RegisterdKeyCallbackContext = NULL;
> +
> +
> + Drv->display = XOpenDisplay (display_name);
> + if (Drv->display == NULL) {
> + fprintf (stderr, "uga: cannot connect to X server %s\n", XDisplayName
> (display_name));
> + free (Drv);
> + return EFI_DEVICE_ERROR;
> + }
> + Drv->screen = DefaultScreen (Drv->display);
> + Drv->visual = DefaultVisual (Drv->display, Drv->screen);
> + Drv->win = XCreateSimpleWindow (
> + Drv->display, RootWindow (Drv->display, Drv->screen),
> + 0, 0, 4, 4, border_width,
> + WhitePixel (Drv->display, Drv->screen),
> + BlackPixel (Drv->display, Drv->screen)
> + );
> +
> + Drv->depth = DefaultDepth (Drv->display, Drv->screen);
> + XDefineCursor (Drv->display, Drv->win, XCreateFontCursor (Drv->display,
> XC_pirate));
> +
> + Drv->Title = malloc (StrSize (This->ConfigString));
> + UnicodeStrToAsciiStr (This->ConfigString, Drv->Title);
> + XStoreName (Drv->display, Drv->win, Drv->Title);
> +
> +// XAutoRepeatOff (Drv->display);
> + XSelectInput (
> + Drv->display, Drv->win,
> + ExposureMask | KeyPressMask | KeyReleaseMask | PointerMotionMask |
> ButtonPressMask | ButtonReleaseMask
> + );
> + Drv->gc = DefaultGC (Drv->display, Drv->screen);
> +
> + This->Private = (VOID *)Drv;
> + This->Interface = (VOID *)Drv;
> + return EFI_SUCCESS;
> +}
> +
> +
> +EFI_STATUS
> +X11GraphicsWindowClose (
> + IN EMU_IO_THUNK_PROTOCOL *This
> + )
> +{
> + GRAPHICS_IO_PRIVATE *Drv;
> +
> + Drv = (GRAPHICS_IO_PRIVATE *)This->Private;
> +
> + if (Drv == NULL) {
> + return EFI_SUCCESS;
> + }
> +
> + if (Drv->image != NULL) {
> + XDestroyImage(Drv->image);
> +
> + if (Drv->use_shm) {
> + shmdt (Drv->image_data);
> + }
> +
> + Drv->image_data = NULL;
> + Drv->image = NULL;
> + }
> + XDestroyWindow (Drv->display, Drv->win);
> + XCloseDisplay (Drv->display);
> +
> +#ifdef __APPLE__
> + // Free up the shared memory
> + shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL);
> +#endif
> +
> + free (Drv);
> + return EFI_SUCCESS;
> +}
> +
> +
> +EMU_IO_THUNK_PROTOCOL gX11ThunkIo = {
> + &gEmuGraphicsWindowProtocolGuid,
> + NULL,
> + NULL,
> + 0,
> + GasketX11GraphicsWindowOpen,
> + GasketX11GraphicsWindowClose,
> + NULL
> +};
> +
> +
> diff --git a/EmulatorPkg/Unix/Host/X64/Gasket.S
> b/EmulatorPkg/Unix/Host/X64/Gasket.S
> index c339461cd8..118a218818 100644
> --- a/EmulatorPkg/Unix/Host/X64/Gasket.S
> +++ b/EmulatorPkg/Unix/Host/X64/Gasket.S
> @@ -1,1631 +1,1631 @@
> -#------------------------------------------------------------------------------
> -#
> -# Manage differenced between UNIX ABI and EFI/Windows ABI
> -#
> -# EFI Arg passing: RCX, RDX, R8, R9
> -# Callee allocates 32 bytes on stack to spill registers
> -# UNIX Arg passing: RDI, RSI, RDX, RCX, R8, R9
> -# RSI, RDI calle-save on EFI, scatch on UNIX callign
> -#
> -# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> -# This program and the accompanying materials
> -# are licensed and made available under the terms and conditions of the BSD
> License
> -# which accompanies this distribution. The full text of the license may be
> found at
> -# http://opensource.org/licenses/bsd-license.php
> -#
> -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> -#
> -#------------------------------------------------------------------------------
> -
> -//
> -// Gaskets are EFI ABI to UNIX ABI calls
> -// EFI ABI code will sub 40 (0x28) from %rsp before calling a function
> -// This is the 32 (0x20) byte to spill registers and 8 bytes to align stack on 16
> byte boundry.
> -//
> - .text
> -
> -// 32 byte shadow to spill rcx-r9, 8 bytes to align stack on 16 byte boundry
> -// Any call with 0 - 4 arguments allocates 40 bytes on the stack.
> -// For more than 4 args you always have to increase in quanta of 16 so 5 or 6
> args is 56,
> -// 7 or 8 args is 72, and 9 or 10 args is 88
> -
> -
> -
> - .text
> -
> -//
> -// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)
> -//
> -
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)
> -ASM_PFX(GasketSecWriteStdErr):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(SecWriteStdErr)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)
> -ASM_PFX(GasketSecConfigStdIn):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> - pushq %rdi
> -
> - call ASM_PFX(SecConfigStdIn)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)
> -ASM_PFX(GasketSecWriteStdOut):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(SecWriteStdOut)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)
> -ASM_PFX(GasketSecReadStdIn):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(SecReadStdIn)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)
> -ASM_PFX(GasketSecPollStdIn):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> - pushq %rdi
> -
> - call ASM_PFX(SecPollStdIn)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecMalloc)
> -ASM_PFX(GasketSecMalloc):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(SecMalloc)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecValloc)
> -ASM_PFX(GasketSecValloc):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(SecValloc)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecFree)
> -ASM_PFX(GasketSecFree):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(SecFree)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecSetTimer)
> -ASM_PFX(GasketSecSetTimer):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(SecSetTimer)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)
> -ASM_PFX(GasketSecEnableInterrupt):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - call ASM_PFX(SecEnableInterrupt)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)
> -ASM_PFX(GasketSecDisableInterrupt):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - call ASM_PFX(SecDisableInterrupt)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)
> -ASM_PFX(GasketQueryPerformanceFrequency):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - call ASM_PFX(QueryPerformanceFrequency)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)
> -ASM_PFX(GasketQueryPerformanceCounter):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - call ASM_PFX(QueryPerformanceCounter)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecSleep)
> -ASM_PFX(GasketSecSleep):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(SecSleep)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)
> -ASM_PFX(GasketSecCpuSleep):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> - pushq %rdi
> -
> - call ASM_PFX(SecCpuSleep)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecExit)
> -ASM_PFX(GasketSecExit):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - movq %rcx, %rdi // Swizzle args
> - call ASM_PFX(SecExit) // Less to do as we will never return to EFI ABI
> world
> -LDEAD_LOOP:
> - jmp LDEAD_LOOP // _exit should never return
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecGetTime)
> -ASM_PFX(GasketSecGetTime):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(SecGetTime)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecSetTime)
> -ASM_PFX(GasketSecSetTime):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(SecSetTime)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)
> -ASM_PFX(GasketSecGetNextProtocol):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> -
> - call ASM_PFX(SecGetNextProtocol)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -// PPIs produced by SEC
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)
> -ASM_PFX(GasketSecPeCoffGetEntryPoint):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(SecPeCoffGetEntryPoint)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)
> -ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(SecPeCoffRelocateImageExtraAction)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)
> -ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(SecPeCoffUnloadImageExtraAction)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)
> -ASM_PFX(GasketSecEmuThunkAddress):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - call ASM_PFX(SecEmuThunkAddress)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -//
> -// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
> -//
> -
> -ASM_GLOBAL ASM_PFX(GasketX11Size)
> -ASM_PFX(GasketX11Size):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> -
> - call ASM_PFX(X11Size)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11CheckKey)
> -ASM_PFX(GasketX11CheckKey):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(X11CheckKey)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GetKey)
> -ASM_PFX(GasketX11GetKey):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(X11GetKey)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11KeySetState)
> -ASM_PFX(GasketX11KeySetState):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(X11KeySetState)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)
> -ASM_PFX(GasketX11RegisterKeyNotify):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> -
> - call ASM_PFX(X11RegisterKeyNotify)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11Blt)
> -ASM_PFX(GasketX11Blt):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> -
> - call ASM_PFX(X11Blt)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)
> -ASM_PFX(GasketX11CheckPointer):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(X11CheckPointer)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)
> -ASM_PFX(GasketX11GetPointerState):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(X11GetPointerState)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)
> -ASM_PFX(GasketX11GraphicsWindowOpen):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(X11GraphicsWindowOpen)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)
> -ASM_PFX(GasketX11GraphicsWindowClose):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %r9, %rcx
> -
> - call ASM_PFX(X11GraphicsWindowClose)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -// Pthreads
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)
> -ASM_PFX(GasketPthreadMutexLock):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PthreadMutexLock)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)
> -ASM_PFX(GasketPthreadMutexUnLock):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PthreadMutexUnLock)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)
> -ASM_PFX(GasketPthreadMutexTryLock):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PthreadMutexTryLock)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)
> -ASM_PFX(GasketPthreadMutexInit):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> -
> - call ASM_PFX(PthreadMutexInit)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)
> -ASM_PFX(GasketPthreadMutexDestroy):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PthreadMutexDestroy)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadCreate)
> -ASM_PFX(GasketPthreadCreate):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> -
> - call ASM_PFX(PthreadCreate)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadExit)
> -ASM_PFX(GasketPthreadExit):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PthreadExit)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadSelf)
> -ASM_PFX(GasketPthreadSelf):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> -
> - call ASM_PFX(PthreadSelf)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadOpen)
> -ASM_PFX(GasketPthreadOpen):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PthreadOpen)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPthreadClose)
> -ASM_PFX(GasketPthreadClose):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PthreadClose)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -
> -
> -//
> -// UNIX ABI to EFI ABI call
> -//
> -// UINTN
> -// ReverseGasketUint64 (
> -// void *Api,
> -// UINTN Arg1
> -// );
> -ASM_GLOBAL ASM_PFX(ReverseGasketUint64)
> -ASM_PFX(ReverseGasketUint64):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - movq %rdi, %rax // Swizzle args
> - movq %rsi, %rcx
> -
> - subq $32, %rsp // 32-byte shadow space
> - call *%rax
> - addq $32, %rsp
> -
> - popq %rbp
> - ret
> -
> -//
> -// UNIX ABI to EFI ABI call
> -//
> -// UINTN
> -// ReverseGasketUint64Uint64 (
> -// void *Api,
> -// UINTN Arg1
> -// UINTN Arg2
> -// );
> -ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)
> -ASM_PFX(ReverseGasketUint64Uint64):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - movq %rdi, %rax // Swizzle args
> - movq %rsi, %rcx
> -
> - subq $32, %rsp // 32-byte shadow space
> - call *%rax
> - addq $32, %rsp
> -
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)
> -ASM_PFX(GasketSecUnixPeiAutoScan):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> -
> - call ASM_PFX(SecUnixPeiAutoScan)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)
> -ASM_PFX(GasketSecUnixFdAddress):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> -
> - call ASM_PFX(SecUnixFdAddress)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -// EmuIoThunk SimpleFileSystem
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)
> -ASM_PFX(GasketPosixOpenVolume):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> -
> - call ASM_PFX(PosixOpenVolume)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)
> -ASM_PFX(GasketPosixFileOpen):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> - movq 48(%rbp), %r8
> -
> - call ASM_PFX(PosixFileOpen)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)
> -ASM_PFX(GasketPosixFileCLose):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PosixFileCLose)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)
> -ASM_PFX(GasketPosixFileDelete):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PosixFileDelete)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileRead)
> -ASM_PFX(GasketPosixFileRead):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> -
> - call ASM_PFX(PosixFileRead)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)
> -ASM_PFX(GasketPosixFileWrite):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> -
> - call ASM_PFX(PosixFileWrite)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)
> -ASM_PFX(GasketPosixFileSetPossition):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(PosixFileSetPossition)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)
> -ASM_PFX(GasketPosixFileGetPossition):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(PosixFileGetPossition)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)
> -ASM_PFX(GasketPosixFileGetInfo):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> -
> - call ASM_PFX(PosixFileGetInfo)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)
> -ASM_PFX(GasketPosixFileSetInfo):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> -
> - call ASM_PFX(PosixFileSetInfo)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)
> -ASM_PFX(GasketPosixFileFlush):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PosixFileFlush)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)
> -ASM_PFX(GasketPosixFileSystmeThunkOpen):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PosixFileSystmeThunkOpen)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)
> -ASM_PFX(GasketPosixFileSystmeThunkClose):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(PosixFileSystmeThunkClose)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)
> -ASM_PFX(GasketEmuBlockIoReset):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(EmuBlockIoReset)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)
> -ASM_PFX(GasketEmuBlockIoReadBlocks):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> - movq 48(%rbp), %r8
> - movq 56(%rbp), %r9
> -
> - call ASM_PFX(EmuBlockIoReadBlocks)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)
> -ASM_PFX(GasketEmuBlockIoWriteBlocks):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> - movq 48(%rbp), %r8
> - movq 56(%rbp), %r9
> -
> - call ASM_PFX(EmuBlockIoWriteBlocks)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)
> -ASM_PFX(GasketEmuBlockIoFlushBlocks):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(EmuBlockIoFlushBlocks)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)
> -ASM_PFX(GasketEmuBlockIoCreateMapping):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(EmuBlockIoCreateMapping)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)
> -ASM_PFX(GasketBlockIoThunkOpen):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(EmuBlockIoThunkOpen)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)
> -ASM_PFX(GasketBlockIoThunkClose):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(EmuBlockIoThunkClose)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)
> -ASM_PFX(GasketSnpCreateMapping):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(EmuSnpCreateMapping)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStart)
> -ASM_PFX(GasketSnpStart):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(EmuSnpStart)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStop)
> -ASM_PFX(GasketSnpStop):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(EmuSnpStop)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpInitialize)
> -ASM_PFX(GasketSnpInitialize):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> -
> - call ASM_PFX(EmuSnpInitialize)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpReset)
> -ASM_PFX(GasketSnpReset):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> -
> - call ASM_PFX(EmuSnpReset)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpShutdown)
> -ASM_PFX(GasketSnpShutdown):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(EmuSnpShutdown)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)
> -ASM_PFX(GasketSnpReceiveFilters):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> - movq 48(%rbp), %r8
> - movq 56(%rbp), %r9
> -
> - call ASM_PFX(EmuSnpReceiveFilters)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)
> -ASM_PFX(GasketSnpStationAddress):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> -
> - call ASM_PFX(EmuSnpStationAddress)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpStatistics)
> -ASM_PFX(GasketSnpStatistics):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> -
> - call ASM_PFX(EmuSnpStatistics)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)
> -ASM_PFX(GasketSnpMCastIpToMac):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> -
> - call ASM_PFX(EmuSnpMCastIpToMac)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpNvData)
> -ASM_PFX(GasketSnpNvData):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> - movq 48(%rbp), %r8
> -
> - call ASM_PFX(EmuSnpNvData)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)
> -ASM_PFX(GasketSnpGetStatus):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> -
> - call ASM_PFX(EmuSnpGetStatus)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpTransmit)
> -ASM_PFX(GasketSnpTransmit):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> - subq $16, %rsp // Allocate space for args on the stack
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> - movq 48(%rbp), %r8
> - movq 56(%rbp), %r9
> - movq 64(%rbp), %rax
> - movq %rax, (%rsp)
> -
> - call ASM_PFX(EmuSnpTransmit)
> - addq $16, %rsp
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpReceive)
> -ASM_PFX(GasketSnpReceive):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> - subq $16, %rsp // Allocate space for args on the stack
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> - movq %rdx, %rsi
> - movq %r8, %rdx
> - movq %r9, %rcx
> - movq 48(%rbp), %r8
> - movq 56(%rbp), %r9
> - movq 64(%rbp), %rax
> - movq %rax, (%rsp)
> -
> - call ASM_PFX(EmuSnpReceive)
> - addq $16, %rsp
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)
> -ASM_PFX(GasketSnpThunkOpen):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(EmuSnpThunkOpen)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> -ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)
> -ASM_PFX(GasketSnpThunkClose):
> - pushq %rbp // stack frame is for the debugger
> - movq %rsp, %rbp
> -
> - pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI ABI
> - pushq %rdi
> -
> - movq %rcx, %rdi // Swizzle args
> -
> - call ASM_PFX(EmuSnpThunkClose)
> -
> - popq %rdi // restore state
> - popq %rsi
> - popq %rbp
> - ret
> -
> -
> +#------------------------------------------------------------------------------
> +#
> +# Manage differenced between UNIX ABI and EFI/Windows ABI
> +#
> +# EFI Arg passing: RCX, RDX, R8, R9
> +# Callee allocates 32 bytes on stack to spill registers
> +# UNIX Arg passing: RDI, RSI, RDX, RCX, R8, R9
> +# RSI, RDI calle-save on EFI, scatch on UNIX callign
> +#
> +# Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
> +# This program and the accompanying materials
> +# are licensed and made available under the terms and conditions of the BSD
> License
> +# which accompanies this distribution. The full text of the license may be
> found at
> +# http://opensource.org/licenses/bsd-license.php
> +#
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +#
> +#------------------------------------------------------------------------------
> +
> +//
> +// Gaskets are EFI ABI to UNIX ABI calls
> +// EFI ABI code will sub 40 (0x28) from %rsp before calling a function
> +// This is the 32 (0x20) byte to spill registers and 8 bytes to align stack on 16
> byte boundry.
> +//
> + .text
> +
> +// 32 byte shadow to spill rcx-r9, 8 bytes to align stack on 16 byte boundry
> +// Any call with 0 - 4 arguments allocates 40 bytes on the stack.
> +// For more than 4 args you always have to increase in quanta of 16 so 5 or 6
> args is 56,
> +// 7 or 8 args is 72, and 9 or 10 args is 88
> +
> +
> +
> + .text
> +
> +//
> +// EMU_THUNK_PROTOCOL gaskets (EFIAPI to UNIX ABI)
> +//
> +
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecWriteStdErr)
> +ASM_PFX(GasketSecWriteStdErr):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(SecWriteStdErr)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecConfigStdIn)
> +ASM_PFX(GasketSecConfigStdIn):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + call ASM_PFX(SecConfigStdIn)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecWriteStdOut)
> +ASM_PFX(GasketSecWriteStdOut):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(SecWriteStdOut)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecReadStdIn)
> +ASM_PFX(GasketSecReadStdIn):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(SecReadStdIn)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPollStdIn)
> +ASM_PFX(GasketSecPollStdIn):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + call ASM_PFX(SecPollStdIn)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecMalloc)
> +ASM_PFX(GasketSecMalloc):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(SecMalloc)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecValloc)
> +ASM_PFX(GasketSecValloc):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(SecValloc)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecFree)
> +ASM_PFX(GasketSecFree):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(SecFree)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecSetTimer)
> +ASM_PFX(GasketSecSetTimer):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(SecSetTimer)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecEnableInterrupt)
> +ASM_PFX(GasketSecEnableInterrupt):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + call ASM_PFX(SecEnableInterrupt)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecDisableInterrupt)
> +ASM_PFX(GasketSecDisableInterrupt):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + call ASM_PFX(SecDisableInterrupt)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketQueryPerformanceFrequency)
> +ASM_PFX(GasketQueryPerformanceFrequency):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + call ASM_PFX(QueryPerformanceFrequency)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketQueryPerformanceCounter)
> +ASM_PFX(GasketQueryPerformanceCounter):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + call ASM_PFX(QueryPerformanceCounter)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecSleep)
> +ASM_PFX(GasketSecSleep):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(SecSleep)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecCpuSleep)
> +ASM_PFX(GasketSecCpuSleep):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + call ASM_PFX(SecCpuSleep)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecExit)
> +ASM_PFX(GasketSecExit):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + movq %rcx, %rdi // Swizzle args
> + call ASM_PFX(SecExit) // Less to do as we will never return to EFI ABI
> world
> +LDEAD_LOOP:
> + jmp LDEAD_LOOP // _exit should never return
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecGetTime)
> +ASM_PFX(GasketSecGetTime):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(SecGetTime)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecSetTime)
> +ASM_PFX(GasketSecSetTime):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(SecSetTime)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecGetNextProtocol)
> +ASM_PFX(GasketSecGetNextProtocol):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> +
> + call ASM_PFX(SecGetNextProtocol)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +// PPIs produced by SEC
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPeCoffGetEntryPoint)
> +ASM_PFX(GasketSecPeCoffGetEntryPoint):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(SecPeCoffGetEntryPoint)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPeCoffRelocateImageExtraAction)
> +ASM_PFX(GasketSecPeCoffRelocateImageExtraAction):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(SecPeCoffRelocateImageExtraAction)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketSecPeCoffUnloadImageExtraAction)
> +ASM_PFX(GasketSecPeCoffUnloadImageExtraAction):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(SecPeCoffUnloadImageExtraAction)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecEmuThunkAddress)
> +ASM_PFX(GasketSecEmuThunkAddress):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + call ASM_PFX(SecEmuThunkAddress)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +//
> +// Gasket functions for EFI_EMU_UGA_IO_PROTOCOL
> +//
> +
> +ASM_GLOBAL ASM_PFX(GasketX11Size)
> +ASM_PFX(GasketX11Size):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> +
> + call ASM_PFX(X11Size)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11CheckKey)
> +ASM_PFX(GasketX11CheckKey):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(X11CheckKey)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GetKey)
> +ASM_PFX(GasketX11GetKey):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(X11GetKey)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11KeySetState)
> +ASM_PFX(GasketX11KeySetState):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(X11KeySetState)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11RegisterKeyNotify)
> +ASM_PFX(GasketX11RegisterKeyNotify):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> +
> + call ASM_PFX(X11RegisterKeyNotify)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11Blt)
> +ASM_PFX(GasketX11Blt):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> +
> + call ASM_PFX(X11Blt)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11CheckPointer)
> +ASM_PFX(GasketX11CheckPointer):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(X11CheckPointer)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GetPointerState)
> +ASM_PFX(GasketX11GetPointerState):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(X11GetPointerState)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowOpen)
> +ASM_PFX(GasketX11GraphicsWindowOpen):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(X11GraphicsWindowOpen)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketX11GraphicsWindowClose)
> +ASM_PFX(GasketX11GraphicsWindowClose):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %r9, %rcx
> +
> + call ASM_PFX(X11GraphicsWindowClose)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +// Pthreads
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexLock)
> +ASM_PFX(GasketPthreadMutexLock):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PthreadMutexLock)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexUnLock)
> +ASM_PFX(GasketPthreadMutexUnLock):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PthreadMutexUnLock)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexTryLock)
> +ASM_PFX(GasketPthreadMutexTryLock):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PthreadMutexTryLock)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexInit)
> +ASM_PFX(GasketPthreadMutexInit):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> +
> + call ASM_PFX(PthreadMutexInit)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadMutexDestroy)
> +ASM_PFX(GasketPthreadMutexDestroy):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PthreadMutexDestroy)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadCreate)
> +ASM_PFX(GasketPthreadCreate):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> +
> + call ASM_PFX(PthreadCreate)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadExit)
> +ASM_PFX(GasketPthreadExit):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PthreadExit)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadSelf)
> +ASM_PFX(GasketPthreadSelf):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> +
> + call ASM_PFX(PthreadSelf)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadOpen)
> +ASM_PFX(GasketPthreadOpen):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PthreadOpen)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPthreadClose)
> +ASM_PFX(GasketPthreadClose):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PthreadClose)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +
> +
> +//
> +// UNIX ABI to EFI ABI call
> +//
> +// UINTN
> +// ReverseGasketUint64 (
> +// void *Api,
> +// UINTN Arg1
> +// );
> +ASM_GLOBAL ASM_PFX(ReverseGasketUint64)
> +ASM_PFX(ReverseGasketUint64):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + movq %rdi, %rax // Swizzle args
> + movq %rsi, %rcx
> +
> + subq $32, %rsp // 32-byte shadow space
> + call *%rax
> + addq $32, %rsp
> +
> + popq %rbp
> + ret
> +
> +//
> +// UNIX ABI to EFI ABI call
> +//
> +// UINTN
> +// ReverseGasketUint64Uint64 (
> +// void *Api,
> +// UINTN Arg1
> +// UINTN Arg2
> +// );
> +ASM_GLOBAL ASM_PFX(ReverseGasketUint64Uint64)
> +ASM_PFX(ReverseGasketUint64Uint64):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + movq %rdi, %rax // Swizzle args
> + movq %rsi, %rcx
> +
> + subq $32, %rsp // 32-byte shadow space
> + call *%rax
> + addq $32, %rsp
> +
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecUnixPeiAutoScan)
> +ASM_PFX(GasketSecUnixPeiAutoScan):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> +
> + call ASM_PFX(SecUnixPeiAutoScan)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSecUnixFdAddress)
> +ASM_PFX(GasketSecUnixFdAddress):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> +
> + call ASM_PFX(SecUnixFdAddress)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +// EmuIoThunk SimpleFileSystem
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixOpenVolume)
> +ASM_PFX(GasketPosixOpenVolume):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> +
> + call ASM_PFX(PosixOpenVolume)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileOpen)
> +ASM_PFX(GasketPosixFileOpen):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> + movq 48(%rbp), %r8
> +
> + call ASM_PFX(PosixFileOpen)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileCLose)
> +ASM_PFX(GasketPosixFileCLose):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PosixFileCLose)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileDelete)
> +ASM_PFX(GasketPosixFileDelete):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PosixFileDelete)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileRead)
> +ASM_PFX(GasketPosixFileRead):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> +
> + call ASM_PFX(PosixFileRead)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileWrite)
> +ASM_PFX(GasketPosixFileWrite):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> +
> + call ASM_PFX(PosixFileWrite)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSetPossition)
> +ASM_PFX(GasketPosixFileSetPossition):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(PosixFileSetPossition)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileGetPossition)
> +ASM_PFX(GasketPosixFileGetPossition):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(PosixFileGetPossition)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileGetInfo)
> +ASM_PFX(GasketPosixFileGetInfo):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> +
> + call ASM_PFX(PosixFileGetInfo)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSetInfo)
> +ASM_PFX(GasketPosixFileSetInfo):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> +
> + call ASM_PFX(PosixFileSetInfo)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileFlush)
> +ASM_PFX(GasketPosixFileFlush):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PosixFileFlush)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkOpen)
> +ASM_PFX(GasketPosixFileSystmeThunkOpen):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PosixFileSystmeThunkOpen)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketPosixFileSystmeThunkClose)
> +ASM_PFX(GasketPosixFileSystmeThunkClose):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(PosixFileSystmeThunkClose)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReset)
> +ASM_PFX(GasketEmuBlockIoReset):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(EmuBlockIoReset)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoReadBlocks)
> +ASM_PFX(GasketEmuBlockIoReadBlocks):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> + movq 48(%rbp), %r8
> + movq 56(%rbp), %r9
> +
> + call ASM_PFX(EmuBlockIoReadBlocks)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoWriteBlocks)
> +ASM_PFX(GasketEmuBlockIoWriteBlocks):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> + movq 48(%rbp), %r8
> + movq 56(%rbp), %r9
> +
> + call ASM_PFX(EmuBlockIoWriteBlocks)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoFlushBlocks)
> +ASM_PFX(GasketEmuBlockIoFlushBlocks):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(EmuBlockIoFlushBlocks)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketEmuBlockIoCreateMapping)
> +ASM_PFX(GasketEmuBlockIoCreateMapping):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(EmuBlockIoCreateMapping)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketBlockIoThunkOpen)
> +ASM_PFX(GasketBlockIoThunkOpen):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(EmuBlockIoThunkOpen)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketBlockIoThunkClose)
> +ASM_PFX(GasketBlockIoThunkClose):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(EmuBlockIoThunkClose)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpCreateMapping)
> +ASM_PFX(GasketSnpCreateMapping):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(EmuSnpCreateMapping)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStart)
> +ASM_PFX(GasketSnpStart):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(EmuSnpStart)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStop)
> +ASM_PFX(GasketSnpStop):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(EmuSnpStop)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpInitialize)
> +ASM_PFX(GasketSnpInitialize):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> +
> + call ASM_PFX(EmuSnpInitialize)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpReset)
> +ASM_PFX(GasketSnpReset):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> +
> + call ASM_PFX(EmuSnpReset)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpShutdown)
> +ASM_PFX(GasketSnpShutdown):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(EmuSnpShutdown)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpReceiveFilters)
> +ASM_PFX(GasketSnpReceiveFilters):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> + movq 48(%rbp), %r8
> + movq 56(%rbp), %r9
> +
> + call ASM_PFX(EmuSnpReceiveFilters)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStationAddress)
> +ASM_PFX(GasketSnpStationAddress):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> +
> + call ASM_PFX(EmuSnpStationAddress)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpStatistics)
> +ASM_PFX(GasketSnpStatistics):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> +
> + call ASM_PFX(EmuSnpStatistics)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpMCastIpToMac)
> +ASM_PFX(GasketSnpMCastIpToMac):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> +
> + call ASM_PFX(EmuSnpMCastIpToMac)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpNvData)
> +ASM_PFX(GasketSnpNvData):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> + movq 48(%rbp), %r8
> +
> + call ASM_PFX(EmuSnpNvData)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpGetStatus)
> +ASM_PFX(GasketSnpGetStatus):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> +
> + call ASM_PFX(EmuSnpGetStatus)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpTransmit)
> +ASM_PFX(GasketSnpTransmit):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> + subq $16, %rsp // Allocate space for args on the stack
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> + movq 48(%rbp), %r8
> + movq 56(%rbp), %r9
> + movq 64(%rbp), %rax
> + movq %rax, (%rsp)
> +
> + call ASM_PFX(EmuSnpTransmit)
> + addq $16, %rsp
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpReceive)
> +ASM_PFX(GasketSnpReceive):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> + subq $16, %rsp // Allocate space for args on the stack
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> + movq %rdx, %rsi
> + movq %r8, %rdx
> + movq %r9, %rcx
> + movq 48(%rbp), %r8
> + movq 56(%rbp), %r9
> + movq 64(%rbp), %rax
> + movq %rax, (%rsp)
> +
> + call ASM_PFX(EmuSnpReceive)
> + addq $16, %rsp
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpThunkOpen)
> +ASM_PFX(GasketSnpThunkOpen):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(EmuSnpThunkOpen)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> +ASM_GLOBAL ASM_PFX(GasketSnpThunkClose)
> +ASM_PFX(GasketSnpThunkClose):
> + pushq %rbp // stack frame is for the debugger
> + movq %rsp, %rbp
> +
> + pushq %rsi // %rsi & %rdi are volatile in Unix and callee-save in EFI
> ABI
> + pushq %rdi
> +
> + movq %rcx, %rdi // Swizzle args
> +
> + call ASM_PFX(EmuSnpThunkClose)
> +
> + popq %rdi // restore state
> + popq %rsi
> + popq %rbp
> + ret
> +
> +
> diff --git a/EmulatorPkg/Unix/lldbefi.py b/EmulatorPkg/Unix/lldbefi.py
> index 64549ce3ec..a130cbee5c 100755
> --- a/EmulatorPkg/Unix/lldbefi.py
> +++ b/EmulatorPkg/Unix/lldbefi.py
> @@ -1,540 +1,540 @@
> -#!/usr/bin/python
> -
> -#
> -# Copyright 2014 Apple Inc. All righes reserved.
> -#
> -# This program and the accompanying materials
> -# are licensed and made available under the terms and conditions of the BSD
> License
> -# which accompanies this distribution. The full text of the license may be
> found at
> -# http://opensource.org/licenses/bsd-license.php.
> -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> -#
> -
> -import lldb
> -import os
> -import uuid
> -import string
> -import commands
> -import optparse
> -import shlex
> -
> -guid_dict = {}
> -
> -
> -def EFI_GUID_TypeSummary (valobj,internal_dict):
> - """ Type summary for EFI GUID, print C Name if known
> - """
> - # typedef struct {
> - # UINT32 Data1;
> - # UINT16 Data2;
> - # UINT16 Data3;
> - # UINT8 Data4[8];
> - # } EFI_GUID;
> - SBError = lldb.SBError()
> -
> - data1_val = valobj.GetChildMemberWithName('Data1')
> - data1 = data1_val.GetValueAsUnsigned(0)
> - data2_val = valobj.GetChildMemberWithName('Data2')
> - data2 = data2_val.GetValueAsUnsigned(0)
> - data3_val = valobj.GetChildMemberWithName('Data3')
> - data3 = data3_val.GetValueAsUnsigned(0)
> - str = "%x-%x-%x-" % (data1, data2, data3)
> -
> - data4_val = valobj.GetChildMemberWithName('Data4')
> - for i in range (data4_val.num_children):
> - if i == 2:
> - str +='-'
> - str += "%02x" %
> data4_val.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)
> -
> - return guid_dict.get (str.upper(), '')
> -
> -
> -
> -EFI_STATUS_Dict = {
> - (0x8000000000000000 | 1): "Load Error",
> - (0x8000000000000000 | 2): "Invalid Parameter",
> - (0x8000000000000000 | 3): "Unsupported",
> - (0x8000000000000000 | 4): "Bad Buffer Size",
> - (0x8000000000000000 | 5): "Buffer Too Small",
> - (0x8000000000000000 | 6): "Not Ready",
> - (0x8000000000000000 | 7): "Device Error",
> - (0x8000000000000000 | 8): "Write Protected",
> - (0x8000000000000000 | 9): "Out of Resources",
> - (0x8000000000000000 | 10): "Volume Corrupt",
> - (0x8000000000000000 | 11): "Volume Full",
> - (0x8000000000000000 | 12): "No Media",
> - (0x8000000000000000 | 13): "Media changed",
> - (0x8000000000000000 | 14): "Not Found",
> - (0x8000000000000000 | 15): "Access Denied",
> - (0x8000000000000000 | 16): "No Response",
> - (0x8000000000000000 | 17): "No mapping",
> - (0x8000000000000000 | 18): "Time out",
> - (0x8000000000000000 | 19): "Not started",
> - (0x8000000000000000 | 20): "Already started",
> - (0x8000000000000000 | 21): "Aborted",
> - (0x8000000000000000 | 22): "ICMP Error",
> - (0x8000000000000000 | 23): "TFTP Error",
> - (0x8000000000000000 | 24): "Protocol Error",
> -
> - 0 : "Success",
> - 1 : "Warning Unknown Glyph",
> - 2 : "Warning Delete Failure",
> - 3 : "Warning Write Failure",
> - 4 : "Warning Buffer Too Small",
> -
> - (0x80000000 | 1): "Load Error",
> - (0x80000000 | 2): "Invalid Parameter",
> - (0x80000000 | 3): "Unsupported",
> - (0x80000000 | 4): "Bad Buffer Size",
> - (0x80000000 | 5): "Buffer Too Small",
> - (0x80000000 | 6): "Not Ready",
> - (0x80000000 | 7): "Device Error",
> - (0x80000000 | 8): "Write Protected",
> - (0x80000000 | 9): "Out of Resources",
> - (0x80000000 | 10): "Volume Corrupt",
> - (0x80000000 | 11): "Volume Full",
> - (0x80000000 | 12): "No Media",
> - (0x80000000 | 13): "Media changed",
> - (0x80000000 | 14): "Not Found",
> - (0x80000000 | 15): "Access Denied",
> - (0x80000000 | 16): "No Response",
> - (0x80000000 | 17): "No mapping",
> - (0x80000000 | 18): "Time out",
> - (0x80000000 | 19): "Not started",
> - (0x80000000 | 20): "Already started",
> - (0x80000000 | 21): "Aborted",
> - (0x80000000 | 22): "ICMP Error",
> - (0x80000000 | 23): "TFTP Error",
> - (0x80000000 | 24): "Protocol Error",
> -}
> -
> -def EFI_STATUS_TypeSummary (valobj,internal_dict):
> - #
> - # Return summary string for EFI_STATUS from dictionary
> - #
> - Status = valobj.GetValueAsUnsigned(0)
> - return EFI_STATUS_Dict.get (Status, '')
> -
> -
> -def EFI_TPL_TypeSummary (valobj,internal_dict):
> - #
> - # Return TPL values
> - #
> -
> - if valobj.TypeIsPointerType():
> - return ""
> -
> - Tpl = valobj.GetValueAsUnsigned(0)
> - if Tpl < 4:
> - Str = "%d" % Tpl
> - elif Tpl == 6:
> - Str = "TPL_DRIVER (Obsolete Concept in edk2)"
> - elif Tpl < 8:
> - Str = "TPL_APPLICATION"
> - if Tpl - 4 > 0:
> - Str += " + " + "%d" % (Tpl - 4)
> - elif Tpl < 16:
> - Str = "TPL_CALLBACK"
> - if Tpl - 8 > 0:
> - Str += " + " + "%d" % (Tpl - 4)
> - elif Tpl < 31:
> - Str = "TPL_NOTIFY"
> - if Tpl - 16 > 0:
> - Str += " + " + "%d" % (Tpl - 4)
> - elif Tpl == 31:
> - Str = "TPL_HIGH_LEVEL"
> - else:
> - Str = "Invalid TPL"
> -
> - return Str
> -
> -
> -def CHAR16_TypeSummary (valobj,internal_dict):
> - #
> - # Display EFI CHAR16 'unsigned short' as string
> - #
> - SBError = lldb.SBError()
> - Str = ''
> - if valobj.TypeIsPointerType():
> - if valobj.GetValueAsUnsigned () == 0:
> - return "NULL"
> -
> - # CHAR16 * max string size 1024
> - for i in range (1024):
> - Char = valobj.GetPointeeData(i,1).GetUnsignedInt16(SBError, 0)
> - if SBError.fail or Char == 0:
> - break
> - Str += unichr (Char)
> - Str = 'L"' + Str + '"'
> - return Str.encode ('utf-8', 'replace')
> -
> - if valobj.num_children == 0:
> - # CHAR16
> - if chr (valobj.unsigned) in string.printable:
> - Str = "L'" + unichr (valobj.unsigned) + "'"
> - return Str.encode ('utf-8', 'replace')
> - else:
> - # CHAR16 []
> - for i in range (valobj.num_children):
> - Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt16(SBError, 0)
> - if Char == 0:
> - break
> - Str += unichr (Char)
> - Str = 'L"' + Str + '"'
> - return Str.encode ('utf-8', 'replace')
> -
> - return Str
> -
> -def CHAR8_TypeSummary (valobj,internal_dict):
> - #
> - # Display EFI CHAR8 'signed char' as string
> - # unichr() is used as a junk string can produce an error message like this:
> - # UnicodeEncodeError: 'ascii' codec can't encode character u'\x90' in
> position 1: ordinal not in range(128)
> - #
> - SBError = lldb.SBError()
> - Str = ''
> - if valobj.TypeIsPointerType():
> - if valobj.GetValueAsUnsigned () == 0:
> - return "NULL"
> -
> - # CHAR8 * max string size 1024
> - for i in range (1024):
> - Char = valobj.GetPointeeData(i,1).GetUnsignedInt8(SBError, 0)
> - if SBError.fail or Char == 0:
> - break
> - Str += unichr (Char)
> - Str = '"' + Str + '"'
> - return Str.encode ('utf-8', 'replace')
> -
> - if valobj.num_children == 0:
> - # CHAR8
> - if chr (valobj.unsigned) in string.printable:
> - Str = '"' + unichr (valobj.unsigned) + '"'
> - return Str.encode ('utf-8', 'replace')
> - else:
> - # CHAR8 []
> - for i in range (valobj.num_children):
> - Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)
> - if Char == 0:
> - break
> - Str += unichr (Char)
> - Str = '"' + Str + '"'
> - return Str.encode ('utf-8', 'replace')
> -
> - return Str
> -
> -device_path_dict = {
> - (0x01, 0x01): "PCI_DEVICE_PATH",
> - (0x01, 0x02): "PCCARD_DEVICE_PATH",
> - (0x01, 0x03): "MEMMAP_DEVICE_PATH",
> - (0x01, 0x04): "VENDOR_DEVICE_PATH",
> - (0x01, 0x05): "CONTROLLER_DEVICE_PATH",
> - (0x02, 0x01): "ACPI_HID_DEVICE_PATH",
> - (0x02, 0x02): "ACPI_EXTENDED_HID_DEVICE_PATH",
> - (0x02, 0x03): "ACPI_ADR_DEVICE_PATH",
> - (0x03, 0x01): "ATAPI_DEVICE_PATH",
> - (0x03, 0x12): "SATA_DEVICE_PATH",
> - (0x03, 0x02): "SCSI_DEVICE_PATH",
> - (0x03, 0x03): "FIBRECHANNEL_DEVICE_PATH",
> - (0x03, 0x04): "F1394_DEVICE_PATH",
> - (0x03, 0x05): "USB_DEVICE_PATH",
> - (0x03, 0x0f): "USB_CLASS_DEVICE_PATH",
> - (0x03, 0x10): "FW_SBP2_UNIT_LUN_DEVICE_PATH",
> - (0x03, 0x11): "DEVICE_LOGICAL_UNIT_DEVICE_PATH",
> - (0x03, 0x06): "I2O_DEVICE_PATH",
> - (0x03, 0x0b): "MAC_ADDR_DEVICE_PATH",
> - (0x03, 0x0c): "IPv4_DEVICE_PATH",
> - (0x03, 0x09): "INFINIBAND_DEVICE_PATH",
> - (0x03, 0x0e): "UART_DEVICE_PATH",
> - (0x03, 0x0a): "VENDOR_DEVICE_PATH",
> - (0x03, 0x13): "ISCSI_DEVICE_PATH",
> - (0x04, 0x01): "HARDDRIVE_DEVICE_PATH",
> - (0x04, 0x02): "CDROM_DEVICE_PATH",
> - (0x04, 0x03): "VENDOR_DEVICE_PATH",
> - (0x04, 0x04): "FILEPATH_DEVICE_PATH",
> - (0x04, 0x05): "MEDIA_PROTOCOL_DEVICE_PATH",
> - (0x05, 0x01): "BBS_BBS_DEVICE_PATH",
> - (0x7F, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",
> - (0xFF, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",
> -}
> -
> -def EFI_DEVICE_PATH_PROTOCOL_TypeSummary (valobj,internal_dict):
> - #
> - #
> - #
> - if valobj.TypeIsPointerType():
> - # EFI_DEVICE_PATH_PROTOCOL *
> - return ""
> -
> - Str = ""
> - if valobj.num_children == 3:
> - # EFI_DEVICE_PATH_PROTOCOL
> - Type = valobj.GetChildMemberWithName('Type').unsigned
> - SubType = valobj.GetChildMemberWithName('SubType').unsigned
> - if (Type, SubType) in device_path_dict:
> - TypeStr = device_path_dict[Type, SubType]
> - else:
> - TypeStr = ""
> -
> - LenLow =
> valobj.GetChildMemberWithName('Length').GetChildAtIndex(0).unsigned
> - LenHigh =
> valobj.GetChildMemberWithName('Length').GetChildAtIndex(1).unsigned
> - Len = LenLow + (LenHigh >> 8)
> -
> - Address = long ("%d" % valobj.addr)
> - if (Address == lldb.LLDB_INVALID_ADDRESS):
> - # Need to reserach this, it seems to be the nested struct case
> - ExprStr = ""
> - elif (Type & 0x7f == 0x7f):
> - ExprStr = "End Device Path" if SubType == 0xff else "End This Instance"
> - else:
> - ExprStr = "expr *(%s *)0x%08x" % (TypeStr, Address)
> -
> - Str = " {\n"
> - Str += " (UINT8) Type = 0x%02x // %s\n" % (Type, "END" if (Type & 0x7f
> == 0x7f) else "")
> - Str += " (UINT8) SubType = 0x%02x // %s\n" % (SubType, ExprStr)
> - Str += " (UINT8 [2]) Length = { // 0x%04x (%d) bytes\n" % (Len, Len)
> - Str += " (UINT8) [0] = 0x%02x\n" % LenLow
> - Str += " (UINT8) [1] = 0x%02x\n" % LenHigh
> - Str += " }\n"
> - if (Type & 0x7f == 0x7f) and (SubType == 0xff):
> - pass
> - elif ExprStr != "":
> - NextNode = Address + Len
> - Str += "// Next node 'expr *(EFI_DEVICE_PATH_PROTOCOL *)0x%08x'\n" %
> NextNode
> -
> - return Str
> -
> -
> -
> -def TypePrintFormating(debugger):
> - #
> - # Set the default print formating for EFI types in lldb.
> - # seems lldb defaults to decimal.
> - #
> - category = debugger.GetDefaultCategory()
> - FormatBool = lldb.SBTypeFormat(lldb.eFormatBoolean)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("BOOLEAN"),
> FormatBool)
> -
> - FormatHex = lldb.SBTypeFormat(lldb.eFormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT64"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT64"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT32"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT32"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT16"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT16"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT8"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT8"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINTN"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("INTN"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR8"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR16"), FormatHex)
> -
> -
> category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_PHYSICAL_ADDRESS"),
> FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("PHYSICAL_ADDRESS"),
> FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_STATUS"),
> FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_TPL"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_LBA"), FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_BOOT_MODE"),
> FormatHex)
> - category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_FV_FILETYPE"),
> FormatHex)
> -
> - #
> - # Smart type printing for EFI
> - #
> - debugger.HandleCommand("type summary add EFI_GUID --python-function
> lldbefi.EFI_GUID_TypeSummary")
> - debugger.HandleCommand("type summary add EFI_STATUS --python-
> function lldbefi.EFI_STATUS_TypeSummary")
> - debugger.HandleCommand("type summary add EFI_TPL --python-function
> lldbefi.EFI_TPL_TypeSummary")
> - debugger.HandleCommand("type summary add
> EFI_DEVICE_PATH_PROTOCOL --python-function
> lldbefi.EFI_DEVICE_PATH_PROTOCOL_TypeSummary")
> -
> - debugger.HandleCommand("type summary add CHAR16 --python-function
> lldbefi.CHAR16_TypeSummary")
> - debugger.HandleCommand('type summary add --regex "CHAR16 \[[0-9]+\]"
> --python-function lldbefi.CHAR16_TypeSummary')
> - debugger.HandleCommand("type summary add CHAR8 --python-function
> lldbefi.CHAR8_TypeSummary")
> - debugger.HandleCommand('type summary add --regex "CHAR8 \[[0-9]+\]" -
> -python-function lldbefi.CHAR8_TypeSummary')
> -
> -
> -gEmulatorBreakWorkaroundNeeded = True
> -
> -def LoadEmulatorEfiSymbols(frame, bp_loc , internal_dict):
> - #
> - # This is an lldb breakpoint script, and assumes the breakpoint is on a
> - # function with the same prototype as SecGdbScriptBreak(). The
> - # argument names are important as lldb looks them up.
> - #
> - # VOID
> - # SecGdbScriptBreak (
> - # char *FileName,
> - # int FileNameLength,
> - # long unsigned int LoadAddress,
> - # int AddSymbolFlag
> - # )
> - # {
> - # return;
> - # }
> - #
> - # When the emulator loads a PE/COFF image, it calls the stub function with
> - # the filename of the symbol file, the length of the FileName, the
> - # load address and a flag to indicate if this is a load or unload operation
> - #
> - global gEmulatorBreakWorkaroundNeeded
> -
> - if gEmulatorBreakWorkaroundNeeded:
> - # turn off lldb debug prints on SIGALRM (EFI timer tick)
> - frame.thread.process.target.debugger.HandleCommand("process handle
> SIGALRM -n false")
> - gEmulatorBreakWorkaroundNeeded = False
> -
> - # Convert C string to Python string
> - Error = lldb.SBError()
> - FileNamePtr = frame.FindVariable ("FileName").GetValueAsUnsigned()
> - FileNameLen = frame.FindVariable
> ("FileNameLength").GetValueAsUnsigned()
> - FileName = frame.thread.process.ReadCStringFromMemory (FileNamePtr,
> FileNameLen, Error)
> - if not Error.Success():
> - print "!ReadCStringFromMemory() did not find a %d byte C string at %x" %
> (FileNameLen, FileNamePtr)
> - # make breakpoint command contiue
> - frame.GetThread().GetProcess().Continue()
> -
> - debugger = frame.thread.process.target.debugger
> - if frame.FindVariable ("AddSymbolFlag").GetValueAsUnsigned() == 1:
> - LoadAddress = frame.FindVariable ("LoadAddress").GetValueAsUnsigned()
> -
> - debugger.HandleCommand ("target modules add %s" % FileName)
> - print "target modules load --slid 0x%x %s" % (LoadAddress, FileName)
> - debugger.HandleCommand ("target modules load --slide 0x%x --file %s" %
> (LoadAddress, FileName))
> - else:
> - target = debugger.GetSelectedTarget()
> - for SBModule in target.module_iter():
> - ModuleName = SBModule.GetFileSpec().GetDirectory() + '/'
> - ModuleName += SBModule.GetFileSpec().GetFilename()
> - if FileName == ModuleName or FileName ==
> SBModule.GetFileSpec().GetFilename():
> - target.ClearModuleLoadAddress (SBModule)
> - if not target.RemoveModule (SBModule):
> - print "!lldb.target.RemoveModule (%s) FAILED" % SBModule
> -
> - # make breakpoint command contiue
> - frame.thread.process.Continue()
> -
> -def GuidToCStructStr (guid, Name=False):
> - #
> - # Convert a 16-byte bytesarry (or bytearray compat object) to C guid string
> - # { 0xB402621F, 0xA940, 0x1E4A, { 0x86, 0x6B, 0x4D, 0xC9, 0x16, 0x2B, 0x34,
> 0x7C } }
> - #
> - # Name=True means lookup name in GuidNameDict and us it if you find it
> - #
> -
> - if not isinstance (guid, bytearray):
> - # convert guid object to UUID, and UUID to bytearray
> - Uuid = uuid.UUID(guid)
> - guid = bytearray (Uuid.bytes_le)
> -
> - return "{ 0x%02.2X%02.2X%02.2X%02.2X, 0x%02.2X%02.2X, 0x%02.2X%02.2X,
> { 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X,
> 0x%02.2X } }" % \
> - (guid[3], guid[2], guid[1], guid[0], guid[5], guid[4], guid[7], guid[6],
> guid[8], guid[9], guid[10], guid[11], guid[12], guid[13], guid[14], guid[15])
> -
> -def ParseGuidString(GuidStr):
> - #
> - # Error check and convert C Guid init to string
> - # ParseGuidString("49152E77-1ADA-4764-B7A2-7AFEFED95E8B")
> - # ParseGuidString("{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7,
> 0x8A, 0x35, 0x46, 0xD1 } }")
> - #
> -
> - if "{" in GuidStr :
> - # convert C form "{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7,
> 0x8A, 0x35, 0x46, 0xD1 } }"
> - # to string form BA24B391-73FD-C54C-9EAF-0CA78A3546D1
> - # make a list of Hex numbers like: ['0xBA24B391', '0x73FD', '0xC54C', '0x9E',
> '0xAF', '0x0C', '0xA7', '0x8A', '0x35', '0x46', '0xD1']
> - Hex = ''.join(x for x in GuidStr if x not in '{,}').split()
> - Str = "%08X-%04X-%04X-%02.2X%02.2X-
> %02.2X%02.2X%02.2X%02.2X%02.2X%02.2X" % \
> - (int(Hex[0], 0), int(Hex[1], 0), int(Hex[2], 0), int(Hex[3], 0), int(Hex[4], 0),
> \
> - int(Hex[5], 0), int(Hex[6], 0), int(Hex[7], 0), int(Hex[8], 0), int(Hex[9], 0),
> int(Hex[10], 0))
> - elif GuidStr.count('-') == 4:
> - # validate "49152E77-1ADA-4764-B7A2-7AFEFED95E8B" form
> - Check = "%s" % str(uuid.UUID(GuidStr)).upper()
> - if GuidStr.upper() == Check:
> - Str = GuidStr.upper()
> - else:
> - Ste = ""
> - else:
> - Str = ""
> -
> - return Str
> -
> -
> -def create_guid_options():
> - usage = "usage: %prog [data]"
> - description='''lookup EFI_GUID by CName, C struct, or GUID string and print
> out all three.
> - '''
> - parser = optparse.OptionParser(description=description,
> prog='guid',usage=usage)
> - return parser
> -
> -def efi_guid_command(debugger, command, result, dict):
> - # Use the Shell Lexer to properly parse up command options just like a
> - # shell would
> - command_args = shlex.split(command)
> - parser = create_guid_options()
> - try:
> - (options, args) = parser.parse_args(command_args)
> - if len(args) >= 1:
> - if args[0] == "{":
> - # caller forgot to quote the string"
> - # mark arg[0] a string containing all args[n]
> - args[0] = ' '.join(args)
> - GuidStr = ParseGuidString (args[0])
> - if GuidStr == "":
> - # return Key of GuidNameDict for value args[0]
> - GuidStr = [Key for Key, Value in guid_dict.iteritems() if Value ==
> args[0]][0]
> - GuidStr = GuidStr.upper()
> - except:
> - # if you don't handle exceptions, passing an incorrect argument to the
> OptionParser will cause LLDB to exit
> - # (courtesy of OptParse dealing with argument errors by throwing
> SystemExit)
> - result.SetError ("option parsing failed")
> - return
> -
> -
> - if len(args) >= 1:
> - if GuidStr in guid_dict:
> - print "%s = %s" % (guid_dict[GuidStr], GuidStr)
> - print "%s = %s" % (guid_dict[GuidStr], GuidToCStructStr (GuidStr))
> - else:
> - print GuidStr
> - else:
> - # dump entire dictionary
> - width = max(len(v) for k,v in guid_dict.iteritems())
> - for value in sorted(guid_dict, key=guid_dict.get):
> - print '%-*s %s %s' % (width, guid_dict[value], value,
> GuidToCStructStr(value))
> -
> - return
> -
> -
> -#
> -########## Code that runs when this script is imported into LLDB
> ###########
> -#
> -def __lldb_init_module (debugger, internal_dict):
> - # This initializer is being run from LLDB in the embedded command
> interpreter
> - # Make the options so we can generate the help text for the new LLDB
> - # command line command prior to registering it with LLDB below
> -
> - global guid_dict
> -
> - # Source Guid.xref file if we can find it
> - inputfile = os.getcwd()
> - inputfile += os.sep + os.pardir + os.sep + 'FV' + os.sep + 'Guid.xref'
> - with open(inputfile) as f:
> - for line in f:
> - data = line.split(' ')
> - if len(data) >= 2:
> - guid_dict[data[0].upper()] = data[1].strip('\n')
> -
> - # init EFI specific type formaters
> - TypePrintFormating (debugger)
> -
> -
> - # add guid command
> - parser = create_guid_options()
> - efi_guid_command.__doc__ = parser.format_help()
> - debugger.HandleCommand('command script add -f
> lldbefi.efi_guid_command guid')
> -
> -
> - Target = debugger.GetTargetAtIndex(0)
> - if Target:
> - Breakpoint = Target.BreakpointCreateByName('SecGdbScriptBreak')
> - if Breakpoint.GetNumLocations() == 1:
> - # Set the emulator breakpoints, if we are in the emulator
> - debugger.HandleCommand("breakpoint command add -s python -F
> lldbefi.LoadEmulatorEfiSymbols {id}".format(id=Breakpoint.GetID()))
> - print 'Type r to run emulator. SecLldbScriptBreak armed. EFI modules
> should now get source level debugging in the emulator.'
> +#!/usr/bin/python
> +
> +#
> +# Copyright 2014 Apple Inc. All righes reserved.
> +#
> +# This program and the accompanying materials
> +# are licensed and made available under the terms and conditions of the BSD
> License
> +# which accompanies this distribution. The full text of the license may be
> found at
> +# http://opensource.org/licenses/bsd-license.php.
> +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS"
> BASIS,
> +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER
> EXPRESS OR IMPLIED.
> +#
> +
> +import lldb
> +import os
> +import uuid
> +import string
> +import commands
> +import optparse
> +import shlex
> +
> +guid_dict = {}
> +
> +
> +def EFI_GUID_TypeSummary (valobj,internal_dict):
> + """ Type summary for EFI GUID, print C Name if known
> + """
> + # typedef struct {
> + # UINT32 Data1;
> + # UINT16 Data2;
> + # UINT16 Data3;
> + # UINT8 Data4[8];
> + # } EFI_GUID;
> + SBError = lldb.SBError()
> +
> + data1_val = valobj.GetChildMemberWithName('Data1')
> + data1 = data1_val.GetValueAsUnsigned(0)
> + data2_val = valobj.GetChildMemberWithName('Data2')
> + data2 = data2_val.GetValueAsUnsigned(0)
> + data3_val = valobj.GetChildMemberWithName('Data3')
> + data3 = data3_val.GetValueAsUnsigned(0)
> + str = "%x-%x-%x-" % (data1, data2, data3)
> +
> + data4_val = valobj.GetChildMemberWithName('Data4')
> + for i in range (data4_val.num_children):
> + if i == 2:
> + str +='-'
> + str += "%02x" %
> data4_val.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)
> +
> + return guid_dict.get (str.upper(), '')
> +
> +
> +
> +EFI_STATUS_Dict = {
> + (0x8000000000000000 | 1): "Load Error",
> + (0x8000000000000000 | 2): "Invalid Parameter",
> + (0x8000000000000000 | 3): "Unsupported",
> + (0x8000000000000000 | 4): "Bad Buffer Size",
> + (0x8000000000000000 | 5): "Buffer Too Small",
> + (0x8000000000000000 | 6): "Not Ready",
> + (0x8000000000000000 | 7): "Device Error",
> + (0x8000000000000000 | 8): "Write Protected",
> + (0x8000000000000000 | 9): "Out of Resources",
> + (0x8000000000000000 | 10): "Volume Corrupt",
> + (0x8000000000000000 | 11): "Volume Full",
> + (0x8000000000000000 | 12): "No Media",
> + (0x8000000000000000 | 13): "Media changed",
> + (0x8000000000000000 | 14): "Not Found",
> + (0x8000000000000000 | 15): "Access Denied",
> + (0x8000000000000000 | 16): "No Response",
> + (0x8000000000000000 | 17): "No mapping",
> + (0x8000000000000000 | 18): "Time out",
> + (0x8000000000000000 | 19): "Not started",
> + (0x8000000000000000 | 20): "Already started",
> + (0x8000000000000000 | 21): "Aborted",
> + (0x8000000000000000 | 22): "ICMP Error",
> + (0x8000000000000000 | 23): "TFTP Error",
> + (0x8000000000000000 | 24): "Protocol Error",
> +
> + 0 : "Success",
> + 1 : "Warning Unknown Glyph",
> + 2 : "Warning Delete Failure",
> + 3 : "Warning Write Failure",
> + 4 : "Warning Buffer Too Small",
> +
> + (0x80000000 | 1): "Load Error",
> + (0x80000000 | 2): "Invalid Parameter",
> + (0x80000000 | 3): "Unsupported",
> + (0x80000000 | 4): "Bad Buffer Size",
> + (0x80000000 | 5): "Buffer Too Small",
> + (0x80000000 | 6): "Not Ready",
> + (0x80000000 | 7): "Device Error",
> + (0x80000000 | 8): "Write Protected",
> + (0x80000000 | 9): "Out of Resources",
> + (0x80000000 | 10): "Volume Corrupt",
> + (0x80000000 | 11): "Volume Full",
> + (0x80000000 | 12): "No Media",
> + (0x80000000 | 13): "Media changed",
> + (0x80000000 | 14): "Not Found",
> + (0x80000000 | 15): "Access Denied",
> + (0x80000000 | 16): "No Response",
> + (0x80000000 | 17): "No mapping",
> + (0x80000000 | 18): "Time out",
> + (0x80000000 | 19): "Not started",
> + (0x80000000 | 20): "Already started",
> + (0x80000000 | 21): "Aborted",
> + (0x80000000 | 22): "ICMP Error",
> + (0x80000000 | 23): "TFTP Error",
> + (0x80000000 | 24): "Protocol Error",
> +}
> +
> +def EFI_STATUS_TypeSummary (valobj,internal_dict):
> + #
> + # Return summary string for EFI_STATUS from dictionary
> + #
> + Status = valobj.GetValueAsUnsigned(0)
> + return EFI_STATUS_Dict.get (Status, '')
> +
> +
> +def EFI_TPL_TypeSummary (valobj,internal_dict):
> + #
> + # Return TPL values
> + #
> +
> + if valobj.TypeIsPointerType():
> + return ""
> +
> + Tpl = valobj.GetValueAsUnsigned(0)
> + if Tpl < 4:
> + Str = "%d" % Tpl
> + elif Tpl == 6:
> + Str = "TPL_DRIVER (Obsolete Concept in edk2)"
> + elif Tpl < 8:
> + Str = "TPL_APPLICATION"
> + if Tpl - 4 > 0:
> + Str += " + " + "%d" % (Tpl - 4)
> + elif Tpl < 16:
> + Str = "TPL_CALLBACK"
> + if Tpl - 8 > 0:
> + Str += " + " + "%d" % (Tpl - 4)
> + elif Tpl < 31:
> + Str = "TPL_NOTIFY"
> + if Tpl - 16 > 0:
> + Str += " + " + "%d" % (Tpl - 4)
> + elif Tpl == 31:
> + Str = "TPL_HIGH_LEVEL"
> + else:
> + Str = "Invalid TPL"
> +
> + return Str
> +
> +
> +def CHAR16_TypeSummary (valobj,internal_dict):
> + #
> + # Display EFI CHAR16 'unsigned short' as string
> + #
> + SBError = lldb.SBError()
> + Str = ''
> + if valobj.TypeIsPointerType():
> + if valobj.GetValueAsUnsigned () == 0:
> + return "NULL"
> +
> + # CHAR16 * max string size 1024
> + for i in range (1024):
> + Char = valobj.GetPointeeData(i,1).GetUnsignedInt16(SBError, 0)
> + if SBError.fail or Char == 0:
> + break
> + Str += unichr (Char)
> + Str = 'L"' + Str + '"'
> + return Str.encode ('utf-8', 'replace')
> +
> + if valobj.num_children == 0:
> + # CHAR16
> + if chr (valobj.unsigned) in string.printable:
> + Str = "L'" + unichr (valobj.unsigned) + "'"
> + return Str.encode ('utf-8', 'replace')
> + else:
> + # CHAR16 []
> + for i in range (valobj.num_children):
> + Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt16(SBError, 0)
> + if Char == 0:
> + break
> + Str += unichr (Char)
> + Str = 'L"' + Str + '"'
> + return Str.encode ('utf-8', 'replace')
> +
> + return Str
> +
> +def CHAR8_TypeSummary (valobj,internal_dict):
> + #
> + # Display EFI CHAR8 'signed char' as string
> + # unichr() is used as a junk string can produce an error message like this:
> + # UnicodeEncodeError: 'ascii' codec can't encode character u'\x90' in
> position 1: ordinal not in range(128)
> + #
> + SBError = lldb.SBError()
> + Str = ''
> + if valobj.TypeIsPointerType():
> + if valobj.GetValueAsUnsigned () == 0:
> + return "NULL"
> +
> + # CHAR8 * max string size 1024
> + for i in range (1024):
> + Char = valobj.GetPointeeData(i,1).GetUnsignedInt8(SBError, 0)
> + if SBError.fail or Char == 0:
> + break
> + Str += unichr (Char)
> + Str = '"' + Str + '"'
> + return Str.encode ('utf-8', 'replace')
> +
> + if valobj.num_children == 0:
> + # CHAR8
> + if chr (valobj.unsigned) in string.printable:
> + Str = '"' + unichr (valobj.unsigned) + '"'
> + return Str.encode ('utf-8', 'replace')
> + else:
> + # CHAR8 []
> + for i in range (valobj.num_children):
> + Char = valobj.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0)
> + if Char == 0:
> + break
> + Str += unichr (Char)
> + Str = '"' + Str + '"'
> + return Str.encode ('utf-8', 'replace')
> +
> + return Str
> +
> +device_path_dict = {
> + (0x01, 0x01): "PCI_DEVICE_PATH",
> + (0x01, 0x02): "PCCARD_DEVICE_PATH",
> + (0x01, 0x03): "MEMMAP_DEVICE_PATH",
> + (0x01, 0x04): "VENDOR_DEVICE_PATH",
> + (0x01, 0x05): "CONTROLLER_DEVICE_PATH",
> + (0x02, 0x01): "ACPI_HID_DEVICE_PATH",
> + (0x02, 0x02): "ACPI_EXTENDED_HID_DEVICE_PATH",
> + (0x02, 0x03): "ACPI_ADR_DEVICE_PATH",
> + (0x03, 0x01): "ATAPI_DEVICE_PATH",
> + (0x03, 0x12): "SATA_DEVICE_PATH",
> + (0x03, 0x02): "SCSI_DEVICE_PATH",
> + (0x03, 0x03): "FIBRECHANNEL_DEVICE_PATH",
> + (0x03, 0x04): "F1394_DEVICE_PATH",
> + (0x03, 0x05): "USB_DEVICE_PATH",
> + (0x03, 0x0f): "USB_CLASS_DEVICE_PATH",
> + (0x03, 0x10): "FW_SBP2_UNIT_LUN_DEVICE_PATH",
> + (0x03, 0x11): "DEVICE_LOGICAL_UNIT_DEVICE_PATH",
> + (0x03, 0x06): "I2O_DEVICE_PATH",
> + (0x03, 0x0b): "MAC_ADDR_DEVICE_PATH",
> + (0x03, 0x0c): "IPv4_DEVICE_PATH",
> + (0x03, 0x09): "INFINIBAND_DEVICE_PATH",
> + (0x03, 0x0e): "UART_DEVICE_PATH",
> + (0x03, 0x0a): "VENDOR_DEVICE_PATH",
> + (0x03, 0x13): "ISCSI_DEVICE_PATH",
> + (0x04, 0x01): "HARDDRIVE_DEVICE_PATH",
> + (0x04, 0x02): "CDROM_DEVICE_PATH",
> + (0x04, 0x03): "VENDOR_DEVICE_PATH",
> + (0x04, 0x04): "FILEPATH_DEVICE_PATH",
> + (0x04, 0x05): "MEDIA_PROTOCOL_DEVICE_PATH",
> + (0x05, 0x01): "BBS_BBS_DEVICE_PATH",
> + (0x7F, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",
> + (0xFF, 0xFF): "EFI_DEVICE_PATH_PROTOCOL",
> +}
> +
> +def EFI_DEVICE_PATH_PROTOCOL_TypeSummary (valobj,internal_dict):
> + #
> + #
> + #
> + if valobj.TypeIsPointerType():
> + # EFI_DEVICE_PATH_PROTOCOL *
> + return ""
> +
> + Str = ""
> + if valobj.num_children == 3:
> + # EFI_DEVICE_PATH_PROTOCOL
> + Type = valobj.GetChildMemberWithName('Type').unsigned
> + SubType = valobj.GetChildMemberWithName('SubType').unsigned
> + if (Type, SubType) in device_path_dict:
> + TypeStr = device_path_dict[Type, SubType]
> + else:
> + TypeStr = ""
> +
> + LenLow =
> valobj.GetChildMemberWithName('Length').GetChildAtIndex(0).unsigned
> + LenHigh =
> valobj.GetChildMemberWithName('Length').GetChildAtIndex(1).unsigned
> + Len = LenLow + (LenHigh >> 8)
> +
> + Address = long ("%d" % valobj.addr)
> + if (Address == lldb.LLDB_INVALID_ADDRESS):
> + # Need to reserach this, it seems to be the nested struct case
> + ExprStr = ""
> + elif (Type & 0x7f == 0x7f):
> + ExprStr = "End Device Path" if SubType == 0xff else "End This Instance"
> + else:
> + ExprStr = "expr *(%s *)0x%08x" % (TypeStr, Address)
> +
> + Str = " {\n"
> + Str += " (UINT8) Type = 0x%02x // %s\n" % (Type, "END" if (Type & 0x7f
> == 0x7f) else "")
> + Str += " (UINT8) SubType = 0x%02x // %s\n" % (SubType, ExprStr)
> + Str += " (UINT8 [2]) Length = { // 0x%04x (%d) bytes\n" % (Len, Len)
> + Str += " (UINT8) [0] = 0x%02x\n" % LenLow
> + Str += " (UINT8) [1] = 0x%02x\n" % LenHigh
> + Str += " }\n"
> + if (Type & 0x7f == 0x7f) and (SubType == 0xff):
> + pass
> + elif ExprStr != "":
> + NextNode = Address + Len
> + Str += "// Next node 'expr *(EFI_DEVICE_PATH_PROTOCOL *)0x%08x'\n" %
> NextNode
> +
> + return Str
> +
> +
> +
> +def TypePrintFormating(debugger):
> + #
> + # Set the default print formating for EFI types in lldb.
> + # seems lldb defaults to decimal.
> + #
> + category = debugger.GetDefaultCategory()
> + FormatBool = lldb.SBTypeFormat(lldb.eFormatBoolean)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("BOOLEAN"),
> FormatBool)
> +
> + FormatHex = lldb.SBTypeFormat(lldb.eFormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT64"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT64"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT32"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT32"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT16"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT16"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINT8"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("INT8"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("UINTN"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("INTN"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR8"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("CHAR16"), FormatHex)
> +
> +
> category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_PHYSICAL_ADDRESS"),
> FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("PHYSICAL_ADDRESS"),
> FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_STATUS"),
> FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_TPL"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_LBA"), FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_BOOT_MODE"),
> FormatHex)
> + category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_FV_FILETYPE"),
> FormatHex)
> +
> + #
> + # Smart type printing for EFI
> + #
> + debugger.HandleCommand("type summary add EFI_GUID --python-function
> lldbefi.EFI_GUID_TypeSummary")
> + debugger.HandleCommand("type summary add EFI_STATUS --python-
> function lldbefi.EFI_STATUS_TypeSummary")
> + debugger.HandleCommand("type summary add EFI_TPL --python-function
> lldbefi.EFI_TPL_TypeSummary")
> + debugger.HandleCommand("type summary add
> EFI_DEVICE_PATH_PROTOCOL --python-function
> lldbefi.EFI_DEVICE_PATH_PROTOCOL_TypeSummary")
> +
> + debugger.HandleCommand("type summary add CHAR16 --python-function
> lldbefi.CHAR16_TypeSummary")
> + debugger.HandleCommand('type summary add --regex "CHAR16 \[[0-9]+\]"
> --python-function lldbefi.CHAR16_TypeSummary')
> + debugger.HandleCommand("type summary add CHAR8 --python-function
> lldbefi.CHAR8_TypeSummary")
> + debugger.HandleCommand('type summary add --regex "CHAR8 \[[0-9]+\]" -
> -python-function lldbefi.CHAR8_TypeSummary')
> +
> +
> +gEmulatorBreakWorkaroundNeeded = True
> +
> +def LoadEmulatorEfiSymbols(frame, bp_loc , internal_dict):
> + #
> + # This is an lldb breakpoint script, and assumes the breakpoint is on a
> + # function with the same prototype as SecGdbScriptBreak(). The
> + # argument names are important as lldb looks them up.
> + #
> + # VOID
> + # SecGdbScriptBreak (
> + # char *FileName,
> + # int FileNameLength,
> + # long unsigned int LoadAddress,
> + # int AddSymbolFlag
> + # )
> + # {
> + # return;
> + # }
> + #
> + # When the emulator loads a PE/COFF image, it calls the stub function with
> + # the filename of the symbol file, the length of the FileName, the
> + # load address and a flag to indicate if this is a load or unload operation
> + #
> + global gEmulatorBreakWorkaroundNeeded
> +
> + if gEmulatorBreakWorkaroundNeeded:
> + # turn off lldb debug prints on SIGALRM (EFI timer tick)
> + frame.thread.process.target.debugger.HandleCommand("process handle
> SIGALRM -n false")
> + gEmulatorBreakWorkaroundNeeded = False
> +
> + # Convert C string to Python string
> + Error = lldb.SBError()
> + FileNamePtr = frame.FindVariable ("FileName").GetValueAsUnsigned()
> + FileNameLen = frame.FindVariable
> ("FileNameLength").GetValueAsUnsigned()
> + FileName = frame.thread.process.ReadCStringFromMemory (FileNamePtr,
> FileNameLen, Error)
> + if not Error.Success():
> + print "!ReadCStringFromMemory() did not find a %d byte C string at %x" %
> (FileNameLen, FileNamePtr)
> + # make breakpoint command contiue
> + frame.GetThread().GetProcess().Continue()
> +
> + debugger = frame.thread.process.target.debugger
> + if frame.FindVariable ("AddSymbolFlag").GetValueAsUnsigned() == 1:
> + LoadAddress = frame.FindVariable ("LoadAddress").GetValueAsUnsigned()
> +
> + debugger.HandleCommand ("target modules add %s" % FileName)
> + print "target modules load --slid 0x%x %s" % (LoadAddress, FileName)
> + debugger.HandleCommand ("target modules load --slide 0x%x --file %s" %
> (LoadAddress, FileName))
> + else:
> + target = debugger.GetSelectedTarget()
> + for SBModule in target.module_iter():
> + ModuleName = SBModule.GetFileSpec().GetDirectory() + '/'
> + ModuleName += SBModule.GetFileSpec().GetFilename()
> + if FileName == ModuleName or FileName ==
> SBModule.GetFileSpec().GetFilename():
> + target.ClearModuleLoadAddress (SBModule)
> + if not target.RemoveModule (SBModule):
> + print "!lldb.target.RemoveModule (%s) FAILED" % SBModule
> +
> + # make breakpoint command contiue
> + frame.thread.process.Continue()
> +
> +def GuidToCStructStr (guid, Name=False):
> + #
> + # Convert a 16-byte bytesarry (or bytearray compat object) to C guid string
> + # { 0xB402621F, 0xA940, 0x1E4A, { 0x86, 0x6B, 0x4D, 0xC9, 0x16, 0x2B, 0x34,
> 0x7C } }
> + #
> + # Name=True means lookup name in GuidNameDict and us it if you find it
> + #
> +
> + if not isinstance (guid, bytearray):
> + # convert guid object to UUID, and UUID to bytearray
> + Uuid = uuid.UUID(guid)
> + guid = bytearray (Uuid.bytes_le)
> +
> + return "{ 0x%02.2X%02.2X%02.2X%02.2X, 0x%02.2X%02.2X, 0x%02.2X%02.2X,
> { 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X, 0x%02.2X,
> 0x%02.2X } }" % \
> + (guid[3], guid[2], guid[1], guid[0], guid[5], guid[4], guid[7], guid[6],
> guid[8], guid[9], guid[10], guid[11], guid[12], guid[13], guid[14], guid[15])
> +
> +def ParseGuidString(GuidStr):
> + #
> + # Error check and convert C Guid init to string
> + # ParseGuidString("49152E77-1ADA-4764-B7A2-7AFEFED95E8B")
> + # ParseGuidString("{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7,
> 0x8A, 0x35, 0x46, 0xD1 } }")
> + #
> +
> + if "{" in GuidStr :
> + # convert C form "{ 0xBA24B391, 0x73FD, 0xC54C, { 0x9E, 0xAF, 0x0C, 0xA7,
> 0x8A, 0x35, 0x46, 0xD1 } }"
> + # to string form BA24B391-73FD-C54C-9EAF-0CA78A3546D1
> + # make a list of Hex numbers like: ['0xBA24B391', '0x73FD', '0xC54C',
> '0x9E', '0xAF', '0x0C', '0xA7', '0x8A', '0x35', '0x46', '0xD1']
> + Hex = ''.join(x for x in GuidStr if x not in '{,}').split()
> + Str = "%08X-%04X-%04X-%02.2X%02.2X-
> %02.2X%02.2X%02.2X%02.2X%02.2X%02.2X" % \
> + (int(Hex[0], 0), int(Hex[1], 0), int(Hex[2], 0), int(Hex[3], 0), int(Hex[4], 0),
> \
> + int(Hex[5], 0), int(Hex[6], 0), int(Hex[7], 0), int(Hex[8], 0), int(Hex[9], 0),
> int(Hex[10], 0))
> + elif GuidStr.count('-') == 4:
> + # validate "49152E77-1ADA-4764-B7A2-7AFEFED95E8B" form
> + Check = "%s" % str(uuid.UUID(GuidStr)).upper()
> + if GuidStr.upper() == Check:
> + Str = GuidStr.upper()
> + else:
> + Ste = ""
> + else:
> + Str = ""
> +
> + return Str
> +
> +
> +def create_guid_options():
> + usage = "usage: %prog [data]"
> + description='''lookup EFI_GUID by CName, C struct, or GUID string and print
> out all three.
> + '''
> + parser = optparse.OptionParser(description=description,
> prog='guid',usage=usage)
> + return parser
> +
> +def efi_guid_command(debugger, command, result, dict):
> + # Use the Shell Lexer to properly parse up command options just like a
> + # shell would
> + command_args = shlex.split(command)
> + parser = create_guid_options()
> + try:
> + (options, args) = parser.parse_args(command_args)
> + if len(args) >= 1:
> + if args[0] == "{":
> + # caller forgot to quote the string"
> + # mark arg[0] a string containing all args[n]
> + args[0] = ' '.join(args)
> + GuidStr = ParseGuidString (args[0])
> + if GuidStr == "":
> + # return Key of GuidNameDict for value args[0]
> + GuidStr = [Key for Key, Value in guid_dict.iteritems() if Value ==
> args[0]][0]
> + GuidStr = GuidStr.upper()
> + except:
> + # if you don't handle exceptions, passing an incorrect argument to the
> OptionParser will cause LLDB to exit
> + # (courtesy of OptParse dealing with argument errors by throwing
> SystemExit)
> + result.SetError ("option parsing failed")
> + return
> +
> +
> + if len(args) >= 1:
> + if GuidStr in guid_dict:
> + print "%s = %s" % (guid_dict[GuidStr], GuidStr)
> + print "%s = %s" % (guid_dict[GuidStr], GuidToCStructStr (GuidStr))
> + else:
> + print GuidStr
> + else:
> + # dump entire dictionary
> + width = max(len(v) for k,v in guid_dict.iteritems())
> + for value in sorted(guid_dict, key=guid_dict.get):
> + print '%-*s %s %s' % (width, guid_dict[value], value,
> GuidToCStructStr(value))
> +
> + return
> +
> +
> +#
> +########## Code that runs when this script is imported into LLDB
> ###########
> +#
> +def __lldb_init_module (debugger, internal_dict):
> + # This initializer is being run from LLDB in the embedded command
> interpreter
> + # Make the options so we can generate the help text for the new LLDB
> + # command line command prior to registering it with LLDB below
> +
> + global guid_dict
> +
> + # Source Guid.xref file if we can find it
> + inputfile = os.getcwd()
> + inputfile += os.sep + os.pardir + os.sep + 'FV' + os.sep + 'Guid.xref'
> + with open(inputfile) as f:
> + for line in f:
> + data = line.split(' ')
> + if len(data) >= 2:
> + guid_dict[data[0].upper()] = data[1].strip('\n')
> +
> + # init EFI specific type formaters
> + TypePrintFormating (debugger)
> +
> +
> + # add guid command
> + parser = create_guid_options()
> + efi_guid_command.__doc__ = parser.format_help()
> + debugger.HandleCommand('command script add -f
> lldbefi.efi_guid_command guid')
> +
> +
> + Target = debugger.GetTargetAtIndex(0)
> + if Target:
> + Breakpoint = Target.BreakpointCreateByName('SecGdbScriptBreak')
> + if Breakpoint.GetNumLocations() == 1:
> + # Set the emulator breakpoints, if we are in the emulator
> + debugger.HandleCommand("breakpoint command add -s python -F
> lldbefi.LoadEmulatorEfiSymbols {id}".format(id=Breakpoint.GetID()))
> + print 'Type r to run emulator. SecLldbScriptBreak armed. EFI modules
> should now get source level debugging in the emulator.'
> diff --git a/EmulatorPkg/Win/Host/WinBlockIo.c
> b/EmulatorPkg/Win/Host/WinBlockIo.c
> index 14491a6e90..d5944c4227 100644
> --- a/EmulatorPkg/Win/Host/WinBlockIo.c
> +++ b/EmulatorPkg/Win/Host/WinBlockIo.c
> @@ -270,7 +270,7 @@ WinNtSignalToken (
> @param[in] MediaId Id of the media, changes every time the media is
> replaced.
> @param[in] Lba The starting Logical Block Address to read from.
> - @param[in, out] Token A pointer to the token associated with the
> transaction.
> + @param[in, out] Token A pointer to the token associated with the
> transaction.
> @param[in] BufferSize Size of Buffer, must be a multiple of device block
> size.
> @param[out] Buffer A pointer to the destination buffer for the data.
> The
> caller is responsible for either having implicit or
> diff --git a/EmulatorPkg/Win/Host/WinHost.h
> b/EmulatorPkg/Win/Host/WinHost.h
> index 6f1f1a2dd3..991da1c15b 100644
> --- a/EmulatorPkg/Win/Host/WinHost.h
> +++ b/EmulatorPkg/Win/Host/WinHost.h
> @@ -206,4 +206,4 @@ extern EMU_THUNK_PROTOCOL gEmuThunkProtocol;
> extern EMU_IO_THUNK_PROTOCOL mWinNtWndThunkIo;
> extern EMU_IO_THUNK_PROTOCOL mWinNtFileSystemThunkIo;
> extern EMU_IO_THUNK_PROTOCOL mWinNtBlockIoThunkIo;
> -#endif
> \ No newline at end of file
> +#endif
> --
> 2.16.1.windows.1
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2018-08-29 5:06 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-08-29 3:39 [PATCH] EmulatorPkg: formalize line endings Ruiyu Ni
2018-08-29 5:06 ` Wu, Hao A
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox