From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.151; helo=mga17.intel.com; envelope-from=hao.a.wu@intel.com; receiver=edk2-devel@lists.01.org Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 35F8D21962301 for ; Tue, 28 Aug 2018 22:06:21 -0700 (PDT) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga107.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Aug 2018 22:06:20 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.53,301,1531810800"; d="scan'208";a="228499884" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by orsmga004.jf.intel.com with ESMTP; 28 Aug 2018 22:06:18 -0700 Received: from fmsmsx102.amr.corp.intel.com (10.18.124.200) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.319.2; Tue, 28 Aug 2018 22:06:18 -0700 Received: from shsmsx101.ccr.corp.intel.com (10.239.4.153) by FMSMSX102.amr.corp.intel.com (10.18.124.200) with Microsoft SMTP Server (TLS) id 14.3.319.2; Tue, 28 Aug 2018 22:06:15 -0700 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.143]) by SHSMSX101.ccr.corp.intel.com ([169.254.1.205]) with mapi id 14.03.0319.002; Wed, 29 Aug 2018 13:06:13 +0800 From: "Wu, Hao A" To: "Ni, Ruiyu" , "edk2-devel@lists.01.org" CC: "Gao, Liming" Thread-Topic: [PATCH] EmulatorPkg: formalize line endings Thread-Index: AQHUP0n6IaWuwVAxBUGtL12F+NYN4qTWLVmg Date: Wed, 29 Aug 2018 05:06:11 +0000 Message-ID: References: <20180829033955.105432-1-ruiyu.ni@intel.com> In-Reply-To: <20180829033955.105432-1-ruiyu.ni@intel.com> Accept-Language: zh-CN, en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [PATCH] EmulatorPkg: formalize line endings X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 29 Aug 2018 05:06:21 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Reviewed-by: Hao Wu Best Regards, Hao Wu > -----Original Message----- > From: Ni, Ruiyu > Sent: Wednesday, August 29, 2018 11:40 AM > To: edk2-devel@lists.01.org > Cc: Wu, Hao A; Gao, Liming > Subject: [PATCH] EmulatorPkg: formalize line endings >=20 > The patch is the result of running > "BaseTools/Scripts/FormatDosFiles.py EmulatorPkg/" >=20 > No functionality impact. >=20 > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Ruiyu Ni > Cc: Hao A Wu > Cc: Liming Gao > --- > EmulatorPkg/CpuRuntimeDxe/Cpu.c | 24 +- > EmulatorPkg/EmuBlockIoDxe/EmuBlockIo.c | 2 +- > EmulatorPkg/EmuGopDxe/Gop.h | 390 +-- > EmulatorPkg/EmuGopDxe/GopInput.c | 1800 +++++------ > EmulatorPkg/EmuGopDxe/GopScreen.c | 832 ++--- > EmulatorPkg/EmuSnpDxe/EmuSnpDxe.c | 2 +- > EmulatorPkg/Include/Library/EmuMagicPageLib.h | 76 +- > EmulatorPkg/Include/Library/EmuThunkLib.h | 84 +- > EmulatorPkg/Include/Library/PpiListLib.h | 42 +- > EmulatorPkg/Include/Library/SmbiosLib.h | 404 +-- > EmulatorPkg/Include/Protocol/EmuBlockIo.h | 2 +- > EmulatorPkg/Include/Protocol/EmuFileSystem.h | 280 +- > EmulatorPkg/Include/Protocol/EmuGraphicsWindow.h | 268 +- > .../Library/DevicePathTextLib/DevicePathTextLib.c | 2 +- > .../DevicePathTextLib/DevicePathTextLib.inf | 2 +- > EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c | 2 +- > .../DxeEmuPeCoffExtraActionLib.inf | 96 +- > .../DxeEmuStdErrSerialPortLib.c | 2 +- > EmulatorPkg/Library/KeyMapLibNull/KeyMapLibNull.c | 2 +- > .../PeiServicesTablePointer.c | 12 +- > .../PeiEmuPeCoffExtraActionLib.inf | 98 +- > .../PeiServicesTablePointer.c | 12 +- > .../PeiServicesTablePointer.c | 12 +- > EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf | 2 +- > EmulatorPkg/Library/SecPeiServicesLib/FwVol.c | 562 ++-- > EmulatorPkg/Library/SecPpiListLib/PpiListLib.c | 34 +- > EmulatorPkg/Library/SmbiosLib/SmbiosLib.c | 704 ++--- > EmulatorPkg/Library/SmbiosLib/SmbiosLib.inf | 94 +- > .../MiscSubClassPlatformDxe/MiscSubClassDriver.h | 4 +- > .../MiscSubclassDriverEntryPoint.c | 4 +- > EmulatorPkg/PlatformSmbiosDxe/PlatformSmbiosDxe.c | 18 +- > .../PlatformSmbiosDxe/PlatformSmbiosDxe.inf | 4 +- > EmulatorPkg/PlatformSmbiosDxe/SmbiosTable.c | 26 +- > EmulatorPkg/Sec/Ia32/SwitchRam.asm | 26 +- > EmulatorPkg/Sec/Sec.c | 298 +- > EmulatorPkg/Sec/Sec.h | 102 +- > EmulatorPkg/Unix/Host/BerkeleyPacketFilter.c | 78 +- > EmulatorPkg/Unix/Host/BlockIo.c | 2 +- > EmulatorPkg/Unix/Host/EmuThunk.c | 880 +++--- > EmulatorPkg/Unix/Host/Host.c | 14 +- > EmulatorPkg/Unix/Host/Host.h | 2 +- > EmulatorPkg/Unix/Host/Ia32/Gasket.S | 2984 +++++++++-----= ---- > EmulatorPkg/Unix/Host/Ia32/SwitchStack.c | 148 +- > EmulatorPkg/Unix/Host/MemoryAllocationLib.c | 290 +- > EmulatorPkg/Unix/Host/PosixFileSystem.c | 3112 +++++++++-----= ----- > EmulatorPkg/Unix/Host/Pthreads.c | 470 +-- > EmulatorPkg/Unix/Host/X11GraphicsWindow.c | 2056 ++++++------ > EmulatorPkg/Unix/Host/X64/Gasket.S | 3262 ++++++++++----= ------ > EmulatorPkg/Unix/lldbefi.py | 1080 +++---- > EmulatorPkg/Win/Host/WinBlockIo.c | 2 +- > EmulatorPkg/Win/Host/WinHost.h | 2 +- > 51 files changed, 10353 insertions(+), 10353 deletions(-) >=20 > 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 =3D { > 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 =3D { > }, > 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 z= ero. > 0, // ProcessorVoltageReserved :3; ///< Bits 4-6, must b= e zero. > 0 // ProcessorVoltageIndicateLegacy :1; > - }, > + }, > 0, // ExternalClock; > 0, // MaxSpeed; > 0, // CurrentSpeed; > @@ -151,26 +151,26 @@ CHAR8 *mCpuSmbiosType4Strings[] =3D { > "Not Found", > NULL > }; > - > + > ... > LogSmbiosData ( > - (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12, > + (EFI_SMBIOS_TABLE_HEADER*)&gSmbiosType12, > gSmbiosType12Strings > ); >=20 > @param Template Fixed SMBIOS structure, required. > - @param StringArray Array of strings to convert to an SMBIOS string pa= ck. > + @param StringArray Array of strings to convert to an SMBIOS string pa= ck. > NULL is OK. >=20 > **/ > 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 +=3D StringSize; > } > *Str =3D 0; > - > + > SmbiosHandle =3D SMBIOS_HANDLE_PI_RESERVED; > Status =3D 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 me= dia 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 devi= ce block > size. > @param[out] Buffer A pointer to the destination buffer for th= e data. > The > caller is responsible for either having im= plicit 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.
> -Portions copyright (c) 2010,Apple Inc. All rights reserved.
> -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BS= D > License > -which accompanies this distribution. The full text of the license may b= e found > at > -http://opensource.org/licenses/bsd-license.php > - > -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 > - > -#include > -#include > -#include > -#include > -#include > -#include > - > -#include > - > -#include > -#include > -#include > -#include > -#include > -#include > -#include > -#include > - > - > -#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.
> +Portions copyright (c) 2010,Apple Inc. All rights reserved.
> +This program and the accompanying materials > +are licensed and made available under the terms and conditions of the BS= D > License > +which accompanies this distribution. The full text of the license may b= e found > at > +http://opensource.org/licenses/bsd-license.php > + > +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 > + > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > + > +#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.
> -Portions copyright (c) 2010 0 2011,Apple Inc. All rights reserved.
> -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BS= D > License > -which accompanies this distribution. The full text of the license may b= e found > at > -http://opensource.org/licenses/bsd-license.php > - > -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 k= eystroke > - state data for the key that was registered. > - InputData - A pointer to a buffer that is filled in with the k= eystroke > - state data for the key that was pressed. > - > -Returns: > - TRUE - Key be pressed matches a registered key. > - FLASE - Match failed. > - > -**/ > -{ > - ASSERT (RegsiteredData !=3D NULL && InputData !=3D NULL); > - > - if ((RegsiteredData->Key.ScanCode !=3D InputData->Key.ScanCode) || > - (RegsiteredData->Key.UnicodeChar !=3D InputData->Key.UnicodeChar))= { > - return FALSE; > - } > - > - // > - // Assume KeyShiftState/KeyToggleState =3D 0 in Registered key data me= ans > these state could be ignored. > - // > - if (RegsiteredData->KeyState.KeyShiftState !=3D 0 && > - RegsiteredData->KeyState.KeyShiftState !=3D InputData- > >KeyState.KeyShiftState) { > - return FALSE; > - } > - if (RegsiteredData->KeyState.KeyToggleState !=3D 0 && > - RegsiteredData->KeyState.KeyToggleState !=3D 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 =3D (GOP_PRIVATE_DATA *)Con= text; > - > - KeyMapMake (KeyData); > - > - for (Link =3D Private->NotifyList.ForwardLink; Link !=3D &Private->Not= ifyList; Link =3D > Link->ForwardLink) { > - CurrentNotify =3D 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 an= d > 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 =3D GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This); > - if (Private->EmuGraphicsWindow =3D=3D NULL) { > - return EFI_SUCCESS; > - } > - > - // > - // Enter critical section > - // > - OldTpl =3D gBS->RaiseTPL (TPL_NOTIFY); > - > - // > - // A reset is draining the Queue > - // > - while (Private->EmuGraphicsWindow->GetKey (Private- > >EmuGraphicsWindow, &KeyData) =3D=3D EFI_SUCCESS) > - ; > - > - // > - // Leave critical section and return > - // > - gBS->RestoreTPL (OldTpl); > - return EFI_SUCCESS; > -} > - > - > -/** > - Reads the next keystroke from the input device. The WaitForKey Event c= an > - 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 keystro= ke > - 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 du= e > 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 =3D GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This); > - if (Private->EmuGraphicsWindow =3D=3D NULL) { > - return EFI_NOT_READY; > - } > - > - // > - // Enter critical section > - // > - OldTpl =3D gBS->RaiseTPL (TPL_NOTIFY); > - > - Status =3D Private->EmuGraphicsWindow->GetKey (Private- > >EmuGraphicsWindow, &KeyData); > - if (!EFI_ERROR (Status)) { > - if ((KeyData.Key.ScanCode =3D=3D 0) && (KeyData.Key.UnicodeChar =3D= =3D 0)) { > - // Modifier key was pressed > - Status =3D 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 bei= ng 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 =3D (GOP_PRIVATE_DATA *) Context; > - if (Private->EmuGraphicsWindow =3D=3D NULL) { > - return; > - } > - > - // > - // Enter critical section > - // > - OldTpl =3D gBS->RaiseTPL (TPL_NOTIFY); > - > - Status =3D 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 () cal= l. > - > - Arguments: > - This - Protocol instance pointer. > - KeyData - A pointer to a buffer that is filled in with the keystr= oke > - 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 d= ue to > - hardware errors. > - EFI_INVALID_PARAMETER - KeyData is NULL. > - > -**/ > -{ > - EFI_STATUS Status; > - GOP_PRIVATE_DATA *Private; > - EFI_TPL OldTpl; > - > - > - if (KeyData =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - Private =3D GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This); > - if (Private->EmuGraphicsWindow =3D=3D NULL) { > - return EFI_NOT_READY; > - } > - > - // > - // Enter critical section > - // > - OldTpl =3D gBS->RaiseTPL (TPL_NOTIFY); > - > - Status =3D 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_PROTOC= OL > 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 =3D GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This); > - if (Private->EmuGraphicsWindow =3D=3D NULL) { > - return EFI_NOT_READY; > - } > - > - // > - // Enter critical section > - // > - OldTpl =3D gBS->RaiseTPL (TPL_NOTIFY); > - > - Status =3D 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 bei= ng 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 =3D > (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 i= n 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 t= o > - 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 =3D=3D NULL || KeyNotificationFunction =3D=3D NULL || Noti= fyHandle =3D=3D > NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - Private =3D GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This); > - > - // > - // Return EFI_SUCCESS if the (KeyData, NotificationFunction) is alread= y > registered. > - // > - for (Link =3D Private->NotifyList.ForwardLink; Link !=3D &Private->Not= ifyList; Link =3D > Link->ForwardLink) { > - CurrentNotify =3D CR ( > - Link, > - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY, > - NotifyEntry, > - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE > - ); > - if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) { > - if (CurrentNotify->KeyNotificationFn =3D=3D KeyNotificationFunctio= n) { > - *NotifyHandle =3D CurrentNotify->NotifyHandle; > - return EFI_SUCCESS; > - } > - } > - } > - > - // > - // Allocate resource to save the notification function > - // > - NewNotify =3D (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) AllocateZeroPool > (sizeof (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY)); > - if (NewNotify =3D=3D NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - NewNotify->Signature =3D > EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE; > - NewNotify->KeyNotificationFn =3D KeyNotificationFunction; > - NewNotify->NotifyHandle =3D (EFI_HANDLE) NewNotify; > - CopyMem (&NewNotify->KeyData, KeyData, sizeof (KeyData)); > - InsertTailList (&Private->NotifyList, &NewNotify->NotifyEntry); > - > - Status =3D gBS->CreateEvent ( > - EVT_NOTIFY_SIGNAL, > - TPL_NOTIFY, > - EmuGopRegisterKeyCallback, > - NewNotify, > - &NewNotify->Event > - ); > - ASSERT_EFI_ERROR (Status); > - > - > - *NotifyHandle =3D 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 keystrok= e. > - > - Arguments: > - This - Protocol instance pointer. > - NotificationHandle - The handle of the notification function be= ing > 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 =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (((EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) NotificationHandle)- > >Signature !=3D EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE) { > - return EFI_INVALID_PARAMETER; > - } > - > - Private =3D GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This); > - > - for (Link =3D Private->NotifyList.ForwardLink; Link !=3D &Private->Not= ifyList; Link =3D > Link->ForwardLink) { > - CurrentNotify =3D CR ( > - Link, > - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY, > - NotifyEntry, > - EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE > - ); > - if (CurrentNotify->NotifyHandle =3D=3D NotificationHandle) { > - // > - // Remove the notification function from NotifyList and free resou= rces > - // > - 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 =3D EmuGopSimpleTextInReset; > - Private->SimpleTextIn.ReadKeyStroke =3D EmuGopSimpleTextInReadKeyStrok= e; > - > - Status =3D gBS->CreateEvent ( > - EVT_NOTIFY_WAIT, > - TPL_NOTIFY, > - EmuGopSimpleTextInWaitForKey, > - Private, > - &Private->SimpleTextIn.WaitForKey > - ); > - ASSERT_EFI_ERROR (Status); > - > - > - // > - // Initialize Simple Text In Ex > - // > - > - Private->SimpleTextInEx.Reset =3D EmuGopSimpleTextInExRe= setEx; > - Private->SimpleTextInEx.ReadKeyStrokeEx =3D > EmuGopSimpleTextInExReadKeyStrokeEx; > - Private->SimpleTextInEx.SetState =3D EmuGopSimpleTextInExSe= tState; > - Private->SimpleTextInEx.RegisterKeyNotify =3D > EmuGopSimpleTextInExRegisterKeyNotify; > - Private->SimpleTextInEx.UnregisterKeyNotify =3D > EmuGopSimpleTextInExUnregisterKeyNotify; > - > - Private->SimpleTextInEx.Reset (&Private->SimpleTextInEx, FALSE); > - > - InitializeListHead (&Private->NotifyList); > - > - Status =3D 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_PROT= OCOL > - instance. > - @param ExtendedVerification Indicates that the driver may perform a = more > exhaustive > - verification operation of the device dur= ing 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 =3D GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This); > - if (Private->EmuGraphicsWindow =3D=3D NULL) { > - return EFI_SUCCESS; > - } > - > - // > - // Enter critical section > - // > - OldTpl =3D gBS->RaiseTPL (TPL_NOTIFY); > - > - // > - // A reset is draining the Queue > - // > - while (Private->EmuGraphicsWindow->GetPointerState (Private- > >EmuGraphicsWindow, &State) =3D=3D 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_PROT= OCOL > - instance. > - @param State A pointer to the state information on th= e pointer > device. > - > - @retval EFI_SUCCESS The state of the pointer device was retu= rned 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 =3D GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This); > - if (Private->EmuGraphicsWindow =3D=3D NULL) { > - return EFI_NOT_READY; > - } > - > - // > - // Enter critical section > - // > - OldTpl =3D gBS->RaiseTPL (TPL_NOTIFY); > - > - Status =3D 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 bei= ng 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 =3D (GOP_PRIVATE_DATA *) Context; > - if (Private->EmuGraphicsWindow =3D=3D NULL) { > - return; > - } > - > - // > - // Enter critical section > - // > - OldTpl =3D gBS->RaiseTPL (TPL_NOTIFY); > - > - Status =3D 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 =3D 1; > - Private->PointerMode.ResolutionY =3D 1; > - Private->PointerMode.ResolutionZ =3D 1; > - Private->PointerMode.LeftButton =3D TRUE; > - Private->PointerMode.RightButton =3D TRUE; > - > - Private->SimplePointer.Reset =3D EmuGopSimplePointerReset; > - Private->SimplePointer.GetState =3D EmuGopSimplePointerGetState; > - Private->SimplePointer.Mode =3D &Private->PointerMode; > - > - Status =3D gBS->CreateEvent ( > - EVT_NOTIFY_WAIT, > - TPL_NOTIFY, > - EmuGopSimplePointerWaitForInput, > - Private, > - &Private->SimplePointer.WaitForInput > - ); > - > - return Status; > -} > +/*++ @file > + > +Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.
> +Portions copyright (c) 2010 0 2011,Apple Inc. All rights reserved.
> +This program and the accompanying materials > +are licensed and made available under the terms and conditions of the BS= D > License > +which accompanies this distribution. The full text of the license may b= e found > at > +http://opensource.org/licenses/bsd-license.php > + > +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 k= eystroke > + state data for the key that was registered. > + InputData - A pointer to a buffer that is filled in with the k= eystroke > + state data for the key that was pressed. > + > +Returns: > + TRUE - Key be pressed matches a registered key. > + FLASE - Match failed. > + > +**/ > +{ > + ASSERT (RegsiteredData !=3D NULL && InputData !=3D NULL); > + > + if ((RegsiteredData->Key.ScanCode !=3D InputData->Key.ScanCode) || > + (RegsiteredData->Key.UnicodeChar !=3D InputData->Key.UnicodeChar))= { > + return FALSE; > + } > + > + // > + // Assume KeyShiftState/KeyToggleState =3D 0 in Registered key data me= ans > these state could be ignored. > + // > + if (RegsiteredData->KeyState.KeyShiftState !=3D 0 && > + RegsiteredData->KeyState.KeyShiftState !=3D InputData- > >KeyState.KeyShiftState) { > + return FALSE; > + } > + if (RegsiteredData->KeyState.KeyToggleState !=3D 0 && > + RegsiteredData->KeyState.KeyToggleState !=3D 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 =3D (GOP_PRIVATE_DATA *)Con= text; > + > + KeyMapMake (KeyData); > + > + for (Link =3D Private->NotifyList.ForwardLink; Link !=3D &Private->Not= ifyList; Link > =3D Link->ForwardLink) { > + CurrentNotify =3D 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 an= d > 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 =3D GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This); > + if (Private->EmuGraphicsWindow =3D=3D NULL) { > + return EFI_SUCCESS; > + } > + > + // > + // Enter critical section > + // > + OldTpl =3D gBS->RaiseTPL (TPL_NOTIFY); > + > + // > + // A reset is draining the Queue > + // > + while (Private->EmuGraphicsWindow->GetKey (Private- > >EmuGraphicsWindow, &KeyData) =3D=3D EFI_SUCCESS) > + ; > + > + // > + // Leave critical section and return > + // > + gBS->RestoreTPL (OldTpl); > + return EFI_SUCCESS; > +} > + > + > +/** > + Reads the next keystroke from the input device. The WaitForKey Event c= an > + 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 keystro= ke > + 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 du= e > 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 =3D GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS (This); > + if (Private->EmuGraphicsWindow =3D=3D NULL) { > + return EFI_NOT_READY; > + } > + > + // > + // Enter critical section > + // > + OldTpl =3D gBS->RaiseTPL (TPL_NOTIFY); > + > + Status =3D Private->EmuGraphicsWindow->GetKey (Private- > >EmuGraphicsWindow, &KeyData); > + if (!EFI_ERROR (Status)) { > + if ((KeyData.Key.ScanCode =3D=3D 0) && (KeyData.Key.UnicodeChar =3D= =3D 0)) { > + // Modifier key was pressed > + Status =3D 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 bei= ng 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 =3D (GOP_PRIVATE_DATA *) Context; > + if (Private->EmuGraphicsWindow =3D=3D NULL) { > + return; > + } > + > + // > + // Enter critical section > + // > + OldTpl =3D gBS->RaiseTPL (TPL_NOTIFY); > + > + Status =3D 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 () cal= l. > + > + Arguments: > + This - Protocol instance pointer. > + KeyData - A pointer to a buffer that is filled in with the keystr= oke > + 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 d= ue to > + hardware errors. > + EFI_INVALID_PARAMETER - KeyData is NULL. > + > +**/ > +{ > + EFI_STATUS Status; > + GOP_PRIVATE_DATA *Private; > + EFI_TPL OldTpl; > + > + > + if (KeyData =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + Private =3D GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This); > + if (Private->EmuGraphicsWindow =3D=3D NULL) { > + return EFI_NOT_READY; > + } > + > + // > + // Enter critical section > + // > + OldTpl =3D gBS->RaiseTPL (TPL_NOTIFY); > + > + Status =3D 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 =3D GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This); > + if (Private->EmuGraphicsWindow =3D=3D NULL) { > + return EFI_NOT_READY; > + } > + > + // > + // Enter critical section > + // > + OldTpl =3D gBS->RaiseTPL (TPL_NOTIFY); > + > + Status =3D 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 bei= ng 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 =3D > (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 i= n 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 t= o > + 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 =3D=3D NULL || KeyNotificationFunction =3D=3D NULL || Noti= fyHandle =3D=3D > NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + Private =3D GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This); > + > + // > + // Return EFI_SUCCESS if the (KeyData, NotificationFunction) is alread= y > registered. > + // > + for (Link =3D Private->NotifyList.ForwardLink; Link !=3D &Private->Not= ifyList; Link > =3D Link->ForwardLink) { > + CurrentNotify =3D CR ( > + Link, > + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY, > + NotifyEntry, > + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE > + ); > + if (GopPrivateIsKeyRegistered (&CurrentNotify->KeyData, KeyData)) { > + if (CurrentNotify->KeyNotificationFn =3D=3D KeyNotificationFunctio= n) { > + *NotifyHandle =3D CurrentNotify->NotifyHandle; > + return EFI_SUCCESS; > + } > + } > + } > + > + // > + // Allocate resource to save the notification function > + // > + NewNotify =3D (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) AllocateZeroPool > (sizeof (EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY)); > + if (NewNotify =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + NewNotify->Signature =3D > EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE; > + NewNotify->KeyNotificationFn =3D KeyNotificationFunction; > + NewNotify->NotifyHandle =3D (EFI_HANDLE) NewNotify; > + CopyMem (&NewNotify->KeyData, KeyData, sizeof (KeyData)); > + InsertTailList (&Private->NotifyList, &NewNotify->NotifyEntry); > + > + Status =3D gBS->CreateEvent ( > + EVT_NOTIFY_SIGNAL, > + TPL_NOTIFY, > + EmuGopRegisterKeyCallback, > + NewNotify, > + &NewNotify->Event > + ); > + ASSERT_EFI_ERROR (Status); > + > + > + *NotifyHandle =3D 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 keystrok= e. > + > + Arguments: > + This - Protocol instance pointer. > + NotificationHandle - The handle of the notification function be= ing > 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 =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (((EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY *) NotificationHandle)- > >Signature !=3D EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE) { > + return EFI_INVALID_PARAMETER; > + } > + > + Private =3D GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS (This); > + > + for (Link =3D Private->NotifyList.ForwardLink; Link !=3D &Private->Not= ifyList; Link > =3D Link->ForwardLink) { > + CurrentNotify =3D CR ( > + Link, > + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY, > + NotifyEntry, > + EMU_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE > + ); > + if (CurrentNotify->NotifyHandle =3D=3D NotificationHandle) { > + // > + // Remove the notification function from NotifyList and free resou= rces > + // > + 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 =3D EmuGopSimpleTextInReset; > + Private->SimpleTextIn.ReadKeyStroke =3D EmuGopSimpleTextInReadKeyStrok= e; > + > + Status =3D gBS->CreateEvent ( > + EVT_NOTIFY_WAIT, > + TPL_NOTIFY, > + EmuGopSimpleTextInWaitForKey, > + Private, > + &Private->SimpleTextIn.WaitForKey > + ); > + ASSERT_EFI_ERROR (Status); > + > + > + // > + // Initialize Simple Text In Ex > + // > + > + Private->SimpleTextInEx.Reset =3D EmuGopSimpleTextInExRe= setEx; > + Private->SimpleTextInEx.ReadKeyStrokeEx =3D > EmuGopSimpleTextInExReadKeyStrokeEx; > + Private->SimpleTextInEx.SetState =3D EmuGopSimpleTextInExSe= tState; > + Private->SimpleTextInEx.RegisterKeyNotify =3D > EmuGopSimpleTextInExRegisterKeyNotify; > + Private->SimpleTextInEx.UnregisterKeyNotify =3D > EmuGopSimpleTextInExUnregisterKeyNotify; > + > + Private->SimpleTextInEx.Reset (&Private->SimpleTextInEx, FALSE); > + > + InitializeListHead (&Private->NotifyList); > + > + Status =3D 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_PROT= OCOL > + instance. > + @param ExtendedVerification Indicates that the driver may perform a > more exhaustive > + verification operation of the device dur= ing 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 =3D GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This); > + if (Private->EmuGraphicsWindow =3D=3D NULL) { > + return EFI_SUCCESS; > + } > + > + // > + // Enter critical section > + // > + OldTpl =3D gBS->RaiseTPL (TPL_NOTIFY); > + > + // > + // A reset is draining the Queue > + // > + while (Private->EmuGraphicsWindow->GetPointerState (Private- > >EmuGraphicsWindow, &State) =3D=3D 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_PROT= OCOL > + instance. > + @param State A pointer to the state information on th= e pointer > device. > + > + @retval EFI_SUCCESS The state of the pointer device was retu= rned 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 =3D GOP_PRIVATE_DATA_FROM_POINTER_MODE_THIS (This); > + if (Private->EmuGraphicsWindow =3D=3D NULL) { > + return EFI_NOT_READY; > + } > + > + // > + // Enter critical section > + // > + OldTpl =3D gBS->RaiseTPL (TPL_NOTIFY); > + > + Status =3D 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 bei= ng 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 =3D (GOP_PRIVATE_DATA *) Context; > + if (Private->EmuGraphicsWindow =3D=3D NULL) { > + return; > + } > + > + // > + // Enter critical section > + // > + OldTpl =3D gBS->RaiseTPL (TPL_NOTIFY); > + > + Status =3D 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 =3D 1; > + Private->PointerMode.ResolutionY =3D 1; > + Private->PointerMode.ResolutionZ =3D 1; > + Private->PointerMode.LeftButton =3D TRUE; > + Private->PointerMode.RightButton =3D TRUE; > + > + Private->SimplePointer.Reset =3D EmuGopSimplePointerReset; > + Private->SimplePointer.GetState =3D EmuGopSimplePointerGetState; > + Private->SimplePointer.Mode =3D &Private->PointerMode; > + > + Status =3D 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.
> -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 BS= D > License > -which accompanies this distribution. The full text of the license may b= e found > at > -http://opensource.org/licenses/bsd-license.php > - > -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[] =3D { > - { 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 d= evice > - and the set of active video output devices supports. > - > - @param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instanc= e. > - @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 tha= t 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 retr= ieve > the video mode. > - @retval EFI_NOT_STARTED Video display is not initialized. Call S= etMode () > - @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 =3D GOP_PRIVATE_DATA_FROM_THIS (This); > - > - if (Info =3D=3D NULL || SizeOfInfo =3D=3D NULL || (UINTN) ModeNumber >= =3D This- > >Mode->MaxMode) { > - return EFI_INVALID_PARAMETER; > - } > - > - *Info =3D AllocatePool (sizeof > (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION)); > - if (*Info =3D=3D NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - *SizeOfInfo =3D sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION); > - > - (*Info)->Version =3D 0; > - (*Info)->HorizontalResolution =3D Private- > >ModeData[ModeNumber].HorizontalResolution; > - (*Info)->VerticalResolution =3D Private- > >ModeData[ModeNumber].VerticalResolution; > - (*Info)->PixelFormat =3D PixelBltOnly; > - (*Info)->PixelsPerScanLine =3D (*Info)->HorizontalResolution; > - > - return EFI_SUCCESS; > -} > - > - > - > -/** > - Set the video device into the specified mode and clears the visible po= rtions of > - the output display to black. > - > - @param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instance. > - @param ModeNumber Abstraction that defines the current video m= ode. > - > - @retval EFI_SUCCESS The graphics mode specified by ModeNumber wa= s > selected. > - @retval EFI_DEVICE_ERROR The device had an error and could not comple= te > 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 =3D GOP_PRIVATE_DATA_FROM_THIS (This); > - > - if (ModeNumber >=3D This->Mode->MaxMode) { > - return EFI_UNSUPPORTED; > - } > - > - ModeData =3D &Private->ModeData[ModeNumber]; > - This->Mode->Mode =3D ModeNumber; > - Private->GraphicsOutput.Mode->Info->HorizontalResolution =3D ModeData- > >HorizontalResolution; > - Private->GraphicsOutput.Mode->Info->VerticalResolution =3D ModeData- > >VerticalResolution; > - Private->GraphicsOutput.Mode->Info->PixelsPerScanLine =3D ModeData- > >HorizontalResolution; > - > - if (Private->HardwareNeedsStarting) { > - Status =3D EmuGopStartWindow ( > - Private, > - ModeData->HorizontalResolution, > - ModeData->VerticalResolution, > - ModeData->ColorDepth, > - ModeData->RefreshRate > - ); > - if (EFI_ERROR (Status)) { > - return EFI_DEVICE_ERROR; > - } > - > - Private->HardwareNeedsStarting =3D FALSE; > - } > - > - > - Status =3D Private->EmuGraphicsWindow->Size( > - Private->EmuGraphicsWindow, > - ModeData->HorizontalResolution, > - ModeData->VerticalResolution > - ); > - > - > - Fill.Red =3D 0x7f; > - Fill.Green =3D 0x7F; > - Fill.Blue =3D 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 =3D GOP_PRIVATE_DATA_FROM_THIS (This); > - > - if ((UINT32)BltOperation >=3D EfiGraphicsOutputBltOperationMax) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (Width =3D=3D 0 || Height =3D=3D 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 i= s Width > pixels size, > - // the number of bytes in each row can be computed. > - // > - if (Delta =3D=3D 0) { > - Delta =3D Width * sizeof (EFI_UGA_PIXEL); > - } > - > - // > - // We have to raise to TPL Notify, so we make an atomic write the fram= e > buffer. > - // We would not want a timer based event (Cursor, ...) to come in whil= e we > are > - // doing this operation. > - // > - OriginalTPL =3D 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 =3D DestinationX; > - GopBltArgs.DestinationY =3D DestinationY; > - GopBltArgs.Height =3D Height; > - GopBltArgs.Width =3D Width; > - GopBltArgs.SourceX =3D SourceX; > - GopBltArgs.SourceY =3D SourceY; > - GopBltArgs.Delta =3D Delta; > - Status =3D 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 supp= ort. > - // > - // 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 =3D gBS->CreateEvent ( > - EVT_SIGNAL_EXIT_BOOT_SERVICES, > - TPL_CALLBACK, > - ShutdownGopEvent, > - Private, > - &mGopScreenExitBootServicesEvent > - ); > - > - Status =3D Private->EmuIoThunk->Open (Private->EmuIoThunk); > - if (!EFI_ERROR (Status)) { > - Private->EmuGraphicsWindow =3D Private->EmuIoThunk->Interface; > - > - // Register callback to support RegisterKeyNotify() > - Status =3D Private->EmuGraphicsWindow->RegisterKeyNotify ( > - Private->EmuGraphicsWindow, > - GopPrivateMakeCallbackFuncti= on, > - GopPrivateBreakCallbackFunct= ion, > - Private > - ); > - ASSERT_EFI_ERROR (Status); > - } > - return Status; > -} > - > -EFI_STATUS > -EmuGopConstructor ( > - GOP_PRIVATE_DATA *Private > - ) > -{ > - Private->ModeData =3D mGopModeData; > - > - Private->GraphicsOutput.QueryMode =3D EmuGopQuerytMode; > - Private->GraphicsOutput.SetMode =3D EmuGopSetMode; > - Private->GraphicsOutput.Blt =3D EmuGopBlt; > - > - // > - // Allocate buffer for Graphics Output Protocol mode information > - // > - Private->GraphicsOutput.Mode =3D AllocatePool (sizeof > (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE)); > - if (Private->GraphicsOutput.Mode =3D=3D NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - Private->GraphicsOutput.Mode->Info =3D AllocatePool (sizeof > (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION)); > - if (Private->GraphicsOutput.Mode->Info =3D=3D NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - Private->GraphicsOutput.Mode->MaxMode =3D sizeof(mGopModeData) / > sizeof(GOP_MODE_DATA); > - // > - // Till now, we have no idea about the window size. > - // > - Private->GraphicsOutput.Mode->Mode =3D > GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER; > - Private->GraphicsOutput.Mode->Info->Version =3D 0; > - Private->GraphicsOutput.Mode->Info->HorizontalResolution =3D 0; > - Private->GraphicsOutput.Mode->Info->VerticalResolution =3D 0; > - Private->GraphicsOutput.Mode->Info->PixelFormat =3D PixelBltOnly; > - Private->GraphicsOutput.Mode->SizeOfInfo =3D sizeof > (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION); > - Private->GraphicsOutput.Mode->FrameBufferBase =3D > (EFI_PHYSICAL_ADDRESS) (UINTN) NULL; > - Private->GraphicsOutput.Mode->FrameBufferSize =3D 0; > - > - Private->HardwareNeedsStarting =3D TRUE; > - Private->EmuGraphicsWindow =3D 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 =3D NULL; > - } > - > - // > - // Free graphics output protocol occupied resource > - // > - if (Private->GraphicsOutput.Mode !=3D NULL) { > - if (Private->GraphicsOutput.Mode->Info !=3D 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.
> +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 BS= D > License > +which accompanies this distribution. The full text of the license may b= e found > at > +http://opensource.org/licenses/bsd-license.php > + > +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[] =3D { > + { 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 d= evice > + and the set of active video output devices supports. > + > + @param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instanc= e. > + @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 tha= t 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 retr= ieve > the video mode. > + @retval EFI_NOT_STARTED Video display is not initialized. Call S= etMode () > + @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 =3D GOP_PRIVATE_DATA_FROM_THIS (This); > + > + if (Info =3D=3D NULL || SizeOfInfo =3D=3D NULL || (UINTN) ModeNumber >= =3D This- > >Mode->MaxMode) { > + return EFI_INVALID_PARAMETER; > + } > + > + *Info =3D AllocatePool (sizeof > (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION)); > + if (*Info =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + *SizeOfInfo =3D sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION); > + > + (*Info)->Version =3D 0; > + (*Info)->HorizontalResolution =3D Private- > >ModeData[ModeNumber].HorizontalResolution; > + (*Info)->VerticalResolution =3D Private- > >ModeData[ModeNumber].VerticalResolution; > + (*Info)->PixelFormat =3D PixelBltOnly; > + (*Info)->PixelsPerScanLine =3D (*Info)->HorizontalResolution; > + > + return EFI_SUCCESS; > +} > + > + > + > +/** > + Set the video device into the specified mode and clears the visible po= rtions of > + the output display to black. > + > + @param This The EFI_GRAPHICS_OUTPUT_PROTOCOL instance. > + @param ModeNumber Abstraction that defines the current video m= ode. > + > + @retval EFI_SUCCESS The graphics mode specified by ModeNumber wa= s > 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 =3D GOP_PRIVATE_DATA_FROM_THIS (This); > + > + if (ModeNumber >=3D This->Mode->MaxMode) { > + return EFI_UNSUPPORTED; > + } > + > + ModeData =3D &Private->ModeData[ModeNumber]; > + This->Mode->Mode =3D ModeNumber; > + Private->GraphicsOutput.Mode->Info->HorizontalResolution =3D ModeData- > >HorizontalResolution; > + Private->GraphicsOutput.Mode->Info->VerticalResolution =3D ModeData- > >VerticalResolution; > + Private->GraphicsOutput.Mode->Info->PixelsPerScanLine =3D ModeData- > >HorizontalResolution; > + > + if (Private->HardwareNeedsStarting) { > + Status =3D EmuGopStartWindow ( > + Private, > + ModeData->HorizontalResolution, > + ModeData->VerticalResolution, > + ModeData->ColorDepth, > + ModeData->RefreshRate > + ); > + if (EFI_ERROR (Status)) { > + return EFI_DEVICE_ERROR; > + } > + > + Private->HardwareNeedsStarting =3D FALSE; > + } > + > + > + Status =3D Private->EmuGraphicsWindow->Size( > + Private->EmuGraphicsWindow, > + ModeData->HorizontalResolution, > + ModeData->VerticalResolution > + ); > + > + > + Fill.Red =3D 0x7f; > + Fill.Green =3D 0x7F; > + Fill.Blue =3D 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 =3D GOP_PRIVATE_DATA_FROM_THIS (This); > + > + if ((UINT32)BltOperation >=3D EfiGraphicsOutputBltOperationMax) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (Width =3D=3D 0 || Height =3D=3D 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 i= s Width > pixels size, > + // the number of bytes in each row can be computed. > + // > + if (Delta =3D=3D 0) { > + Delta =3D Width * sizeof (EFI_UGA_PIXEL); > + } > + > + // > + // We have to raise to TPL Notify, so we make an atomic write the fram= e > buffer. > + // We would not want a timer based event (Cursor, ...) to come in whil= e we > are > + // doing this operation. > + // > + OriginalTPL =3D 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 =3D DestinationX; > + GopBltArgs.DestinationY =3D DestinationY; > + GopBltArgs.Height =3D Height; > + GopBltArgs.Width =3D Width; > + GopBltArgs.SourceX =3D SourceX; > + GopBltArgs.SourceY =3D SourceY; > + GopBltArgs.Delta =3D Delta; > + Status =3D 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 supp= ort. > + // > + // 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 =3D gBS->CreateEvent ( > + EVT_SIGNAL_EXIT_BOOT_SERVICES, > + TPL_CALLBACK, > + ShutdownGopEvent, > + Private, > + &mGopScreenExitBootServicesEvent > + ); > + > + Status =3D Private->EmuIoThunk->Open (Private->EmuIoThunk); > + if (!EFI_ERROR (Status)) { > + Private->EmuGraphicsWindow =3D Private->EmuIoThunk->Interface; > + > + // Register callback to support RegisterKeyNotify() > + Status =3D Private->EmuGraphicsWindow->RegisterKeyNotify ( > + Private->EmuGraphicsWindow, > + GopPrivateMakeCallbackFuncti= on, > + GopPrivateBreakCallbackFunct= ion, > + Private > + ); > + ASSERT_EFI_ERROR (Status); > + } > + return Status; > +} > + > +EFI_STATUS > +EmuGopConstructor ( > + GOP_PRIVATE_DATA *Private > + ) > +{ > + Private->ModeData =3D mGopModeData; > + > + Private->GraphicsOutput.QueryMode =3D EmuGopQuerytMode; > + Private->GraphicsOutput.SetMode =3D EmuGopSetMode; > + Private->GraphicsOutput.Blt =3D EmuGopBlt; > + > + // > + // Allocate buffer for Graphics Output Protocol mode information > + // > + Private->GraphicsOutput.Mode =3D AllocatePool (sizeof > (EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE)); > + if (Private->GraphicsOutput.Mode =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + Private->GraphicsOutput.Mode->Info =3D AllocatePool (sizeof > (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION)); > + if (Private->GraphicsOutput.Mode->Info =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + Private->GraphicsOutput.Mode->MaxMode =3D sizeof(mGopModeData) / > sizeof(GOP_MODE_DATA); > + // > + // Till now, we have no idea about the window size. > + // > + Private->GraphicsOutput.Mode->Mode =3D > GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER; > + Private->GraphicsOutput.Mode->Info->Version =3D 0; > + Private->GraphicsOutput.Mode->Info->HorizontalResolution =3D 0; > + Private->GraphicsOutput.Mode->Info->VerticalResolution =3D 0; > + Private->GraphicsOutput.Mode->Info->PixelFormat =3D PixelBltOnly; > + Private->GraphicsOutput.Mode->SizeOfInfo =3D sizeof > (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION); > + Private->GraphicsOutput.Mode->FrameBufferBase =3D > (EFI_PHYSICAL_ADDRESS) (UINTN) NULL; > + Private->GraphicsOutput.Mode->FrameBufferSize =3D 0; > + > + Private->HardwareNeedsStarting =3D TRUE; > + Private->EmuGraphicsWindow =3D 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 =3D NULL; > + } > + > + // > + // Free graphics output protocol occupied resource > + // > + if (Private->GraphicsOutput.Mode !=3D NULL) { > + if (Private->GraphicsOutput.Mode->Info !=3D 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 =3D > { > NULL // Mode > }; >=20 > -EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate =3D { > +EFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate =3D { > 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 wha= t > goes > -where in the magic page. > - > -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 BS= D > License > -which accompanies this distribution. The full text of the license may b= e found > at > -http://opensource.org/licenses/bsd-license.php > - > -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 > -#include > -#include > - > -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 wha= t > goes > +where in the magic page. > + > +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 BS= D > License > +which accompanies this distribution. The full text of the license may b= e found > at > +http://opensource.org/licenses/bsd-license.php > + > +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 > +#include > +#include > + > +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.
> -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BS= D > License > -which accompanies this distribution. The full text of the license may b= e found > at > -http://opensource.org/licenses/bsd-license.php > - > -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 > - > - > -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.
> +This program and the accompanying materials > +are licensed and made available under the terms and conditions of the BS= D > License > +which accompanies this distribution. The full text of the license may b= e found > at > +http://opensource.org/licenses/bsd-license.php > + > +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 > + > + > +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.
> -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BS= D > License > -which accompanies this distribution. The full text of the license may b= e found > at > -http://opensource.org/licenses/bsd-license.php > - > -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.
> +This program and the accompanying materials > +are licensed and made available under the terms and conditions of the BS= D > License > +which accompanies this distribution. The full text of the license may b= e found > at > +http://opensource.org/licenses/bsd-license.php > + > +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 availabl= e to > DXE > - and UEFI module types. > - > - > -Copyright (c) 2012, Apple Inc. All rights reserved. > -Portitions Copyright (c) 2006 - 2011, Intel Corporation. All rights rese= rved.
> -This program and the accompanying materials are licensed and made > available under > -the terms and conditions of the BSD License that accompanies this distri= bution. > -The full text of the license may be found at > -http://opensource.org/licenses/bsd-license.php. > - > -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 > -#include > - > - > -/// > -/// 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 re= cord. > - // > - 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 =3D { > - { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof > (SMBIOS_TABLE_TYPE12), 0 }, > - 1 // StringCount > - }; > - CHAR8 *gSmbiosType12Strings[] =3D { > - "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() w= as > called. > - > - @param[in] SmbiosHandle SMBIOS Handle of structure that will hav= e its > string updated. > - @param[in] StringNumber The non-zero string number of the string= to > update. > - @param[in] String Update the StringNumber string with Stri= ng. > - > - @retval EFI_SUCCESS SmbiosHandle had its StringNumber String > updated. > - @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String i= s > invalid. > - @retval EFI_UNSUPPORTED String was not added because it is longe= r > than the SMBIOS Table supports. > - @retval EFI_NOT_FOUND The StringNumber.is not valid for this S= MBIOS > 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() w= as > called. > - > - @param[in] SmbiosHandle SMBIOS Handle of structure that will hav= e its > string updated. > - @param[in] StringNumber The non-zero string number of the string= to > update. > - @param[in] String Update the StringNumber string with Stri= ng. > - > - @retval EFI_SUCCESS SmbiosHandle had its StringNumber String > updated. > - @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String i= s > invalid. > - @retval EFI_UNSUPPORTED String was not added because it is longe= r > than the SMBIOS Table supports. > - @retval EFI_NOT_FOUND The StringNumber.is not valid for this S= MBIOS > 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 f= ound. > - @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 f= ound. > - @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 vali= d > SMBIOS record. > -**/ > -EFI_STATUS > -EFIAPI > -SmbiosLibRemove ( > - OUT EFI_SMBIOS_HANDLE SmbiosHandle > - ); > - > - > - > - > -#endif > +/** @file > + Provides library functions for common SMBIOS operations. Only availabl= e to > DXE > + and UEFI module types. > + > + > +Copyright (c) 2012, Apple Inc. All rights reserved. > +Portitions Copyright (c) 2006 - 2011, Intel Corporation. All rights rese= rved.
> +This program and the accompanying materials are licensed and made > available under > +the terms and conditions of the BSD License that accompanies this distri= bution. > +The full text of the license may be found at > +http://opensource.org/licenses/bsd-license.php. > + > +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 > +#include > + > + > +/// > +/// 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 re= cord. > + // > + 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 =3D { > + { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof > (SMBIOS_TABLE_TYPE12), 0 }, > + 1 // StringCount > + }; > + CHAR8 *gSmbiosType12Strings[] =3D { > + "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() w= as > called. > + > + @param[in] SmbiosHandle SMBIOS Handle of structure that will hav= e its > string updated. > + @param[in] StringNumber The non-zero string number of the string= to > update. > + @param[in] String Update the StringNumber string with Stri= ng. > + > + @retval EFI_SUCCESS SmbiosHandle had its StringNumber String > updated. > + @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String i= s > invalid. > + @retval EFI_UNSUPPORTED String was not added because it is longe= r > than the SMBIOS Table supports. > + @retval EFI_NOT_FOUND The StringNumber.is not valid for this S= MBIOS > 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() w= as > called. > + > + @param[in] SmbiosHandle SMBIOS Handle of structure that will hav= e its > string updated. > + @param[in] StringNumber The non-zero string number of the string= to > update. > + @param[in] String Update the StringNumber string with Stri= ng. > + > + @retval EFI_SUCCESS SmbiosHandle had its StringNumber String > updated. > + @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String i= s > invalid. > + @retval EFI_UNSUPPORTED String was not added because it is longe= r > than the SMBIOS Table supports. > + @retval EFI_NOT_FOUND The StringNumber.is not valid for this S= MBIOS > 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 f= ound. > + @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 f= ound. > + @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 vali= d > 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 me= dia 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 devi= ce block > size. > @param[out] Buffer A pointer to the destination buffer for th= e data. > The > caller is responsible for either having im= plicit 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 f= ile > - system other than FAT. > - > - UEFI 2.0 can boot from any valid EFI image contained in a SimpleFileSy= stem. > - > -Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
> -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 distri= bution. > -The full text of the license may be found at > -http://opensource.org/licenses/bsd-license.php. > - > -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 > -#include > -#include > -#include > - > -#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \ > - { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xC= A, > 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 f= ile > + system other than FAT. > + > + UEFI 2.0 can boot from any valid EFI image contained in a SimpleFileSy= stem. > + > +Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
> +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 distri= bution. > +The full text of the license may be found at > +http://opensource.org/licenses/bsd-license.php. > + > +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 > +#include > +#include > +#include > + > +#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \ > + { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xC= A, > 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.
> -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 > -#include > -#include > -#include > - > -#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \ > - { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xC= A, > 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.
> +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 > +#include > +#include > +#include > + > +#define EMU_GRAPHICS_WINDOW_PROTOCOL_GUID \ > + { 0x30FD316A, 0x6728, 0x2E41, { 0xA6, 0x90, 0x0D, 0x13, 0x33, 0xD8, 0xC= A, > 0xC1 } } > + > +typedef struct _EMU_GRAPHICS_WINDOW_PROTOCOL > EMU_GRAPHICS_WINDOW_PROTOCOL; > + > +typedef > +EFI_STATUS > +(EFIAPI *EMU_GRAPHICS_WINDOWS_CLOSE)( > + EMU_GRAPHICS_WINDOW_PROTOCOL *Uga > + ); > + > +typedef > +EFI_STATUS > +(EFIAPI *EMU_GRAPHICS_WINDOWS_SIZE)( > + EMU_GRAPHICS_WINDOW_PROTOCOL *Uga, > + UINT32 Width, > + UINT32 Height > + ); > + > +typedef > +EFI_STATUS > +(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_KEY)( > + EMU_GRAPHICS_WINDOW_PROTOCOL *Uga > + ); > + > +typedef > +EFI_STATUS > +(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_KEY)( > + EMU_GRAPHICS_WINDOW_PROTOCOL *Uga, > + EFI_KEY_DATA *key > + ); > + > +typedef > +EFI_STATUS > +(EFIAPI *EMU_GRAPHICS_WINDOWS_KEY_SET_STATE) ( > + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows, > + IN EFI_KEY_TOGGLE_STATE *KeyToggleState > + ); > + > + > +typedef > +VOID > +(EFIAPI *EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK) ( > + IN VOID *Context, > + IN EFI_KEY_DATA *KeyData > + ); > + > +typedef > +EFI_STATUS > +(EFIAPI *EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY) ( > + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows= , > + IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK > MakeCallBack, > + IN EMU_GRAPHICS_WINDOW_REGISTER_KEY_NOTIFY_CALLBACK > BreakCallBack, > + IN VOID *Context > + ); > + > + > +typedef struct { > + UINTN SourceX; > + UINTN SourceY; > + UINTN DestinationX; > + UINTN DestinationY; > + UINTN Width; > + UINTN Height; > + UINTN Delta; > +} EMU_GRAPHICS_WINDOWS__BLT_ARGS; > + > +typedef > +EFI_STATUS > +(EFIAPI *EMU_GRAPHICS_WINDOWS_BLT)( > + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows, > + IN EFI_UGA_PIXEL *BltBuffer OPTIONAL, > + IN EFI_UGA_BLT_OPERATION BltOperation, > + IN EMU_GRAPHICS_WINDOWS__BLT_ARGS *Args > + ); > + > +typedef > +BOOLEAN > +(EFIAPI *EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED) ( > + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows, > + IN EFI_KEY_DATA *KeyData > + ); > + > +typedef > +EFI_STATUS > +(EFIAPI *EMU_GRAPHICS_WINDOWS_CHECK_POINTER)( > + EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows > + ); > + > +typedef > +EFI_STATUS > +(EFIAPI *EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE)( > + EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsWindows, > + EFI_SIMPLE_POINTER_STATE *state > + ); > + > +struct _EMU_GRAPHICS_WINDOW_PROTOCOL { > + EMU_GRAPHICS_WINDOWS_SIZE Size; > + EMU_GRAPHICS_WINDOWS_CHECK_KEY CheckKey; > + EMU_GRAPHICS_WINDOWS_KEY_SET_STATE KeySetState; > + EMU_GRAPHICS_WINDOWS_GET_KEY GetKey; > + EMU_GRAPHICS_WINDOWS_REGISTER_KEY_NOTIFY RegisterKeyNotify; > + EMU_GRAPHICS_WINDOWS_BLT Blt; > + EMU_GRAPHICS_WINDOWS_IS_KEY_PRESSED IsKeyPressed; > + EMU_GRAPHICS_WINDOWS_CHECK_POINTER CheckPointer; > + EMU_GRAPHICS_WINDOWS_GET_POINTER_STATE GetPointerState; > +}; > + > + > +extern EFI_GUID gEmuGraphicsWindowProtocolGuid; > + > +#endif > diff --git a/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c > b/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c > index 7478a5ef2a..aa2066e132 100644 > --- a/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c > +++ b/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.c > @@ -180,4 +180,4 @@ DevicePathToTextLibConstructor ( > DevicePathFromTextAddFilter (L"EmuThread", DevPathFromTextEmuThread); > DevicePathFromTextAddFilter (L"EmuFs", DevPathFromTextEmuFs); > return EFI_SUCCESS; > -} > \ No newline at end of file > +} > diff --git a/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf > b/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf > index f5726785e1..c484f8ec16 100644 > --- a/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf > +++ b/EmulatorPkg/Library/DevicePathTextLib/DevicePathTextLib.inf > @@ -45,4 +45,4 @@ [Protocols] > gEmuGraphicsWindowProtocolGuid > gEfiSimpleFileSystemProtocolGuid > gEmuBlockIoProtocolGuid > - gEmuThreadThunkProtocolGuid > \ No newline at end of file > + gEmuThreadThunkProtocolGuid > diff --git a/EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c > b/EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c > index 22f8da7b64..7dd2d49451 100644 > --- a/EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c > +++ b/EmulatorPkg/Library/DxeEmuLib/DxeEmuLib.c > @@ -85,4 +85,4 @@ GetIoThunkInstance ( > } >=20 > return NULL; > -} > \ No newline at end of file > +} > diff --git > a/EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActio > nLib.inf > b/EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActio > nLib.inf > index f79ebc78e2..682231b83e 100644 > --- > a/EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActio > nLib.inf > +++ > b/EmulatorPkg/Library/DxeEmuPeCoffExtraActionLib/DxeEmuPeCoffExtraActio > nLib.inf > @@ -1,48 +1,48 @@ > -## @file > -# PeCoff extra action libary for DXE phase that run Emu emulator. > -# > -# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.
> -# 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 =3D 0x00010005 > - BASE_NAME =3D DxeEmuPeCoffExtraActionLib > - FILE_GUID =3D 68FCD487-D230-6846-95B1-5E1F2EF942C= 4 > - MODULE_TYPE =3D DXE_DRIVER > - VERSION_STRING =3D 1.0 > - LIBRARY_CLASS =3D PeCoffExtraActionLib|DXE_CORE DXE_D= RIVER > DXE_RUNTIME_DRIVER UEFI_DRIVER > - > - CONSTRUCTOR =3D DxeEmuPeCoffLibExtraActionConstruct= or > - > -# > -# The following information is for reference only and not required by th= e build > tools. > -# > -# VALID_ARCHITECTURES =3D 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.
> +# 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 =3D 0x00010005 > + BASE_NAME =3D DxeEmuPeCoffExtraActionLib > + FILE_GUID =3D 68FCD487-D230-6846-95B1-5E1F2EF942C= 4 > + MODULE_TYPE =3D DXE_DRIVER > + VERSION_STRING =3D 1.0 > + LIBRARY_CLASS =3D PeCoffExtraActionLib|DXE_CORE DXE_D= RIVER > DXE_RUNTIME_DRIVER UEFI_DRIVER > + > + CONSTRUCTOR =3D DxeEmuPeCoffLibExtraActionConstruct= or > + > +# > +# The following information is for reference only and not required by th= e build > tools. > +# > +# VALID_ARCHITECTURES =3D 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 =3D=3D NULL) { > return NumberOfBytes; > } > - > + > return gEmuThunk->WriteStdErr (Buffer, NumberOfBytes); > } >=20 > 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/PeiServicesTablePoin= te > r.c > b/EmulatorPkg/Library/PeiCoreServicesTablePointerLib/PeiServicesTablePoin= te > r.c > index 06f995b0d3..72b68c283c 100644 > --- > a/EmulatorPkg/Library/PeiCoreServicesTablePointerLib/PeiServicesTablePoin= te > r.c > +++ > b/EmulatorPkg/Library/PeiCoreServicesTablePointerLib/PeiServicesTablePoin= te > r.c > @@ -89,16 +89,16 @@ PeiServicesTablePointerLibConstructor ( > } >=20 > /** > - Perform CPU specific actions required to migrate the PEI Services Tabl= e > + Perform CPU specific actions required to migrate the PEI Services Tabl= e > pointer from temporary RAM to permanent RAM. >=20 > - 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 i= n > - a dedicated CPU register. This means that there is no memory storage > - associated with storing the PEI Services Table pointer, so no addition= al > + a dedicated CPU register. This means that there is no memory storage > + associated with storing the PEI Services Table pointer, so no addition= al > migration actions are required for Itanium or ARM CPUs. >=20 > **/ > @@ -109,7 +109,7 @@ MigratePeiServicesTablePointer ( > ) > { > // > - // PEI Services Table pointer is cached in the global variable. No ad= ditional > + // PEI Services Table pointer is cached in the global variable. No ad= ditional > // migration actions are required. > // > return; > diff --git > a/EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraAction > Lib.inf > b/EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraAction > Lib.inf > index 9a757f7294..fdaf19ab6c 100644 > --- > a/EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraAction > Lib.inf > +++ > b/EmulatorPkg/Library/PeiEmuPeCoffExtraActionLib/PeiEmuPeCoffExtraAction > Lib.inf > @@ -1,49 +1,49 @@ > -## @file > -# PeCoff extra action libary for Pei phase that run Emu emulator. > -# > -# Lib to provide memory journal status code reporting Routines > -# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.
> -# 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 =3D 0x00010005 > - BASE_NAME =3D PeiEmuPeCoffExtraActionLib > - FILE_GUID =3D 79C4E72A-730B-F040-8129-95877B3A97A= 8 > - MODULE_TYPE =3D PEIM > - VERSION_STRING =3D 1.0 > - LIBRARY_CLASS =3D PeCoffExtraActionLib|PEI_CORE PEIM > - > -# > -# The following information is for reference only and not required by th= e build > tools. > -# > -# VALID_ARCHITECTURES =3D 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.
> +# 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 =3D 0x00010005 > + BASE_NAME =3D PeiEmuPeCoffExtraActionLib > + FILE_GUID =3D 79C4E72A-730B-F040-8129-95877B3A97A= 8 > + MODULE_TYPE =3D PEIM > + VERSION_STRING =3D 1.0 > + LIBRARY_CLASS =3D PeCoffExtraActionLib|PEI_CORE PEIM > + > +# > +# The following information is for reference only and not required by th= e build > tools. > +# > +# VALID_ARCHITECTURES =3D 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 ( > } >=20 > /** > - Perform CPU specific actions required to migrate the PEI Services Tabl= e > + Perform CPU specific actions required to migrate the PEI Services Tabl= e > pointer from temporary RAM to permanent RAM. >=20 > - 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 i= n > - a dedicated CPU register. This means that there is no memory storage > - associated with storing the PEI Services Table pointer, so no addition= al > + a dedicated CPU register. This means that there is no memory storage > + associated with storing the PEI Services Table pointer, so no addition= al > migration actions are required for Itanium or ARM CPUs. >=20 > **/ > @@ -154,7 +154,7 @@ MigratePeiServicesTablePointer ( > ) > { > // > - // PEI Services Table pointer is cached in the global variable. No ad= ditional > + // PEI Services Table pointer is cached in the global variable. No ad= ditional > // migration actions are required. > // > return; > diff --git > a/EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTabl= e > Pointer.c > b/EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTabl= e > Pointer.c > index fa04ed3e04..383460b342 100644 > --- > a/EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTabl= e > Pointer.c > +++ > b/EmulatorPkg/Library/PeiServicesTablePointerLibMagicPage/PeiServicesTabl= e > Pointer.c > @@ -72,16 +72,16 @@ GetPeiServicesTablePointer ( > } >=20 > /** > - Perform CPU specific actions required to migrate the PEI Services Tabl= e > + Perform CPU specific actions required to migrate the PEI Services Tabl= e > pointer from temporary RAM to permanent RAM. >=20 > - 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 i= n > - a dedicated CPU register. This means that there is no memory storage > - associated with storing the PEI Services Table pointer, so no addition= al > + a dedicated CPU register. This means that there is no memory storage > + associated with storing the PEI Services Table pointer, so no addition= al > migration actions are required for Itanium or ARM CPUs. >=20 > **/ > @@ -92,7 +92,7 @@ MigratePeiServicesTablePointer ( > ) > { > // > - // PEI Services Table pointer is cached in SRAM. No additional > + // PEI Services Table pointer is cached in SRAM. No additional > // migration actions are required. > // > return; > diff --git a/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf > b/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf > index e473b52376..0f23178533 100644 > --- a/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf > +++ b/EmulatorPkg/Library/PeiTimerLib/PeiTimerLib.inf > @@ -44,4 +44,4 @@ [LibraryClasses] > PeiServicesLib >=20 > [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.
> -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BS= D > License > -which accompanies this distribution. The full text of the license may b= e found > at > -http://opensource.org/licenses/bsd-license.php > - > -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 > - > - > -#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_POLARIT= Y > - 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 =3D FfsHeader->State; > - > - if (ErasePolarity !=3D 0) { > - FileState =3D (EFI_FFS_FILE_STATE)~FileState; > - } > - > - HighestBit =3D 0x80; > - while (HighestBit !=3D 0 && (HighestBit & FileState) =3D=3D 0) { > - HighestBit >>=3D 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 =3D 0; > - ptr =3D (UINT8 *) FileHeader; > - > - for (Index =3D 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index +=3D= 4) { > - Sum =3D (UINT8) (Sum + ptr[Index]); > - Sum =3D (UINT8) (Sum + ptr[Index + 1]); > - Sum =3D (UINT8) (Sum + ptr[Index + 2]); > - Sum =3D (UINT8) (Sum + ptr[Index + 3]); > - } > - > - for (; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) { > - Sum =3D (UINT8) (Sum + ptr[Index]); > - } > - // > - // State field (since this indicates the different state of file). > - // > - Sum =3D (UINT8) (Sum - FileHeader->State); > - // > - // Checksum field of the file is not part of the header checksum. > - // > - Sum =3D (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 t= he > - FFS volume as defined by SearchType. The search starts from FileHead= er > 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 search= ing. > - This pointer will be updated upon return to reflect th= e 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 =3D (EFI_FIRMWARE_VOLUME_HEADER *) FvHandle; > - FileHeader =3D (EFI_FFS_FILE_HEADER **)FileHandle; > - > - FvLength =3D FwVolHeader->FvLength; > - if (FwVolHeader->Attributes & EFI_FVB2_ERASE_POLARITY) { > - ErasePolarity =3D 1; > - } else { > - ErasePolarity =3D 0; > - } > - // > - // If FileHeader is not specified (NULL) start with the first file in = the > - // firmware volume. Otherwise, start from the FileHeader. > - // > - if (*FileHeader =3D=3D NULL) { > - FfsFileHeader =3D (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 aligne= d. > - // > - FileLength =3D *(UINT32 *) (*FileHeader)->Size & 0x00FFFFFF; > - FileOccupiedSize =3D GET_OCCUPIED_SIZE (FileLength, 8); > - FfsFileHeader =3D (EFI_FFS_FILE_HEADER *) ((UINT8 *) *FileHeader= + > FileOccupiedSize); > - } > - > - FileOffset =3D (UINT32) ((UINT8 *) FfsFileHeader - (UINT8 *) FwVolHead= er); > - > - while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) { > - // > - // Get FileState which is the highest bit of the State > - // > - FileState =3D GetFileState (ErasePolarity, FfsFileHeader); > - > - switch (FileState) { > - > - case EFI_FILE_HEADER_INVALID: > - FileOffset +=3D sizeof (EFI_FFS_FILE_HEADER); > - FfsFileHeader =3D (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) =3D=3D 0) { > - FileLength =3D *(UINT32 *) (FfsFileHeader->Size) & 0x00FF= FFFF; > - FileOccupiedSize =3D GET_OCCUPIED_SIZE (FileLength, 8); > - > - if ((SearchType =3D=3D FfsFileHeader->Type) || (SearchType =3D= =3D > EFI_FV_FILETYPE_ALL)) { > - > - *FileHeader =3D FfsFileHeader; > - > - return EFI_SUCCESS; > - } > - > - FileOffset +=3D FileOccupiedSize; > - FfsFileHeader =3D (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHead= er + > FileOccupiedSize); > - } else { > - return EFI_NOT_FOUND; > - } > - break; > - > - case EFI_FILE_DELETED: > - FileLength =3D *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFF= FF; > - FileOccupiedSize =3D GET_OCCUPIED_SIZE (FileLength, 8); > - FileOffset +=3D FileOccupiedSize; > - FfsFileHeader =3D (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 i= n 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 FfsFi= leHeader. > - 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 =3D (EFI_COMMON_SECTION_HEADER *) (FfsFileHeader + 1); > - FileSize =3D *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF; > - FileSize -=3D sizeof (EFI_FFS_FILE_HEADER); > - > - *SectionData =3D NULL; > - ParsedLength =3D 0; > - while (ParsedLength < FileSize) { > - if (Section->Type =3D=3D SectionType) { > - *SectionData =3D (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 =3D *(UINT32 *) Section->Size & 0x00FFFFFF; > - SectionLength =3D GET_OCCUPIED_SIZE (SectionLength, 4); > - > - ParsedLength +=3D SectionLength; > - Section =3D (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.
> +This program and the accompanying materials > +are licensed and made available under the terms and conditions of the BS= D > License > +which accompanies this distribution. The full text of the license may b= e found > at > +http://opensource.org/licenses/bsd-license.php > + > +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 > + > + > +#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_POLARIT= Y > + 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 =3D FfsHeader->State; > + > + if (ErasePolarity !=3D 0) { > + FileState =3D (EFI_FFS_FILE_STATE)~FileState; > + } > + > + HighestBit =3D 0x80; > + while (HighestBit !=3D 0 && (HighestBit & FileState) =3D=3D 0) { > + HighestBit >>=3D 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 =3D 0; > + ptr =3D (UINT8 *) FileHeader; > + > + for (Index =3D 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index +=3D= 4) { > + Sum =3D (UINT8) (Sum + ptr[Index]); > + Sum =3D (UINT8) (Sum + ptr[Index + 1]); > + Sum =3D (UINT8) (Sum + ptr[Index + 2]); > + Sum =3D (UINT8) (Sum + ptr[Index + 3]); > + } > + > + for (; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) { > + Sum =3D (UINT8) (Sum + ptr[Index]); > + } > + // > + // State field (since this indicates the different state of file). > + // > + Sum =3D (UINT8) (Sum - FileHeader->State); > + // > + // Checksum field of the file is not part of the header checksum. > + // > + Sum =3D (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 t= he > + FFS volume as defined by SearchType. The search starts from FileHead= er > 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 search= ing. > + This pointer will be updated upon return to reflect th= e 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 =3D (EFI_FIRMWARE_VOLUME_HEADER *) FvHandle; > + FileHeader =3D (EFI_FFS_FILE_HEADER **)FileHandle; > + > + FvLength =3D FwVolHeader->FvLength; > + if (FwVolHeader->Attributes & EFI_FVB2_ERASE_POLARITY) { > + ErasePolarity =3D 1; > + } else { > + ErasePolarity =3D 0; > + } > + // > + // If FileHeader is not specified (NULL) start with the first file in = the > + // firmware volume. Otherwise, start from the FileHeader. > + // > + if (*FileHeader =3D=3D NULL) { > + FfsFileHeader =3D (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 aligne= d. > + // > + FileLength =3D *(UINT32 *) (*FileHeader)->Size & 0x00FFFFFF; > + FileOccupiedSize =3D GET_OCCUPIED_SIZE (FileLength, 8); > + FfsFileHeader =3D (EFI_FFS_FILE_HEADER *) ((UINT8 *) *FileHeader= + > FileOccupiedSize); > + } > + > + FileOffset =3D (UINT32) ((UINT8 *) FfsFileHeader - (UINT8 *) FwVolHead= er); > + > + while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) { > + // > + // Get FileState which is the highest bit of the State > + // > + FileState =3D GetFileState (ErasePolarity, FfsFileHeader); > + > + switch (FileState) { > + > + case EFI_FILE_HEADER_INVALID: > + FileOffset +=3D sizeof (EFI_FFS_FILE_HEADER); > + FfsFileHeader =3D (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) =3D=3D 0) { > + FileLength =3D *(UINT32 *) (FfsFileHeader->Size) & 0x00FF= FFFF; > + FileOccupiedSize =3D GET_OCCUPIED_SIZE (FileLength, 8); > + > + if ((SearchType =3D=3D FfsFileHeader->Type) || (SearchType =3D= =3D > EFI_FV_FILETYPE_ALL)) { > + > + *FileHeader =3D FfsFileHeader; > + > + return EFI_SUCCESS; > + } > + > + FileOffset +=3D FileOccupiedSize; > + FfsFileHeader =3D (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHead= er + > FileOccupiedSize); > + } else { > + return EFI_NOT_FOUND; > + } > + break; > + > + case EFI_FILE_DELETED: > + FileLength =3D *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFF= FF; > + FileOccupiedSize =3D GET_OCCUPIED_SIZE (FileLength, 8); > + FileOffset +=3D FileOccupiedSize; > + FfsFileHeader =3D (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 i= n 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 FfsFi= leHeader. > + 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 =3D (EFI_COMMON_SECTION_HEADER *) (FfsFileHeader + 1); > + FileSize =3D *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF; > + FileSize -=3D sizeof (EFI_FFS_FILE_HEADER); > + > + *SectionData =3D NULL; > + ParsedLength =3D 0; > + while (ParsedLength < FileSize) { > + if (Section->Type =3D=3D SectionType) { > + *SectionData =3D (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 =3D *(UINT32 *) Section->Size & 0x00FFFFFF; > + SectionLength =3D GET_OCCUPIED_SIZE (SectionLength, 4); > + > + ParsedLength +=3D SectionLength; > + Section =3D (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.
> -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BS= D > License > -which accompanies this distribution. The full text of the license may b= e found > at > -http://opensource.org/licenses/bsd-license.php > - > -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 > - > -CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList =3D NULL; > - > +/*++ @file > + > +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 BS= D > License > +which accompanies this distribution. The full text of the license may b= e found > at > +http://opensource.org/licenses/bsd-license.php > + > +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 > + > +CONST EFI_PEI_PPI_DESCRIPTOR *gPpiList =3D 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 availabl= e to > DXE > - and UEFI module types. > - > - > -Copyright (c) 2012, Apple Inc. All rights reserved. > -Portitions Copyright (c) 2006 - 2012, Intel Corporation. All rights rese= rved.
> -This program and the accompanying materials are licensed and made > available under > -the terms and conditions of the BSD License that accompanies this distri= bution. > -The full text of the license may be found at > -http://opensource.org/licenses/bsd-license.php. > - > -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 > -#include > -#include > -#include > -#include > -#include > -#include > -#include > - > - > -EFI_SMBIOS_PROTOCOL *gSmbios =3D 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 =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - Status =3D EFI_SUCCESS; > - > - for (Index =3D 0; Template[Index].Entry !=3D NULL; Index++) { > - Status =3D 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 =3D { > - { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof > (SMBIOS_TABLE_TYPE12), 0 }, > - 1 // StringCount > - }; > - CHAR8 *gSmbiosType12Strings[] =3D { > - "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 =3D SmbiosEntry->Length; > - if (StringArray =3D=3D NULL) { > - Size +=3D 2; // Min string section is double null > - } else if (StringArray[0] =3D=3D NULL) { > - Size +=3D 2; // Min string section is double null > - } else { > - for (Index =3D 0; StringArray[Index] !=3D NULL; Index++) { > - StringSize =3D AsciiStrSize (StringArray[Index]); > - Size +=3D StringSize; > - } > - // Don't forget the terminating double null > - Size +=3D 1; > - } > - > - // Copy over Template > - Record =3D (EFI_SMBIOS_TABLE_HEADER *)AllocateZeroPool (Size); > - if (Record =3D=3D NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - CopyMem (Record, SmbiosEntry, SmbiosEntry->Length); > - > - if (StringArray !=3D NULL) { > - // Append string pack > - Str =3D ((CHAR8 *)Record) + Record->Length; > - for (Index =3D 0; StringArray[Index] !=3D NULL; Index++) { > - StringSize =3D AsciiStrSize (StringArray[Index]); > - CopyMem (Str, StringArray[Index], StringSize); > - Str +=3D StringSize; > - } > - *Str =3D 0; > - } > - > - SmbiosHandle =3D SMBIOS_HANDLE_PI_RESERVED; > - Status =3D 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() w= as > called. > - > - @param[in] SmbiosHandle SMBIOS Handle of structure that will hav= e its > string updated. > - @param[in] StringNumber The non-zero string number of the string= to > update. > - @param[in] String Update the StringNumber string with Stri= ng. > - > - @retval EFI_SUCCESS SmbiosHandle had its StringNumber String > updated. > - @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String i= s > invalid. > - @retval EFI_UNSUPPORTED String was not added because it is longe= r > than the SMBIOS Table supports. > - @retval EFI_NOT_FOUND The StringNumber.is not valid for this S= MBIOS > record. > -**/ > -EFI_STATUS > -EFIAPI > -SmbiosLibUpdateString ( > - IN EFI_SMBIOS_HANDLE SmbiosHandle, > - IN SMBIOS_TABLE_STRING StringNumber, > - IN CHAR8 *String > - ) > -{ > - UINTN StringIndex; > - > - if (String =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (*String =3D=3D '\0') { > - // A string with no data is not legal in SMBIOS > - return EFI_INVALID_PARAMETER; > - } > - > - StringIndex =3D 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() w= as > called. > - > - @param[in] SmbiosHandle SMBIOS Handle of structure that will hav= e its > string updated. > - @param[in] StringNumber The non-zero string number of the string= to > update. > - @param[in] String Update the StringNumber string with Stri= ng. > - > - @retval EFI_SUCCESS SmbiosHandle had its StringNumber String > updated. > - @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String i= s > invalid. > - @retval EFI_UNSUPPORTED String was not added because it is longe= r > than the SMBIOS Table supports. > - @retval EFI_NOT_FOUND The StringNumber.is not valid for this S= MBIOS > 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 =3D=3D NULL) { > - return EFI_INVALID_PARAMETER; > - } > - > - if (*String =3D=3D '\0') { > - // A string with no data is not legal in SMBIOS > - return EFI_INVALID_PARAMETER; > - } > - > - Ascii =3D AllocateZeroPool (StrSize (String)); > - if (Ascii =3D=3D NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - UnicodeStrToAsciiStr (String, Ascii); > - > - StringIndex =3D StringNumber; > - Status =3D 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 f= ound. > - @retval Other Pointer to matching SMBIOS string. > -**/ > -CHAR8 * > -EFIAPI > -SmbiosLibReadString ( > - IN SMBIOS_STRUCTURE *Header, > - IN EFI_SMBIOS_STRING StringNumber > - ) > -{ > - CHAR8 *Data; > - UINTN Match; > - > - Data =3D (CHAR8 *)Header + Header->Length; > - for (Match =3D 1;!(*Data =3D=3D 0 && *(Data+1) =3D=3D 0); ) { > - if (StringNumber =3D=3D Match) { > - return Data; > - } > - Data++; > - if (*(Data - 1) =3D=3D '\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 f= ound. > - @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 =3D 0; > - *SmbiosHandle =3D SMBIOS_HANDLE_PI_RESERVED; > - do { > - Status =3D gSmbios->GetNext (gSmbios, SmbiosHandle, &Type, &Record, > NULL); > - if (!EFI_ERROR (Status)) { > - if (Match =3D=3D 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 vali= d > 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 availabl= e to > DXE > + and UEFI module types. > + > + > +Copyright (c) 2012, Apple Inc. All rights reserved. > +Portitions Copyright (c) 2006 - 2012, Intel Corporation. All rights rese= rved.
> +This program and the accompanying materials are licensed and made > available under > +the terms and conditions of the BSD License that accompanies this distri= bution. > +The full text of the license may be found at > +http://opensource.org/licenses/bsd-license.php. > + > +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 > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > + > +EFI_SMBIOS_PROTOCOL *gSmbios =3D 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 =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + Status =3D EFI_SUCCESS; > + > + for (Index =3D 0; Template[Index].Entry !=3D NULL; Index++) { > + Status =3D 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 =3D { > + { EFI_SMBIOS_TYPE_SYSTEM_CONFIGURATION_OPTIONS, sizeof > (SMBIOS_TABLE_TYPE12), 0 }, > + 1 // StringCount > + }; > + CHAR8 *gSmbiosType12Strings[] =3D { > + "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 =3D SmbiosEntry->Length; > + if (StringArray =3D=3D NULL) { > + Size +=3D 2; // Min string section is double null > + } else if (StringArray[0] =3D=3D NULL) { > + Size +=3D 2; // Min string section is double null > + } else { > + for (Index =3D 0; StringArray[Index] !=3D NULL; Index++) { > + StringSize =3D AsciiStrSize (StringArray[Index]); > + Size +=3D StringSize; > + } > + // Don't forget the terminating double null > + Size +=3D 1; > + } > + > + // Copy over Template > + Record =3D (EFI_SMBIOS_TABLE_HEADER *)AllocateZeroPool (Size); > + if (Record =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + CopyMem (Record, SmbiosEntry, SmbiosEntry->Length); > + > + if (StringArray !=3D NULL) { > + // Append string pack > + Str =3D ((CHAR8 *)Record) + Record->Length; > + for (Index =3D 0; StringArray[Index] !=3D NULL; Index++) { > + StringSize =3D AsciiStrSize (StringArray[Index]); > + CopyMem (Str, StringArray[Index], StringSize); > + Str +=3D StringSize; > + } > + *Str =3D 0; > + } > + > + SmbiosHandle =3D SMBIOS_HANDLE_PI_RESERVED; > + Status =3D 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() w= as > called. > + > + @param[in] SmbiosHandle SMBIOS Handle of structure that will hav= e its > string updated. > + @param[in] StringNumber The non-zero string number of the string= to > update. > + @param[in] String Update the StringNumber string with Stri= ng. > + > + @retval EFI_SUCCESS SmbiosHandle had its StringNumber String > updated. > + @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String i= s > invalid. > + @retval EFI_UNSUPPORTED String was not added because it is longe= r > than the SMBIOS Table supports. > + @retval EFI_NOT_FOUND The StringNumber.is not valid for this S= MBIOS > record. > +**/ > +EFI_STATUS > +EFIAPI > +SmbiosLibUpdateString ( > + IN EFI_SMBIOS_HANDLE SmbiosHandle, > + IN SMBIOS_TABLE_STRING StringNumber, > + IN CHAR8 *String > + ) > +{ > + UINTN StringIndex; > + > + if (String =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (*String =3D=3D '\0') { > + // A string with no data is not legal in SMBIOS > + return EFI_INVALID_PARAMETER; > + } > + > + StringIndex =3D 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() w= as > called. > + > + @param[in] SmbiosHandle SMBIOS Handle of structure that will hav= e its > string updated. > + @param[in] StringNumber The non-zero string number of the string= to > update. > + @param[in] String Update the StringNumber string with Stri= ng. > + > + @retval EFI_SUCCESS SmbiosHandle had its StringNumber String > updated. > + @retval EFI_INVALID_PARAMETER SmbiosHandle does not exist. Or String i= s > invalid. > + @retval EFI_UNSUPPORTED String was not added because it is longe= r > than the SMBIOS Table supports. > + @retval EFI_NOT_FOUND The StringNumber.is not valid for this S= MBIOS > 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 =3D=3D NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + if (*String =3D=3D '\0') { > + // A string with no data is not legal in SMBIOS > + return EFI_INVALID_PARAMETER; > + } > + > + Ascii =3D AllocateZeroPool (StrSize (String)); > + if (Ascii =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + UnicodeStrToAsciiStr (String, Ascii); > + > + StringIndex =3D StringNumber; > + Status =3D 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 f= ound. > + @retval Other Pointer to matching SMBIOS string. > +**/ > +CHAR8 * > +EFIAPI > +SmbiosLibReadString ( > + IN SMBIOS_STRUCTURE *Header, > + IN EFI_SMBIOS_STRING StringNumber > + ) > +{ > + CHAR8 *Data; > + UINTN Match; > + > + Data =3D (CHAR8 *)Header + Header->Length; > + for (Match =3D 1;!(*Data =3D=3D 0 && *(Data+1) =3D=3D 0); ) { > + if (StringNumber =3D=3D Match) { > + return Data; > + } > + Data++; > + if (*(Data - 1) =3D=3D '\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 f= ound. > + @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 =3D 0; > + *SmbiosHandle =3D SMBIOS_HANDLE_PI_RESERVED; > + do { > + Status =3D gSmbios->GetNext (gSmbios, SmbiosHandle, &Type, &Record, > NULL); > + if (!EFI_ERROR (Status)) { > + if (Match =3D=3D 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 vali= d > 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 rese= rved.
> -# > -# 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 =3D 0x00010005 > - BASE_NAME =3D SmbiosLib > - FILE_GUID =3D 881863A2-09FD-3E44-8D62-7AE038D0374= 7 > - MODULE_TYPE =3D DXE_DRIVER > - VERSION_STRING =3D 1.0 > - LIBRARY_CLASS =3D SmbiosLib|DXE_CORE DXE_DRIVER > DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER SMM_CORE > UEFI_APPLICATION UEFI_DRIVER > - > - CONSTRUCTOR =3D 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 rese= rved.
> +# > +# 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 =3D 0x00010005 > + BASE_NAME =3D SmbiosLib > + FILE_GUID =3D 881863A2-09FD-3E44-8D62-7AE038D0374= 7 > + MODULE_TYPE =3D DXE_DRIVER > + VERSION_STRING =3D 1.0 > + LIBRARY_CLASS =3D SmbiosLib|DXE_CORE DXE_DRIVER > DXE_RUNTIME_DRIVER DXE_SAL_DRIVER DXE_SMM_DRIVER SMM_CORE > UEFI_APPLICATION UEFI_DRIVER > + > + CONSTRUCTOR =3D 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 SM= BIOS > record. The format of the record is > - determined by EFI_SMBIOS_TABLE_HEADER.Ty= pe. The size > of the formatted area is defined > - by EFI_SMBIOS_TABLE_HEADER.Length and ei= ther > followed by a double-null (0x0000) or > + determined by EFI_SMBIOS_TABLE_HEADER.Ty= pe. The > size of the formatted area is defined > + by EFI_SMBIOS_TABLE_HEADER.Length and ei= ther > followed by a double-null (0x0000) or > a set of null terminated strings and a n= ull. >=20 > @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 SM= BIOS > record. The format of the record is > - determined by EFI_SMBIOS_TABLE_HEADER.Ty= pe. The size > of the formatted area is defined > - by EFI_SMBIOS_TABLE_HEADER.Length and ei= ther > followed by a double-null (0x0000) or > + determined by EFI_SMBIOS_TABLE_HEADER.Ty= pe. The > size of the formatted area is defined > + by EFI_SMBIOS_TABLE_HEADER.Length and ei= ther > followed by a double-null (0x0000) or > a set of null terminated strings and a n= ull. >=20 > @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 =3D GetNextHob (EFI_HOB_TYPE_RESOURCE_DESCRIPTOR, > HobPtr.Raw)) !=3D NULL) { > if (HobPtr.ResourceDescriptor->ResourceType =3D=3D > EFI_RESOURCE_SYSTEM_MEMORY) { > gSmbiosType19Template.ExtendedStartingAddress =3D > HobPtr.ResourceDescriptor->PhysicalStart; > - gSmbiosType19Template.ExtendedEndingAddress =3D > - HobPtr.ResourceDescriptor->PhysicalStart + > + gSmbiosType19Template.ExtendedEndingAddress =3D > + HobPtr.ResourceDescriptor->PhysicalStart + > HobPtr.ResourceDescriptor->ResourceLength - 1; > - > + > SmbiosLibCreateEntry ((SMBIOS_STRUCTURE *)&gSmbiosType19Template, > NULL); > } > HobPtr.Raw =3D GET_NEXT_HOB (HobPtr); > @@ -97,7 +97,7 @@ PlatfomrSmbiosDriverEntryPoint ( > EFI_SMBIOS_HANDLE SmbiosHandle; > SMBIOS_STRUCTURE_POINTER Smbios; >=20 > - // Phase 0 - Patch table to make SMBIOS 2.7 structures smaller to conf= orm > + // Phase 0 - Patch table to make SMBIOS 2.7 structures smaller to conf= orm > // to an early version of the specification. >=20 > // Phase 1 - Initialize SMBIOS tables from template > @@ -112,18 +112,18 @@ PlatfomrSmbiosDriverEntryPoint ( > Smbios.Type0->BiosSize =3D (UINT8)DivU64x32 (FixedPcdGet64 > (PcdEmuFirmwareFdSize), 64*1024) - 1; >=20 > SmbiosLibUpdateUnicodeString ( > - SmbiosHandle, > - Smbios.Type0->BiosVersion, > + SmbiosHandle, > + Smbios.Type0->BiosVersion, > (CHAR16 *) PcdGetPtr (PcdFirmwareVersionString) > ); > SmbiosLibUpdateUnicodeString ( > - SmbiosHandle, > - Smbios.Type0->BiosReleaseDate, > + SmbiosHandle, > + Smbios.Type0->BiosReleaseDate, > (CHAR16 *) PcdGetPtr (PcdFirmwareReleaseDateString) > ); > } >=20 > - // Phase 3 - Create tables from scratch > + // Phase 3 - Create tables from scratch >=20 > // Create Type 13 record from EFI Variables > // Do we need this record for EFI as the info is available from EFI va= raibles > 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 rese= rved.
> # > # This program and the accompanying materials > @@ -52,4 +52,4 @@ [Pcd] > gEmulatorPkgTokenSpaceGuid.PcdEmuFirmwareFdSize >=20 > [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 =3D { > 0, // PrinterIsSupported :1; > 0, // CgaMonoIsSupported :1; > 0, // NecPc98 :1; > - 0 // ReservedForVendor :32; ///< Bits 32-63. Bi= ts 32-47 > reserved for BIOS vendor > - ///< and bits 48-63 res= erved for System Vendor. > - }, > + 0 // ReservedForVendor :32; ///< Bits 32-63. Bi= ts 32-47 > reserved for BIOS vendor > + ///< and bits 48-63 res= erved for System Vendor. > + }, > { // BIOSCharacteristicsExtensionBytes[] > 0x81, // AcpiIsSupported :1; > // UsbLegacyIsSupported :1; > @@ -108,7 +108,7 @@ SMBIOS_TABLE_TYPE1 gSmbiosType1Template =3D { > 3, // Version String > 4, // SerialNumber String > { 0x25EF0280, 0xEC82, 0x42B0, { 0x8F, 0xB6, 0x10, 0xAD, 0xCC, 0xC6, 0x= 7C, > 0x02 } }, > - SystemWakeupTypePowerSwitch, > + SystemWakeupTypePowerSwitch, > 5, // SKUNumber String > 6, // Family String > }; > @@ -119,7 +119,7 @@ CHAR8 *gSmbiosType1Strings[] =3D { > "System Serial#", > "System SKU#", > "edk2", > - NULL > + NULL > }; >=20 > SMBIOS_TABLE_TYPE2 gSmbiosType2Template =3D { > @@ -139,7 +139,7 @@ SMBIOS_TABLE_TYPE2 gSmbiosType2Template =3D { > }, > 6, // LocationInChassis String > 0, // ChassisHandle; > - BaseBoardTypeMotherBoard, // BoardType; > + BaseBoardTypeMotherBoard, // BoardType; > 0, // NumberOfContainedObjectHandles; > { 0 } // ContainedObjectHandles[1]; > }; > @@ -150,7 +150,7 @@ CHAR8 *gSmbiosType2Strings[] =3D { > "Base Board Serial#", > "Base Board Asset Tag#", > "Part Component", > - NULL > + NULL > }; >=20 > SMBIOS_TABLE_TYPE3 gSmbiosType3Template =3D { > @@ -160,10 +160,10 @@ SMBIOS_TABLE_TYPE3 gSmbiosType3Template =3D { > 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[] =3D { > "EmulatorPkg", > "Chassis Board Serial#", > "Chassis Board Asset Tag#", > - NULL > + NULL > }; >=20 > SMBIOS_TABLE_TYPE8 gSmbiosType8Template1 =3D { > 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 a= ddress into > permenent memory > - mov dword ptr [eax + 16], edx > + mov dword ptr [eax + 16], edx > mov esp, eax ; From now, esp is pointed to per= menent 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 permenen= t 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 s= tack 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.
> -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BS= D > License > -which accompanies this distribution. The full text of the license may b= e found > at > -http://opensource.org/licenses/bsd-license.php > - > -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 =3D { > - SecTemporaryRamSupport > -}; > - > - > -EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] =3D { > - { > - 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 hijac= ked by > this > - SEC that sits on top of an OS application. So the entry and exit of th= is 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 Firmwa= re > Volume. > - In addition, it also allows the SEC phase to pass services and data fo= rward 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 Found= ation will > add > - these SEC-hosted PPIs to its PPI database such that both the PEI Found= ation > and any > - modules can leverage the associated service calls and/or code in these= early > PPIs. > - This function is required to call ProcessModuleEntryPointList() with t= he > 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 hav= e been > established. > - If ProcessModuleEntryPointList() returns, then ASSERT() and halt the s= ystem. > - > - @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 loca= tion. > - > - @param PpiList Points to a list of one or more PPI descriptors to= be > installed > - initially by the PEI core. An empty PPI list consi= sts of a single > - descriptor with the end-tag > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST. > - As part of its initialization phase, the PEI Found= ation will add > - these SEC-hosted PPIs to its PPI database such tha= t both the PEI > - Foundation and any modules can leverage the associ= ated 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 =3D PpiList; > - ProcessLibraryConstructorList (); > - > - DEBUG ((EFI_D_ERROR, "SEC Has Started\n")); > - > - // > - // Add Our PPIs to the list > - // > - SecReseveredMemorySize =3D sizeof (gPrivateDispatchTable); > - for (Ppi =3D PpiList, Index =3D 1; ; Ppi++, Index++) { > - SecReseveredMemorySize +=3D sizeof (EFI_PEI_PPI_DESCRIPTOR); > - > - if ((Ppi->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) =3D=3D > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) { > - // Since we are appending, need to clear out privious list termina= tor. > - Ppi->Flags &=3D ~EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST; > - break; > - } > - } > - > - // Keep everything on a good alignment > - SecReseveredMemorySize =3D ALIGN_VALUE (SecReseveredMemorySize, > CPU_STACK_ALIGNMENT); > - > -#if 0 > - // Tell the PEI Core to not use our buffer in temp RAM > - SecPpiList =3D (EFI_PEI_PPI_DESCRIPTOR *)SecCoreData- > >PeiTemporaryRamBase; > - SecCoreData->PeiTemporaryRamBase =3D (VOID *)((UINTN)SecCoreData- > >PeiTemporaryRamBase + SecReseveredMemorySize); > - SecCoreData->PeiTemporaryRamSize -=3D 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 =3D &PpiArray[0]; > - ASSERT (sizeof (PpiArray) >=3D 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 =3D (EFI_PEI_FV_HANDLE)(UINTN)SecCoreData- > >BootFirmwareVolumeBase; > - FileHandle =3D NULL; > - Status =3D PeiServicesFfsFindNextFile (EFI_FV_FILETYPE_PEI_CORE, > VolumeHandle, &FileHandle); > - ASSERT_EFI_ERROR (Status); > - > - Status =3D PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle= , > &PeCoffImage); > - ASSERT_EFI_ERROR (Status); > - > - Status =3D PeCoffLoaderGetEntryPoint (PeCoffImage, (VOID **)&EntryPoin= t); > - 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.
> +This program and the accompanying materials > +are licensed and made available under the terms and conditions of the BS= D > License > +which accompanies this distribution. The full text of the license may b= e found > at > +http://opensource.org/licenses/bsd-license.php > + > +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 =3D { > + SecTemporaryRamSupport > +}; > + > + > +EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] =3D { > + { > + 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 hijac= ked by > this > + SEC that sits on top of an OS application. So the entry and exit of th= is 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 Firmwa= re > Volume. > + In addition, it also allows the SEC phase to pass services and data fo= rward 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 Found= ation will > add > + these SEC-hosted PPIs to its PPI database such that both the PEI Found= ation > and any > + modules can leverage the associated service calls and/or code in these= early > PPIs. > + This function is required to call ProcessModuleEntryPointList() with t= he > 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 hav= e been > established. > + If ProcessModuleEntryPointList() returns, then ASSERT() and halt the s= ystem. > + > + @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 loca= tion. > + > + @param PpiList Points to a list of one or more PPI descriptors to= be > installed > + initially by the PEI core. An empty PPI list consi= sts of a single > + descriptor with the end-tag > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST. > + As part of its initialization phase, the PEI Found= ation will add > + these SEC-hosted PPIs to its PPI database such tha= t both the PEI > + Foundation and any modules can leverage the associ= ated 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 =3D PpiList; > + ProcessLibraryConstructorList (); > + > + DEBUG ((EFI_D_ERROR, "SEC Has Started\n")); > + > + // > + // Add Our PPIs to the list > + // > + SecReseveredMemorySize =3D sizeof (gPrivateDispatchTable); > + for (Ppi =3D PpiList, Index =3D 1; ; Ppi++, Index++) { > + SecReseveredMemorySize +=3D sizeof (EFI_PEI_PPI_DESCRIPTOR); > + > + if ((Ppi->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) =3D=3D > EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) { > + // Since we are appending, need to clear out privious list termina= tor. > + Ppi->Flags &=3D ~EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST; > + break; > + } > + } > + > + // Keep everything on a good alignment > + SecReseveredMemorySize =3D ALIGN_VALUE (SecReseveredMemorySize, > CPU_STACK_ALIGNMENT); > + > +#if 0 > + // Tell the PEI Core to not use our buffer in temp RAM > + SecPpiList =3D (EFI_PEI_PPI_DESCRIPTOR *)SecCoreData- > >PeiTemporaryRamBase; > + SecCoreData->PeiTemporaryRamBase =3D (VOID *)((UINTN)SecCoreData- > >PeiTemporaryRamBase + SecReseveredMemorySize); > + SecCoreData->PeiTemporaryRamSize -=3D 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 =3D &PpiArray[0]; > + ASSERT (sizeof (PpiArray) >=3D 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 =3D (EFI_PEI_FV_HANDLE)(UINTN)SecCoreData- > >BootFirmwareVolumeBase; > + FileHandle =3D NULL; > + Status =3D PeiServicesFfsFindNextFile (EFI_FV_FILETYPE_PEI_CORE, > VolumeHandle, &FileHandle); > + ASSERT_EFI_ERROR (Status); > + > + Status =3D PeiServicesFfsFindSectionData (EFI_SECTION_PE32, FileHandle= , > &PeCoffImage); > + ASSERT_EFI_ERROR (Status); > + > + Status =3D PeCoffLoaderGetEntryPoint (PeCoffImage, (VOID **)&EntryPoin= t); > + 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.
> -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BS= D > License > -which accompanies this distribution. The full text of the license may b= e found > at > -http://opensource.org/licenses/bsd-license.php > - > -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 > -#include > -#include > -#include > -#include > -#include > - > -#include > - > - > -// > -// 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.
> +This program and the accompanying materials > +are licensed and made available under the terms and conditions of the BS= D > License > +which accompanies this distribution. The full text of the license may b= e found > at > +http://opensource.org/licenses/bsd-license.php > + > +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 > +#include > +#include > +#include > +#include > +#include > + > +#include > + > + > +// > +// 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; >=20 > - UINT32 > ReceivedPackets; > - UINT32 > DroppedPackets; > + UINT32 ReceivedPackets; > + UINT32 DroppedPackets; >=20 > } EMU_SNP_PRIVATE; >=20 > @@ -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; >=20 > @@ -229,23 +229,23 @@ EmuSnpStart ( > } >=20 > // > - // 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 =3D 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 =3D 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 ( > } >=20 > // > - // Enable immediate mode. > + // Enable immediate mode. > // > Value =3D 1; > if (ioctl (Private->BpfFd, BIOCIMMEDIATE, &Value) < 0) { > @@ -286,8 +286,8 @@ EmuSnpStart ( > // > // Allocate read buffer. > // > - Private->ReadBufferSize =3D ReadBufferSize; > - Private->ReadBuffer =3D malloc (Private->ReadBufferSize); > + Private->ReadBufferSize =3D ReadBufferSize; > + Private->ReadBuffer =3D malloc (Private->ReadBufferSize); > if (Private->ReadBuffer =3D=3D NULL) { > goto ErrorExit; > } > @@ -295,7 +295,7 @@ EmuSnpStart ( > Private->CurrentReadPointer =3D Private->EndReadPointer =3D Private- > >ReadBuffer; >=20 > // > - // Install our packet filter: successful reads should only produce > broadcast or unicast > + // Install our packet filter: successful reads should only produce b= roadcast > or unicast > // packets directed to our fake MAC address. > // > FilterProgram =3D 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; >=20 > @@ -916,19 +916,19 @@ EmuSnpReceive ( > return EFI_NOT_STARTED; > } >=20 > - ZeroMem (&BpfStats, sizeof( BpfStats)); > + ZeroMem (&BpfStats, sizeof( BpfStats)); >=20 > - if (ioctl (Private->BpfFd, BIOCGSTATS, &BpfStats) =3D=3D 0) { > - Private->ReceivedPackets +=3D BpfStats.bs_recv; > - if (BpfStats.bs_drop > Private->DroppedPackets) { > - printf ( > - "SNP: STATS: RCVD =3D %d DROPPED =3D %d. Probably > need to increase BPF PcdNetworkPacketFilterSize?\n", > - BpfStats.bs_recv, > - BpfStats.bs_drop - Private->DroppedPackets > - ); > - Private->DroppedPackets =3D BpfStats.bs_drop; > - } > - } > + if (ioctl (Private->BpfFd, BIOCGSTATS, &BpfStats) =3D=3D 0) { > + Private->ReceivedPackets +=3D BpfStats.bs_recv; > + if (BpfStats.bs_drop > Private->DroppedPackets) { > + printf ( > + "SNP: STATS: RCVD =3D %d DROPPED =3D %d. Probably need to incre= ase BPF > PcdNetworkPacketFilterSize?\n", > + BpfStats.bs_recv, > + BpfStats.bs_drop - Private->DroppedPackets > + ); > + Private->DroppedPackets =3D BpfStats.bs_drop; > + } > + } >=20 > // > // 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 me= dia 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 devi= ce block > size. > @param[out] Buffer A pointer to the destination buffer for th= e data. > The > caller is responsible for either having im= plicit 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 functi= ons > - are not added. It looks like adding a element to end and not initializ= ing > - it may cause the table to be initaliized with the members at the end b= eing > - set to zero. This is bad as jumping to zero will crash. > - > -Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.
> -Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.
> -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BS= D > License > -which accompanies this distribution. The full text of the license may b= e found > at > -http://opensource.org/licenses/bsd-license.php > - > -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 > -#include > -#include > -#include > - > -#undef DebugAssert > -#endif > - > -int settimer_initialized; > -struct timeval settimer_timeval; > -void (*settimer_callback)(UINT64 delta); > - > -BOOLEAN gEmulatorInterruptEnabled =3D FALSE; > - > - > -UINTN > -SecWriteStdErr ( > - IN UINT8 *Buffer, > - IN UINTN NumberOfBytes > - ) > -{ > - ssize_t Return; > - > - Return =3D write (STDERR_FILENO, (const void *)Buffer, > (size_t)NumberOfBytes); > - > - return (Return =3D=3D -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 &=3D ~(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 =3D write (STDOUT_FILENO, (const void *)Buffer, > (size_t)NumberOfBytes); > - > - return (Return =3D=3D -1) ? 0 : Return; > -} > - > -UINTN > -SecReadStdIn ( > - IN UINT8 *Buffer, > - IN UINTN NumberOfBytes > - ) > -{ > - ssize_t Return; > - > - Return =3D read (STDIN_FILENO, Buffer, (size_t)NumberOfBytes); > - > - return (Return =3D=3D -1) ? 0 : Return; > -} > - > -BOOLEAN > -SecPollStdIn ( > - VOID > - ) > -{ > - int Result; > - int Bytes; > - > - Result =3D ioctl (STDIN_FILENO, FIONREAD, &Bytes); > - if (Result =3D=3D -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 E= FI. > - // 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 =3D ((UINT64)timeval.tv_sec * 1000) + (timeval.tv_usec / 1000) > - - ((UINT64)settimer_timeval.tv_sec * 1000) > - - (settimer_timeval.tv_usec / 1000); > - settimer_timeval =3D 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 =3D 1; > - act.sa_handler =3D settimer_handler; > - act.sa_flags =3D 0; > - sigemptyset (&act.sa_mask); > - gEmulatorInterruptEnabled =3D TRUE; > - if (sigaction (SIGALRM, &act, NULL) !=3D 0) { > - printf ("SetTimer: sigaction error %s\n", strerror (errno)); > - } > - if (gettimeofday (&settimer_timeval, NULL) !=3D 0) { > - printf ("SetTimer: gettimeofday error %s\n", strerror (errno)); > - } > - } > - timerval.it_value.tv_sec =3D DivU64x32(PeriodMs, 1000); > - DivU64x32Remainder(PeriodMs, 1000, &remainder); > - timerval.it_value.tv_usec =3D remainder * 1000; > - timerval.it_value.tv_sec =3D DivU64x32(PeriodMs, 1000); > - timerval.it_interval =3D timerval.it_value; > - > - if (setitimer (ITIMER_REAL, &timerval, NULL) !=3D 0) { > - printf ("SetTimer: setitimer error %s\n", strerror (errno)); > - } > - settimer_callback =3D CallBack; > -} > - > - > -VOID > -SecEnableInterrupt ( > - VOID > - ) > -{ > - sigset_t sigset; > - > - gEmulatorInterruptEnabled =3D TRUE; > - // Since SetTimer() uses SIGALRM we emulate turning on and off interru= pts > - // 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 interru= pts > - // by enabling/disabling SIGALRM. > - sigemptyset (&sigset); > - sigaddset (&sigset, SIGALRM); > - pthread_sigmask (SIG_BLOCK, &sigset, NULL); > - gEmulatorInterruptEnabled =3D 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 =3D mach_absolute_time (); > - > - // Convert to nanoseconds. > - > - // If this is the first time we've run, get the timebase. > - // We can use denom =3D=3D 0 to indicate that sTimebaseInfo is > - // uninitialised because it makes no sense to have a zero > - // denominator is a fraction. > - > - if ( sTimebaseInfo.denom =3D=3D 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 =3D DivU64x32 (Nanoseconds, 1000000000); > - rq.tv_nsec =3D 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 =3D start.tv_sec + rq.tv_sec; > - MicroSec =3D (start.tv_usec + rq.tv_nsec/1000); > - end.tv_usec =3D MicroSec % 1000000; > - if (MicroSec > 1000000) { > - end.tv_sec++; > - } > - > - while (nanosleep (&rq, &rm) =3D=3D -1) { > - if (errno !=3D EINTR) { > - break; > - } > - gettimeofday (&start, NULL); > - if (start.tv_sec > end.tv_sec) { > - break; > - } if ((start.tv_sec =3D=3D end.tv_sec) && (start.tv_usec > end.tv_us= ec)) { > - break; > - } > - rq =3D rm; > - } > -} > - > - > -VOID > -SecCpuSleep ( > - VOID > - ) > -{ > - struct timespec rq, rm; > - > - // nanosleep gets interrupted by the timer tic > - rq.tv_sec =3D 1; > - rq.tv_nsec =3D 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 =3D time (NULL); > - tm =3D localtime (&t); > - > - Time->Year =3D 1900 + tm->tm_year; > - Time->Month =3D tm->tm_mon + 1; > - Time->Day =3D tm->tm_mday; > - Time->Hour =3D tm->tm_hour; > - Time->Minute =3D tm->tm_min; > - Time->Second =3D tm->tm_sec; > - Time->Nanosecond =3D 0; > - Time->TimeZone =3D timezone; > - Time->Daylight =3D (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0) > - | (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0); > - > - if (Capabilities !=3D NULL) { > - Capabilities->Resolution =3D 1; > - Capabilities->Accuracy =3D 50000000; > - Capabilities->SetsToZero =3D 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 retur= n > values? > - return; > -} > - > - > -EFI_STATUS > -SecGetNextProtocol ( > - IN BOOLEAN EmuBusDriver, > - OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL > - ) > -{ > - return GetNextThunkProtocol (EmuBusDriver, Instance); > -} > - > - > -EMU_THUNK_PROTOCOL gEmuThunkProtocol =3D { > - 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 functi= ons > + are not added. It looks like adding a element to end and not initializ= ing > + it may cause the table to be initaliized with the members at the end b= eing > + set to zero. This is bad as jumping to zero will crash. > + > +Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.
> +Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.
> +This program and the accompanying materials > +are licensed and made available under the terms and conditions of the BS= D > License > +which accompanies this distribution. The full text of the license may b= e found > at > +http://opensource.org/licenses/bsd-license.php > + > +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 > +#include > +#include > +#include > + > +#undef DebugAssert > +#endif > + > +int settimer_initialized; > +struct timeval settimer_timeval; > +void (*settimer_callback)(UINT64 delta); > + > +BOOLEAN gEmulatorInterruptEnabled =3D FALSE; > + > + > +UINTN > +SecWriteStdErr ( > + IN UINT8 *Buffer, > + IN UINTN NumberOfBytes > + ) > +{ > + ssize_t Return; > + > + Return =3D write (STDERR_FILENO, (const void *)Buffer, > (size_t)NumberOfBytes); > + > + return (Return =3D=3D -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 &=3D ~(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 =3D write (STDOUT_FILENO, (const void *)Buffer, > (size_t)NumberOfBytes); > + > + return (Return =3D=3D -1) ? 0 : Return; > +} > + > +UINTN > +SecReadStdIn ( > + IN UINT8 *Buffer, > + IN UINTN NumberOfBytes > + ) > +{ > + ssize_t Return; > + > + Return =3D read (STDIN_FILENO, Buffer, (size_t)NumberOfBytes); > + > + return (Return =3D=3D -1) ? 0 : Return; > +} > + > +BOOLEAN > +SecPollStdIn ( > + VOID > + ) > +{ > + int Result; > + int Bytes; > + > + Result =3D ioctl (STDIN_FILENO, FIONREAD, &Bytes); > + if (Result =3D=3D -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 E= FI. > + // 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 =3D ((UINT64)timeval.tv_sec * 1000) + (timeval.tv_usec / 1000) > + - ((UINT64)settimer_timeval.tv_sec * 1000) > + - (settimer_timeval.tv_usec / 1000); > + settimer_timeval =3D 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 =3D 1; > + act.sa_handler =3D settimer_handler; > + act.sa_flags =3D 0; > + sigemptyset (&act.sa_mask); > + gEmulatorInterruptEnabled =3D TRUE; > + if (sigaction (SIGALRM, &act, NULL) !=3D 0) { > + printf ("SetTimer: sigaction error %s\n", strerror (errno)); > + } > + if (gettimeofday (&settimer_timeval, NULL) !=3D 0) { > + printf ("SetTimer: gettimeofday error %s\n", strerror (errno)); > + } > + } > + timerval.it_value.tv_sec =3D DivU64x32(PeriodMs, 1000); > + DivU64x32Remainder(PeriodMs, 1000, &remainder); > + timerval.it_value.tv_usec =3D remainder * 1000; > + timerval.it_value.tv_sec =3D DivU64x32(PeriodMs, 1000); > + timerval.it_interval =3D timerval.it_value; > + > + if (setitimer (ITIMER_REAL, &timerval, NULL) !=3D 0) { > + printf ("SetTimer: setitimer error %s\n", strerror (errno)); > + } > + settimer_callback =3D CallBack; > +} > + > + > +VOID > +SecEnableInterrupt ( > + VOID > + ) > +{ > + sigset_t sigset; > + > + gEmulatorInterruptEnabled =3D TRUE; > + // Since SetTimer() uses SIGALRM we emulate turning on and off interru= pts > + // 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 interru= pts > + // by enabling/disabling SIGALRM. > + sigemptyset (&sigset); > + sigaddset (&sigset, SIGALRM); > + pthread_sigmask (SIG_BLOCK, &sigset, NULL); > + gEmulatorInterruptEnabled =3D 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 =3D mach_absolute_time (); > + > + // Convert to nanoseconds. > + > + // If this is the first time we've run, get the timebase. > + // We can use denom =3D=3D 0 to indicate that sTimebaseInfo is > + // uninitialised because it makes no sense to have a zero > + // denominator is a fraction. > + > + if ( sTimebaseInfo.denom =3D=3D 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 =3D DivU64x32 (Nanoseconds, 1000000000); > + rq.tv_nsec =3D 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 =3D start.tv_sec + rq.tv_sec; > + MicroSec =3D (start.tv_usec + rq.tv_nsec/1000); > + end.tv_usec =3D MicroSec % 1000000; > + if (MicroSec > 1000000) { > + end.tv_sec++; > + } > + > + while (nanosleep (&rq, &rm) =3D=3D -1) { > + if (errno !=3D EINTR) { > + break; > + } > + gettimeofday (&start, NULL); > + if (start.tv_sec > end.tv_sec) { > + break; > + } if ((start.tv_sec =3D=3D end.tv_sec) && (start.tv_usec > end.tv_us= ec)) { > + break; > + } > + rq =3D rm; > + } > +} > + > + > +VOID > +SecCpuSleep ( > + VOID > + ) > +{ > + struct timespec rq, rm; > + > + // nanosleep gets interrupted by the timer tic > + rq.tv_sec =3D 1; > + rq.tv_nsec =3D 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 =3D time (NULL); > + tm =3D localtime (&t); > + > + Time->Year =3D 1900 + tm->tm_year; > + Time->Month =3D tm->tm_mon + 1; > + Time->Day =3D tm->tm_mday; > + Time->Hour =3D tm->tm_hour; > + Time->Minute =3D tm->tm_min; > + Time->Second =3D tm->tm_sec; > + Time->Nanosecond =3D 0; > + Time->TimeZone =3D timezone; > + Time->Daylight =3D (daylight ? EFI_TIME_ADJUST_DAYLIGHT : 0) > + | (tm->tm_isdst > 0 ? EFI_TIME_IN_DAYLIGHT : 0); > + > + if (Capabilities !=3D NULL) { > + Capabilities->Resolution =3D 1; > + Capabilities->Accuracy =3D 50000000; > + Capabilities->SetsToZero =3D 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 retur= n > values? > + return; > +} > + > + > +EFI_STATUS > +SecGetNextProtocol ( > + IN BOOLEAN EmuBusDriver, > + OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL > + ) > +{ > + return GetNextThunkProtocol (EmuBusDriver, Instance); > +} > + > + > +EMU_THUNK_PROTOCOL gEmuThunkProtocol =3D { > + 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 ( >=20 > if (ImageContext->PdbPointer !=3D NULL && !IsPdbFile (ImageContext- > >PdbPointer)) { > FILE *GdbTempFile; > - if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) { > + if (FeaturePcdGet (PcdEmulatorLazyLoadSymbols)) { > GdbTempFile =3D fopen (gGdbWorkingFileName, "a"); > if (GdbTempFile !=3D NULL) { > long unsigned int SymbolsAddr =3D (long unsigned int)(ImageConte= xt- > >ImageAddress + ImageContext->SizeOfHeaders); > @@ -1170,13 +1170,13 @@ GdbScriptAddImage ( > GdbTempFile =3D fopen (gGdbWorkingFileName, "w"); > if (GdbTempFile !=3D 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 gGdbWorkingFi= leName > to set a breakpoint. > // Hey what can you say scripting in gdb is not that great.... > @@ -1225,7 +1225,7 @@ GdbScriptRemoveImage ( > return; > } >=20 > - 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); > - } > + } > } > } >=20 > 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 >=20 > #include > #include > 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 s= tack. > -# For Linux this stack adjustment is a no-op, but we may as well make th= e > -# the code common. > -# > -# Copyright (c) 2008 - 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. > -# > -#-----------------------------------------------------------------------= ------- > - > - > - > - .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 s= tack. > +# For Linux this stack adjustment is a no-op, but we may as well make th= e > +# the code common. > +# > +# Copyright (c) 2008 - 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. > +# > +#-----------------------------------------------------------------------= ------- > + > + > + > + .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.
> -Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
> -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BS= D > License > -which accompanies this distribution. The full text of the license may b= e found > at > -http://opensource.org/licenses/bsd-license.php > - > -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 ne= w stack > - specified by NewStack and passing in the parameters specified by Conte= xt1 > and > - Context2. Context1 and Context2 are optional and may be NULL. The func= tion > - 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 EntryPoi= nt > - function. > - @param Context2 A pointer to the context to pass into the EntryPoi= nt > - function. > - @param NewStack A pointer to the new stack to use for the EntryPoi= nt > - 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 !=3D NULL); > - ASSERT (NewStack !=3D NULL); > - > - // > - // Stack should be aligned with CPU_STACK_ALIGNMENT > - // > - ASSERT (((UINTN)NewStack & (CPU_STACK_ALIGNMENT - 1)) =3D=3D 0); > - > - JumpBuffer.Eip =3D (UINTN)EntryPoint; > - JumpBuffer.Esp =3D (UINTN)NewStack - sizeof (VOID*); > - JumpBuffer.Esp -=3D sizeof (Context1) + sizeof (Context2); > - ((VOID**)JumpBuffer.Esp)[1] =3D Context1; > - ((VOID**)JumpBuffer.Esp)[2] =3D Context2; > - > - LongJump (&JumpBuffer, (UINTN)-1); > - > - > - // > - // PeiSwitchStacks () will never return > - // > - ASSERT (FALSE); > -} > - > - > - > +/*++ > + > +Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
> +Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.
> +This program and the accompanying materials > +are licensed and made available under the terms and conditions of the BS= D > License > +which accompanies this distribution. The full text of the license may b= e found > at > +http://opensource.org/licenses/bsd-license.php > + > +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 ne= w stack > + specified by NewStack and passing in the parameters specified by Conte= xt1 > 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 EntryPoi= nt > + function. > + @param Context2 A pointer to the context to pass into the EntryPoi= nt > + function. > + @param NewStack A pointer to the new stack to use for the EntryPoi= nt > + 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 !=3D NULL); > + ASSERT (NewStack !=3D NULL); > + > + // > + // Stack should be aligned with CPU_STACK_ALIGNMENT > + // > + ASSERT (((UINTN)NewStack & (CPU_STACK_ALIGNMENT - 1)) =3D=3D 0); > + > + JumpBuffer.Eip =3D (UINTN)EntryPoint; > + JumpBuffer.Esp =3D (UINTN)NewStack - sizeof (VOID*); > + JumpBuffer.Esp -=3D sizeof (Context1) + sizeof (Context2); > + ((VOID**)JumpBuffer.Esp)[1] =3D Context1; > + ((VOID**)JumpBuffer.Esp)[2] =3D 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.
> - > - 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 > - > -/** > - 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 requ= est, > 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 rem= aining 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 =3D AllocatePool (AllocationSize); > - if (Buffer =3D=3D 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 Ol= dSize > and > - NewSize bytes are copied from OldBuffer to the newly allocated buffer,= and > - OldBuffer is freed. A pointer to the newly allocated buffer is return= ed. > - 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 N= ewSize > 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. Th= is 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 =3D AllocatePool (NewSize); > - if (NewBuffer =3D=3D NULL) { > - return NULL; > - } > - > - if (OldBuffer !=3D NULL) { > - if (OldSize > 0) { > - CopyMem (NewBuffer, OldBuffer, OldSize); > - } > - > - FreePool (OldBuffer); > - } > - > - return NewBuffer; > -} > - > - > -/** > - Frees a buffer that was previously allocated with one of the pool allo= cation > 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 n= ot possible > to free pool > - resources, then this function will perform no actions. > - > - If Buffer was not allocated with a pool allocation function in the Mem= ory > 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.
> + > + 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 > + > +/** > + 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 requ= est, > 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 rem= aining > 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 =3D AllocatePool (AllocationSize); > + if (Buffer =3D=3D 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 Ol= dSize > and > + NewSize bytes are copied from OldBuffer to the newly allocated buffer,= and > + OldBuffer is freed. A pointer to the newly allocated buffer is return= ed. > + 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 N= ewSize > 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. Th= is 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 =3D AllocatePool (NewSize); > + if (NewBuffer =3D=3D NULL) { > + return NULL; > + } > + > + if (OldBuffer !=3D NULL) { > + if (OldSize > 0) { > + CopyMem (NewBuffer, OldBuffer, OldSize); > + } > + > + FreePool (OldBuffer); > + } > + > + return NewBuffer; > +} > + > + > +/** > + Frees a buffer that was previously allocated with one of the pool allo= cation > 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 n= ot possible > to free pool > + resources, then this function will perform no actions. > + > + If Buffer was not allocated with a pool allocation function in the Mem= ory > 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 BS= D > License > -which accompanies this distribution. The full text of the license may b= e found > at > -http://opensource.org/licenses/bsd-license.php > - > -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 =3D { > - EFI_FILE_REVISION, > - GasketPosixFileOpen, > - GasketPosixFileCLose, > - GasketPosixFileDelete, > - GasketPosixFileRead, > - GasketPosixFileWrite, > - GasketPosixFileGetPossition, > - GasketPosixFileSetPossition, > - GasketPosixFileGetInfo, > - GasketPosixFileSetInfo, > - GasketPosixFileFlush > -}; > - > -EFI_SIMPLE_FILE_SYSTEM_PROTOCOL gPosixFileSystemProtocol =3D { > - 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 sys= tem. > - @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 =3D EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (This); > - > - Status =3D EFI_OUT_OF_RESOURCES; > - PrivateFile =3D malloc (sizeof (EMU_EFI_FILE_PRIVATE)); > - if (PrivateFile =3D=3D NULL) { > - goto Done; > - } > - > - PrivateFile->FileName =3D malloc (AsciiStrSize (Private->FilePath)); > - if (PrivateFile->FileName =3D=3D NULL) { > - goto Done; > - } > - AsciiStrCpy (PrivateFile->FileName, Private->FilePath); > - > - PrivateFile->Signature =3D EMU_EFI_FILE_PRIVATE_SIGNATURE; > - PrivateFile->Thunk =3D Private->Thunk; > - PrivateFile->SimpleFileSystem =3D This; > - PrivateFile->IsRootDirectory =3D TRUE; > - PrivateFile->IsDirectoryPath =3D TRUE; > - PrivateFile->IsOpenedByRead =3D TRUE; > - > - CopyMem (&PrivateFile->EfiFile, &gPosixFileProtocol, sizeof > (EFI_FILE_PROTOCOL)); > - > - PrivateFile->fd =3D -1; > - PrivateFile->Dir =3D NULL; > - PrivateFile->Dirent =3D NULL; > - > - *Root =3D &PrivateFile->EfiFile; > - > - PrivateFile->Dir =3D opendir (PrivateFile->FileName); > - if (PrivateFile->Dir =3D=3D NULL) { > - Status =3D EFI_ACCESS_DENIED; > - } else { > - Status =3D EFI_SUCCESS; > - } > - > -Done: > - if (EFI_ERROR (Status)) { > - if (PrivateFile !=3D NULL) { > - if (PrivateFile->FileName !=3D NULL) { > - free (PrivateFile->FileName); > - } > - > - free (PrivateFile); > - } > - > - *Root =3D 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 =3D Str; *(Pointer + Count); Pointer++) { > - *Pointer =3D *(Pointer + Count); > - } > - > - *Pointer =3D *(Pointer + Count); > -} > - > - > -VOID > -PosixSystemTimeToEfiTime ( > - IN time_t SystemTime, > - OUT EFI_TIME *Time > - ) > -{ > - struct tm *tm; > - > - tm =3D gmtime (&SystemTime); > - Time->Year =3D tm->tm_year; > - Time->Month =3D tm->tm_mon + 1; > - Time->Day =3D tm->tm_mday; > - Time->Hour =3D tm->tm_hour; > - Time->Minute =3D tm->tm_min; > - Time->Second =3D tm->tm_sec; > - Time->Nanosecond =3D 0; > - > - Time->TimeZone =3D timezone; > - Time->Daylight =3D (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 !=3D NULL) { > - RealFileName =3D FileName; > - } else if (PrivateFile->IsRootDirectory) { > - RealFileName =3D ""; > - } else { > - RealFileName =3D PrivateFile->FileName; > - } > - > - TempPointer =3D RealFileName; > - while (*TempPointer) { > - if (*TempPointer =3D=3D '/') { > - RealFileName =3D TempPointer + 1; > - } > - > - TempPointer++; > - } > - > - Size =3D SIZE_OF_EFI_FILE_INFO; > - NameSize =3D AsciiStrSize (RealFileName) * 2; > - ResultSize =3D Size + NameSize; > - > - if (*BufferSize < ResultSize) { > - *BufferSize =3D ResultSize; > - return EFI_BUFFER_TOO_SMALL; > - } > - if (stat (FileName =3D=3D NULL ? PrivateFile->FileName : FileName, &bu= f) < 0) { > - return EFI_DEVICE_ERROR; > - } > - > - Status =3D EFI_SUCCESS; > - > - Info =3D Buffer; > - ZeroMem (Info, ResultSize); > - > - Info->Size =3D ResultSize; > - Info->FileSize =3D buf.st_size; > - Info->PhysicalSize =3D 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 |=3D EFI_FILE_READ_ONLY; > - } > - > - if (S_ISDIR(buf.st_mode)) { > - Info->Attribute |=3D EFI_FILE_DIRECTORY; > - } > - > - > - BufferFileName =3D (CHAR16 *)((CHAR8 *) Buffer + Size); > - while (*RealFileName) { > - *BufferFileName++ =3D *RealFileName++; > - } > - *BufferFileName =3D 0; > - > - *BufferSize =3D ResultSize; > - return Status; > -} > - > -BOOLEAN > -IsZero ( > - IN VOID *Buffer, > - IN UINTN Length > - ) > -{ > - if (Buffer =3D=3D NULL || Length =3D=3D 0) { > - return FALSE; > - } > - > - if (*(UINT8 *) Buffer !=3D 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 supp= orted. > - @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 =3D EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This); > - PrivateRoot =3D EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS > (PrivateFile->SimpleFileSystem); > - NewPrivateFile =3D NULL; > - Status =3D EFI_OUT_OF_RESOURCES; > - > - // > - // BUGBUG: assume an open of root > - // if current location, return current data > - // > - TrailingDash =3D FALSE; > - if ((StrCmp (FileName, L"\\") =3D=3D 0) || > - (StrCmp (FileName, L".") =3D=3D 0 && PrivateFile->IsRootDirectory)= ) { > -OpenRoot: > - Status =3D PosixOpenVolume (PrivateFile->SimpleFileSystem, = &Root); > - NewPrivateFile =3D EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (Root); > - goto Done; > - } > - > - if (FileName[StrLen (FileName) - 1] =3D=3D L'\\') { > - TrailingDash =3D TRUE; > - FileName[StrLen (FileName) - 1] =3D 0; > - } > - > - // > - // Attempt to open the file > - // > - NewPrivateFile =3D malloc (sizeof (EMU_EFI_FILE_PRIVATE)); > - if (NewPrivateFile =3D=3D NULL) { > - goto Done; > - } > - > - CopyMem (NewPrivateFile, PrivateFile, sizeof (EMU_EFI_FILE_PRIVATE)); > - > - NewPrivateFile->FileName =3D malloc (AsciiStrSize (PrivateFile->FileNa= me) + 1 > + StrLen (FileName) + 1); > - if (NewPrivateFile->FileName =3D=3D NULL) { > - goto Done; > - } > - > - if (*FileName =3D=3D L'\\') { > - AsciiStrCpy (NewPrivateFile->FileName, PrivateRoot->FilePath); > - // Skip first '\'. > - Src =3D FileName + 1; > - } else { > - AsciiStrCpy (NewPrivateFile->FileName, PrivateFile->FileName); > - Src =3D FileName; > - } > - Dst =3D NewPrivateFile->FileName + AsciiStrLen (NewPrivateFile->FileNa= me); > - GuardPointer =3D NewPrivateFile->FileName + AsciiStrLen (PrivateRoot- > >FilePath); > - *Dst++ =3D '/'; > - // Convert unicode to ascii and '\' to '/' > - while (*Src) { > - if (*Src =3D=3D '\\') { > - *Dst++ =3D '/'; > - } else { > - *Dst++ =3D *Src; > - } > - Src++; > - } > - *Dst =3D 0; > - > - > - // > - // Get rid of . and .., except leading . or .. > - // > - > - // > - // GuardPointer protect simplefilesystem root path not be destroyed > - // > - > - LoopFinish =3D FALSE; > - while (!LoopFinish) { > - LoopFinish =3D TRUE; > - > - for (ParseFileName =3D GuardPointer; *ParseFileName; ParseFileName++= ) { > - if (*ParseFileName =3D=3D '.' && > - (*(ParseFileName + 1) =3D=3D 0 || *(ParseFileName + 1) =3D=3D = '/') && > - *(ParseFileName - 1) =3D=3D '/' > - ) { > - > - // > - // cut /. > - // > - CutPrefix (ParseFileName - 1, 2); > - LoopFinish =3D FALSE; > - break; > - } > - > - if (*ParseFileName =3D=3D '.' && > - *(ParseFileName + 1) =3D=3D '.' && > - (*(ParseFileName + 2) =3D=3D 0 || *(ParseFileName + 2) =3D=3D = '/') && > - *(ParseFileName - 1) =3D=3D '/' > - ) { > - > - ParseFileName--; > - Count =3D 3; > - > - while (ParseFileName !=3D GuardPointer) { > - ParseFileName--; > - Count++; > - if (*ParseFileName =3D=3D '/') { > - break; > - } > - } > - > - // > - // cut /.. and its left directory > - // > - CutPrefix (ParseFileName, Count); > - LoopFinish =3D FALSE; > - break; > - } > - } > - } > - > - if (AsciiStrCmp (NewPrivateFile->FileName, PrivateRoot->FilePath) =3D= =3D 0) { > - NewPrivateFile->IsRootDirectory =3D TRUE; > - free (NewPrivateFile->FileName); > - free (NewPrivateFile); > - goto OpenRoot; > - } > - > - RealFileName =3D NewPrivateFile->FileName + AsciiStrLen(NewPrivateFile= - > >FileName) - 1; > - while (RealFileName > NewPrivateFile->FileName && *RealFileName !=3D '= /') { > - RealFileName--; > - } > - > - TempChar =3D *(RealFileName - 1); > - *(RealFileName - 1) =3D 0; > - *(RealFileName - 1) =3D TempChar; > - > - > - // > - // Test whether file or directory > - // > - NewPrivateFile->IsRootDirectory =3D FALSE; > - NewPrivateFile->fd =3D -1; > - NewPrivateFile->Dir =3D NULL; > - if (OpenMode & EFI_FILE_MODE_CREATE) { > - if (Attributes & EFI_FILE_DIRECTORY) { > - NewPrivateFile->IsDirectoryPath =3D TRUE; > - } else { > - NewPrivateFile->IsDirectoryPath =3D FALSE; > - } > - } else { > - res =3D stat (NewPrivateFile->FileName, &finfo); > - if (res =3D=3D 0 && S_ISDIR(finfo.st_mode)) { > - NewPrivateFile->IsDirectoryPath =3D TRUE; > - } else { > - NewPrivateFile->IsDirectoryPath =3D FALSE; > - } > - } > - > - if (OpenMode & EFI_FILE_MODE_WRITE) { > - NewPrivateFile->IsOpenedByRead =3D FALSE; > - } else { > - NewPrivateFile->IsOpenedByRead =3D TRUE; > - } > - > - Status =3D EFI_SUCCESS; > - > - // > - // deal with directory > - // > - if (NewPrivateFile->IsDirectoryPath) { > - if ((OpenMode & EFI_FILE_MODE_CREATE)) { > - // > - // Create a directory > - // > - if (mkdir (NewPrivateFile->FileName, 0777) !=3D 0) { > - if (errno !=3D EEXIST) { > - //free (TempFileName); > - Status =3D EFI_ACCESS_DENIED; > - goto Done; > - } > - } > - } > - > - NewPrivateFile->Dir =3D opendir (NewPrivateFile->FileName); > - if (NewPrivateFile->Dir =3D=3D NULL) { > - if (errno =3D=3D EACCES) { > - Status =3D EFI_ACCESS_DENIED; > - } else { > - Status =3D EFI_NOT_FOUND; > - } > - > - goto Done; > - } > - > - } else { > - // > - // deal with file > - // > - NewPrivateFile->fd =3D open ( > - NewPrivateFile->FileName, > - ((OpenMode & EFI_FILE_MODE_CREATE) ? O_CREAT := 0) | > (NewPrivateFile->IsOpenedByRead ? O_RDONLY : O_RDWR), > - 0666 > - ); > - if (NewPrivateFile->fd < 0) { > - if (errno =3D=3D ENOENT) { > - Status =3D EFI_NOT_FOUND; > - } else { > - Status =3D EFI_ACCESS_DENIED; > - } > - } > - } > - > - if ((OpenMode & EFI_FILE_MODE_CREATE) && Status =3D=3D EFI_SUCCESS) { > - // > - // Set the attribute > - // > - InfoSize =3D 0; > - Info =3D NULL; > - Status =3D PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileI= nfoGuid, > &InfoSize, Info); > - if (Status !=3D EFI_BUFFER_TOO_SMALL) { > - Status =3D EFI_DEVICE_ERROR; > - goto Done; > - } > - > - Info =3D malloc (InfoSize); > - if (Info =3D=3D NULL) { > - goto Done; > - } > - > - Status =3D PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfo= Guid, > &InfoSize, Info); > - if (EFI_ERROR (Status)) { > - goto Done; > - } > - > - Info->Attribute =3D Attributes; > - PosixFileSetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, InfoS= ize, Info); > - > - free (Info); > - } > - > -Done: ; > - if (TrailingDash) { > - FileName[StrLen (FileName) + 1] =3D 0; > - FileName[StrLen (FileName)] =3D L'\\'; > - } > - > - if (EFI_ERROR (Status)) { > - if (NewPrivateFile) { > - if (NewPrivateFile->FileName) { > - free (NewPrivateFile->FileName); > - } > - > - free (NewPrivateFile); > - } > - } else { > - *NewHandle =3D &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 =3D EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This); > - > - if (PrivateFile->fd >=3D 0) { > - close (PrivateFile->fd); > - } > - if (PrivateFile->Dir !=3D NULL) { > - closedir (PrivateFile->Dir); > - } > - > - PrivateFile->fd =3D -1; > - PrivateFile->Dir =3D 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 wa= s > not deleted. > - > -**/ > -EFI_STATUS > -PosixFileDelete ( > - IN EFI_FILE_PROTOCOL *This > - ) > -{ > - EFI_STATUS Status; > - EMU_EFI_FILE_PRIVATE *PrivateFile; > - > - PrivateFile =3D EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This); > - Status =3D EFI_WARN_DELETE_FAILURE; > - > - if (PrivateFile->IsDirectoryPath) { > - if (PrivateFile->Dir !=3D NULL) { > - closedir (PrivateFile->Dir); > - PrivateFile->Dir =3D NULL; > - } > - > - if (rmdir (PrivateFile->FileName) =3D=3D 0) { > - Status =3D EFI_SUCCESS; > - } > - } else { > - close (PrivateFile->fd); > - PrivateFile->fd =3D -1; > - > - if (!PrivateFile->IsOpenedByRead) { > - if (!unlink (PrivateFile->FileName)) { > - Status =3D 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 i= n > 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 conta= ins > 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 =3D EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This); > - > - if (!PrivateFile->IsDirectoryPath) { > - if (PrivateFile->fd < 0) { > - Status =3D EFI_DEVICE_ERROR; > - goto Done; > - } > - > - Res =3D read (PrivateFile->fd, Buffer, *BufferSize); > - if (Res < 0) { > - Status =3D EFI_DEVICE_ERROR; > - goto Done; > - } > - *BufferSize =3D Res; > - Status =3D EFI_SUCCESS; > - goto Done; > - } > - > - // > - // Read on a directory. > - // > - if (PrivateFile->Dir =3D=3D NULL) { > - Status =3D EFI_DEVICE_ERROR; > - goto Done; > - } > - > - if (PrivateFile->Dirent =3D=3D NULL) { > - PrivateFile->Dirent =3D readdir (PrivateFile->Dir); > - if (PrivateFile->Dirent =3D=3D NULL) { > - *BufferSize =3D 0; > - Status =3D EFI_SUCCESS; > - goto Done; > - } > - } > - > - Size =3D SIZE_OF_EFI_FILE_INFO; > - NameSize =3D AsciiStrLen (PrivateFile->Dirent->d_name) + 1; > - ResultSize =3D Size + 2 * NameSize; > - > - if (*BufferSize < ResultSize) { > - *BufferSize =3D ResultSize; > - Status =3D EFI_BUFFER_TOO_SMALL; > - goto Done; > - } > - Status =3D EFI_SUCCESS; > - > - *BufferSize =3D ResultSize; > - > - FullFileName =3D malloc (AsciiStrLen(PrivateFile->FileName) + 1 + Name= Size); > - if (FullFileName =3D=3D NULL) { > - Status =3D EFI_OUT_OF_RESOURCES; > - goto Done; > - } > - > - AsciiStrCpy (FullFileName, PrivateFile->FileName); > - AsciiStrCat (FullFileName, "/"); > - AsciiStrCat (FullFileName, PrivateFile->Dirent->d_name); > - Status =3D UnixSimpleFileSystemFileInfo ( > - PrivateFile, > - FullFileName, > - BufferSize, > - Buffer > - ); > - free (FullFileName); > - > - PrivateFile->Dirent =3D 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 i= n > 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 supporte= d. > - @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 =3D 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 =3D write (PrivateFile->fd, Buffer, *BufferSize); > - if (Res =3D=3D (UINTN)-1) { > - return ErrnoToEfiStatus (); > - } > - > - *BufferSize =3D 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 =3D EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This); > - > - if (PrivateFile->IsDirectoryPath) { > - if (Position !=3D 0) { > - return EFI_UNSUPPORTED; > - } > - > - if (PrivateFile->Dir =3D=3D NULL) { > - return EFI_DEVICE_ERROR; > - } > - rewinddir (PrivateFile->Dir); > - return EFI_SUCCESS; > - } else { > - if (Position =3D=3D (UINT64) -1) { > - Pos =3D lseek (PrivateFile->fd, 0, SEEK_END); > - } else { > - Pos =3D lseek (PrivateFile->fd, Position, SEEK_SET); > - } > - if (Pos =3D=3D (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 =3D EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This); > - > - if (PrivateFile->IsDirectoryPath) { > - Status =3D EFI_UNSUPPORTED; > - } else { > - *Position =3D (UINT64)lseek (PrivateFile->fd, 0, SEEK_CUR); > - Status =3D (*Position =3D=3D (UINT64) -1) ? ErrnoToEfiStatus () : EF= I_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 d= ata 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 =3D EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This); > - PrivateRoot =3D EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS > (PrivateFile->SimpleFileSystem); > - > - Status =3D EFI_SUCCESS; > - if (CompareGuid (InformationType, &gEfiFileInfoGuid)) { > - Status =3D UnixSimpleFileSystemFileInfo (PrivateFile, NULL, BufferSi= ze, Buffer); > - } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) { > - if (*BufferSize < SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoo= t- > >VolumeLabel)) { > - *BufferSize =3D SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoo= t- > >VolumeLabel); > - return EFI_BUFFER_TOO_SMALL; > - } > - > - UnixStatus =3D statfs (PrivateFile->FileName, &buf); > - if (UnixStatus < 0) { > - return EFI_DEVICE_ERROR; > - } > - > - FileSystemInfoBuffer =3D (EFI_FILE_SYSTEM_INFO *) Buffer; > - FileSystemInfoBuffer->Size =3D SIZE_OF_EFI_FILE_SYSTEM_INFO + S= trSize > (PrivateRoot->VolumeLabel); > - FileSystemInfoBuffer->ReadOnly =3D FALSE; > - > - // > - // Succeeded > - // > - FileSystemInfoBuffer->VolumeSize =3D MultU64x32 (buf.f_blocks, buf.= f_bsize); > - FileSystemInfoBuffer->FreeSpace =3D MultU64x32 (buf.f_bavail, buf.= f_bsize); > - FileSystemInfoBuffer->BlockSize =3D buf.f_bsize; > - > - > - StrCpy ((CHAR16 *) FileSystemInfoBuffer->VolumeLabel, PrivateRoot- > >VolumeLabel); > - *BufferSize =3D SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot- > >VolumeLabel); > - > - } else if (CompareGuid (InformationType, > &gEfiFileSystemVolumeLabelInfoIdGuid)) { > - if (*BufferSize < StrSize (PrivateRoot->VolumeLabel)) { > - *BufferSize =3D StrSize (PrivateRoot->VolumeLabel); > - return EFI_BUFFER_TOO_SMALL; > - } > - > - StrCpy ((CHAR16 *) Buffer, PrivateRoot->VolumeLabel); > - *BufferSize =3D 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 =3D EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This); > - PrivateRoot =3D EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS > (PrivateFile->SimpleFileSystem); > - errno =3D 0; > - Status =3D EFI_UNSUPPORTED; > - OldFileInfo =3D NewFileInfo =3D NULL; > - OldFileName =3D NewFileName =3D NULL; > - AttrChangeFlag =3D NameChangeFlag =3D SizeChangeFlag =3D TimeChangeFla= g =3D > FALSE; > - > - // > - // Set file system information. > - // > - if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) { > - if (BufferSize < (SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoo= t- > >VolumeLabel))) { > - Status =3D EFI_BAD_BUFFER_SIZE; > - goto Done; > - } > - > - NewFileSystemInfo =3D (EFI_FILE_SYSTEM_INFO *) Buffer; > - > - free (PrivateRoot->VolumeLabel); > - > - PrivateRoot->VolumeLabel =3D malloc (StrSize (NewFileSystemInfo- > >VolumeLabel)); > - if (PrivateRoot->VolumeLabel =3D=3D NULL) { > - goto Done; > - } > - > - StrCpy (PrivateRoot->VolumeLabel, NewFileSystemInfo->VolumeLabel); > - > - Status =3D EFI_SUCCESS; > - goto Done; > - } > - > - // > - // Set volume label information. > - // > - if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid= )) > { > - if (BufferSize < StrSize (PrivateRoot->VolumeLabel)) { > - Status =3D EFI_BAD_BUFFER_SIZE; > - goto Done; > - } > - > - StrCpy (PrivateRoot->VolumeLabel, (CHAR16 *) Buffer); > - > - Status =3D EFI_SUCCESS; > - goto Done; > - } > - > - if (!CompareGuid (InformationType, &gEfiFileInfoGuid)) { > - Status =3D EFI_UNSUPPORTED; > - goto Done; > - } > - > - if (BufferSize < SIZE_OF_EFI_FILE_INFO) { > - Status =3D EFI_BAD_BUFFER_SIZE; > - goto Done; > - } > - > - // > - // Set file/directory information. > - // > - > - // > - // Check for invalid set file information parameters. > - // > - NewFileInfo =3D (EFI_FILE_INFO *) Buffer; > - if (NewFileInfo->Size <=3D sizeof (EFI_FILE_INFO) || > - (NewFileInfo->Attribute &~(EFI_FILE_VALID_ATTR)) || > - (sizeof (UINTN) =3D=3D 4 && NewFileInfo->Size > 0xFFFFFFFF) > - ) { > - Status =3D EFI_INVALID_PARAMETER; > - goto Done; > - } > - > - // > - // Get current file information so we can determine what kind > - // of change request this is. > - // > - OldInfoSize =3D 0; > - Status =3D UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSi= ze, NULL); > - if (Status !=3D EFI_BUFFER_TOO_SMALL) { > - Status =3D EFI_DEVICE_ERROR; > - goto Done; > - } > - > - OldFileInfo =3D malloc (OldInfoSize); > - if (OldFileInfo =3D=3D NULL) { > - goto Done; > - } > - > - Status =3D UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSi= ze, > OldFileInfo); > - if (EFI_ERROR (Status)) { > - goto Done; > - } > - > - OldFileName =3D malloc (AsciiStrSize (PrivateFile->FileName)); > - if (OldFileInfo =3D=3D NULL) { > - goto Done; > - } > - > - AsciiStrCpy (OldFileName, PrivateFile->FileName); > - > - // > - // Make full pathname from new filename and rootpath. > - // > - if (NewFileInfo->FileName[0] =3D=3D '\\') { > - NewFileName =3D malloc (AsciiStrLen (PrivateRoot->FilePath) + 1 + St= rLen > (NewFileInfo->FileName) + 1); > - if (NewFileName =3D=3D NULL) { > - goto Done; > - } > - > - AsciiStrCpy (NewFileName, PrivateRoot->FilePath); > - AsciiFilePtr =3D NewFileName + AsciiStrLen(NewFileName); > - UnicodeFilePtr =3D NewFileInfo->FileName + 1; > - *AsciiFilePtr++ =3D'/'; > - } else { > - NewFileName =3D malloc (AsciiStrLen (PrivateFile->FileName) + 2 + St= rLen > (NewFileInfo->FileName) + 1); > - if (NewFileName =3D=3D NULL) { > - goto Done; > - } > - > - AsciiStrCpy (NewFileName, PrivateRoot->FilePath); > - AsciiFilePtr =3D NewFileName + AsciiStrLen(NewFileName); > - if ((AsciiFilePtr[-1] !=3D '/') && (NewFileInfo->FileName[0] !=3D '/= ')) { > - // make sure there is a / between Root FilePath and NewFileInfo Fi= lename > - AsciiFilePtr[0] =3D '/'; > - AsciiFilePtr[1] =3D '\0'; > - AsciiFilePtr++; > - } > - UnicodeFilePtr =3D NewFileInfo->FileName; > - } > - // Convert to ascii. > - while (*UnicodeFilePtr) { > - *AsciiFilePtr++ =3D *UnicodeFilePtr++; > - } > - *AsciiFilePtr =3D 0; > - > - // > - // Is there an attribute change request? > - // > - if (NewFileInfo->Attribute !=3D OldFileInfo->Attribute) { > - if ((NewFileInfo->Attribute & EFI_FILE_DIRECTORY) !=3D (OldFileInfo- > >Attribute & EFI_FILE_DIRECTORY)) { > - Status =3D EFI_INVALID_PARAMETER; > - goto Done; > - } > - > - AttrChangeFlag =3D TRUE; > - } > - > - // > - // Is there a name change request? > - // bugbug: - Should really use EFI_UNICODE_COLLATION_PROTOCOL > - // > - if (StrCmp (NewFileInfo->FileName, OldFileInfo->FileName)) { > - NameChangeFlag =3D TRUE; > - } > - > - // > - // Is there a size change request? > - // > - if (NewFileInfo->FileSize !=3D OldFileInfo->FileSize) { > - SizeChangeFlag =3D TRUE; > - } > - > - // > - // Is there a time stamp change request? > - // > - if (!IsZero (&NewFileInfo->CreateTime, sizeof (EFI_TIME)) && > - CompareMem (&NewFileInfo->CreateTime, &OldFileInfo->CreateTime, > sizeof (EFI_TIME)) > - ) { > - TimeChangeFlag =3D TRUE; > - } else if (!IsZero (&NewFileInfo->LastAccessTime, sizeof (EFI_TIME)) &= & > - CompareMem (&NewFileInfo->LastAccessTime, &OldFileInfo- > >LastAccessTime, sizeof (EFI_TIME)) > - ) { > - TimeChangeFlag =3D TRUE; > - } else if (!IsZero (&NewFileInfo->ModificationTime, sizeof (EFI_TIME))= && > - CompareMem (&NewFileInfo->ModificationTime, &OldFileInfo- > >ModificationTime, sizeof (EFI_TIME)) > - ) { > - TimeChangeFlag =3D TRUE; > - } > - > - // > - // All done if there are no change requests being made. > - // > - if (!(AttrChangeFlag || NameChangeFlag || SizeChangeFlag || > TimeChangeFlag)) { > - Status =3D EFI_SUCCESS; > - goto Done; > - } > - > - // > - // Set file or directory information. > - // > - if (stat (OldFileName, &OldAttr) !=3D 0) { > - Status =3D ErrnoToEfiStatus (); > - goto Done; > - } > - > - // > - // Name change. > - // > - if (NameChangeFlag) { > - // > - // Close the handles first > - // > - if (PrivateFile->IsOpenedByRead) { > - Status =3D EFI_ACCESS_DENIED; > - goto Done; > - } > - > - for (CharPointer =3D NewFileName; *CharPointer !=3D 0 && *CharPointe= r !=3D L'/'; > CharPointer++) { > - } > - > - if (*CharPointer !=3D 0) { > - Status =3D EFI_ACCESS_DENIED; > - goto Done; > - } > - > - UnixStatus =3D rename (OldFileName, NewFileName); > - if (UnixStatus =3D=3D 0) { > - // > - // modify file name > - // > - free (PrivateFile->FileName); > - > - PrivateFile->FileName =3D malloc (AsciiStrSize (NewFileName)); > - if (PrivateFile->FileName =3D=3D NULL) { > - goto Done; > - } > - > - AsciiStrCpy (PrivateFile->FileName, NewFileName); > - } else { > - Status =3D EFI_DEVICE_ERROR; > - goto Done; > - } > - } > - > - // > - // Size change > - // > - if (SizeChangeFlag) { > - if (PrivateFile->IsDirectoryPath) { > - Status =3D EFI_UNSUPPORTED; > - goto Done; > - } > - > - if (PrivateFile->IsOpenedByRead || OldFileInfo->Attribute & > EFI_FILE_READ_ONLY) { > - Status =3D EFI_ACCESS_DENIED; > - goto Done; > - } > - > - if (ftruncate (PrivateFile->fd, NewFileInfo->FileSize) !=3D 0) { > - Status =3D ErrnoToEfiStatus (); > - goto Done; > - } > - > - } > - > - // > - // Time change > - // > - if (TimeChangeFlag) { > - NewLastAccessSystemTime.tm_year =3D NewFileInfo->LastAccessTime.Y= ear; > - NewLastAccessSystemTime.tm_mon =3D NewFileInfo- > >LastAccessTime.Month; > - NewLastAccessSystemTime.tm_mday =3D NewFileInfo->LastAccessTime.D= ay; > - NewLastAccessSystemTime.tm_hour =3D NewFileInfo->LastAccessTime.H= our; > - NewLastAccessSystemTime.tm_min =3D NewFileInfo- > >LastAccessTime.Minute; > - NewLastAccessSystemTime.tm_sec =3D NewFileInfo- > >LastAccessTime.Second; > - NewLastAccessSystemTime.tm_isdst =3D 0; > - > - Utime.actime =3D mktime (&NewLastAccessSystemTime); > - > - NewLastWriteSystemTime.tm_year =3D NewFileInfo->ModificationTime.= Year; > - NewLastWriteSystemTime.tm_mon =3D NewFileInfo- > >ModificationTime.Month; > - NewLastWriteSystemTime.tm_mday =3D NewFileInfo- > >ModificationTime.Day; > - NewLastWriteSystemTime.tm_hour =3D NewFileInfo- > >ModificationTime.Hour; > - NewLastWriteSystemTime.tm_min =3D NewFileInfo- > >ModificationTime.Minute; > - NewLastWriteSystemTime.tm_sec =3D NewFileInfo- > >ModificationTime.Second; > - NewLastWriteSystemTime.tm_isdst =3D 0; > - > - Utime.modtime =3D mktime (&NewLastWriteSystemTime); > - > - if (Utime.actime =3D=3D (time_t)-1 || Utime.modtime =3D=3D (time_t)-= 1) { > - goto Done; > - } > - > - if (utime (PrivateFile->FileName, &Utime) =3D=3D -1) { > - Status =3D ErrnoToEfiStatus (); > - goto Done; > - } > - } > - > - // > - // No matter about AttrChangeFlag, Attribute must be set. > - // Because operation before may cause attribute change. > - // > - NewAttr =3D OldAttr.st_mode; > - > - if (NewFileInfo->Attribute & EFI_FILE_READ_ONLY) { > - NewAttr &=3D ~(S_IRUSR | S_IRGRP | S_IROTH); > - } else { > - NewAttr |=3D S_IRUSR; > - } > - > - if (chmod (NewFileName, NewAttr) !=3D 0) { > - Status =3D ErrnoToEfiStatus (); > - } > - > -Done: > - if (OldFileInfo !=3D NULL) { > - free (OldFileInfo); > - } > - > - if (OldFileName !=3D NULL) { > - free (OldFileName); > - } > - > - if (NewFileName !=3D 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 supporte= d. > - @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 =3D 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) !=3D 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 !=3D NULL) { > - return EFI_ALREADY_STARTED; > - } > - > - if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) = { > - return EFI_UNSUPPORTED; > - } > - > - Private =3D malloc (sizeof (EMU_SIMPLE_FILE_SYSTEM_PRIVATE)); > - if (Private =3D=3D NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - Private->FilePath =3D malloc (StrLen (This->ConfigString) + 1); > - if (Private->FilePath =3D=3D NULL) { > - free (Private); > - return EFI_OUT_OF_RESOURCES; > - } > - > - // Convert Unicode to Ascii > - for (i =3D 0; This->ConfigString[i] !=3D 0; i++) { > - Private->FilePath[i] =3D This->ConfigString[i]; > - } > - Private->FilePath[i] =3D 0; > - > - > - Private->VolumeLabel =3D malloc (StrSize (L"EFI_EMULATED")); > - if (Private->VolumeLabel =3D=3D NULL) { > - free (Private->FilePath); > - free (Private); > - return EFI_OUT_OF_RESOURCES; > - } > - StrCpy (Private->VolumeLabel, L"EFI_EMULATED"); > - > - Private->Signature =3D EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE; > - Private->Thunk =3D This; > - CopyMem (&Private->SimpleFileSystem, &gPosixFileSystemProtocol, sizeof > (Private->SimpleFileSystem)); > - Private->FileHandlesOpen =3D FALSE; > - > - This->Interface =3D &Private->SimpleFileSystem; > - This->Private =3D 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 =3D This->Private; > - > - if (Private->FileHandlesOpen) { > - // > - // Close only supported if all the EFI_FILE_HANDLEs have been closed= . > - // > - return EFI_NOT_READY; > - } > - > - if (This->Private !=3D NULL) { > - if (Private->VolumeLabel !=3D NULL) { > - free (Private->VolumeLabel); > - } > - free (This->Private); > - This->Private =3D NULL; > - } > - > - return EFI_SUCCESS; > -} > - > - > -EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo =3D { > - &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 BS= D > License > +which accompanies this distribution. The full text of the license may b= e found > at > +http://opensource.org/licenses/bsd-license.php > + > +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 =3D { > + EFI_FILE_REVISION, > + GasketPosixFileOpen, > + GasketPosixFileCLose, > + GasketPosixFileDelete, > + GasketPosixFileRead, > + GasketPosixFileWrite, > + GasketPosixFileGetPossition, > + GasketPosixFileSetPossition, > + GasketPosixFileGetInfo, > + GasketPosixFileSetInfo, > + GasketPosixFileFlush > +}; > + > +EFI_SIMPLE_FILE_SYSTEM_PROTOCOL gPosixFileSystemProtocol =3D { > + 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 sys= tem. > + @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 =3D EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS (This); > + > + Status =3D EFI_OUT_OF_RESOURCES; > + PrivateFile =3D malloc (sizeof (EMU_EFI_FILE_PRIVATE)); > + if (PrivateFile =3D=3D NULL) { > + goto Done; > + } > + > + PrivateFile->FileName =3D malloc (AsciiStrSize (Private->FilePath)); > + if (PrivateFile->FileName =3D=3D NULL) { > + goto Done; > + } > + AsciiStrCpy (PrivateFile->FileName, Private->FilePath); > + > + PrivateFile->Signature =3D EMU_EFI_FILE_PRIVATE_SIGNATURE; > + PrivateFile->Thunk =3D Private->Thunk; > + PrivateFile->SimpleFileSystem =3D This; > + PrivateFile->IsRootDirectory =3D TRUE; > + PrivateFile->IsDirectoryPath =3D TRUE; > + PrivateFile->IsOpenedByRead =3D TRUE; > + > + CopyMem (&PrivateFile->EfiFile, &gPosixFileProtocol, sizeof > (EFI_FILE_PROTOCOL)); > + > + PrivateFile->fd =3D -1; > + PrivateFile->Dir =3D NULL; > + PrivateFile->Dirent =3D NULL; > + > + *Root =3D &PrivateFile->EfiFile; > + > + PrivateFile->Dir =3D opendir (PrivateFile->FileName); > + if (PrivateFile->Dir =3D=3D NULL) { > + Status =3D EFI_ACCESS_DENIED; > + } else { > + Status =3D EFI_SUCCESS; > + } > + > +Done: > + if (EFI_ERROR (Status)) { > + if (PrivateFile !=3D NULL) { > + if (PrivateFile->FileName !=3D NULL) { > + free (PrivateFile->FileName); > + } > + > + free (PrivateFile); > + } > + > + *Root =3D 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 =3D Str; *(Pointer + Count); Pointer++) { > + *Pointer =3D *(Pointer + Count); > + } > + > + *Pointer =3D *(Pointer + Count); > +} > + > + > +VOID > +PosixSystemTimeToEfiTime ( > + IN time_t SystemTime, > + OUT EFI_TIME *Time > + ) > +{ > + struct tm *tm; > + > + tm =3D gmtime (&SystemTime); > + Time->Year =3D tm->tm_year; > + Time->Month =3D tm->tm_mon + 1; > + Time->Day =3D tm->tm_mday; > + Time->Hour =3D tm->tm_hour; > + Time->Minute =3D tm->tm_min; > + Time->Second =3D tm->tm_sec; > + Time->Nanosecond =3D 0; > + > + Time->TimeZone =3D timezone; > + Time->Daylight =3D (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 !=3D NULL) { > + RealFileName =3D FileName; > + } else if (PrivateFile->IsRootDirectory) { > + RealFileName =3D ""; > + } else { > + RealFileName =3D PrivateFile->FileName; > + } > + > + TempPointer =3D RealFileName; > + while (*TempPointer) { > + if (*TempPointer =3D=3D '/') { > + RealFileName =3D TempPointer + 1; > + } > + > + TempPointer++; > + } > + > + Size =3D SIZE_OF_EFI_FILE_INFO; > + NameSize =3D AsciiStrSize (RealFileName) * 2; > + ResultSize =3D Size + NameSize; > + > + if (*BufferSize < ResultSize) { > + *BufferSize =3D ResultSize; > + return EFI_BUFFER_TOO_SMALL; > + } > + if (stat (FileName =3D=3D NULL ? PrivateFile->FileName : FileName, &bu= f) < 0) { > + return EFI_DEVICE_ERROR; > + } > + > + Status =3D EFI_SUCCESS; > + > + Info =3D Buffer; > + ZeroMem (Info, ResultSize); > + > + Info->Size =3D ResultSize; > + Info->FileSize =3D buf.st_size; > + Info->PhysicalSize =3D 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 |=3D EFI_FILE_READ_ONLY; > + } > + > + if (S_ISDIR(buf.st_mode)) { > + Info->Attribute |=3D EFI_FILE_DIRECTORY; > + } > + > + > + BufferFileName =3D (CHAR16 *)((CHAR8 *) Buffer + Size); > + while (*RealFileName) { > + *BufferFileName++ =3D *RealFileName++; > + } > + *BufferFileName =3D 0; > + > + *BufferSize =3D ResultSize; > + return Status; > +} > + > +BOOLEAN > +IsZero ( > + IN VOID *Buffer, > + IN UINTN Length > + ) > +{ > + if (Buffer =3D=3D NULL || Length =3D=3D 0) { > + return FALSE; > + } > + > + if (*(UINT8 *) Buffer !=3D 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 supp= orted. > + @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 =3D EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This); > + PrivateRoot =3D EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS > (PrivateFile->SimpleFileSystem); > + NewPrivateFile =3D NULL; > + Status =3D EFI_OUT_OF_RESOURCES; > + > + // > + // BUGBUG: assume an open of root > + // if current location, return current data > + // > + TrailingDash =3D FALSE; > + if ((StrCmp (FileName, L"\\") =3D=3D 0) || > + (StrCmp (FileName, L".") =3D=3D 0 && PrivateFile->IsRootDirectory)= ) { > +OpenRoot: > + Status =3D PosixOpenVolume (PrivateFile->SimpleFileSystem, = &Root); > + NewPrivateFile =3D EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (Root); > + goto Done; > + } > + > + if (FileName[StrLen (FileName) - 1] =3D=3D L'\\') { > + TrailingDash =3D TRUE; > + FileName[StrLen (FileName) - 1] =3D 0; > + } > + > + // > + // Attempt to open the file > + // > + NewPrivateFile =3D malloc (sizeof (EMU_EFI_FILE_PRIVATE)); > + if (NewPrivateFile =3D=3D NULL) { > + goto Done; > + } > + > + CopyMem (NewPrivateFile, PrivateFile, sizeof (EMU_EFI_FILE_PRIVATE)); > + > + NewPrivateFile->FileName =3D malloc (AsciiStrSize (PrivateFile->FileNa= me) + 1 > + StrLen (FileName) + 1); > + if (NewPrivateFile->FileName =3D=3D NULL) { > + goto Done; > + } > + > + if (*FileName =3D=3D L'\\') { > + AsciiStrCpy (NewPrivateFile->FileName, PrivateRoot->FilePath); > + // Skip first '\'. > + Src =3D FileName + 1; > + } else { > + AsciiStrCpy (NewPrivateFile->FileName, PrivateFile->FileName); > + Src =3D FileName; > + } > + Dst =3D NewPrivateFile->FileName + AsciiStrLen (NewPrivateFile->FileNa= me); > + GuardPointer =3D NewPrivateFile->FileName + AsciiStrLen (PrivateRoot- > >FilePath); > + *Dst++ =3D '/'; > + // Convert unicode to ascii and '\' to '/' > + while (*Src) { > + if (*Src =3D=3D '\\') { > + *Dst++ =3D '/'; > + } else { > + *Dst++ =3D *Src; > + } > + Src++; > + } > + *Dst =3D 0; > + > + > + // > + // Get rid of . and .., except leading . or .. > + // > + > + // > + // GuardPointer protect simplefilesystem root path not be destroyed > + // > + > + LoopFinish =3D FALSE; > + while (!LoopFinish) { > + LoopFinish =3D TRUE; > + > + for (ParseFileName =3D GuardPointer; *ParseFileName; ParseFileName++= ) { > + if (*ParseFileName =3D=3D '.' && > + (*(ParseFileName + 1) =3D=3D 0 || *(ParseFileName + 1) =3D=3D = '/') && > + *(ParseFileName - 1) =3D=3D '/' > + ) { > + > + // > + // cut /. > + // > + CutPrefix (ParseFileName - 1, 2); > + LoopFinish =3D FALSE; > + break; > + } > + > + if (*ParseFileName =3D=3D '.' && > + *(ParseFileName + 1) =3D=3D '.' && > + (*(ParseFileName + 2) =3D=3D 0 || *(ParseFileName + 2) =3D=3D = '/') && > + *(ParseFileName - 1) =3D=3D '/' > + ) { > + > + ParseFileName--; > + Count =3D 3; > + > + while (ParseFileName !=3D GuardPointer) { > + ParseFileName--; > + Count++; > + if (*ParseFileName =3D=3D '/') { > + break; > + } > + } > + > + // > + // cut /.. and its left directory > + // > + CutPrefix (ParseFileName, Count); > + LoopFinish =3D FALSE; > + break; > + } > + } > + } > + > + if (AsciiStrCmp (NewPrivateFile->FileName, PrivateRoot->FilePath) =3D= =3D 0) { > + NewPrivateFile->IsRootDirectory =3D TRUE; > + free (NewPrivateFile->FileName); > + free (NewPrivateFile); > + goto OpenRoot; > + } > + > + RealFileName =3D NewPrivateFile->FileName + AsciiStrLen(NewPrivateFile= - > >FileName) - 1; > + while (RealFileName > NewPrivateFile->FileName && *RealFileName !=3D '= /') { > + RealFileName--; > + } > + > + TempChar =3D *(RealFileName - 1); > + *(RealFileName - 1) =3D 0; > + *(RealFileName - 1) =3D TempChar; > + > + > + // > + // Test whether file or directory > + // > + NewPrivateFile->IsRootDirectory =3D FALSE; > + NewPrivateFile->fd =3D -1; > + NewPrivateFile->Dir =3D NULL; > + if (OpenMode & EFI_FILE_MODE_CREATE) { > + if (Attributes & EFI_FILE_DIRECTORY) { > + NewPrivateFile->IsDirectoryPath =3D TRUE; > + } else { > + NewPrivateFile->IsDirectoryPath =3D FALSE; > + } > + } else { > + res =3D stat (NewPrivateFile->FileName, &finfo); > + if (res =3D=3D 0 && S_ISDIR(finfo.st_mode)) { > + NewPrivateFile->IsDirectoryPath =3D TRUE; > + } else { > + NewPrivateFile->IsDirectoryPath =3D FALSE; > + } > + } > + > + if (OpenMode & EFI_FILE_MODE_WRITE) { > + NewPrivateFile->IsOpenedByRead =3D FALSE; > + } else { > + NewPrivateFile->IsOpenedByRead =3D TRUE; > + } > + > + Status =3D EFI_SUCCESS; > + > + // > + // deal with directory > + // > + if (NewPrivateFile->IsDirectoryPath) { > + if ((OpenMode & EFI_FILE_MODE_CREATE)) { > + // > + // Create a directory > + // > + if (mkdir (NewPrivateFile->FileName, 0777) !=3D 0) { > + if (errno !=3D EEXIST) { > + //free (TempFileName); > + Status =3D EFI_ACCESS_DENIED; > + goto Done; > + } > + } > + } > + > + NewPrivateFile->Dir =3D opendir (NewPrivateFile->FileName); > + if (NewPrivateFile->Dir =3D=3D NULL) { > + if (errno =3D=3D EACCES) { > + Status =3D EFI_ACCESS_DENIED; > + } else { > + Status =3D EFI_NOT_FOUND; > + } > + > + goto Done; > + } > + > + } else { > + // > + // deal with file > + // > + NewPrivateFile->fd =3D open ( > + NewPrivateFile->FileName, > + ((OpenMode & EFI_FILE_MODE_CREATE) ? O_CREAT := 0) | > (NewPrivateFile->IsOpenedByRead ? O_RDONLY : O_RDWR), > + 0666 > + ); > + if (NewPrivateFile->fd < 0) { > + if (errno =3D=3D ENOENT) { > + Status =3D EFI_NOT_FOUND; > + } else { > + Status =3D EFI_ACCESS_DENIED; > + } > + } > + } > + > + if ((OpenMode & EFI_FILE_MODE_CREATE) && Status =3D=3D EFI_SUCCESS) { > + // > + // Set the attribute > + // > + InfoSize =3D 0; > + Info =3D NULL; > + Status =3D PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileI= nfoGuid, > &InfoSize, Info); > + if (Status !=3D EFI_BUFFER_TOO_SMALL) { > + Status =3D EFI_DEVICE_ERROR; > + goto Done; > + } > + > + Info =3D malloc (InfoSize); > + if (Info =3D=3D NULL) { > + goto Done; > + } > + > + Status =3D PosixFileGetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfo= Guid, > &InfoSize, Info); > + if (EFI_ERROR (Status)) { > + goto Done; > + } > + > + Info->Attribute =3D Attributes; > + PosixFileSetInfo (&NewPrivateFile->EfiFile, &gEfiFileInfoGuid, InfoS= ize, Info); > + > + free (Info); > + } > + > +Done: ; > + if (TrailingDash) { > + FileName[StrLen (FileName) + 1] =3D 0; > + FileName[StrLen (FileName)] =3D L'\\'; > + } > + > + if (EFI_ERROR (Status)) { > + if (NewPrivateFile) { > + if (NewPrivateFile->FileName) { > + free (NewPrivateFile->FileName); > + } > + > + free (NewPrivateFile); > + } > + } else { > + *NewHandle =3D &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 =3D EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This); > + > + if (PrivateFile->fd >=3D 0) { > + close (PrivateFile->fd); > + } > + if (PrivateFile->Dir !=3D NULL) { > + closedir (PrivateFile->Dir); > + } > + > + PrivateFile->fd =3D -1; > + PrivateFile->Dir =3D 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 wa= s > not deleted. > + > +**/ > +EFI_STATUS > +PosixFileDelete ( > + IN EFI_FILE_PROTOCOL *This > + ) > +{ > + EFI_STATUS Status; > + EMU_EFI_FILE_PRIVATE *PrivateFile; > + > + PrivateFile =3D EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This); > + Status =3D EFI_WARN_DELETE_FAILURE; > + > + if (PrivateFile->IsDirectoryPath) { > + if (PrivateFile->Dir !=3D NULL) { > + closedir (PrivateFile->Dir); > + PrivateFile->Dir =3D NULL; > + } > + > + if (rmdir (PrivateFile->FileName) =3D=3D 0) { > + Status =3D EFI_SUCCESS; > + } > + } else { > + close (PrivateFile->fd); > + PrivateFile->fd =3D -1; > + > + if (!PrivateFile->IsOpenedByRead) { > + if (!unlink (PrivateFile->FileName)) { > + Status =3D 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 i= n > 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 conta= ins > 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 =3D EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This); > + > + if (!PrivateFile->IsDirectoryPath) { > + if (PrivateFile->fd < 0) { > + Status =3D EFI_DEVICE_ERROR; > + goto Done; > + } > + > + Res =3D read (PrivateFile->fd, Buffer, *BufferSize); > + if (Res < 0) { > + Status =3D EFI_DEVICE_ERROR; > + goto Done; > + } > + *BufferSize =3D Res; > + Status =3D EFI_SUCCESS; > + goto Done; > + } > + > + // > + // Read on a directory. > + // > + if (PrivateFile->Dir =3D=3D NULL) { > + Status =3D EFI_DEVICE_ERROR; > + goto Done; > + } > + > + if (PrivateFile->Dirent =3D=3D NULL) { > + PrivateFile->Dirent =3D readdir (PrivateFile->Dir); > + if (PrivateFile->Dirent =3D=3D NULL) { > + *BufferSize =3D 0; > + Status =3D EFI_SUCCESS; > + goto Done; > + } > + } > + > + Size =3D SIZE_OF_EFI_FILE_INFO; > + NameSize =3D AsciiStrLen (PrivateFile->Dirent->d_name) + 1; > + ResultSize =3D Size + 2 * NameSize; > + > + if (*BufferSize < ResultSize) { > + *BufferSize =3D ResultSize; > + Status =3D EFI_BUFFER_TOO_SMALL; > + goto Done; > + } > + Status =3D EFI_SUCCESS; > + > + *BufferSize =3D ResultSize; > + > + FullFileName =3D malloc (AsciiStrLen(PrivateFile->FileName) + 1 + Name= Size); > + if (FullFileName =3D=3D NULL) { > + Status =3D EFI_OUT_OF_RESOURCES; > + goto Done; > + } > + > + AsciiStrCpy (FullFileName, PrivateFile->FileName); > + AsciiStrCat (FullFileName, "/"); > + AsciiStrCat (FullFileName, PrivateFile->Dirent->d_name); > + Status =3D UnixSimpleFileSystemFileInfo ( > + PrivateFile, > + FullFileName, > + BufferSize, > + Buffer > + ); > + free (FullFileName); > + > + PrivateFile->Dirent =3D 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 i= n > 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 supporte= d. > + @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 =3D 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 =3D write (PrivateFile->fd, Buffer, *BufferSize); > + if (Res =3D=3D (UINTN)-1) { > + return ErrnoToEfiStatus (); > + } > + > + *BufferSize =3D 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 =3D EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This); > + > + if (PrivateFile->IsDirectoryPath) { > + if (Position !=3D 0) { > + return EFI_UNSUPPORTED; > + } > + > + if (PrivateFile->Dir =3D=3D NULL) { > + return EFI_DEVICE_ERROR; > + } > + rewinddir (PrivateFile->Dir); > + return EFI_SUCCESS; > + } else { > + if (Position =3D=3D (UINT64) -1) { > + Pos =3D lseek (PrivateFile->fd, 0, SEEK_END); > + } else { > + Pos =3D lseek (PrivateFile->fd, Position, SEEK_SET); > + } > + if (Pos =3D=3D (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 =3D EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This); > + > + if (PrivateFile->IsDirectoryPath) { > + Status =3D EFI_UNSUPPORTED; > + } else { > + *Position =3D (UINT64)lseek (PrivateFile->fd, 0, SEEK_CUR); > + Status =3D (*Position =3D=3D (UINT64) -1) ? ErrnoToEfiStatus () : EF= I_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 d= ata 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 =3D EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This); > + PrivateRoot =3D EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS > (PrivateFile->SimpleFileSystem); > + > + Status =3D EFI_SUCCESS; > + if (CompareGuid (InformationType, &gEfiFileInfoGuid)) { > + Status =3D UnixSimpleFileSystemFileInfo (PrivateFile, NULL, BufferSi= ze, Buffer); > + } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) { > + if (*BufferSize < SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoo= t- > >VolumeLabel)) { > + *BufferSize =3D SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoo= t- > >VolumeLabel); > + return EFI_BUFFER_TOO_SMALL; > + } > + > + UnixStatus =3D statfs (PrivateFile->FileName, &buf); > + if (UnixStatus < 0) { > + return EFI_DEVICE_ERROR; > + } > + > + FileSystemInfoBuffer =3D (EFI_FILE_SYSTEM_INFO *) Buffer; > + FileSystemInfoBuffer->Size =3D SIZE_OF_EFI_FILE_SYSTEM_INFO + S= trSize > (PrivateRoot->VolumeLabel); > + FileSystemInfoBuffer->ReadOnly =3D FALSE; > + > + // > + // Succeeded > + // > + FileSystemInfoBuffer->VolumeSize =3D MultU64x32 (buf.f_blocks, buf.= f_bsize); > + FileSystemInfoBuffer->FreeSpace =3D MultU64x32 (buf.f_bavail, buf.= f_bsize); > + FileSystemInfoBuffer->BlockSize =3D buf.f_bsize; > + > + > + StrCpy ((CHAR16 *) FileSystemInfoBuffer->VolumeLabel, PrivateRoot- > >VolumeLabel); > + *BufferSize =3D SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoot- > >VolumeLabel); > + > + } else if (CompareGuid (InformationType, > &gEfiFileSystemVolumeLabelInfoIdGuid)) { > + if (*BufferSize < StrSize (PrivateRoot->VolumeLabel)) { > + *BufferSize =3D StrSize (PrivateRoot->VolumeLabel); > + return EFI_BUFFER_TOO_SMALL; > + } > + > + StrCpy ((CHAR16 *) Buffer, PrivateRoot->VolumeLabel); > + *BufferSize =3D 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 =3D EMU_EFI_FILE_PRIVATE_DATA_FROM_THIS (This); > + PrivateRoot =3D EMU_SIMPLE_FILE_SYSTEM_PRIVATE_DATA_FROM_THIS > (PrivateFile->SimpleFileSystem); > + errno =3D 0; > + Status =3D EFI_UNSUPPORTED; > + OldFileInfo =3D NewFileInfo =3D NULL; > + OldFileName =3D NewFileName =3D NULL; > + AttrChangeFlag =3D NameChangeFlag =3D SizeChangeFlag =3D TimeChangeFla= g =3D > FALSE; > + > + // > + // Set file system information. > + // > + if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) { > + if (BufferSize < (SIZE_OF_EFI_FILE_SYSTEM_INFO + StrSize (PrivateRoo= t- > >VolumeLabel))) { > + Status =3D EFI_BAD_BUFFER_SIZE; > + goto Done; > + } > + > + NewFileSystemInfo =3D (EFI_FILE_SYSTEM_INFO *) Buffer; > + > + free (PrivateRoot->VolumeLabel); > + > + PrivateRoot->VolumeLabel =3D malloc (StrSize (NewFileSystemInfo- > >VolumeLabel)); > + if (PrivateRoot->VolumeLabel =3D=3D NULL) { > + goto Done; > + } > + > + StrCpy (PrivateRoot->VolumeLabel, NewFileSystemInfo->VolumeLabel); > + > + Status =3D EFI_SUCCESS; > + goto Done; > + } > + > + // > + // Set volume label information. > + // > + if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid= )) > { > + if (BufferSize < StrSize (PrivateRoot->VolumeLabel)) { > + Status =3D EFI_BAD_BUFFER_SIZE; > + goto Done; > + } > + > + StrCpy (PrivateRoot->VolumeLabel, (CHAR16 *) Buffer); > + > + Status =3D EFI_SUCCESS; > + goto Done; > + } > + > + if (!CompareGuid (InformationType, &gEfiFileInfoGuid)) { > + Status =3D EFI_UNSUPPORTED; > + goto Done; > + } > + > + if (BufferSize < SIZE_OF_EFI_FILE_INFO) { > + Status =3D EFI_BAD_BUFFER_SIZE; > + goto Done; > + } > + > + // > + // Set file/directory information. > + // > + > + // > + // Check for invalid set file information parameters. > + // > + NewFileInfo =3D (EFI_FILE_INFO *) Buffer; > + if (NewFileInfo->Size <=3D sizeof (EFI_FILE_INFO) || > + (NewFileInfo->Attribute &~(EFI_FILE_VALID_ATTR)) || > + (sizeof (UINTN) =3D=3D 4 && NewFileInfo->Size > 0xFFFFFFFF) > + ) { > + Status =3D EFI_INVALID_PARAMETER; > + goto Done; > + } > + > + // > + // Get current file information so we can determine what kind > + // of change request this is. > + // > + OldInfoSize =3D 0; > + Status =3D UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSi= ze, > NULL); > + if (Status !=3D EFI_BUFFER_TOO_SMALL) { > + Status =3D EFI_DEVICE_ERROR; > + goto Done; > + } > + > + OldFileInfo =3D malloc (OldInfoSize); > + if (OldFileInfo =3D=3D NULL) { > + goto Done; > + } > + > + Status =3D UnixSimpleFileSystemFileInfo (PrivateFile, NULL, &OldInfoSi= ze, > OldFileInfo); > + if (EFI_ERROR (Status)) { > + goto Done; > + } > + > + OldFileName =3D malloc (AsciiStrSize (PrivateFile->FileName)); > + if (OldFileInfo =3D=3D NULL) { > + goto Done; > + } > + > + AsciiStrCpy (OldFileName, PrivateFile->FileName); > + > + // > + // Make full pathname from new filename and rootpath. > + // > + if (NewFileInfo->FileName[0] =3D=3D '\\') { > + NewFileName =3D malloc (AsciiStrLen (PrivateRoot->FilePath) + 1 + St= rLen > (NewFileInfo->FileName) + 1); > + if (NewFileName =3D=3D NULL) { > + goto Done; > + } > + > + AsciiStrCpy (NewFileName, PrivateRoot->FilePath); > + AsciiFilePtr =3D NewFileName + AsciiStrLen(NewFileName); > + UnicodeFilePtr =3D NewFileInfo->FileName + 1; > + *AsciiFilePtr++ =3D'/'; > + } else { > + NewFileName =3D malloc (AsciiStrLen (PrivateFile->FileName) + 2 + St= rLen > (NewFileInfo->FileName) + 1); > + if (NewFileName =3D=3D NULL) { > + goto Done; > + } > + > + AsciiStrCpy (NewFileName, PrivateRoot->FilePath); > + AsciiFilePtr =3D NewFileName + AsciiStrLen(NewFileName); > + if ((AsciiFilePtr[-1] !=3D '/') && (NewFileInfo->FileName[0] !=3D '/= ')) { > + // make sure there is a / between Root FilePath and NewFileInfo Fi= lename > + AsciiFilePtr[0] =3D '/'; > + AsciiFilePtr[1] =3D '\0'; > + AsciiFilePtr++; > + } > + UnicodeFilePtr =3D NewFileInfo->FileName; > + } > + // Convert to ascii. > + while (*UnicodeFilePtr) { > + *AsciiFilePtr++ =3D *UnicodeFilePtr++; > + } > + *AsciiFilePtr =3D 0; > + > + // > + // Is there an attribute change request? > + // > + if (NewFileInfo->Attribute !=3D OldFileInfo->Attribute) { > + if ((NewFileInfo->Attribute & EFI_FILE_DIRECTORY) !=3D (OldFileInfo- > >Attribute & EFI_FILE_DIRECTORY)) { > + Status =3D EFI_INVALID_PARAMETER; > + goto Done; > + } > + > + AttrChangeFlag =3D TRUE; > + } > + > + // > + // Is there a name change request? > + // bugbug: - Should really use EFI_UNICODE_COLLATION_PROTOCOL > + // > + if (StrCmp (NewFileInfo->FileName, OldFileInfo->FileName)) { > + NameChangeFlag =3D TRUE; > + } > + > + // > + // Is there a size change request? > + // > + if (NewFileInfo->FileSize !=3D OldFileInfo->FileSize) { > + SizeChangeFlag =3D TRUE; > + } > + > + // > + // Is there a time stamp change request? > + // > + if (!IsZero (&NewFileInfo->CreateTime, sizeof (EFI_TIME)) && > + CompareMem (&NewFileInfo->CreateTime, &OldFileInfo->CreateTime, > sizeof (EFI_TIME)) > + ) { > + TimeChangeFlag =3D TRUE; > + } else if (!IsZero (&NewFileInfo->LastAccessTime, sizeof (EFI_TIME)) &= & > + CompareMem (&NewFileInfo->LastAccessTime, &OldFileInfo- > >LastAccessTime, sizeof (EFI_TIME)) > + ) { > + TimeChangeFlag =3D TRUE; > + } else if (!IsZero (&NewFileInfo->ModificationTime, sizeof (EFI_TIME))= && > + CompareMem (&NewFileInfo->ModificationTime, &OldFileInfo- > >ModificationTime, sizeof (EFI_TIME)) > + ) { > + TimeChangeFlag =3D TRUE; > + } > + > + // > + // All done if there are no change requests being made. > + // > + if (!(AttrChangeFlag || NameChangeFlag || SizeChangeFlag || > TimeChangeFlag)) { > + Status =3D EFI_SUCCESS; > + goto Done; > + } > + > + // > + // Set file or directory information. > + // > + if (stat (OldFileName, &OldAttr) !=3D 0) { > + Status =3D ErrnoToEfiStatus (); > + goto Done; > + } > + > + // > + // Name change. > + // > + if (NameChangeFlag) { > + // > + // Close the handles first > + // > + if (PrivateFile->IsOpenedByRead) { > + Status =3D EFI_ACCESS_DENIED; > + goto Done; > + } > + > + for (CharPointer =3D NewFileName; *CharPointer !=3D 0 && *CharPointe= r !=3D L'/'; > CharPointer++) { > + } > + > + if (*CharPointer !=3D 0) { > + Status =3D EFI_ACCESS_DENIED; > + goto Done; > + } > + > + UnixStatus =3D rename (OldFileName, NewFileName); > + if (UnixStatus =3D=3D 0) { > + // > + // modify file name > + // > + free (PrivateFile->FileName); > + > + PrivateFile->FileName =3D malloc (AsciiStrSize (NewFileName)); > + if (PrivateFile->FileName =3D=3D NULL) { > + goto Done; > + } > + > + AsciiStrCpy (PrivateFile->FileName, NewFileName); > + } else { > + Status =3D EFI_DEVICE_ERROR; > + goto Done; > + } > + } > + > + // > + // Size change > + // > + if (SizeChangeFlag) { > + if (PrivateFile->IsDirectoryPath) { > + Status =3D EFI_UNSUPPORTED; > + goto Done; > + } > + > + if (PrivateFile->IsOpenedByRead || OldFileInfo->Attribute & > EFI_FILE_READ_ONLY) { > + Status =3D EFI_ACCESS_DENIED; > + goto Done; > + } > + > + if (ftruncate (PrivateFile->fd, NewFileInfo->FileSize) !=3D 0) { > + Status =3D ErrnoToEfiStatus (); > + goto Done; > + } > + > + } > + > + // > + // Time change > + // > + if (TimeChangeFlag) { > + NewLastAccessSystemTime.tm_year =3D NewFileInfo->LastAccessTime.Y= ear; > + NewLastAccessSystemTime.tm_mon =3D NewFileInfo- > >LastAccessTime.Month; > + NewLastAccessSystemTime.tm_mday =3D NewFileInfo->LastAccessTime.D= ay; > + NewLastAccessSystemTime.tm_hour =3D NewFileInfo->LastAccessTime.H= our; > + NewLastAccessSystemTime.tm_min =3D NewFileInfo- > >LastAccessTime.Minute; > + NewLastAccessSystemTime.tm_sec =3D NewFileInfo- > >LastAccessTime.Second; > + NewLastAccessSystemTime.tm_isdst =3D 0; > + > + Utime.actime =3D mktime (&NewLastAccessSystemTime); > + > + NewLastWriteSystemTime.tm_year =3D NewFileInfo- > >ModificationTime.Year; > + NewLastWriteSystemTime.tm_mon =3D NewFileInfo- > >ModificationTime.Month; > + NewLastWriteSystemTime.tm_mday =3D NewFileInfo- > >ModificationTime.Day; > + NewLastWriteSystemTime.tm_hour =3D NewFileInfo- > >ModificationTime.Hour; > + NewLastWriteSystemTime.tm_min =3D NewFileInfo- > >ModificationTime.Minute; > + NewLastWriteSystemTime.tm_sec =3D NewFileInfo- > >ModificationTime.Second; > + NewLastWriteSystemTime.tm_isdst =3D 0; > + > + Utime.modtime =3D mktime (&NewLastWriteSystemTime); > + > + if (Utime.actime =3D=3D (time_t)-1 || Utime.modtime =3D=3D (time_t)-= 1) { > + goto Done; > + } > + > + if (utime (PrivateFile->FileName, &Utime) =3D=3D -1) { > + Status =3D ErrnoToEfiStatus (); > + goto Done; > + } > + } > + > + // > + // No matter about AttrChangeFlag, Attribute must be set. > + // Because operation before may cause attribute change. > + // > + NewAttr =3D OldAttr.st_mode; > + > + if (NewFileInfo->Attribute & EFI_FILE_READ_ONLY) { > + NewAttr &=3D ~(S_IRUSR | S_IRGRP | S_IROTH); > + } else { > + NewAttr |=3D S_IRUSR; > + } > + > + if (chmod (NewFileName, NewAttr) !=3D 0) { > + Status =3D ErrnoToEfiStatus (); > + } > + > +Done: > + if (OldFileInfo !=3D NULL) { > + free (OldFileInfo); > + } > + > + if (OldFileName !=3D NULL) { > + free (OldFileName); > + } > + > + if (NewFileName !=3D 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 supporte= d. > + @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 =3D 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) !=3D 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 !=3D NULL) { > + return EFI_ALREADY_STARTED; > + } > + > + if (!CompareGuid (This->Protocol, &gEfiSimpleFileSystemProtocolGuid)) = { > + return EFI_UNSUPPORTED; > + } > + > + Private =3D malloc (sizeof (EMU_SIMPLE_FILE_SYSTEM_PRIVATE)); > + if (Private =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + Private->FilePath =3D malloc (StrLen (This->ConfigString) + 1); > + if (Private->FilePath =3D=3D NULL) { > + free (Private); > + return EFI_OUT_OF_RESOURCES; > + } > + > + // Convert Unicode to Ascii > + for (i =3D 0; This->ConfigString[i] !=3D 0; i++) { > + Private->FilePath[i] =3D This->ConfigString[i]; > + } > + Private->FilePath[i] =3D 0; > + > + > + Private->VolumeLabel =3D malloc (StrSize (L"EFI_EMULATED")); > + if (Private->VolumeLabel =3D=3D NULL) { > + free (Private->FilePath); > + free (Private); > + return EFI_OUT_OF_RESOURCES; > + } > + StrCpy (Private->VolumeLabel, L"EFI_EMULATED"); > + > + Private->Signature =3D EMU_SIMPLE_FILE_SYSTEM_PRIVATE_SIGNATURE; > + Private->Thunk =3D This; > + CopyMem (&Private->SimpleFileSystem, &gPosixFileSystemProtocol, sizeof > (Private->SimpleFileSystem)); > + Private->FileHandlesOpen =3D FALSE; > + > + This->Interface =3D &Private->SimpleFileSystem; > + This->Private =3D 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 =3D This->Private; > + > + if (Private->FileHandlesOpen) { > + // > + // Close only supported if all the EFI_FILE_HANDLEs have been closed= . > + // > + return EFI_NOT_READY; > + } > + > + if (This->Private !=3D NULL) { > + if (Private->VolumeLabel !=3D NULL) { > + free (Private->VolumeLabel); > + } > + free (This->Private); > + This->Private =3D NULL; > + } > + > + return EFI_SUCCESS; > +} > + > + > +EMU_IO_THUNK_PROTOCOL gPosixFileSystemThunkIo =3D { > + &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.
> - > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BS= D > License > -which accompanies this distribution. The full text of the license may b= e found > at > -http://opensource.org/licenses/bsd-license.php > - > -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 > - > - > -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 =3D malloc (sizeof (pthread_mutex_t)); > - err =3D pthread_mutex_init (Mutex, NULL); > - if (err =3D=3D 0) { > - return Mutex; > - } > - > - return NULL; > -} > - > - > -UINTN > -PthreadMutexDestroy ( > - IN VOID *Mutex > - ) > -{ > - if (Mutex !=3D 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 =3D { > - 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 =3D 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 sta= rt thread > - // > - if (SecInterruptEanbled ()) { > - SecDisableInterrupt (); > - EnabledOnEntry =3D TRUE; > - } else { > - EnabledOnEntry =3D FALSE; > - } > - > - // Aquire lock for global, SecFakePthreadStart runs in a different thr= ead. > - pthread_mutex_lock (&mThreadMangle.Mutex); > - mThreadMangle.Start =3D Start; > - > - err =3D pthread_create (Thread, Attribute, SecFakePthreadStart, Contex= t); > - if (err !=3D 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 ty= pe. > - // Check out sys/types.h to make sure this will work if you are portin= g. > - // 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 =3D { > - GasketPthreadMutexLock, > - GasketPthreadMutexUnLock, > - GasketPthreadMutexTryLock, > - GasketPthreadMutexInit, > - GasketPthreadMutexDestroy, > - GasketPthreadCreate, > - GasketPthreadExit, > - GasketPthreadSelf > -}; > - > - > -EFI_STATUS > -PthreadOpen ( > - IN EMU_IO_THUNK_PROTOCOL *This > - ) > -{ > - if (This->Instance !=3D 0) { > - // Only single instance is supported > - return EFI_NOT_FOUND; > - } > - > - if (This->ConfigString[0] =3D=3D L'0') { > - // If AP count is zero no need for threads > - return EFI_NOT_FOUND; > - } > - > - This->Interface =3D &gPthreadThunk; > - > - return EFI_SUCCESS; > -} > - > - > -EFI_STATUS > -PthreadClose ( > - IN EMU_IO_THUNK_PROTOCOL *This > - ) > -{ > - return EFI_SUCCESS; > -} > - > - > -EMU_IO_THUNK_PROTOCOL gPthreadThunkIo =3D { > - &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.
> + > +This program and the accompanying materials > +are licensed and made available under the terms and conditions of the BS= D > License > +which accompanies this distribution. The full text of the license may b= e found > at > +http://opensource.org/licenses/bsd-license.php > + > +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 > + > + > +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 =3D malloc (sizeof (pthread_mutex_t)); > + err =3D pthread_mutex_init (Mutex, NULL); > + if (err =3D=3D 0) { > + return Mutex; > + } > + > + return NULL; > +} > + > + > +UINTN > +PthreadMutexDestroy ( > + IN VOID *Mutex > + ) > +{ > + if (Mutex !=3D 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 =3D { > + 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 =3D 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 sta= rt thread > + // > + if (SecInterruptEanbled ()) { > + SecDisableInterrupt (); > + EnabledOnEntry =3D TRUE; > + } else { > + EnabledOnEntry =3D FALSE; > + } > + > + // Aquire lock for global, SecFakePthreadStart runs in a different thr= ead. > + pthread_mutex_lock (&mThreadMangle.Mutex); > + mThreadMangle.Start =3D Start; > + > + err =3D pthread_create (Thread, Attribute, SecFakePthreadStart, Contex= t); > + if (err !=3D 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 ty= pe. > + // Check out sys/types.h to make sure this will work if you are portin= g. > + // 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 =3D { > + GasketPthreadMutexLock, > + GasketPthreadMutexUnLock, > + GasketPthreadMutexTryLock, > + GasketPthreadMutexInit, > + GasketPthreadMutexDestroy, > + GasketPthreadCreate, > + GasketPthreadExit, > + GasketPthreadSelf > +}; > + > + > +EFI_STATUS > +PthreadOpen ( > + IN EMU_IO_THUNK_PROTOCOL *This > + ) > +{ > + if (This->Instance !=3D 0) { > + // Only single instance is supported > + return EFI_NOT_FOUND; > + } > + > + if (This->ConfigString[0] =3D=3D L'0') { > + // If AP count is zero no need for threads > + return EFI_NOT_FOUND; > + } > + > + This->Interface =3D &gPthreadThunk; > + > + return EFI_SUCCESS; > +} > + > + > +EFI_STATUS > +PthreadClose ( > + IN EMU_IO_THUNK_PROTOCOL *This > + ) > +{ > + return EFI_SUCCESS; > +} > + > + > +EMU_IO_THUNK_PROTOCOL gPthreadThunkIo =3D { > + &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.
> -Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.
> - > -This program and the accompanying materials > -are licensed and made available under the terms and conditions of the BS= D > License > -which accompanies this distribution. The full text of the license may b= e found > at > -http://opensource.org/licenses/bsd-license.php > - > -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 > -#include > - > -#include > -#include > -#include > -#include > -#include > -#include > - > -#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 *RegisterdKeyCallb= ackContext; > - > - 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 =3D 0; > - sm->size =3D 0; > - while ((mask & 1) =3D=3D 0) { > - mask >>=3D 1; > - sm->shift++; > - } > - while (mask & 1) { > - sm->size++; > - mask >>=3D 1; > - } > - sm->csize =3D 8 - sm->size; > -} > - > -int > -TryCreateShmImage ( > - IN GRAPHICS_IO_PRIVATE *Drv > - ) > -{ > - Drv->image =3D XShmCreateImage ( > - Drv->display, Drv->visual, > - Drv->depth, ZPixmap, NULL, &Drv->xshm_info, > - Drv->width, Drv->height > - ); > - if (Drv->image =3D=3D NULL) { > - return 0; > - } > - > - switch (Drv->image->bitmap_unit) { > - case 32: > - Drv->pixel_shift =3D 2; > - break; > - case 16: > - Drv->pixel_shift =3D 1; > - break; > - case 8: > - Drv->pixel_shift =3D 0; > - break; > - } > - > - Drv->xshm_info.shmid =3D 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 =3D 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 f= olks quit > using > - // it on Linux. > - // > - shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL); > -#endif > - > - Drv->xshm_info.shmaddr =3D (char*)Drv->image_data; > - Drv->image->data =3D (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 =3D (GRAPHICS_IO_PRIVATE *)GraphicsIo; > - if (Drv->image !=3D 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 =3D NULL; > - Drv->image =3D NULL; > - } > - > - Drv->width =3D Width; > - Drv->height =3D Height; > - XResizeWindow (Drv->display, Drv->win, Width, Height); > - > - // Allocate image. > - if (XShmQueryExtension(Drv->display) && TryCreateShmImage(Drv)) { > - Drv->use_shm =3D 1; > - } else { > - Drv->use_shm =3D 0; > - if (Drv->depth > 16) { > - Drv->pixel_shift =3D 2; > - } else if (Drv->depth > 8) { > - Drv->pixel_shift =3D 1; > - } else { > - Drv->pixel_shift =3D 0; > - } > - > - Drv->image_data =3D malloc ((Drv->width * Drv->height) << Drv->pixel= _shift); > - Drv->image =3D 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 =3D 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 =3D PSize | PMinSize | PMaxSize; > - size_hints.min_width =3D size_hints.max_width =3D size_hints.base_widt= h =3D Width; > - size_hints.min_height =3D size_hints.max_height =3D size_hints.base_he= ight =3D > 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 =3D=3D 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, sh= ifted > 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 =3D XGetKeyboardMapping (Drv->display, ev->xkey.keycode, 1, > &KeySymArraySize); > - > - KeyData.Key.ScanCode =3D 0; > - KeyData.Key.UnicodeChar =3D 0; > - KeyData.KeyState.KeyShiftState =3D 0; > - > - // > - // Skipping EFI_SCROLL_LOCK_ACTIVE & EFI_NUM_LOCK_ACTIVE since they > are not on Macs > - // > - if ((ev->xkey.state & LockMask) =3D=3D 0) { > - Drv->KeyState.KeyToggleState &=3D ~EFI_CAPS_LOCK_ACTIVE; > - } else { > - if (Make) { > - Drv->KeyState.KeyToggleState |=3D 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 |=3D EFI_RIGHT_CONTROL_PRESSED; > - } else { > - Drv->KeyState.KeyShiftState &=3D ~EFI_RIGHT_CONTROL_PRESSED; > - } > - break; > - case XK_Control_L: > - if (Make) { > - Drv->KeyState.KeyShiftState |=3D EFI_LEFT_CONTROL_PRESSED; > - } else { > - Drv->KeyState.KeyShiftState &=3D ~EFI_LEFT_CONTROL_PRESSED; > - } > - break; > - > - case XK_Shift_R: > - if (Make) { > - Drv->KeyState.KeyShiftState |=3D EFI_RIGHT_SHIFT_PRESSED; > - } else { > - Drv->KeyState.KeyShiftState &=3D ~EFI_RIGHT_SHIFT_PRESSED; > - } > - break; > - case XK_Shift_L: > - if (Make) { > - Drv->KeyState.KeyShiftState |=3D EFI_LEFT_SHIFT_PRESSED; > - } else { > - Drv->KeyState.KeyShiftState &=3D ~EFI_LEFT_SHIFT_PRESSED; > - } > - break; > - > - case XK_Mode_switch: > - if (Make) { > - Drv->KeyState.KeyShiftState |=3D EFI_LEFT_ALT_PRESSED; > - } else { > - Drv->KeyState.KeyShiftState &=3D ~EFI_LEFT_ALT_PRESSED; > - } > - break; > - > - case XK_Meta_R: > - if (Make) { > - Drv->KeyState.KeyShiftState |=3D EFI_RIGHT_LOGO_PRESSED; > - } else { > - Drv->KeyState.KeyShiftState &=3D ~EFI_RIGHT_LOGO_PRESSED; > - } > - break; > - case XK_Meta_L: > - if (Make) { > - Drv->KeyState.KeyShiftState |=3D EFI_LEFT_LOGO_PRESSED; > - } else { > - Drv->KeyState.KeyShiftState &=3D ~EFI_LEFT_LOGO_PRESSED; > - } > - break; > - > - case XK_KP_Home: > - case XK_Home: KeyData.Key.ScanCode =3D SCAN_HOME; break; > - > - case XK_KP_End: > - case XK_End: KeyData.Key.ScanCode =3D SCAN_END; break; > - > - case XK_KP_Left: > - case XK_Left: KeyData.Key.ScanCode =3D SCAN_LEFT; break; > - > - case XK_KP_Right: > - case XK_Right: KeyData.Key.ScanCode =3D SCAN_RIGHT; break; > - > - case XK_KP_Up: > - case XK_Up: KeyData.Key.ScanCode =3D SCAN_UP; break; > - > - case XK_KP_Down: > - case XK_Down: KeyData.Key.ScanCode =3D SCAN_DOWN; break; > - > - case XK_KP_Delete: > - case XK_Delete: KeyData.Key.ScanCode =3D SCAN_DELETE; break; > - > - case XK_KP_Insert: > - case XK_Insert: KeyData.Key.ScanCode =3D SCAN_INSERT; break; > - > - case XK_KP_Page_Up: > - case XK_Page_Up: KeyData.Key.ScanCode =3D SCAN_PAGE_UP; break; > - > - case XK_KP_Page_Down: > - case XK_Page_Down: KeyData.Key.ScanCode =3D SCAN_PAGE_DOWN; break; > - > - case XK_Escape: KeyData.Key.ScanCode =3D SCAN_ESC; break; > - > - case XK_Pause: KeyData.Key.ScanCode =3D SCAN_PAUSE; break; > - > - case XK_KP_F1: > - case XK_F1: KeyData.Key.ScanCode =3D SCAN_F1; break; > - > - case XK_KP_F2: > - case XK_F2: KeyData.Key.ScanCode =3D SCAN_F2; break; > - > - case XK_KP_F3: > - case XK_F3: KeyData.Key.ScanCode =3D SCAN_F3; break; > - > - case XK_KP_F4: > - case XK_F4: KeyData.Key.ScanCode =3D SCAN_F4; break; > - > - case XK_F5: KeyData.Key.ScanCode =3D SCAN_F5; break; > - case XK_F6: KeyData.Key.ScanCode =3D SCAN_F6; break; > - case XK_F7: KeyData.Key.ScanCode =3D 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 =3D SCAN_F8; break; > - case XK_F9: KeyData.Key.ScanCode =3D SCAN_F9; break; > - case XK_F10: KeyData.Key.ScanCode =3D SCAN_F10; break; > - > - case XK_F11: KeyData.Key.ScanCode =3D SCAN_F11; break; > - case XK_F12: KeyData.Key.ScanCode =3D SCAN_F12; break; > - > - case XK_F13: KeyData.Key.ScanCode =3D SCAN_F13; break; > - case XK_F14: KeyData.Key.ScanCode =3D SCAN_F14; break; > - case XK_F15: KeyData.Key.ScanCode =3D SCAN_F15; break; > - case XK_F16: KeyData.Key.ScanCode =3D SCAN_F16; break; > - case XK_F17: KeyData.Key.ScanCode =3D SCAN_F17; break; > - case XK_F18: KeyData.Key.ScanCode =3D SCAN_F18; break; > - case XK_F19: KeyData.Key.ScanCode =3D SCAN_F19; break; > - case XK_F20: KeyData.Key.ScanCode =3D SCAN_F20; break; > - case XK_F21: KeyData.Key.ScanCode =3D SCAN_F21; break; > - case XK_F22: KeyData.Key.ScanCode =3D SCAN_F22; break; > - case XK_F23: KeyData.Key.ScanCode =3D SCAN_F23; break; > - case XK_F24: KeyData.Key.ScanCode =3D SCAN_F24; break; > - > - // No mapping in X11 > - //case XK_: KeyData.Key.ScanCode =3D SCAN_MUTE; break; > - //case XK_: KeyData.Key.ScanCode =3D SCAN_VOLUME_UP; break; > - //case XK_: KeyData.Key.ScanCode =3D SCAN_VOLUME_DOWN; break; > - //case XK_: KeyData.Key.ScanCode =3D SCAN_BRIGHTNESS_UP; break; > - //case XK_: KeyData.Key.ScanCode =3D SCAN_BRIGHTNESS_DOWN; break; > - //case XK_: KeyData.Key.ScanCode =3D SCAN_SUSPEND; break; > - //case XK_: KeyData.Key.ScanCode =3D SCAN_HIBERNATE; break; > - //case XK_: KeyData.Key.ScanCode =3D SCAN_TOGGLE_DISPLAY; break; > - //case XK_: KeyData.Key.ScanCode =3D SCAN_RECOVERY; break; > - //case XK_: KeyData.Key.ScanCode =3D SCAN_EJECT; break; > - > - case XK_BackSpace: KeyData.Key.UnicodeChar =3D 0x0008; break; > - > - case XK_KP_Tab: > - case XK_Tab: KeyData.Key.UnicodeChar =3D 0x0009; break; > - > - case XK_Linefeed: KeyData.Key.UnicodeChar =3D 0x000a; break; > - > - case XK_KP_Enter: > - case XK_Return: KeyData.Key.UnicodeChar =3D 0x000d; break; > - > - case XK_KP_Equal : KeyData.Key.UnicodeChar =3D L'=3D'; break; > - case XK_KP_Multiply : KeyData.Key.UnicodeChar =3D L'*'; break; > - case XK_KP_Add : KeyData.Key.UnicodeChar =3D L'+'; break; > - case XK_KP_Separator : KeyData.Key.UnicodeChar =3D L'~'; break; > - case XK_KP_Subtract : KeyData.Key.UnicodeChar =3D L'-'; break; > - case XK_KP_Decimal : KeyData.Key.UnicodeChar =3D L'.'; break; > - case XK_KP_Divide : KeyData.Key.UnicodeChar =3D L'/'; break; > - > - case XK_KP_0 : KeyData.Key.UnicodeChar =3D L'0'; break; > - case XK_KP_1 : KeyData.Key.UnicodeChar =3D L'1'; break; > - case XK_KP_2 : KeyData.Key.UnicodeChar =3D L'2'; break; > - case XK_KP_3 : KeyData.Key.UnicodeChar =3D L'3'; break; > - case XK_KP_4 : KeyData.Key.UnicodeChar =3D L'4'; break; > - case XK_KP_5 : KeyData.Key.UnicodeChar =3D L'5'; break; > - case XK_KP_6 : KeyData.Key.UnicodeChar =3D L'6'; break; > - case XK_KP_7 : KeyData.Key.UnicodeChar =3D L'7'; break; > - case XK_KP_8 : KeyData.Key.UnicodeChar =3D L'8'; break; > - case XK_KP_9 : KeyData.Key.UnicodeChar =3D L'9'; break; > - > - default: > - ; > - } > - > - // The global state is our state > - KeyData.KeyState.KeyShiftState =3D Drv->KeyState.KeyShiftState; > - KeyData.KeyState.KeyToggleState =3D Drv->KeyState.KeyToggleState; > - > - if (*KeySym < XK_BackSpace) { > - if (((Drv->KeyState.KeyShiftState & (EFI_LEFT_SHIFT_PRESSED | > EFI_RIGHT_SHIFT_PRESSED)) !=3D 0) || > - ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) !=3D 0) )= { > - > - KeyData.Key.UnicodeChar =3D (CHAR16)KeySym[KEYSYM_UPPER]; > - > - // Per UEFI spec since we converted the Unicode clear the shift bi= ts we > pass up > - KeyData.KeyState.KeyShiftState &=3D ~(EFI_LEFT_SHIFT_PRESSED | > EFI_RIGHT_SHIFT_PRESSED); > - } else { > - KeyData.Key.UnicodeChar =3D (CHAR16)KeySym[KEYSYM_LOWER]; > - } > - } else { > - // XK_BackSpace is the start of XK_MISCELLANY. These are the XK_? ke= ys we > process in this file > - ; > - } > - > - if (Make) { > - memcpy (&Drv->keys[Drv->key_wr], &KeyData, sizeof (EFI_KEY_DATA)); > - Drv->key_wr =3D (Drv->key_wr + 1) % NBR_KEYS; > - Drv->key_count++; > - if (Drv->MakeRegisterdKeyCallback !=3D NULL) { > - ReverseGasketUint64Uint64 (Drv->MakeRegisterdKeyCallback ,Drv- > >RegisterdKeyCallbackContext, &KeyData); > - } > - } else { > - if (Drv->BreakRegisterdKeyCallback !=3D NULL) { > - ReverseGasketUint64Uint64 (Drv->BreakRegisterdKeyCallback ,Drv- > >RegisterdKeyCallbackContext, &KeyData); > - } > - } > -} > - > - > -void > -handleMouseMoved( > - IN GRAPHICS_IO_PRIVATE *Drv, > - IN XEvent *ev > - ) > -{ > - if (ev->xmotion.x !=3D Drv->previous_x) { > - Drv->pointer_state.RelativeMovementX +=3D ( ev->xmotion.x - Drv- > >previous_x ); > - Drv->previous_x =3D ev->xmotion.x; > - Drv->pointer_state_changed =3D 1; > - } > - > - if (ev->xmotion.y !=3D Drv->previous_y) { > - Drv->pointer_state.RelativeMovementY +=3D ( ev->xmotion.y - Drv- > >previous_y ); > - Drv->previous_y =3D ev->xmotion.y; > - Drv->pointer_state_changed =3D 1; > - } > - > - Drv->pointer_state.RelativeMovementZ =3D 0; > -} > - > -void > -handleMouseDown ( > - IN GRAPHICS_IO_PRIVATE *Drv, > - IN XEvent *ev, > - IN BOOLEAN Pressed > - ) > -{ > - if (ev->xbutton.button =3D=3D Button1) { > - Drv->pointer_state_changed =3D (Drv->pointer_state.LeftButton !=3D P= ressed); > - Drv->pointer_state.LeftButton =3D Pressed; > - } > - if ( ev->xbutton.button =3D=3D Button2 ) { > - Drv->pointer_state_changed =3D (Drv->pointer_state.RightButton !=3D = Pressed); > - Drv->pointer_state.RightButton =3D 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, He= ight, > False > - ); > - } else { > - XPutImage ( > - Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, He= ight > - ); > - } > - 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) !=3D 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 =3D (val >> Drv->r.shift) << Drv->r.csize; > - Pixel.Green =3D (val >> Drv->g.shift) << Drv->g.csize; > - Pixel.Blue =3D (val >> Drv->b.shift) << Drv->b.csize; > - > - return Pixel; > -} > - > - > -EFI_STATUS > -X11CheckKey ( > - IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo > - ) > -{ > - GRAPHICS_IO_PRIVATE *Drv; > - > - Drv =3D (GRAPHICS_IO_PRIVATE *)GraphicsIo; > - > - HandleEvents (Drv); > - > - if (Drv->key_count !=3D 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 =3D (GRAPHICS_IO_PRIVATE *)GraphicsIo; > - > - EfiStatus =3D X11CheckKey (GraphicsIo); > - if (EFI_ERROR (EfiStatus)) { > - return EfiStatus; > - } > - > - CopyMem (KeyData, &Drv->keys[Drv->key_rd], sizeof (EFI_KEY_DATA)); > - Drv->key_rd =3D (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 =3D (GRAPHICS_IO_PRIVATE *)GraphicsIo; > - > - if (*KeyToggleState & EFI_CAPS_LOCK_ACTIVE) { > - if ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) =3D=3D 0) = { > - // > - // We could create an XKeyEvent and send a XK_Caps_Lock to > - // the UGA/GOP Window > - // > - } > - } > - > - Drv->KeyState.KeyToggleState =3D *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 =3D (GRAPHICS_IO_PRIVATE *)GraphicsIo; > - > - Drv->MakeRegisterdKeyCallback =3D MakeCallBack; > - Drv->BreakRegisterdKeyCallback =3D BreakCallBack; > - Drv->RegisterdKeyCallbackContext =3D 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 =3D (GRAPHICS_IO_PRIVATE *)GraphicsIo; > - > - > - // > - // Check bounds > - // > - if (BltOperation =3D=3D EfiUgaVideoToBltBuffer > - || BltOperation =3D=3D 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 =3D=3D EfiUgaBltBufferToVideo > - || BltOperation =3D=3D EfiUgaVideoToVideo > - || BltOperation =3D=3D 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 =3D (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->DestinationY *= Args- > >Delta) + Args->DestinationX * sizeof (EFI_UGA_PIXEL)); > - Args->Delta -=3D Args->Width * sizeof (EFI_UGA_PIXEL); > - for (SrcY =3D Args->SourceY; SrcY < (Args->Height + Args->SourceY); = SrcY++) { > - for (SrcX =3D Args->SourceX; SrcX < (Args->Width + Args->SourceX);= SrcX++) { > - *Blt++ =3D X11ColorToPixel (Private, XGetPixel (Private->image, = SrcX, SrcY)); > - } > - Blt =3D (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta); > - } > - break; > - case EfiUgaBltBufferToVideo: > - Blt =3D (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->SourceY * Args= ->Delta) > + Args->SourceX * sizeof (EFI_UGA_PIXEL)); > - Args->Delta -=3D Args->Width * sizeof (EFI_UGA_PIXEL); > - for (DstY =3D Args->DestinationY; DstY < (Args->Height + Args->Desti= nationY); > DstY++) { > - for (DstX =3D Args->DestinationX; DstX < (Args->Width + Args->Dest= inationX); > DstX++) { > - XPutPixel(Private->image, DstX, DstY, X11PixelToColor(Private, *= Blt)); > - Blt++; > - } > - Blt =3D (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta); > - } > - break; > - case EfiUgaVideoToVideo: > - Dst =3D Private->image_data + (Args->DestinationX << Private->pixel_= shift) > - + Args->DestinationY * Private->line_bytes; > - Src =3D Private->image_data + (Args->SourceX << Private->pixel_shift= ) > - + Args->SourceY * Private->line_bytes; > - Nbr =3D Args->Width << Private->pixel_shift; > - if (Args->DestinationY < Args->SourceY) { > - for (Index =3D 0; Index < Args->Height; Index++) { > - memcpy (Dst, Src, Nbr); > - Dst +=3D Private->line_bytes; > - Src +=3D Private->line_bytes; > - } > - } else { > - Dst +=3D (Args->Height - 1) * Private->line_bytes; > - Src +=3D (Args->Height - 1) * Private->line_bytes; > - for (Index =3D 0; Index < Args->Height; Index++) { > - // > - // Source and Destination Y may be equal, therefore Dst and Src ma= y > - // overlap. > - // > - memmove (Dst, Src, Nbr); > - Dst -=3D Private->line_bytes; > - Src -=3D Private->line_bytes; > - } > - } > - break; > - case EfiUgaVideoFill: > - Color =3D X11PixelToColor(Private, *BltBuffer); > - for (DstY =3D Args->DestinationY; DstY < (Args->Height + Args->Desti= nationY); > DstY++) { > - for (DstX =3D Args->DestinationX; DstX < (Args->Width + Args->Dest= inationX); > 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 =3D=3D NoExpose || ev.type =3D=3D GraphicsExpose) { > - break; > - } > - } > - break; > - case EfiUgaVideoFill: > - Color =3D 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 =3D (GRAPHICS_IO_PRIVATE *)GraphicsIo; > - > - HandleEvents (Drv); > - if (Drv->pointer_state_changed !=3D 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 =3D (GRAPHICS_IO_PRIVATE *)GraphicsIo; > - > - EfiStatus =3D X11CheckPointer (GraphicsIo); > - if (EfiStatus !=3D EFI_SUCCESS) { > - return EfiStatus; > - } > - > - memcpy (State, &Drv->pointer_state, sizeof (EFI_SIMPLE_POINTER_STATE))= ; > - > - Drv->pointer_state.RelativeMovementX =3D 0; > - Drv->pointer_state.RelativeMovementY =3D 0; > - Drv->pointer_state.RelativeMovementZ =3D 0; > - Drv->pointer_state_changed =3D 0; > - return EFI_SUCCESS; > -} > - > - > - > -EFI_STATUS > -X11GraphicsWindowOpen ( > - IN EMU_IO_THUNK_PROTOCOL *This > - ) > -{ > - GRAPHICS_IO_PRIVATE *Drv; > - unsigned int border_width =3D 0; > - char *display_name =3D NULL; > - > - Drv =3D (GRAPHICS_IO_PRIVATE *)calloc (1, sizeof (GRAPHICS_IO_PRIVATE)= ); > - if (Drv =3D=3D NULL) { > - return EFI_OUT_OF_RESOURCES; > - } > - > - Drv->GraphicsIo.Size =3D GasketX11Size; > - Drv->GraphicsIo.CheckKey =3D GasketX11CheckKey; > - Drv->GraphicsIo.GetKey =3D GasketX11GetKey; > - Drv->GraphicsIo.KeySetState =3D GasketX11KeySetState; > - Drv->GraphicsIo.RegisterKeyNotify =3D GasketX11RegisterKeyNotify; > - Drv->GraphicsIo.Blt =3D GasketX11Blt; > - Drv->GraphicsIo.CheckPointer =3D GasketX11CheckPointer; > - Drv->GraphicsIo.GetPointerState =3D GasketX11GetPointerState; > - > - > - Drv->key_count =3D 0; > - Drv->key_rd =3D 0; > - Drv->key_wr =3D 0; > - Drv->KeyState.KeyShiftState =3D EFI_SHIFT_STATE_VALID; > - Drv->KeyState.KeyToggleState =3D EFI_TOGGLE_STATE_VALID; > - Drv->MakeRegisterdKeyCallback =3D NULL; > - Drv->BreakRegisterdKeyCallback =3D NULL; > - Drv->RegisterdKeyCallbackContext =3D NULL; > - > - > - Drv->display =3D XOpenDisplay (display_name); > - if (Drv->display =3D=3D NULL) { > - fprintf (stderr, "uga: cannot connect to X server %s\n", XDisplayNam= e > (display_name)); > - free (Drv); > - return EFI_DEVICE_ERROR; > - } > - Drv->screen =3D DefaultScreen (Drv->display); > - Drv->visual =3D DefaultVisual (Drv->display, Drv->screen); > - Drv->win =3D 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 =3D DefaultDepth (Drv->display, Drv->screen); > - XDefineCursor (Drv->display, Drv->win, XCreateFontCursor (Drv->display= , > XC_pirate)); > - > - Drv->Title =3D 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 =3D DefaultGC (Drv->display, Drv->screen); > - > - This->Private =3D (VOID *)Drv; > - This->Interface =3D (VOID *)Drv; > - return EFI_SUCCESS; > -} > - > - > -EFI_STATUS > -X11GraphicsWindowClose ( > - IN EMU_IO_THUNK_PROTOCOL *This > - ) > -{ > - GRAPHICS_IO_PRIVATE *Drv; > - > - Drv =3D (GRAPHICS_IO_PRIVATE *)This->Private; > - > - if (Drv =3D=3D NULL) { > - return EFI_SUCCESS; > - } > - > - if (Drv->image !=3D NULL) { > - XDestroyImage(Drv->image); > - > - if (Drv->use_shm) { > - shmdt (Drv->image_data); > - } > - > - Drv->image_data =3D NULL; > - Drv->image =3D 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 =3D { > - &gEmuGraphicsWindowProtocolGuid, > - NULL, > - NULL, > - 0, > - GasketX11GraphicsWindowOpen, > - GasketX11GraphicsWindowClose, > - NULL > -}; > - > - > +/*++ @file > + > +Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.
> +Portions copyright (c) 2008 - 2011, Apple Inc. All rights reserved.
> + > +This program and the accompanying materials > +are licensed and made available under the terms and conditions of the BS= D > License > +which accompanies this distribution. The full text of the license may b= e found > at > +http://opensource.org/licenses/bsd-license.php > + > +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 > +#include > + > +#include > +#include > +#include > +#include > +#include > +#include > + > +#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 *RegisterdKeyCallb= ackContext; > + > + 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 =3D 0; > + sm->size =3D 0; > + while ((mask & 1) =3D=3D 0) { > + mask >>=3D 1; > + sm->shift++; > + } > + while (mask & 1) { > + sm->size++; > + mask >>=3D 1; > + } > + sm->csize =3D 8 - sm->size; > +} > + > +int > +TryCreateShmImage ( > + IN GRAPHICS_IO_PRIVATE *Drv > + ) > +{ > + Drv->image =3D XShmCreateImage ( > + Drv->display, Drv->visual, > + Drv->depth, ZPixmap, NULL, &Drv->xshm_info, > + Drv->width, Drv->height > + ); > + if (Drv->image =3D=3D NULL) { > + return 0; > + } > + > + switch (Drv->image->bitmap_unit) { > + case 32: > + Drv->pixel_shift =3D 2; > + break; > + case 16: > + Drv->pixel_shift =3D 1; > + break; > + case 8: > + Drv->pixel_shift =3D 0; > + break; > + } > + > + Drv->xshm_info.shmid =3D 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 =3D 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 f= olks > quit using > + // it on Linux. > + // > + shmctl (Drv->xshm_info.shmid, IPC_RMID, NULL); > +#endif > + > + Drv->xshm_info.shmaddr =3D (char*)Drv->image_data; > + Drv->image->data =3D (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 =3D (GRAPHICS_IO_PRIVATE *)GraphicsIo; > + if (Drv->image !=3D 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 =3D NULL; > + Drv->image =3D NULL; > + } > + > + Drv->width =3D Width; > + Drv->height =3D Height; > + XResizeWindow (Drv->display, Drv->win, Width, Height); > + > + // Allocate image. > + if (XShmQueryExtension(Drv->display) && TryCreateShmImage(Drv)) { > + Drv->use_shm =3D 1; > + } else { > + Drv->use_shm =3D 0; > + if (Drv->depth > 16) { > + Drv->pixel_shift =3D 2; > + } else if (Drv->depth > 8) { > + Drv->pixel_shift =3D 1; > + } else { > + Drv->pixel_shift =3D 0; > + } > + > + Drv->image_data =3D malloc ((Drv->width * Drv->height) << Drv->pixel= _shift); > + Drv->image =3D 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 =3D 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 =3D PSize | PMinSize | PMaxSize; > + size_hints.min_width =3D size_hints.max_width =3D size_hints.base_widt= h =3D Width; > + size_hints.min_height =3D size_hints.max_height =3D size_hints.base_he= ight =3D > 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 =3D=3D 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, sh= ifted > 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 =3D XGetKeyboardMapping (Drv->display, ev->xkey.keycode, 1, > &KeySymArraySize); > + > + KeyData.Key.ScanCode =3D 0; > + KeyData.Key.UnicodeChar =3D 0; > + KeyData.KeyState.KeyShiftState =3D 0; > + > + // > + // Skipping EFI_SCROLL_LOCK_ACTIVE & EFI_NUM_LOCK_ACTIVE since they > are not on Macs > + // > + if ((ev->xkey.state & LockMask) =3D=3D 0) { > + Drv->KeyState.KeyToggleState &=3D ~EFI_CAPS_LOCK_ACTIVE; > + } else { > + if (Make) { > + Drv->KeyState.KeyToggleState |=3D 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 |=3D EFI_RIGHT_CONTROL_PRESSED; > + } else { > + Drv->KeyState.KeyShiftState &=3D ~EFI_RIGHT_CONTROL_PRESSED; > + } > + break; > + case XK_Control_L: > + if (Make) { > + Drv->KeyState.KeyShiftState |=3D EFI_LEFT_CONTROL_PRESSED; > + } else { > + Drv->KeyState.KeyShiftState &=3D ~EFI_LEFT_CONTROL_PRESSED; > + } > + break; > + > + case XK_Shift_R: > + if (Make) { > + Drv->KeyState.KeyShiftState |=3D EFI_RIGHT_SHIFT_PRESSED; > + } else { > + Drv->KeyState.KeyShiftState &=3D ~EFI_RIGHT_SHIFT_PRESSED; > + } > + break; > + case XK_Shift_L: > + if (Make) { > + Drv->KeyState.KeyShiftState |=3D EFI_LEFT_SHIFT_PRESSED; > + } else { > + Drv->KeyState.KeyShiftState &=3D ~EFI_LEFT_SHIFT_PRESSED; > + } > + break; > + > + case XK_Mode_switch: > + if (Make) { > + Drv->KeyState.KeyShiftState |=3D EFI_LEFT_ALT_PRESSED; > + } else { > + Drv->KeyState.KeyShiftState &=3D ~EFI_LEFT_ALT_PRESSED; > + } > + break; > + > + case XK_Meta_R: > + if (Make) { > + Drv->KeyState.KeyShiftState |=3D EFI_RIGHT_LOGO_PRESSED; > + } else { > + Drv->KeyState.KeyShiftState &=3D ~EFI_RIGHT_LOGO_PRESSED; > + } > + break; > + case XK_Meta_L: > + if (Make) { > + Drv->KeyState.KeyShiftState |=3D EFI_LEFT_LOGO_PRESSED; > + } else { > + Drv->KeyState.KeyShiftState &=3D ~EFI_LEFT_LOGO_PRESSED; > + } > + break; > + > + case XK_KP_Home: > + case XK_Home: KeyData.Key.ScanCode =3D SCAN_HOME; break; > + > + case XK_KP_End: > + case XK_End: KeyData.Key.ScanCode =3D SCAN_END; break; > + > + case XK_KP_Left: > + case XK_Left: KeyData.Key.ScanCode =3D SCAN_LEFT; break; > + > + case XK_KP_Right: > + case XK_Right: KeyData.Key.ScanCode =3D SCAN_RIGHT; break; > + > + case XK_KP_Up: > + case XK_Up: KeyData.Key.ScanCode =3D SCAN_UP; break; > + > + case XK_KP_Down: > + case XK_Down: KeyData.Key.ScanCode =3D SCAN_DOWN; break; > + > + case XK_KP_Delete: > + case XK_Delete: KeyData.Key.ScanCode =3D SCAN_DELETE; break; > + > + case XK_KP_Insert: > + case XK_Insert: KeyData.Key.ScanCode =3D SCAN_INSERT; break; > + > + case XK_KP_Page_Up: > + case XK_Page_Up: KeyData.Key.ScanCode =3D SCAN_PAGE_UP; break; > + > + case XK_KP_Page_Down: > + case XK_Page_Down: KeyData.Key.ScanCode =3D SCAN_PAGE_DOWN; break; > + > + case XK_Escape: KeyData.Key.ScanCode =3D SCAN_ESC; break; > + > + case XK_Pause: KeyData.Key.ScanCode =3D SCAN_PAUSE; break; > + > + case XK_KP_F1: > + case XK_F1: KeyData.Key.ScanCode =3D SCAN_F1; break; > + > + case XK_KP_F2: > + case XK_F2: KeyData.Key.ScanCode =3D SCAN_F2; break; > + > + case XK_KP_F3: > + case XK_F3: KeyData.Key.ScanCode =3D SCAN_F3; break; > + > + case XK_KP_F4: > + case XK_F4: KeyData.Key.ScanCode =3D SCAN_F4; break; > + > + case XK_F5: KeyData.Key.ScanCode =3D SCAN_F5; break; > + case XK_F6: KeyData.Key.ScanCode =3D SCAN_F6; break; > + case XK_F7: KeyData.Key.ScanCode =3D 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 =3D SCAN_F8; break; > + case XK_F9: KeyData.Key.ScanCode =3D SCAN_F9; break; > + case XK_F10: KeyData.Key.ScanCode =3D SCAN_F10; break; > + > + case XK_F11: KeyData.Key.ScanCode =3D SCAN_F11; break; > + case XK_F12: KeyData.Key.ScanCode =3D SCAN_F12; break; > + > + case XK_F13: KeyData.Key.ScanCode =3D SCAN_F13; break; > + case XK_F14: KeyData.Key.ScanCode =3D SCAN_F14; break; > + case XK_F15: KeyData.Key.ScanCode =3D SCAN_F15; break; > + case XK_F16: KeyData.Key.ScanCode =3D SCAN_F16; break; > + case XK_F17: KeyData.Key.ScanCode =3D SCAN_F17; break; > + case XK_F18: KeyData.Key.ScanCode =3D SCAN_F18; break; > + case XK_F19: KeyData.Key.ScanCode =3D SCAN_F19; break; > + case XK_F20: KeyData.Key.ScanCode =3D SCAN_F20; break; > + case XK_F21: KeyData.Key.ScanCode =3D SCAN_F21; break; > + case XK_F22: KeyData.Key.ScanCode =3D SCAN_F22; break; > + case XK_F23: KeyData.Key.ScanCode =3D SCAN_F23; break; > + case XK_F24: KeyData.Key.ScanCode =3D SCAN_F24; break; > + > + // No mapping in X11 > + //case XK_: KeyData.Key.ScanCode =3D SCAN_MUTE; break; > + //case XK_: KeyData.Key.ScanCode =3D SCAN_VOLUME_UP; break; > + //case XK_: KeyData.Key.ScanCode =3D SCAN_VOLUME_DOWN; break; > + //case XK_: KeyData.Key.ScanCode =3D SCAN_BRIGHTNESS_UP; break; > + //case XK_: KeyData.Key.ScanCode =3D SCAN_BRIGHTNESS_DOWN; break; > + //case XK_: KeyData.Key.ScanCode =3D SCAN_SUSPEND; break; > + //case XK_: KeyData.Key.ScanCode =3D SCAN_HIBERNATE; break; > + //case XK_: KeyData.Key.ScanCode =3D SCAN_TOGGLE_DISPLAY; break; > + //case XK_: KeyData.Key.ScanCode =3D SCAN_RECOVERY; break; > + //case XK_: KeyData.Key.ScanCode =3D SCAN_EJECT; break; > + > + case XK_BackSpace: KeyData.Key.UnicodeChar =3D 0x0008; break; > + > + case XK_KP_Tab: > + case XK_Tab: KeyData.Key.UnicodeChar =3D 0x0009; break; > + > + case XK_Linefeed: KeyData.Key.UnicodeChar =3D 0x000a; break; > + > + case XK_KP_Enter: > + case XK_Return: KeyData.Key.UnicodeChar =3D 0x000d; break; > + > + case XK_KP_Equal : KeyData.Key.UnicodeChar =3D L'=3D'; break; > + case XK_KP_Multiply : KeyData.Key.UnicodeChar =3D L'*'; break; > + case XK_KP_Add : KeyData.Key.UnicodeChar =3D L'+'; break; > + case XK_KP_Separator : KeyData.Key.UnicodeChar =3D L'~'; break; > + case XK_KP_Subtract : KeyData.Key.UnicodeChar =3D L'-'; break; > + case XK_KP_Decimal : KeyData.Key.UnicodeChar =3D L'.'; break; > + case XK_KP_Divide : KeyData.Key.UnicodeChar =3D L'/'; break; > + > + case XK_KP_0 : KeyData.Key.UnicodeChar =3D L'0'; break; > + case XK_KP_1 : KeyData.Key.UnicodeChar =3D L'1'; break; > + case XK_KP_2 : KeyData.Key.UnicodeChar =3D L'2'; break; > + case XK_KP_3 : KeyData.Key.UnicodeChar =3D L'3'; break; > + case XK_KP_4 : KeyData.Key.UnicodeChar =3D L'4'; break; > + case XK_KP_5 : KeyData.Key.UnicodeChar =3D L'5'; break; > + case XK_KP_6 : KeyData.Key.UnicodeChar =3D L'6'; break; > + case XK_KP_7 : KeyData.Key.UnicodeChar =3D L'7'; break; > + case XK_KP_8 : KeyData.Key.UnicodeChar =3D L'8'; break; > + case XK_KP_9 : KeyData.Key.UnicodeChar =3D L'9'; break; > + > + default: > + ; > + } > + > + // The global state is our state > + KeyData.KeyState.KeyShiftState =3D Drv->KeyState.KeyShiftState; > + KeyData.KeyState.KeyToggleState =3D Drv->KeyState.KeyToggleState; > + > + if (*KeySym < XK_BackSpace) { > + if (((Drv->KeyState.KeyShiftState & (EFI_LEFT_SHIFT_PRESSED | > EFI_RIGHT_SHIFT_PRESSED)) !=3D 0) || > + ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) !=3D 0) )= { > + > + KeyData.Key.UnicodeChar =3D (CHAR16)KeySym[KEYSYM_UPPER]; > + > + // Per UEFI spec since we converted the Unicode clear the shift bi= ts we > pass up > + KeyData.KeyState.KeyShiftState &=3D ~(EFI_LEFT_SHIFT_PRESSED | > EFI_RIGHT_SHIFT_PRESSED); > + } else { > + KeyData.Key.UnicodeChar =3D (CHAR16)KeySym[KEYSYM_LOWER]; > + } > + } else { > + // XK_BackSpace is the start of XK_MISCELLANY. These are the XK_? ke= ys > we process in this file > + ; > + } > + > + if (Make) { > + memcpy (&Drv->keys[Drv->key_wr], &KeyData, sizeof (EFI_KEY_DATA)); > + Drv->key_wr =3D (Drv->key_wr + 1) % NBR_KEYS; > + Drv->key_count++; > + if (Drv->MakeRegisterdKeyCallback !=3D NULL) { > + ReverseGasketUint64Uint64 (Drv->MakeRegisterdKeyCallback ,Drv- > >RegisterdKeyCallbackContext, &KeyData); > + } > + } else { > + if (Drv->BreakRegisterdKeyCallback !=3D NULL) { > + ReverseGasketUint64Uint64 (Drv->BreakRegisterdKeyCallback ,Drv- > >RegisterdKeyCallbackContext, &KeyData); > + } > + } > +} > + > + > +void > +handleMouseMoved( > + IN GRAPHICS_IO_PRIVATE *Drv, > + IN XEvent *ev > + ) > +{ > + if (ev->xmotion.x !=3D Drv->previous_x) { > + Drv->pointer_state.RelativeMovementX +=3D ( ev->xmotion.x - Drv- > >previous_x ); > + Drv->previous_x =3D ev->xmotion.x; > + Drv->pointer_state_changed =3D 1; > + } > + > + if (ev->xmotion.y !=3D Drv->previous_y) { > + Drv->pointer_state.RelativeMovementY +=3D ( ev->xmotion.y - Drv- > >previous_y ); > + Drv->previous_y =3D ev->xmotion.y; > + Drv->pointer_state_changed =3D 1; > + } > + > + Drv->pointer_state.RelativeMovementZ =3D 0; > +} > + > +void > +handleMouseDown ( > + IN GRAPHICS_IO_PRIVATE *Drv, > + IN XEvent *ev, > + IN BOOLEAN Pressed > + ) > +{ > + if (ev->xbutton.button =3D=3D Button1) { > + Drv->pointer_state_changed =3D (Drv->pointer_state.LeftButton !=3D P= ressed); > + Drv->pointer_state.LeftButton =3D Pressed; > + } > + if ( ev->xbutton.button =3D=3D Button2 ) { > + Drv->pointer_state_changed =3D (Drv->pointer_state.RightButton !=3D = Pressed); > + Drv->pointer_state.RightButton =3D 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, He= ight, > False > + ); > + } else { > + XPutImage ( > + Drv->display, Drv->win, Drv->gc, Drv->image, X, Y, X, Y, Width, He= ight > + ); > + } > + 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) !=3D 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 =3D (val >> Drv->r.shift) << Drv->r.csize; > + Pixel.Green =3D (val >> Drv->g.shift) << Drv->g.csize; > + Pixel.Blue =3D (val >> Drv->b.shift) << Drv->b.csize; > + > + return Pixel; > +} > + > + > +EFI_STATUS > +X11CheckKey ( > + IN EMU_GRAPHICS_WINDOW_PROTOCOL *GraphicsIo > + ) > +{ > + GRAPHICS_IO_PRIVATE *Drv; > + > + Drv =3D (GRAPHICS_IO_PRIVATE *)GraphicsIo; > + > + HandleEvents (Drv); > + > + if (Drv->key_count !=3D 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 =3D (GRAPHICS_IO_PRIVATE *)GraphicsIo; > + > + EfiStatus =3D X11CheckKey (GraphicsIo); > + if (EFI_ERROR (EfiStatus)) { > + return EfiStatus; > + } > + > + CopyMem (KeyData, &Drv->keys[Drv->key_rd], sizeof (EFI_KEY_DATA)); > + Drv->key_rd =3D (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 =3D (GRAPHICS_IO_PRIVATE *)GraphicsIo; > + > + if (*KeyToggleState & EFI_CAPS_LOCK_ACTIVE) { > + if ((Drv->KeyState.KeyToggleState & EFI_CAPS_LOCK_ACTIVE) =3D=3D 0) = { > + // > + // We could create an XKeyEvent and send a XK_Caps_Lock to > + // the UGA/GOP Window > + // > + } > + } > + > + Drv->KeyState.KeyToggleState =3D *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 =3D (GRAPHICS_IO_PRIVATE *)GraphicsIo; > + > + Drv->MakeRegisterdKeyCallback =3D MakeCallBack; > + Drv->BreakRegisterdKeyCallback =3D BreakCallBack; > + Drv->RegisterdKeyCallbackContext =3D 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 =3D (GRAPHICS_IO_PRIVATE *)GraphicsIo; > + > + > + // > + // Check bounds > + // > + if (BltOperation =3D=3D EfiUgaVideoToBltBuffer > + || BltOperation =3D=3D 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 =3D=3D EfiUgaBltBufferToVideo > + || BltOperation =3D=3D EfiUgaVideoToVideo > + || BltOperation =3D=3D 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 =3D (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->DestinationY *= Args- > >Delta) + Args->DestinationX * sizeof (EFI_UGA_PIXEL)); > + Args->Delta -=3D Args->Width * sizeof (EFI_UGA_PIXEL); > + for (SrcY =3D Args->SourceY; SrcY < (Args->Height + Args->SourceY); = SrcY++) { > + for (SrcX =3D Args->SourceX; SrcX < (Args->Width + Args->SourceX);= SrcX++) { > + *Blt++ =3D X11ColorToPixel (Private, XGetPixel (Private->image, = SrcX, > SrcY)); > + } > + Blt =3D (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta); > + } > + break; > + case EfiUgaBltBufferToVideo: > + Blt =3D (EFI_UGA_PIXEL *)((UINT8 *)BltBuffer + (Args->SourceY * Args= ->Delta) > + Args->SourceX * sizeof (EFI_UGA_PIXEL)); > + Args->Delta -=3D Args->Width * sizeof (EFI_UGA_PIXEL); > + for (DstY =3D Args->DestinationY; DstY < (Args->Height + Args->Desti= nationY); > DstY++) { > + for (DstX =3D Args->DestinationX; DstX < (Args->Width + Args->Dest= inationX); > DstX++) { > + XPutPixel(Private->image, DstX, DstY, X11PixelToColor(Private, *= Blt)); > + Blt++; > + } > + Blt =3D (EFI_UGA_PIXEL *) ((UINT8 *) Blt + Args->Delta); > + } > + break; > + case EfiUgaVideoToVideo: > + Dst =3D Private->image_data + (Args->DestinationX << Private->pixel_= shift) > + + Args->DestinationY * Private->line_bytes; > + Src =3D Private->image_data + (Args->SourceX << Private->pixel_shift= ) > + + Args->SourceY * Private->line_bytes; > + Nbr =3D Args->Width << Private->pixel_shift; > + if (Args->DestinationY < Args->SourceY) { > + for (Index =3D 0; Index < Args->Height; Index++) { > + memcpy (Dst, Src, Nbr); > + Dst +=3D Private->line_bytes; > + Src +=3D Private->line_bytes; > + } > + } else { > + Dst +=3D (Args->Height - 1) * Private->line_bytes; > + Src +=3D (Args->Height - 1) * Private->line_bytes; > + for (Index =3D 0; Index < Args->Height; Index++) { > + // > + // Source and Destination Y may be equal, therefore Dst and Src ma= y > + // overlap. > + // > + memmove (Dst, Src, Nbr); > + Dst -=3D Private->line_bytes; > + Src -=3D Private->line_bytes; > + } > + } > + break; > + case EfiUgaVideoFill: > + Color =3D X11PixelToColor(Private, *BltBuffer); > + for (DstY =3D Args->DestinationY; DstY < (Args->Height + Args->Desti= nationY); > DstY++) { > + for (DstX =3D Args->DestinationX; DstX < (Args->Width + Args->Dest= inationX); > 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 =3D=3D NoExpose || ev.type =3D=3D GraphicsExpose) { > + break; > + } > + } > + break; > + case EfiUgaVideoFill: > + Color =3D 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 =3D (GRAPHICS_IO_PRIVATE *)GraphicsIo; > + > + HandleEvents (Drv); > + if (Drv->pointer_state_changed !=3D 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 =3D (GRAPHICS_IO_PRIVATE *)GraphicsIo; > + > + EfiStatus =3D X11CheckPointer (GraphicsIo); > + if (EfiStatus !=3D EFI_SUCCESS) { > + return EfiStatus; > + } > + > + memcpy (State, &Drv->pointer_state, sizeof (EFI_SIMPLE_POINTER_STATE))= ; > + > + Drv->pointer_state.RelativeMovementX =3D 0; > + Drv->pointer_state.RelativeMovementY =3D 0; > + Drv->pointer_state.RelativeMovementZ =3D 0; > + Drv->pointer_state_changed =3D 0; > + return EFI_SUCCESS; > +} > + > + > + > +EFI_STATUS > +X11GraphicsWindowOpen ( > + IN EMU_IO_THUNK_PROTOCOL *This > + ) > +{ > + GRAPHICS_IO_PRIVATE *Drv; > + unsigned int border_width =3D 0; > + char *display_name =3D NULL; > + > + Drv =3D (GRAPHICS_IO_PRIVATE *)calloc (1, sizeof (GRAPHICS_IO_PRIVATE)= ); > + if (Drv =3D=3D NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + > + Drv->GraphicsIo.Size =3D GasketX11Size; > + Drv->GraphicsIo.CheckKey =3D GasketX11CheckKey; > + Drv->GraphicsIo.GetKey =3D GasketX11GetKey; > + Drv->GraphicsIo.KeySetState =3D GasketX11KeySetState; > + Drv->GraphicsIo.RegisterKeyNotify =3D GasketX11RegisterKeyNotify; > + Drv->GraphicsIo.Blt =3D GasketX11Blt; > + Drv->GraphicsIo.CheckPointer =3D GasketX11CheckPointer; > + Drv->GraphicsIo.GetPointerState =3D GasketX11GetPointerState; > + > + > + Drv->key_count =3D 0; > + Drv->key_rd =3D 0; > + Drv->key_wr =3D 0; > + Drv->KeyState.KeyShiftState =3D EFI_SHIFT_STATE_VALID; > + Drv->KeyState.KeyToggleState =3D EFI_TOGGLE_STATE_VALID; > + Drv->MakeRegisterdKeyCallback =3D NULL; > + Drv->BreakRegisterdKeyCallback =3D NULL; > + Drv->RegisterdKeyCallbackContext =3D NULL; > + > + > + Drv->display =3D XOpenDisplay (display_name); > + if (Drv->display =3D=3D NULL) { > + fprintf (stderr, "uga: cannot connect to X server %s\n", XDisplayNam= e > (display_name)); > + free (Drv); > + return EFI_DEVICE_ERROR; > + } > + Drv->screen =3D DefaultScreen (Drv->display); > + Drv->visual =3D DefaultVisual (Drv->display, Drv->screen); > + Drv->win =3D 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 =3D DefaultDepth (Drv->display, Drv->screen); > + XDefineCursor (Drv->display, Drv->win, XCreateFontCursor (Drv->display= , > XC_pirate)); > + > + Drv->Title =3D 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 =3D DefaultGC (Drv->display, Drv->screen); > + > + This->Private =3D (VOID *)Drv; > + This->Interface =3D (VOID *)Drv; > + return EFI_SUCCESS; > +} > + > + > +EFI_STATUS > +X11GraphicsWindowClose ( > + IN EMU_IO_THUNK_PROTOCOL *This > + ) > +{ > + GRAPHICS_IO_PRIVATE *Drv; > + > + Drv =3D (GRAPHICS_IO_PRIVATE *)This->Private; > + > + if (Drv =3D=3D NULL) { > + return EFI_SUCCESS; > + } > + > + if (Drv->image !=3D NULL) { > + XDestroyImage(Drv->image); > + > + if (Drv->use_shm) { > + shmdt (Drv->image_data); > + } > + > + Drv->image_data =3D NULL; > + Drv->image =3D 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 =3D { > + &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 register= s > -# 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.
> -# 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 s= tack on 16 > byte boundry. > -// > - .text > - > -// 32 byte shadow to spill rcx-r9, 8 bytes to align stack on 16 byte bou= ndry > -// 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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 register= s > +# 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.
> +# 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 s= tack on 16 > byte boundry. > +// > + .text > + > +// 32 byte shadow to spill rcx-r9, 8 bytes to align stack on 16 byte bou= ndry > +// 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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-s= ave 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 =3D {} > - > - > -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 =3D lldb.SBError() > - > - data1_val =3D valobj.GetChildMemberWithName('Data1') > - data1 =3D data1_val.GetValueAsUnsigned(0) > - data2_val =3D valobj.GetChildMemberWithName('Data2') > - data2 =3D data2_val.GetValueAsUnsigned(0) > - data3_val =3D valobj.GetChildMemberWithName('Data3') > - data3 =3D data3_val.GetValueAsUnsigned(0) > - str =3D "%x-%x-%x-" % (data1, data2, data3) > - > - data4_val =3D valobj.GetChildMemberWithName('Data4') > - for i in range (data4_val.num_children): > - if i =3D=3D 2: > - str +=3D'-' > - str +=3D "%02x" % > data4_val.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0) > - > - return guid_dict.get (str.upper(), '') > - > - > - > -EFI_STATUS_Dict =3D { > - (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 =3D valobj.GetValueAsUnsigned(0) > - return EFI_STATUS_Dict.get (Status, '') > - > - > -def EFI_TPL_TypeSummary (valobj,internal_dict): > - # > - # Return TPL values > - # > - > - if valobj.TypeIsPointerType(): > - return "" > - > - Tpl =3D valobj.GetValueAsUnsigned(0) > - if Tpl < 4: > - Str =3D "%d" % Tpl > - elif Tpl =3D=3D 6: > - Str =3D "TPL_DRIVER (Obsolete Concept in edk2)" > - elif Tpl < 8: > - Str =3D "TPL_APPLICATION" > - if Tpl - 4 > 0: > - Str +=3D " + " + "%d" % (Tpl - 4) > - elif Tpl < 16: > - Str =3D "TPL_CALLBACK" > - if Tpl - 8 > 0: > - Str +=3D " + " + "%d" % (Tpl - 4) > - elif Tpl < 31: > - Str =3D "TPL_NOTIFY" > - if Tpl - 16 > 0: > - Str +=3D " + " + "%d" % (Tpl - 4) > - elif Tpl =3D=3D 31: > - Str =3D "TPL_HIGH_LEVEL" > - else: > - Str =3D "Invalid TPL" > - > - return Str > - > - > -def CHAR16_TypeSummary (valobj,internal_dict): > - # > - # Display EFI CHAR16 'unsigned short' as string > - # > - SBError =3D lldb.SBError() > - Str =3D '' > - if valobj.TypeIsPointerType(): > - if valobj.GetValueAsUnsigned () =3D=3D 0: > - return "NULL" > - > - # CHAR16 * max string size 1024 > - for i in range (1024): > - Char =3D valobj.GetPointeeData(i,1).GetUnsignedInt16(SBError, 0) > - if SBError.fail or Char =3D=3D 0: > - break > - Str +=3D unichr (Char) > - Str =3D 'L"' + Str + '"' > - return Str.encode ('utf-8', 'replace') > - > - if valobj.num_children =3D=3D 0: > - # CHAR16 > - if chr (valobj.unsigned) in string.printable: > - Str =3D "L'" + unichr (valobj.unsigned) + "'" > - return Str.encode ('utf-8', 'replace') > - else: > - # CHAR16 [] > - for i in range (valobj.num_children): > - Char =3D valobj.GetChildAtIndex(i).data.GetUnsignedInt16(SBError, = 0) > - if Char =3D=3D 0: > - break > - Str +=3D unichr (Char) > - Str =3D '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 =3D lldb.SBError() > - Str =3D '' > - if valobj.TypeIsPointerType(): > - if valobj.GetValueAsUnsigned () =3D=3D 0: > - return "NULL" > - > - # CHAR8 * max string size 1024 > - for i in range (1024): > - Char =3D valobj.GetPointeeData(i,1).GetUnsignedInt8(SBError, 0) > - if SBError.fail or Char =3D=3D 0: > - break > - Str +=3D unichr (Char) > - Str =3D '"' + Str + '"' > - return Str.encode ('utf-8', 'replace') > - > - if valobj.num_children =3D=3D 0: > - # CHAR8 > - if chr (valobj.unsigned) in string.printable: > - Str =3D '"' + unichr (valobj.unsigned) + '"' > - return Str.encode ('utf-8', 'replace') > - else: > - # CHAR8 [] > - for i in range (valobj.num_children): > - Char =3D valobj.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0= ) > - if Char =3D=3D 0: > - break > - Str +=3D unichr (Char) > - Str =3D '"' + Str + '"' > - return Str.encode ('utf-8', 'replace') > - > - return Str > - > -device_path_dict =3D { > - (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 =3D "" > - if valobj.num_children =3D=3D 3: > - # EFI_DEVICE_PATH_PROTOCOL > - Type =3D valobj.GetChildMemberWithName('Type').unsigned > - SubType =3D valobj.GetChildMemberWithName('SubType').unsigned > - if (Type, SubType) in device_path_dict: > - TypeStr =3D device_path_dict[Type, SubType] > - else: > - TypeStr =3D "" > - > - LenLow =3D > valobj.GetChildMemberWithName('Length').GetChildAtIndex(0).unsigned > - LenHigh =3D > valobj.GetChildMemberWithName('Length').GetChildAtIndex(1).unsigned > - Len =3D LenLow + (LenHigh >> 8) > - > - Address =3D long ("%d" % valobj.addr) > - if (Address =3D=3D lldb.LLDB_INVALID_ADDRESS): > - # Need to reserach this, it seems to be the nested struct case > - ExprStr =3D "" > - elif (Type & 0x7f =3D=3D 0x7f): > - ExprStr =3D "End Device Path" if SubType =3D=3D 0xff else "End Thi= s Instance" > - else: > - ExprStr =3D "expr *(%s *)0x%08x" % (TypeStr, Address) > - > - Str =3D " {\n" > - Str +=3D " (UINT8) Type =3D 0x%02x // %s\n" % (Type, "END" if (= Type & 0x7f > =3D=3D 0x7f) else "") > - Str +=3D " (UINT8) SubType =3D 0x%02x // %s\n" % (SubType, ExprStr= ) > - Str +=3D " (UINT8 [2]) Length =3D { // 0x%04x (%d) bytes\n" % (Len= , Len) > - Str +=3D " (UINT8) [0] =3D 0x%02x\n" % LenLow > - Str +=3D " (UINT8) [1] =3D 0x%02x\n" % LenHigh > - Str +=3D " }\n" > - if (Type & 0x7f =3D=3D 0x7f) and (SubType =3D=3D 0xff): > - pass > - elif ExprStr !=3D "": > - NextNode =3D Address + Len > - Str +=3D "// 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 =3D debugger.GetDefaultCategory() > - FormatBool =3D lldb.SBTypeFormat(lldb.eFormatBoolean) > - category.AddTypeFormat(lldb.SBTypeNameSpecifier("BOOLEAN"), > FormatBool) > - > - FormatHex =3D 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"), FormatHe= x) > - category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_LBA"), FormatHe= x) > - 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 =3D True > - > -def LoadEmulatorEfiSymbols(frame, bp_loc , internal_dict): > - # > - # This is an lldb breakpoint script, and assumes the breakpoint is o= n 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 functio= n 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 op= eration > - # > - global gEmulatorBreakWorkaroundNeeded > - > - if gEmulatorBreakWorkaroundNeeded: > - # turn off lldb debug prints on SIGALRM (EFI timer tick) > - frame.thread.process.target.debugger.HandleCommand("process hand= le > SIGALRM -n false") > - gEmulatorBreakWorkaroundNeeded =3D False > - > - # Convert C string to Python string > - Error =3D lldb.SBError() > - FileNamePtr =3D frame.FindVariable ("FileName").GetValueAsUnsigned() > - FileNameLen =3D frame.FindVariable > ("FileNameLength").GetValueAsUnsigned() > - FileName =3D 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 =3D frame.thread.process.target.debugger > - if frame.FindVariable ("AddSymbolFlag").GetValueAsUnsigned() =3D=3D = 1: > - LoadAddress =3D frame.FindVariable ("LoadAddress").GetValueAsUns= igned() > - > - debugger.HandleCommand ("target modules add %s" % FileName) > - print "target modules load --slid 0x%x %s" % (LoadAddress, FileN= ame) > - debugger.HandleCommand ("target modules load --slide 0x%x --file= %s" % > (LoadAddress, FileName)) > - else: > - target =3D debugger.GetSelectedTarget() > - for SBModule in target.module_iter(): > - ModuleName =3D SBModule.GetFileSpec().GetDirectory() + '/' > - ModuleName +=3D SBModule.GetFileSpec().GetFilename() > - if FileName =3D=3D ModuleName or FileName =3D=3D > SBModule.GetFileSpec().GetFilename(): > - target.ClearModuleLoadAddress (SBModule) > - if not target.RemoveModule (SBModule): > - print "!lldb.target.RemoveModule (%s) FAILED" % SBMo= dule > - > - # make breakpoint command contiue > - frame.thread.process.Continue() > - > -def GuidToCStructStr (guid, Name=3DFalse): > - # > - # Convert a 16-byte bytesarry (or bytearray compat object) to C guid s= tring > - # { 0xB402621F, 0xA940, 0x1E4A, { 0x86, 0x6B, 0x4D, 0xC9, 0x16, 0x2B, = 0x34, > 0x7C } } > - # > - # Name=3DTrue 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 =3D uuid.UUID(guid) > - guid =3D 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, 0= xA7, > 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 =3D ''.join(x for x in GuidStr if x not in '{,}').split() > - Str =3D "%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('-') =3D=3D 4: > - # validate "49152E77-1ADA-4764-B7A2-7AFEFED95E8B" form > - Check =3D "%s" % str(uuid.UUID(GuidStr)).upper() > - if GuidStr.upper() =3D=3D Check: > - Str =3D GuidStr.upper() > - else: > - Ste =3D "" > - else: > - Str =3D "" > - > - return Str > - > - > -def create_guid_options(): > - usage =3D "usage: %prog [data]" > - description=3D'''lookup EFI_GUID by CName, C struct, or GUID string = and print > out all three. > - ''' > - parser =3D optparse.OptionParser(description=3Ddescription, > prog=3D'guid',usage=3Dusage) > - 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 =3D shlex.split(command) > - parser =3D create_guid_options() > - try: > - (options, args) =3D parser.parse_args(command_args) > - if len(args) >=3D 1: > - if args[0] =3D=3D "{": > - # caller forgot to quote the string" > - # mark arg[0] a string containing all args[n] > - args[0] =3D ' '.join(args) > - GuidStr =3D ParseGuidString (args[0]) > - if GuidStr =3D=3D "": > - # return Key of GuidNameDict for value args[0] > - GuidStr =3D [Key for Key, Value in guid_dict.iteritems() i= f Value =3D=3D > args[0]][0] > - GuidStr =3D 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) >=3D 1: > - if GuidStr in guid_dict: > - print "%s =3D %s" % (guid_dict[GuidStr], GuidStr) > - print "%s =3D %s" % (guid_dict[GuidStr], GuidToCStructStr (G= uidStr)) > - else: > - print GuidStr > - else: > - # dump entire dictionary > - width =3D max(len(v) for k,v in guid_dict.iteritems()) > - for value in sorted(guid_dict, key=3Dguid_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 =3D os.getcwd() > - inputfile +=3D os.sep + os.pardir + os.sep + 'FV' + os.sep + 'Guid.x= ref' > - with open(inputfile) as f: > - for line in f: > - data =3D line.split(' ') > - if len(data) >=3D 2: > - guid_dict[data[0].upper()] =3D data[1].strip('\n') > - > - # init EFI specific type formaters > - TypePrintFormating (debugger) > - > - > - # add guid command > - parser =3D create_guid_options() > - efi_guid_command.__doc__ =3D parser.format_help() > - debugger.HandleCommand('command script add -f > lldbefi.efi_guid_command guid') > - > - > - Target =3D debugger.GetTargetAtIndex(0) > - if Target: > - Breakpoint =3D Target.BreakpointCreateByName('SecGdbScriptBreak'= ) > - if Breakpoint.GetNumLocations() =3D=3D 1: > - # Set the emulator breakpoints, if we are in the emulator > - debugger.HandleCommand("breakpoint command add -s python -F > lldbefi.LoadEmulatorEfiSymbols {id}".format(id=3DBreakpoint.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 =3D {} > + > + > +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 =3D lldb.SBError() > + > + data1_val =3D valobj.GetChildMemberWithName('Data1') > + data1 =3D data1_val.GetValueAsUnsigned(0) > + data2_val =3D valobj.GetChildMemberWithName('Data2') > + data2 =3D data2_val.GetValueAsUnsigned(0) > + data3_val =3D valobj.GetChildMemberWithName('Data3') > + data3 =3D data3_val.GetValueAsUnsigned(0) > + str =3D "%x-%x-%x-" % (data1, data2, data3) > + > + data4_val =3D valobj.GetChildMemberWithName('Data4') > + for i in range (data4_val.num_children): > + if i =3D=3D 2: > + str +=3D'-' > + str +=3D "%02x" % > data4_val.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0) > + > + return guid_dict.get (str.upper(), '') > + > + > + > +EFI_STATUS_Dict =3D { > + (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 =3D valobj.GetValueAsUnsigned(0) > + return EFI_STATUS_Dict.get (Status, '') > + > + > +def EFI_TPL_TypeSummary (valobj,internal_dict): > + # > + # Return TPL values > + # > + > + if valobj.TypeIsPointerType(): > + return "" > + > + Tpl =3D valobj.GetValueAsUnsigned(0) > + if Tpl < 4: > + Str =3D "%d" % Tpl > + elif Tpl =3D=3D 6: > + Str =3D "TPL_DRIVER (Obsolete Concept in edk2)" > + elif Tpl < 8: > + Str =3D "TPL_APPLICATION" > + if Tpl - 4 > 0: > + Str +=3D " + " + "%d" % (Tpl - 4) > + elif Tpl < 16: > + Str =3D "TPL_CALLBACK" > + if Tpl - 8 > 0: > + Str +=3D " + " + "%d" % (Tpl - 4) > + elif Tpl < 31: > + Str =3D "TPL_NOTIFY" > + if Tpl - 16 > 0: > + Str +=3D " + " + "%d" % (Tpl - 4) > + elif Tpl =3D=3D 31: > + Str =3D "TPL_HIGH_LEVEL" > + else: > + Str =3D "Invalid TPL" > + > + return Str > + > + > +def CHAR16_TypeSummary (valobj,internal_dict): > + # > + # Display EFI CHAR16 'unsigned short' as string > + # > + SBError =3D lldb.SBError() > + Str =3D '' > + if valobj.TypeIsPointerType(): > + if valobj.GetValueAsUnsigned () =3D=3D 0: > + return "NULL" > + > + # CHAR16 * max string size 1024 > + for i in range (1024): > + Char =3D valobj.GetPointeeData(i,1).GetUnsignedInt16(SBError, 0) > + if SBError.fail or Char =3D=3D 0: > + break > + Str +=3D unichr (Char) > + Str =3D 'L"' + Str + '"' > + return Str.encode ('utf-8', 'replace') > + > + if valobj.num_children =3D=3D 0: > + # CHAR16 > + if chr (valobj.unsigned) in string.printable: > + Str =3D "L'" + unichr (valobj.unsigned) + "'" > + return Str.encode ('utf-8', 'replace') > + else: > + # CHAR16 [] > + for i in range (valobj.num_children): > + Char =3D valobj.GetChildAtIndex(i).data.GetUnsignedInt16(SBError, = 0) > + if Char =3D=3D 0: > + break > + Str +=3D unichr (Char) > + Str =3D '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 =3D lldb.SBError() > + Str =3D '' > + if valobj.TypeIsPointerType(): > + if valobj.GetValueAsUnsigned () =3D=3D 0: > + return "NULL" > + > + # CHAR8 * max string size 1024 > + for i in range (1024): > + Char =3D valobj.GetPointeeData(i,1).GetUnsignedInt8(SBError, 0) > + if SBError.fail or Char =3D=3D 0: > + break > + Str +=3D unichr (Char) > + Str =3D '"' + Str + '"' > + return Str.encode ('utf-8', 'replace') > + > + if valobj.num_children =3D=3D 0: > + # CHAR8 > + if chr (valobj.unsigned) in string.printable: > + Str =3D '"' + unichr (valobj.unsigned) + '"' > + return Str.encode ('utf-8', 'replace') > + else: > + # CHAR8 [] > + for i in range (valobj.num_children): > + Char =3D valobj.GetChildAtIndex(i).data.GetUnsignedInt8(SBError, 0= ) > + if Char =3D=3D 0: > + break > + Str +=3D unichr (Char) > + Str =3D '"' + Str + '"' > + return Str.encode ('utf-8', 'replace') > + > + return Str > + > +device_path_dict =3D { > + (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 =3D "" > + if valobj.num_children =3D=3D 3: > + # EFI_DEVICE_PATH_PROTOCOL > + Type =3D valobj.GetChildMemberWithName('Type').unsigned > + SubType =3D valobj.GetChildMemberWithName('SubType').unsigned > + if (Type, SubType) in device_path_dict: > + TypeStr =3D device_path_dict[Type, SubType] > + else: > + TypeStr =3D "" > + > + LenLow =3D > valobj.GetChildMemberWithName('Length').GetChildAtIndex(0).unsigned > + LenHigh =3D > valobj.GetChildMemberWithName('Length').GetChildAtIndex(1).unsigned > + Len =3D LenLow + (LenHigh >> 8) > + > + Address =3D long ("%d" % valobj.addr) > + if (Address =3D=3D lldb.LLDB_INVALID_ADDRESS): > + # Need to reserach this, it seems to be the nested struct case > + ExprStr =3D "" > + elif (Type & 0x7f =3D=3D 0x7f): > + ExprStr =3D "End Device Path" if SubType =3D=3D 0xff else "End Thi= s Instance" > + else: > + ExprStr =3D "expr *(%s *)0x%08x" % (TypeStr, Address) > + > + Str =3D " {\n" > + Str +=3D " (UINT8) Type =3D 0x%02x // %s\n" % (Type, "END" if (= Type & 0x7f > =3D=3D 0x7f) else "") > + Str +=3D " (UINT8) SubType =3D 0x%02x // %s\n" % (SubType, ExprStr= ) > + Str +=3D " (UINT8 [2]) Length =3D { // 0x%04x (%d) bytes\n" % (Len= , Len) > + Str +=3D " (UINT8) [0] =3D 0x%02x\n" % LenLow > + Str +=3D " (UINT8) [1] =3D 0x%02x\n" % LenHigh > + Str +=3D " }\n" > + if (Type & 0x7f =3D=3D 0x7f) and (SubType =3D=3D 0xff): > + pass > + elif ExprStr !=3D "": > + NextNode =3D Address + Len > + Str +=3D "// 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 =3D debugger.GetDefaultCategory() > + FormatBool =3D lldb.SBTypeFormat(lldb.eFormatBoolean) > + category.AddTypeFormat(lldb.SBTypeNameSpecifier("BOOLEAN"), > FormatBool) > + > + FormatHex =3D 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"), FormatHe= x) > + category.AddTypeFormat(lldb.SBTypeNameSpecifier("EFI_LBA"), FormatHe= x) > + 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 =3D True > + > +def LoadEmulatorEfiSymbols(frame, bp_loc , internal_dict): > + # > + # This is an lldb breakpoint script, and assumes the breakpoint is o= n 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 functio= n 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 op= eration > + # > + global gEmulatorBreakWorkaroundNeeded > + > + if gEmulatorBreakWorkaroundNeeded: > + # turn off lldb debug prints on SIGALRM (EFI timer tick) > + frame.thread.process.target.debugger.HandleCommand("process hand= le > SIGALRM -n false") > + gEmulatorBreakWorkaroundNeeded =3D False > + > + # Convert C string to Python string > + Error =3D lldb.SBError() > + FileNamePtr =3D frame.FindVariable ("FileName").GetValueAsUnsigned() > + FileNameLen =3D frame.FindVariable > ("FileNameLength").GetValueAsUnsigned() > + FileName =3D 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 =3D frame.thread.process.target.debugger > + if frame.FindVariable ("AddSymbolFlag").GetValueAsUnsigned() =3D=3D = 1: > + LoadAddress =3D frame.FindVariable ("LoadAddress").GetValueAsUns= igned() > + > + debugger.HandleCommand ("target modules add %s" % FileName) > + print "target modules load --slid 0x%x %s" % (LoadAddress, FileN= ame) > + debugger.HandleCommand ("target modules load --slide 0x%x --file= %s" % > (LoadAddress, FileName)) > + else: > + target =3D debugger.GetSelectedTarget() > + for SBModule in target.module_iter(): > + ModuleName =3D SBModule.GetFileSpec().GetDirectory() + '/' > + ModuleName +=3D SBModule.GetFileSpec().GetFilename() > + if FileName =3D=3D ModuleName or FileName =3D=3D > SBModule.GetFileSpec().GetFilename(): > + target.ClearModuleLoadAddress (SBModule) > + if not target.RemoveModule (SBModule): > + print "!lldb.target.RemoveModule (%s) FAILED" % SBMo= dule > + > + # make breakpoint command contiue > + frame.thread.process.Continue() > + > +def GuidToCStructStr (guid, Name=3DFalse): > + # > + # Convert a 16-byte bytesarry (or bytearray compat object) to C guid s= tring > + # { 0xB402621F, 0xA940, 0x1E4A, { 0x86, 0x6B, 0x4D, 0xC9, 0x16, 0x2B, = 0x34, > 0x7C } } > + # > + # Name=3DTrue 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 =3D uuid.UUID(guid) > + guid =3D 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, 0= xA7, > 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 =3D ''.join(x for x in GuidStr if x not in '{,}').split() > + Str =3D "%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('-') =3D=3D 4: > + # validate "49152E77-1ADA-4764-B7A2-7AFEFED95E8B" form > + Check =3D "%s" % str(uuid.UUID(GuidStr)).upper() > + if GuidStr.upper() =3D=3D Check: > + Str =3D GuidStr.upper() > + else: > + Ste =3D "" > + else: > + Str =3D "" > + > + return Str > + > + > +def create_guid_options(): > + usage =3D "usage: %prog [data]" > + description=3D'''lookup EFI_GUID by CName, C struct, or GUID string = and print > out all three. > + ''' > + parser =3D optparse.OptionParser(description=3Ddescription, > prog=3D'guid',usage=3Dusage) > + 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 =3D shlex.split(command) > + parser =3D create_guid_options() > + try: > + (options, args) =3D parser.parse_args(command_args) > + if len(args) >=3D 1: > + if args[0] =3D=3D "{": > + # caller forgot to quote the string" > + # mark arg[0] a string containing all args[n] > + args[0] =3D ' '.join(args) > + GuidStr =3D ParseGuidString (args[0]) > + if GuidStr =3D=3D "": > + # return Key of GuidNameDict for value args[0] > + GuidStr =3D [Key for Key, Value in guid_dict.iteritems() i= f Value =3D=3D > args[0]][0] > + GuidStr =3D 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) >=3D 1: > + if GuidStr in guid_dict: > + print "%s =3D %s" % (guid_dict[GuidStr], GuidStr) > + print "%s =3D %s" % (guid_dict[GuidStr], GuidToCStructStr (G= uidStr)) > + else: > + print GuidStr > + else: > + # dump entire dictionary > + width =3D max(len(v) for k,v in guid_dict.iteritems()) > + for value in sorted(guid_dict, key=3Dguid_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 =3D os.getcwd() > + inputfile +=3D os.sep + os.pardir + os.sep + 'FV' + os.sep + 'Guid.x= ref' > + with open(inputfile) as f: > + for line in f: > + data =3D line.split(' ') > + if len(data) >=3D 2: > + guid_dict[data[0].upper()] =3D data[1].strip('\n') > + > + # init EFI specific type formaters > + TypePrintFormating (debugger) > + > + > + # add guid command > + parser =3D create_guid_options() > + efi_guid_command.__doc__ =3D parser.format_help() > + debugger.HandleCommand('command script add -f > lldbefi.efi_guid_command guid') > + > + > + Target =3D debugger.GetTargetAtIndex(0) > + if Target: > + Breakpoint =3D Target.BreakpointCreateByName('SecGdbScriptBreak'= ) > + if Breakpoint.GetNumLocations() =3D=3D 1: > + # Set the emulator breakpoints, if we are in the emulator > + debugger.HandleCommand("breakpoint command add -s python -F > lldbefi.LoadEmulatorEfiSymbols {id}".format(id=3DBreakpoint.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 me= dia 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 devi= ce block > size. > @param[out] Buffer A pointer to the destination buffer for th= e data. > The > caller is responsible for either having im= plicit or > diff --git a/EmulatorPkg/Win/Host/WinHost.h > b/EmulatorPkg/Win/Host/WinHost.h > index 6f1f1a2dd3..991da1c15b 100644 > --- a/EmulatorPkg/Win/Host/WinHost.h > +++ b/EmulatorPkg/Win/Host/WinHost.h > @@ -206,4 +206,4 @@ extern EMU_THUNK_PROTOCOL gEmuThunkProtocol; > extern EMU_IO_THUNK_PROTOCOL mWinNtWndThunkIo; > extern EMU_IO_THUNK_PROTOCOL mWinNtFileSystemThunkIo; > extern EMU_IO_THUNK_PROTOCOL mWinNtBlockIoThunkIo; > -#endif > \ No newline at end of file > +#endif > -- > 2.16.1.windows.1