summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRuiyu Ni <ruiyu.ni@intel.com>2018-08-29 11:39:06 +0800
committerRuiyu Ni <ruiyu.ni@intel.com>2018-08-30 09:26:54 +0800
commit79e4f2a56ac7cee477c2f84ff65f766814cc1836 (patch)
tree1640996f68d818bc01720d718c21a0d9918997a5
parenta07533fab100db41c04d9044503438ac00039d82 (diff)
downloadedk2-79e4f2a56ac7cee477c2f84ff65f766814cc1836.tar.gz
edk2-79e4f2a56ac7cee477c2f84ff65f766814cc1836.tar.bz2
edk2-79e4f2a56ac7cee477c2f84ff65f766814cc1836.zip
EmulatorPkg: formalize line endings
The patch is the result of running "BaseTools/Scripts/FormatDosFiles.py EmulatorPkg/" No functionality impact. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Ruiyu Ni <ruiyu.ni@intel.com> Reviewed-by: Hao A Wu <hao.a.wu@intel.com> Cc: Liming Gao <liming.gao@intel.com>
-rw-r--r--EmulatorPkg/CpuRuntimeDxe/Cpu.c24
-rw-r--r--EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c2
-rw-r--r--EmulatorPkg/EmuGopDxe/Gop.h390
-rw-r--r--EmulatorPkg/EmuGopDxe/GopInput.c1800
-rw-r--r--EmulatorPkg/EmuGopDxe/GopScreen.c832
-rw-r--r--EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c2
-rw-r--r--EmulatorPkg/Include/Library/EmuMagicPageLib.h76
-rw-r--r--EmulatorPkg/Include/Library/EmuThunkLib.h84
-rw-r--r--EmulatorPkg/Include/Library/PpiListLib.h42
-rw-r--r--EmulatorPkg/Include/Library/SmbiosLib.h404
-rw-r--r--EmulatorPkg/Include/Protocol/EmuBlockIo.h2
-rw-r--r--EmulatorPkg/Include/Protocol/EmuFileSystem.h280
-rw-r--r--EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h268
-rw-r--r--EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c2
-rw-r--r--EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf2
-rw-r--r--EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c2
-rw-r--r--EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActionLib.inf96
-rw-r--r--EmulatorPkg/Library/DxeEmuStdErrSerialPortLib/DxeEmuStdErrSerialPortLib.c2
-rw-r--r--EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c2
-rw-r--r--EmulatorPkg/Library/PeiCoreServicesTablePointerLib/PeiServicesTablePointer.c12
-rw-r--r--EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraActionLib.inf98
-rw-r--r--EmulatorPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointer.c12
-rw-r--r--EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTablePointer.c12
-rw-r--r--EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf2
-rw-r--r--EmulatorPkg/Library/SecPeiServicesLib/FwVol.c562
-rw-r--r--EmulatorPkg/Library/SecPpiListLib/PpiListLib.c34
-rw-r--r--EmulatorPkg/Library/SmbiosLib/SmbiosLib.c704
-rw-r--r--EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf94
-rw-r--r--EmulatorPkg/MiscSubClassPlatformDxe/MiscSubClassDriver.h4
-rw-r--r--EmulatorPkg/MiscSubClassPlatformDxe/MiscSubclassDriverEntryPoint.c4
-rw-r--r--EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c18
-rw-r--r--EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.inf4
-rw-r--r--EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c26
-rw-r--r--EmulatorPkg/Sec/Ia32/SwitchRam.asm26
-rw-r--r--EmulatorPkg/Sec/Sec.c298
-rw-r--r--EmulatorPkg/Sec/Sec.h102
-rw-r--r--EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c78
-rw-r--r--EmulatorPkg/Unix/Host/BlockIo.c2
-rw-r--r--EmulatorPkg/Unix/Host/EmuThunk.c880
-rw-r--r--EmulatorPkg/Unix/Host/Host.c14
-rw-r--r--EmulatorPkg/Unix/Host/Host.h2
-rw-r--r--EmulatorPkg/Unix/Host/Ia32/Gasket.S2984
-rw-r--r--EmulatorPkg/Unix/Host/Ia32/SwitchStack.c148
-rw-r--r--EmulatorPkg/Unix/Host/MemoryAllocationLib.c290
-rw-r--r--EmulatorPkg/Unix/Host/PosixFileSystem.c3112
-rw-r--r--EmulatorPkg/Unix/Host/Pthreads.c470
-rw-r--r--EmulatorPkg/Unix/Host/X11GraphicsWindow.c2056
-rw-r--r--EmulatorPkg/Unix/Host/X64/Gasket.S3262
-rwxr-xr-xEmulatorPkg/Unix/lldbefi.py1080
-rw-r--r--EmulatorPkg/Win/Host/WinBlockIo.c2
-rw-r--r--EmulatorPkg/Win/Host/WinHost.h2
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 @@
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/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;
diff --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 @@
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 @@
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